[
  {
    "path": ".gitignore",
    "content": "# Emacs\r\n*~\r\n\r\n# Files for the Dalvik VM\r\n*.dex\r\n\r\n# Java class files\r\n*.class\r\n\r\n# Generated files\r\nbin/\r\ngen/\r\n\r\n# Gradle files\r\n.gradle/\r\nbuild/\r\napp/build/\r\n\r\n# Local configuration file (sdk path, etc)\r\nlocal.properties\r\n\r\n# Log Files\r\n*.log\r\n\r\n# OSX files\r\n.DS_Store\r\n\r\n# Android Studio\r\n.idea/\r\nidea/\r\nprojectFilesBackup/\r\ncaptures/\r\n\r\n# Generated iml files\r\n*.iml\r\n\r\n# Credentials for uploading builds\r\nconfig/*.yml\r\n"
  },
  {
    "path": "README.md",
    "content": "# MediaPickerInstagram\n\n[![Kotlin](https://img.shields.io/badge/kotlin-1.2.21-519EF8.svg)](https://kotlinlang.org/)\n[![Min SDK](https://img.shields.io/badge/min%20SDK-16-lightgrey.svg)](http://developer.android.com/about/dashboards/index.html#Platform)\n\n## Screenshots\n\n![gallery](https://cloud.githubusercontent.com/assets/10350755/20528721/99b9154a-b0cd-11e6-8597-d0ddf11bdca4.png) ![capture_photo](https://cloud.githubusercontent.com/assets/10350755/20528723/9aa26b64-b0cd-11e6-983d-e796701f52f8.png) ![capture_video](https://cloud.githubusercontent.com/assets/10350755/20528725/9b248ba8-b0cd-11e6-84b7-a1396cb1219e.png)\n\n## Work In Progress\n\n* ~~Gallery picker~~\n* ImageView cropper\n* ~~Capture photo~~\n* Capture video\n* Editor photo\n\n## Android Version Support\nAndroid fragmentation analytics --> [Platform Versions](http://developer.android.com/about/dashboards/index.html#Platform)\n\n* Min API 16 --> Jelly Bean : 4.1.x\n* Max API 25 --> Nougat : 7.x.x\n\n## Contributors\n[NodensN](https://github.com/NodensN)\n\nLicense\n--------\n\n    Copyright 2018 AndroidDevFr, Inc.\n\n    Licensed under the Apache License, Version 2.0 (the \"License\");\n    you may not use this file except in compliance with the License.\n    You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n    Unless required by applicable law or agreed to in writing, software\n    distributed under the License is distributed on an \"AS IS\" BASIS,\n    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n    See the License for the specific language governing permissions and\n    limitations under the License.\n"
  },
  {
    "path": "app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "app/build.gradle",
    "content": "apply plugin: 'com.android.application'\napply plugin: 'kotlin-android'\napply plugin: 'kotlin-android-extensions'\napply plugin: 'kotlin-kapt'\n\nandroid {\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n    compileSdkVersion 27\n    defaultConfig {\n        applicationId \"io.freshdroid.mediapickerinstagram\"\n        minSdkVersion 16\n        targetSdkVersion 27\n        versionCode 1\n        versionName \"1.0\"\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n    }\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n\n    implementation 'com.android.support:multidex:1.0.3'\n    androidTestImplementation 'com.android.support:multidex:1.0.3'\n    androidTestImplementation 'com.android.support:multidex-instrumentation:1.0.3'\n\n    implementation 'com.android.support:appcompat-v7:27.1.0'\n\n    implementation 'com.jakewharton.timber:timber:4.6.0'\n\n    implementation 'com.google.dagger:dagger:2.15'\n    kapt 'com.google.dagger:dagger-compiler:2.15'\n\n    implementation 'io.reactivex.rxjava2:rxjava:2.1.10'\n    implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'\n    implementation 'com.uber.autodispose:autodispose-kotlin:0.6.1'\n    implementation 'com.uber.autodispose:autodispose-android-kotlin:0.6.1'\n    implementation 'com.uber.autodispose:autodispose-android-archcomponents-kotlin:0.6.1'\n    implementation 'com.uber.autodispose:autodispose-android-archcomponents-test-kotlin:0.6.1'\n\n    androidTestImplementation \"com.android.support:support-annotations:27.1.0\"\n    androidTestImplementation \"com.android.support.test:rules:1.0.1\"\n    androidTestImplementation \"com.android.support.test:runner:1.0.1\"\n    testImplementation \"junit:junit:4.12\"\n\n    androidTestImplementation \"com.android.support.test.espresso:espresso-core:2.2.2\", {\n        exclude group: \"com.android.support\", module: \"support-annotations\"\n    }\n    androidTestImplementation(\"com.android.support.test.espresso:espresso-contrib:3.0.1\") {\n        exclude group: \"com.android.support\", module: \"appcompat\"\n        exclude group: \"com.android.support\", module: \"support-v4\"\n        exclude group: \"com.android.support\", module: \"support-annotations\"\n        exclude module: \"recyclerview-v7\"\n    }\n\n    implementation\"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version\"\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/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"io.freshdroid.mediapickerinstagram\">\n\n    <application\n        android:name=\".MediaPickerInstagramApplication\"\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\n</manifest>\n"
  },
  {
    "path": "app/src/main/java/io/freshdroid/mediapickerinstagram/MediaPickerInstagramApplication.kt",
    "content": "package io.freshdroid.mediapickerinstagram\n\nimport android.support.multidex.MultiDexApplication\nimport timber.log.Timber\n\n\nclass MediaPickerInstagramApplication : MultiDexApplication() {\n\n    private val component: MediaPickerInstagramApplicationComponent by lazy {\n        DaggerMediaPickerInstagramApplicationComponent.builder()\n                .mediaPickerInstagramApplicationModule(MediaPickerInstagramApplicationModule(applicationContext, this))\n                .build()\n    }\n\n    override fun onCreate() {\n        super.onCreate()\n\n        component().inject(this)\n\n        if (BuildConfig.DEBUG) {\n            Timber.plant(Timber.DebugTree())\n        }\n\n    }\n\n    fun component(): MediaPickerInstagramApplicationComponent {\n        return component\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/io/freshdroid/mediapickerinstagram/MediaPickerInstagramApplicationComponent.kt",
    "content": "package io.freshdroid.mediapickerinstagram\n\nimport dagger.Component\nimport javax.inject.Singleton\n\n@Singleton\n@Component(modules = [MediaPickerInstagramApplicationModule::class])\ninterface MediaPickerInstagramApplicationComponent : MediaPickerInstagramApplicationGraph {\n}"
  },
  {
    "path": "app/src/main/java/io/freshdroid/mediapickerinstagram/MediaPickerInstagramApplicationGraph.kt",
    "content": "package io.freshdroid.mediapickerinstagram\n\nimport io.freshdroid.mediapickerinstagram.lib.Environment\n\n\ninterface MediaPickerInstagramApplicationGraph {\n\n    fun environment(): Environment\n    fun inject(mediaPickerInstagramApplication: MediaPickerInstagramApplication)\n\n}"
  },
  {
    "path": "app/src/main/java/io/freshdroid/mediapickerinstagram/MediaPickerInstagramApplicationModule.kt",
    "content": "package io.freshdroid.mediapickerinstagram\n\nimport android.app.Application\nimport android.content.Context\nimport android.content.SharedPreferences\nimport android.content.pm.PackageInfo\nimport android.preference.PreferenceManager\nimport dagger.Module\nimport dagger.Provides\nimport io.freshdroid.mediapickerinstagram.lib.Build\nimport io.freshdroid.mediapickerinstagram.lib.Environment\nimport io.freshdroid.mediapickerinstagram.lib.qualifiers.ApplicationContext\nimport io.reactivex.Scheduler\nimport io.reactivex.schedulers.Schedulers\nimport java.util.*\nimport javax.inject.Singleton\n\n@Module\nclass MediaPickerInstagramApplicationModule(\n        private val context: Context,\n        private val application: Application\n) {\n\n    @Provides\n    @Singleton\n    @ApplicationContext\n    fun provideContext(): Context = context\n\n    @Provides\n    @Singleton\n    fun provideApplication(): Application = application\n\n    @Provides\n    @Singleton\n    fun providePackageInfo(application: Application): PackageInfo =\n            application.packageManager.getPackageInfo(application.packageName, 0)\n\n    @Provides\n    @Singleton\n    fun provideBuild(packageInfo: PackageInfo): Build = Build(packageInfo)\n\n    @Provides\n    @Singleton\n    fun provideLocale(): Locale = Locale.getDefault()\n\n    @Provides\n    @Singleton\n    fun provideSharedPreferences(): SharedPreferences = PreferenceManager.getDefaultSharedPreferences(application)\n\n    @Provides\n    @Singleton\n    fun provideEnvironment(scheduler: Scheduler): Environment {\n        return Environment(scheduler)\n    }\n\n    @Provides\n    @Singleton\n    fun provideScheduler(): Scheduler = Schedulers.computation()\n\n}"
  },
  {
    "path": "app/src/main/java/io/freshdroid/mediapickerinstagram/lib/ActivityResult.kt",
    "content": "package io.freshdroid.mediapickerinstagram.lib\n\nimport android.app.Activity\nimport android.content.Intent\n\n\ndata class ActivityResult(\n        private val requestCode: Int,\n        private val resultCode: Int,\n        val intent: Intent?\n) {\n\n    companion object {\n        @JvmStatic\n        fun create(requestCode: Int, resultCode: Int, intent: Intent?): ActivityResult = ActivityResult(requestCode, resultCode, intent)\n    }\n\n    fun isCanceled(): Boolean = resultCode == Activity.RESULT_CANCELED\n\n    fun isOk(): Boolean = resultCode == Activity.RESULT_OK\n\n    fun isRequestCode(v: Int): Boolean = requestCode == v\n\n}"
  },
  {
    "path": "app/src/main/java/io/freshdroid/mediapickerinstagram/lib/ActivityViewModel.kt",
    "content": "package io.freshdroid.mediapickerinstagram.lib\n\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport android.support.annotation.CallSuper\nimport io.reactivex.Observable\nimport io.reactivex.subjects.PublishSubject\nimport timber.log.Timber\n\n\nopen class ActivityViewModel {\n\n    private val activityResult = PublishSubject.create<ActivityResult>()\n    private val intent = PublishSubject.create<Intent>()\n\n    fun activityResult(activityResult: ActivityResult) {\n        this.activityResult.onNext(activityResult)\n    }\n\n    fun intent(intent: Intent?) {\n        intent?.let {\n            this.intent.onNext(intent)\n        }\n    }\n\n    @CallSuper\n    fun onCreate(context: Context, savedInstanceState: Bundle?) {\n        Timber.v(\"onCreate: %s\", this.toString())\n    }\n\n    @CallSuper\n    fun <ViewType> onResume(view: ViewType) {\n        Timber.v(\"onResume: %s\", this.toString())\n    }\n\n    @CallSuper\n    fun onPause() {\n        Timber.v(\"onPause: %s\", this.toString())\n    }\n\n    @CallSuper\n    fun onDestroy() {\n        Timber.v(\"onDestroy: %s\", this.toString())\n    }\n\n    protected fun activityResult(): Observable<ActivityResult> = activityResult\n\n    protected fun intent(): Observable<Intent> = intent\n\n}"
  },
  {
    "path": "app/src/main/java/io/freshdroid/mediapickerinstagram/lib/ActivityViewModelManager.kt",
    "content": "package io.freshdroid.mediapickerinstagram.lib\n\nimport android.content.Context\nimport android.os.Bundle\nimport com.uber.autodispose.android.lifecycle.AndroidLifecycleScopeProvider\nimport io.freshdroid.mediapickerinstagram.MediaPickerInstagramApplication\nimport io.freshdroid.mediapickerinstagram.lib.utils.BundleUtils\nimport java.util.*\n\nprivate const val VIEW_MODEL_ID_KEY = \"view_model_id\"\nprivate const val VIEW_MODEL_STATE_KEY = \"view_model_state\"\n\nobject ActivityViewModelManager {\n\n    private val viewModels = HashMap<String, ActivityViewModel>()\n\n    fun <ViewModelType : ActivityViewModel> fetch(context: Context,\n                                                  scopeProvider: AndroidLifecycleScopeProvider,\n                                                  activityViewModelConstructor: ActivityViewModelConstructor,\n                                                  savedInstanceState: Bundle?): ViewModelType {\n\n        val viewModelId = fetchId(savedInstanceState)\n        var activityViewModel: ActivityViewModel? = viewModels[viewModelId]\n\n        if (activityViewModel == null) {\n            activityViewModel = create(context, scopeProvider, activityViewModelConstructor, savedInstanceState, viewModelId)\n        }\n\n        return activityViewModel as ViewModelType\n    }\n\n    fun save(activityViewModel: ActivityViewModel, envelope: Bundle) : Bundle {\n        envelope.putString(VIEW_MODEL_ID_KEY, findIdForViewModel(activityViewModel))\n\n        val state = Bundle()\n        envelope.putBundle(VIEW_MODEL_STATE_KEY, state)\n\n        return envelope\n    }\n\n    fun destroy(activityViewModel: ActivityViewModel) {\n        activityViewModel.onDestroy()\n\n        val iterator = viewModels.entries.iterator()\n        while (iterator.hasNext()) {\n            val entry = iterator.next()\n            if (activityViewModel == entry.value) {\n                iterator.remove()\n            }\n        }\n    }\n\n    private fun <ViewModelType : ActivityViewModel> create(context: Context,\n                                                           scopeProvider: AndroidLifecycleScopeProvider,\n                                                           activityViewModelConstructor: ActivityViewModelConstructor,\n                                                           savedInstanceState: Bundle?,\n                                                           viewModelId: String): ViewModelType {\n\n        val application = context.applicationContext as MediaPickerInstagramApplication\n        val environment = application.component().environment()\n\n        val viewModel = activityViewModelConstructor(environment, scopeProvider)\n\n        viewModels[viewModelId] = viewModel\n\n        viewModel.onCreate(context, BundleUtils.maybeGetBundle(savedInstanceState, VIEW_MODEL_STATE_KEY))\n\n        return viewModel as ViewModelType\n    }\n\n    private fun fetchId(savedInstanceState: Bundle?): String {\n        return if (savedInstanceState != null) savedInstanceState.getString(VIEW_MODEL_ID_KEY) else UUID.randomUUID().toString()\n    }\n\n    private fun findIdForViewModel(activityViewModel: ActivityViewModel): String {\n        for ((key, value) in viewModels) {\n            if (activityViewModel == value) {\n                return key\n            }\n        }\n        throw RuntimeException(\"Cannot find view model in map!\")\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/io/freshdroid/mediapickerinstagram/lib/BaseActivity.kt",
    "content": "package io.freshdroid.mediapickerinstagram.lib\n\nimport android.arch.lifecycle.Lifecycle\nimport android.content.Intent\nimport android.os.Bundle\nimport android.support.annotation.CallSuper\nimport android.support.v7.app.AppCompatActivity\nimport com.uber.autodispose.android.lifecycle.AndroidLifecycleScopeProvider\nimport com.uber.autodispose.kotlin.autoDisposable\nimport io.freshdroid.mediapickerinstagram.MediaPickerInstagramApplication\nimport io.freshdroid.mediapickerinstagram.MediaPickerInstagramApplicationComponent\nimport io.freshdroid.mediapickerinstagram.lib.utils.BundleUtils\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.subjects.PublishSubject\nimport timber.log.Timber\n\ntypealias ActivityViewModelConstructor = (Environment, AndroidLifecycleScopeProvider) -> ActivityViewModel\n\nprivate const val VIEW_MODEL_KEY = \"viewModel\"\n\nopen class BaseActivity<ViewModelType : ActivityViewModel> : AppCompatActivity() {\n\n    protected val scopeProvider: AndroidLifecycleScopeProvider by lazy { AndroidLifecycleScopeProvider.from(this) }\n\n    protected lateinit var viewModel: ViewModelType\n\n    private val back = PublishSubject.create<Boolean>()\n\n    protected fun attachViewModel(viewModelSupplier: ActivityViewModelConstructor, savedInstanceState: Bundle?) {\n        viewModel = ActivityViewModelManager.fetch(this, scopeProvider, viewModelSupplier, BundleUtils.maybeGetBundle(savedInstanceState, VIEW_MODEL_KEY))\n    }\n\n    @CallSuper\n    override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) {\n        super.onActivityResult(requestCode, resultCode, intent)\n        viewModel.activityResult(ActivityResult.create(requestCode, resultCode, intent))\n    }\n\n    @CallSuper\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        Timber.v(\"onCreate %s\", this.toString())\n        viewModel.intent(intent)\n    }\n\n    @CallSuper\n    override fun onNewIntent(intent: Intent?) {\n        super.onNewIntent(intent)\n        viewModel.intent(intent)\n    }\n\n    @CallSuper\n    override fun onStart() {\n        super.onStart()\n        Timber.v(\"onStart %s\", this.toString())\n        back\n                .observeOn(AndroidSchedulers.mainThread())\n                .autoDisposable(AndroidLifecycleScopeProvider.from(this, Lifecycle.Event.ON_STOP))\n                .subscribe { _ -> goBack() }\n    }\n\n    @CallSuper\n    override fun onResume() {\n        super.onResume()\n        Timber.v(\"onResume %s\", this.toString())\n        viewModel.onResume(this)\n    }\n\n    @CallSuper\n    override fun onPause() {\n        super.onPause()\n        Timber.v(\"onPause %s\", this.toString())\n        viewModel.onPause()\n    }\n\n    @CallSuper\n    override fun onStop() {\n        super.onStop()\n        Timber.v(\"onStop %s\", this.toString())\n    }\n\n    @CallSuper\n    override fun onDestroy() {\n        super.onDestroy()\n        Timber.v(\"onDestroy %s\", this.toString())\n\n        if (isFinishing) {\n            ActivityViewModelManager.destroy(viewModel)\n        }\n    }\n\n    @CallSuper\n    override fun onSaveInstanceState(outState: Bundle) {\n        Timber.v(\"onSaveInstanceState %s\", this.toString())\n\n        var viewModelEnvelope = Bundle()\n        viewModelEnvelope = ActivityViewModelManager.save(viewModel, viewModelEnvelope)\n\n        outState.putBundle(VIEW_MODEL_KEY, viewModelEnvelope)\n\n        super.onSaveInstanceState(outState)\n    }\n\n    @CallSuper\n    override fun onBackPressed() {\n        back()\n    }\n\n    protected open fun exitTransition(): Pair<Int, Int>? {\n        return null\n    }\n\n    protected fun back() {\n        back.onNext(true)\n    }\n\n    protected fun application(): MediaPickerInstagramApplication = application as MediaPickerInstagramApplication\n\n    protected fun component(): MediaPickerInstagramApplicationComponent = application().component()\n\n    protected fun environment(): Environment = component().environment()\n\n    private fun goBack() {\n        super.onBackPressed()\n        val exitTransitions = exitTransition()\n        if (exitTransitions != null) {\n            overridePendingTransition(exitTransitions.first, exitTransitions.second)\n        }\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/io/freshdroid/mediapickerinstagram/lib/BaseFragment.kt",
    "content": "package io.freshdroid.mediapickerinstagram.lib\n\nimport android.arch.lifecycle.Lifecycle\nimport android.content.Intent\nimport android.os.Bundle\nimport android.support.annotation.CallSuper\nimport android.support.v4.app.Fragment\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport com.uber.autodispose.android.lifecycle.AndroidLifecycleScopeProvider\nimport io.freshdroid.mediapickerinstagram.lib.utils.BundleUtils\nimport timber.log.Timber\n\ntypealias FragmentViewModelConstructor = (Environment, AndroidLifecycleScopeProvider) -> FragmentViewModel\n\nprivate const val VIEW_MODEL_KEY = \"viewModel\"\n\nopen class BaseFragment<ViewModelType : FragmentViewModel> : Fragment() {\n\n    protected val scopeProvider: AndroidLifecycleScopeProvider by lazy { AndroidLifecycleScopeProvider.from(this, Lifecycle.Event.ON_DESTROY) }\n\n    protected lateinit var viewModel: ViewModelType\n\n    protected fun attachViewModel(viewModelSupplier: FragmentViewModelConstructor, savedInstanceState: Bundle?) {\n        viewModel = FragmentViewModelManager.fetch(context, scopeProvider, viewModelSupplier, BundleUtils.maybeGetBundle(savedInstanceState, VIEW_MODEL_KEY))\n    }\n\n    @CallSuper\n    override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) {\n        super.onActivityResult(requestCode, resultCode, intent)\n        Timber.v(\"onActivityResult %s\", this.toString())\n        viewModel.activityResult(ActivityResult.create(requestCode, resultCode, intent))\n    }\n\n    @CallSuper\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {\n        val view = super.onCreateView(inflater, container, savedInstanceState)\n        Timber.v(\"onCreateView %s\", this.toString())\n        viewModel.arguments(arguments)\n        return view\n    }\n\n    @CallSuper\n    override fun onResume() {\n        super.onResume()\n        Timber.v(\"onResume %s\", this.toString())\n        viewModel.onResume(this)\n    }\n\n    @CallSuper\n    override fun onPause() {\n        super.onPause()\n        Timber.v(\"onPause %s\", this.toString())\n        viewModel.onPause()\n    }\n\n    @CallSuper\n    override fun onDestroyView() {\n        super.onDestroyView()\n        Timber.v(\"onDestroyView %s\", this.toString())\n        FragmentViewModelManager.destroy(viewModel)\n    }\n\n    @CallSuper\n    override fun onDestroy() {\n        super.onDestroy()\n        Timber.v(\"onDestroy %s\", this.toString())\n    }\n\n    @CallSuper\n    override fun onDetach() {\n        super.onDetach()\n        Timber.v(\"onDetach %s\", this.toString())\n    }\n\n    @CallSuper\n    override fun onSaveInstanceState(outState: Bundle) {\n        Timber.v(\"onSaveInstanceState %s\", this.toString())\n\n        var viewModelEnvelope = Bundle()\n        viewModelEnvelope = FragmentViewModelManager.save(viewModel, viewModelEnvelope)\n\n        outState.putBundle(VIEW_MODEL_KEY, viewModelEnvelope)\n\n        super.onSaveInstanceState(outState)\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/io/freshdroid/mediapickerinstagram/lib/Build.kt",
    "content": "package io.freshdroid.mediapickerinstagram.lib\n\nimport android.content.pm.PackageInfo\nimport io.freshdroid.mediapickerinstagram.BuildConfig\n\n\nopen class Build(\n        private val packageInfo: PackageInfo\n) {\n\n    fun applicationId(): String {\n        return packageInfo.packageName\n    }\n\n    fun isDebug(): Boolean {\n        return BuildConfig.DEBUG\n    }\n\n    fun isRelease(): Boolean {\n        return !BuildConfig.DEBUG\n    }\n\n    fun versionCode(): Int {\n        return packageInfo.versionCode\n    }\n\n    fun versionName(): String {\n        return packageInfo.versionName\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/io/freshdroid/mediapickerinstagram/lib/Environment.kt",
    "content": "package io.freshdroid.mediapickerinstagram.lib\n\nimport io.reactivex.Scheduler\n\n\nclass Environment(\n        var scheduler: Scheduler\n)"
  },
  {
    "path": "app/src/main/java/io/freshdroid/mediapickerinstagram/lib/FragmentViewModel.kt",
    "content": "package io.freshdroid.mediapickerinstagram.lib\n\nimport android.content.Context\nimport android.os.Bundle\nimport android.support.annotation.CallSuper\nimport io.reactivex.Observable\nimport io.reactivex.subjects.PublishSubject\nimport timber.log.Timber\n\n\nopen class FragmentViewModel {\n\n    private val arguments = PublishSubject.create<Bundle>()\n    private val activityResult = PublishSubject.create<ActivityResult>()\n\n    fun arguments(bundle: Bundle?) {\n        bundle?.let {\n            this.arguments.onNext(bundle)\n        }\n    }\n\n    fun activityResult(activityResult: ActivityResult) {\n        this.activityResult.onNext(activityResult)\n    }\n\n    @CallSuper\n    open fun onCreateView(context: Context, savedInstanceState: Bundle?) {\n        Timber.v(\"onCreateView %s\", this.toString())\n    }\n\n    @CallSuper\n    open fun <ViewType> onResume(view: ViewType) {\n        Timber.v(\"onResume %s\", this.toString())\n    }\n\n    @CallSuper\n    open fun onPause() {\n        Timber.v(\"onPause %s\", this.toString())\n    }\n\n    @CallSuper\n    open fun onDestroy() {\n        Timber.v(\"onDestroy %s\", this.toString())\n    }\n\n    protected fun arguments(): Observable<Bundle> {\n        return arguments\n    }\n\n    protected fun activityResult(): Observable<ActivityResult> {\n        return activityResult\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/io/freshdroid/mediapickerinstagram/lib/FragmentViewModelManager.kt",
    "content": "package io.freshdroid.mediapickerinstagram.lib\n\nimport android.content.Context\nimport android.os.Bundle\nimport com.uber.autodispose.android.lifecycle.AndroidLifecycleScopeProvider\nimport io.freshdroid.mediapickerinstagram.MediaPickerInstagramApplication\nimport io.freshdroid.mediapickerinstagram.lib.utils.BundleUtils\nimport timber.log.Timber\nimport java.util.*\n\nprivate const val VIEW_MODEL_ID_KEY = \"fragment_view_model_id\"\nprivate const val VIEW_MODEL_STATE_KEY = \"fragment_view_model_state\"\n\nobject FragmentViewModelManager {\n\n    private val viewModels = HashMap<String, FragmentViewModel>()\n\n    fun <ViewModelType : FragmentViewModel> fetch(context: Context?,\n                                                  scopeProvider: AndroidLifecycleScopeProvider,\n                                                  fragmentViewModelConstructor: FragmentViewModelConstructor,\n                                                  savedInstanceState: Bundle?): ViewModelType {\n\n        val viewModelId = fetchId(savedInstanceState)\n        var fragmentViewModel: FragmentViewModel? = viewModels[viewModelId]\n\n        if (fragmentViewModel == null) {\n            fragmentViewModel = create(context, scopeProvider, fragmentViewModelConstructor, savedInstanceState, viewModelId)\n        }\n\n        return fragmentViewModel as ViewModelType\n    }\n\n    fun save(fragmentViewModel: FragmentViewModel, envelope: Bundle): Bundle {\n        try {\n            envelope.putString(VIEW_MODEL_ID_KEY, findIdForViewModel(fragmentViewModel))\n        } catch (exception: RuntimeException) {\n            Timber.w(\"save %s: %s\", this.toString(), exception.message)\n        }\n\n        val state = Bundle()\n        envelope.putBundle(VIEW_MODEL_STATE_KEY, state)\n\n        return envelope\n    }\n\n    fun destroy(fragmentViewModel: FragmentViewModel) {\n        fragmentViewModel.onDestroy()\n\n        val iterator = viewModels.entries.iterator()\n        while (iterator.hasNext()) {\n            val entry = iterator.next()\n            if (fragmentViewModel == entry.value) {\n                iterator.remove()\n            }\n        }\n    }\n\n    private fun <ViewModelType : FragmentViewModel> create(context: Context?,\n                                                           scopeProvider: AndroidLifecycleScopeProvider,\n                                                           fragmentViewModelConstructor: FragmentViewModelConstructor,\n                                                           savedInstanceState: Bundle?,\n                                                           viewModelId: String): ViewModelType {\n\n        val application = context?.applicationContext as MediaPickerInstagramApplication\n        val environment = application.component().environment()\n\n        val viewModel = fragmentViewModelConstructor(environment, scopeProvider)\n\n        viewModels[viewModelId] = viewModel\n\n        viewModel.onCreateView(context, BundleUtils.maybeGetBundle(savedInstanceState, VIEW_MODEL_STATE_KEY))\n\n        return viewModel as ViewModelType\n    }\n\n    private fun fetchId(savedInstanceState: Bundle?): String {\n        return if (savedInstanceState != null && savedInstanceState.containsKey(VIEW_MODEL_ID_KEY))\n            savedInstanceState.getString(VIEW_MODEL_ID_KEY)\n        else\n            UUID.randomUUID().toString()\n    }\n\n    private fun findIdForViewModel(fragmentViewModel: FragmentViewModel): String {\n        for ((key, value) in viewModels) {\n            if (fragmentViewModel == value) {\n                return key\n            }\n        }\n        throw RuntimeException(\"Cannot find view model in map!\")\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/io/freshdroid/mediapickerinstagram/lib/qualifiers/ApplicationContext.kt",
    "content": "package io.freshdroid.mediapickerinstagram.lib.qualifiers\n\nimport javax.inject.Qualifier\n\n@Qualifier\n@Retention(AnnotationRetention.RUNTIME)\nannotation class ApplicationContext"
  },
  {
    "path": "app/src/main/java/io/freshdroid/mediapickerinstagram/lib/utils/BundleUtils.kt",
    "content": "package io.freshdroid.mediapickerinstagram.lib.utils\n\nimport android.os.Bundle\n\n\nobject BundleUtils {\n\n    fun maybeGetBundle(state: Bundle?, key: String): Bundle? {\n        return state?.getBundle(key)\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/io/freshdroid/mediapickerinstagram/lib/utils/ThreadPredicate.kt",
    "content": "package io.freshdroid.mediapickerinstagram.lib.utils\n\nimport android.os.Looper\n\n\nobject ThreadPredicate {\n\n    fun isMainThread(): Boolean {\n        return Looper.getMainLooper().thread == Thread.currentThread()\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/io/freshdroid/mediapickerinstagram/lib/utils/TransitionUtils.kt",
    "content": "package io.freshdroid.mediapickerinstagram.lib.utils\n\nimport android.app.Activity\nimport android.content.Context\nimport io.freshdroid.mediapickerinstagram.R\n\n\nobject TransitionUtils {\n\n    /**\n     * Explicitly set a transition after starting an activity.\n     *\n     * @param context The activity that started the new intent.\n     * @param transition A pair of animation ids, first is the enter animation, second is the exit animation.\n     */\n    @JvmStatic\n    fun transition(context: Context, transition: Pair<Int, Int>) {\n        if (context !is Activity) {\n            return\n        }\n        context.overridePendingTransition(transition.first, transition.second)\n    }\n\n    @JvmStatic\n    fun enter(): Pair<Int, Int> {\n        return Pair(R.anim.slide_in_right, R.anim.zoom_out)\n    }\n\n    @JvmStatic\n    fun exit(): Pair<Int, Int> {\n        return Pair(R.anim.zoom_in, R.anim.slide_out_right)\n    }\n\n    @JvmStatic\n    fun slideInUp(): Pair<Int, Int> {\n        return Pair(R.anim.slide_in_up, R.anim.stay)\n    }\n\n    @JvmStatic\n    fun slideOutDown(): Pair<Int, Int> {\n        return Pair(R.anim.stay, R.anim.slide_out_down)\n    }\n\n    @JvmStatic\n    fun fadeIn(): Pair<Int, Int> {\n        return Pair(R.anim.fade_in_full, R.anim.stay)\n    }\n\n    @JvmStatic\n    fun fadeOut(): Pair<Int, Int> {\n        return Pair(R.anim.stay, R.anim.fade_out_full)\n    }\n\n}"
  },
  {
    "path": "app/src/main/res/anim/fade_in_full.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<alpha xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:duration=\"400\"\n    android:fillAfter=\"true\"\n    android:fillEnabled=\"true\"\n    android:fromAlpha=\"0.0\"\n    android:interpolator=\"@android:anim/accelerate_interpolator\"\n    android:toAlpha=\"1.0\" />\n"
  },
  {
    "path": "app/src/main/res/anim/fade_out_full.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<alpha xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:duration=\"300\"\n    android:fillAfter=\"true\"\n    android:fillEnabled=\"true\"\n    android:fromAlpha=\"1.0\"\n    android:interpolator=\"@android:anim/accelerate_interpolator\"\n    android:toAlpha=\"0.0\" />\n"
  },
  {
    "path": "app/src/main/res/anim/slide_in_right.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:interpolator=\"@android:anim/decelerate_interpolator\"\n    android:shareInterpolator=\"false\">\n    <translate\n        android:duration=\"200\"\n        android:fromXDelta=\"100%\"\n        android:toXDelta=\"0%\" />\n</set>"
  },
  {
    "path": "app/src/main/res/anim/slide_in_up.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n     android:interpolator=\"@android:anim/accelerate_decelerate_interpolator\">\n\n    <translate\n        android:duration=\"200\"\n        android:fromYDelta=\"100%p\"\n        android:toYDelta=\"0\" />\n\n</set>"
  },
  {
    "path": "app/src/main/res/anim/slide_out_down.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n     android:interpolator=\"@android:anim/accelerate_decelerate_interpolator\">\n\n    <translate\n        android:duration=\"200\"\n        android:fromYDelta=\"0\"\n        android:toYDelta=\"100%p\" />\n\n</set>"
  },
  {
    "path": "app/src/main/res/anim/slide_out_right.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:interpolator=\"@android:anim/decelerate_interpolator\"\n    android:shareInterpolator=\"false\">\n    <translate\n        android:duration=\"200\"\n        android:fromXDelta=\"0%\"\n        android:toXDelta=\"100%\" />\n</set>"
  },
  {
    "path": "app/src/main/res/anim/stay.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<translate xmlns:android=\"http://schemas.android.com/apk/res/android\"\n           android:duration=\"@android:integer/config_longAnimTime\"\n           android:fromYDelta=\"0%p\"\n           android:toYDelta=\"0%p\" />"
  },
  {
    "path": "app/src/main/res/anim/zoom_in.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:fillAfter=\"true\" >\n\n    <scale\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:duration=\"200\"\n        android:fromXScale=\"0.8\"\n        android:fromYScale=\"0.8\"\n        android:pivotX=\"50%\"\n        android:pivotY=\"50%\"\n        android:toXScale=\"1.0\"\n        android:toYScale=\"1.0\" >\n    </scale>\n\n</set>"
  },
  {
    "path": "app/src/main/res/anim/zoom_out.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:fillAfter=\"true\" >\n\n    <scale\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:duration=\"200\"\n        android:fromXScale=\"1.0\"\n        android:fromYScale=\"1.0\"\n        android:pivotX=\"50%\"\n        android:pivotY=\"50%\"\n        android:toXScale=\"0.8\"\n        android:toYScale=\"0.8\" >\n    </scale>\n\n</set>"
  },
  {
    "path": "app/src/main/res/drawable/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n    android:viewportHeight=\"108\"\n    android:viewportWidth=\"108\">\n    <path\n        android:fillColor=\"#26A69A\"\n        android:pathData=\"M0,0h108v108h-108z\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M9,0L9,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,0L19,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,0L29,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,0L39,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,0L49,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,0L59,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,0L69,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,0L79,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M89,0L89,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M99,0L99,108\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,9L108,9\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,19L108,19\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,29L108,29\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,39L108,39\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,49L108,49\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,59L108,59\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,69L108,69\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,79L108,79\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,89L108,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M0,99L108,99\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,29L89,29\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,39L89,39\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,49L89,49\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,59L89,59\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,69L89,69\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M19,79L89,79\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M29,19L29,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M39,19L39,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M49,19L49,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M59,19L59,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M69,19L69,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:pathData=\"M79,19L79,89\"\n        android:strokeColor=\"#33FFFFFF\"\n        android:strokeWidth=\"0.8\" />\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/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/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"colorPrimaryDark\">#303F9F</color>\n    <color name=\"colorAccent\">#FF4081</color>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">MediaPickerInstagram</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.AppCompat.Light.DarkActionBar\">\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/io/freshdroid/mediapickerinstagram/ExampleUnitTest.kt",
    "content": "package io.freshdroid.mediapickerinstagram\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.2.30'\n    repositories {\n        google()\n        jcenter()\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:3.0.1'\n        classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\"\n\n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n    }\n}\n\nallprojects {\n    repositories {\n        google()\n        jcenter()\n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Fri Mar 23 18:50:19 GMT 2018\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-4.1-all.zip\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\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\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"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\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\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\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\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\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\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\" ] ; 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# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:init\r\n@rem Get command-line arguments, handling Windowz variants\r\n\r\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\r\nif \"%@eval[2+2]\" == \"4\" goto 4NT_args\r\n\r\n:win9xME_args\r\n@rem Slurp the command line arguments.\r\nset CMD_LINE_ARGS=\r\nset _SKIP=2\r\n\r\n:win9xME_args_slurp\r\nif \"x%~1\" == \"x\" goto execute\r\n\r\nset CMD_LINE_ARGS=%*\r\ngoto execute\r\n\r\n:4NT_args\r\n@rem Get arguments from the 4NT Shell from JP Software\r\nset CMD_LINE_ARGS=%$\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n@rem Execute Gradle\r\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%\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "settings.gradle",
    "content": "include ':app'\n"
  }
]