From 6b849b06bd8e05749563c17c08391b8fb755db0b Mon Sep 17 00:00:00 2001 From: Gergely Hegedus Date: Mon, 19 Sep 2022 21:52:37 +0300 Subject: [PATCH] Issue#12 Add UserPreferences to always open the app when saving a video --- app/build.gradle | 4 +- .../data/local/UserPreferencesLocalSource.kt | 24 ++++++++++ .../SharedPreferencesManagerImpl.kt | 13 +++++- .../persistent/UserPreferencesStorage.kt | 6 +++ .../data/model/UserPreferences.kt | 3 ++ .../data/usecase/GetUserPreferences.kt | 9 ++++ .../data/usecase/ObserveUserPreferences.kt | 10 ++++ .../data/usecase/SetUserPreferences.kt | 11 +++++ .../tiktokdownloader/di/ServiceLocator.kt | 14 ++++-- .../tiktokdownloader/di/ViewModelFactory.kt | 2 + .../di/module/AndroidFileManagementModule.kt | 8 +++- .../di/module/LocalSourceModule.kt | 3 ++ .../di/module/UseCaseModule.kt | 8 ++++ .../di/module/ViewModelModule.kt | 7 +++ .../tiktokdownloader/ui/main/MainActivity.kt | 2 + .../ui/main/settings/SettingsFragment.kt | 33 +++++++++++++ .../ui/main/settings/SettingsViewModel.kt | 26 +++++++++++ .../service/DownloadIntentReceiverActivity.kt | 22 +++++++-- .../main/res/drawable/ic_twotone_settings.xml | 8 ++++ app/src/main/res/layout/fragment_settings.xml | 46 +++++++++++++++++++ app/src/main/res/menu/main_navigation.xml | 5 ++ app/src/main/res/values/strings.xml | 2 + 22 files changed, 255 insertions(+), 11 deletions(-) create mode 100644 app/src/main/java/org/fnives/tiktokdownloader/data/local/UserPreferencesLocalSource.kt create mode 100644 app/src/main/java/org/fnives/tiktokdownloader/data/local/persistent/UserPreferencesStorage.kt create mode 100644 app/src/main/java/org/fnives/tiktokdownloader/data/model/UserPreferences.kt create mode 100644 app/src/main/java/org/fnives/tiktokdownloader/data/usecase/GetUserPreferences.kt create mode 100644 app/src/main/java/org/fnives/tiktokdownloader/data/usecase/ObserveUserPreferences.kt create mode 100644 app/src/main/java/org/fnives/tiktokdownloader/data/usecase/SetUserPreferences.kt create mode 100644 app/src/main/java/org/fnives/tiktokdownloader/ui/main/settings/SettingsFragment.kt create mode 100644 app/src/main/java/org/fnives/tiktokdownloader/ui/main/settings/SettingsViewModel.kt create mode 100644 app/src/main/res/drawable/ic_twotone_settings.xml create mode 100644 app/src/main/res/layout/fragment_settings.xml diff --git a/app/build.gradle b/app/build.gradle index 6ce5d91..0da4e94 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,7 +21,7 @@ android { minSdkVersion 23 targetSdkVersion 31 versionCode 1 - versionName "1.0.0" + versionName "1.3.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -43,7 +43,7 @@ android { } release { signingConfig signingConfigs.release - debuggable false + debuggable true shrinkResources true minifyEnabled true proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/app/src/main/java/org/fnives/tiktokdownloader/data/local/UserPreferencesLocalSource.kt b/app/src/main/java/org/fnives/tiktokdownloader/data/local/UserPreferencesLocalSource.kt new file mode 100644 index 0000000..4f8f386 --- /dev/null +++ b/app/src/main/java/org/fnives/tiktokdownloader/data/local/UserPreferencesLocalSource.kt @@ -0,0 +1,24 @@ +package org.fnives.tiktokdownloader.data.local + +import kotlinx.coroutines.channels.BufferOverflow +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.map +import org.fnives.tiktokdownloader.data.local.persistent.UserPreferencesStorage +import org.fnives.tiktokdownloader.data.model.UserPreferences + +class UserPreferencesLocalSource(private val userPreferencesStorage: UserPreferencesStorage) { + + private val signal = MutableSharedFlow(replay = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST).apply { tryEmit(Unit) } + + fun get(): Flow = signal + .map { getSync() } + + fun getSync() = UserPreferences(alwaysOpenApp = userPreferencesStorage.openAppToIntent) + + suspend fun set(userPreferences: UserPreferences) { + if (userPreferences.alwaysOpenApp == userPreferencesStorage.openAppToIntent) return + userPreferencesStorage.openAppToIntent = userPreferences.alwaysOpenApp + signal.emit(Unit) + } +} \ No newline at end of file diff --git a/app/src/main/java/org/fnives/tiktokdownloader/data/local/persistent/SharedPreferencesManagerImpl.kt b/app/src/main/java/org/fnives/tiktokdownloader/data/local/persistent/SharedPreferencesManagerImpl.kt index b5d3452..08ea8e8 100644 --- a/app/src/main/java/org/fnives/tiktokdownloader/data/local/persistent/SharedPreferencesManagerImpl.kt +++ b/app/src/main/java/org/fnives/tiktokdownloader/data/local/persistent/SharedPreferencesManagerImpl.kt @@ -9,13 +9,14 @@ import kotlin.properties.ReadOnlyProperty import kotlin.properties.ReadWriteProperty import kotlin.reflect.KProperty -class SharedPreferencesManagerImpl private constructor(private val sharedPreferences: SharedPreferences) : SharedPreferencesManager { +class SharedPreferencesManagerImpl private constructor(private val sharedPreferences: SharedPreferences) : SharedPreferencesManager, UserPreferencesStorage { override var captchaTimeoutUntil: Long by LongDelegate(CAPTCHA_TIMEOUT_KEY) override var pendingVideos: Set by StringSetDelegate(PENDING_VIDEO_KEY) override val pendingVideosFlow by StringSetFlowDelegate(PENDING_VIDEO_KEY) override var downloadedVideos: Set by StringSetDelegate(DOWNLOADED_VIDEO_KEY) override val downloadedVideosFlow by StringSetFlowDelegate(DOWNLOADED_VIDEO_KEY) + override var openAppToIntent: Boolean by BooleanDelegate(USER_PREFERENCE_ALWAYS_OPEN_APP) class LongDelegate(private val key: String) : ReadWriteProperty { override fun setValue(thisRef: SharedPreferencesManagerImpl, property: KProperty<*>, value: Long) { @@ -26,6 +27,15 @@ class SharedPreferencesManagerImpl private constructor(private val sharedPrefere thisRef.sharedPreferences.getLong(key, 0) } + class BooleanDelegate(private val key: String) : ReadWriteProperty { + override fun setValue(thisRef: SharedPreferencesManagerImpl, property: KProperty<*>, value: Boolean) { + thisRef.sharedPreferences.edit().putBoolean(key, value).apply() + } + + override fun getValue(thisRef: SharedPreferencesManagerImpl, property: KProperty<*>): Boolean = + thisRef.sharedPreferences.getBoolean(key, false) + } + class StringSetDelegate(private val key: String) : ReadWriteProperty> { override fun setValue(thisRef: SharedPreferencesManagerImpl, property: KProperty<*>, value: Set) { thisRef.sharedPreferences.edit().putStringSet(key, value).apply() @@ -60,6 +70,7 @@ class SharedPreferencesManagerImpl private constructor(private val sharedPrefere private const val CAPTCHA_TIMEOUT_KEY = "CAPTCHA_TIMEOUT_KEY" private const val PENDING_VIDEO_KEY = "PENDING_VIDEO_KEY" private const val DOWNLOADED_VIDEO_KEY = "DOWNLOADED_VIDEO_KEY" + private const val USER_PREFERENCE_ALWAYS_OPEN_APP = "USER_PREFERENCE_ALWAYS_OPEN_APP" fun create(context: Context): SharedPreferencesManagerImpl = SharedPreferencesManagerImpl( diff --git a/app/src/main/java/org/fnives/tiktokdownloader/data/local/persistent/UserPreferencesStorage.kt b/app/src/main/java/org/fnives/tiktokdownloader/data/local/persistent/UserPreferencesStorage.kt new file mode 100644 index 0000000..0e874ea --- /dev/null +++ b/app/src/main/java/org/fnives/tiktokdownloader/data/local/persistent/UserPreferencesStorage.kt @@ -0,0 +1,6 @@ +package org.fnives.tiktokdownloader.data.local.persistent + +interface UserPreferencesStorage { + + var openAppToIntent: Boolean +} \ No newline at end of file diff --git a/app/src/main/java/org/fnives/tiktokdownloader/data/model/UserPreferences.kt b/app/src/main/java/org/fnives/tiktokdownloader/data/model/UserPreferences.kt new file mode 100644 index 0000000..0fbadca --- /dev/null +++ b/app/src/main/java/org/fnives/tiktokdownloader/data/model/UserPreferences.kt @@ -0,0 +1,3 @@ +package org.fnives.tiktokdownloader.data.model + +data class UserPreferences(val alwaysOpenApp: Boolean) \ No newline at end of file diff --git a/app/src/main/java/org/fnives/tiktokdownloader/data/usecase/GetUserPreferences.kt b/app/src/main/java/org/fnives/tiktokdownloader/data/usecase/GetUserPreferences.kt new file mode 100644 index 0000000..81884b4 --- /dev/null +++ b/app/src/main/java/org/fnives/tiktokdownloader/data/usecase/GetUserPreferences.kt @@ -0,0 +1,9 @@ +package org.fnives.tiktokdownloader.data.usecase + +import org.fnives.tiktokdownloader.data.local.UserPreferencesLocalSource +import org.fnives.tiktokdownloader.data.model.UserPreferences + +class GetUserPreferences(private val userPreferencesLocalSource: UserPreferencesLocalSource) { + + operator fun invoke(): UserPreferences = userPreferencesLocalSource.getSync() +} \ No newline at end of file diff --git a/app/src/main/java/org/fnives/tiktokdownloader/data/usecase/ObserveUserPreferences.kt b/app/src/main/java/org/fnives/tiktokdownloader/data/usecase/ObserveUserPreferences.kt new file mode 100644 index 0000000..980df58 --- /dev/null +++ b/app/src/main/java/org/fnives/tiktokdownloader/data/usecase/ObserveUserPreferences.kt @@ -0,0 +1,10 @@ +package org.fnives.tiktokdownloader.data.usecase + +import kotlinx.coroutines.flow.Flow +import org.fnives.tiktokdownloader.data.local.UserPreferencesLocalSource +import org.fnives.tiktokdownloader.data.model.UserPreferences + +class ObserveUserPreferences(private val userPreferencesLocalSource: UserPreferencesLocalSource) { + + operator fun invoke(): Flow = userPreferencesLocalSource.get() +} \ No newline at end of file diff --git a/app/src/main/java/org/fnives/tiktokdownloader/data/usecase/SetUserPreferences.kt b/app/src/main/java/org/fnives/tiktokdownloader/data/usecase/SetUserPreferences.kt new file mode 100644 index 0000000..efa4c91 --- /dev/null +++ b/app/src/main/java/org/fnives/tiktokdownloader/data/usecase/SetUserPreferences.kt @@ -0,0 +1,11 @@ +package org.fnives.tiktokdownloader.data.usecase + +import org.fnives.tiktokdownloader.data.local.UserPreferencesLocalSource +import org.fnives.tiktokdownloader.data.model.UserPreferences + +class SetUserPreferences(private val userPreferencesLocalSource: UserPreferencesLocalSource) { + + suspend operator fun invoke(userPreferences: UserPreferences) { + userPreferencesLocalSource.set(userPreferences) + } +} \ No newline at end of file diff --git a/app/src/main/java/org/fnives/tiktokdownloader/di/ServiceLocator.kt b/app/src/main/java/org/fnives/tiktokdownloader/di/ServiceLocator.kt index 0f591ae..c14ead4 100644 --- a/app/src/main/java/org/fnives/tiktokdownloader/di/ServiceLocator.kt +++ b/app/src/main/java/org/fnives/tiktokdownloader/di/ServiceLocator.kt @@ -25,6 +25,10 @@ object ServiceLocator { val permissionModule: PermissionModule get() = _permissionModule ?: throw IllegalStateException("$this.start has not been called!") + private var _useCaseModule: UseCaseModule? = null + val useCaseModule: UseCaseModule + get() = _useCaseModule ?: throw IllegalStateException("$this.start has not been called!") + fun viewModelFactory( savedStateRegistryOwner: SavedStateRegistryOwner, defaultArgs: Bundle @@ -36,9 +40,13 @@ object ServiceLocator { fun start(context: Context) { val androidFileManagementModule = AndroidFileManagementModule(context) - val localSourceModule = LocalSourceModule(androidFileManagementModule) - val networkModule = NetworkModule(DEFAULT_DELAY_BEFORE_REQUEST) - val useCaseModule = UseCaseModule(localSourceModule, networkModule) + val localSourceModule = LocalSourceModule(androidFileManagementModule = androidFileManagementModule) + val networkModule = NetworkModule(delayBeforeRequest = DEFAULT_DELAY_BEFORE_REQUEST) + val useCaseModule = UseCaseModule( + localSourceModule = localSourceModule, + networkModule = networkModule + ) + _useCaseModule = useCaseModule _permissionModule = PermissionModule() _viewModelModule = ViewModelModule(useCaseModule) } diff --git a/app/src/main/java/org/fnives/tiktokdownloader/di/ViewModelFactory.kt b/app/src/main/java/org/fnives/tiktokdownloader/di/ViewModelFactory.kt index 036afd5..7fad4a6 100644 --- a/app/src/main/java/org/fnives/tiktokdownloader/di/ViewModelFactory.kt +++ b/app/src/main/java/org/fnives/tiktokdownloader/di/ViewModelFactory.kt @@ -8,6 +8,7 @@ import androidx.savedstate.SavedStateRegistryOwner import org.fnives.tiktokdownloader.di.module.ViewModelModule import org.fnives.tiktokdownloader.ui.main.MainViewModel import org.fnives.tiktokdownloader.ui.main.queue.QueueViewModel +import org.fnives.tiktokdownloader.ui.main.settings.SettingsViewModel class ViewModelFactory( savedStateRegistryOwner: SavedStateRegistryOwner, @@ -20,6 +21,7 @@ class ViewModelFactory( val viewModel = when (modelClass) { MainViewModel::class.java -> viewModelModule.mainViewModel(handle) QueueViewModel::class.java -> viewModelModule.queueViewModel + SettingsViewModel::class.java -> viewModelModule.settignsViewModel else -> throw IllegalArgumentException("Can't create viewModel for $modelClass ") } return viewModel as T diff --git a/app/src/main/java/org/fnives/tiktokdownloader/di/module/AndroidFileManagementModule.kt b/app/src/main/java/org/fnives/tiktokdownloader/di/module/AndroidFileManagementModule.kt index 8c7a426..f2b7c37 100644 --- a/app/src/main/java/org/fnives/tiktokdownloader/di/module/AndroidFileManagementModule.kt +++ b/app/src/main/java/org/fnives/tiktokdownloader/di/module/AndroidFileManagementModule.kt @@ -4,10 +4,10 @@ import android.content.ContentResolver import android.content.Context import org.fnives.tiktokdownloader.data.local.persistent.SharedPreferencesManager import org.fnives.tiktokdownloader.data.local.persistent.SharedPreferencesManagerImpl +import org.fnives.tiktokdownloader.data.local.persistent.UserPreferencesStorage import org.fnives.tiktokdownloader.data.local.save.video.SaveVideoFile import org.fnives.tiktokdownloader.data.local.verify.exists.VerifyFileForUriExists import org.fnives.tiktokdownloader.data.local.verify.exists.VerifyFileForUriExistsImpl -import org.fnives.tiktokdownloader.di.ServiceLocator class AndroidFileManagementModule(private val context: Context) { private val contentResolver: ContentResolver @@ -16,10 +16,14 @@ class AndroidFileManagementModule(private val context: Context) { val verifyFileForUriExists: VerifyFileForUriExists get() = VerifyFileForUriExistsImpl(contentResolver) - val sharedPreferencesManager: SharedPreferencesManager by lazy { + private val sharedPreferencesManagerImpl by lazy { SharedPreferencesManagerImpl.create(context) } + val sharedPreferencesManager: SharedPreferencesManager get() = sharedPreferencesManagerImpl + + val userPreferencesStorage: UserPreferencesStorage get() = sharedPreferencesManagerImpl + private val saveVideoFileFactory: SaveVideoFile.Factory get() = SaveVideoFile.Factory(contentResolver) diff --git a/app/src/main/java/org/fnives/tiktokdownloader/di/module/LocalSourceModule.kt b/app/src/main/java/org/fnives/tiktokdownloader/di/module/LocalSourceModule.kt index f0ce819..297c893 100644 --- a/app/src/main/java/org/fnives/tiktokdownloader/di/module/LocalSourceModule.kt +++ b/app/src/main/java/org/fnives/tiktokdownloader/di/module/LocalSourceModule.kt @@ -1,6 +1,7 @@ package org.fnives.tiktokdownloader.di.module import org.fnives.tiktokdownloader.data.local.CaptchaTimeoutLocalSource +import org.fnives.tiktokdownloader.data.local.UserPreferencesLocalSource import org.fnives.tiktokdownloader.data.local.VideoDownloadedLocalSource import org.fnives.tiktokdownloader.data.local.VideoInPendingLocalSource import org.fnives.tiktokdownloader.data.local.VideoInProgressLocalSource @@ -22,6 +23,8 @@ class LocalSourceModule(private val androidFileManagementModule: AndroidFileMana val videoInProgressLocalSource: VideoInProgressLocalSource by lazy { VideoInProgressLocalSource() } + val userPreferencesLocalSource: UserPreferencesLocalSource by lazy{ UserPreferencesLocalSource(androidFileManagementModule.userPreferencesStorage)} + val captchaTimeoutLocalSource: CaptchaTimeoutLocalSource get() = CaptchaTimeoutLocalSource( androidFileManagementModule.sharedPreferencesManager, diff --git a/app/src/main/java/org/fnives/tiktokdownloader/di/module/UseCaseModule.kt b/app/src/main/java/org/fnives/tiktokdownloader/di/module/UseCaseModule.kt index 95261f7..45bb683 100644 --- a/app/src/main/java/org/fnives/tiktokdownloader/di/module/UseCaseModule.kt +++ b/app/src/main/java/org/fnives/tiktokdownloader/di/module/UseCaseModule.kt @@ -1,9 +1,13 @@ package org.fnives.tiktokdownloader.di.module import kotlinx.coroutines.Dispatchers +import org.fnives.tiktokdownloader.data.local.persistent.UserPreferencesStorage import org.fnives.tiktokdownloader.data.usecase.AddVideoToQueueUseCase +import org.fnives.tiktokdownloader.data.usecase.GetUserPreferences +import org.fnives.tiktokdownloader.data.usecase.ObserveUserPreferences import org.fnives.tiktokdownloader.data.usecase.MoveVideoInQueueUseCase import org.fnives.tiktokdownloader.data.usecase.RemoveVideoFromQueueUseCase +import org.fnives.tiktokdownloader.data.usecase.SetUserPreferences import org.fnives.tiktokdownloader.data.usecase.StateOfVideosObservableUseCase import org.fnives.tiktokdownloader.data.usecase.UrlVerificationUseCase import org.fnives.tiktokdownloader.data.usecase.VideoDownloadingProcessorUseCase @@ -41,6 +45,10 @@ class UseCaseModule( localSourceModule.videoInPendingLocalSource ) + val getUserPreferences: GetUserPreferences get() = GetUserPreferences(localSourceModule.userPreferencesLocalSource) + val observeUserPreferences: ObserveUserPreferences get() = ObserveUserPreferences(localSourceModule.userPreferencesLocalSource) + val setUserPreferences: SetUserPreferences get() = SetUserPreferences(localSourceModule.userPreferencesLocalSource) + val videoDownloadingProcessorUseCase: VideoDownloadingProcessorUseCase by lazy { VideoDownloadingProcessorUseCase( tikTokDownloadRemoteSource = networkModule.tikTokDownloadRemoteSource, diff --git a/app/src/main/java/org/fnives/tiktokdownloader/di/module/ViewModelModule.kt b/app/src/main/java/org/fnives/tiktokdownloader/di/module/ViewModelModule.kt index 123b183..361bf79 100644 --- a/app/src/main/java/org/fnives/tiktokdownloader/di/module/ViewModelModule.kt +++ b/app/src/main/java/org/fnives/tiktokdownloader/di/module/ViewModelModule.kt @@ -3,6 +3,7 @@ package org.fnives.tiktokdownloader.di.module import androidx.lifecycle.SavedStateHandle import org.fnives.tiktokdownloader.ui.main.MainViewModel import org.fnives.tiktokdownloader.ui.main.queue.QueueViewModel +import org.fnives.tiktokdownloader.ui.main.settings.SettingsViewModel import org.fnives.tiktokdownloader.ui.service.QueueServiceViewModel class ViewModelModule(private val useCaseModule: UseCaseModule) { @@ -28,4 +29,10 @@ class ViewModelModule(private val useCaseModule: UseCaseModule) { useCaseModule.videoDownloadingProcessorUseCase, useCaseModule.moveVideoInQueueUseCase ) + + val settignsViewModel: SettingsViewModel get() = + SettingsViewModel( + useCaseModule.observeUserPreferences, + useCaseModule.setUserPreferences + ) } \ No newline at end of file diff --git a/app/src/main/java/org/fnives/tiktokdownloader/ui/main/MainActivity.kt b/app/src/main/java/org/fnives/tiktokdownloader/ui/main/MainActivity.kt index 5cb7f1d..03dc697 100644 --- a/app/src/main/java/org/fnives/tiktokdownloader/ui/main/MainActivity.kt +++ b/app/src/main/java/org/fnives/tiktokdownloader/ui/main/MainActivity.kt @@ -19,6 +19,7 @@ import org.fnives.tiktokdownloader.di.ServiceLocator import org.fnives.tiktokdownloader.di.provideViewModels import org.fnives.tiktokdownloader.ui.main.help.HelpFragment import org.fnives.tiktokdownloader.ui.main.queue.QueueFragment +import org.fnives.tiktokdownloader.ui.main.settings.SettingsFragment import org.fnives.tiktokdownloader.ui.permission.PermissionRequester import org.fnives.tiktokdownloader.ui.service.QueueService @@ -57,6 +58,7 @@ class MainActivity : AppCompatActivity() { bottomNavigationView.setOnItemSelectedListener { item -> val fragment = when (item.itemId) { R.id.help_menu_item -> HelpFragment.newInstance() + R.id.settings_menu_item -> SettingsFragment.newInstance() R.id.queue_menu_item -> QueueFragment.newInstance() else -> return@setOnItemSelectedListener false } diff --git a/app/src/main/java/org/fnives/tiktokdownloader/ui/main/settings/SettingsFragment.kt b/app/src/main/java/org/fnives/tiktokdownloader/ui/main/settings/SettingsFragment.kt new file mode 100644 index 0000000..e940cd1 --- /dev/null +++ b/app/src/main/java/org/fnives/tiktokdownloader/ui/main/settings/SettingsFragment.kt @@ -0,0 +1,33 @@ +package org.fnives.tiktokdownloader.ui.main.settings + +import android.os.Bundle +import android.view.View +import androidx.appcompat.widget.SwitchCompat +import androidx.fragment.app.Fragment +import org.fnives.tiktokdownloader.R +import org.fnives.tiktokdownloader.di.provideViewModels + +class SettingsFragment : Fragment(R.layout.fragment_settings) { + + private val viewModel by provideViewModels() + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + val alwaysOpenAppHolder = view.findViewById(R.id.always_open_app_holder) + val alwaysOpenAppSwitch = view.findViewById(R.id.always_open_app) + viewModel.userPreferences.observe(viewLifecycleOwner) { + alwaysOpenAppSwitch.isChecked = it.alwaysOpenApp + } + alwaysOpenAppSwitch.setOnCheckedChangeListener { _, isChecked -> + viewModel.setAlwaysOpenApp(isChecked) + } + alwaysOpenAppHolder.setOnClickListener { + viewModel.setAlwaysOpenApp(!alwaysOpenAppSwitch.isChecked) + } + } + + companion object { + + fun newInstance(): SettingsFragment = SettingsFragment() + } +} \ No newline at end of file diff --git a/app/src/main/java/org/fnives/tiktokdownloader/ui/main/settings/SettingsViewModel.kt b/app/src/main/java/org/fnives/tiktokdownloader/ui/main/settings/SettingsViewModel.kt new file mode 100644 index 0000000..92b42a6 --- /dev/null +++ b/app/src/main/java/org/fnives/tiktokdownloader/ui/main/settings/SettingsViewModel.kt @@ -0,0 +1,26 @@ +package org.fnives.tiktokdownloader.ui.main.settings + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.launch +import org.fnives.tiktokdownloader.data.usecase.ObserveUserPreferences +import org.fnives.tiktokdownloader.data.usecase.SetUserPreferences +import org.fnives.tiktokdownloader.ui.shared.asLiveData + +class SettingsViewModel( + private val getUserPreferences: ObserveUserPreferences, + private val setUserPreferences: SetUserPreferences +) : ViewModel() { + + val userPreferences = asLiveData(getUserPreferences.invoke()) + + fun setAlwaysOpenApp(alwaysOpenApp: Boolean) { + val userPreferences = userPreferences.value ?: return + if (userPreferences.alwaysOpenApp == alwaysOpenApp) return + + viewModelScope.launch { + setUserPreferences(userPreferences.copy(alwaysOpenApp = alwaysOpenApp)) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/org/fnives/tiktokdownloader/ui/service/DownloadIntentReceiverActivity.kt b/app/src/main/java/org/fnives/tiktokdownloader/ui/service/DownloadIntentReceiverActivity.kt index 399d0b5..830041d 100644 --- a/app/src/main/java/org/fnives/tiktokdownloader/ui/service/DownloadIntentReceiverActivity.kt +++ b/app/src/main/java/org/fnives/tiktokdownloader/ui/service/DownloadIntentReceiverActivity.kt @@ -3,6 +3,7 @@ package org.fnives.tiktokdownloader.ui.service import android.content.Intent import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import org.fnives.tiktokdownloader.data.usecase.GetUserPreferences import org.fnives.tiktokdownloader.di.ServiceLocator import org.fnives.tiktokdownloader.ui.main.MainActivity import org.fnives.tiktokdownloader.ui.permission.PermissionRequester @@ -12,16 +13,31 @@ class DownloadIntentReceiverActivity : AppCompatActivity() { private val permissionRequester: PermissionRequester by lazy { ServiceLocator.permissionModule.permissionRequester } + private val getUserPreferences: GetUserPreferences by lazy { + ServiceLocator.useCaseModule.getUserPreferences + } override fun onCreate(savedInstanceState: Bundle?) { intent.getStringExtra(Intent.EXTRA_TEXT)?.let { url -> - if (permissionRequester.isGranted(this)) { - startService(QueueService.buildIntent(this, url)) + if (getUserPreferences().alwaysOpenApp) { + alwaysOpen(url) } else { - startActivity(MainActivity.buildIntent(this, url)) + openOnlyIfNeeded(url) } } super.onCreate(savedInstanceState) finish() } + + private fun alwaysOpen(url: String) { + startActivity(MainActivity.buildIntent(this, url)) + } + + private fun openOnlyIfNeeded(url: String) { + if (permissionRequester.isGranted(this)) { + startService(QueueService.buildIntent(this, url)) + } else { + startActivity(MainActivity.buildIntent(this, url)) + } + } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_twotone_settings.xml b/app/src/main/res/drawable/ic_twotone_settings.xml new file mode 100644 index 0000000..4acd032 --- /dev/null +++ b/app/src/main/res/drawable/ic_twotone_settings.xml @@ -0,0 +1,8 @@ + + + + diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml new file mode 100644 index 0000000..e5ca918 --- /dev/null +++ b/app/src/main/res/layout/fragment_settings.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/main_navigation.xml b/app/src/main/res/menu/main_navigation.xml index 28065e6..356b79e 100644 --- a/app/src/main/res/menu/main_navigation.xml +++ b/app/src/main/res/menu/main_navigation.xml @@ -6,6 +6,11 @@ android:icon="@drawable/ic_download" android:title="@string/queue" /> + + It\'s possible if you try to download too many videos at the same time captcha will be triggered. Since we don\'t want to overload the server, in such case you will need to wait a couple hours to properly retry the download. If that still doesn\'t work you may need to verify a captcha on the same network. This is an open source project. You can see the repository clicking here. Couldn\'t open! + Settings + Always open app when sharing video \ No newline at end of file