Skip to content

Commit

Permalink
Adds an Application-wide ViewModelStoreOwner and methods to access it…
Browse files Browse the repository at this point in the history
… as well as making all ViewModel access lazy
  • Loading branch information
Sub6Resources committed Jun 22, 2018
1 parent 073f0ef commit 91201d1
Show file tree
Hide file tree
Showing 6 changed files with 31 additions and 10 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ Add **Utilities** to your Android project using Jitpack and Gradle:
}
...
dependencies {
implementation 'com.github.Sub6Resources:Utilities:1.4.3'
implementation 'com.github.Sub6Resources:Utilities:1.5.0'
}

## `BaseActivity`
Expand Down
6 changes: 6 additions & 0 deletions app/src/main/java/com/sub6resources/utilities/BaseActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.sub6resources.utilities

import android.Manifest
import android.arch.lifecycle.ViewModel
import android.arch.lifecycle.ViewModelProvider
import android.arch.lifecycle.ViewModelProviders
import android.content.Intent
import android.content.pm.PackageManager
Expand All @@ -18,6 +19,7 @@ import android.support.v7.app.AppCompatActivity
import android.view.Menu
import android.view.MenuItem
import android.view.View
import org.koin.android.architecture.ext.KoinFactory


abstract class BaseActivity(private val activityLayout: Int): AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {
Expand Down Expand Up @@ -290,5 +292,9 @@ abstract class BaseActivity(private val activityLayout: Int): AppCompatActivity(
app.savedCallbacks[requestCode](resultCode, data)
}

@Deprecated("Deprecated in favor of getViewModel<ViewModel>()")
fun <T: ViewModel> getViewModel(javaClass: Class<T>): Lazy<T> = lazy { ViewModelProviders.of(this).get(javaClass) }

inline fun <reified T: ViewModel> getViewModel(): Lazy<T> = lazy { ViewModelProvider(this, KoinFactory).get(T::class.java) }
inline fun <reified T: ViewModel> getGlobalViewModel(): Lazy<T> = lazy { ViewModelProvider(app, KoinFactory).get(T::class.java) }
}
12 changes: 11 additions & 1 deletion app/src/main/java/com/sub6resources/utilities/BaseApplication.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package com.sub6resources.utilities

import android.app.Application
import android.arch.lifecycle.ViewModelStore
import android.arch.lifecycle.ViewModelStoreOwner
import android.content.Intent
import org.koin.android.ext.android.startKoin
import org.koin.dsl.module.Module

open class BaseApplication(vararg val modules: Module): Application() {
open class BaseApplication(vararg val modules: Module): Application(), ViewModelStoreOwner {

var savedCallbacks = ArrayList<(resultCode: Int, data: Intent?) -> Unit>()

Expand All @@ -14,4 +16,12 @@ open class BaseApplication(vararg val modules: Module): Application() {
SharedPrefs.sharedPreferences = sharedPreferences
startKoin(this, modules.toList())
}

private val appViewModelStore: ViewModelStore by lazy {
ViewModelStore()
}

override fun getViewModelStore(): ViewModelStore {
return appViewModelStore
}
}
6 changes: 3 additions & 3 deletions app/src/main/java/com/sub6resources/utilities/BaseFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ import android.arch.lifecycle.ViewModelProviders
import android.arch.lifecycle.ViewModelStores
import android.os.Bundle
import android.support.v4.app.Fragment
import android.support.v4.app.FragmentActivity
import android.support.v7.widget.Toolbar
import android.view.*
import org.koin.android.architecture.ext.KoinFactory
import org.koin.android.architecture.ext.getViewModel
Expand Down Expand Up @@ -87,5 +85,7 @@ abstract class BaseFragment: Fragment() {
@Deprecated("getSharedViewModel(T::class.java) is deprecated in favor of getSharedViewModel<T>()")
fun <T: ViewModel> getSharedViewModel(javaClass: Class<T>): Lazy<T> = lazy { ViewModelProviders.of(activity!!).get(javaClass) }

inline fun <reified T : ViewModel> Fragment.getSharedViewModel(): T = ViewModelProvider(ViewModelStores.of(this.activity!!), KoinFactory).get(T::class.java)
inline fun <reified T : ViewModel> Fragment.getSharedViewModel(): Lazy<T> = lazy { ViewModelProvider(ViewModelStores.of(baseActivity), KoinFactory).get(T::class.java) }

inline fun <reified T : ViewModel> getGlobalViewModel(): Lazy<T> = lazy { ViewModelProvider(baseActivity.app, KoinFactory).get(T::class.java) }
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,13 @@ package com.sub6resources.utilities.sample

import com.sub6resources.utilities.BaseActivity
import com.sub6resources.utilities.sample.fragments.LoginFragment
import com.sub6resources.utilities.sample.viewmodels.LoginViewModel

class MainActivity : BaseActivity(R.layout.activity_fragment_container) {

//Has no purpose, just a test.
val viewModel by getGlobalViewModel<LoginViewModel>()

override val fragmentTargets = R.id.fragmentTarget
override val landingFragment = LoginFragment()
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,12 @@ import kotlinx.android.synthetic.main.fragment_login.*

class LoginFragment: BaseFragment() {
override val fragLayout = R.layout.fragment_login
val loginViewModel by getViewModel<LoginViewModel>()
val loginViewModel by getGlobalViewModel<LoginViewModel>()

override fun setUp() {

btn_submit.onClick {
// loginViewModel.login(Login(et_username.getString(), et_password.getString()))
loginViewModel.login(Login(et_username.getString(), et_password.getString()))
baseActivity.startActivity<PreferencesActivity>()
}

Expand All @@ -34,10 +34,10 @@ class LoginFragment: BaseFragment() {
loginViewModel.token.observe(this, Observer { token ->
Log.d("TOKEN", "Token!!! ${token?.token}")
// baseActivity.startActivity<PreferencesActivity>()
val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE);
baseActivity.startActivityForResult(takePictureIntent) { resultCode, data ->
// val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// baseActivity.startActivityForResult(takePictureIntent) { resultCode, data ->
//Perform operations on the result code and the data here
}
// }
})
}
}

0 comments on commit 91201d1

Please sign in to comment.