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 000000000..b50f18603 --- /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/main/java/org/fossasia/openevent/general/di/Modules.kt b/app/src/main/java/org/fossasia/openevent/general/di/Modules.kt index fb1994f2f..992ccac30 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 { 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 79% 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 9a668964d..6db75ab92 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,8 +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.search.GeoLocationViewModel -import org.fossasia.openevent.general.search.SearchLocationViewModel +import org.fossasia.openevent.general.R import org.fossasia.openevent.general.utils.Utils import org.koin.androidx.viewmodel.ext.android.viewModel @@ -27,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) @@ -39,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() }) @@ -72,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 diff --git a/app/src/main/res/layout-land/fragment_welcome.xml b/app/src/main/res/layout-land/fragment_welcome.xml index 8e0261174..73864db3e 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"> () + 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() + } +}