[
  {
    "path": ".gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n/.idea/caches\n/.idea/libraries\n/.idea/modules.xml\n/.idea/workspace.xml\n/.idea/navEditor.xml\n/.idea/assetWizardSettings.xml\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n"
  },
  {
    "path": ".idea/codeStyles/Project.xml",
    "content": "<component name=\"ProjectCodeStyleConfiguration\">\n  <code_scheme name=\"Project\" version=\"173\">\n    <JetCodeStyleSettings>\n      <option name=\"CODE_STYLE_DEFAULTS\" value=\"KOTLIN_OFFICIAL\" />\n    </JetCodeStyleSettings>\n    <codeStyleSettings language=\"XML\">\n      <arrangement>\n        <rules>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>xmlns:android</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>^$</XML_NAMESPACE>\n                </AND>\n              </match>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>xmlns:.*</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>^$</XML_NAMESPACE>\n                </AND>\n              </match>\n              <order>BY_NAME</order>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>.*:id</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>\n                </AND>\n              </match>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>.*:name</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>\n                </AND>\n              </match>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>name</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>^$</XML_NAMESPACE>\n                </AND>\n              </match>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>style</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>^$</XML_NAMESPACE>\n                </AND>\n              </match>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>.*</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>^$</XML_NAMESPACE>\n                </AND>\n              </match>\n              <order>BY_NAME</order>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>.*</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>\n                </AND>\n              </match>\n              <order>ANDROID_ATTRIBUTE_ORDER</order>\n            </rule>\n          </section>\n          <section>\n            <rule>\n              <match>\n                <AND>\n                  <NAME>.*</NAME>\n                  <XML_ATTRIBUTE />\n                  <XML_NAMESPACE>.*</XML_NAMESPACE>\n                </AND>\n              </match>\n              <order>BY_NAME</order>\n            </rule>\n          </section>\n        </rules>\n      </arrangement>\n    </codeStyleSettings>\n    <codeStyleSettings language=\"kotlin\">\n      <option name=\"CODE_STYLE_DEFAULTS\" value=\"KOTLIN_OFFICIAL\" />\n    </codeStyleSettings>\n  </code_scheme>\n</component>"
  },
  {
    "path": ".idea/codeStyles/codeStyleConfig.xml",
    "content": "<component name=\"ProjectCodeStyleConfiguration\">\n  <state>\n    <option name=\"USE_PER_PROJECT_SETTINGS\" value=\"true\" />\n  </state>\n</component>"
  },
  {
    "path": ".idea/encodings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Encoding\" addBOMForNewFiles=\"with NO BOM\" />\n</project>"
  },
  {
    "path": ".idea/gradle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleMigrationSettings\" migrationVersion=\"1\" />\n  <component name=\"GradleSettings\">\n    <option name=\"linkedExternalProjectsSettings\">\n      <GradleProjectSettings>\n        <option name=\"testRunner\" value=\"PLATFORM\" />\n        <option name=\"distributionType\" value=\"DEFAULT_WRAPPED\" />\n        <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n        <option name=\"modules\">\n          <set>\n            <option value=\"$PROJECT_DIR$\" />\n            <option value=\"$PROJECT_DIR$/app\" />\n          </set>\n        </option>\n        <option name=\"resolveModulePerSourceSet\" value=\"false\" />\n      </GradleProjectSettings>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": ".idea/misc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CMakeSettings\">\n    <configurations>\n      <configuration PROFILE_NAME=\"Debug\" CONFIG_NAME=\"Debug\" />\n    </configurations>\n  </component>\n  <component name=\"ProjectRootManager\" version=\"2\" languageLevel=\"JDK_1_7\" project-jdk-name=\"1.8\" project-jdk-type=\"JavaSDK\">\n    <output url=\"file://$PROJECT_DIR$/build/classes\" />\n  </component>\n  <component name=\"ProjectType\">\n    <option name=\"id\" value=\"Android\" />\n  </component>\n</project>"
  },
  {
    "path": ".idea/runConfigurations.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"RunConfigurationProducerService\">\n    <option name=\"ignoredProducers\">\n      <set>\n        <option value=\"org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer\" />\n        <option value=\"org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer\" />\n        <option value=\"org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer\" />\n      </set>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": ".idea/vcs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping directory=\"$PROJECT_DIR$\" vcs=\"Git\" />\n  </component>\n</project>"
  },
  {
    "path": "app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "app/build.gradle",
    "content": "apply plugin: 'com.android.application'\n\napply plugin: 'kotlin-android'\n\napply plugin: 'kotlin-android-extensions'\n\n//kotlin kapt and navigation safeargs plugin\napply plugin: 'kotlin-kapt'\n\napply plugin: \"androidx.navigation.safeargs\"\n\nandroid {\n    compileSdkVersion 29\n    defaultConfig {\n        applicationId \"net.simplifiedcoding.mvvmsampleapp\"\n        minSdkVersion 26\n        targetSdkVersion 29\n        versionCode 1\n        versionName \"1.0\"\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n    }\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    dataBinding {\n        enabled = true\n    }\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version\"\n    implementation 'androidx.appcompat:appcompat:1.1.0'\n    implementation 'androidx.core:core-ktx:1.2.0'\n    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'\n    implementation 'androidx.legacy:legacy-support-v4:1.0.0'\n    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'\n    testImplementation 'junit:junit:4.12'\n    androidTestImplementation 'androidx.test:runner:1.2.0'\n    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'\n\n    //Retrofit and GSON\n    implementation 'com.squareup.retrofit2:retrofit:2.6.2'\n    implementation 'com.squareup.retrofit2:converter-gson:2.6.2'\n\n    //Kotlin Coroutines\n    implementation \"org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.3\"\n    implementation \"org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.3\"\n\n    // ViewModel and LiveData\n    implementation \"androidx.lifecycle:lifecycle-extensions:2.2.0\"\n\n    //New Material Design\n    implementation 'com.google.android.material:material:1.2.0-alpha06'\n\n    //Kodein Dependency Injection\n    implementation \"org.kodein.di:kodein-di-generic-jvm:6.2.1\"\n    implementation \"org.kodein.di:kodein-di-framework-android-x:6.2.1\"\n\n    //Android Room\n    implementation \"androidx.room:room-runtime:2.2.5\"\n    implementation \"androidx.room:room-ktx:2.2.5\"\n    kapt \"androidx.room:room-compiler:2.2.5\"\n\n    //Android Navigation Architecture\n    implementation \"androidx.navigation:navigation-fragment-ktx:2.3.0-alpha06\"\n    implementation \"androidx.navigation:navigation-ui-ktx:2.3.0-alpha06\"\n\n    implementation 'com.xwray:groupie:2.3.0'\n    implementation 'com.xwray:groupie-kotlin-android-extensions:2.3.0'\n    implementation 'com.xwray:groupie-databinding:2.3.0'\n\n    implementation \"androidx.preference:preference-ktx:1.1.1\"\n}\n"
  },
  {
    "path": "app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile\n"
  },
  {
    "path": "app/src/androidTest/java/net/simplifiedcoding/mvvmsampleapp/ExampleInstrumentedTest.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp\n\nimport androidx.test.InstrumentationRegistry\nimport androidx.test.runner.AndroidJUnit4\n\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\nimport org.junit.Assert.*\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\nclass ExampleInstrumentedTest {\n    @Test\n    fun useAppContext() {\n        // Context of the app under test.\n        val appContext = InstrumentationRegistry.getTargetContext()\n        assertEquals(\"net.simplifiedcoding.mvvmsampleapp\", appContext.packageName)\n    }\n}\n"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n          xmlns:tools=\"http://schemas.android.com/tools\"\n          package=\"net.simplifiedcoding.mvvmsampleapp\">\n\n\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n\n    <application\n            android:name=\".MVVMApplication\"\n            android:allowBackup=\"true\"\n            android:icon=\"@mipmap/ic_launcher\"\n            android:label=\"@string/app_name\"\n            android:roundIcon=\"@mipmap/ic_launcher_round\"\n            android:supportsRtl=\"true\"\n            android:theme=\"@style/AppTheme\"\n            tools:ignore=\"AllowBackup,GoogleAppIndexingWarning\">\n        <activity android:name=\".ui.home.HomeActivity\">\n        </activity>\n        <activity android:name=\".ui.auth.SignupActivity\">\n        </activity>\n        <activity android:name=\".ui.auth.LoginActivity\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\"/>\n\n                <category android:name=\"android.intent.category.LAUNCHER\"/>\n            </intent-filter>\n        </activity>\n    </application>\n\n</manifest>"
  },
  {
    "path": "app/src/main/java/net/simplifiedcoding/mvvmsampleapp/MVVMApplication.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp\n\nimport android.app.Application\nimport net.simplifiedcoding.mvvmsampleapp.data.db.AppDatabase\nimport net.simplifiedcoding.mvvmsampleapp.data.network.MyApi\nimport net.simplifiedcoding.mvvmsampleapp.data.network.NetworkConnectionInterceptor\nimport net.simplifiedcoding.mvvmsampleapp.data.preferences.PreferenceProvider\nimport net.simplifiedcoding.mvvmsampleapp.data.repositories.QuotesRepository\nimport net.simplifiedcoding.mvvmsampleapp.data.repositories.UserRepository\nimport net.simplifiedcoding.mvvmsampleapp.ui.auth.AuthViewModelFactory\nimport net.simplifiedcoding.mvvmsampleapp.ui.home.profile.ProfileViewModelFactory\nimport net.simplifiedcoding.mvvmsampleapp.ui.home.quotes.QuotesViewModelFactory\nimport org.kodein.di.Kodein\nimport org.kodein.di.KodeinAware\nimport org.kodein.di.android.x.androidXModule\nimport org.kodein.di.generic.bind\nimport org.kodein.di.generic.instance\nimport org.kodein.di.generic.provider\nimport org.kodein.di.generic.singleton\n\nclass MVVMApplication : Application(), KodeinAware {\n\n    override val kodein = Kodein.lazy {\n        import(androidXModule(this@MVVMApplication))\n\n        bind() from singleton { NetworkConnectionInterceptor(instance()) }\n        bind() from singleton { MyApi(instance()) }\n        bind() from singleton { AppDatabase(instance()) }\n        bind() from singleton { PreferenceProvider(instance()) }\n        bind() from singleton { UserRepository(instance(), instance()) }\n        bind() from singleton { QuotesRepository(instance(), instance(), instance()) }\n        bind() from provider { AuthViewModelFactory(instance()) }\n        bind() from provider { ProfileViewModelFactory(instance()) }\n        bind() from provider{ QuotesViewModelFactory(instance())}\n\n\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/net/simplifiedcoding/mvvmsampleapp/data/db/AppDatabase.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp.data.db\n\nimport android.content.Context\nimport androidx.room.Database\nimport androidx.room.Room\nimport androidx.room.RoomDatabase\nimport net.simplifiedcoding.mvvmsampleapp.data.db.entities.Quote\nimport net.simplifiedcoding.mvvmsampleapp.data.db.entities.User\n\n@Database(\n    entities = [User::class, Quote::class],\n    version = 1\n)\nabstract class AppDatabase : RoomDatabase() {\n\n    abstract fun getUserDao(): UserDao\n    abstract fun getQuoteDao(): QuoteDao\n\n    companion object {\n\n        @Volatile\n        private var instance: AppDatabase? = null\n        private val LOCK = Any()\n\n        operator fun invoke(context: Context) = instance ?: synchronized(LOCK) {\n            instance ?: buildDatabase(context).also {\n                instance = it\n            }\n        }\n\n        private fun buildDatabase(context: Context) =\n            Room.databaseBuilder(\n                context.applicationContext,\n                AppDatabase::class.java,\n                \"MyDatabase.db\"\n            ).build()\n    }\n}"
  },
  {
    "path": "app/src/main/java/net/simplifiedcoding/mvvmsampleapp/data/db/QuoteDao.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp.data.db\n\nimport androidx.lifecycle.LiveData\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy\nimport androidx.room.Query\nimport net.simplifiedcoding.mvvmsampleapp.data.db.entities.Quote\n\n@Dao\ninterface QuoteDao {\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    fun saveAllQuotes(quotes : List<Quote>)\n\n    @Query(\"SELECT * FROM Quote\")\n    fun getQuotes() : LiveData<List<Quote>>\n\n}"
  },
  {
    "path": "app/src/main/java/net/simplifiedcoding/mvvmsampleapp/data/db/UserDao.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp.data.db\n\nimport androidx.lifecycle.LiveData\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy\nimport androidx.room.Query\nimport net.simplifiedcoding.mvvmsampleapp.data.db.entities.CURRENT_USER_ID\nimport net.simplifiedcoding.mvvmsampleapp.data.db.entities.User\n\n@Dao\ninterface UserDao{\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun upsert(user: User) : Long\n\n    @Query(\"SELECT * FROM user WHERE uid = $CURRENT_USER_ID\")\n    fun getuser() : LiveData<User>\n\n}"
  },
  {
    "path": "app/src/main/java/net/simplifiedcoding/mvvmsampleapp/data/db/entities/Quote.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp.data.db.entities\n\nimport androidx.room.Entity\nimport androidx.room.PrimaryKey\n\n@Entity\ndata class Quote(\n    @PrimaryKey(autoGenerate = false)\n    val id: Int,\n    val quote: String,\n    val author: String,\n    val thumbnail: String,\n    val created_at: String?,\n    val updated_at: String?\n)"
  },
  {
    "path": "app/src/main/java/net/simplifiedcoding/mvvmsampleapp/data/db/entities/User.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp.data.db.entities\n\nimport androidx.room.Entity\nimport androidx.room.PrimaryKey\n\nconst val CURRENT_USER_ID = 0\n\n@Entity\ndata class User(\n    var id: Int? = null,\n    var name: String? = null,\n    var email: String? = null,\n    var password: String? = null,\n    var email_verified_at: String? = null,\n    var created_at: String? = null,\n    var updated_at: String? = null\n){\n    @PrimaryKey(autoGenerate = false)\n    var uid: Int = CURRENT_USER_ID\n}"
  },
  {
    "path": "app/src/main/java/net/simplifiedcoding/mvvmsampleapp/data/network/MyApi.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp.data.network\n\nimport net.simplifiedcoding.mvvmsampleapp.data.network.responses.AuthResponse\nimport net.simplifiedcoding.mvvmsampleapp.data.network.responses.QuotesResponse\nimport okhttp3.OkHttpClient\nimport okhttp3.ResponseBody\nimport retrofit2.Call\nimport retrofit2.Response\nimport retrofit2.Retrofit\nimport retrofit2.converter.gson.GsonConverterFactory\nimport retrofit2.http.Field\nimport retrofit2.http.FormUrlEncoded\nimport retrofit2.http.GET\nimport retrofit2.http.POST\n\ninterface MyApi {\n\n    @FormUrlEncoded\n    @POST(\"login\")\n    suspend fun userLogin(\n        @Field(\"email\") email: String,\n        @Field(\"password\") password: String\n    ) : Response<AuthResponse>\n\n    @FormUrlEncoded\n    @POST(\"signup\")\n    suspend fun userSignup(\n        @Field(\"name\") name: String,\n        @Field(\"email\") email: String,\n        @Field(\"password\") password: String\n    ) : Response<AuthResponse>\n\n    @GET(\"quotes\")\n    suspend fun getQuotes() : Response<QuotesResponse>\n\n    companion object{\n        operator fun invoke(\n            networkConnectionInterceptor: NetworkConnectionInterceptor\n        ) : MyApi{\n\n            val okkHttpclient = OkHttpClient.Builder()\n                .addInterceptor(networkConnectionInterceptor)\n                .build()\n\n            return Retrofit.Builder()\n                .client(okkHttpclient)\n                .baseUrl(\"https://api.simplifiedcoding.in/course-apis/mvvm/\")\n                .addConverterFactory(GsonConverterFactory.create())\n                .build()\n                .create(MyApi::class.java)\n        }\n    }\n\n}\n\n"
  },
  {
    "path": "app/src/main/java/net/simplifiedcoding/mvvmsampleapp/data/network/NetworkConnectionInterceptor.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp.data.network\n\nimport android.content.Context\nimport android.net.ConnectivityManager\nimport android.net.NetworkCapabilities\nimport net.simplifiedcoding.mvvmsampleapp.util.NoInternetException\nimport okhttp3.Interceptor\nimport okhttp3.Response\n\nclass NetworkConnectionInterceptor(\n    context: Context\n) : Interceptor {\n\n    private val applicationContext = context.applicationContext\n\n    override fun intercept(chain: Interceptor.Chain): Response {\n        if (!isInternetAvailable())\n            throw NoInternetException(\"Make sure you have an active data connection\")\n        return chain.proceed(chain.request())\n    }\n\n    private fun isInternetAvailable(): Boolean {\n        var result = false\n        val connectivityManager =\n            applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager?\n        connectivityManager?.let {\n            it.getNetworkCapabilities(connectivityManager.activeNetwork)?.apply {\n                result = when {\n                    hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true\n                    hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true\n                    else -> false\n                }\n            }\n        }\n        return result\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/net/simplifiedcoding/mvvmsampleapp/data/network/SafeApiRequest.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp.data.network\n\nimport net.simplifiedcoding.mvvmsampleapp.util.ApiException\nimport org.json.JSONException\nimport org.json.JSONObject\nimport retrofit2.Response\n\nabstract class SafeApiRequest {\n\n    suspend fun<T: Any> apiRequest(call: suspend () -> Response<T>) : T{\n        val response = call.invoke()\n        if(response.isSuccessful){\n            return response.body()!!\n        }else{\n            val error = response.errorBody()?.string()\n            val message = StringBuilder()\n            error?.let{\n                try{\n                    message.append(JSONObject(it).getString(\"message\"))\n                }catch(e: JSONException){ }\n                message.append(\"\\n\")\n            }\n            message.append(\"Error Code: ${response.code()}\")\n            throw ApiException(message.toString())\n        }\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/net/simplifiedcoding/mvvmsampleapp/data/network/responses/AuthResponse.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp.data.network.responses\n\nimport net.simplifiedcoding.mvvmsampleapp.data.db.entities.User\n\ndata class AuthResponse(\n    val isSuccessful : Boolean?,\n    val message: String?,\n    val user: User?\n)"
  },
  {
    "path": "app/src/main/java/net/simplifiedcoding/mvvmsampleapp/data/network/responses/QuotesResponse.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp.data.network.responses\n\nimport net.simplifiedcoding.mvvmsampleapp.data.db.entities.Quote\n\ndata class QuotesResponse (\n    val isSuccessful: Boolean,\n    val quotes: List<Quote>\n)"
  },
  {
    "path": "app/src/main/java/net/simplifiedcoding/mvvmsampleapp/data/preferences/PreferenceProvider.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp.data.preferences\n\nimport android.content.Context\nimport android.content.SharedPreferences\nimport androidx.preference.PreferenceManager\n\nprivate const val KEY_SAVED_AT = \"key_saved_at\"\n\nclass PreferenceProvider(\n    context: Context\n) {\n\n    private val appContext = context.applicationContext\n\n    private val preference: SharedPreferences\n        get() = PreferenceManager.getDefaultSharedPreferences(appContext)\n\n\n    fun savelastSavedAt(savedAt: String) {\n        preference.edit().putString(\n            KEY_SAVED_AT,\n            savedAt\n        ).apply()\n    }\n\n    fun getLastSavedAt(): String? {\n        return preference.getString(KEY_SAVED_AT, null)\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/net/simplifiedcoding/mvvmsampleapp/data/repositories/QuotesRepository.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp.data.repositories\n\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MutableLiveData\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.withContext\nimport net.simplifiedcoding.mvvmsampleapp.data.db.AppDatabase\nimport net.simplifiedcoding.mvvmsampleapp.data.db.entities.Quote\nimport net.simplifiedcoding.mvvmsampleapp.data.network.MyApi\nimport net.simplifiedcoding.mvvmsampleapp.data.network.SafeApiRequest\nimport net.simplifiedcoding.mvvmsampleapp.data.preferences.PreferenceProvider\nimport net.simplifiedcoding.mvvmsampleapp.util.Coroutines\nimport java.lang.Exception\nimport java.time.LocalDateTime\nimport java.time.temporal.ChronoUnit\n\nprivate val MINIMUM_INTERVAL = 6\n\nclass QuotesRepository(\n    private val api: MyApi,\n    private val db: AppDatabase,\n    private val prefs: PreferenceProvider\n) : SafeApiRequest() {\n\n    private val quotes = MutableLiveData<List<Quote>>()\n\n    init {\n        quotes.observeForever {\n            saveQuotes(it)\n        }\n    }\n\n    suspend fun getQuotes(): LiveData<List<Quote>> {\n        return withContext(Dispatchers.IO) {\n            fetchQuotes()\n            db.getQuoteDao().getQuotes()\n        }\n    }\n\n    private suspend fun fetchQuotes() {\n        val lastSavedAt = prefs.getLastSavedAt()\n\n        if (lastSavedAt == null || isFetchNeeded(LocalDateTime.parse(lastSavedAt))) {\n            try {\n                val response = apiRequest { api.getQuotes() }\n                quotes.postValue(response.quotes)\n            } catch (e: Exception) {\n                e.printStackTrace()\n            }\n        }\n    }\n\n    private fun isFetchNeeded(savedAt: LocalDateTime): Boolean {\n        return ChronoUnit.HOURS.between(savedAt, LocalDateTime.now()) > MINIMUM_INTERVAL\n    }\n\n\n    private fun saveQuotes(quotes: List<Quote>) {\n        Coroutines.io {\n            prefs.savelastSavedAt(LocalDateTime.now().toString())\n            db.getQuoteDao().saveAllQuotes(quotes)\n        }\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/net/simplifiedcoding/mvvmsampleapp/data/repositories/UserRepository.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp.data.repositories\n\nimport net.simplifiedcoding.mvvmsampleapp.data.db.AppDatabase\nimport net.simplifiedcoding.mvvmsampleapp.data.db.entities.User\nimport net.simplifiedcoding.mvvmsampleapp.data.network.MyApi\nimport net.simplifiedcoding.mvvmsampleapp.data.network.SafeApiRequest\nimport net.simplifiedcoding.mvvmsampleapp.data.network.responses.AuthResponse\nimport retrofit2.Response\n\nclass UserRepository(\n    private val api: MyApi,\n    private val db: AppDatabase\n) : SafeApiRequest() {\n\n    suspend fun userLogin(email: String, password: String): AuthResponse {\n        return apiRequest { api.userLogin(email, password) }\n    }\n\n    suspend fun userSignup(\n        name: String,\n        email: String,\n        password: String\n    ) : AuthResponse {\n        return apiRequest{ api.userSignup(name, email, password)}\n    }\n\n    suspend fun saveUser(user: User) = db.getUserDao().upsert(user)\n\n    fun getUser() = db.getUserDao().getuser()\n\n}"
  },
  {
    "path": "app/src/main/java/net/simplifiedcoding/mvvmsampleapp/ui/auth/AuthViewModel.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp.ui.auth\n\nimport androidx.lifecycle.ViewModel\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.withContext\nimport net.simplifiedcoding.mvvmsampleapp.data.db.entities.User\nimport net.simplifiedcoding.mvvmsampleapp.data.repositories.UserRepository\n\n\nclass AuthViewModel(\n    private val repository: UserRepository\n) : ViewModel() {\n\n    fun getLoggedInUser() = repository.getUser()\n\n    suspend fun userLogin(\n        email: String,\n        password: String\n    ) = withContext(Dispatchers.IO) { repository.userLogin(email, password) }\n\n    suspend fun userSignup(\n        name: String,\n        email: String,\n        password: String\n    ) = withContext(Dispatchers.IO) { repository.userSignup(name, email, password) }\n\n    suspend fun saveLoggedInUser(user: User) = repository.saveUser(user)\n\n}"
  },
  {
    "path": "app/src/main/java/net/simplifiedcoding/mvvmsampleapp/ui/auth/AuthViewModelFactory.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp.ui.auth\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.ViewModelProvider\nimport net.simplifiedcoding.mvvmsampleapp.data.repositories.UserRepository\n\n@Suppress(\"UNCHECKED_CAST\")\nclass AuthViewModelFactory(\n    private val repository: UserRepository\n) : ViewModelProvider.NewInstanceFactory() {\n\n    override fun <T : ViewModel?> create(modelClass: Class<T>): T {\n        return AuthViewModel(repository) as T\n    }\n}"
  },
  {
    "path": "app/src/main/java/net/simplifiedcoding/mvvmsampleapp/ui/auth/LoginActivity.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp.ui.auth\n\nimport android.content.Intent\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.databinding.DataBindingUtil\nimport androidx.lifecycle.*\nimport kotlinx.android.synthetic.main.activity_login.*\nimport kotlinx.coroutines.launch\nimport net.simplifiedcoding.mvvmsampleapp.R\nimport net.simplifiedcoding.mvvmsampleapp.data.db.entities.User\nimport net.simplifiedcoding.mvvmsampleapp.databinding.ActivityLoginBinding\nimport net.simplifiedcoding.mvvmsampleapp.ui.home.HomeActivity\nimport net.simplifiedcoding.mvvmsampleapp.util.*\nimport org.kodein.di.KodeinAware\nimport org.kodein.di.android.kodein\nimport org.kodein.di.generic.instance\n\n\nclass LoginActivity : AppCompatActivity(), KodeinAware {\n\n    override val kodein by kodein()\n    private val factory: AuthViewModelFactory by instance()\n\n    private lateinit var binding: ActivityLoginBinding\n    private lateinit var viewModel: AuthViewModel\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        binding = DataBindingUtil.setContentView(this, R.layout.activity_login)\n        viewModel = ViewModelProvider(this, factory).get(AuthViewModel::class.java)\n\n\n        viewModel.getLoggedInUser().observe(this, Observer { user ->\n            if (user != null) {\n                Intent(this, HomeActivity::class.java).also {\n                    it.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK\n                    startActivity(it)\n                }\n            }\n        })\n\n        binding.buttonSignIn.setOnClickListener {\n            loginUser()\n        }\n\n        binding.textViewSignUp.setOnClickListener {\n            startActivity(Intent(this, SignupActivity::class.java))\n        }\n    }\n\n    private fun loginUser() {\n        val email = binding.editTextEmail.text.toString().trim()\n        val password = binding.editTextPassword.text.toString().trim()\n\n        lifecycleScope.launch {\n            try {\n                val authResponse = viewModel.userLogin(email, password)\n                if (authResponse.user != null) {\n                    viewModel.saveLoggedInUser(authResponse.user)\n                } else {\n                    binding.rootLayout.snackbar(authResponse.message!!)\n                }\n            } catch (e: ApiException) {\n                e.printStackTrace()\n            } catch (e: NoInternetException) {\n                e.printStackTrace()\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/net/simplifiedcoding/mvvmsampleapp/ui/auth/SignupActivity.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp.ui.auth\n\nimport android.content.Intent\nimport androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport androidx.databinding.DataBindingUtil\nimport androidx.lifecycle.Observer\nimport androidx.lifecycle.ViewModelProvider\nimport androidx.lifecycle.ViewModelProviders\nimport androidx.lifecycle.lifecycleScope\nimport kotlinx.android.synthetic.main.activity_login.*\nimport kotlinx.coroutines.launch\nimport net.simplifiedcoding.mvvmsampleapp.R\nimport net.simplifiedcoding.mvvmsampleapp.data.db.entities.User\nimport net.simplifiedcoding.mvvmsampleapp.databinding.ActivitySignupBinding\nimport net.simplifiedcoding.mvvmsampleapp.ui.home.HomeActivity\nimport net.simplifiedcoding.mvvmsampleapp.util.*\nimport org.kodein.di.KodeinAware\nimport org.kodein.di.android.kodein\nimport org.kodein.di.generic.instance\n\nclass SignupActivity : AppCompatActivity(), KodeinAware {\n\n    override val kodein by kodein()\n    private val factory: AuthViewModelFactory by instance()\n\n    private lateinit var binding: ActivitySignupBinding\n    private lateinit var viewModel: AuthViewModel\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        binding = DataBindingUtil.setContentView(this, R.layout.activity_signup)\n        viewModel = ViewModelProvider(this, factory).get(AuthViewModel::class.java)\n\n        viewModel.getLoggedInUser().observe(this, Observer { user ->\n            if (user != null) {\n                Intent(this, HomeActivity::class.java).also {\n                    it.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK\n                    startActivity(it)\n                }\n            }\n        })\n\n        binding.buttonSignUp.setOnClickListener {\n            userSignup()\n        }\n    }\n\n    private fun userSignup() {\n        val name = binding.editTextName.text.toString().trim()\n        val email = binding.editTextEmail.text.toString().trim()\n        val password = binding.editTextPassword.text.toString().trim()\n        val password1 = binding.editTextPassword.text.toString().trim()\n\n        //@todo add input validations\n\n        lifecycleScope.launch {\n            try {\n                val authResponse = viewModel.userSignup(name, email, password)\n                if (authResponse.user != null) {\n                    viewModel.saveLoggedInUser(authResponse.user)\n                } else {\n                    binding.root.snackbar(authResponse.message!!)\n                }\n            } catch (e: ApiException) {\n                e.printStackTrace()\n            } catch (e: NoInternetException) {\n                e.printStackTrace()\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/net/simplifiedcoding/mvvmsampleapp/ui/home/HomeActivity.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp.ui.home\n\nimport androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport androidx.navigation.Navigation\nimport androidx.navigation.ui.NavigationUI\nimport kotlinx.android.synthetic.main.activity_home.*\nimport net.simplifiedcoding.mvvmsampleapp.R\n\nclass HomeActivity : AppCompatActivity() {\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_home)\n\n        setSupportActionBar(toolbar)\n\n        val navController = Navigation.findNavController(this, R.id.fragment)\n        NavigationUI.setupWithNavController(nav_view, navController)\n        NavigationUI.setupActionBarWithNavController(this,navController, drawer_layout)\n    }\n\n    override fun onSupportNavigateUp(): Boolean {\n        return NavigationUI.navigateUp(\n            Navigation.findNavController(this, R.id.fragment),\n            drawer_layout\n        )\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/net/simplifiedcoding/mvvmsampleapp/ui/home/profile/ProfileFragment.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp.ui.home.profile\n\nimport androidx.lifecycle.ViewModelProviders\nimport android.os.Bundle\nimport androidx.fragment.app.Fragment\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.databinding.DataBindingUtil\n\nimport net.simplifiedcoding.mvvmsampleapp.R\nimport net.simplifiedcoding.mvvmsampleapp.databinding.ProfileFragmentBinding\nimport org.kodein.di.android.x.kodein\nimport org.kodein.di.KodeinAware\nimport org.kodein.di.generic.instance\n\nclass ProfileFragment : Fragment(), KodeinAware {\n\n    override val kodein by kodein()\n\n    private lateinit var viewModel: ProfileViewModel\n    private val factory: ProfileViewModelFactory by instance()\n\n    override fun onCreateView(\n        inflater: LayoutInflater, container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        val binding: ProfileFragmentBinding =\n            DataBindingUtil.inflate(inflater, R.layout.profile_fragment, container, false)\n        viewModel = ViewModelProviders.of(this, factory).get(ProfileViewModel::class.java)\n        binding.viewmodel = viewModel\n        binding.lifecycleOwner = this\n        return binding.root\n    }\n\n\n}\n"
  },
  {
    "path": "app/src/main/java/net/simplifiedcoding/mvvmsampleapp/ui/home/profile/ProfileViewModel.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp.ui.home.profile\n\nimport androidx.lifecycle.ViewModel;\nimport net.simplifiedcoding.mvvmsampleapp.data.repositories.UserRepository\n\nclass ProfileViewModel(\n    repository: UserRepository\n) : ViewModel() {\n\n    val user = repository.getUser()\n\n}\n"
  },
  {
    "path": "app/src/main/java/net/simplifiedcoding/mvvmsampleapp/ui/home/profile/ProfileViewModelFactory.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp.ui.home.profile\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.ViewModelProvider\nimport net.simplifiedcoding.mvvmsampleapp.data.repositories.UserRepository\n\n@Suppress(\"UNCHECKED_CAST\")\nclass ProfileViewModelFactory(\n    private val repository: UserRepository\n) : ViewModelProvider.NewInstanceFactory() {\n\n    override fun <T : ViewModel?> create(modelClass: Class<T>): T {\n        return ProfileViewModel(repository) as T\n    }\n}"
  },
  {
    "path": "app/src/main/java/net/simplifiedcoding/mvvmsampleapp/ui/home/quotes/QuoteItem.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp.ui.home.quotes\n\nimport com.xwray.groupie.databinding.BindableItem\nimport net.simplifiedcoding.mvvmsampleapp.R\nimport net.simplifiedcoding.mvvmsampleapp.data.db.entities.Quote\nimport net.simplifiedcoding.mvvmsampleapp.databinding.ItemQuoteBinding\n\nclass QuoteItem(\n    private val quote: Quote\n) : BindableItem<ItemQuoteBinding>(){\n\n    override fun getLayout() = R.layout.item_quote\n\n    override fun bind(viewBinding: ItemQuoteBinding, position: Int) {\n        viewBinding.setQuote(quote)\n    }\n}"
  },
  {
    "path": "app/src/main/java/net/simplifiedcoding/mvvmsampleapp/ui/home/quotes/QuotesFragment.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp.ui.home.quotes\n\nimport androidx.lifecycle.ViewModelProviders\nimport android.os.Bundle\nimport androidx.fragment.app.Fragment\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.lifecycle.Observer\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport com.xwray.groupie.GroupAdapter\nimport com.xwray.groupie.ViewHolder\nimport kotlinx.android.synthetic.main.quotes_fragment.*\n\nimport net.simplifiedcoding.mvvmsampleapp.R\nimport net.simplifiedcoding.mvvmsampleapp.data.db.entities.Quote\nimport net.simplifiedcoding.mvvmsampleapp.util.Coroutines\nimport net.simplifiedcoding.mvvmsampleapp.util.hide\nimport net.simplifiedcoding.mvvmsampleapp.util.show\nimport net.simplifiedcoding.mvvmsampleapp.util.toast\nimport org.kodein.di.KodeinAware\nimport org.kodein.di.android.x.kodein\nimport org.kodein.di.generic.instance\n\nclass QuotesFragment : Fragment(), KodeinAware {\n\n    override val kodein by kodein()\n\n    private val factory: QuotesViewModelFactory by instance()\n\n    private lateinit var viewModel: QuotesViewModel\n\n    override fun onCreateView(\n        inflater: LayoutInflater, container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        return inflater.inflate(R.layout.quotes_fragment, container, false)\n    }\n\n    override fun onActivityCreated(savedInstanceState: Bundle?) {\n        super.onActivityCreated(savedInstanceState)\n        viewModel = ViewModelProviders.of(this, factory).get(QuotesViewModel::class.java)\n        bindUI()\n    }\n\n\n    private fun bindUI() = Coroutines.main {\n        progress_bar.show()\n        viewModel.quotes.await().observe(this, Observer {\n            progress_bar.hide()\n            initRecyclerView(it.toQuoteItem())\n        })\n    }\n\n    private fun initRecyclerView(quoteItem: List<QuoteItem>) {\n\n        val mAdapter = GroupAdapter<ViewHolder>().apply {\n            addAll(quoteItem)\n        }\n\n        recyclerview.apply {\n            layoutManager = LinearLayoutManager(context)\n            setHasFixedSize(true)\n            adapter = mAdapter\n        }\n\n    }\n\n\n    private fun List<Quote>.toQuoteItem() : List<QuoteItem>{\n        return this.map {\n            QuoteItem(it)\n        }\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/net/simplifiedcoding/mvvmsampleapp/ui/home/quotes/QuotesViewModel.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp.ui.home.quotes\n\nimport androidx.lifecycle.ViewModel;\nimport net.simplifiedcoding.mvvmsampleapp.data.repositories.QuotesRepository\nimport net.simplifiedcoding.mvvmsampleapp.util.lazyDeferred\n\nclass QuotesViewModel(\n    repository: QuotesRepository\n) : ViewModel() {\n\n    val quotes by lazyDeferred {\n        repository.getQuotes()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/net/simplifiedcoding/mvvmsampleapp/ui/home/quotes/QuotesViewModelFactory.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp.ui.home.quotes\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.ViewModelProvider\nimport net.simplifiedcoding.mvvmsampleapp.data.repositories.QuotesRepository\nimport net.simplifiedcoding.mvvmsampleapp.data.repositories.UserRepository\n\n@Suppress(\"UNCHECKED_CAST\")\nclass QuotesViewModelFactory(\n    private val repository: QuotesRepository\n) : ViewModelProvider.NewInstanceFactory() {\n\n    override fun <T : ViewModel?> create(modelClass: Class<T>): T {\n        return QuotesViewModel(repository) as T\n    }\n}"
  },
  {
    "path": "app/src/main/java/net/simplifiedcoding/mvvmsampleapp/util/Coroutines.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp.util\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\n\nobject Coroutines {\n\n    fun main(work: suspend (() -> Unit)) =\n        CoroutineScope(Dispatchers.Main).launch {\n            work()\n        }\n\n    fun io(work: suspend (() -> Unit)) =\n        CoroutineScope(Dispatchers.IO).launch {\n            work()\n        }\n\n}"
  },
  {
    "path": "app/src/main/java/net/simplifiedcoding/mvvmsampleapp/util/Delegates.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp.util\n\nimport kotlinx.coroutines.*\n\nfun<T> lazyDeferred(block: suspend CoroutineScope.() -> T): Lazy<Deferred<T>>{\n    return lazy {\n        GlobalScope.async(start = CoroutineStart.LAZY) {\n            block.invoke(this)\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/net/simplifiedcoding/mvvmsampleapp/util/Exceptions.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp.util\n\nimport java.io.IOException\n\nclass ApiException(message: String) : IOException(message)\nclass NoInternetException(message: String) : IOException(message)"
  },
  {
    "path": "app/src/main/java/net/simplifiedcoding/mvvmsampleapp/util/ViewUtils.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp.util\n\nimport android.content.Context\nimport android.view.View\nimport android.widget.ProgressBar\nimport android.widget.Toast\nimport com.google.android.material.snackbar.Snackbar\n\n\nfun Context.toast(message: String){\n    Toast.makeText(this, message, Toast.LENGTH_LONG ).show()\n}\n\nfun ProgressBar.show(){\n    visibility = View.VISIBLE\n}\n\nfun ProgressBar.hide(){\n    visibility = View.GONE\n}\n\nfun View.snackbar(message: String){\n    Snackbar.make(this, message, Snackbar.LENGTH_LONG).also { snackbar ->\n        snackbar.setAction(\"Ok\") {\n            snackbar.dismiss()\n        }\n    }.show()\n}\n"
  },
  {
    "path": "app/src/main/res/drawable/edit_text_round_gray_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n       android:shape=\"rectangle\" android:padding=\"10dp\">\n\n    <solid android:color=\"#f1f3f4\"/>\n\n    <corners\n            android:bottomRightRadius=\"8dp\"\n            android:bottomLeftRadius=\"8dp\"\n            android:topLeftRadius=\"8dp\"\n            android:topRightRadius=\"8dp\"/>\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/ic_app_logo.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"512\"\n    android:viewportWidth=\"512\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#3b4a51\" android:pathData=\"m309.027,287.813 l42.438,42.438 -21.211,21.211 -42.438,-42.438zM309.027,287.813\"/>\n    <path android:fillColor=\"#3b4a51\" android:pathData=\"m330.25,160.535 l21.211,21.211 -42.434,42.434 -21.211,-21.211zM330.25,160.535\"/>\n    <path android:fillColor=\"#465a61\" android:pathData=\"m181.746,160.535 l42.438,42.434 -21.211,21.211 -42.438,-42.434zM181.746,160.535\"/>\n    <path android:fillColor=\"#465a61\" android:pathData=\"m202.973,287.813 l21.211,21.211 -42.434,42.438 -21.211,-21.211zM202.973,287.813\"/>\n    <path android:fillColor=\"#465a61\" android:pathData=\"m312.5,241h93.5v30h-93.5zM312.5,241\"/>\n    <path android:fillColor=\"#596c76\" android:pathData=\"m241,106h30v90h-30zM241,106\"/>\n    <path android:fillColor=\"#465a61\" android:pathData=\"m256,106h15v90h-15zM256,106\"/>\n    <path android:fillColor=\"#596c76\" android:pathData=\"m106,241h90v30h-90zM106,241\"/>\n    <path android:fillColor=\"#596c76\" android:pathData=\"m241,316h30v90h-30zM241,316\"/>\n    <path android:fillColor=\"#465a61\" android:pathData=\"m256,316h15v90h-15zM256,316\"/>\n    <path android:fillColor=\"#b5baf3\" android:pathData=\"m256,181c-41.398,0 -75,33.602 -75,75s33.602,75 75,75 75,-33.602 75,-75 -33.602,-75 -75,-75zM256,181\"/>\n    <path android:fillColor=\"#979fef\" android:pathData=\"m451,316c-33.09,0 -60,-26.91 -60,-60s26.91,-60 60,-60 61,26.91 61,60 -27.91,60 -61,60zM451,316\"/>\n    <path android:fillColor=\"#b5baf3\" android:pathData=\"m61,316c-33.09,0 -61,-26.91 -61,-60s27.91,-60 61,-60 60,26.91 60,60 -26.91,60 -60,60zM61,316\"/>\n    <path android:fillColor=\"#b5baf3\" android:pathData=\"m256,391c-33,0 -60,28 -60,61s27,60 60,60 60,-27 60,-60 -27,-61 -60,-61zM256,391\"/>\n    <path android:fillColor=\"#b5baf3\" android:pathData=\"m256,0c-33,0 -60,28 -60,61s27,60 60,60 60,-27 60,-60 -27,-61 -60,-61zM256,0\"/>\n    <path android:fillColor=\"#979fef\" android:pathData=\"m330.238,181.746c-17.488,-17.488 -17.652,-45.949 0,-63.633 16.977,-16.992 46.641,-16.992 63.648,0 17.629,17.633 17.543,46.102 0,63.648 -17.645,17.609 -46.102,17.531 -63.648,-0.016zM330.238,181.746\"/>\n    <path android:fillColor=\"#b5baf3\" android:pathData=\"m118.113,393.887c-17.633,-17.633 -17.547,-46.102 0,-63.648 17.023,-17.008 46.672,-16.961 63.648,0.016 17.543,17.543 17.602,46.016 -0.016,63.633 -17.531,17.563 -46.016,17.617 -63.633,0zM118.113,393.887\"/>\n    <path android:fillColor=\"#979fef\" android:pathData=\"m330.238,393.887c-17.613,-17.645 -17.531,-46.102 0.016,-63.648 16.945,-16.949 46.598,-17.008 63.633,0 17.563,17.566 17.617,46.031 0,63.648 -17.633,17.633 -46.102,17.547 -63.648,0zM330.238,393.887\"/>\n    <path android:fillColor=\"#b5baf3\" android:pathData=\"m118.113,181.746c-17.563,-17.531 -17.617,-46.016 0,-63.633 16.992,-16.992 46.672,-16.992 63.648,0 17.602,17.633 17.547,46.086 -0.016,63.648 -17.543,17.543 -46.016,17.602 -63.633,-0.016zM118.113,181.746\"/>\n    <path android:fillColor=\"#979fef\" android:pathData=\"m316,452c0,33 -27,60 -60,60v-121c33,0 60,28 60,61zM316,452\"/>\n    <path android:fillColor=\"#979fef\" android:pathData=\"m256,121v-121c33,0 60,28 60,61s-27,60 -60,60zM256,121\"/>\n    <path android:fillColor=\"#979fef\" android:pathData=\"m256,331v-150c41.398,0 75,33.602 75,75s-33.602,75 -75,75zM256,331\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_email.xml",
    "content": "<vector android:height=\"24dp\" android:tint=\"#616363\"\n    android:viewportHeight=\"24.0\" android:viewportWidth=\"24.0\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#FF000000\" android:pathData=\"M20,4L4,4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM20,8l-8,5 -8,-5L4,6l8,5 8,-5v2z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:height=\"108dp\"\n        android:width=\"108dp\"\n        android:viewportHeight=\"108\"\n        android:viewportWidth=\"108\">\n    <path android:fillColor=\"#008577\"\n          android:pathData=\"M0,0h108v108h-108z\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M9,0L9,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,0L19,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M29,0L29,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M39,0L39,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M49,0L49,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M59,0L59,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M69,0L69,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M79,0L79,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M89,0L89,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M99,0L99,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,9L108,9\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,19L108,19\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,29L108,29\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,39L108,39\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,49L108,49\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,59L108,59\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,69L108,69\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,79L108,79\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,89L108,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,99L108,99\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,29L89,29\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,39L89,39\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,49L89,49\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,59L89,59\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,69L89,69\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,79L89,79\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M29,19L29,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M39,19L39,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M49,19L49,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M59,19L59,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M69,19L69,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M79,19L79,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_lock.xml",
    "content": "<vector android:height=\"24dp\" android:tint=\"#616363\"\n    android:viewportHeight=\"24.0\" android:viewportWidth=\"24.0\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#FF000000\" android:pathData=\"M18,8h-1L17,6c0,-2.76 -2.24,-5 -5,-5S7,3.24 7,6v2L6,8c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,10c0,-1.1 -0.9,-2 -2,-2zM12,17c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2zM15.1,8L8.9,8L8.9,6c0,-1.71 1.39,-3.1 3.1,-3.1 1.71,0 3.1,1.39 3.1,3.1v2z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_name.xml",
    "content": "<vector android:height=\"24dp\" android:tint=\"#616363\"\n    android:viewportHeight=\"24.0\" android:viewportWidth=\"24.0\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#FF000000\" android:pathData=\"M3,5v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2L5,3c-1.11,0 -2,0.9 -2,2zM15,9c0,1.66 -1.34,3 -3,3s-3,-1.34 -3,-3 1.34,-3 3,-3 3,1.34 3,3zM6,17c0,-2 4,-3.1 6,-3.1s6,1.1 6,3.1v1L6,18v-1z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable-v24/ic_launcher_foreground.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:aapt=\"http://schemas.android.com/aapt\"\n        android:width=\"108dp\"\n        android:height=\"108dp\"\n        android:viewportHeight=\"108\"\n        android:viewportWidth=\"108\">\n    <path\n            android:fillType=\"evenOdd\"\n            android:pathData=\"M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z\"\n            android:strokeColor=\"#00000000\"\n            android:strokeWidth=\"1\">\n        <aapt:attr name=\"android:fillColor\">\n            <gradient\n                    android:endX=\"78.5885\"\n                    android:endY=\"90.9159\"\n                    android:startX=\"48.7653\"\n                    android:startY=\"61.0927\"\n                    android:type=\"linear\">\n                <item\n                        android:color=\"#44000000\"\n                        android:offset=\"0.0\"/>\n                <item\n                        android:color=\"#00000000\"\n                        android:offset=\"1.0\"/>\n            </gradient>\n        </aapt:attr>\n    </path>\n    <path\n            android:fillColor=\"#FFFFFF\"\n            android:fillType=\"nonZero\"\n            android:pathData=\"M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z\"\n            android:strokeColor=\"#00000000\"\n            android:strokeWidth=\"1\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_home.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.drawerlayout.widget.DrawerLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:id=\"@+id/drawer_layout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        tools:context=\".ui.home.HomeActivity\">\n\n    <LinearLayout\n            android:orientation=\"vertical\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n        <androidx.appcompat.widget.Toolbar\n                android:id=\"@+id/toolbar\"\n                android:background=\"?colorPrimary\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"/>\n\n        <fragment\n                android:name=\"androidx.navigation.fragment.NavHostFragment\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                app:navGraph=\"@navigation/nav_graph\"\n                app:defaultNavHost=\"true\"\n                android:id=\"@+id/fragment\"/>\n    </LinearLayout>\n\n    <com.google.android.material.navigation.NavigationView\n            android:id=\"@+id/nav_view\"\n            app:menu=\"@menu/nav_menu\"\n            android:layout_gravity=\"start\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"match_parent\"/>\n\n</androidx.drawerlayout.widget.DrawerLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_login.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <androidx.coordinatorlayout.widget.CoordinatorLayout\n            android:id=\"@+id/root_layout\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:background=\"#E2E2E2\"\n            tools:context=\".ui.auth.LoginActivity\">\n\n\n        <RelativeLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:padding=\"16dp\">\n\n            <ImageView\n                    android:id=\"@+id/image_view_logo\"\n                    android:layout_width=\"80dp\"\n                    android:layout_height=\"80dp\"\n                    android:layout_centerHorizontal=\"true\"\n                    android:layout_marginTop=\"75dp\"\n                    android:background=\"@drawable/ic_app_logo\" />\n\n            <LinearLayout\n                    android:id=\"@+id/linearLayout1\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_below=\"@id/image_view_logo\"\n                    android:orientation=\"vertical\">\n\n                <TextView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_gravity=\"center_horizontal\"\n                        android:text=\"architect your app with\"\n                        android:textAppearance=\"@style/TextAppearance.AppCompat.Large\"\n                        android:textColor=\"#465A61\"\n                        app:fontFamily=\"cursive\" />\n\n                <TextView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_gravity=\"center_horizontal\"\n                        android:text=\"MVVM\"\n                        android:textAllCaps=\"false\"\n                        android:textAppearance=\"@style/TextAppearance.AppCompat.Display2\"\n                        android:textColor=\"#969EEE\"\n                        android:textStyle=\"bold\"\n                        android:typeface=\"monospace\"\n                        app:fontFamily=\"casual\" />\n\n            </LinearLayout>\n\n            <LinearLayout\n                    android:id=\"@+id/linearLayout2\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_below=\"@id/linearLayout1\"\n                    android:background=\"#ffffff\"\n                    android:orientation=\"vertical\"\n                    android:padding=\"18dp\">\n\n                <EditText\n                        android:id=\"@+id/edit_text_email\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"match_parent\"\n                        android:layout_marginBottom=\"12dp\"\n                        android:background=\"@drawable/edit_text_round_gray_background\"\n                        android:drawableLeft=\"@drawable/ic_email\"\n                        android:drawablePadding=\"16dp\"\n                        android:hint=\"belal@gmail.com\"\n                        android:inputType=\"textEmailAddress\"\n                        android:padding=\"12dp\" />\n\n                <EditText\n                        android:id=\"@+id/edit_text_password\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"match_parent\"\n                        android:layout_marginBottom=\"12dp\"\n                        android:background=\"@drawable/edit_text_round_gray_background\"\n                        android:drawableLeft=\"@drawable/ic_lock\"\n                        android:drawablePadding=\"16dp\"\n                        android:hint=\"password\"\n                        android:inputType=\"textPassword\"\n                        android:padding=\"12dp\" />\n\n                <TextView\n                        android:id=\"@+id/text_view_forget_password\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginBottom=\"12dp\"\n                        android:text=\"Forget Password?\"\n                        android:textAppearance=\"@style/TextAppearance.AppCompat.Medium\"\n                        android:textColor=\"@color/colorPrimaryDark\" />\n\n                <Button\n                        android:id=\"@+id/button_sign_in\"\n                        android:layout_width=\"150dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_gravity=\"center_horizontal\"\n                        android:text=\"Sign In\"\n                        android:textAllCaps=\"false\" />\n\n            </LinearLayout>\n\n            <TextView\n                    android:id=\"@+id/text_view_sign_up\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_below=\"@id/linearLayout2\"\n                    android:layout_centerHorizontal=\"true\"\n                    android:layout_marginTop=\"12dp\"\n                    android:text=\"Don't have an account?\\nSign Up Here\"\n                    android:textAlignment=\"center\"\n                    android:textAppearance=\"@style/TextAppearance.AppCompat.Large\"\n                    android:textColor=\"@color/colorPrimary\" />\n\n        </RelativeLayout>\n\n        <ProgressBar\n                android:id=\"@+id/progress_bar\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"center_horizontal|center_vertical\"\n                android:visibility=\"invisible\" />\n\n\n    </androidx.coordinatorlayout.widget.CoordinatorLayout>\n\n</layout>\n\n\n"
  },
  {
    "path": "app/src/main/res/layout/activity_signup.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n>\n\n    <androidx.coordinatorlayout.widget.CoordinatorLayout\n            android:layout_width=\"match_parent\"\n            android:background=\"#E2E2E2\"\n            android:layout_height=\"match_parent\"\n            tools:context=\".ui.auth.SignupActivity\">\n\n\n        <RelativeLayout\n                android:padding=\"16dp\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\">\n\n            <ImageView\n                    android:layout_marginTop=\"45dp\"\n                    android:id=\"@+id/image_view_logo\"\n                    android:layout_centerHorizontal=\"true\"\n                    android:background=\"@drawable/ic_app_logo\"\n                    android:layout_width=\"80dp\"\n                    android:layout_height=\"80dp\"\n            />\n\n            <LinearLayout\n                    android:id=\"@+id/linearLayout1\"\n                    android:layout_below=\"@id/image_view_logo\"\n                    android:orientation=\"vertical\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\">\n\n                <TextView\n                        android:layout_gravity=\"center_horizontal\"\n                        android:text=\"architect your app with\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:textAppearance=\"@style/TextAppearance.AppCompat.Large\" app:fontFamily=\"cursive\"\n                        android:textColor=\"#465A61\"/>\n\n                <TextView\n                        android:layout_gravity=\"center_horizontal\"\n                        android:text=\"MVVM\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:textAppearance=\"@style/TextAppearance.AppCompat.Display2\"\n                        app:fontFamily=\"casual\" android:textStyle=\"bold\" android:textAllCaps=\"false\"\n                        android:typeface=\"monospace\" android:textColor=\"#969EEE\"/>\n\n            </LinearLayout>\n\n            <LinearLayout\n                    android:id=\"@+id/linearLayout2\"\n                    android:padding=\"18dp\"\n                    android:background=\"#ffffff\"\n                    android:layout_below=\"@id/linearLayout1\"\n                    android:orientation=\"vertical\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\">\n\n                <EditText\n                        android:id=\"@+id/edit_text_name\"\n                        android:hint=\"Belal Khan\"\n                        android:inputType=\"text\"\n                        android:drawablePadding=\"16dp\"\n                        android:drawableLeft=\"@drawable/ic_name\"\n                        android:background=\"@drawable/edit_text_round_gray_background\"\n                        android:layout_width=\"match_parent\"\n                        android:padding=\"12dp\"\n                        android:layout_marginBottom=\"12dp\"\n                        android:layout_height=\"match_parent\"/>\n\n                <EditText\n                        android:id=\"@+id/edit_text_email\"\n                        android:hint=\"belal@gmail.com\"\n                        android:inputType=\"textEmailAddress\"\n                        android:drawablePadding=\"16dp\"\n                        android:drawableLeft=\"@drawable/ic_email\"\n                        android:background=\"@drawable/edit_text_round_gray_background\"\n                        android:layout_width=\"match_parent\"\n                        android:padding=\"12dp\"\n                        android:layout_marginBottom=\"12dp\"\n                        android:layout_height=\"match_parent\"/>\n\n                <EditText\n                        android:id=\"@+id/edit_text_password\"\n                        android:inputType=\"textPassword\"\n                        android:hint=\"password\"\n                        android:drawablePadding=\"16dp\"\n                        android:drawableLeft=\"@drawable/ic_lock\"\n                        android:background=\"@drawable/edit_text_round_gray_background\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_marginBottom=\"12dp\"\n                        android:padding=\"12dp\"\n                        android:layout_height=\"match_parent\"/>\n\n                <EditText\n                        android:id=\"@+id/edit_text_password_confirm\"\n                        android:inputType=\"textPassword\"\n                        android:hint=\"confirm password\"\n                        android:drawablePadding=\"16dp\"\n                        android:drawableLeft=\"@drawable/ic_lock\"\n                        android:background=\"@drawable/edit_text_round_gray_background\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_marginBottom=\"12dp\"\n                        android:padding=\"12dp\"\n                        android:layout_height=\"match_parent\"/>\n\n                <TextView\n                        android:id=\"@+id/text_view_forget_password\"\n                        android:textColor=\"@color/colorPrimaryDark\"\n                        android:layout_marginBottom=\"12dp\"\n                        android:textAppearance=\"@style/TextAppearance.AppCompat.Medium\"\n                        android:text=\"Forget Password?\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"/>\n\n                <Button\n                        android:id=\"@+id/button_sign_up\"\n                        android:layout_gravity=\"center_horizontal\"\n                        android:textAllCaps=\"false\"\n                        android:text=\"Sign Up\"\n                        android:layout_width=\"150dp\"\n                        android:layout_height=\"wrap_content\"/>\n\n            </LinearLayout>\n\n            <TextView\n                    android:id=\"@+id/text_view_login\"\n                    android:layout_marginTop=\"12dp\"\n                    android:textColor=\"@color/colorPrimary\"\n                    android:layout_centerHorizontal=\"true\"\n                    android:textAppearance=\"@style/TextAppearance.AppCompat.Large\"\n                    android:layout_below=\"@id/linearLayout2\"\n                    android:textAlignment=\"center\"\n                    android:text=\"Already have an account?\\nSign in Here\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"/>\n\n        </RelativeLayout>\n\n        <ProgressBar\n                android:visibility=\"invisible\"\n                android:id=\"@+id/progress_bar\"\n                android:layout_gravity=\"center_horizontal|center_vertical\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"/>\n\n\n    </androidx.coordinatorlayout.widget.CoordinatorLayout>\n</layout>\n\n\n\n\n"
  },
  {
    "path": "app/src/main/res/layout/item_quote.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\">\n    <data>\n        <variable name=\"quote\"\n                  type=\"net.simplifiedcoding.mvvmsampleapp.data.db.entities.Quote\"/>\n    </data>\n\n    <com.google.android.material.card.MaterialCardView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n\n        <RelativeLayout\n                android:padding=\"12dp\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\">\n\n            <TextView\n                    android:textAppearance=\"@style/TextAppearance.AppCompat.Headline\"\n                    android:id=\"@+id/quote\"\n                    android:textColor=\"@color/colorPrimaryDark\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"@{`'`+quote.quote+`'`}\"\n                    tools:text=\"Success doesn’t just find you. You have to go out and get it.\"/>\n\n            <TextView\n                    android:textColor=\"@color/colorPrimary\"\n                    android:textAppearance=\"@style/TextAppearance.AppCompat.Medium\"\n                    tools:text=\"- Belal Khan\"\n                    android:text=\"@{`-` + quote.author}\"\n                    android:layout_alignParentEnd=\"true\"\n                    android:layout_below=\"@id/quote\"\n                    android:id=\"@+id/author\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_alignParentRight=\"true\"\n                    android:textStyle=\"italic\"/>\n\n            <TextView\n                    android:layout_marginTop=\"7dp\"\n                    android:layout_below=\"@id/author\"\n                    android:background=\"@color/colorPrimary\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"1dp\"/>\n\n        </RelativeLayout>\n    </com.google.android.material.card.MaterialCardView>\n</layout>"
  },
  {
    "path": "app/src/main/res/layout/profile_fragment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n>\n    <data>\n\n        <variable name=\"viewmodel\"\n                  type=\"net.simplifiedcoding.mvvmsampleapp.ui.home.profile.ProfileViewModel\"\n        />\n\n    </data>\n\n    <FrameLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            tools:context=\".ui.home.profile.ProfileFragment\">\n\n        <LinearLayout\n                android:layout_gravity=\"center_horizontal|center_vertical\"\n                android:orientation=\"vertical\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\">\n\n            <TextView\n                    android:layout_gravity=\"center_horizontal\"\n                    android:text=\"Welcome\"\n                    android:textColor=\"@color/colorPrimary\"\n                    android:textAppearance=\"@style/TextAppearance.AppCompat.Medium\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"/>\n\n            <TextView\n                    android:layout_gravity=\"center_horizontal\"\n                    tools:text=\"Belal Khan\"\n                    android:text=\"@{viewmodel.user.name}\"\n                    android:textColor=\"@color/colorPrimaryDark\"\n                    android:textAppearance=\"@style/TextAppearance.AppCompat.Headline\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"/>\n            <TextView\n                    android:layout_gravity=\"center_horizontal\"\n                    tools:text=\"probelalkhan@gmail.com\"\n                    android:text=\"@{viewmodel.user.email}\"\n                    android:textColor=\"@color/colorPrimaryDark\"\n                    android:textAppearance=\"@style/TextAppearance.AppCompat.Medium\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"/>\n\n\n        </LinearLayout>\n\n\n    </FrameLayout>\n</layout>\n"
  },
  {
    "path": "app/src/main/res/layout/quotes_fragment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        tools:context=\".ui.home.quotes.QuotesFragment\">\n\n    <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/recyclerview\"\n            tools:listitem=\"@layout/item_quote\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"/>\n\n    <ProgressBar\n            android:layout_gravity=\"center_horizontal|center_vertical\"\n            android:id=\"@+id/progress_bar\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"/>\n\n</FrameLayout>"
  },
  {
    "path": "app/src/main/res/menu/nav_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item\n            android:title=\"Home\"\n            android:id=\"@+id/profileFragment\"\n    />\n\n    <item\n            android:title=\"Quotes\"\n            android:id=\"@+id/quotesFragment\"\n    />\n\n</menu>"
  },
  {
    "path": "app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\"/>\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\"/>\n</adaptive-icon>"
  },
  {
    "path": "app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@drawable/ic_launcher_background\"/>\n    <foreground android:drawable=\"@drawable/ic_launcher_foreground\"/>\n</adaptive-icon>"
  },
  {
    "path": "app/src/main/res/navigation/nav_graph.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<navigation xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n            xmlns:tools=\"http://schemas.android.com/tools\" android:id=\"@+id/nav_graph\"\n            app:startDestination=\"@id/profileFragment\">\n\n    <fragment android:id=\"@+id/profileFragment\"\n              android:name=\"net.simplifiedcoding.mvvmsampleapp.ui.home.profile.ProfileFragment\"\n              android:label=\"Profile\" tools:layout=\"@layout/profile_fragment\"/>\n    <fragment android:id=\"@+id/quotesFragment\"\n              android:name=\"net.simplifiedcoding.mvvmsampleapp.ui.home.quotes.QuotesFragment\"\n              android:label=\"Quotes\" tools:layout=\"@layout/quotes_fragment\"/>\n</navigation>"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#969EEE</color>\n    <color name=\"colorPrimaryDark\">#555C96</color>\n    <color name=\"colorAccent\">#969EEE</color>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">MVVM Sample App</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.MaterialComponents.Light.NoActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "app/src/test/java/net/simplifiedcoding/mvvmsampleapp/ExampleUnitTest.kt",
    "content": "package net.simplifiedcoding.mvvmsampleapp\n\nimport org.junit.Test\n\nimport org.junit.Assert.*\n\n/**\n * Example local unit test, which will execute on the development machine (host).\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\nclass ExampleUnitTest {\n    @Test\n    fun addition_isCorrect() {\n        assertEquals(4, 2 + 2)\n    }\n}\n"
  },
  {
    "path": "build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    ext.kotlin_version = '1.3.50'\n    repositories {\n        google()\n        jcenter()\n        \n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:3.5.0'\n        classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\"\n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n        //Android Navigation Safe Args Classpath\n        classpath \"androidx.navigation:navigation-safe-args-gradle-plugin:2.2.0-alpha02\"\n    }\n}\n\nallprojects {\n    repositories {\n        google()\n        jcenter()\n        \n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Sun Sep 15 19:06:09 KST 2019\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-5.4.1-all.zip\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\norg.gradle.jvmargs=-Xmx1536m\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n# AndroidX package structure to make it clearer which packages are bundled with the\n# Android operating system, and which are packaged with your app's APK\n# https://developer.android.com/topic/libraries/support-library/androidx-rn\nandroid.useAndroidX=true\n# Automatically convert third-party libraries to use AndroidX\nandroid.enableJetifier=true\n# Kotlin code style for this project: \"official\" or \"obsolete\":\nkotlin.code.style=official\nandroid.databinding.enableV2=true\n"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env sh\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=$(save \"$@\")\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\n# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong\nif [ \"$(uname)\" = \"Darwin\" ] && [ \"$HOME\" = \"$PWD\" ]; then\n  cd \"$(dirname \"$0\")\"\nfi\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto init\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto init\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:init\n@rem Get command-line arguments, handling Windows variants\n\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\n\n:win9xME_args\n@rem Slurp the command line arguments.\nset CMD_LINE_ARGS=\nset _SKIP=2\n\n:win9xME_args_slurp\nif \"x%~1\" == \"x\" goto execute\n\nset CMD_LINE_ARGS=%*\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "settings.gradle",
    "content": "include ':app'\n"
  }
]