From fa2aa32e81606b0c97bb16dc304198a3c6c6c014 Mon Sep 17 00:00:00 2001 From: Nishant Mahajan Date: Tue, 12 Feb 2019 09:49:09 +0530 Subject: [PATCH 1/4] Refactor WelcomeFragment into a new welcome package Since the welcome screen will be having at least a Fragment and a ViewModel, it makes sense to place them in their own package. --- .../openevent/general/{ => welcome}/WelcomeFragment.kt | 3 ++- app/src/main/res/layout-land/fragment_welcome.xml | 2 +- app/src/main/res/layout/fragment_welcome.xml | 2 +- app/src/main/res/navigation/navigation_graph.xml | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) rename app/src/main/java/org/fossasia/openevent/general/{ => welcome}/WelcomeFragment.kt (97%) diff --git a/app/src/main/java/org/fossasia/openevent/general/WelcomeFragment.kt b/app/src/main/java/org/fossasia/openevent/general/welcome/WelcomeFragment.kt similarity index 97% rename from app/src/main/java/org/fossasia/openevent/general/WelcomeFragment.kt rename to app/src/main/java/org/fossasia/openevent/general/welcome/WelcomeFragment.kt index 9a668964dc..c04815a641 100644 --- a/app/src/main/java/org/fossasia/openevent/general/WelcomeFragment.kt +++ b/app/src/main/java/org/fossasia/openevent/general/welcome/WelcomeFragment.kt @@ -1,4 +1,4 @@ -package org.fossasia.openevent.general +package org.fossasia.openevent.general.welcome import android.Manifest import android.content.Intent @@ -17,6 +17,7 @@ import com.google.android.material.snackbar.Snackbar import kotlinx.android.synthetic.main.fragment_welcome.view.pickCityButton import kotlinx.android.synthetic.main.fragment_welcome.view.currentLocation import kotlinx.android.synthetic.main.fragment_welcome.view.locationProgressBar +import org.fossasia.openevent.general.R import org.fossasia.openevent.general.search.GeoLocationViewModel import org.fossasia.openevent.general.search.SearchLocationViewModel import org.fossasia.openevent.general.utils.Utils diff --git a/app/src/main/res/layout-land/fragment_welcome.xml b/app/src/main/res/layout-land/fragment_welcome.xml index 8e0261174c..73864db3ec 100644 --- a/app/src/main/res/layout-land/fragment_welcome.xml +++ b/app/src/main/res/layout-land/fragment_welcome.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context="org.fossasia.openevent.general.WelcomeFragment"> + tools:context="org.fossasia.openevent.general.welcome.WelcomeFragment"> + tools:context="org.fossasia.openevent.general.welcome.WelcomeFragment"> Date: Tue, 12 Feb 2019 10:15:50 +0530 Subject: [PATCH 2/4] Make welcome screen's ViewModels for playstore and fdroid The fdroid version just hides the "Use my current location" widget. --- .../general/welcome/WelcomeViewModel.kt | 28 +++++++++ .../general/welcome/WelcomeViewModel.kt | 57 +++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 app/src/fdroid/java/org/fossasia/openevent/general/welcome/WelcomeViewModel.kt create mode 100644 app/src/playStore/java/org/fossasia/openevent/general/welcome/WelcomeViewModel.kt diff --git a/app/src/fdroid/java/org/fossasia/openevent/general/welcome/WelcomeViewModel.kt b/app/src/fdroid/java/org/fossasia/openevent/general/welcome/WelcomeViewModel.kt new file mode 100644 index 0000000000..b50f18603f --- /dev/null +++ b/app/src/fdroid/java/org/fossasia/openevent/general/welcome/WelcomeViewModel.kt @@ -0,0 +1,28 @@ +package org.fossasia.openevent.general.welcome + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import org.fossasia.openevent.general.common.SingleLiveEvent +import org.fossasia.openevent.general.data.Preference +import org.fossasia.openevent.general.search.LocationService + +class WelcomeViewModel(locationService: LocationService, preference: Preference) : ViewModel() { + + private val mutableRedirectToMain = MutableLiveData() + val redirectToMain: LiveData = mutableRedirectToMain + private val mutableVisibility = MutableLiveData() + val currentLocationVisibility: LiveData = mutableVisibility + private val mutableOpenLocationSettings = MutableLiveData() + val openLocationSettings: LiveData = mutableOpenLocationSettings + private val mutableErrorMessage = SingleLiveEvent() + val errorMessage: LiveData = mutableErrorMessage + + init { + mutableVisibility.value = false + } + + fun configure() { + // Since there are no location services for f-droid, this doesn't do anything. + } +} diff --git a/app/src/playStore/java/org/fossasia/openevent/general/welcome/WelcomeViewModel.kt b/app/src/playStore/java/org/fossasia/openevent/general/welcome/WelcomeViewModel.kt new file mode 100644 index 0000000000..8d65d0ac6a --- /dev/null +++ b/app/src/playStore/java/org/fossasia/openevent/general/welcome/WelcomeViewModel.kt @@ -0,0 +1,57 @@ +package org.fossasia.openevent.general.welcome + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import io.reactivex.disposables.CompositeDisposable +import org.fossasia.openevent.general.common.SingleLiveEvent +import org.fossasia.openevent.general.data.Preference +import org.fossasia.openevent.general.location.LocationPermissionException +import org.fossasia.openevent.general.location.NoLocationSourceException +import org.fossasia.openevent.general.search.LocationService + +const val SAVED_LOCATION = "LOCATION" + +class WelcomeViewModel(private val locationService: LocationService, private val preference: Preference) : ViewModel() { + + private val mutableRedirectToMain = MutableLiveData() + val redirectToMain: LiveData = mutableRedirectToMain + private val mutableVisibility = MutableLiveData() + val currentLocationVisibility: LiveData = mutableVisibility + private val mutableOpenLocationSettings = MutableLiveData() + val openLocationSettings: LiveData = mutableOpenLocationSettings + private val mutableErrorMessage = SingleLiveEvent() + val errorMessage: LiveData = mutableErrorMessage + + private val compositeDisposable = CompositeDisposable() + + fun configure() { + compositeDisposable.add(locationService.getAdministrativeArea() + .subscribe( + { adminArea -> + preference.putString(SAVED_LOCATION, adminArea) + mutableRedirectToMain.value = true + }, + { error -> + when (error) { + is NoLocationSourceException -> { + mutableErrorMessage.value = "No location sources are enabled" + mutableOpenLocationSettings.value = true + } + is LocationPermissionException -> { + mutableErrorMessage.value = "Please give the location permission" + } + else -> { + mutableErrorMessage.value = "Something went wrong" + mutableVisibility.value = false + } + } + } + )) + } + + override fun onCleared() { + super.onCleared() + compositeDisposable.clear() + } +} From 1fe914672a4c099d399cf4c9cf232da28090442c Mon Sep 17 00:00:00 2001 From: Nishant Mahajan Date: Tue, 12 Feb 2019 10:18:33 +0530 Subject: [PATCH 3/4] Make WelcomeViewModel providable by Koin --- app/src/main/java/org/fossasia/openevent/general/di/Modules.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/org/fossasia/openevent/general/di/Modules.kt b/app/src/main/java/org/fossasia/openevent/general/di/Modules.kt index fb1994f2fb..992ccac30c 100644 --- a/app/src/main/java/org/fossasia/openevent/general/di/Modules.kt +++ b/app/src/main/java/org/fossasia/openevent/general/di/Modules.kt @@ -66,6 +66,7 @@ import org.fossasia.openevent.general.ticket.TicketApi import org.fossasia.openevent.general.ticket.TicketId import org.fossasia.openevent.general.ticket.TicketService import org.fossasia.openevent.general.ticket.TicketsViewModel +import org.fossasia.openevent.general.welcome.WelcomeViewModel import org.koin.android.ext.koin.androidApplication import org.koin.android.ext.koin.androidContext import org.koin.androidx.viewmodel.ext.koin.viewModel @@ -147,6 +148,7 @@ val viewModelModule = module { viewModel { EditProfileViewModel(get(), get()) } viewModel { GeoLocationViewModel(get()) } viewModel { SmartAuthViewModel() } + viewModel { WelcomeViewModel(get(), get()) } } val networkModule = module { From 850877024b03d78b0a9de7cc6686cc5200677fb4 Mon Sep 17 00:00:00 2001 From: Nishant Mahajan Date: Tue, 12 Feb 2019 10:28:10 +0530 Subject: [PATCH 4/4] Make WelcomeFragment use WelcomeViewModel Fixes: #1073 --- .../general/welcome/WelcomeFragment.kt | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/org/fossasia/openevent/general/welcome/WelcomeFragment.kt b/app/src/main/java/org/fossasia/openevent/general/welcome/WelcomeFragment.kt index c04815a641..6db75ab925 100644 --- a/app/src/main/java/org/fossasia/openevent/general/welcome/WelcomeFragment.kt +++ b/app/src/main/java/org/fossasia/openevent/general/welcome/WelcomeFragment.kt @@ -18,8 +18,6 @@ import kotlinx.android.synthetic.main.fragment_welcome.view.pickCityButton import kotlinx.android.synthetic.main.fragment_welcome.view.currentLocation import kotlinx.android.synthetic.main.fragment_welcome.view.locationProgressBar import org.fossasia.openevent.general.R -import org.fossasia.openevent.general.search.GeoLocationViewModel -import org.fossasia.openevent.general.search.SearchLocationViewModel import org.fossasia.openevent.general.utils.Utils import org.koin.androidx.viewmodel.ext.android.viewModel @@ -28,8 +26,7 @@ const val LOCATION_PERMISSION_REQUEST = 1000 class WelcomeFragment : Fragment() { private lateinit var rootView: View - private val geoLocationViewModel by viewModel() - private val searchLocationViewModel by viewModel() + private val welcomeViewModel by viewModel() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { rootView = inflater.inflate(R.layout.fragment_welcome, container, false) @@ -40,28 +37,30 @@ class WelcomeFragment : Fragment() { Navigation.findNavController(rootView).navigate(R.id.searchLocationFragment, null, Utils.getAnimSlide()) } - geoLocationViewModel.currentLocationVisibility.observe(this, Observer { + welcomeViewModel.currentLocationVisibility.observe(this, Observer { rootView.currentLocation.visibility = View.GONE }) rootView.currentLocation.setOnClickListener { checkLocationPermission() - geoLocationViewModel.configure() + welcomeViewModel.configure() rootView.locationProgressBar.visibility = View.VISIBLE } - geoLocationViewModel.location.observe(this, Observer { location -> - searchLocationViewModel.saveSearch(location) - redirectToMain() + + welcomeViewModel.redirectToMain.observe(this, Observer { redirect -> + if (redirect) { + redirectToMain() + } }) - geoLocationViewModel.openLocationSettings.observe(this, Observer { open -> + welcomeViewModel.openLocationSettings.observe(this, Observer { open -> if (open) { val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS) startActivity(intent) } }) - geoLocationViewModel.errorMessage.observe(this, Observer { message -> + welcomeViewModel.errorMessage.observe(this, Observer { message -> rootView.locationProgressBar.visibility = View.VISIBLE Snackbar.make(rootView, message, Snackbar.LENGTH_SHORT).show() }) @@ -73,7 +72,7 @@ class WelcomeFragment : Fragment() { when (requestCode) { LOCATION_PERMISSION_REQUEST -> { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - geoLocationViewModel.configure() + welcomeViewModel.configure() } else { Snackbar.make(rootView, "Cannot fetch location!", Snackbar.LENGTH_SHORT).show() rootView.locationProgressBar.visibility = View.GONE