From abf623629f5afc257042e55b98481aa89b568599 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Fri, 5 Jan 2024 18:47:18 +0100 Subject: [PATCH 001/117] Removed the redundant when condition --- .../appupdater/compose/ui/theme/Theme.kt | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/theme/Theme.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/theme/Theme.kt index 8b9a3f06..d3bbc84d 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/theme/Theme.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/theme/Theme.kt @@ -24,14 +24,6 @@ fun AndroidAppUpdaterTheme( darkTheme: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit, ) { - val colorScheme = when { - darkTheme -> DarkColorScheme - else -> LightColorScheme - } - - MaterialTheme( - colorScheme = colorScheme, - typography = Typography, - content = content, - ) + val colorScheme = if (darkTheme) DarkColorScheme else LightColorScheme + MaterialTheme(colorScheme = colorScheme, typography = Typography, content = content) } From ad7a91c3a163c7992264340ddd7b446ee6db9ce1 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Fri, 5 Jan 2024 19:02:11 +0100 Subject: [PATCH 002/117] Added EMPTY state to the dialog --- .../appupdater/AppUpdaterDialog.kt | 33 +++++---- .../appupdater/compose/AndroidAppUpdater.kt | 67 +++---------------- .../compose/AndroidAppUpdaterViewModel.kt | 32 +++++---- ...ialogContent.kt => UpdaterDialogUIData.kt} | 2 +- .../utils/GetApkIfActivityIsNotNull.kt | 17 +++++ .../core/interactors/GetIsUpdateInProgress.kt | 4 +- .../appupdater/core/pojo/DialogStates.kt | 1 + 7 files changed, 69 insertions(+), 87 deletions(-) rename compose/src/main/java/com/pouyaheydari/appupdater/compose/pojo/{UpdaterDialogContent.kt => UpdaterDialogUIData.kt} (92%) create mode 100644 compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/GetApkIfActivityIsNotNull.kt diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterDialog.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterDialog.kt index 23232423..0526acf6 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterDialog.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterDialog.kt @@ -48,11 +48,10 @@ private const val UPDATE_DIALOG_README_URL = "https://github.com/SirLordPouya/An * Shows ForceUpdate Dialog Fragment */ class AppUpdaterDialog : DialogFragment() { - private val viewModel: AppUpdaterViewModel by viewModels() - private var _binding: FragmentAppUpdaterDialogBinding? = null - private val binding get() = _binding!! + private var appUpdaterDialogBinding: FragmentAppUpdaterDialogBinding? = null + private val binding get() = appUpdaterDialogBinding!! override fun onCreateView( inflater: LayoutInflater, @@ -67,7 +66,7 @@ class AppUpdaterDialog : DialogFragment() { setDialogBackground(mapToSelectedTheme(data.theme, requireContext())) isCancelable = data.isForceUpdate - _binding = FragmentAppUpdaterDialogBinding.inflate(inflater, container, false) + appUpdaterDialogBinding = FragmentAppUpdaterDialogBinding.inflate(inflater, container, false) return binding.root } @@ -98,13 +97,11 @@ class AppUpdaterDialog : DialogFragment() { .distinctUntilChanged() .onEach { when (it) { - is DialogStates.DownloadApk -> { - getApk(it.apkUrl, requireActivity()) - } - - DialogStates.HideUpdateInProgress -> hideUpdateInProgressDialog() + is DialogStates.DownloadApk -> getApk(it.apkUrl, requireActivity()) is DialogStates.OpenStore -> it.store?.showStore(requireContext()) + DialogStates.HideUpdateInProgress -> hideUpdateInProgressDialog() DialogStates.ShowUpdateInProgress -> showUpdateInProgressDialog(theme) + DialogStates.Empty -> hideUpdateInProgressDialog() } }.launchIn(lifecycleScope) } @@ -146,7 +143,13 @@ class AppUpdaterDialog : DialogFragment() { } } - private fun setUpProperties(title: String?, description: String?, list: List, theme: UserSelectedTheme, typeface: Typeface?) { + private fun setUpProperties( + title: String?, + description: String?, + list: List, + theme: UserSelectedTheme, + typeface: Typeface?, + ) { binding.txtTitle.text = title binding.txtDescription.text = description @@ -158,7 +161,12 @@ class AppUpdaterDialog : DialogFragment() { setUpBothRecyclers(directLinks, storeList, theme, typeface) } - private fun setUpBothRecyclers(directDownloadList: List, storeList: List, theme: UserSelectedTheme, typeface: Typeface?) { + private fun setUpBothRecyclers( + directDownloadList: List, + storeList: List, + theme: UserSelectedTheme, + typeface: Typeface?, + ) { if (directDownloadList.isNotEmpty()) { binding.recyclerDirect.adapter = DirectRecyclerAdapter(directDownloadList, typeface) { viewModel.onListListener(it) } } @@ -194,11 +202,10 @@ class AppUpdaterDialog : DialogFragment() { override fun onDestroyView() { super.onDestroyView() - _binding = null + appUpdaterDialogBinding = null } companion object { - /** * @param title Title of the dialog * @param description Description that is shown below the title diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/AndroidAppUpdater.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/AndroidAppUpdater.kt index 7183150b..1689aa2f 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/AndroidAppUpdater.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/AndroidAppUpdater.kt @@ -1,7 +1,5 @@ package com.pouyaheydari.appupdater.compose -import android.graphics.Typeface -import android.util.Log import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxWidth @@ -22,8 +20,8 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.lifecycle.viewmodel.compose.viewModel -import com.pouyaheydari.appupdater.compose.pojo.UpdaterDialogContent import com.pouyaheydari.appupdater.compose.pojo.UpdaterDialogData +import com.pouyaheydari.appupdater.compose.pojo.UpdaterDialogUIData import com.pouyaheydari.appupdater.compose.ui.DialogHeaderComponent import com.pouyaheydari.appupdater.compose.ui.DirectDownloadLinkComponent import com.pouyaheydari.appupdater.compose.ui.DividerComponent @@ -31,54 +29,15 @@ import com.pouyaheydari.appupdater.compose.ui.SquareStoreItemComponent import com.pouyaheydari.appupdater.compose.ui.UpdateInProgressDialogComponent import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme import com.pouyaheydari.appupdater.compose.utils.getActivity +import com.pouyaheydari.appupdater.compose.utils.getApkIfActivityIsNotNull import com.pouyaheydari.appupdater.compose.utils.isDarkThemeSelected import com.pouyaheydari.appupdater.compose.utils.storeList import com.pouyaheydari.appupdater.core.pojo.DialogStates import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem import com.pouyaheydari.appupdater.core.pojo.Theme -import com.pouyaheydari.appupdater.core.utils.TAG -import com.pouyaheydari.appupdater.core.utils.getApk import com.pouyaheydari.appupdater.core.utils.shouldShowStoresDivider import com.pouyaheydari.appupdater.core.R as coreR -/** - * Shows the compose dialog - * - * @param dialogTitle title of the update dialog - * @param dialogDescription description of the update dialog - * @param storeList list of Stores and Direct links to be shown to the user in the update dialog - * @param onDismissRequested gets invoked when the user requests to dismiss the dialog - * @param typeface Typeface to customize the font style if needed - * @param theme theme of the dialog - * - */ - -@Deprecated( - message = "This function is deprecated and will be removed in the next version. Use getInstance with UpdaterDialogData input parameter instead.", - replaceWith = ReplaceWith("this.AndroidAppUpdater(UpdaterDialogData())", "com.pouyaheydari.appupdater.compose.pojo.UpdaterDialogData"), -) -@Composable -fun AndroidAppUpdater( - dialogTitle: String = "", - dialogDescription: String = "", - storeList: List = listOf(), - onDismissRequested: () -> Unit = {}, - typeface: Typeface? = null, - theme: Theme = Theme.SYSTEM_DEFAULT, -) { - AndroidAppUpdater( - UpdaterDialogData( - dialogTitle = dialogTitle, - dialogDescription = dialogDescription, - storeList = storeList, - onDismissRequested = onDismissRequested, - typeface = typeface, - theme = theme, - ), - ) -} - /** * Shows the compose dialog * @@ -95,40 +54,32 @@ fun AndroidAppUpdater(dialogData: UpdaterDialogData) { val (directDownloadItems, storeItems) = storeList.partition { it.store == Store.DIRECT_URL } DialogContent( - UpdaterDialogContent( + UpdaterDialogUIData( dialogTitle = dialogTitle, dialogDescription = dialogDescription, directDownloadList = directDownloadItems, storeList = storeItems, typeface = typeface, - onClickListener = viewModel::onListListener, + onClickListener = viewModel::onListItemClicked, shouldShowDividers = shouldShowStoresDivider(directDownloadItems, storeItems), ), ) } when (val value = viewModel.screenState.collectAsState().value) { - is DialogStates.DownloadApk -> { - if (activity == null) { - Log.e(TAG, "Provided activity is null. Skipping downloading the apk") - } else { - getApk(value.apkUrl, activity) - } - } - + is DialogStates.DownloadApk -> getApkIfActivityIsNotNull(activity, value.apkUrl) + is DialogStates.OpenStore -> value.store?.showStore(activity) + DialogStates.ShowUpdateInProgress -> UpdateInProgressDialogComponent() DialogStates.HideUpdateInProgress -> {} - is DialogStates.OpenStore -> { - value.store?.showStore(activity) + DialogStates.Empty -> { // Just to avoid last state being populated over and over } - - DialogStates.ShowUpdateInProgress -> UpdateInProgressDialogComponent() } } } } @Composable -private fun DialogContent(dialogContent: UpdaterDialogContent) { +private fun DialogContent(dialogContent: UpdaterDialogUIData) { Card( shape = RoundedCornerShape(12.dp), elevation = CardDefaults.cardElevation(8.dp), diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/AndroidAppUpdaterViewModel.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/AndroidAppUpdaterViewModel.kt index 3f49293b..431d2232 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/AndroidAppUpdaterViewModel.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/AndroidAppUpdaterViewModel.kt @@ -16,27 +16,33 @@ import kotlinx.coroutines.launch */ internal class AndroidAppUpdaterViewModel : ViewModel() { val screenState = MutableStateFlow(DialogStates.HideUpdateInProgress) + private val getIsUpdateInProgress by lazy { GetIsUpdateInProgress() } - fun onListListener(item: StoreListItem) { + fun onListItemClicked(item: StoreListItem) { when (item.store) { - Store.DIRECT_URL -> { - observeUpdateInProgressStatus() - screenState.value = DialogStates.DownloadApk(item.url) - } + Store.DIRECT_URL -> startDirectUrlApkDownload(item) + else -> showAppInSelectedStore(item) + } + } - else -> viewModelScope.launch { - val store = item.store.provider?.newInstance()?.also { it.setStoreData(item) } - screenState.value = DialogStates.OpenStore(store) - runWithDelay { - screenState.value = DialogStates.HideUpdateInProgress - } + private fun showAppInSelectedStore(item: StoreListItem) { + viewModelScope.launch { + val store = item.store.provider?.getDeclaredConstructor()?.newInstance()?.also { it.setStoreData(item) } + screenState.value = DialogStates.OpenStore(store) + runWithDelay { + screenState.value = DialogStates.Empty } } } - private fun observeUpdateInProgressStatus() { + private fun startDirectUrlApkDownload(item: StoreListItem) { + observeUpdateProgress() + screenState.value = DialogStates.DownloadApk(item.url) + } + + private fun observeUpdateProgress() { viewModelScope.launch { - GetIsUpdateInProgress().invoke().collectLatest { + getIsUpdateInProgress().collectLatest { screenState.value = if (it) DialogStates.ShowUpdateInProgress else DialogStates.HideUpdateInProgress } } diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/pojo/UpdaterDialogContent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/pojo/UpdaterDialogUIData.kt similarity index 92% rename from compose/src/main/java/com/pouyaheydari/appupdater/compose/pojo/UpdaterDialogContent.kt rename to compose/src/main/java/com/pouyaheydari/appupdater/compose/pojo/UpdaterDialogUIData.kt index 6300d978..27400877 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/pojo/UpdaterDialogContent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/pojo/UpdaterDialogUIData.kt @@ -6,7 +6,7 @@ import com.pouyaheydari.appupdater.core.pojo.StoreListItem /** * This model is used to pass dialog content to [com.pouyaheydari.appupdater.compose.DialogContent] */ -internal data class UpdaterDialogContent( +internal data class UpdaterDialogUIData( val dialogTitle: String, val dialogDescription: String, val directDownloadList: List, diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/GetApkIfActivityIsNotNull.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/GetApkIfActivityIsNotNull.kt new file mode 100644 index 00000000..c689c6bc --- /dev/null +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/GetApkIfActivityIsNotNull.kt @@ -0,0 +1,17 @@ +package com.pouyaheydari.appupdater.compose.utils + +import android.app.Activity +import android.util.Log +import com.pouyaheydari.appupdater.core.utils.TAG +import com.pouyaheydari.appupdater.core.utils.getApk + +fun getApkIfActivityIsNotNull( + activity: Activity?, + url: String, +) { + if (activity == null) { + Log.e(TAG, "Provided activity is null. Skipping downloading the apk") + } else { + getApk(url, activity) + } +} diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/interactors/GetIsUpdateInProgress.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/interactors/GetIsUpdateInProgress.kt index 37c8fe9d..7d2124e6 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/interactors/GetIsUpdateInProgress.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/interactors/GetIsUpdateInProgress.kt @@ -1,8 +1,8 @@ package com.pouyaheydari.appupdater.core.interactors import com.pouyaheydari.appupdater.core.data.Repository +import kotlinx.coroutines.flow.Flow class GetIsUpdateInProgress { - - operator fun invoke() = Repository.shouldShowUpdateInProgressDialog + operator fun invoke(): Flow = Repository.shouldShowUpdateInProgressDialog } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/pojo/DialogStates.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/pojo/DialogStates.kt index c2fbd122..7025aa35 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/pojo/DialogStates.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/pojo/DialogStates.kt @@ -6,6 +6,7 @@ import com.pouyaheydari.appupdater.core.stores.Stores * Represents UI states of the update dialog */ sealed interface DialogStates { + data object Empty : DialogStates data object ShowUpdateInProgress : DialogStates data object HideUpdateInProgress : DialogStates data class OpenStore(val store: Stores?) : DialogStates From 47e474f59776968224aab052d66776bbfd15d215 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Fri, 5 Jan 2024 19:02:54 +0100 Subject: [PATCH 003/117] Fixed dialog getting dismissed after configuration changed in the demo app --- .../androidappupdater/ui/compose/ComposeSampleActivity.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt b/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt index 7ba49ea1..5e71a74b 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt +++ b/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt @@ -10,7 +10,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -35,7 +35,7 @@ internal class ComposeSampleActivity : ComponentActivity() { super.onCreate(savedInstanceState) setContent { AndroidAppUpdaterTheme { - var state by remember { mutableStateOf(false) } + var state by rememberSaveable { mutableStateOf(false) } Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { Button(onClick = { state = true }) { From c78909827c64b4688a7d0a500528e6280eb933a9 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Fri, 5 Jan 2024 19:03:39 +0100 Subject: [PATCH 004/117] Disabled some ktlint rules after upgrading to the latest version --- .editorconfig | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index 785cc754..e64b4efe 100644 --- a/.editorconfig +++ b/.editorconfig @@ -6,4 +6,11 @@ indent_style=space indent_size=4 [*.{kt,kts}] -max_line_length = 180 \ No newline at end of file +max_line_length = 180 +ktlint_function_naming_ignore_when_annotated_with=Composable +ktlint_standard_string-template-indent = disabled +ktlint_standard_multiline-expression-wrapping = disabled +ktlint_standard_blank-line-before-declaration = disabled +ktlint_standard_function-signature = disabled +ktlint_function_signature_rule_force_multiline_when_parameter_count_greater_or_equal_than = unset +ktlint_function_signature_body_expression_wrapping = default From 007768c2e8a350da8ed5656ca6b4a661d0d53f38 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Fri, 5 Jan 2024 19:13:07 +0100 Subject: [PATCH 005/117] Added app theme to all compose preview functions --- .../appupdater/compose/AndroidAppUpdater.kt | 72 ++++++++++--------- .../compose/ui/DialogHeaderComponent.kt | 15 ++-- .../compose/ui/DirectDownloadLinkComponent.kt | 11 +-- .../appupdater/compose/ui/DividerComponent.kt | 7 +- .../compose/ui/SquareStoreItemComponent.kt | 6 +- .../ui/UpdateInProgressDialogComponent.kt | 7 +- .../utils/GetApkIfActivityIsNotNull.kt | 5 +- 7 files changed, 72 insertions(+), 51 deletions(-) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/AndroidAppUpdater.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/AndroidAppUpdater.kt index 1689aa2f..ff100a89 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/AndroidAppUpdater.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/AndroidAppUpdater.kt @@ -115,51 +115,59 @@ private fun DialogContent(dialogContent: UpdaterDialogUIData) { @Preview(showBackground = true) @Composable private fun LightPreview() { - AndroidAppUpdater( - UpdaterDialogData( - dialogTitle = stringResource(id = coreR.string.appupdater_app_name), - dialogDescription = stringResource(id = coreR.string.appupdater_download_notification_desc), - storeList = storeList, - theme = Theme.LIGHT, - ), - ) + AndroidAppUpdaterTheme { + AndroidAppUpdater( + UpdaterDialogData( + dialogTitle = stringResource(id = coreR.string.appupdater_app_name), + dialogDescription = stringResource(id = coreR.string.appupdater_download_notification_desc), + storeList = storeList, + theme = Theme.LIGHT, + ), + ) + } } @Preview(showBackground = true) @Composable private fun LightPreviewSingleStoreItem() { - AndroidAppUpdater( - UpdaterDialogData( - dialogTitle = stringResource(id = coreR.string.appupdater_app_name), - dialogDescription = stringResource(id = coreR.string.appupdater_download_notification_desc), - storeList = storeList.subList(2, 3), - theme = Theme.LIGHT, - ), - ) + AndroidAppUpdaterTheme { + AndroidAppUpdater( + UpdaterDialogData( + dialogTitle = stringResource(id = coreR.string.appupdater_app_name), + dialogDescription = stringResource(id = coreR.string.appupdater_download_notification_desc), + storeList = storeList.subList(2, 3), + theme = Theme.LIGHT, + ), + ) + } } @Preview(showBackground = true) @Composable private fun LightPreviewSingleDirectLinkItem() { - AndroidAppUpdater( - UpdaterDialogData( - dialogTitle = stringResource(id = coreR.string.appupdater_app_name), - dialogDescription = stringResource(id = coreR.string.appupdater_download_notification_desc), - storeList = storeList.subList(0, 1), - theme = Theme.LIGHT, - ), - ) + AndroidAppUpdaterTheme { + AndroidAppUpdater( + UpdaterDialogData( + dialogTitle = stringResource(id = coreR.string.appupdater_app_name), + dialogDescription = stringResource(id = coreR.string.appupdater_download_notification_desc), + storeList = storeList.subList(0, 1), + theme = Theme.LIGHT, + ), + ) + } } @Preview(showBackground = true) @Composable private fun DarkPreview() { - AndroidAppUpdater( - UpdaterDialogData( - dialogTitle = stringResource(id = coreR.string.appupdater_app_name), - dialogDescription = stringResource(id = coreR.string.appupdater_download_notification_desc), - storeList = storeList, - theme = Theme.DARK, - ), - ) + AndroidAppUpdaterTheme { + AndroidAppUpdater( + UpdaterDialogData( + dialogTitle = stringResource(id = coreR.string.appupdater_app_name), + dialogDescription = stringResource(id = coreR.string.appupdater_download_notification_desc), + storeList = storeList, + theme = Theme.DARK, + ), + ) + } } diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/DialogHeaderComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/DialogHeaderComponent.kt index 64e26548..6e694710 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/DialogHeaderComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/DialogHeaderComponent.kt @@ -18,6 +18,7 @@ import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme import com.pouyaheydari.appupdater.core.R as coreR /** @@ -64,12 +65,14 @@ internal fun DialogHeaderComponent( } } -@Preview(showSystemUi = true, showBackground = true, backgroundColor = 0xFFFFFF) +@Preview(showSystemUi = true) @Composable private fun Preview() { - DialogHeaderComponent( - dialogTitle = stringResource(id = coreR.string.appupdater_app_name), - typeface = null, - dialogDescription = stringResource(id = coreR.string.appupdater_download_notification_desc), - ) + AndroidAppUpdaterTheme { + DialogHeaderComponent( + dialogTitle = stringResource(id = coreR.string.appupdater_app_name), + typeface = null, + dialogDescription = stringResource(id = coreR.string.appupdater_download_notification_desc), + ) + } } diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/DirectDownloadLinkComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/DirectDownloadLinkComponent.kt index 17657a13..4d9ab28e 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/DirectDownloadLinkComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/DirectDownloadLinkComponent.kt @@ -7,6 +7,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview +import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme import com.pouyaheydari.appupdater.compose.ui.theme.Blue import com.pouyaheydari.appupdater.core.pojo.StoreListItem @@ -30,10 +31,12 @@ internal fun DirectDownloadLinkComponent( ) } -@Preview(showSystemUi = true) +@Preview @Composable private fun Preview() { - DirectDownloadLinkComponent( - item = StoreListItem(title = "Direct Link 1"), - ) + AndroidAppUpdaterTheme { + DirectDownloadLinkComponent( + item = StoreListItem(title = "Direct Link 1"), + ) + } } diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/DividerComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/DividerComponent.kt index 673384ab..67bc2df9 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/DividerComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/DividerComponent.kt @@ -12,6 +12,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme import com.pouyaheydari.appupdater.core.R as coreR /** @@ -43,8 +44,10 @@ internal fun DividerComponent() { } } -@Preview +@Preview(showBackground = true) @Composable private fun Preview() { - DividerComponent() + AndroidAppUpdaterTheme { + DividerComponent() + } } diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/SquareStoreItemComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/SquareStoreItemComponent.kt index daec3ec3..7dba76be 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/SquareStoreItemComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/SquareStoreItemComponent.kt @@ -12,6 +12,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme +import com.pouyaheydari.appupdater.core.R import com.pouyaheydari.appupdater.core.pojo.StoreListItem /** @@ -42,5 +44,7 @@ internal fun SquareStoreItemComponent( @Preview @Composable private fun Preview() { - SquareStoreItemComponent(item = StoreListItem(icon = com.pouyaheydari.appupdater.core.R.drawable.appupdater_ic_google_play)) + AndroidAppUpdaterTheme { + SquareStoreItemComponent(item = StoreListItem(icon = R.drawable.appupdater_ic_google_play)) + } } diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/UpdateInProgressDialogComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/UpdateInProgressDialogComponent.kt index f43c281c..4960666a 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/UpdateInProgressDialogComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/UpdateInProgressDialogComponent.kt @@ -15,6 +15,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog +import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme import com.pouyaheydari.appupdater.core.R as coreR /** @@ -54,8 +55,10 @@ internal fun UpdateInProgressDialogComponent() { } } -@Preview(showBackground = true) +@Preview @Composable private fun UpdateInProgressDialogPreview() { - UpdateInProgressDialogComponent() + AndroidAppUpdaterTheme { + UpdateInProgressDialogComponent() + } } diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/GetApkIfActivityIsNotNull.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/GetApkIfActivityIsNotNull.kt index c689c6bc..37cd53e0 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/GetApkIfActivityIsNotNull.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/GetApkIfActivityIsNotNull.kt @@ -5,10 +5,7 @@ import android.util.Log import com.pouyaheydari.appupdater.core.utils.TAG import com.pouyaheydari.appupdater.core.utils.getApk -fun getApkIfActivityIsNotNull( - activity: Activity?, - url: String, -) { +fun getApkIfActivityIsNotNull(activity: Activity?, url: String) { if (activity == null) { Log.e(TAG, "Provided activity is null. Skipping downloading the apk") } else { From afafd196e081a7bdb8e8edd70a5112c2372e487f Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Fri, 5 Jan 2024 19:46:56 +0100 Subject: [PATCH 006/117] Added DialogHeaderModel --- .../ui/compose/ComposeSampleActivity.kt | 2 +- .../appupdater/compose/AndroidAppUpdater.kt | 19 +++++++++++------ .../compose/models/DialogHeaderModel.kt | 6 ++++++ .../{pojo => models}/UpdaterDialogData.kt | 2 +- .../{pojo => models}/UpdaterDialogUIData.kt | 5 ++--- .../compose/ui/DialogHeaderComponent.kt | 21 ++++++++----------- 6 files changed, 32 insertions(+), 23 deletions(-) create mode 100644 compose/src/main/java/com/pouyaheydari/appupdater/compose/models/DialogHeaderModel.kt rename compose/src/main/java/com/pouyaheydari/appupdater/compose/{pojo => models}/UpdaterDialogData.kt (91%) rename compose/src/main/java/com/pouyaheydari/appupdater/compose/{pojo => models}/UpdaterDialogUIData.kt (79%) diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt b/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt index 5e71a74b..d3c83747 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt +++ b/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt @@ -20,7 +20,7 @@ import com.pouyaheydari.androidappupdater.R import com.pouyaheydari.androidappupdater.ui.compose.theme.AndroidAppUpdaterTheme import com.pouyaheydari.androidappupdater.utils.getNormalList import com.pouyaheydari.appupdater.compose.AndroidAppUpdater -import com.pouyaheydari.appupdater.compose.pojo.UpdaterDialogData +import com.pouyaheydari.appupdater.compose.models.UpdaterDialogData import com.pouyaheydari.appupdater.compose.utils.storeList import com.pouyaheydari.appupdater.core.pojo.Theme import com.pouyaheydari.appupdater.core.R as coreR diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/AndroidAppUpdater.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/AndroidAppUpdater.kt index ff100a89..40fe0f4e 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/AndroidAppUpdater.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/AndroidAppUpdater.kt @@ -20,8 +20,9 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.lifecycle.viewmodel.compose.viewModel -import com.pouyaheydari.appupdater.compose.pojo.UpdaterDialogData -import com.pouyaheydari.appupdater.compose.pojo.UpdaterDialogUIData +import com.pouyaheydari.appupdater.compose.models.DialogHeaderModel +import com.pouyaheydari.appupdater.compose.models.UpdaterDialogData +import com.pouyaheydari.appupdater.compose.models.UpdaterDialogUIData import com.pouyaheydari.appupdater.compose.ui.DialogHeaderComponent import com.pouyaheydari.appupdater.compose.ui.DirectDownloadLinkComponent import com.pouyaheydari.appupdater.compose.ui.DividerComponent @@ -55,8 +56,7 @@ fun AndroidAppUpdater(dialogData: UpdaterDialogData) { DialogContent( UpdaterDialogUIData( - dialogTitle = dialogTitle, - dialogDescription = dialogDescription, + dialogHeader = DialogHeaderModel(dialogTitle, dialogDescription), directDownloadList = directDownloadItems, storeList = storeItems, typeface = typeface, @@ -94,7 +94,9 @@ private fun DialogContent(dialogContent: UpdaterDialogUIData) { contentPadding = PaddingValues(vertical = 16.dp), ) { with(dialogContent) { - item(span = { GridItemSpan(maxLineSpan) }) { DialogHeaderComponent(dialogTitle, dialogDescription, typeface) } + item(span = { GridItemSpan(maxLineSpan) }) { + DialogHeaderComponent(dialogHeader, typeface) + } directDownloadList.forEach { item(span = { GridItemSpan(maxLineSpan) }) { DirectDownloadLinkComponent(it, onClickListener) @@ -105,13 +107,18 @@ private fun DialogContent(dialogContent: UpdaterDialogUIData) { } storeList.forEach { - item(span = { if (storeList.size > 1) GridItemSpan(1) else GridItemSpan(maxLineSpan) }) { SquareStoreItemComponent(it, onClickListener) } + item(span = { getStoreListGridItemSpan(storeList.size, maxLineSpan) }) { + SquareStoreItemComponent(it, onClickListener) + } } } } } } +private fun getStoreListGridItemSpan(storeListSize: Int, maxLineSpan: Int) = + if (storeListSize > 1) GridItemSpan(1) else GridItemSpan(maxLineSpan) + @Preview(showBackground = true) @Composable private fun LightPreview() { diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/models/DialogHeaderModel.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/models/DialogHeaderModel.kt new file mode 100644 index 00000000..a1ea0146 --- /dev/null +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/models/DialogHeaderModel.kt @@ -0,0 +1,6 @@ +package com.pouyaheydari.appupdater.compose.models + +internal data class DialogHeaderModel( + val dialogTitle: String = "", + val dialogDescription: String = "", +) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/pojo/UpdaterDialogData.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/models/UpdaterDialogData.kt similarity index 91% rename from compose/src/main/java/com/pouyaheydari/appupdater/compose/pojo/UpdaterDialogData.kt rename to compose/src/main/java/com/pouyaheydari/appupdater/compose/models/UpdaterDialogData.kt index 5cabea9f..9a242101 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/pojo/UpdaterDialogData.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/models/UpdaterDialogData.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.compose.pojo +package com.pouyaheydari.appupdater.compose.models import android.graphics.Typeface import com.pouyaheydari.appupdater.core.pojo.StoreListItem diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/pojo/UpdaterDialogUIData.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/models/UpdaterDialogUIData.kt similarity index 79% rename from compose/src/main/java/com/pouyaheydari/appupdater/compose/pojo/UpdaterDialogUIData.kt rename to compose/src/main/java/com/pouyaheydari/appupdater/compose/models/UpdaterDialogUIData.kt index 27400877..bf570689 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/pojo/UpdaterDialogUIData.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/models/UpdaterDialogUIData.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.compose.pojo +package com.pouyaheydari.appupdater.compose.models import android.graphics.Typeface import com.pouyaheydari.appupdater.core.pojo.StoreListItem @@ -7,8 +7,7 @@ import com.pouyaheydari.appupdater.core.pojo.StoreListItem * This model is used to pass dialog content to [com.pouyaheydari.appupdater.compose.DialogContent] */ internal data class UpdaterDialogUIData( - val dialogTitle: String, - val dialogDescription: String, + val dialogHeader: DialogHeaderModel, val directDownloadList: List, val storeList: List, val typeface: Typeface?, diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/DialogHeaderComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/DialogHeaderComponent.kt index 6e694710..15db0db7 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/DialogHeaderComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/DialogHeaderComponent.kt @@ -18,22 +18,17 @@ import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.pouyaheydari.appupdater.compose.models.DialogHeaderModel import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme import com.pouyaheydari.appupdater.core.R as coreR /** * Shows header icon, title and description * - * @param dialogTitle Title of dialog - * @param dialogDescription a brief description about the update dialog - * @param typeface for texts + * @param data DialogHeaderComponentModel */ @Composable -internal fun DialogHeaderComponent( - dialogTitle: String, - dialogDescription: String, - typeface: Typeface?, -) { +internal fun DialogHeaderComponent(data: DialogHeaderModel, typeface: Typeface?) { Column(horizontalAlignment = CenterHorizontally) { Image( painter = painterResource(id = coreR.drawable.appupdater_ic_cloud), @@ -44,7 +39,7 @@ internal fun DialogHeaderComponent( ) Text( textAlign = TextAlign.Center, - text = dialogTitle, + text = data.dialogTitle, color = MaterialTheme.colorScheme.onSurface, style = MaterialTheme.typography.titleLarge, fontFamily = typeface?.let { FontFamily(it) }, @@ -54,7 +49,7 @@ internal fun DialogHeaderComponent( ) Text( textAlign = TextAlign.Center, - text = dialogDescription, + text = data.dialogDescription, color = MaterialTheme.colorScheme.onSurface, style = MaterialTheme.typography.bodyMedium, fontFamily = typeface?.let { FontFamily(it) }, @@ -70,9 +65,11 @@ internal fun DialogHeaderComponent( private fun Preview() { AndroidAppUpdaterTheme { DialogHeaderComponent( - dialogTitle = stringResource(id = coreR.string.appupdater_app_name), + data = DialogHeaderModel( + dialogTitle = stringResource(id = coreR.string.appupdater_app_name), + dialogDescription = stringResource(id = coreR.string.appupdater_download_notification_desc), + ), typeface = null, - dialogDescription = stringResource(id = coreR.string.appupdater_download_notification_desc), ) } } From 6a8b9d87a70e45f03d9d18d4493fd71b9d7e8848 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Sun, 7 Jan 2024 17:18:58 +0100 Subject: [PATCH 007/117] Used ViewModelFactory to inject dependencies into the ViewModel --- .../ui/compose/ComposeSampleActivity.kt | 4 +- .../compose/AndroidAppUpdaterViewModel.kt | 50 ------------ .../domain/mapper/UpdaterDialogUIMapper.kt | 20 +++++ .../mapper/UpdaterViewModelDataMapper.kt | 16 ++++ .../compose/{ => ui}/AndroidAppUpdater.kt | 80 ++++++++++--------- .../compose/ui/AndroidAppUpdaterViewModel.kt | 70 ++++++++++++++++ .../ui/AndroidAppUpdaterViewModelFactory.kt | 18 +++++ .../{ => components}/DialogHeaderComponent.kt | 4 +- .../DirectDownloadLinkComponent.kt | 2 +- .../ui/{ => components}/DividerComponent.kt | 2 +- .../SquareStoreItemComponent.kt | 2 +- .../UpdateInProgressDialogComponent.kt | 2 +- .../{ => ui}/models/DialogHeaderModel.kt | 2 +- .../compose/ui/models/DialogState.kt | 12 +++ .../{ => ui}/models/UpdaterDialogData.kt | 6 +- .../{ => ui}/models/UpdaterDialogUIData.kt | 9 +-- .../compose/ui/models/UpdaterViewModelData.kt | 12 +++ 17 files changed, 205 insertions(+), 106 deletions(-) delete mode 100644 compose/src/main/java/com/pouyaheydari/appupdater/compose/AndroidAppUpdaterViewModel.kt create mode 100644 compose/src/main/java/com/pouyaheydari/appupdater/compose/domain/mapper/UpdaterDialogUIMapper.kt create mode 100644 compose/src/main/java/com/pouyaheydari/appupdater/compose/domain/mapper/UpdaterViewModelDataMapper.kt rename compose/src/main/java/com/pouyaheydari/appupdater/compose/{ => ui}/AndroidAppUpdater.kt (68%) create mode 100644 compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt create mode 100644 compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModelFactory.kt rename compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/{ => components}/DialogHeaderComponent.kt (95%) rename compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/{ => components}/DirectDownloadLinkComponent.kt (95%) rename compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/{ => components}/DividerComponent.kt (96%) rename compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/{ => components}/SquareStoreItemComponent.kt (96%) rename compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/{ => components}/UpdateInProgressDialogComponent.kt (97%) rename compose/src/main/java/com/pouyaheydari/appupdater/compose/{ => ui}/models/DialogHeaderModel.kt (68%) create mode 100644 compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogState.kt rename compose/src/main/java/com/pouyaheydari/appupdater/compose/{ => ui}/models/UpdaterDialogData.kt (75%) rename compose/src/main/java/com/pouyaheydari/appupdater/compose/{ => ui}/models/UpdaterDialogUIData.kt (50%) create mode 100644 compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterViewModelData.kt diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt b/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt index d3c83747..47fe4cee 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt +++ b/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt @@ -19,8 +19,8 @@ import androidx.compose.ui.tooling.preview.Preview import com.pouyaheydari.androidappupdater.R import com.pouyaheydari.androidappupdater.ui.compose.theme.AndroidAppUpdaterTheme import com.pouyaheydari.androidappupdater.utils.getNormalList -import com.pouyaheydari.appupdater.compose.AndroidAppUpdater -import com.pouyaheydari.appupdater.compose.models.UpdaterDialogData +import com.pouyaheydari.appupdater.compose.ui.AndroidAppUpdater +import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogData import com.pouyaheydari.appupdater.compose.utils.storeList import com.pouyaheydari.appupdater.core.pojo.Theme import com.pouyaheydari.appupdater.core.R as coreR diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/AndroidAppUpdaterViewModel.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/AndroidAppUpdaterViewModel.kt deleted file mode 100644 index 431d2232..00000000 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/AndroidAppUpdaterViewModel.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.pouyaheydari.appupdater.compose - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import com.pouyaheydari.appupdater.core.interactors.GetIsUpdateInProgress -import com.pouyaheydari.appupdater.core.pojo.DialogStates -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem -import com.pouyaheydari.appupdater.core.utils.runWithDelay -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.launch - -/** - * View Model of [AndroidAppUpdater] - */ -internal class AndroidAppUpdaterViewModel : ViewModel() { - val screenState = MutableStateFlow(DialogStates.HideUpdateInProgress) - private val getIsUpdateInProgress by lazy { GetIsUpdateInProgress() } - - fun onListItemClicked(item: StoreListItem) { - when (item.store) { - Store.DIRECT_URL -> startDirectUrlApkDownload(item) - else -> showAppInSelectedStore(item) - } - } - - private fun showAppInSelectedStore(item: StoreListItem) { - viewModelScope.launch { - val store = item.store.provider?.getDeclaredConstructor()?.newInstance()?.also { it.setStoreData(item) } - screenState.value = DialogStates.OpenStore(store) - runWithDelay { - screenState.value = DialogStates.Empty - } - } - } - - private fun startDirectUrlApkDownload(item: StoreListItem) { - observeUpdateProgress() - screenState.value = DialogStates.DownloadApk(item.url) - } - - private fun observeUpdateProgress() { - viewModelScope.launch { - getIsUpdateInProgress().collectLatest { - screenState.value = if (it) DialogStates.ShowUpdateInProgress else DialogStates.HideUpdateInProgress - } - } - } -} diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/domain/mapper/UpdaterDialogUIMapper.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/domain/mapper/UpdaterDialogUIMapper.kt new file mode 100644 index 00000000..6b0a7460 --- /dev/null +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/domain/mapper/UpdaterDialogUIMapper.kt @@ -0,0 +1,20 @@ +package com.pouyaheydari.appupdater.compose.domain.mapper + +import com.pouyaheydari.appupdater.compose.ui.models.DialogHeaderModel +import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogUIData +import com.pouyaheydari.appupdater.compose.ui.models.UpdaterViewModelData +import com.pouyaheydari.appupdater.core.pojo.Store +import com.pouyaheydari.appupdater.core.utils.shouldShowStoresDivider + +internal object UpdaterDialogUIMapper { + fun map(viewModelData: UpdaterViewModelData): UpdaterDialogUIData = with(viewModelData) { + val (directDownloadItems, storeItems) = storeList.partition { it.store == Store.DIRECT_URL } + UpdaterDialogUIData( + dialogHeader = DialogHeaderModel(dialogTitle, dialogDescription), + directDownloadList = directDownloadItems, + storeList = storeItems, + shouldShowDividers = shouldShowStoresDivider(directDownloadItems, storeItems), + onDismissRequested = onDismissRequested, + ) + } +} diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/domain/mapper/UpdaterViewModelDataMapper.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/domain/mapper/UpdaterViewModelDataMapper.kt new file mode 100644 index 00000000..838777a4 --- /dev/null +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/domain/mapper/UpdaterViewModelDataMapper.kt @@ -0,0 +1,16 @@ +package com.pouyaheydari.appupdater.compose.domain.mapper + +import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogData +import com.pouyaheydari.appupdater.compose.ui.models.UpdaterViewModelData + +internal object UpdaterViewModelDataMapper { + fun map(dialogData: UpdaterDialogData): UpdaterViewModelData = with(dialogData) { + UpdaterViewModelData( + dialogTitle = dialogTitle, + dialogDescription = dialogDescription, + storeList = storeList, + onDismissRequested = onDismissRequested, + theme = theme, + ) + } +} diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/AndroidAppUpdater.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdater.kt similarity index 68% rename from compose/src/main/java/com/pouyaheydari/appupdater/compose/AndroidAppUpdater.kt rename to compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdater.kt index 40fe0f4e..1f77d91e 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/AndroidAppUpdater.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdater.kt @@ -1,5 +1,6 @@ -package com.pouyaheydari.appupdater.compose +package com.pouyaheydari.appupdater.compose.ui +import android.graphics.Typeface import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxWidth @@ -20,23 +21,22 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.lifecycle.viewmodel.compose.viewModel -import com.pouyaheydari.appupdater.compose.models.DialogHeaderModel -import com.pouyaheydari.appupdater.compose.models.UpdaterDialogData -import com.pouyaheydari.appupdater.compose.models.UpdaterDialogUIData -import com.pouyaheydari.appupdater.compose.ui.DialogHeaderComponent -import com.pouyaheydari.appupdater.compose.ui.DirectDownloadLinkComponent -import com.pouyaheydari.appupdater.compose.ui.DividerComponent -import com.pouyaheydari.appupdater.compose.ui.SquareStoreItemComponent -import com.pouyaheydari.appupdater.compose.ui.UpdateInProgressDialogComponent +import com.pouyaheydari.appupdater.compose.ui.components.DialogHeaderComponent +import com.pouyaheydari.appupdater.compose.ui.components.DirectDownloadLinkComponent +import com.pouyaheydari.appupdater.compose.ui.components.DividerComponent +import com.pouyaheydari.appupdater.compose.ui.components.SquareStoreItemComponent +import com.pouyaheydari.appupdater.compose.ui.components.UpdateInProgressDialogComponent +import com.pouyaheydari.appupdater.compose.ui.models.DialogState +import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogData +import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogUIData import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme import com.pouyaheydari.appupdater.compose.utils.getActivity import com.pouyaheydari.appupdater.compose.utils.getApkIfActivityIsNotNull import com.pouyaheydari.appupdater.compose.utils.isDarkThemeSelected import com.pouyaheydari.appupdater.compose.utils.storeList import com.pouyaheydari.appupdater.core.pojo.DialogStates -import com.pouyaheydari.appupdater.core.pojo.Store +import com.pouyaheydari.appupdater.core.pojo.StoreListItem import com.pouyaheydari.appupdater.core.pojo.Theme -import com.pouyaheydari.appupdater.core.utils.shouldShowStoresDivider import com.pouyaheydari.appupdater.core.R as coreR /** @@ -46,40 +46,46 @@ import com.pouyaheydari.appupdater.core.R as coreR */ @Composable fun AndroidAppUpdater(dialogData: UpdaterDialogData) { - val viewModel: AndroidAppUpdaterViewModel = viewModel() - val activity = LocalContext.current.getActivity() + val viewModel: AndroidAppUpdaterViewModel = viewModel(factory = AndroidAppUpdaterViewModelFactory(dialogData)) - with(dialogData) { - AndroidAppUpdaterTheme(darkTheme = isDarkThemeSelected(theme)) { - Dialog(onDismissRequest = { onDismissRequested() }) { - val (directDownloadItems, storeItems) = storeList.partition { it.store == Store.DIRECT_URL } + AndroidAppUpdaterTheme(darkTheme = isDarkThemeSelected(dialogData.theme)) { + SubscribeToDialogState(viewModel, dialogData.typeface) + OnIntentReceived(viewModel) + } +} - DialogContent( - UpdaterDialogUIData( - dialogHeader = DialogHeaderModel(dialogTitle, dialogDescription), - directDownloadList = directDownloadItems, - storeList = storeItems, - typeface = typeface, - onClickListener = viewModel::onListItemClicked, - shouldShowDividers = shouldShowStoresDivider(directDownloadItems, storeItems), - ), - ) - } +@Composable +private fun SubscribeToDialogState(viewModel: AndroidAppUpdaterViewModel, typeface: Typeface?) { + when (val value = viewModel.dialogState.collectAsState().value) { + is DialogState.ShowDialog -> AppUpdaterDialog(value.dialogContent, value.onItemClickListener, typeface = typeface) + DialogState.HideDialog -> { // Do nothing + } + } +} - when (val value = viewModel.screenState.collectAsState().value) { - is DialogStates.DownloadApk -> getApkIfActivityIsNotNull(activity, value.apkUrl) - is DialogStates.OpenStore -> value.store?.showStore(activity) - DialogStates.ShowUpdateInProgress -> UpdateInProgressDialogComponent() - DialogStates.HideUpdateInProgress -> {} - DialogStates.Empty -> { // Just to avoid last state being populated over and over - } - } +@Composable +private fun OnIntentReceived(viewModel: AndroidAppUpdaterViewModel) { + val activity = LocalContext.current.getActivity() + + when (val value = viewModel.screenState.collectAsState().value) { + is DialogStates.DownloadApk -> getApkIfActivityIsNotNull(activity, value.apkUrl) + is DialogStates.OpenStore -> value.store?.showStore(activity) + DialogStates.ShowUpdateInProgress -> UpdateInProgressDialogComponent() + DialogStates.HideUpdateInProgress -> {} + DialogStates.Empty -> { // Just to avoid last state being populated over and over } } } @Composable -private fun DialogContent(dialogContent: UpdaterDialogUIData) { +private fun AppUpdaterDialog(dialogContent: UpdaterDialogUIData, onClickListener: (StoreListItem) -> Unit, typeface: Typeface?) { + Dialog(onDismissRequest = { dialogContent.onDismissRequested() }) { + DialogContent(dialogContent, onClickListener, typeface) + } +} + +@Composable +private fun DialogContent(dialogContent: UpdaterDialogUIData, onClickListener: (StoreListItem) -> Unit, typeface: Typeface?) { Card( shape = RoundedCornerShape(12.dp), elevation = CardDefaults.cardElevation(8.dp), diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt new file mode 100644 index 00000000..e9e55967 --- /dev/null +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt @@ -0,0 +1,70 @@ +package com.pouyaheydari.appupdater.compose.ui + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.pouyaheydari.appupdater.compose.domain.mapper.UpdaterDialogUIMapper +import com.pouyaheydari.appupdater.compose.ui.models.DialogState +import com.pouyaheydari.appupdater.compose.ui.models.UpdaterViewModelData +import com.pouyaheydari.appupdater.core.interactors.GetIsUpdateInProgress +import com.pouyaheydari.appupdater.core.pojo.DialogStates +import com.pouyaheydari.appupdater.core.pojo.DialogStates.DownloadApk +import com.pouyaheydari.appupdater.core.pojo.DialogStates.Empty +import com.pouyaheydari.appupdater.core.pojo.DialogStates.HideUpdateInProgress +import com.pouyaheydari.appupdater.core.pojo.DialogStates.OpenStore +import com.pouyaheydari.appupdater.core.pojo.DialogStates.ShowUpdateInProgress +import com.pouyaheydari.appupdater.core.pojo.Store +import com.pouyaheydari.appupdater.core.pojo.StoreListItem +import com.pouyaheydari.appupdater.core.utils.runWithDelay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch + +/** + * View Model of [AndroidAppUpdater] + */ +internal class AndroidAppUpdaterViewModel( + viewModelData: UpdaterViewModelData, + private val isUpdateInProgress: GetIsUpdateInProgress, +) : ViewModel() { + val dialogState = MutableStateFlow(DialogState.HideDialog) + val screenState = MutableStateFlow(Empty) + + init { + showUpdaterDialog(viewModelData) + } + + private fun showUpdaterDialog(viewModelData: UpdaterViewModelData) { + val dialogContent = UpdaterDialogUIMapper.map(viewModelData) + dialogState.value = DialogState.ShowDialog(dialogContent, ::onListItemClicked) + } + + private fun onListItemClicked(item: StoreListItem) { + when (item.store) { + Store.DIRECT_URL -> startDirectUrlApkDownload(item) + else -> showAppInSelectedStore(item) + } + } + + private fun showAppInSelectedStore(item: StoreListItem) { + viewModelScope.launch { + val store = item.store.provider?.getDeclaredConstructor()?.newInstance()?.also { it.setStoreData(item) } + screenState.value = OpenStore(store) + runWithDelay { + screenState.value = Empty + } + } + } + + private fun startDirectUrlApkDownload(item: StoreListItem) { + observeUpdateProgress() + screenState.value = DownloadApk(item.url) + } + + private fun observeUpdateProgress() { + viewModelScope.launch { + isUpdateInProgress().collectLatest { + screenState.value = if (it) ShowUpdateInProgress else HideUpdateInProgress + } + } + } +} diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModelFactory.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModelFactory.kt new file mode 100644 index 00000000..9eee5b91 --- /dev/null +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModelFactory.kt @@ -0,0 +1,18 @@ +package com.pouyaheydari.appupdater.compose.ui + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import com.pouyaheydari.appupdater.compose.domain.mapper.UpdaterViewModelDataMapper +import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogData +import com.pouyaheydari.appupdater.core.interactors.GetIsUpdateInProgress + +class AndroidAppUpdaterViewModelFactory( + private val dialogData: UpdaterDialogData, + private val getIsUpdateInProgress: GetIsUpdateInProgress = GetIsUpdateInProgress(), +) : ViewModelProvider.Factory { + @Suppress("UNCHECKED_CAST") + override fun create(modelClass: Class): T { + val viewModelData = UpdaterViewModelDataMapper.map(dialogData) + return AndroidAppUpdaterViewModel(viewModelData, getIsUpdateInProgress) as T + } +} diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/DialogHeaderComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DialogHeaderComponent.kt similarity index 95% rename from compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/DialogHeaderComponent.kt rename to compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DialogHeaderComponent.kt index 15db0db7..84088bb1 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/DialogHeaderComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DialogHeaderComponent.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.compose.ui +package com.pouyaheydari.appupdater.compose.ui.components import android.graphics.Typeface import androidx.compose.foundation.Image @@ -18,7 +18,7 @@ import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.pouyaheydari.appupdater.compose.models.DialogHeaderModel +import com.pouyaheydari.appupdater.compose.ui.models.DialogHeaderModel import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme import com.pouyaheydari.appupdater.core.R as coreR diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/DirectDownloadLinkComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponent.kt similarity index 95% rename from compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/DirectDownloadLinkComponent.kt rename to compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponent.kt index 4d9ab28e..d1ab66d3 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/DirectDownloadLinkComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponent.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.compose.ui +package com.pouyaheydari.appupdater.compose.ui.components import androidx.compose.foundation.clickable import androidx.compose.material3.MaterialTheme diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/DividerComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt similarity index 96% rename from compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/DividerComponent.kt rename to compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt index 67bc2df9..433ba482 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/DividerComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.compose.ui +package com.pouyaheydari.appupdater.compose.ui.components import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/SquareStoreItemComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt similarity index 96% rename from compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/SquareStoreItemComponent.kt rename to compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt index 7dba76be..8e51b146 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/SquareStoreItemComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.compose.ui +package com.pouyaheydari.appupdater.compose.ui.components import androidx.compose.foundation.Image import androidx.compose.foundation.clickable diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/UpdateInProgressDialogComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt similarity index 97% rename from compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/UpdateInProgressDialogComponent.kt rename to compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt index 4960666a..3a8db9f2 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/UpdateInProgressDialogComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.compose.ui +package com.pouyaheydari.appupdater.compose.ui.components import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/models/DialogHeaderModel.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogHeaderModel.kt similarity index 68% rename from compose/src/main/java/com/pouyaheydari/appupdater/compose/models/DialogHeaderModel.kt rename to compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogHeaderModel.kt index a1ea0146..69fc3fde 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/models/DialogHeaderModel.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogHeaderModel.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.compose.models +package com.pouyaheydari.appupdater.compose.ui.models internal data class DialogHeaderModel( val dialogTitle: String = "", diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogState.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogState.kt new file mode 100644 index 00000000..2f29098e --- /dev/null +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogState.kt @@ -0,0 +1,12 @@ +package com.pouyaheydari.appupdater.compose.ui.models + +import com.pouyaheydari.appupdater.core.pojo.StoreListItem + +internal sealed interface DialogState { + data class ShowDialog( + val dialogContent: UpdaterDialogUIData, + inline val onItemClickListener: (StoreListItem) -> Unit, + ) : DialogState + + data object HideDialog : DialogState +} diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/models/UpdaterDialogData.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogData.kt similarity index 75% rename from compose/src/main/java/com/pouyaheydari/appupdater/compose/models/UpdaterDialogData.kt rename to compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogData.kt index 9a242101..0c79d4c6 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/models/UpdaterDialogData.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogData.kt @@ -1,17 +1,17 @@ -package com.pouyaheydari.appupdater.compose.models +package com.pouyaheydari.appupdater.compose.ui.models import android.graphics.Typeface import com.pouyaheydari.appupdater.core.pojo.StoreListItem import com.pouyaheydari.appupdater.core.pojo.Theme /** - * This model is used to pass data to config the [com.pouyaheydari.appupdater.compose.AndroidAppUpdater] + * This model is used to pass data to config the [com.pouyaheydari.appupdater.compose.ui.AndroidAppUpdater] */ data class UpdaterDialogData( val dialogTitle: String = "", val dialogDescription: String = "", val storeList: List = listOf(), - val onDismissRequested: () -> Unit = {}, + inline val onDismissRequested: () -> Unit = {}, val typeface: Typeface? = null, val theme: Theme = Theme.SYSTEM_DEFAULT, ) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/models/UpdaterDialogUIData.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogUIData.kt similarity index 50% rename from compose/src/main/java/com/pouyaheydari/appupdater/compose/models/UpdaterDialogUIData.kt rename to compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogUIData.kt index bf570689..9ad5d343 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/models/UpdaterDialogUIData.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogUIData.kt @@ -1,16 +1,11 @@ -package com.pouyaheydari.appupdater.compose.models +package com.pouyaheydari.appupdater.compose.ui.models -import android.graphics.Typeface import com.pouyaheydari.appupdater.core.pojo.StoreListItem -/** - * This model is used to pass dialog content to [com.pouyaheydari.appupdater.compose.DialogContent] - */ internal data class UpdaterDialogUIData( val dialogHeader: DialogHeaderModel, val directDownloadList: List, val storeList: List, - val typeface: Typeface?, - val onClickListener: (StoreListItem) -> Unit, val shouldShowDividers: Boolean, + inline val onDismissRequested: () -> Unit = {}, ) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterViewModelData.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterViewModelData.kt new file mode 100644 index 00000000..7d170b22 --- /dev/null +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterViewModelData.kt @@ -0,0 +1,12 @@ +package com.pouyaheydari.appupdater.compose.ui.models + +import com.pouyaheydari.appupdater.core.pojo.StoreListItem +import com.pouyaheydari.appupdater.core.pojo.Theme + +internal data class UpdaterViewModelData( + val dialogTitle: String = "", + val dialogDescription: String = "", + val storeList: List = listOf(), + inline val onDismissRequested: () -> Unit = {}, + val theme: Theme = Theme.SYSTEM_DEFAULT, +) From 4f423a06a58cf63cd34523058022044cc277bd6e Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Wed, 10 Jan 2024 18:57:51 +0100 Subject: [PATCH 008/117] migrated compose module to MVI structure --- .../mapper/UpdaterDialogUIMapper.kt | 2 +- .../mapper/UpdaterViewModelDataMapper.kt | 2 +- .../compose/ui/AndroidAppUpdater.kt | 55 ++++++++++++------- .../compose/ui/AndroidAppUpdaterViewModel.kt | 47 ++++++++-------- .../ui/AndroidAppUpdaterViewModelFactory.kt | 4 +- .../components/DirectDownloadLinkComponent.kt | 4 +- .../ui/components/SquareStoreItemComponent.kt | 4 +- .../compose/ui/models/DialogScreenIntents.kt | 9 +++ .../compose/ui/models/DialogScreenState.kt | 13 +++++ .../compose/ui/models/DialogState.kt | 12 ---- .../compose/ui/models/UpdaterDialogUIData.kt | 8 +-- 11 files changed, 90 insertions(+), 70 deletions(-) rename compose/src/main/java/com/pouyaheydari/appupdater/compose/{domain => data}/mapper/UpdaterDialogUIMapper.kt (94%) rename compose/src/main/java/com/pouyaheydari/appupdater/compose/{domain => data}/mapper/UpdaterViewModelDataMapper.kt (90%) create mode 100644 compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenIntents.kt create mode 100644 compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenState.kt delete mode 100644 compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogState.kt diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/domain/mapper/UpdaterDialogUIMapper.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/data/mapper/UpdaterDialogUIMapper.kt similarity index 94% rename from compose/src/main/java/com/pouyaheydari/appupdater/compose/domain/mapper/UpdaterDialogUIMapper.kt rename to compose/src/main/java/com/pouyaheydari/appupdater/compose/data/mapper/UpdaterDialogUIMapper.kt index 6b0a7460..29497d4a 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/domain/mapper/UpdaterDialogUIMapper.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/data/mapper/UpdaterDialogUIMapper.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.compose.domain.mapper +package com.pouyaheydari.appupdater.compose.data.mapper import com.pouyaheydari.appupdater.compose.ui.models.DialogHeaderModel import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogUIData diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/domain/mapper/UpdaterViewModelDataMapper.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/data/mapper/UpdaterViewModelDataMapper.kt similarity index 90% rename from compose/src/main/java/com/pouyaheydari/appupdater/compose/domain/mapper/UpdaterViewModelDataMapper.kt rename to compose/src/main/java/com/pouyaheydari/appupdater/compose/data/mapper/UpdaterViewModelDataMapper.kt index 838777a4..05200234 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/domain/mapper/UpdaterViewModelDataMapper.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/data/mapper/UpdaterViewModelDataMapper.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.compose.domain.mapper +package com.pouyaheydari.appupdater.compose.data.mapper import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogData import com.pouyaheydari.appupdater.compose.ui.models.UpdaterViewModelData diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdater.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdater.kt index 1f77d91e..ee04109d 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdater.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdater.kt @@ -13,7 +13,7 @@ import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource @@ -26,7 +26,7 @@ import com.pouyaheydari.appupdater.compose.ui.components.DirectDownloadLinkCompo import com.pouyaheydari.appupdater.compose.ui.components.DividerComponent import com.pouyaheydari.appupdater.compose.ui.components.SquareStoreItemComponent import com.pouyaheydari.appupdater.compose.ui.components.UpdateInProgressDialogComponent -import com.pouyaheydari.appupdater.compose.ui.models.DialogState +import com.pouyaheydari.appupdater.compose.ui.models.DialogScreenIntents import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogData import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogUIData import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme @@ -34,9 +34,8 @@ import com.pouyaheydari.appupdater.compose.utils.getActivity import com.pouyaheydari.appupdater.compose.utils.getApkIfActivityIsNotNull import com.pouyaheydari.appupdater.compose.utils.isDarkThemeSelected import com.pouyaheydari.appupdater.compose.utils.storeList -import com.pouyaheydari.appupdater.core.pojo.DialogStates -import com.pouyaheydari.appupdater.core.pojo.StoreListItem import com.pouyaheydari.appupdater.core.pojo.Theme +import com.pouyaheydari.appupdater.core.stores.Stores import com.pouyaheydari.appupdater.core.R as coreR /** @@ -47,45 +46,55 @@ import com.pouyaheydari.appupdater.core.R as coreR @Composable fun AndroidAppUpdater(dialogData: UpdaterDialogData) { val viewModel: AndroidAppUpdaterViewModel = viewModel(factory = AndroidAppUpdaterViewModelFactory(dialogData)) + val state = viewModel.uiState.value AndroidAppUpdaterTheme(darkTheme = isDarkThemeSelected(dialogData.theme)) { - SubscribeToDialogState(viewModel, dialogData.typeface) - OnIntentReceived(viewModel) + if (state.shouldShowDialog) { + AppUpdaterDialog(state.dialogContent, viewModel::handleIntent, typeface = dialogData.typeface) + } + if (state.shouldShowUpdateInProgress) { + UpdateInProgressDialogComponent() + } + + SetupStoreOpener(state.selectedStore, state.shouldOpenStore) { + viewModel.handleIntent(DialogScreenIntents.OnStoreOpened) + } + SetupDirectApkDownload(state.downloadUrl, state.shouldStartAPKDownload) } } @Composable -private fun SubscribeToDialogState(viewModel: AndroidAppUpdaterViewModel, typeface: Typeface?) { - when (val value = viewModel.dialogState.collectAsState().value) { - is DialogState.ShowDialog -> AppUpdaterDialog(value.dialogContent, value.onItemClickListener, typeface = typeface) - DialogState.HideDialog -> { // Do nothing +private fun SetupDirectApkDownload(url: String, shouldStartAPKDownload: Boolean) { + val activity = LocalContext.current.getActivity() + + LaunchedEffect(key1 = url) { + if (shouldStartAPKDownload) { + getApkIfActivityIsNotNull(activity, url) } } } @Composable -private fun OnIntentReceived(viewModel: AndroidAppUpdaterViewModel) { +private fun SetupStoreOpener(store: Stores?, shouldOpenStore: Boolean, onStoreOpenedListener: () -> Unit) { val activity = LocalContext.current.getActivity() - when (val value = viewModel.screenState.collectAsState().value) { - is DialogStates.DownloadApk -> getApkIfActivityIsNotNull(activity, value.apkUrl) - is DialogStates.OpenStore -> value.store?.showStore(activity) - DialogStates.ShowUpdateInProgress -> UpdateInProgressDialogComponent() - DialogStates.HideUpdateInProgress -> {} - DialogStates.Empty -> { // Just to avoid last state being populated over and over + LaunchedEffect(key1 = store) { + if (shouldOpenStore) { + store?.showStore(activity) } + onStoreOpenedListener() } } @Composable -private fun AppUpdaterDialog(dialogContent: UpdaterDialogUIData, onClickListener: (StoreListItem) -> Unit, typeface: Typeface?) { +private fun AppUpdaterDialog(dialogContent: UpdaterDialogUIData, onClickListener: (DialogScreenIntents) -> Unit, typeface: Typeface?) { Dialog(onDismissRequest = { dialogContent.onDismissRequested() }) { DialogContent(dialogContent, onClickListener, typeface) } } @Composable -private fun DialogContent(dialogContent: UpdaterDialogUIData, onClickListener: (StoreListItem) -> Unit, typeface: Typeface?) { +private fun DialogContent(dialogContent: UpdaterDialogUIData, onClickListener: (DialogScreenIntents) -> Unit, typeface: Typeface?) { Card( shape = RoundedCornerShape(12.dp), elevation = CardDefaults.cardElevation(8.dp), @@ -105,7 +114,9 @@ private fun DialogContent(dialogContent: UpdaterDialogUIData, onClickListener: ( } directDownloadList.forEach { item(span = { GridItemSpan(maxLineSpan) }) { - DirectDownloadLinkComponent(it, onClickListener) + DirectDownloadLinkComponent(it) { + onClickListener(DialogScreenIntents.OnDirectLinkClicked(it)) + } } } if (shouldShowDividers) { @@ -114,7 +125,9 @@ private fun DialogContent(dialogContent: UpdaterDialogUIData, onClickListener: ( storeList.forEach { item(span = { getStoreListGridItemSpan(storeList.size, maxLineSpan) }) { - SquareStoreItemComponent(it, onClickListener) + SquareStoreItemComponent(it) { + onClickListener(DialogScreenIntents.OnStoreClicked(it)) + } } } } diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt index e9e55967..9f4a9a04 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt @@ -1,21 +1,15 @@ package com.pouyaheydari.appupdater.compose.ui +import androidx.compose.runtime.State +import androidx.compose.runtime.mutableStateOf import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.pouyaheydari.appupdater.compose.domain.mapper.UpdaterDialogUIMapper -import com.pouyaheydari.appupdater.compose.ui.models.DialogState +import com.pouyaheydari.appupdater.compose.data.mapper.UpdaterDialogUIMapper +import com.pouyaheydari.appupdater.compose.ui.models.DialogScreenIntents +import com.pouyaheydari.appupdater.compose.ui.models.DialogScreenState import com.pouyaheydari.appupdater.compose.ui.models.UpdaterViewModelData import com.pouyaheydari.appupdater.core.interactors.GetIsUpdateInProgress -import com.pouyaheydari.appupdater.core.pojo.DialogStates -import com.pouyaheydari.appupdater.core.pojo.DialogStates.DownloadApk -import com.pouyaheydari.appupdater.core.pojo.DialogStates.Empty -import com.pouyaheydari.appupdater.core.pojo.DialogStates.HideUpdateInProgress -import com.pouyaheydari.appupdater.core.pojo.DialogStates.OpenStore -import com.pouyaheydari.appupdater.core.pojo.DialogStates.ShowUpdateInProgress -import com.pouyaheydari.appupdater.core.pojo.Store import com.pouyaheydari.appupdater.core.pojo.StoreListItem -import com.pouyaheydari.appupdater.core.utils.runWithDelay -import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch @@ -26,8 +20,9 @@ internal class AndroidAppUpdaterViewModel( viewModelData: UpdaterViewModelData, private val isUpdateInProgress: GetIsUpdateInProgress, ) : ViewModel() { - val dialogState = MutableStateFlow(DialogState.HideDialog) - val screenState = MutableStateFlow(Empty) + private val _uiState = mutableStateOf(DialogScreenState()) + val uiState: State + get() = _uiState init { showUpdaterDialog(viewModelData) @@ -35,36 +30,38 @@ internal class AndroidAppUpdaterViewModel( private fun showUpdaterDialog(viewModelData: UpdaterViewModelData) { val dialogContent = UpdaterDialogUIMapper.map(viewModelData) - dialogState.value = DialogState.ShowDialog(dialogContent, ::onListItemClicked) + updateState { copy(shouldShowDialog = true, dialogContent = dialogContent) } } - private fun onListItemClicked(item: StoreListItem) { - when (item.store) { - Store.DIRECT_URL -> startDirectUrlApkDownload(item) - else -> showAppInSelectedStore(item) + fun handleIntent(intent: DialogScreenIntents) { + when (intent) { + is DialogScreenIntents.OnDirectLinkClicked -> startDirectUrlApkDownload(intent.item) + is DialogScreenIntents.OnStoreClicked -> showAppInSelectedStore(intent.item) + DialogScreenIntents.OnStoreOpened -> updateState { copy(shouldOpenStore = false) } } } private fun showAppInSelectedStore(item: StoreListItem) { viewModelScope.launch { val store = item.store.provider?.getDeclaredConstructor()?.newInstance()?.also { it.setStoreData(item) } - screenState.value = OpenStore(store) - runWithDelay { - screenState.value = Empty - } + updateState { copy(selectedStore = store, shouldOpenStore = true) } } } private fun startDirectUrlApkDownload(item: StoreListItem) { observeUpdateProgress() - screenState.value = DownloadApk(item.url) + updateState { copy(shouldShowUpdateInProgress = true, shouldStartAPKDownload = true, downloadUrl = item.url) } } private fun observeUpdateProgress() { viewModelScope.launch { - isUpdateInProgress().collectLatest { - screenState.value = if (it) ShowUpdateInProgress else HideUpdateInProgress + isUpdateInProgress().collectLatest { updateInProgress -> + updateState { copy(shouldShowUpdateInProgress = updateInProgress, shouldStartAPKDownload = false, shouldOpenStore = false) } } } } + + private fun updateState(reduce: DialogScreenState.() -> DialogScreenState) { + _uiState.value = _uiState.value.reduce() + } } diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModelFactory.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModelFactory.kt index 9eee5b91..726a729a 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModelFactory.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModelFactory.kt @@ -2,11 +2,11 @@ package com.pouyaheydari.appupdater.compose.ui import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider -import com.pouyaheydari.appupdater.compose.domain.mapper.UpdaterViewModelDataMapper +import com.pouyaheydari.appupdater.compose.data.mapper.UpdaterViewModelDataMapper import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogData import com.pouyaheydari.appupdater.core.interactors.GetIsUpdateInProgress -class AndroidAppUpdaterViewModelFactory( +internal class AndroidAppUpdaterViewModelFactory( private val dialogData: UpdaterDialogData, private val getIsUpdateInProgress: GetIsUpdateInProgress = GetIsUpdateInProgress(), ) : ViewModelProvider.Factory { diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponent.kt index d1ab66d3..1dc5ac85 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponent.kt @@ -20,14 +20,14 @@ import com.pouyaheydari.appupdater.core.pojo.StoreListItem @Composable internal fun DirectDownloadLinkComponent( item: StoreListItem, - onClickListener: (StoreListItem) -> Unit = {}, + onClickListener: () -> Unit = {}, ) { Text( text = item.title, textAlign = TextAlign.Center, color = Blue, style = MaterialTheme.typography.bodyLarge, - modifier = Modifier.clickable { onClickListener(item) }, + modifier = Modifier.clickable { onClickListener() }, ) } diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt index 8e51b146..dd6a329e 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt @@ -25,10 +25,10 @@ import com.pouyaheydari.appupdater.core.pojo.StoreListItem @Composable internal fun SquareStoreItemComponent( item: StoreListItem, - onClickListener: (StoreListItem) -> Unit = {}, + onClickListener: () -> Unit = {}, ) { Column( - modifier = Modifier.clickable { onClickListener(item) }, + modifier = Modifier.clickable { onClickListener() }, horizontalAlignment = CenterHorizontally, ) { Image(painter = painterResource(id = item.icon), contentDescription = null) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenIntents.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenIntents.kt new file mode 100644 index 00000000..fc458e44 --- /dev/null +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenIntents.kt @@ -0,0 +1,9 @@ +package com.pouyaheydari.appupdater.compose.ui.models + +import com.pouyaheydari.appupdater.core.pojo.StoreListItem + +internal sealed interface DialogScreenIntents { + data class OnStoreClicked(val item: StoreListItem) : DialogScreenIntents + data class OnDirectLinkClicked(val item: StoreListItem) : DialogScreenIntents + data object OnStoreOpened : DialogScreenIntents +} diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenState.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenState.kt new file mode 100644 index 00000000..9b6d2fc4 --- /dev/null +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenState.kt @@ -0,0 +1,13 @@ +package com.pouyaheydari.appupdater.compose.ui.models + +import com.pouyaheydari.appupdater.core.stores.Stores + +internal data class DialogScreenState( + val shouldShowDialog: Boolean = true, + val shouldShowUpdateInProgress: Boolean = false, + val selectedStore: Stores? = null, + val shouldOpenStore: Boolean = false, + val downloadUrl: String = "", + val shouldStartAPKDownload: Boolean = false, + val dialogContent: UpdaterDialogUIData = UpdaterDialogUIData(), +) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogState.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogState.kt deleted file mode 100644 index 2f29098e..00000000 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogState.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.pouyaheydari.appupdater.compose.ui.models - -import com.pouyaheydari.appupdater.core.pojo.StoreListItem - -internal sealed interface DialogState { - data class ShowDialog( - val dialogContent: UpdaterDialogUIData, - inline val onItemClickListener: (StoreListItem) -> Unit, - ) : DialogState - - data object HideDialog : DialogState -} diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogUIData.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogUIData.kt index 9ad5d343..2380905d 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogUIData.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogUIData.kt @@ -3,9 +3,9 @@ package com.pouyaheydari.appupdater.compose.ui.models import com.pouyaheydari.appupdater.core.pojo.StoreListItem internal data class UpdaterDialogUIData( - val dialogHeader: DialogHeaderModel, - val directDownloadList: List, - val storeList: List, - val shouldShowDividers: Boolean, + val dialogHeader: DialogHeaderModel = DialogHeaderModel(), + val directDownloadList: List = emptyList(), + val storeList: List = emptyList(), + val shouldShowDividers: Boolean = false, inline val onDismissRequested: () -> Unit = {}, ) From 6c9d90171d538b0210c1a2fa361c5e011b00f9d7 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Wed, 10 Jan 2024 19:28:02 +0100 Subject: [PATCH 009/117] hoisted onStoreClickListener and onDirectLinkClickListener --- .../ui/compose/ComposeSampleActivity.kt | 5 +- .../utils/ComposePreviewData.kt | 91 +++++++++++ ...daterDSLStoreList.kt => DSLPreviewData.kt} | 0 ...reList.kt => FragmentDialogPreviewData.kt} | 0 ...pUpdater.kt => AndroidAppUpdaterScreen.kt} | 91 ++--------- .../components/AppUpdaterDialogComponent.kt | 142 ++++++++++++++++++ .../compose/utils/AppUpdaterPreviewData.kt | 7 +- 7 files changed, 253 insertions(+), 83 deletions(-) create mode 100644 app/src/main/java/com/pouyaheydari/androidappupdater/utils/ComposePreviewData.kt rename app/src/main/java/com/pouyaheydari/androidappupdater/utils/{GetUpdaterDSLStoreList.kt => DSLPreviewData.kt} (100%) rename app/src/main/java/com/pouyaheydari/androidappupdater/utils/{GetUpdaterNormalStoreList.kt => FragmentDialogPreviewData.kt} (100%) rename compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/{AndroidAppUpdater.kt => AndroidAppUpdaterScreen.kt} (53%) create mode 100644 compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt b/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt index 47fe4cee..62ab04ae 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt +++ b/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt @@ -18,10 +18,11 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import com.pouyaheydari.androidappupdater.R import com.pouyaheydari.androidappupdater.ui.compose.theme.AndroidAppUpdaterTheme +import com.pouyaheydari.androidappupdater.utils.directDownloadList import com.pouyaheydari.androidappupdater.utils.getNormalList +import com.pouyaheydari.androidappupdater.utils.storeList import com.pouyaheydari.appupdater.compose.ui.AndroidAppUpdater import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogData -import com.pouyaheydari.appupdater.compose.utils.storeList import com.pouyaheydari.appupdater.core.pojo.Theme import com.pouyaheydari.appupdater.core.R as coreR @@ -66,7 +67,7 @@ private fun DefaultPreview() { UpdaterDialogData( dialogTitle = stringResource(id = coreR.string.appupdater_app_name), dialogDescription = stringResource(id = R.string.library_description), - storeList = storeList, + storeList = directDownloadList + storeList, theme = Theme.DARK, ), ) diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/utils/ComposePreviewData.kt b/app/src/main/java/com/pouyaheydari/androidappupdater/utils/ComposePreviewData.kt new file mode 100644 index 00000000..acb3e429 --- /dev/null +++ b/app/src/main/java/com/pouyaheydari/androidappupdater/utils/ComposePreviewData.kt @@ -0,0 +1,91 @@ +package com.pouyaheydari.androidappupdater.utils + +import com.pouyaheydari.appupdater.core.pojo.Store +import com.pouyaheydari.appupdater.core.pojo.StoreListItem +import com.pouyaheydari.appupdater.core.R as coreR + +internal val directDownloadList = listOf( + StoreListItem( + store = Store.DIRECT_URL, + title = "Direct Download 1", + icon = coreR.drawable.appupdater_ic_cloud, + url = APK_URL, + packageName = SAMPLE_PACKAGE_NAME, + ), + StoreListItem( + store = Store.DIRECT_URL, + title = "Direct Download 2", + icon = coreR.drawable.appupdater_ic_cloud, + url = APK_URL, + packageName = SAMPLE_PACKAGE_NAME, + ), +) + +internal val storeList = listOf( + StoreListItem( + Store.GOOGLE_PLAY, + "Google Play", + packageName = SAMPLE_PACKAGE_NAME, + icon = coreR.drawable.appupdater_ic_google_play, + ), + StoreListItem( + Store.CAFE_BAZAAR, + "Cafe Bazaar", + packageName = SAMPLE_PACKAGE_NAME, + icon = coreR.drawable.appupdater_ic_bazar, + ), + StoreListItem( + Store.MYKET, + "Myket", + packageName = SAMPLE_PACKAGE_NAME, + icon = coreR.drawable.appupdater_ic_myket, + ), + StoreListItem( + Store.HUAWEI_APP_GALLERY, + "App Gallery", + packageName = SAMPLE_PACKAGE_NAME, + icon = coreR.drawable.appupdater_ic_app_gallery, + ), + StoreListItem( + Store.SAMSUNG_GALAXY_STORE, + "Galaxy Store", + packageName = SAMPLE_PACKAGE_NAME, + icon = coreR.drawable.appupdater_ic_galaxy_store, + ), + StoreListItem( + Store.AMAZON_APP_STORE, + "Amazon App Store", + packageName = SAMPLE_PACKAGE_NAME, + icon = coreR.drawable.appupdater_ic_amazon_app_store, + ), + StoreListItem( + Store.APTOIDE, + "Aptoide", + packageName = SAMPLE_PACKAGE_NAME, + icon = coreR.drawable.appupdater_ic_aptoide, + ), + StoreListItem( + Store.FDROID, + "FDroid", + packageName = FDROID_SAMPLE_PACKAGE_NAME, + icon = coreR.drawable.appupdater_ic_fdroid, + ), + StoreListItem( + Store.MI_GET_APP_STORE, + "Mi GetApp", + packageName = GET_APP_SAMPLE_PACKAGE_NAME, + icon = coreR.drawable.appupdater_ic_get_app_store, + ), + StoreListItem( + Store.ONE_STORE_APP_MARKET, + "One Store", + packageName = ONE_STORE_SAMPLE_PACKAGE_NAME, + icon = coreR.drawable.appupdater_ic_one_store, + ), + StoreListItem( + Store.OPPO_APP_MARKET, + "Oppo App Market", + packageName = SAMPLE_PACKAGE_NAME, + icon = coreR.drawable.appupdater_ic_oppo_app_market, + ), +) diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/utils/GetUpdaterDSLStoreList.kt b/app/src/main/java/com/pouyaheydari/androidappupdater/utils/DSLPreviewData.kt similarity index 100% rename from app/src/main/java/com/pouyaheydari/androidappupdater/utils/GetUpdaterDSLStoreList.kt rename to app/src/main/java/com/pouyaheydari/androidappupdater/utils/DSLPreviewData.kt diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/utils/GetUpdaterNormalStoreList.kt b/app/src/main/java/com/pouyaheydari/androidappupdater/utils/FragmentDialogPreviewData.kt similarity index 100% rename from app/src/main/java/com/pouyaheydari/androidappupdater/utils/GetUpdaterNormalStoreList.kt rename to app/src/main/java/com/pouyaheydari/androidappupdater/utils/FragmentDialogPreviewData.kt diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdater.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt similarity index 53% rename from compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdater.kt rename to compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt index ee04109d..9e6b880e 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdater.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt @@ -1,39 +1,21 @@ package com.pouyaheydari.appupdater.compose.ui -import android.graphics.Typeface -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.grid.GridCells -import androidx.compose.foundation.lazy.grid.GridItemSpan -import androidx.compose.foundation.lazy.grid.LazyVerticalGrid -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.Card -import androidx.compose.material3.CardDefaults -import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import androidx.compose.ui.window.Dialog import androidx.lifecycle.viewmodel.compose.viewModel -import com.pouyaheydari.appupdater.compose.ui.components.DialogHeaderComponent -import com.pouyaheydari.appupdater.compose.ui.components.DirectDownloadLinkComponent -import com.pouyaheydari.appupdater.compose.ui.components.DividerComponent -import com.pouyaheydari.appupdater.compose.ui.components.SquareStoreItemComponent +import com.pouyaheydari.appupdater.compose.ui.components.AppUpdaterDialog import com.pouyaheydari.appupdater.compose.ui.components.UpdateInProgressDialogComponent import com.pouyaheydari.appupdater.compose.ui.models.DialogScreenIntents import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogData -import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogUIData import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme import com.pouyaheydari.appupdater.compose.utils.getActivity import com.pouyaheydari.appupdater.compose.utils.getApkIfActivityIsNotNull import com.pouyaheydari.appupdater.compose.utils.isDarkThemeSelected -import com.pouyaheydari.appupdater.compose.utils.storeList +import com.pouyaheydari.appupdater.compose.utils.previewDirectDownloadListData +import com.pouyaheydari.appupdater.compose.utils.previewStoreListData import com.pouyaheydari.appupdater.core.pojo.Theme import com.pouyaheydari.appupdater.core.stores.Stores import com.pouyaheydari.appupdater.core.R as coreR @@ -50,7 +32,12 @@ fun AndroidAppUpdater(dialogData: UpdaterDialogData) { AndroidAppUpdaterTheme(darkTheme = isDarkThemeSelected(dialogData.theme)) { if (state.shouldShowDialog) { - AppUpdaterDialog(state.dialogContent, viewModel::handleIntent, typeface = dialogData.typeface) + AppUpdaterDialog( + dialogContent = state.dialogContent, + onStoreClickListener = { viewModel.handleIntent(DialogScreenIntents.OnStoreClicked(it)) }, + onDirectLinkClickListener = { viewModel.handleIntent(DialogScreenIntents.OnDirectLinkClicked(it)) }, + typeface = dialogData.typeface, + ) } if (state.shouldShowUpdateInProgress) { UpdateInProgressDialogComponent() @@ -86,58 +73,6 @@ private fun SetupStoreOpener(store: Stores?, shouldOpenStore: Boolean, onStoreOp } } -@Composable -private fun AppUpdaterDialog(dialogContent: UpdaterDialogUIData, onClickListener: (DialogScreenIntents) -> Unit, typeface: Typeface?) { - Dialog(onDismissRequest = { dialogContent.onDismissRequested() }) { - DialogContent(dialogContent, onClickListener, typeface) - } -} - -@Composable -private fun DialogContent(dialogContent: UpdaterDialogUIData, onClickListener: (DialogScreenIntents) -> Unit, typeface: Typeface?) { - Card( - shape = RoundedCornerShape(12.dp), - elevation = CardDefaults.cardElevation(8.dp), - colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surface), - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 16.dp), - ) { - LazyVerticalGrid( - columns = GridCells.Fixed(2), - verticalArrangement = Arrangement.spacedBy(32.dp), - contentPadding = PaddingValues(vertical = 16.dp), - ) { - with(dialogContent) { - item(span = { GridItemSpan(maxLineSpan) }) { - DialogHeaderComponent(dialogHeader, typeface) - } - directDownloadList.forEach { - item(span = { GridItemSpan(maxLineSpan) }) { - DirectDownloadLinkComponent(it) { - onClickListener(DialogScreenIntents.OnDirectLinkClicked(it)) - } - } - } - if (shouldShowDividers) { - item(span = { GridItemSpan(maxLineSpan) }) { DividerComponent() } - } - - storeList.forEach { - item(span = { getStoreListGridItemSpan(storeList.size, maxLineSpan) }) { - SquareStoreItemComponent(it) { - onClickListener(DialogScreenIntents.OnStoreClicked(it)) - } - } - } - } - } - } -} - -private fun getStoreListGridItemSpan(storeListSize: Int, maxLineSpan: Int) = - if (storeListSize > 1) GridItemSpan(1) else GridItemSpan(maxLineSpan) - @Preview(showBackground = true) @Composable private fun LightPreview() { @@ -146,7 +81,7 @@ private fun LightPreview() { UpdaterDialogData( dialogTitle = stringResource(id = coreR.string.appupdater_app_name), dialogDescription = stringResource(id = coreR.string.appupdater_download_notification_desc), - storeList = storeList, + storeList = previewDirectDownloadListData + previewStoreListData, theme = Theme.LIGHT, ), ) @@ -161,7 +96,7 @@ private fun LightPreviewSingleStoreItem() { UpdaterDialogData( dialogTitle = stringResource(id = coreR.string.appupdater_app_name), dialogDescription = stringResource(id = coreR.string.appupdater_download_notification_desc), - storeList = storeList.subList(2, 3), + storeList = previewStoreListData.subList(0, 1), theme = Theme.LIGHT, ), ) @@ -176,7 +111,7 @@ private fun LightPreviewSingleDirectLinkItem() { UpdaterDialogData( dialogTitle = stringResource(id = coreR.string.appupdater_app_name), dialogDescription = stringResource(id = coreR.string.appupdater_download_notification_desc), - storeList = storeList.subList(0, 1), + storeList = previewDirectDownloadListData.subList(0, 1), theme = Theme.LIGHT, ), ) @@ -191,7 +126,7 @@ private fun DarkPreview() { UpdaterDialogData( dialogTitle = stringResource(id = coreR.string.appupdater_app_name), dialogDescription = stringResource(id = coreR.string.appupdater_download_notification_desc), - storeList = storeList, + storeList = previewDirectDownloadListData + previewStoreListData, theme = Theme.DARK, ), ) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt new file mode 100644 index 00000000..0bbeb1d3 --- /dev/null +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt @@ -0,0 +1,142 @@ +package com.pouyaheydari.appupdater.compose.ui.components + +import android.graphics.Typeface +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.GridItemSpan +import androidx.compose.foundation.lazy.grid.LazyVerticalGrid +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Dialog +import com.pouyaheydari.appupdater.compose.ui.models.DialogHeaderModel +import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogUIData +import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme +import com.pouyaheydari.appupdater.compose.utils.previewDirectDownloadListData +import com.pouyaheydari.appupdater.compose.utils.previewStoreListData +import com.pouyaheydari.appupdater.core.R +import com.pouyaheydari.appupdater.core.pojo.StoreListItem + +@Composable +internal fun AppUpdaterDialog( + dialogContent: UpdaterDialogUIData, + onStoreClickListener: (StoreListItem) -> Unit = {}, + onDirectLinkClickListener: (StoreListItem) -> Unit = {}, + typeface: Typeface? = null, +) { + Dialog(onDismissRequest = { dialogContent.onDismissRequested() }) { + DialogContent(dialogContent, onStoreClickListener, onDirectLinkClickListener, typeface) + } +} + +@Composable +private fun DialogContent( + dialogContent: UpdaterDialogUIData, + onStoreClickListener: (StoreListItem) -> Unit, + onDirectLinkClickListener: (StoreListItem) -> Unit, + typeface: Typeface?, +) { + Card( + shape = RoundedCornerShape(12.dp), + elevation = CardDefaults.cardElevation(8.dp), + colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surface), + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 16.dp), + ) { + LazyVerticalGrid( + columns = GridCells.Fixed(2), + verticalArrangement = Arrangement.spacedBy(32.dp), + contentPadding = PaddingValues(vertical = 16.dp), + ) { + with(dialogContent) { + item(span = { GridItemSpan(maxLineSpan) }) { + DialogHeaderComponent(dialogHeader, typeface) + } + directDownloadList.forEach { + item(span = { GridItemSpan(maxLineSpan) }) { + DirectDownloadLinkComponent(it) { onDirectLinkClickListener(it) } + } + } + if (shouldShowDividers) { + item(span = { GridItemSpan(maxLineSpan) }) { DividerComponent() } + } + + storeList.forEach { + item(span = { getStoreListGridItemSpan(storeList.size, maxLineSpan) }) { + SquareStoreItemComponent(it) { onStoreClickListener(it) } + } + } + } + } + } +} + +private fun getStoreListGridItemSpan(storeListSize: Int, maxLineSpan: Int) = + if (storeListSize > 1) GridItemSpan(1) else GridItemSpan(maxLineSpan) + +@Preview(showBackground = true) +@Composable +private fun Preview() { + AndroidAppUpdaterTheme { + AppUpdaterDialog( + dialogContent = UpdaterDialogUIData( + dialogHeader = DialogHeaderModel( + dialogTitle = stringResource(id = R.string.appupdater_app_name), + dialogDescription = stringResource(id = R.string.appupdater_download_notification_desc), + ), + directDownloadList = previewDirectDownloadListData, + storeList = previewStoreListData, + shouldShowDividers = false, + onDismissRequested = {}, + ), + ) + } +} + +@Preview(showBackground = true) +@Composable +private fun PreviewSingleStoreItem() { + AndroidAppUpdaterTheme { + AppUpdaterDialog( + dialogContent = UpdaterDialogUIData( + dialogHeader = DialogHeaderModel( + dialogTitle = stringResource(id = R.string.appupdater_app_name), + dialogDescription = stringResource(id = R.string.appupdater_download_notification_desc), + ), + directDownloadList = listOf(), + storeList = previewStoreListData.subList(0, 1), + shouldShowDividers = false, + onDismissRequested = {}, + ), + ) + } +} + +@Preview(showBackground = true) +@Composable +private fun PreviewSingleDirectLinkItem() { + AndroidAppUpdaterTheme { + AppUpdaterDialog( + dialogContent = UpdaterDialogUIData( + dialogHeader = DialogHeaderModel( + dialogTitle = stringResource(id = R.string.appupdater_app_name), + dialogDescription = stringResource(id = R.string.appupdater_download_notification_desc), + ), + directDownloadList = previewDirectDownloadListData.subList(0, 1), + storeList = listOf(), + shouldShowDividers = false, + onDismissRequested = {}, + ), + ) + } +} diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/AppUpdaterPreviewData.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/AppUpdaterPreviewData.kt index 8d0e96da..e9eb4829 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/AppUpdaterPreviewData.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/AppUpdaterPreviewData.kt @@ -10,8 +10,7 @@ private const val FDROID_SAMPLE_PACKAGE_NAME = "de.storchp.fdroidbuildstatus" private const val GET_APP_SAMPLE_PACKAGE_NAME = "com.opera.browser" private const val ONE_STORE_SAMPLE_PACKAGE_NAME = "com.kakao.talk" -val storeList = listOf( - // direct download +internal val previewDirectDownloadListData = listOf( StoreListItem( store = Store.DIRECT_URL, title = "Direct Download 1", @@ -26,7 +25,9 @@ val storeList = listOf( url = CUSTOM_URL, packageName = SAMPLE_PACKAGE_NAME, ), - // stores +) + +internal val previewStoreListData = listOf( StoreListItem( Store.GOOGLE_PLAY, "Google Play", From 58fa3c6eca9ef073b45be5263a0c704884ece314 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Wed, 10 Jan 2024 19:39:40 +0100 Subject: [PATCH 010/117] Removed usages of StoreListItem in inner compose components --- .../components/AppUpdaterDialogComponent.kt | 6 ++--- .../ui/components/DialogHeaderComponent.kt | 26 +++++++++---------- .../components/DirectDownloadLinkComponent.kt | 18 ++++--------- .../compose/ui/components/DividerComponent.kt | 4 +-- .../ui/components/SquareStoreItemComponent.kt | 22 +++++++--------- .../UpdateInProgressDialogComponent.kt | 4 +-- 6 files changed, 34 insertions(+), 46 deletions(-) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt index 0bbeb1d3..77557c74 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt @@ -60,11 +60,11 @@ private fun DialogContent( ) { with(dialogContent) { item(span = { GridItemSpan(maxLineSpan) }) { - DialogHeaderComponent(dialogHeader, typeface) + DialogHeaderComponent(content = dialogHeader, typeface = typeface) } directDownloadList.forEach { item(span = { GridItemSpan(maxLineSpan) }) { - DirectDownloadLinkComponent(it) { onDirectLinkClickListener(it) } + DirectDownloadLinkComponent(title = it.title) { onDirectLinkClickListener(it) } } } if (shouldShowDividers) { @@ -73,7 +73,7 @@ private fun DialogContent( storeList.forEach { item(span = { getStoreListGridItemSpan(storeList.size, maxLineSpan) }) { - SquareStoreItemComponent(it) { onStoreClickListener(it) } + SquareStoreItemComponent(title = it.title, icon = it.icon) { onStoreClickListener(it) } } } } diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DialogHeaderComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DialogHeaderComponent.kt index 84088bb1..5445c566 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DialogHeaderComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DialogHeaderComponent.kt @@ -25,37 +25,37 @@ import com.pouyaheydari.appupdater.core.R as coreR /** * Shows header icon, title and description * - * @param data DialogHeaderComponentModel + * @param content DialogHeaderComponentModel */ @Composable -internal fun DialogHeaderComponent(data: DialogHeaderModel, typeface: Typeface?) { - Column(horizontalAlignment = CenterHorizontally) { +internal fun DialogHeaderComponent(modifier: Modifier = Modifier, content: DialogHeaderModel, typeface: Typeface?) { + Column(modifier = modifier, horizontalAlignment = CenterHorizontally) { Image( - painter = painterResource(id = coreR.drawable.appupdater_ic_cloud), - contentDescription = null, modifier = Modifier .width(100.dp) .height(100.dp), + painter = painterResource(id = coreR.drawable.appupdater_ic_cloud), + contentDescription = null, ) Text( + modifier = Modifier + .fillMaxWidth() + .padding(all = 8.dp), textAlign = TextAlign.Center, - text = data.dialogTitle, + text = content.dialogTitle, color = MaterialTheme.colorScheme.onSurface, style = MaterialTheme.typography.titleLarge, fontFamily = typeface?.let { FontFamily(it) }, + ) + Text( modifier = Modifier .fillMaxWidth() .padding(all = 8.dp), - ) - Text( textAlign = TextAlign.Center, - text = data.dialogDescription, + text = content.dialogDescription, color = MaterialTheme.colorScheme.onSurface, style = MaterialTheme.typography.bodyMedium, fontFamily = typeface?.let { FontFamily(it) }, - modifier = Modifier - .fillMaxWidth() - .padding(all = 8.dp), ) } } @@ -65,7 +65,7 @@ internal fun DialogHeaderComponent(data: DialogHeaderModel, typeface: Typeface?) private fun Preview() { AndroidAppUpdaterTheme { DialogHeaderComponent( - data = DialogHeaderModel( + content = DialogHeaderModel( dialogTitle = stringResource(id = coreR.string.appupdater_app_name), dialogDescription = stringResource(id = coreR.string.appupdater_download_notification_desc), ), diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponent.kt index 1dc5ac85..e16b2e35 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponent.kt @@ -9,25 +9,19 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme import com.pouyaheydari.appupdater.compose.ui.theme.Blue -import com.pouyaheydari.appupdater.core.pojo.StoreListItem -/** - * Shows direct download link's text - * - * @param item of type [StoreListItem] to show the title and return it in onClick event - * @param onClickListener informs parent about selected item - */ @Composable internal fun DirectDownloadLinkComponent( - item: StoreListItem, + modifier: Modifier = Modifier, + title: String, onClickListener: () -> Unit = {}, ) { Text( - text = item.title, + modifier = modifier.clickable { onClickListener() }, + text = title, textAlign = TextAlign.Center, color = Blue, style = MaterialTheme.typography.bodyLarge, - modifier = Modifier.clickable { onClickListener() }, ) } @@ -35,8 +29,6 @@ internal fun DirectDownloadLinkComponent( @Composable private fun Preview() { AndroidAppUpdaterTheme { - DirectDownloadLinkComponent( - item = StoreListItem(title = "Direct Link 1"), - ) + DirectDownloadLinkComponent(title = "Direct Link 1") } } diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt index 433ba482..6268f4e5 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt @@ -19,10 +19,10 @@ import com.pouyaheydari.appupdater.core.R as coreR * Shows a divider between direct download links and stores */ @Composable -internal fun DividerComponent() { +internal fun DividerComponent(modifier: Modifier = Modifier) { Row( verticalAlignment = Alignment.CenterVertically, - modifier = Modifier + modifier = modifier .fillMaxWidth() .padding(top = 16.dp), ) { diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt index dd6a329e..707fa7ff 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt @@ -1,5 +1,6 @@ package com.pouyaheydari.appupdater.compose.ui.components +import androidx.annotation.DrawableRes import androidx.compose.foundation.Image import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column @@ -14,29 +15,24 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme import com.pouyaheydari.appupdater.core.R -import com.pouyaheydari.appupdater.core.pojo.StoreListItem -/** - * Shows stores in a square shape - * - * @param item of type [StoreListItem] to show the title and return it in onClick event - * @param onClickListener informs parent about selected item - */ @Composable internal fun SquareStoreItemComponent( - item: StoreListItem, + modifier: Modifier = Modifier, + title: String, + @DrawableRes icon: Int, onClickListener: () -> Unit = {}, ) { Column( - modifier = Modifier.clickable { onClickListener() }, + modifier = modifier.clickable { onClickListener() }, horizontalAlignment = CenterHorizontally, ) { - Image(painter = painterResource(id = item.icon), contentDescription = null) + Image(painter = painterResource(id = icon), contentDescription = null) Text( - text = item.title, + modifier = Modifier.padding(top = 8.dp), + text = title, style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurface, - modifier = Modifier.padding(top = 8.dp), ) } } @@ -45,6 +41,6 @@ internal fun SquareStoreItemComponent( @Composable private fun Preview() { AndroidAppUpdaterTheme { - SquareStoreItemComponent(item = StoreListItem(icon = R.drawable.appupdater_ic_google_play)) + SquareStoreItemComponent(title = "Google Play", icon = R.drawable.appupdater_ic_google_play) } } diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt index 3a8db9f2..b57a9aa2 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt @@ -22,13 +22,13 @@ import com.pouyaheydari.appupdater.core.R as coreR * Update in progress dialog is not dismissible by the user. */ @Composable -internal fun UpdateInProgressDialogComponent() { +internal fun UpdateInProgressDialogComponent(modifier: Modifier = Modifier) { Dialog(onDismissRequest = { /* Do nothing */ }) { Card( + modifier = modifier.fillMaxWidth(), shape = RoundedCornerShape(12.dp), elevation = CardDefaults.cardElevation(8.dp), colors = CardDefaults.cardColors(MaterialTheme.colorScheme.surface), - modifier = Modifier.fillMaxWidth(), ) { Column( modifier = Modifier From 7c2833d2ed2edada9062f9e45c6e81e1b88acd2e Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Thu, 11 Jan 2024 10:14:29 +0100 Subject: [PATCH 011/117] Moved DialogStates to appupdater module --- .../main/java/com/pouyaheydari/appupdater/AppUpdaterDialog.kt | 2 +- .../java/com/pouyaheydari/appupdater/AppUpdaterViewModel.kt | 3 +-- .../java/com/pouyaheydari/appupdater}/pojo/DialogStates.kt | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) rename {core/src/main/java/com/pouyaheydari/appupdater/core => appupdater/src/main/java/com/pouyaheydari/appupdater}/pojo/DialogStates.kt (89%) diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterDialog.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterDialog.kt index 0526acf6..8b1ede95 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterDialog.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterDialog.kt @@ -18,7 +18,6 @@ import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.GridLayoutManager import com.pouyaheydari.appupdater.adapters.DirectRecyclerAdapter import com.pouyaheydari.appupdater.adapters.StoresRecyclerAdapter -import com.pouyaheydari.appupdater.core.pojo.DialogStates import com.pouyaheydari.appupdater.core.pojo.Store.DIRECT_URL import com.pouyaheydari.appupdater.core.pojo.StoreListItem import com.pouyaheydari.appupdater.core.pojo.Theme @@ -26,6 +25,7 @@ import com.pouyaheydari.appupdater.core.utils.getApk import com.pouyaheydari.appupdater.core.utils.shouldShowStoresDivider import com.pouyaheydari.appupdater.databinding.FragmentAppUpdaterDialogBinding import com.pouyaheydari.appupdater.mapper.mapToSelectedTheme +import com.pouyaheydari.appupdater.pojo.DialogStates import com.pouyaheydari.appupdater.pojo.UpdaterDialogData import com.pouyaheydari.appupdater.pojo.UpdaterFragmentModel import com.pouyaheydari.appupdater.pojo.UserSelectedTheme diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterViewModel.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterViewModel.kt index 75ca7ded..e01f45cd 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterViewModel.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterViewModel.kt @@ -3,10 +3,10 @@ package com.pouyaheydari.appupdater import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.pouyaheydari.appupdater.core.interactors.GetIsUpdateInProgress -import com.pouyaheydari.appupdater.core.pojo.DialogStates import com.pouyaheydari.appupdater.core.pojo.Store import com.pouyaheydari.appupdater.core.pojo.StoreListItem import com.pouyaheydari.appupdater.core.utils.runWithDelay +import com.pouyaheydari.appupdater.pojo.DialogStates import com.pouyaheydari.appupdater.utils.TypefaceHolder import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.collectLatest @@ -16,7 +16,6 @@ import kotlinx.coroutines.launch * View Model of [AppUpdaterDialog] */ internal class AppUpdaterViewModel : ViewModel() { - val screenState = MutableStateFlow(DialogStates.HideUpdateInProgress) fun onListListener(item: StoreListItem) { diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/pojo/DialogStates.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/DialogStates.kt similarity index 89% rename from core/src/main/java/com/pouyaheydari/appupdater/core/pojo/DialogStates.kt rename to appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/DialogStates.kt index 7025aa35..8a66c66c 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/pojo/DialogStates.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/DialogStates.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.core.pojo +package com.pouyaheydari.appupdater.pojo import com.pouyaheydari.appupdater.core.stores.Stores From ae51927588b8584d48b44d2e0176023d1e6ddeb7 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Sat, 13 Jan 2024 18:26:00 +0100 Subject: [PATCH 012/117] Used Composition for AppStores and moved the app store object creation into the core module --- .../ui/android/MainActivity.kt | 3 +- .../ui/compose/ComposeSampleActivity.kt | 2 +- .../utils/ComposePreviewData.kt | 4 +- .../androidappupdater/utils/DSLPreviewData.kt | 4 +- .../utils/FragmentDialogPreviewData.kt | 6 +- .../appupdater/AppUpdaterDialog.kt | 11 +-- .../appupdater/AppUpdaterViewModel.kt | 9 +-- .../adapters/DirectRecyclerAdapter.kt | 4 +- .../adapters/StoresRecyclerAdapter.kt | 4 +- .../pouyaheydari/appupdater/dsl/DSLUtils.kt | 2 +- .../appupdater/mapper/SelectedThemeMapper.kt | 8 +-- .../appupdater/pojo/DialogStates.kt | 4 +- .../appupdater/pojo/UpdaterDialogData.kt | 4 +- .../appupdater/pojo/UpdaterFragmentModel.kt | 8 +-- .../data/mapper/UpdaterDialogUIMapper.kt | 2 +- .../compose/ui/AndroidAppUpdaterScreen.kt | 11 +-- .../compose/ui/AndroidAppUpdaterViewModel.kt | 7 +- .../components/AppUpdaterDialogComponent.kt | 2 +- .../compose/ui/models/DialogScreenIntents.kt | 2 +- .../compose/ui/models/DialogScreenState.kt | 4 +- .../compose/ui/models/UpdaterDialogData.kt | 4 +- .../compose/ui/models/UpdaterDialogUIData.kt | 2 +- .../compose/ui/models/UpdaterViewModelData.kt | 4 +- .../compose/utils/AppUpdaterPreviewData.kt | 4 +- .../compose/utils/IsDarkThemeSelected.kt | 2 +- .../core/stores/AmazonAppStoreTest.kt | 10 +-- .../appupdater/core/stores/AptoideTest.kt | 10 +-- .../core/stores/CafeBazaarStoreTest.kt | 10 +-- .../appupdater/core/stores/FDroidTest.kt | 10 +-- .../core/stores/GooglePlayStoreTest.kt | 11 ++- .../core/stores/HuaweiAppGalleryTest.kt | 10 +-- .../core/stores/LenovoAppCenterTest.kt | 10 +-- .../core/stores/MiGetAppStoreTest.kt | 10 +-- .../appupdater/core/stores/MyketStoreTest.kt | 10 +-- .../appupdater/core/stores/NineAppsTest.kt | 10 +-- .../core/stores/OneStoreAppMarketTest.kt | 10 +-- .../core/stores/OppoAppMarketTest.kt | 10 +-- .../core/stores/SamsungGalaxyStoreTest.kt | 10 +-- .../core/stores/TencentStoreTest.kt | 10 +-- .../appupdater/core/stores/VAppStoreTest.kt | 10 +-- .../core/stores/ZTEAppCenterTest.kt | 10 +-- .../core/data/model/ShowStoreModel.kt | 7 ++ .../core/{pojo => data/model}/Store.kt | 6 +- .../{pojo => data/model}/StoreListItem.kt | 4 +- .../core/{pojo => data/model}/Theme.kt | 2 +- .../appupdater/core/stores/AmazonAppStore.kt | 10 +-- .../appupdater/core/stores/AppStore.kt | 7 ++ .../appupdater/core/stores/Aptoide.kt | 10 +-- .../appupdater/core/stores/CafeBazaarStore.kt | 10 +-- .../appupdater/core/stores/FDroid.kt | 10 +-- .../appupdater/core/stores/GooglePlayStore.kt | 11 +-- .../core/stores/HuaweiAppGallery.kt | 10 +-- .../appupdater/core/stores/LenovoAppCenter.kt | 10 +-- .../appupdater/core/stores/MiGetAppStore.kt | 10 +-- .../appupdater/core/stores/MyketStore.kt | 10 +-- .../appupdater/core/stores/NineApps.kt | 10 +-- .../core/stores/OneStoreAppMarket.kt | 10 +-- .../appupdater/core/stores/OppoAppMarket.kt | 10 +-- .../core/stores/SamsungGalaxyStore.kt | 10 +-- .../appupdater/core/stores/Stores.kt | 68 ------------------- .../appupdater/core/stores/TencentAppStore.kt | 10 +-- .../appupdater/core/stores/VAppStore.kt | 10 +-- .../appupdater/core/stores/ZTEAppCenter.kt | 10 +-- .../appupdater/core/utils/StoreListUtil.kt | 4 +- .../appupdater/core/utils/StoreOpener.kt | 47 +++++++++++++ .../core/utils/StoreListUtilTest.kt | 5 +- 66 files changed, 256 insertions(+), 333 deletions(-) create mode 100644 core/src/main/java/com/pouyaheydari/appupdater/core/data/model/ShowStoreModel.kt rename core/src/main/java/com/pouyaheydari/appupdater/core/{pojo => data/model}/Store.kt (91%) rename core/src/main/java/com/pouyaheydari/appupdater/core/{pojo => data/model}/StoreListItem.kt (92%) rename core/src/main/java/com/pouyaheydari/appupdater/core/{pojo => data/model}/Theme.kt (63%) create mode 100644 core/src/main/java/com/pouyaheydari/appupdater/core/stores/AppStore.kt delete mode 100644 core/src/main/java/com/pouyaheydari/appupdater/core/stores/Stores.kt create mode 100644 core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreOpener.kt diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/android/MainActivity.kt b/app/src/main/java/com/pouyaheydari/androidappupdater/ui/android/MainActivity.kt index 3fd6a06b..4c2c4c5a 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/android/MainActivity.kt +++ b/app/src/main/java/com/pouyaheydari/androidappupdater/ui/android/MainActivity.kt @@ -10,7 +10,7 @@ import com.pouyaheydari.androidappupdater.ui.compose.ComposeSampleActivity import com.pouyaheydari.androidappupdater.utils.getDSLList import com.pouyaheydari.androidappupdater.utils.getNormalList import com.pouyaheydari.appupdater.AppUpdaterDialog -import com.pouyaheydari.appupdater.core.pojo.Theme +import com.pouyaheydari.appupdater.core.data.model.Theme import com.pouyaheydari.appupdater.dsl.updateDialogBuilder import com.pouyaheydari.appupdater.pojo.UpdaterDialogData @@ -21,7 +21,6 @@ private const val FONT_PATH = "fonts/vazir.ttf" * Main activity of the sample application */ internal class MainActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt b/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt index 62ab04ae..34700177 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt +++ b/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt @@ -23,7 +23,7 @@ import com.pouyaheydari.androidappupdater.utils.getNormalList import com.pouyaheydari.androidappupdater.utils.storeList import com.pouyaheydari.appupdater.compose.ui.AndroidAppUpdater import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogData -import com.pouyaheydari.appupdater.core.pojo.Theme +import com.pouyaheydari.appupdater.core.data.model.Theme import com.pouyaheydari.appupdater.core.R as coreR /** diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/utils/ComposePreviewData.kt b/app/src/main/java/com/pouyaheydari/androidappupdater/utils/ComposePreviewData.kt index acb3e429..b73a59ab 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/utils/ComposePreviewData.kt +++ b/app/src/main/java/com/pouyaheydari/androidappupdater/utils/ComposePreviewData.kt @@ -1,7 +1,7 @@ package com.pouyaheydari.androidappupdater.utils -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.Store +import com.pouyaheydari.appupdater.core.data.model.StoreListItem import com.pouyaheydari.appupdater.core.R as coreR internal val directDownloadList = listOf( diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/utils/DSLPreviewData.kt b/app/src/main/java/com/pouyaheydari/androidappupdater/utils/DSLPreviewData.kt index ff4edaa9..1faa47dd 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/utils/DSLPreviewData.kt +++ b/app/src/main/java/com/pouyaheydari/androidappupdater/utils/DSLPreviewData.kt @@ -2,12 +2,12 @@ package com.pouyaheydari.androidappupdater.utils import android.content.Context import com.pouyaheydari.androidappupdater.R -import com.pouyaheydari.appupdater.core.pojo.Store +import com.pouyaheydari.appupdater.core.data.model.Store import com.pouyaheydari.appupdater.dsl.store import com.pouyaheydari.appupdater.core.R as coreR /** - * @return A list of [com.pouyaheydari.appupdater.core.pojo.StoreListItem] to be used in the dsl sample code + * @return A list of [com.pouyaheydari.appupdater.core.data.model.StoreListItem] to be used in the dsl sample code */ internal fun getDSLList(context: Context) = listOf( store { diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/utils/FragmentDialogPreviewData.kt b/app/src/main/java/com/pouyaheydari/androidappupdater/utils/FragmentDialogPreviewData.kt index 1e139776..e94bd173 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/utils/FragmentDialogPreviewData.kt +++ b/app/src/main/java/com/pouyaheydari/androidappupdater/utils/FragmentDialogPreviewData.kt @@ -2,12 +2,12 @@ package com.pouyaheydari.androidappupdater.utils import android.content.Context import com.pouyaheydari.androidappupdater.R -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.Store +import com.pouyaheydari.appupdater.core.data.model.StoreListItem import com.pouyaheydari.appupdater.core.R as coreR /** - * @return A list of [com.pouyaheydari.appupdater.core.pojo.StoreListItem] to be used in the compose and fragment sample codes + * @return A list of [com.pouyaheydari.appupdater.core.data.model.StoreListItem] to be used in the compose and fragment sample codes */ internal fun getNormalList(context: Context) = listOf( // direct download diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterDialog.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterDialog.kt index 8b1ede95..19a97d17 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterDialog.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterDialog.kt @@ -18,11 +18,12 @@ import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.GridLayoutManager import com.pouyaheydari.appupdater.adapters.DirectRecyclerAdapter import com.pouyaheydari.appupdater.adapters.StoresRecyclerAdapter -import com.pouyaheydari.appupdater.core.pojo.Store.DIRECT_URL -import com.pouyaheydari.appupdater.core.pojo.StoreListItem -import com.pouyaheydari.appupdater.core.pojo.Theme +import com.pouyaheydari.appupdater.core.data.model.Store.DIRECT_URL +import com.pouyaheydari.appupdater.core.data.model.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.Theme import com.pouyaheydari.appupdater.core.utils.getApk import com.pouyaheydari.appupdater.core.utils.shouldShowStoresDivider +import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore import com.pouyaheydari.appupdater.databinding.FragmentAppUpdaterDialogBinding import com.pouyaheydari.appupdater.mapper.mapToSelectedTheme import com.pouyaheydari.appupdater.pojo.DialogStates @@ -98,7 +99,7 @@ class AppUpdaterDialog : DialogFragment() { .onEach { when (it) { is DialogStates.DownloadApk -> getApk(it.apkUrl, requireActivity()) - is DialogStates.OpenStore -> it.store?.showStore(requireContext()) + is DialogStates.OpenStore -> showAppInSelectedStore(context, it.store) DialogStates.HideUpdateInProgress -> hideUpdateInProgressDialog() DialogStates.ShowUpdateInProgress -> showUpdateInProgressDialog(theme) DialogStates.Empty -> hideUpdateInProgressDialog() @@ -209,7 +210,7 @@ class AppUpdaterDialog : DialogFragment() { /** * @param title Title of the dialog * @param description Description that is shown below the title - * @param storeList List of all stores that user can update your app from (including [com.pouyaheydari.appupdater.core.pojo.Store.DIRECT_URL]) + * @param storeList List of all stores that user can update your app from (including [com.pouyaheydari.appupdater.core.data.model.Store.DIRECT_URL]) * @param isForce Should the user be able to close the dialog? * @param typeface Typeface to be used in text views * diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterViewModel.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterViewModel.kt index e01f45cd..77de82a2 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterViewModel.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterViewModel.kt @@ -2,9 +2,10 @@ package com.pouyaheydari.appupdater import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel +import com.pouyaheydari.appupdater.core.data.model.Store +import com.pouyaheydari.appupdater.core.data.model.StoreListItem import com.pouyaheydari.appupdater.core.interactors.GetIsUpdateInProgress -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem import com.pouyaheydari.appupdater.core.utils.runWithDelay import com.pouyaheydari.appupdater.pojo.DialogStates import com.pouyaheydari.appupdater.utils.TypefaceHolder @@ -26,8 +27,8 @@ internal class AppUpdaterViewModel : ViewModel() { } else -> viewModelScope.launch { - val store = item.store.provider?.newInstance()?.also { it.setStoreData(item) } - screenState.value = DialogStates.OpenStore(store) + val storeModel = ShowStoreModel(item.packageName, item.store, item.url) + screenState.value = DialogStates.OpenStore(storeModel) runWithDelay { screenState.value = DialogStates.HideUpdateInProgress } diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/adapters/DirectRecyclerAdapter.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/adapters/DirectRecyclerAdapter.kt index 40eb9f04..0999bc09 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/adapters/DirectRecyclerAdapter.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/adapters/DirectRecyclerAdapter.kt @@ -4,7 +4,7 @@ import android.graphics.Typeface import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView -import com.pouyaheydari.appupdater.core.pojo.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.StoreListItem import com.pouyaheydari.appupdater.databinding.DownloadDirectItemBinding /** @@ -15,7 +15,6 @@ internal class DirectRecyclerAdapter( private val typeface: Typeface?, private val listener: (StoreListItem) -> Unit, ) : RecyclerView.Adapter() { - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SoresViewHolder = DownloadDirectItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) .run { SoresViewHolder(this) } @@ -28,7 +27,6 @@ internal class DirectRecyclerAdapter( * Direct download ViewHolder */ inner class SoresViewHolder(private val binding: DownloadDirectItemBinding) : RecyclerView.ViewHolder(binding.root) { - /** * Binds data to layout */ diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/adapters/StoresRecyclerAdapter.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/adapters/StoresRecyclerAdapter.kt index 16df5da4..86c1fae0 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/adapters/StoresRecyclerAdapter.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/adapters/StoresRecyclerAdapter.kt @@ -5,7 +5,7 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView -import com.pouyaheydari.appupdater.core.pojo.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.StoreListItem import com.pouyaheydari.appupdater.databinding.DownloadStoresItemBinding import com.pouyaheydari.appupdater.pojo.UserSelectedTheme import com.pouyaheydari.appupdater.pojo.UserSelectedTheme.DARK @@ -21,7 +21,6 @@ internal class StoresRecyclerAdapter( private val typeface: Typeface?, private val listener: (StoreListItem) -> Unit, ) : RecyclerView.Adapter() { - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = DownloadStoresItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) .run { SoresViewHolder(this) } @@ -34,7 +33,6 @@ internal class StoresRecyclerAdapter( * ViewHolder for stores adapter */ inner class SoresViewHolder(private val binding: DownloadStoresItemBinding) : RecyclerView.ViewHolder(binding.root) { - /** * Binds data to view */ diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/dsl/DSLUtils.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/dsl/DSLUtils.kt index 9eb58057..5d7af3a9 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/dsl/DSLUtils.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/dsl/DSLUtils.kt @@ -1,7 +1,7 @@ package com.pouyaheydari.appupdater.dsl import com.pouyaheydari.appupdater.AppUpdaterDialog -import com.pouyaheydari.appupdater.core.pojo.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.StoreListItem import com.pouyaheydari.appupdater.pojo.UpdaterDialogData /** diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/mapper/SelectedThemeMapper.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/mapper/SelectedThemeMapper.kt index dd1075a3..0ac8037e 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/mapper/SelectedThemeMapper.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/mapper/SelectedThemeMapper.kt @@ -2,10 +2,10 @@ package com.pouyaheydari.appupdater.mapper import android.content.Context import android.content.res.Configuration -import com.pouyaheydari.appupdater.core.pojo.Theme -import com.pouyaheydari.appupdater.core.pojo.Theme.DARK -import com.pouyaheydari.appupdater.core.pojo.Theme.LIGHT -import com.pouyaheydari.appupdater.core.pojo.Theme.SYSTEM_DEFAULT +import com.pouyaheydari.appupdater.core.data.model.Theme +import com.pouyaheydari.appupdater.core.data.model.Theme.DARK +import com.pouyaheydari.appupdater.core.data.model.Theme.LIGHT +import com.pouyaheydari.appupdater.core.data.model.Theme.SYSTEM_DEFAULT import com.pouyaheydari.appupdater.pojo.UserSelectedTheme /** diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/DialogStates.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/DialogStates.kt index 8a66c66c..a1aa6dc6 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/DialogStates.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/DialogStates.kt @@ -1,6 +1,6 @@ package com.pouyaheydari.appupdater.pojo -import com.pouyaheydari.appupdater.core.stores.Stores +import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel /** * Represents UI states of the update dialog @@ -9,6 +9,6 @@ sealed interface DialogStates { data object Empty : DialogStates data object ShowUpdateInProgress : DialogStates data object HideUpdateInProgress : DialogStates - data class OpenStore(val store: Stores?) : DialogStates + data class OpenStore(val store: ShowStoreModel) : DialogStates data class DownloadApk(val apkUrl: String) : DialogStates } diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/UpdaterDialogData.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/UpdaterDialogData.kt index b83ecd09..51ddac1b 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/UpdaterDialogData.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/UpdaterDialogData.kt @@ -1,8 +1,8 @@ package com.pouyaheydari.appupdater.pojo import android.graphics.Typeface -import com.pouyaheydari.appupdater.core.pojo.StoreListItem -import com.pouyaheydari.appupdater.core.pojo.Theme +import com.pouyaheydari.appupdater.core.data.model.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.Theme /** * This model is used to pass the data to dialog fragment via bundles diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/UpdaterFragmentModel.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/UpdaterFragmentModel.kt index e8340b46..ddf7ac43 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/UpdaterFragmentModel.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/UpdaterFragmentModel.kt @@ -2,8 +2,8 @@ package com.pouyaheydari.appupdater.pojo import android.os.Parcel import android.os.Parcelable -import com.pouyaheydari.appupdater.core.pojo.StoreListItem -import com.pouyaheydari.appupdater.core.pojo.Theme +import com.pouyaheydari.appupdater.core.data.model.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.Theme /** * This model is used to pass the data to dialog fragment via bundles @@ -15,13 +15,12 @@ data class UpdaterFragmentModel( var isForceUpdate: Boolean = false, var theme: Theme = Theme.SYSTEM_DEFAULT, ) : Parcelable { - constructor(parcel: Parcel) : this( parcel.readString().orEmpty(), parcel.readString().orEmpty(), parcel.createTypedArrayList(StoreListItem).orEmpty(), parcel.readByte() != 0.toByte(), - Theme.values()[parcel.readInt()], + Theme.entries[parcel.readInt()], ) override fun writeToParcel(parcel: Parcel, flags: Int) { @@ -37,7 +36,6 @@ data class UpdaterFragmentModel( } companion object CREATOR : Parcelable.Creator { - val EMPTY = UpdaterFragmentModel() override fun createFromParcel(parcel: Parcel): UpdaterFragmentModel { return UpdaterFragmentModel(parcel) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/data/mapper/UpdaterDialogUIMapper.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/data/mapper/UpdaterDialogUIMapper.kt index 29497d4a..86900b17 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/data/mapper/UpdaterDialogUIMapper.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/data/mapper/UpdaterDialogUIMapper.kt @@ -3,7 +3,7 @@ package com.pouyaheydari.appupdater.compose.data.mapper import com.pouyaheydari.appupdater.compose.ui.models.DialogHeaderModel import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogUIData import com.pouyaheydari.appupdater.compose.ui.models.UpdaterViewModelData -import com.pouyaheydari.appupdater.core.pojo.Store +import com.pouyaheydari.appupdater.core.data.model.Store import com.pouyaheydari.appupdater.core.utils.shouldShowStoresDivider internal object UpdaterDialogUIMapper { diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt index 9e6b880e..0d507fdf 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt @@ -16,8 +16,9 @@ import com.pouyaheydari.appupdater.compose.utils.getApkIfActivityIsNotNull import com.pouyaheydari.appupdater.compose.utils.isDarkThemeSelected import com.pouyaheydari.appupdater.compose.utils.previewDirectDownloadListData import com.pouyaheydari.appupdater.compose.utils.previewStoreListData -import com.pouyaheydari.appupdater.core.pojo.Theme -import com.pouyaheydari.appupdater.core.stores.Stores +import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel +import com.pouyaheydari.appupdater.core.data.model.Theme +import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore import com.pouyaheydari.appupdater.core.R as coreR /** @@ -62,12 +63,12 @@ private fun SetupDirectApkDownload(url: String, shouldStartAPKDownload: Boolean) } @Composable -private fun SetupStoreOpener(store: Stores?, shouldOpenStore: Boolean, onStoreOpenedListener: () -> Unit) { - val activity = LocalContext.current.getActivity() +private fun SetupStoreOpener(store: ShowStoreModel, shouldOpenStore: Boolean, onStoreOpenedListener: () -> Unit) { + val context = LocalContext.current LaunchedEffect(key1 = store) { if (shouldOpenStore) { - store?.showStore(activity) + showAppInSelectedStore(context, store) } onStoreOpenedListener() } diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt index 9f4a9a04..bab8bc44 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt @@ -8,8 +8,9 @@ import com.pouyaheydari.appupdater.compose.data.mapper.UpdaterDialogUIMapper import com.pouyaheydari.appupdater.compose.ui.models.DialogScreenIntents import com.pouyaheydari.appupdater.compose.ui.models.DialogScreenState import com.pouyaheydari.appupdater.compose.ui.models.UpdaterViewModelData +import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel +import com.pouyaheydari.appupdater.core.data.model.StoreListItem import com.pouyaheydari.appupdater.core.interactors.GetIsUpdateInProgress -import com.pouyaheydari.appupdater.core.pojo.StoreListItem import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch @@ -43,8 +44,8 @@ internal class AndroidAppUpdaterViewModel( private fun showAppInSelectedStore(item: StoreListItem) { viewModelScope.launch { - val store = item.store.provider?.getDeclaredConstructor()?.newInstance()?.also { it.setStoreData(item) } - updateState { copy(selectedStore = store, shouldOpenStore = true) } + val storeModel = ShowStoreModel(item.packageName, item.store, item.url) + updateState { copy(selectedStore = storeModel, shouldOpenStore = true) } } } diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt index 77557c74..7c7922be 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt @@ -24,7 +24,7 @@ import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme import com.pouyaheydari.appupdater.compose.utils.previewDirectDownloadListData import com.pouyaheydari.appupdater.compose.utils.previewStoreListData import com.pouyaheydari.appupdater.core.R -import com.pouyaheydari.appupdater.core.pojo.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.StoreListItem @Composable internal fun AppUpdaterDialog( diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenIntents.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenIntents.kt index fc458e44..038e58cc 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenIntents.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenIntents.kt @@ -1,6 +1,6 @@ package com.pouyaheydari.appupdater.compose.ui.models -import com.pouyaheydari.appupdater.core.pojo.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.StoreListItem internal sealed interface DialogScreenIntents { data class OnStoreClicked(val item: StoreListItem) : DialogScreenIntents diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenState.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenState.kt index 9b6d2fc4..41ef0458 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenState.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenState.kt @@ -1,11 +1,11 @@ package com.pouyaheydari.appupdater.compose.ui.models -import com.pouyaheydari.appupdater.core.stores.Stores +import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel internal data class DialogScreenState( val shouldShowDialog: Boolean = true, val shouldShowUpdateInProgress: Boolean = false, - val selectedStore: Stores? = null, + val selectedStore: ShowStoreModel = ShowStoreModel(), val shouldOpenStore: Boolean = false, val downloadUrl: String = "", val shouldStartAPKDownload: Boolean = false, diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogData.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogData.kt index 0c79d4c6..a17cfa90 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogData.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogData.kt @@ -1,8 +1,8 @@ package com.pouyaheydari.appupdater.compose.ui.models import android.graphics.Typeface -import com.pouyaheydari.appupdater.core.pojo.StoreListItem -import com.pouyaheydari.appupdater.core.pojo.Theme +import com.pouyaheydari.appupdater.core.data.model.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.Theme /** * This model is used to pass data to config the [com.pouyaheydari.appupdater.compose.ui.AndroidAppUpdater] diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogUIData.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogUIData.kt index 2380905d..6f95876e 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogUIData.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogUIData.kt @@ -1,6 +1,6 @@ package com.pouyaheydari.appupdater.compose.ui.models -import com.pouyaheydari.appupdater.core.pojo.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.StoreListItem internal data class UpdaterDialogUIData( val dialogHeader: DialogHeaderModel = DialogHeaderModel(), diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterViewModelData.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterViewModelData.kt index 7d170b22..e98854b2 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterViewModelData.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterViewModelData.kt @@ -1,7 +1,7 @@ package com.pouyaheydari.appupdater.compose.ui.models -import com.pouyaheydari.appupdater.core.pojo.StoreListItem -import com.pouyaheydari.appupdater.core.pojo.Theme +import com.pouyaheydari.appupdater.core.data.model.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.Theme internal data class UpdaterViewModelData( val dialogTitle: String = "", diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/AppUpdaterPreviewData.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/AppUpdaterPreviewData.kt index e9eb4829..15517505 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/AppUpdaterPreviewData.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/AppUpdaterPreviewData.kt @@ -1,7 +1,7 @@ package com.pouyaheydari.appupdater.compose.utils -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.Store +import com.pouyaheydari.appupdater.core.data.model.StoreListItem import com.pouyaheydari.appupdater.core.R as coreR private const val CUSTOM_URL = "https://cafebazaar.ir/download/bazaar.apk" diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/IsDarkThemeSelected.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/IsDarkThemeSelected.kt index 7147b992..4eeb7a9a 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/IsDarkThemeSelected.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/IsDarkThemeSelected.kt @@ -2,7 +2,7 @@ package com.pouyaheydari.appupdater.compose.utils import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.runtime.Composable -import com.pouyaheydari.appupdater.core.pojo.Theme +import com.pouyaheydari.appupdater.core.data.model.Theme /** * Returns if the dialog should be shown in dark mode based on the user selected [theme] diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/AmazonAppStoreTest.kt b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/AmazonAppStoreTest.kt index a0a4a376..3a27cf6e 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/AmazonAppStoreTest.kt +++ b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/AmazonAppStoreTest.kt @@ -6,8 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel +import com.pouyaheydari.appupdater.core.data.model.Store +import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -20,12 +21,11 @@ class AmazonAppStoreTest { @Test fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext - val amazonAppStore = AmazonAppStore() val packageName = appContext.packageName val url = "https://pouyaheydari.com" + val storeModel = ShowStoreModel(packageName, Store.AMAZON_APP_STORE, url) - amazonAppStore.setStoreData(StoreListItem(store = Store.AMAZON_APP_STORE, packageName = packageName, url = url)) - amazonAppStore.showStore(appContext) + showAppInSelectedStore(appContext, storeModel) Intents.intended(IntentMatchers.hasPackage(AMAZON_PACKAGE)) Intents.intended(IntentMatchers.hasData(Uri.parse("$AMAZON_APP_STORE_URL$packageName"))) diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/AptoideTest.kt b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/AptoideTest.kt index de778d56..14d486c1 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/AptoideTest.kt +++ b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/AptoideTest.kt @@ -6,8 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel +import com.pouyaheydari.appupdater.core.data.model.Store +import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -20,12 +21,11 @@ internal class AptoideTest { @Test fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext - val aptoide = Aptoide() val packageName = appContext.packageName val url = "https://pouyaheydari.com" + val storeModel = ShowStoreModel(packageName, Store.APTOIDE, url) - aptoide.setStoreData(StoreListItem(store = Store.APTOIDE, packageName = packageName, url = url)) - aptoide.showStore(appContext) + showAppInSelectedStore(appContext, storeModel) Intents.intended(IntentMatchers.hasData(Uri.parse("$APTOIDE_URL$packageName"))) Intents.intended(IntentMatchers.hasPackage(APTOIDE_PACKAGE)) diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/CafeBazaarStoreTest.kt b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/CafeBazaarStoreTest.kt index 34785226..860e2f28 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/CafeBazaarStoreTest.kt +++ b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/CafeBazaarStoreTest.kt @@ -6,8 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel +import com.pouyaheydari.appupdater.core.data.model.Store +import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -20,12 +21,11 @@ internal class CafeBazaarStoreTest { @Test fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext - val cafeBazaarStore = CafeBazaarStore() val packageName = appContext.packageName val url = "https://pouyaheydari.com" + val storeModel = ShowStoreModel(packageName, Store.CAFE_BAZAAR, url) - cafeBazaarStore.setStoreData(StoreListItem(store = Store.CAFE_BAZAAR, packageName = packageName, url = url)) - cafeBazaarStore.showStore(appContext) + showAppInSelectedStore(appContext, storeModel) Intents.intended(IntentMatchers.hasPackage(BAZAAR_PACKAGE)) Intents.intended(IntentMatchers.hasData(Uri.parse("$BAZAAR_URL$packageName"))) diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/FDroidTest.kt b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/FDroidTest.kt index 0c67d72d..8b67453b 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/FDroidTest.kt +++ b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/FDroidTest.kt @@ -6,8 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel +import com.pouyaheydari.appupdater.core.data.model.Store +import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -20,12 +21,11 @@ internal class FDroidTest { @Test fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext - val fDroid = FDroid() val packageName = appContext.packageName val url = "https://pouyaheydari.com" + val storeModel = ShowStoreModel(packageName, Store.FDROID, url) - fDroid.setStoreData(StoreListItem(store = Store.FDROID, packageName = packageName, url = url)) - fDroid.showStore(appContext) + showAppInSelectedStore(appContext, storeModel) Intents.intended(IntentMatchers.hasData(Uri.parse("$FDROID_URL$packageName"))) Intents.intended(IntentMatchers.hasPackage(FDROID_PACKAGE)) diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/GooglePlayStoreTest.kt b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/GooglePlayStoreTest.kt index 04b65a90..58ec2398 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/GooglePlayStoreTest.kt +++ b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/GooglePlayStoreTest.kt @@ -6,27 +6,26 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel +import com.pouyaheydari.appupdater.core.data.model.Store +import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) internal class GooglePlayStoreTest { - @get:Rule val intentsTestRule = IntentsRule() @Test fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext - val googlePlayStore = GooglePlayStore() val packageName = appContext.packageName val url = "https://pouyaheydari.com" + val storeModel = ShowStoreModel(packageName, Store.GOOGLE_PLAY, url) - googlePlayStore.setStoreData(StoreListItem(store = Store.GOOGLE_PLAY, packageName = packageName, url = url)) - googlePlayStore.showStore(appContext) + showAppInSelectedStore(appContext, storeModel) Intents.intended(IntentMatchers.hasPackage(PLAY_PACKAGE)) Intents.intended(IntentMatchers.hasData(Uri.parse("$PLAY_URL$packageName"))) diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/HuaweiAppGalleryTest.kt b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/HuaweiAppGalleryTest.kt index 9982bb7e..91f73895 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/HuaweiAppGalleryTest.kt +++ b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/HuaweiAppGalleryTest.kt @@ -6,8 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel +import com.pouyaheydari.appupdater.core.data.model.Store +import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -20,12 +21,11 @@ internal class HuaweiAppGalleryTest { @Test fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext - val huaweiAppGallery = HuaweiAppGallery() val packageName = appContext.packageName val url = "https://pouyaheydari.com" + val storeModel = ShowStoreModel(packageName, Store.HUAWEI_APP_GALLERY, url) - huaweiAppGallery.setStoreData(StoreListItem(store = Store.HUAWEI_APP_GALLERY, packageName = packageName, url = url)) - huaweiAppGallery.showStore(appContext) + showAppInSelectedStore(appContext, storeModel) Intents.intended(IntentMatchers.hasData(Uri.parse("$HUAWEI_APP_GALLERY_URL$packageName"))) Intents.intended(IntentMatchers.hasPackage(HUAWEI_APP_GALLERY_PACKAGE)) diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/LenovoAppCenterTest.kt b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/LenovoAppCenterTest.kt index 4a922736..4acc2f6d 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/LenovoAppCenterTest.kt +++ b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/LenovoAppCenterTest.kt @@ -6,8 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel +import com.pouyaheydari.appupdater.core.data.model.Store +import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -20,12 +21,11 @@ internal class LenovoAppCenterTest { @Test fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext - val lenovoAppCenter = LenovoAppCenter() val packageName = appContext.packageName val url = "https://pouyaheydari.com" + val storeModel = ShowStoreModel(packageName, Store.LENOVO_APP_CENTER, url) - lenovoAppCenter.setStoreData(StoreListItem(store = Store.LENOVO_APP_CENTER, packageName = packageName, url = url)) - lenovoAppCenter.showStore(appContext) + showAppInSelectedStore(appContext, storeModel) Intents.intended(IntentMatchers.hasData(Uri.parse("$LENOVO_APP_CENTER_URL$packageName"))) } diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/MiGetAppStoreTest.kt b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/MiGetAppStoreTest.kt index 130ac9e4..63635b5e 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/MiGetAppStoreTest.kt +++ b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/MiGetAppStoreTest.kt @@ -6,8 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel +import com.pouyaheydari.appupdater.core.data.model.Store +import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -20,12 +21,11 @@ internal class MiGetAppStoreTest { @Test fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext - val miGetAppStore = MiGetAppStore() val packageName = appContext.packageName val url = "https://pouyaheydari.com" + val storeModel = ShowStoreModel(packageName, Store.MI_GET_APP_STORE, url) - miGetAppStore.setStoreData(StoreListItem(store = Store.MI_GET_APP_STORE, packageName = packageName, url = url)) - miGetAppStore.showStore(appContext) + showAppInSelectedStore(appContext, storeModel) Intents.intended(IntentMatchers.hasData(Uri.parse("$MI_APP_STORE_URL$packageName"))) } diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/MyketStoreTest.kt b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/MyketStoreTest.kt index 25fe2f2d..9cb45a94 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/MyketStoreTest.kt +++ b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/MyketStoreTest.kt @@ -6,8 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel +import com.pouyaheydari.appupdater.core.data.model.Store +import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -20,12 +21,11 @@ internal class MyketStoreTest { @Test fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext - val myketStore = MyketStore() val packageName = appContext.packageName val url = "https://pouyaheydari.com" + val storeModel = ShowStoreModel(packageName, Store.MYKET, url) - myketStore.setStoreData(StoreListItem(store = Store.MYKET, packageName = packageName, url = url)) - myketStore.showStore(appContext) + showAppInSelectedStore(appContext, storeModel) Intents.intended(IntentMatchers.hasPackage(MYKET_PACKAGE)) Intents.intended(IntentMatchers.hasData(Uri.parse("$MYKET_URL$packageName"))) diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/NineAppsTest.kt b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/NineAppsTest.kt index 6c9c4613..82e80a65 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/NineAppsTest.kt +++ b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/NineAppsTest.kt @@ -6,8 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel +import com.pouyaheydari.appupdater.core.data.model.Store +import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -20,12 +21,11 @@ internal class NineAppsTest { @Test fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext - val nineApps = NineApps() val packageName = appContext.packageName val url = "https://pouyaheydari.com" + val storeModel = ShowStoreModel(packageName, Store.NINE_APPS_STORE, url) - nineApps.setStoreData(StoreListItem(store = Store.NINE_APPS_STORE, packageName = packageName, url = url)) - nineApps.showStore(appContext) + showAppInSelectedStore(appContext, storeModel) Intents.intended(IntentMatchers.hasPackage(NINE_APPS_PACKAGE)) Intents.intended(IntentMatchers.hasData(Uri.parse("$NINE_APPS_STORE_URL$packageName"))) diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/OneStoreAppMarketTest.kt b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/OneStoreAppMarketTest.kt index 1cbfbf1a..caa751c0 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/OneStoreAppMarketTest.kt +++ b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/OneStoreAppMarketTest.kt @@ -6,8 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel +import com.pouyaheydari.appupdater.core.data.model.Store +import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -20,12 +21,11 @@ internal class OneStoreAppMarketTest { @Test fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext - val oneStoreAppMarket = OneStoreAppMarket() val packageName = appContext.packageName val url = "https://pouyaheydari.com" + val storeModel = ShowStoreModel(packageName, Store.ONE_STORE_APP_MARKET, url) - oneStoreAppMarket.setStoreData(StoreListItem(store = Store.ONE_STORE_APP_MARKET, packageName = packageName, url = url)) - oneStoreAppMarket.showStore(appContext) + showAppInSelectedStore(appContext, storeModel) Intents.intended(IntentMatchers.hasData(Uri.parse("$ONE_STORE_APP_MARKET_URL$packageName"))) } diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/OppoAppMarketTest.kt b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/OppoAppMarketTest.kt index 47607f91..eb405ce6 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/OppoAppMarketTest.kt +++ b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/OppoAppMarketTest.kt @@ -6,8 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel +import com.pouyaheydari.appupdater.core.data.model.Store +import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -20,12 +21,11 @@ internal class OppoAppMarketTest { @Test fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext - val oppoAppMarket = OppoAppMarket() val packageName = appContext.packageName val url = "https://pouyaheydari.com" + val storeModel = ShowStoreModel(packageName, Store.OPPO_APP_MARKET, url) - oppoAppMarket.setStoreData(StoreListItem(store = Store.OPPO_APP_MARKET, packageName = packageName, url = url)) - oppoAppMarket.showStore(appContext) + showAppInSelectedStore(appContext, storeModel) Intents.intended(IntentMatchers.hasPackage(OPPO_PACKAGE)) Intents.intended(IntentMatchers.hasData(Uri.parse("$OPPO_APP_MARKET_URL$packageName"))) diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/SamsungGalaxyStoreTest.kt b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/SamsungGalaxyStoreTest.kt index baef07a9..8eaac3f8 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/SamsungGalaxyStoreTest.kt +++ b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/SamsungGalaxyStoreTest.kt @@ -6,8 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel +import com.pouyaheydari.appupdater.core.data.model.Store +import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -20,12 +21,11 @@ internal class SamsungGalaxyStoreTest { @Test fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext - val samsungGalaxyStore = SamsungGalaxyStore() val packageName = appContext.packageName val url = "https://pouyaheydari.com" + val storeModel = ShowStoreModel(packageName, Store.SAMSUNG_GALAXY_STORE, url) - samsungGalaxyStore.setStoreData(StoreListItem(store = Store.SAMSUNG_GALAXY_STORE, packageName = packageName, url = url)) - samsungGalaxyStore.showStore(appContext) + showAppInSelectedStore(appContext, storeModel) Intents.intended(IntentMatchers.hasData(Uri.parse("$SAMSUNG_GALAXY_STORE_URL$packageName"))) } diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/TencentStoreTest.kt b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/TencentStoreTest.kt index 69559c36..4e2b82be 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/TencentStoreTest.kt +++ b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/TencentStoreTest.kt @@ -6,8 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel +import com.pouyaheydari.appupdater.core.data.model.Store +import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -20,12 +21,11 @@ internal class TencentStoreTest { @Test fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext - val tencentAppStore = TencentAppStore() val packageName = appContext.packageName val url = "https://pouyaheydari.com" + val tencentStoreModel = ShowStoreModel(packageName, Store.TENCENT_APPS_STORE, url) - tencentAppStore.setStoreData(StoreListItem(store = Store.TENCENT_APPS_STORE, packageName = packageName, url = url)) - tencentAppStore.showStore(appContext) + showAppInSelectedStore(appContext, tencentStoreModel) Intents.intended(IntentMatchers.hasData(Uri.parse("$TENCENT_APP_STORE_URL$packageName"))) } diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/VAppStoreTest.kt b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/VAppStoreTest.kt index 772cf596..d406fd7c 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/VAppStoreTest.kt +++ b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/VAppStoreTest.kt @@ -6,8 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel +import com.pouyaheydari.appupdater.core.data.model.Store +import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -20,12 +21,11 @@ internal class VAppStoreTest { @Test fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext - val vAppStore = VAppStore() val packageName = appContext.packageName val url = "https://pouyaheydari.com" + val storeModel = ShowStoreModel(packageName, Store.V_APP_STORE, url) - vAppStore.setStoreData(StoreListItem(store = Store.V_APP_STORE, packageName = packageName, url = url)) - vAppStore.showStore(appContext) + showAppInSelectedStore(appContext, storeModel) Intents.intended(IntentMatchers.hasData(Uri.parse("$V_APP_STORE_URL$packageName"))) } diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/ZTEAppCenterTest.kt b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/ZTEAppCenterTest.kt index 48b4fca4..2e5d235a 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/ZTEAppCenterTest.kt +++ b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/ZTEAppCenterTest.kt @@ -6,8 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel +import com.pouyaheydari.appupdater.core.data.model.Store +import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -20,12 +21,11 @@ internal class ZTEAppCenterTest { @Test fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext - val zteAppCenter = ZTEAppCenter() val packageName = appContext.packageName val url = "https://pouyaheydari.com" + val storeModel = ShowStoreModel(packageName, Store.ZTE_APP_CENTER, url) - zteAppCenter.setStoreData(StoreListItem(store = Store.ZTE_APP_CENTER, packageName = packageName, url = url)) - zteAppCenter.showStore(appContext) + showAppInSelectedStore(appContext, storeModel) Intents.intended(IntentMatchers.hasData(Uri.parse("$ZTE_APP_CENTER_URL$packageName"))) } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/data/model/ShowStoreModel.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/data/model/ShowStoreModel.kt new file mode 100644 index 00000000..b1d232d3 --- /dev/null +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/data/model/ShowStoreModel.kt @@ -0,0 +1,7 @@ +package com.pouyaheydari.appupdater.core.data.model + +data class ShowStoreModel( + val packageName: String = "", + val store: Store = Store.GOOGLE_PLAY, + val fallbackUrl: String = "", +) diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/pojo/Store.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/data/model/Store.kt similarity index 91% rename from core/src/main/java/com/pouyaheydari/appupdater/core/pojo/Store.kt rename to core/src/main/java/com/pouyaheydari/appupdater/core/data/model/Store.kt index a8014db3..49d0d28d 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/pojo/Store.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/data/model/Store.kt @@ -1,6 +1,7 @@ -package com.pouyaheydari.appupdater.core.pojo +package com.pouyaheydari.appupdater.core.data.model import com.pouyaheydari.appupdater.core.stores.AmazonAppStore +import com.pouyaheydari.appupdater.core.stores.AppStore import com.pouyaheydari.appupdater.core.stores.Aptoide import com.pouyaheydari.appupdater.core.stores.CafeBazaarStore import com.pouyaheydari.appupdater.core.stores.FDroid @@ -13,7 +14,6 @@ import com.pouyaheydari.appupdater.core.stores.NineApps import com.pouyaheydari.appupdater.core.stores.OneStoreAppMarket import com.pouyaheydari.appupdater.core.stores.OppoAppMarket import com.pouyaheydari.appupdater.core.stores.SamsungGalaxyStore -import com.pouyaheydari.appupdater.core.stores.Stores import com.pouyaheydari.appupdater.core.stores.TencentAppStore import com.pouyaheydari.appupdater.core.stores.VAppStore import com.pouyaheydari.appupdater.core.stores.ZTEAppCenter @@ -21,7 +21,7 @@ import com.pouyaheydari.appupdater.core.stores.ZTEAppCenter /** * Enum class to select type of market */ -enum class Store(val provider: Class?) { +enum class Store(val provider: Class?) { DIRECT_URL(null), GOOGLE_PLAY(GooglePlayStore::class.java), CAFE_BAZAAR(CafeBazaarStore::class.java), diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/pojo/StoreListItem.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/data/model/StoreListItem.kt similarity index 92% rename from core/src/main/java/com/pouyaheydari/appupdater/core/pojo/StoreListItem.kt rename to core/src/main/java/com/pouyaheydari/appupdater/core/data/model/StoreListItem.kt index f2a1f1c7..d7e3e886 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/pojo/StoreListItem.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/data/model/StoreListItem.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.core.pojo +package com.pouyaheydari.appupdater.core.data.model import android.os.Parcel import android.os.Parcelable @@ -15,7 +15,7 @@ data class StoreListItem( var packageName: String = "", ) : Parcelable { constructor(parcel: Parcel) : this( - Store.values()[parcel.readInt()], + Store.entries[parcel.readInt()], parcel.readString().orEmpty(), parcel.readInt(), parcel.readString().orEmpty(), diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/pojo/Theme.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/data/model/Theme.kt similarity index 63% rename from core/src/main/java/com/pouyaheydari/appupdater/core/pojo/Theme.kt rename to core/src/main/java/com/pouyaheydari/appupdater/core/data/model/Theme.kt index 8ce64a04..67270f9d 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/pojo/Theme.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/data/model/Theme.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.core.pojo +package com.pouyaheydari.appupdater.core.data.model /** * Specifies the theme of dialog diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/AmazonAppStore.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/AmazonAppStore.kt index 0dbf6ccb..284d76c6 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/AmazonAppStore.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/AmazonAppStore.kt @@ -2,8 +2,6 @@ package com.pouyaheydari.appupdater.core.stores import android.content.Intent import android.net.Uri -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem const val AMAZON_APP_STORE_URL = "amzn://apps/android?p=" const val AMAZON_PACKAGE = "com.amazon.venezia" @@ -11,11 +9,9 @@ const val AMAZON_PACKAGE = "com.amazon.venezia" /** * Opens application's page in [Amazon App Store](https://www.amazon.com/gp/mas/get/amazonapp) */ -class AmazonAppStore : Stores() { - override fun setStoreData(item: StoreListItem) { - val intent = Intent(Intent.ACTION_VIEW, Uri.parse("$AMAZON_APP_STORE_URL${item.packageName}")).run { +object AmazonAppStore : AppStore { + override fun getIntent(packageName: String) = + Intent(Intent.ACTION_VIEW, Uri.parse("$AMAZON_APP_STORE_URL$packageName")).run { setPackage(AMAZON_PACKAGE) } - setData(intent, item, Store.AMAZON_APP_STORE) - } } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/AppStore.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/AppStore.kt new file mode 100644 index 00000000..2d12495f --- /dev/null +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/AppStore.kt @@ -0,0 +1,7 @@ +package com.pouyaheydari.appupdater.core.stores + +import android.content.Intent + +interface AppStore { + fun getIntent(packageName: String): Intent +} diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/Aptoide.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/Aptoide.kt index 0a6f5f5f..c78f20cf 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/Aptoide.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/Aptoide.kt @@ -2,8 +2,6 @@ package com.pouyaheydari.appupdater.core.stores import android.content.Intent import android.net.Uri -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem const val APTOIDE_URL = "aptoideinstall://package=" const val APTOIDE_PACKAGE = "cm.aptoide.pt" @@ -11,11 +9,9 @@ const val APTOIDE_PACKAGE = "cm.aptoide.pt" /** * Opens application's page in [Aptoide App Store](https://en.aptoide.com/) */ -class Aptoide : Stores() { - override fun setStoreData(item: StoreListItem) { - val intent = Intent(Intent.ACTION_VIEW, Uri.parse("$APTOIDE_URL${item.packageName}")).run { +object Aptoide : AppStore { + override fun getIntent(packageName: String) = + Intent(Intent.ACTION_VIEW, Uri.parse("$APTOIDE_URL$packageName")).run { setPackage(APTOIDE_PACKAGE) } - setData(intent, item, Store.APTOIDE) - } } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/CafeBazaarStore.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/CafeBazaarStore.kt index 8ab5ba8c..949c2468 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/CafeBazaarStore.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/CafeBazaarStore.kt @@ -2,8 +2,6 @@ package com.pouyaheydari.appupdater.core.stores import android.content.Intent import android.net.Uri -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem const val BAZAAR_URL = "bazaar://details?id=" const val BAZAAR_PACKAGE = "com.farsitel.bazaar" @@ -11,11 +9,9 @@ const val BAZAAR_PACKAGE = "com.farsitel.bazaar" /** * Opens application's page in [CafeBazaar App Store](https://cafebazaar.ir) */ -class CafeBazaarStore : Stores() { - override fun setStoreData(item: StoreListItem) { - val intent = Intent(Intent.ACTION_VIEW, Uri.parse("$BAZAAR_URL${item.packageName}")).run { +object CafeBazaarStore : AppStore { + override fun getIntent(packageName: String) = + Intent(Intent.ACTION_VIEW, Uri.parse("$BAZAAR_URL$packageName")).run { setPackage(BAZAAR_PACKAGE) } - setData(intent, item, Store.CAFE_BAZAAR) - } } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/FDroid.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/FDroid.kt index 5855252d..a593c986 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/FDroid.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/FDroid.kt @@ -2,8 +2,6 @@ package com.pouyaheydari.appupdater.core.stores import android.content.Intent import android.net.Uri -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem const val FDROID_URL = "fdroid.app://details?id=" const val FDROID_PACKAGE = "org.fdroid.fdroid" @@ -11,11 +9,9 @@ const val FDROID_PACKAGE = "org.fdroid.fdroid" /** * Opens application's page in [F-Droid App Store](https://f-droid.org/) */ -class FDroid : Stores() { - override fun setStoreData(item: StoreListItem) { - val intent = Intent(Intent.ACTION_VIEW, Uri.parse("$FDROID_URL${item.packageName}")).run { +object FDroid : AppStore { + override fun getIntent(packageName: String) = + Intent(Intent.ACTION_VIEW, Uri.parse("$FDROID_URL$packageName")).run { setPackage(FDROID_PACKAGE) } - setData(intent, item, Store.FDROID) - } } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/GooglePlayStore.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/GooglePlayStore.kt index 15cabc7b..62631567 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/GooglePlayStore.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/GooglePlayStore.kt @@ -2,8 +2,6 @@ package com.pouyaheydari.appupdater.core.stores import android.content.Intent import android.net.Uri -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem const val PLAY_URL = "market://details?id=" const val PLAY_PACKAGE = "com.android.vending" @@ -11,12 +9,9 @@ const val PLAY_PACKAGE = "com.android.vending" /** * Opens application's page in [GooglePlay Store](https://play.google.com) */ -class GooglePlayStore : Stores() { - - override fun setStoreData(item: StoreListItem) { - val intent = Intent(Intent.ACTION_VIEW, Uri.parse("$PLAY_URL${item.packageName}")).run { +object GooglePlayStore : AppStore { + override fun getIntent(packageName: String) = + Intent(Intent.ACTION_VIEW, Uri.parse("$PLAY_URL$packageName")).run { setPackage(PLAY_PACKAGE) } - setData(intent, item, Store.GOOGLE_PLAY) - } } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/HuaweiAppGallery.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/HuaweiAppGallery.kt index 8f2edce1..f95ce97e 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/HuaweiAppGallery.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/HuaweiAppGallery.kt @@ -2,8 +2,6 @@ package com.pouyaheydari.appupdater.core.stores import android.content.Intent import android.net.Uri -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem const val HUAWEI_APP_GALLERY_URL = "appmarket://details?id=" const val HUAWEI_APP_GALLERY_PACKAGE = "com.huawei.appmarket" @@ -11,11 +9,9 @@ const val HUAWEI_APP_GALLERY_PACKAGE = "com.huawei.appmarket" /** * Opens application's page in [Huawei App Gallery](https://appgallery.huawei.com/) */ -class HuaweiAppGallery : Stores() { - override fun setStoreData(item: StoreListItem) { - val intent = Intent(Intent.ACTION_VIEW, Uri.parse("$HUAWEI_APP_GALLERY_URL${item.packageName}")).run { +object HuaweiAppGallery : AppStore { + override fun getIntent(packageName: String) = + Intent(Intent.ACTION_VIEW, Uri.parse("$HUAWEI_APP_GALLERY_URL$packageName")).run { setPackage(HUAWEI_APP_GALLERY_PACKAGE) } - setData(intent, item, Store.HUAWEI_APP_GALLERY) - } } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/LenovoAppCenter.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/LenovoAppCenter.kt index 97b81ba6..ba8e36d5 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/LenovoAppCenter.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/LenovoAppCenter.kt @@ -2,17 +2,13 @@ package com.pouyaheydari.appupdater.core.stores import android.content.Intent import android.net.Uri -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem const val LENOVO_APP_CENTER_URL = "leapp://ptn/appinfo.do?pn=" /** * Opens application's page in [Lenovo App Store](https://www.lenovomm.com/) */ -class LenovoAppCenter : Stores() { - override fun setStoreData(item: StoreListItem) { - val intent = Intent(Intent.ACTION_VIEW, Uri.parse("$LENOVO_APP_CENTER_URL${item.packageName}")) - setData(intent, item, Store.LENOVO_APP_CENTER) - } +object LenovoAppCenter : AppStore { + override fun getIntent(packageName: String) = + Intent(Intent.ACTION_VIEW, Uri.parse("$LENOVO_APP_CENTER_URL$packageName")) } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/MiGetAppStore.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/MiGetAppStore.kt index bc22ce39..af3c9779 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/MiGetAppStore.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/MiGetAppStore.kt @@ -2,17 +2,13 @@ package com.pouyaheydari.appupdater.core.stores import android.content.Intent import android.net.Uri -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem const val MI_APP_STORE_URL = "mimarket://details?id=" /** * Opens application's page in [Xiaomi GetApp store](https://global.app.mi.com/) */ -class MiGetAppStore : Stores() { - override fun setStoreData(item: StoreListItem) { - val intent = Intent(Intent.ACTION_VIEW, Uri.parse("$MI_APP_STORE_URL${item.packageName}")) - setData(intent, item, Store.MI_GET_APP_STORE) - } +object MiGetAppStore : AppStore { + override fun getIntent(packageName: String) = + Intent(Intent.ACTION_VIEW, Uri.parse("$MI_APP_STORE_URL$packageName")) } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/MyketStore.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/MyketStore.kt index c98ab1d8..bc8a8162 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/MyketStore.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/MyketStore.kt @@ -2,8 +2,6 @@ package com.pouyaheydari.appupdater.core.stores import android.content.Intent import android.net.Uri -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem const val MYKET_URL = "myket://details?id=" const val MYKET_PACKAGE = "ir.mservices.market" @@ -11,11 +9,9 @@ const val MYKET_PACKAGE = "ir.mservices.market" /** * Opens application's page in [Myket Store](https://myket.ir/) */ -class MyketStore : Stores() { - override fun setStoreData(item: StoreListItem) { - val intent = Intent(Intent.ACTION_VIEW, Uri.parse("$MYKET_URL${item.packageName}")).run { +object MyketStore : AppStore { + override fun getIntent(packageName: String) = + Intent(Intent.ACTION_VIEW, Uri.parse("$MYKET_URL$packageName")).run { setPackage(MYKET_PACKAGE) } - setData(intent, item, Store.MYKET) - } } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/NineApps.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/NineApps.kt index b873b4fd..6e2dadf3 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/NineApps.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/NineApps.kt @@ -2,8 +2,6 @@ package com.pouyaheydari.appupdater.core.stores import android.content.Intent import android.net.Uri -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem const val NINE_APPS_STORE_URL = "nineapps://AppDetail?id=" const val NINE_APPS_PACKAGE = "com.gamefun.apk2u" @@ -11,11 +9,9 @@ const val NINE_APPS_PACKAGE = "com.gamefun.apk2u" /** * Opens application's page in [9-Apps](https://www.9apps.com/) */ -class NineApps : Stores() { - override fun setStoreData(item: StoreListItem) { - val intent = Intent(Intent.ACTION_VIEW, Uri.parse("$NINE_APPS_STORE_URL${item.packageName}")).run { +object NineApps : AppStore { + override fun getIntent(packageName: String) = + Intent(Intent.ACTION_VIEW, Uri.parse("$NINE_APPS_STORE_URL$packageName")).run { setPackage(NINE_APPS_PACKAGE) } - setData(intent, item, Store.NINE_APPS_STORE) - } } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/OneStoreAppMarket.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/OneStoreAppMarket.kt index 54d97789..11908256 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/OneStoreAppMarket.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/OneStoreAppMarket.kt @@ -2,17 +2,13 @@ package com.pouyaheydari.appupdater.core.stores import android.content.Intent import android.net.Uri -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem const val ONE_STORE_APP_MARKET_URL = "onestore://common/product/" /** * Opens application's page in [OneStore App Market](https://m.onestore.co.kr/mobilepoc/main/main.omp) */ -class OneStoreAppMarket : Stores() { - override fun setStoreData(item: StoreListItem) { - val intent = Intent(Intent.ACTION_VIEW, Uri.parse("$ONE_STORE_APP_MARKET_URL${item.packageName}")) - setData(intent, item, Store.MI_GET_APP_STORE) - } +object OneStoreAppMarket : AppStore { + override fun getIntent(packageName: String) = + Intent(Intent.ACTION_VIEW, Uri.parse("$ONE_STORE_APP_MARKET_URL$packageName")) } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/OppoAppMarket.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/OppoAppMarket.kt index b74b3a06..17e88f13 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/OppoAppMarket.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/OppoAppMarket.kt @@ -2,8 +2,6 @@ package com.pouyaheydari.appupdater.core.stores import android.content.Intent import android.net.Uri -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem const val OPPO_APP_MARKET_URL = "market://details?id=" const val OPPO_PACKAGE = "com.heytap.market" @@ -11,11 +9,9 @@ const val OPPO_PACKAGE = "com.heytap.market" /** * Opens application's page in [OppoAppMarket](https://oppomobile.com/) */ -class OppoAppMarket : Stores() { - override fun setStoreData(item: StoreListItem) { - val intent = Intent(Intent.ACTION_VIEW, Uri.parse("$OPPO_APP_MARKET_URL${item.packageName}")).run { +object OppoAppMarket : AppStore { + override fun getIntent(packageName: String) = + Intent(Intent.ACTION_VIEW, Uri.parse("$OPPO_APP_MARKET_URL$packageName")).run { setPackage(OPPO_PACKAGE) } - setData(intent, item, Store.OPPO_APP_MARKET) - } } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/SamsungGalaxyStore.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/SamsungGalaxyStore.kt index fa3687b8..c0514a34 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/SamsungGalaxyStore.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/SamsungGalaxyStore.kt @@ -2,17 +2,13 @@ package com.pouyaheydari.appupdater.core.stores import android.content.Intent import android.net.Uri -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem const val SAMSUNG_GALAXY_STORE_URL = "samsungapps://ProductDetail/" /** * Opens application's page in [Samsung Galaxy store](https://www.samsung.com/de/apps/galaxy-store/) */ -class SamsungGalaxyStore : Stores() { - override fun setStoreData(item: StoreListItem) { - val intent = Intent(Intent.ACTION_VIEW, Uri.parse("$SAMSUNG_GALAXY_STORE_URL${item.packageName}")) - setData(intent, item, Store.SAMSUNG_GALAXY_STORE) - } +object SamsungGalaxyStore : AppStore { + override fun getIntent(packageName: String) = + Intent(Intent.ACTION_VIEW, Uri.parse("$SAMSUNG_GALAXY_STORE_URL$packageName")) } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/Stores.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/Stores.kt deleted file mode 100644 index 1e86da93..00000000 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/Stores.kt +++ /dev/null @@ -1,68 +0,0 @@ -package com.pouyaheydari.appupdater.core.stores - -import android.content.ActivityNotFoundException -import android.content.Context -import android.content.Intent -import android.content.Intent.FLAG_ACTIVITY_NEW_TASK -import android.net.Uri -import android.widget.Toast -import com.pouyaheydari.appupdater.core.R -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem -import java.util.Locale - -/** - * This is the super class of all store (e.g. [GooglePlayStore]) - */ -abstract class Stores { - - private var intent: Intent? = null - private var item: StoreListItem? = null - private var store: Store? = null - - /** - * Sets intent of the store - */ - abstract fun setStoreData(item: StoreListItem) - - protected fun setData(intent: Intent, item: StoreListItem, store: Store) { - this.intent = intent - this.store = store - this.item = item - } - - fun showStore(context: Context?) { - try { - intent?.addFlags(FLAG_ACTIVITY_NEW_TASK) - context?.startActivity(intent) - } catch (e: ActivityNotFoundException) { - e.printStackTrace() - openWebViewToShowUrl(context, item, store) - } - } - - private fun openWebViewToShowUrl(context: Context?, item: StoreListItem?, store: Store?) { - if (item?.url.orEmpty().isNotEmpty()) { - try { - val webViewIntent = Intent(Intent.ACTION_VIEW, Uri.parse(item?.url)).run { - addFlags(FLAG_ACTIVITY_NEW_TASK) - } - context?.startActivity(webViewIntent) - } catch (e: ActivityNotFoundException) { - e.printStackTrace() - showErrorToast(context, store) - } - } else { - showErrorToast(context, store) - } - } - - private fun showErrorToast(context: Context?, store: Store?) { - val storeName = store?.name?.lowercase(Locale.ROOT)?.replace("_", " ") - Toast.makeText( - context, - context?.getString(R.string.appupdater_please_install, storeName), - Toast.LENGTH_LONG, - ).show() - } -} diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/TencentAppStore.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/TencentAppStore.kt index 88c26a2f..915f1348 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/TencentAppStore.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/TencentAppStore.kt @@ -2,17 +2,13 @@ package com.pouyaheydari.appupdater.core.stores import android.content.Intent import android.net.Uri -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem const val TENCENT_APP_STORE_URL = "tmast://appdetails?pname=" /** * Opens application's page in [Tencent App Store](https://appstore.tencent.com/) */ -class TencentAppStore : Stores() { - override fun setStoreData(item: StoreListItem) { - val intent = Intent(Intent.ACTION_VIEW, Uri.parse("$TENCENT_APP_STORE_URL${item.packageName}")) - setData(intent, item, Store.TENCENT_APPS_STORE) - } +object TencentAppStore : AppStore { + override fun getIntent(packageName: String) = + Intent(Intent.ACTION_VIEW, Uri.parse("$TENCENT_APP_STORE_URL$packageName")) } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/VAppStore.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/VAppStore.kt index 5944c720..35bb5542 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/VAppStore.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/VAppStore.kt @@ -2,17 +2,13 @@ package com.pouyaheydari.appupdater.core.stores import android.content.Intent import android.net.Uri -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem const val V_APP_STORE_URL = "vivoMarket://details?id=" /** * Opens application's page in [V-AppStore](https://developer.vivo.com/home) */ -class VAppStore : Stores() { - override fun setStoreData(item: StoreListItem) { - val intent = Intent(Intent.ACTION_VIEW, Uri.parse("$V_APP_STORE_URL${item.packageName}")) - setData(intent, item, Store.V_APP_STORE) - } +object VAppStore : AppStore { + override fun getIntent(packageName: String) = + Intent(Intent.ACTION_VIEW, Uri.parse("$V_APP_STORE_URL$packageName")) } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/ZTEAppCenter.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/ZTEAppCenter.kt index 4f15adbb..33f0236d 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/ZTEAppCenter.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/ZTEAppCenter.kt @@ -2,17 +2,13 @@ package com.pouyaheydari.appupdater.core.stores import android.content.Intent import android.net.Uri -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem const val ZTE_APP_CENTER_URL = "zte_market://appdetails?pname=" /** * Opens application's page in [ZTE App Store](https://apps.ztems.com/) */ -class ZTEAppCenter : Stores() { - override fun setStoreData(item: StoreListItem) { - val intent = Intent(Intent.ACTION_VIEW, Uri.parse("$ZTE_APP_CENTER_URL${item.packageName}")) - setData(intent, item, Store.ZTE_APP_CENTER) - } +object ZTEAppCenter : AppStore { + override fun getIntent(packageName: String) = + Intent(Intent.ACTION_VIEW, Uri.parse("$ZTE_APP_CENTER_URL$packageName")) } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreListUtil.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreListUtil.kt index f375ade2..9eb7b7a6 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreListUtil.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreListUtil.kt @@ -1,7 +1,7 @@ package com.pouyaheydari.appupdater.core.utils -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.Store +import com.pouyaheydari.appupdater.core.data.model.StoreListItem /** * Checks if both [Store.DIRECT_URL] & any other stores available or not. diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreOpener.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreOpener.kt new file mode 100644 index 00000000..f18c7c9c --- /dev/null +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreOpener.kt @@ -0,0 +1,47 @@ +package com.pouyaheydari.appupdater.core.utils + +import android.content.ActivityNotFoundException +import android.content.Context +import android.content.Intent +import android.content.Intent.FLAG_ACTIVITY_NEW_TASK +import android.net.Uri +import android.widget.Toast +import com.pouyaheydari.appupdater.core.R +import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel +import java.util.Locale + +fun showAppInSelectedStore(context: Context?, storeModel: ShowStoreModel) { + try { + val intent = storeModel.store.provider?.getDeclaredConstructor()?.newInstance()?.getIntent(storeModel.packageName) + intent?.addFlags(FLAG_ACTIVITY_NEW_TASK) + context?.startActivity(intent) + } catch (e: ActivityNotFoundException) { + e.printStackTrace() + openWebViewToShowFallbackUrl(context, storeModel.fallbackUrl, storeModel.store.name) + } +} + +private fun openWebViewToShowFallbackUrl(context: Context?, fallbackUrl: String, storeName: String) { + if (fallbackUrl.isNotEmpty()) { + try { + val webViewIntent = Intent(Intent.ACTION_VIEW, Uri.parse(fallbackUrl)).run { + addFlags(FLAG_ACTIVITY_NEW_TASK) + } + context?.startActivity(webViewIntent) + } catch (e: ActivityNotFoundException) { + e.printStackTrace() + showErrorToast(context, storeName) + } + } else { + showErrorToast(context, storeName) + } +} + +private fun showErrorToast(context: Context?, storeName: String) { + val lowerCaseStoreName = storeName.lowercase(Locale.ROOT).replace("_", " ") + Toast.makeText( + context, + context?.getString(R.string.appupdater_please_install, lowerCaseStoreName), + Toast.LENGTH_LONG, + ).show() +} diff --git a/core/src/test/java/com/pouyaheydari/appupdater/core/utils/StoreListUtilTest.kt b/core/src/test/java/com/pouyaheydari/appupdater/core/utils/StoreListUtilTest.kt index d941a5bc..72518706 100644 --- a/core/src/test/java/com/pouyaheydari/appupdater/core/utils/StoreListUtilTest.kt +++ b/core/src/test/java/com/pouyaheydari/appupdater/core/utils/StoreListUtilTest.kt @@ -1,12 +1,11 @@ package com.pouyaheydari.appupdater.core.utils -import com.pouyaheydari.appupdater.core.pojo.Store -import com.pouyaheydari.appupdater.core.pojo.StoreListItem +import com.pouyaheydari.appupdater.core.data.model.Store +import com.pouyaheydari.appupdater.core.data.model.StoreListItem import org.junit.Assert.assertEquals import org.junit.Test internal class StoreListUtilTest { - @Test fun `when both lists are not empty, then shouldShowStoresDivider return true`() { val directDownloadList = listOf(StoreListItem(store = Store.DIRECT_URL)) From 1a005726b0efcca92e7dfa1517b3070399ac824a Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Sun, 14 Jan 2024 16:11:35 +0100 Subject: [PATCH 013/117] Moved intent creation to a builder --- .../appupdater/core/stores/AmazonAppStore.kt | 10 +++---- .../appupdater/core/stores/Aptoide.kt | 11 ++++---- .../appupdater/core/stores/CafeBazaarStore.kt | 11 ++++---- .../appupdater/core/stores/FDroid.kt | 11 ++++---- .../appupdater/core/stores/GooglePlayStore.kt | 11 ++++---- .../core/stores/HuaweiAppGallery.kt | 11 ++++---- .../appupdater/core/stores/LenovoAppCenter.kt | 8 +++--- .../appupdater/core/stores/MiGetAppStore.kt | 7 ++--- .../appupdater/core/stores/MyketStore.kt | 11 ++++---- .../appupdater/core/stores/NineApps.kt | 11 ++++---- .../core/stores/OneStoreAppMarket.kt | 7 ++--- .../appupdater/core/stores/OppoAppMarket.kt | 11 ++++---- .../core/stores/SamsungGalaxyStore.kt | 8 +++--- .../appupdater/core/stores/TencentAppStore.kt | 8 +++--- .../appupdater/core/stores/VAppStore.kt | 8 +++--- .../appupdater/core/stores/ZTEAppCenter.kt | 8 +++--- .../core/utils/AndroidIntentBuilder.kt | 27 +++++++++++++++++++ 17 files changed, 100 insertions(+), 79 deletions(-) create mode 100644 core/src/main/java/com/pouyaheydari/appupdater/core/utils/AndroidIntentBuilder.kt diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/AmazonAppStore.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/AmazonAppStore.kt index 284d76c6..df9d525a 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/AmazonAppStore.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/AmazonAppStore.kt @@ -1,7 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import android.content.Intent -import android.net.Uri +import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder const val AMAZON_APP_STORE_URL = "amzn://apps/android?p=" const val AMAZON_PACKAGE = "com.amazon.venezia" @@ -11,7 +10,8 @@ const val AMAZON_PACKAGE = "com.amazon.venezia" */ object AmazonAppStore : AppStore { override fun getIntent(packageName: String) = - Intent(Intent.ACTION_VIEW, Uri.parse("$AMAZON_APP_STORE_URL$packageName")).run { - setPackage(AMAZON_PACKAGE) - } + AndroidIntentBuilder + .addUriString("$AMAZON_APP_STORE_URL$packageName") + .addPackage(AMAZON_PACKAGE) + .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/Aptoide.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/Aptoide.kt index c78f20cf..0e06a450 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/Aptoide.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/Aptoide.kt @@ -1,7 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import android.content.Intent -import android.net.Uri +import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder const val APTOIDE_URL = "aptoideinstall://package=" const val APTOIDE_PACKAGE = "cm.aptoide.pt" @@ -10,8 +9,8 @@ const val APTOIDE_PACKAGE = "cm.aptoide.pt" * Opens application's page in [Aptoide App Store](https://en.aptoide.com/) */ object Aptoide : AppStore { - override fun getIntent(packageName: String) = - Intent(Intent.ACTION_VIEW, Uri.parse("$APTOIDE_URL$packageName")).run { - setPackage(APTOIDE_PACKAGE) - } + override fun getIntent(packageName: String) = AndroidIntentBuilder + .addUriString("$APTOIDE_URL$packageName") + .addPackage(APTOIDE_PACKAGE) + .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/CafeBazaarStore.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/CafeBazaarStore.kt index 949c2468..a40bf0fc 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/CafeBazaarStore.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/CafeBazaarStore.kt @@ -1,7 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import android.content.Intent -import android.net.Uri +import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder const val BAZAAR_URL = "bazaar://details?id=" const val BAZAAR_PACKAGE = "com.farsitel.bazaar" @@ -10,8 +9,8 @@ const val BAZAAR_PACKAGE = "com.farsitel.bazaar" * Opens application's page in [CafeBazaar App Store](https://cafebazaar.ir) */ object CafeBazaarStore : AppStore { - override fun getIntent(packageName: String) = - Intent(Intent.ACTION_VIEW, Uri.parse("$BAZAAR_URL$packageName")).run { - setPackage(BAZAAR_PACKAGE) - } + override fun getIntent(packageName: String) = AndroidIntentBuilder + .addUriString("$BAZAAR_URL$packageName") + .addPackage(BAZAAR_PACKAGE) + .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/FDroid.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/FDroid.kt index a593c986..9e0bc712 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/FDroid.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/FDroid.kt @@ -1,7 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import android.content.Intent -import android.net.Uri +import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder const val FDROID_URL = "fdroid.app://details?id=" const val FDROID_PACKAGE = "org.fdroid.fdroid" @@ -10,8 +9,8 @@ const val FDROID_PACKAGE = "org.fdroid.fdroid" * Opens application's page in [F-Droid App Store](https://f-droid.org/) */ object FDroid : AppStore { - override fun getIntent(packageName: String) = - Intent(Intent.ACTION_VIEW, Uri.parse("$FDROID_URL$packageName")).run { - setPackage(FDROID_PACKAGE) - } + override fun getIntent(packageName: String) = AndroidIntentBuilder + .addUriString("$FDROID_URL$packageName") + .addPackage(FDROID_PACKAGE) + .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/GooglePlayStore.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/GooglePlayStore.kt index 62631567..cef80f4e 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/GooglePlayStore.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/GooglePlayStore.kt @@ -1,7 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import android.content.Intent -import android.net.Uri +import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder const val PLAY_URL = "market://details?id=" const val PLAY_PACKAGE = "com.android.vending" @@ -10,8 +9,8 @@ const val PLAY_PACKAGE = "com.android.vending" * Opens application's page in [GooglePlay Store](https://play.google.com) */ object GooglePlayStore : AppStore { - override fun getIntent(packageName: String) = - Intent(Intent.ACTION_VIEW, Uri.parse("$PLAY_URL$packageName")).run { - setPackage(PLAY_PACKAGE) - } + override fun getIntent(packageName: String) = AndroidIntentBuilder + .addUriString("$PLAY_URL$packageName") + .addPackage(PLAY_PACKAGE) + .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/HuaweiAppGallery.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/HuaweiAppGallery.kt index f95ce97e..6ec41cc3 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/HuaweiAppGallery.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/HuaweiAppGallery.kt @@ -1,7 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import android.content.Intent -import android.net.Uri +import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder const val HUAWEI_APP_GALLERY_URL = "appmarket://details?id=" const val HUAWEI_APP_GALLERY_PACKAGE = "com.huawei.appmarket" @@ -10,8 +9,8 @@ const val HUAWEI_APP_GALLERY_PACKAGE = "com.huawei.appmarket" * Opens application's page in [Huawei App Gallery](https://appgallery.huawei.com/) */ object HuaweiAppGallery : AppStore { - override fun getIntent(packageName: String) = - Intent(Intent.ACTION_VIEW, Uri.parse("$HUAWEI_APP_GALLERY_URL$packageName")).run { - setPackage(HUAWEI_APP_GALLERY_PACKAGE) - } + override fun getIntent(packageName: String) = AndroidIntentBuilder + .addUriString("$HUAWEI_APP_GALLERY_URL$packageName") + .addPackage(HUAWEI_APP_GALLERY_PACKAGE) + .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/LenovoAppCenter.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/LenovoAppCenter.kt index ba8e36d5..360b2e73 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/LenovoAppCenter.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/LenovoAppCenter.kt @@ -1,7 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import android.content.Intent -import android.net.Uri +import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder const val LENOVO_APP_CENTER_URL = "leapp://ptn/appinfo.do?pn=" @@ -9,6 +8,7 @@ const val LENOVO_APP_CENTER_URL = "leapp://ptn/appinfo.do?pn=" * Opens application's page in [Lenovo App Store](https://www.lenovomm.com/) */ object LenovoAppCenter : AppStore { - override fun getIntent(packageName: String) = - Intent(Intent.ACTION_VIEW, Uri.parse("$LENOVO_APP_CENTER_URL$packageName")) + override fun getIntent(packageName: String) = AndroidIntentBuilder + .addUriString("$LENOVO_APP_CENTER_URL$packageName") + .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/MiGetAppStore.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/MiGetAppStore.kt index af3c9779..ebace384 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/MiGetAppStore.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/MiGetAppStore.kt @@ -1,7 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import android.content.Intent -import android.net.Uri +import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder const val MI_APP_STORE_URL = "mimarket://details?id=" @@ -10,5 +9,7 @@ const val MI_APP_STORE_URL = "mimarket://details?id=" */ object MiGetAppStore : AppStore { override fun getIntent(packageName: String) = - Intent(Intent.ACTION_VIEW, Uri.parse("$MI_APP_STORE_URL$packageName")) + AndroidIntentBuilder + .addUriString("$MI_APP_STORE_URL$packageName") + .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/MyketStore.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/MyketStore.kt index bc8a8162..b839232e 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/MyketStore.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/MyketStore.kt @@ -1,7 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import android.content.Intent -import android.net.Uri +import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder const val MYKET_URL = "myket://details?id=" const val MYKET_PACKAGE = "ir.mservices.market" @@ -10,8 +9,8 @@ const val MYKET_PACKAGE = "ir.mservices.market" * Opens application's page in [Myket Store](https://myket.ir/) */ object MyketStore : AppStore { - override fun getIntent(packageName: String) = - Intent(Intent.ACTION_VIEW, Uri.parse("$MYKET_URL$packageName")).run { - setPackage(MYKET_PACKAGE) - } + override fun getIntent(packageName: String) = AndroidIntentBuilder + .addUriString("$MYKET_URL$packageName") + .addPackage(MYKET_PACKAGE) + .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/NineApps.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/NineApps.kt index 6e2dadf3..e73f4926 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/NineApps.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/NineApps.kt @@ -1,7 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import android.content.Intent -import android.net.Uri +import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder const val NINE_APPS_STORE_URL = "nineapps://AppDetail?id=" const val NINE_APPS_PACKAGE = "com.gamefun.apk2u" @@ -10,8 +9,8 @@ const val NINE_APPS_PACKAGE = "com.gamefun.apk2u" * Opens application's page in [9-Apps](https://www.9apps.com/) */ object NineApps : AppStore { - override fun getIntent(packageName: String) = - Intent(Intent.ACTION_VIEW, Uri.parse("$NINE_APPS_STORE_URL$packageName")).run { - setPackage(NINE_APPS_PACKAGE) - } + override fun getIntent(packageName: String) = AndroidIntentBuilder + .addUriString("$NINE_APPS_STORE_URL$packageName") + .addPackage(NINE_APPS_PACKAGE) + .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/OneStoreAppMarket.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/OneStoreAppMarket.kt index 11908256..c0d6b363 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/OneStoreAppMarket.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/OneStoreAppMarket.kt @@ -1,7 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import android.content.Intent -import android.net.Uri +import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder const val ONE_STORE_APP_MARKET_URL = "onestore://common/product/" @@ -10,5 +9,7 @@ const val ONE_STORE_APP_MARKET_URL = "onestore://common/product/" */ object OneStoreAppMarket : AppStore { override fun getIntent(packageName: String) = - Intent(Intent.ACTION_VIEW, Uri.parse("$ONE_STORE_APP_MARKET_URL$packageName")) + AndroidIntentBuilder + .addUriString("$ONE_STORE_APP_MARKET_URL$packageName") + .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/OppoAppMarket.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/OppoAppMarket.kt index 17e88f13..64235deb 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/OppoAppMarket.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/OppoAppMarket.kt @@ -1,7 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import android.content.Intent -import android.net.Uri +import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder const val OPPO_APP_MARKET_URL = "market://details?id=" const val OPPO_PACKAGE = "com.heytap.market" @@ -10,8 +9,8 @@ const val OPPO_PACKAGE = "com.heytap.market" * Opens application's page in [OppoAppMarket](https://oppomobile.com/) */ object OppoAppMarket : AppStore { - override fun getIntent(packageName: String) = - Intent(Intent.ACTION_VIEW, Uri.parse("$OPPO_APP_MARKET_URL$packageName")).run { - setPackage(OPPO_PACKAGE) - } + override fun getIntent(packageName: String) = AndroidIntentBuilder + .addUriString("$OPPO_APP_MARKET_URL$packageName") + .addPackage(OPPO_PACKAGE) + .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/SamsungGalaxyStore.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/SamsungGalaxyStore.kt index c0514a34..1e4dd480 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/SamsungGalaxyStore.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/SamsungGalaxyStore.kt @@ -1,7 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import android.content.Intent -import android.net.Uri +import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder const val SAMSUNG_GALAXY_STORE_URL = "samsungapps://ProductDetail/" @@ -9,6 +8,7 @@ const val SAMSUNG_GALAXY_STORE_URL = "samsungapps://ProductDetail/" * Opens application's page in [Samsung Galaxy store](https://www.samsung.com/de/apps/galaxy-store/) */ object SamsungGalaxyStore : AppStore { - override fun getIntent(packageName: String) = - Intent(Intent.ACTION_VIEW, Uri.parse("$SAMSUNG_GALAXY_STORE_URL$packageName")) + override fun getIntent(packageName: String) = AndroidIntentBuilder + .addUriString("$SAMSUNG_GALAXY_STORE_URL$packageName") + .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/TencentAppStore.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/TencentAppStore.kt index 915f1348..13b6044b 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/TencentAppStore.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/TencentAppStore.kt @@ -1,7 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import android.content.Intent -import android.net.Uri +import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder const val TENCENT_APP_STORE_URL = "tmast://appdetails?pname=" @@ -9,6 +8,7 @@ const val TENCENT_APP_STORE_URL = "tmast://appdetails?pname=" * Opens application's page in [Tencent App Store](https://appstore.tencent.com/) */ object TencentAppStore : AppStore { - override fun getIntent(packageName: String) = - Intent(Intent.ACTION_VIEW, Uri.parse("$TENCENT_APP_STORE_URL$packageName")) + override fun getIntent(packageName: String) = AndroidIntentBuilder + .addUriString("$TENCENT_APP_STORE_URL$packageName") + .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/VAppStore.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/VAppStore.kt index 35bb5542..a3c5789c 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/VAppStore.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/VAppStore.kt @@ -1,7 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import android.content.Intent -import android.net.Uri +import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder const val V_APP_STORE_URL = "vivoMarket://details?id=" @@ -9,6 +8,7 @@ const val V_APP_STORE_URL = "vivoMarket://details?id=" * Opens application's page in [V-AppStore](https://developer.vivo.com/home) */ object VAppStore : AppStore { - override fun getIntent(packageName: String) = - Intent(Intent.ACTION_VIEW, Uri.parse("$V_APP_STORE_URL$packageName")) + override fun getIntent(packageName: String) = AndroidIntentBuilder + .addUriString("$V_APP_STORE_URL$packageName") + .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/ZTEAppCenter.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/ZTEAppCenter.kt index 33f0236d..255f76ff 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/ZTEAppCenter.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/ZTEAppCenter.kt @@ -1,7 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import android.content.Intent -import android.net.Uri +import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder const val ZTE_APP_CENTER_URL = "zte_market://appdetails?pname=" @@ -9,6 +8,7 @@ const val ZTE_APP_CENTER_URL = "zte_market://appdetails?pname=" * Opens application's page in [ZTE App Store](https://apps.ztems.com/) */ object ZTEAppCenter : AppStore { - override fun getIntent(packageName: String) = - Intent(Intent.ACTION_VIEW, Uri.parse("$ZTE_APP_CENTER_URL$packageName")) + override fun getIntent(packageName: String) = AndroidIntentBuilder + .addUriString("$ZTE_APP_CENTER_URL$packageName") + .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/utils/AndroidIntentBuilder.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/utils/AndroidIntentBuilder.kt new file mode 100644 index 00000000..a0dd959e --- /dev/null +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/utils/AndroidIntentBuilder.kt @@ -0,0 +1,27 @@ +package com.pouyaheydari.appupdater.core.utils + +import android.content.Intent +import android.net.Uri + +internal object AndroidIntentBuilder { + private var uri: Uri? = null + private var packageName: String? = null + + fun addUriString(uriString: String): AndroidIntentBuilder { + uri = Uri.parse(uriString) + return this + } + + fun addPackage(packageName: String): AndroidIntentBuilder { + this.packageName = packageName + return this + } + + fun build(): Intent { + requireNotNull(uri) { "URI must be set before calling build()" } + + return Intent(Intent.ACTION_VIEW, uri).apply { + packageName?.takeIf { it.isNotBlank() }?.let { setPackage(it) } + } + } +} From 19cc3213ca19d8e68de80745601f103354dba592 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Sun, 14 Jan 2024 17:34:44 +0100 Subject: [PATCH 014/117] improved intent builder --- .../core/data/model/ShowStoreModel.kt | 1 + .../appupdater/core/stores/AmazonAppStore.kt | 8 ++-- .../appupdater/core/stores/Aptoide.kt | 8 ++-- .../appupdater/core/stores/CafeBazaarStore.kt | 8 ++-- .../appupdater/core/stores/FDroid.kt | 8 ++-- .../appupdater/core/stores/GooglePlayStore.kt | 8 ++-- .../core/stores/HuaweiAppGallery.kt | 8 ++-- .../appupdater/core/stores/LenovoAppCenter.kt | 6 +-- .../appupdater/core/stores/MiGetAppStore.kt | 6 +-- .../appupdater/core/stores/MyketStore.kt | 8 ++-- .../appupdater/core/stores/NineApps.kt | 8 ++-- .../core/stores/OneStoreAppMarket.kt | 6 +-- .../appupdater/core/stores/OppoAppMarket.kt | 8 ++-- .../core/stores/SamsungGalaxyStore.kt | 6 +-- .../appupdater/core/stores/TencentAppStore.kt | 6 +-- .../appupdater/core/stores/VAppStore.kt | 6 +-- .../appupdater/core/stores/ZTEAppCenter.kt | 6 +-- .../core/utils/AndroidIntentBuilder.kt | 27 ----------- .../core/utils/StoreIntentProvider.kt | 22 +++++++++ .../appupdater/core/utils/StoreOpener.kt | 48 ++++++++++--------- 20 files changed, 105 insertions(+), 107 deletions(-) delete mode 100644 core/src/main/java/com/pouyaheydari/appupdater/core/utils/AndroidIntentBuilder.kt create mode 100644 core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreIntentProvider.kt diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/data/model/ShowStoreModel.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/data/model/ShowStoreModel.kt index b1d232d3..9b780d2c 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/data/model/ShowStoreModel.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/data/model/ShowStoreModel.kt @@ -4,4 +4,5 @@ data class ShowStoreModel( val packageName: String = "", val store: Store = Store.GOOGLE_PLAY, val fallbackUrl: String = "", + val errorCallBack: () -> Unit = {}, ) diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/AmazonAppStore.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/AmazonAppStore.kt index df9d525a..d5b6ef2a 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/AmazonAppStore.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/AmazonAppStore.kt @@ -1,6 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder +import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider const val AMAZON_APP_STORE_URL = "amzn://apps/android?p=" const val AMAZON_PACKAGE = "com.amazon.venezia" @@ -10,8 +10,8 @@ const val AMAZON_PACKAGE = "com.amazon.venezia" */ object AmazonAppStore : AppStore { override fun getIntent(packageName: String) = - AndroidIntentBuilder - .addUriString("$AMAZON_APP_STORE_URL$packageName") - .addPackage(AMAZON_PACKAGE) + StoreIntentProvider + .Builder("$AMAZON_APP_STORE_URL$packageName") + .withPackage(AMAZON_PACKAGE) .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/Aptoide.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/Aptoide.kt index 0e06a450..bb95a193 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/Aptoide.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/Aptoide.kt @@ -1,6 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder +import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider const val APTOIDE_URL = "aptoideinstall://package=" const val APTOIDE_PACKAGE = "cm.aptoide.pt" @@ -9,8 +9,8 @@ const val APTOIDE_PACKAGE = "cm.aptoide.pt" * Opens application's page in [Aptoide App Store](https://en.aptoide.com/) */ object Aptoide : AppStore { - override fun getIntent(packageName: String) = AndroidIntentBuilder - .addUriString("$APTOIDE_URL$packageName") - .addPackage(APTOIDE_PACKAGE) + override fun getIntent(packageName: String) = StoreIntentProvider + .Builder("$APTOIDE_URL$packageName") + .withPackage(APTOIDE_PACKAGE) .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/CafeBazaarStore.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/CafeBazaarStore.kt index a40bf0fc..ca510609 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/CafeBazaarStore.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/CafeBazaarStore.kt @@ -1,6 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder +import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider const val BAZAAR_URL = "bazaar://details?id=" const val BAZAAR_PACKAGE = "com.farsitel.bazaar" @@ -9,8 +9,8 @@ const val BAZAAR_PACKAGE = "com.farsitel.bazaar" * Opens application's page in [CafeBazaar App Store](https://cafebazaar.ir) */ object CafeBazaarStore : AppStore { - override fun getIntent(packageName: String) = AndroidIntentBuilder - .addUriString("$BAZAAR_URL$packageName") - .addPackage(BAZAAR_PACKAGE) + override fun getIntent(packageName: String) = StoreIntentProvider + .Builder("$BAZAAR_URL$packageName") + .withPackage(BAZAAR_PACKAGE) .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/FDroid.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/FDroid.kt index 9e0bc712..1092cf8b 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/FDroid.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/FDroid.kt @@ -1,6 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder +import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider const val FDROID_URL = "fdroid.app://details?id=" const val FDROID_PACKAGE = "org.fdroid.fdroid" @@ -9,8 +9,8 @@ const val FDROID_PACKAGE = "org.fdroid.fdroid" * Opens application's page in [F-Droid App Store](https://f-droid.org/) */ object FDroid : AppStore { - override fun getIntent(packageName: String) = AndroidIntentBuilder - .addUriString("$FDROID_URL$packageName") - .addPackage(FDROID_PACKAGE) + override fun getIntent(packageName: String) = StoreIntentProvider + .Builder("$FDROID_URL$packageName") + .withPackage(FDROID_PACKAGE) .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/GooglePlayStore.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/GooglePlayStore.kt index cef80f4e..871b32f7 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/GooglePlayStore.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/GooglePlayStore.kt @@ -1,6 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder +import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider const val PLAY_URL = "market://details?id=" const val PLAY_PACKAGE = "com.android.vending" @@ -9,8 +9,8 @@ const val PLAY_PACKAGE = "com.android.vending" * Opens application's page in [GooglePlay Store](https://play.google.com) */ object GooglePlayStore : AppStore { - override fun getIntent(packageName: String) = AndroidIntentBuilder - .addUriString("$PLAY_URL$packageName") - .addPackage(PLAY_PACKAGE) + override fun getIntent(packageName: String) = StoreIntentProvider + .Builder("$PLAY_URL$packageName") + .withPackage(PLAY_PACKAGE) .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/HuaweiAppGallery.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/HuaweiAppGallery.kt index 6ec41cc3..3d34f852 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/HuaweiAppGallery.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/HuaweiAppGallery.kt @@ -1,6 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder +import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider const val HUAWEI_APP_GALLERY_URL = "appmarket://details?id=" const val HUAWEI_APP_GALLERY_PACKAGE = "com.huawei.appmarket" @@ -9,8 +9,8 @@ const val HUAWEI_APP_GALLERY_PACKAGE = "com.huawei.appmarket" * Opens application's page in [Huawei App Gallery](https://appgallery.huawei.com/) */ object HuaweiAppGallery : AppStore { - override fun getIntent(packageName: String) = AndroidIntentBuilder - .addUriString("$HUAWEI_APP_GALLERY_URL$packageName") - .addPackage(HUAWEI_APP_GALLERY_PACKAGE) + override fun getIntent(packageName: String) = StoreIntentProvider + .Builder("$HUAWEI_APP_GALLERY_URL$packageName") + .withPackage(HUAWEI_APP_GALLERY_PACKAGE) .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/LenovoAppCenter.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/LenovoAppCenter.kt index 360b2e73..92daba2d 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/LenovoAppCenter.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/LenovoAppCenter.kt @@ -1,6 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder +import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider const val LENOVO_APP_CENTER_URL = "leapp://ptn/appinfo.do?pn=" @@ -8,7 +8,7 @@ const val LENOVO_APP_CENTER_URL = "leapp://ptn/appinfo.do?pn=" * Opens application's page in [Lenovo App Store](https://www.lenovomm.com/) */ object LenovoAppCenter : AppStore { - override fun getIntent(packageName: String) = AndroidIntentBuilder - .addUriString("$LENOVO_APP_CENTER_URL$packageName") + override fun getIntent(packageName: String) = StoreIntentProvider + .Builder("$LENOVO_APP_CENTER_URL$packageName") .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/MiGetAppStore.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/MiGetAppStore.kt index ebace384..88e267da 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/MiGetAppStore.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/MiGetAppStore.kt @@ -1,6 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder +import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider const val MI_APP_STORE_URL = "mimarket://details?id=" @@ -9,7 +9,7 @@ const val MI_APP_STORE_URL = "mimarket://details?id=" */ object MiGetAppStore : AppStore { override fun getIntent(packageName: String) = - AndroidIntentBuilder - .addUriString("$MI_APP_STORE_URL$packageName") + StoreIntentProvider + .Builder("$MI_APP_STORE_URL$packageName") .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/MyketStore.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/MyketStore.kt index b839232e..283bbdff 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/MyketStore.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/MyketStore.kt @@ -1,6 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder +import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider const val MYKET_URL = "myket://details?id=" const val MYKET_PACKAGE = "ir.mservices.market" @@ -9,8 +9,8 @@ const val MYKET_PACKAGE = "ir.mservices.market" * Opens application's page in [Myket Store](https://myket.ir/) */ object MyketStore : AppStore { - override fun getIntent(packageName: String) = AndroidIntentBuilder - .addUriString("$MYKET_URL$packageName") - .addPackage(MYKET_PACKAGE) + override fun getIntent(packageName: String) = StoreIntentProvider + .Builder("$MYKET_URL$packageName") + .withPackage(MYKET_PACKAGE) .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/NineApps.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/NineApps.kt index e73f4926..b5317843 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/NineApps.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/NineApps.kt @@ -1,6 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder +import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider const val NINE_APPS_STORE_URL = "nineapps://AppDetail?id=" const val NINE_APPS_PACKAGE = "com.gamefun.apk2u" @@ -9,8 +9,8 @@ const val NINE_APPS_PACKAGE = "com.gamefun.apk2u" * Opens application's page in [9-Apps](https://www.9apps.com/) */ object NineApps : AppStore { - override fun getIntent(packageName: String) = AndroidIntentBuilder - .addUriString("$NINE_APPS_STORE_URL$packageName") - .addPackage(NINE_APPS_PACKAGE) + override fun getIntent(packageName: String) = StoreIntentProvider + .Builder("$NINE_APPS_STORE_URL$packageName") + .withPackage(NINE_APPS_PACKAGE) .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/OneStoreAppMarket.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/OneStoreAppMarket.kt index c0d6b363..6635ab6f 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/OneStoreAppMarket.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/OneStoreAppMarket.kt @@ -1,6 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder +import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider const val ONE_STORE_APP_MARKET_URL = "onestore://common/product/" @@ -9,7 +9,7 @@ const val ONE_STORE_APP_MARKET_URL = "onestore://common/product/" */ object OneStoreAppMarket : AppStore { override fun getIntent(packageName: String) = - AndroidIntentBuilder - .addUriString("$ONE_STORE_APP_MARKET_URL$packageName") + StoreIntentProvider + .Builder("$ONE_STORE_APP_MARKET_URL$packageName") .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/OppoAppMarket.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/OppoAppMarket.kt index 64235deb..7d0209e8 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/OppoAppMarket.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/OppoAppMarket.kt @@ -1,6 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder +import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider const val OPPO_APP_MARKET_URL = "market://details?id=" const val OPPO_PACKAGE = "com.heytap.market" @@ -9,8 +9,8 @@ const val OPPO_PACKAGE = "com.heytap.market" * Opens application's page in [OppoAppMarket](https://oppomobile.com/) */ object OppoAppMarket : AppStore { - override fun getIntent(packageName: String) = AndroidIntentBuilder - .addUriString("$OPPO_APP_MARKET_URL$packageName") - .addPackage(OPPO_PACKAGE) + override fun getIntent(packageName: String) = StoreIntentProvider + .Builder("$OPPO_APP_MARKET_URL$packageName") + .withPackage(OPPO_PACKAGE) .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/SamsungGalaxyStore.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/SamsungGalaxyStore.kt index 1e4dd480..d3fcccbc 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/SamsungGalaxyStore.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/SamsungGalaxyStore.kt @@ -1,6 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder +import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider const val SAMSUNG_GALAXY_STORE_URL = "samsungapps://ProductDetail/" @@ -8,7 +8,7 @@ const val SAMSUNG_GALAXY_STORE_URL = "samsungapps://ProductDetail/" * Opens application's page in [Samsung Galaxy store](https://www.samsung.com/de/apps/galaxy-store/) */ object SamsungGalaxyStore : AppStore { - override fun getIntent(packageName: String) = AndroidIntentBuilder - .addUriString("$SAMSUNG_GALAXY_STORE_URL$packageName") + override fun getIntent(packageName: String) = StoreIntentProvider + .Builder("$SAMSUNG_GALAXY_STORE_URL$packageName") .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/TencentAppStore.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/TencentAppStore.kt index 13b6044b..c0adf798 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/TencentAppStore.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/TencentAppStore.kt @@ -1,6 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder +import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider const val TENCENT_APP_STORE_URL = "tmast://appdetails?pname=" @@ -8,7 +8,7 @@ const val TENCENT_APP_STORE_URL = "tmast://appdetails?pname=" * Opens application's page in [Tencent App Store](https://appstore.tencent.com/) */ object TencentAppStore : AppStore { - override fun getIntent(packageName: String) = AndroidIntentBuilder - .addUriString("$TENCENT_APP_STORE_URL$packageName") + override fun getIntent(packageName: String) = StoreIntentProvider + .Builder("$TENCENT_APP_STORE_URL$packageName") .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/VAppStore.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/VAppStore.kt index a3c5789c..30c13e15 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/VAppStore.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/VAppStore.kt @@ -1,6 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder +import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider const val V_APP_STORE_URL = "vivoMarket://details?id=" @@ -8,7 +8,7 @@ const val V_APP_STORE_URL = "vivoMarket://details?id=" * Opens application's page in [V-AppStore](https://developer.vivo.com/home) */ object VAppStore : AppStore { - override fun getIntent(packageName: String) = AndroidIntentBuilder - .addUriString("$V_APP_STORE_URL$packageName") + override fun getIntent(packageName: String) = StoreIntentProvider + .Builder("$V_APP_STORE_URL$packageName") .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/ZTEAppCenter.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/ZTEAppCenter.kt index 255f76ff..e8606425 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/ZTEAppCenter.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/stores/ZTEAppCenter.kt @@ -1,6 +1,6 @@ package com.pouyaheydari.appupdater.core.stores -import com.pouyaheydari.appupdater.core.utils.AndroidIntentBuilder +import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider const val ZTE_APP_CENTER_URL = "zte_market://appdetails?pname=" @@ -8,7 +8,7 @@ const val ZTE_APP_CENTER_URL = "zte_market://appdetails?pname=" * Opens application's page in [ZTE App Store](https://apps.ztems.com/) */ object ZTEAppCenter : AppStore { - override fun getIntent(packageName: String) = AndroidIntentBuilder - .addUriString("$ZTE_APP_CENTER_URL$packageName") + override fun getIntent(packageName: String) = StoreIntentProvider + .Builder("$ZTE_APP_CENTER_URL$packageName") .build() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/utils/AndroidIntentBuilder.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/utils/AndroidIntentBuilder.kt deleted file mode 100644 index a0dd959e..00000000 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/utils/AndroidIntentBuilder.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.pouyaheydari.appupdater.core.utils - -import android.content.Intent -import android.net.Uri - -internal object AndroidIntentBuilder { - private var uri: Uri? = null - private var packageName: String? = null - - fun addUriString(uriString: String): AndroidIntentBuilder { - uri = Uri.parse(uriString) - return this - } - - fun addPackage(packageName: String): AndroidIntentBuilder { - this.packageName = packageName - return this - } - - fun build(): Intent { - requireNotNull(uri) { "URI must be set before calling build()" } - - return Intent(Intent.ACTION_VIEW, uri).apply { - packageName?.takeIf { it.isNotBlank() }?.let { setPackage(it) } - } - } -} diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreIntentProvider.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreIntentProvider.kt new file mode 100644 index 00000000..4895678c --- /dev/null +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreIntentProvider.kt @@ -0,0 +1,22 @@ +package com.pouyaheydari.appupdater.core.utils + +import android.content.Intent +import android.net.Uri + +internal object StoreIntentProvider { + internal class Builder(private val uriString: String) { + private var storePackageName: String? = null + + fun withPackage(storePackageName: String): Builder { + require(storePackageName.isNotBlank()) { "Store's package name most not be empty" } + this.storePackageName = storePackageName + return this + } + + fun build(): Intent = + Intent(Intent.ACTION_VIEW, Uri.parse(uriString)).apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK + storePackageName?.takeIf { it.isNotBlank() }?.let { setPackage(it) } + } + } +} diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreOpener.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreOpener.kt index f18c7c9c..22c7f3e4 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreOpener.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreOpener.kt @@ -5,43 +5,45 @@ import android.content.Context import android.content.Intent import android.content.Intent.FLAG_ACTIVITY_NEW_TASK import android.net.Uri -import android.widget.Toast -import com.pouyaheydari.appupdater.core.R +import android.util.Log import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel import java.util.Locale fun showAppInSelectedStore(context: Context?, storeModel: ShowStoreModel) { try { - val intent = storeModel.store.provider?.getDeclaredConstructor()?.newInstance()?.getIntent(storeModel.packageName) - intent?.addFlags(FLAG_ACTIVITY_NEW_TASK) + val intent = getStoreIntent(storeModel) context?.startActivity(intent) } catch (e: ActivityNotFoundException) { e.printStackTrace() - openWebViewToShowFallbackUrl(context, storeModel.fallbackUrl, storeModel.store.name) + showFallbackUrlOrCallErrorFallback(storeModel, context) } } -private fun openWebViewToShowFallbackUrl(context: Context?, fallbackUrl: String, storeName: String) { - if (fallbackUrl.isNotEmpty()) { - try { - val webViewIntent = Intent(Intent.ACTION_VIEW, Uri.parse(fallbackUrl)).run { - addFlags(FLAG_ACTIVITY_NEW_TASK) - } - context?.startActivity(webViewIntent) - } catch (e: ActivityNotFoundException) { - e.printStackTrace() - showErrorToast(context, storeName) - } +private fun getStoreIntent(storeModel: ShowStoreModel) = + storeModel.store.provider?.getDeclaredConstructor()?.newInstance()?.getIntent(storeModel.packageName) + +private fun showFallbackUrlOrCallErrorFallback(storeModel: ShowStoreModel, context: Context?) { + if (storeModel.fallbackUrl.isNotEmpty()) { + showFallbackUrlInDefaultBrowser(context, storeModel) } else { - showErrorToast(context, storeName) + handleError(storeModel.store.name, storeModel.errorCallBack) + } +} + +private fun showFallbackUrlInDefaultBrowser(context: Context?, storeModel: ShowStoreModel) { + try { + val webViewIntent = Intent(Intent.ACTION_VIEW, Uri.parse(storeModel.fallbackUrl)).run { + addFlags(FLAG_ACTIVITY_NEW_TASK) + } + context?.startActivity(webViewIntent) + } catch (e: ActivityNotFoundException) { + e.printStackTrace() + handleError(storeModel.store.name, storeModel.errorCallBack) } } -private fun showErrorToast(context: Context?, storeName: String) { +private fun handleError(storeName: String, errorCallBack: () -> Unit) { val lowerCaseStoreName = storeName.lowercase(Locale.ROOT).replace("_", " ") - Toast.makeText( - context, - context?.getString(R.string.appupdater_please_install, lowerCaseStoreName), - Toast.LENGTH_LONG, - ).show() + Log.e(TAG, "$lowerCaseStoreName is not installed") + errorCallBack() } From 9443da6f9b389c2ad83afadddf7ff9d0224ce14e Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Sun, 14 Jan 2024 18:40:57 +0100 Subject: [PATCH 015/117] Added mockito dependency --- app/build.gradle.kts | 7 ++++++- appupdater/build.gradle.kts | 7 ++++++- compose/build.gradle.kts | 7 ++++++- core/build.gradle.kts | 12 ++++++++++-- gradle/libs.versions.toml | 4 ++++ 5 files changed, 32 insertions(+), 5 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 772f66b4..706f8b2b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -18,8 +18,13 @@ android { } namespace = "com.pouyaheydari.androidappupdater" + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + kotlinOptions { - jvmTarget = "1.8" + jvmTarget = "17" } buildFeatures { compose = true diff --git a/appupdater/build.gradle.kts b/appupdater/build.gradle.kts index d92e2fd0..0a22346d 100644 --- a/appupdater/build.gradle.kts +++ b/appupdater/build.gradle.kts @@ -9,8 +9,13 @@ android { minSdk = libs.versions.minSdkVersion.get().toInt() testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + kotlinOptions { - jvmTarget = "1.8" + jvmTarget = "17" } buildFeatures { viewBinding = true diff --git a/compose/build.gradle.kts b/compose/build.gradle.kts index b9bb15ea..e49be745 100644 --- a/compose/build.gradle.kts +++ b/compose/build.gradle.kts @@ -22,8 +22,13 @@ android { } namespace = "com.pouyaheydari.appupdater.compose" + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + kotlinOptions { - jvmTarget = "1.8" + jvmTarget = "17" } buildFeatures { compose = true diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 9db5490f..398caef0 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -7,11 +7,17 @@ plugins { android { compileSdk = libs.versions.compileSdkVersion.get().toInt() defaultConfig { - minSdk = libs.versions.minSdkVersion.get().toInt() + minSdk = 21 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + kotlinOptions { - jvmTarget = "1.8" + jvmTarget = "17" } publishing { singleVariant("release") { @@ -28,6 +34,8 @@ dependencies { implementation(libs.coroutines) // testing dependency testImplementation(libs.junit4) + testImplementation(libs.mockito) + testImplementation(libs.mockito.kotlin) androidTestImplementation(libs.androidTestJUnit) androidTestImplementation(libs.androidTestRules) androidTestImplementation(libs.androidTestEspresso) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f666ecb2..7e8d706a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -19,6 +19,8 @@ coroutines = "1.7.3" fragment = "1.6.2" androidxComposeBom = "2023.10.01" composeActivity = "1.8.2" +mockito = "5.8.0" +mockitoKotlin = "5.2.1" [libraries] agp = { module = "com.android.tools.build:gradle", version.ref = "agp" } @@ -26,6 +28,8 @@ kotlin-gradle-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", v appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } constraintLayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintLayout" } junit4 = { group = "junit", name = "junit", version.ref = "junit4" } +mockito = { group = "org.mockito", name = "mockito-core", version.ref = "mockito" } +mockito-kotlin = { group = "org.mockito.kotlin", name = "mockito-kotlin", version.ref = "mockitoKotlin" } espresso-intents = { group = "androidx.test.espresso", name = "espresso-intents", version.ref = "androidTestEspresso" } androidTestJUnit = { group = "androidx.test.ext", name = "junit", version.ref = "androidTestJUnit" } androidTestRules = { group = "androidx.test", name = "rules", version.ref = "androidTestRules" } From 459c2658bda9a7b6e22a9f691e2b9a634dfa9f4e Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Mon, 5 Feb 2024 11:51:20 +0100 Subject: [PATCH 016/117] Upgraded dependencies --- app/build.gradle.kts | 2 +- compose/build.gradle.kts | 2 +- core/build.gradle.kts | 7 ++++--- gradle.properties | 2 -- gradle/libs.versions.toml | 9 +++++---- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 706f8b2b..ebf90c27 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -30,7 +30,7 @@ android { compose = true } composeOptions { - kotlinCompilerExtensionVersion = libs.versions.compose.get() + kotlinCompilerExtensionVersion = libs.versions.composeCompilerExtension.get() } packaging { resources { diff --git a/compose/build.gradle.kts b/compose/build.gradle.kts index e49be745..ee31efce 100644 --- a/compose/build.gradle.kts +++ b/compose/build.gradle.kts @@ -34,7 +34,7 @@ android { compose = true } composeOptions { - kotlinCompilerExtensionVersion = libs.versions.compose.get() + kotlinCompilerExtensionVersion = libs.versions.composeCompilerExtension.get() } packaging { resources { diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 398caef0..e8fc663d 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -7,7 +7,7 @@ plugins { android { compileSdk = libs.versions.compileSdkVersion.get().toInt() defaultConfig { - minSdk = 21 + minSdk = libs.versions.minSdkVersion.get().toInt() testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } @@ -29,10 +29,11 @@ android { } dependencies { - // support dependency implementation(libs.appcompat) implementation(libs.coroutines) - // testing dependency + implementation(libs.kotlin.reflect) + + // testing testImplementation(libs.junit4) testImplementation(libs.mockito) testImplementation(libs.mockito.kotlin) diff --git a/gradle.properties b/gradle.properties index e90d4945..d7c010e7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,5 +2,3 @@ org.gradle.jvmargs=-Xmx1536m kotlin.code.style=official android.useAndroidX=true org.gradle.parallel=true -android.nonTransitiveRClass=true -android.nonFinalResIds=false diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7e8d706a..58d10190 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,7 +4,7 @@ compileSdkVersion = "34" minSdkVersion = "16" composeMinSdkVersion = "21" targetSdkVersion = "34" -agp = "8.2.0" +agp = "8.2.2" kotlin = "1.9.21" appcompat = "1.6.1" constraintLayout = "2.1.4" @@ -13,18 +13,19 @@ androidTestJUnit = "1.1.5" androidTestRules = "1.5.0" androidTestEspresso = "3.5.1" recyclerView = "1.3.2" -compose = "1.5.7" -lifecycle = "2.6.2" +composeCompilerExtension = "1.5.7" +lifecycle = "2.7.0" coroutines = "1.7.3" fragment = "1.6.2" androidxComposeBom = "2023.10.01" composeActivity = "1.8.2" -mockito = "5.8.0" +mockito = "5.10.0" mockitoKotlin = "5.2.1" [libraries] agp = { module = "com.android.tools.build:gradle", version.ref = "agp" } kotlin-gradle-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } +kotlin-reflect = { group = "org.jetbrains.kotlin", name = "kotlin-reflect", version.ref = "kotlin" } appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } constraintLayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintLayout" } junit4 = { group = "junit", name = "junit", version.ref = "junit4" } From 7552913d7d9d26c4e11f8f403be482f419d3af04 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Mon, 5 Feb 2024 11:52:14 +0100 Subject: [PATCH 017/117] Changed object creation to kotlin reflect --- .../java/com/pouyaheydari/appupdater/core/utils/StoreOpener.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreOpener.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreOpener.kt index 22c7f3e4..e6e3907e 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreOpener.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreOpener.kt @@ -20,7 +20,7 @@ fun showAppInSelectedStore(context: Context?, storeModel: ShowStoreModel) { } private fun getStoreIntent(storeModel: ShowStoreModel) = - storeModel.store.provider?.getDeclaredConstructor()?.newInstance()?.getIntent(storeModel.packageName) + storeModel.store.provider?.kotlin?.objectInstance?.getIntent(storeModel.packageName) private fun showFallbackUrlOrCallErrorFallback(storeModel: ShowStoreModel, context: Context?) { if (storeModel.fallbackUrl.isNotEmpty()) { From 08b6fc96d5d0bba2a1b00cf4b572baf895500fcb Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Mon, 5 Feb 2024 11:52:47 +0100 Subject: [PATCH 018/117] Added StoreIntentProviderTest.kt --- .../core/utils/StoreIntentProviderTest.kt | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 core/src/androidTest/java/com/pouyaheydari/appupdater/core/utils/StoreIntentProviderTest.kt diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/utils/StoreIntentProviderTest.kt b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/utils/StoreIntentProviderTest.kt new file mode 100644 index 00000000..659577f2 --- /dev/null +++ b/core/src/androidTest/java/com/pouyaheydari/appupdater/core/utils/StoreIntentProviderTest.kt @@ -0,0 +1,49 @@ +package com.pouyaheydari.appupdater.core.utils + +import android.content.Intent +import android.net.Uri +import androidx.test.ext.junit.runners.AndroidJUnit4 +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull +import org.junit.Assert.assertThrows +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class StoreIntentProviderTest { + @Test + fun test_happyPath() { + val uriString = "https://pouyaheydari.com" + val packageName = "PackageName" + + val intent = StoreIntentProvider.Builder(uriString).withPackage(packageName).build() + + assertEquals(Intent.ACTION_VIEW, intent.action) + assertEquals(Intent.FLAG_ACTIVITY_NEW_TASK, intent.flags) + assertEquals(packageName, intent.`package`) + assertEquals(Uri.parse(uriString), intent.data) + } + + @Test + fun test_intentWithValidUriStringAndNoStorePackageName() { + val uriString = "https://pouyaheydari.com" + + val intent = StoreIntentProvider.Builder(uriString).build() + + assertEquals(Intent.ACTION_VIEW, intent.action) + assertEquals(Intent.FLAG_ACTIVITY_NEW_TASK, intent.flags) + assertEquals(Uri.parse(uriString), intent.data) + assertNull(intent.`package`) + } + + @Test + fun test_intentWithValidUriStringAndEmptyStorePackageNameThrowsException() { + val uriString = "https://pouyaheydari.com" + val packageName = "" + val builder = StoreIntentProvider.Builder(uriString) + + assertThrows(IllegalArgumentException::class.java) { + builder.withPackage(packageName) + } + } +} From 733d93c4ecb74a2d3d2b5172bf0697c619c1c268 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Sat, 2 Mar 2024 19:10:21 +0100 Subject: [PATCH 019/117] Separated store and directdownload modules --- .../ui/android/MainActivity.kt | 2 +- .../ui/compose/ComposeSampleActivity.kt | 2 +- .../utils/ComposePreviewData.kt | 4 +- .../androidappupdater/utils/DSLPreviewData.kt | 5 +- .../utils/FragmentDialogPreviewData.kt | 7 +- appupdater/build.gradle.kts | 4 +- .../com/pouyaheydari/appupdater/TestUtils.kt | 48 -------------- .../appupdater/AppUpdaterDialog.kt | 42 ++---------- .../appupdater/AppUpdaterViewModel.kt | 15 +++-- .../adapters/DirectRecyclerAdapter.kt | 2 +- .../adapters/StoresRecyclerAdapter.kt | 2 +- .../pouyaheydari/appupdater/dsl/DSLUtils.kt | 2 +- .../appupdater/mapper/SelectedThemeMapper.kt | 8 +-- .../appupdater/pojo/DialogStates.kt | 2 +- .../appupdater/pojo/UpdaterDialogData.kt | 4 +- .../appupdater/pojo/UpdaterFragmentModel.kt | 4 +- build.gradle.kts | 2 +- compose/build.gradle.kts | 3 +- .../data/mapper/UpdaterDialogUIMapper.kt | 4 +- .../compose/ui/AndroidAppUpdaterScreen.kt | 6 +- .../compose/ui/AndroidAppUpdaterViewModel.kt | 8 +-- .../ui/AndroidAppUpdaterViewModelFactory.kt | 2 +- .../components/AppUpdaterDialogComponent.kt | 2 +- .../compose/ui/models/DialogScreenIntents.kt | 2 +- .../compose/ui/models/DialogScreenState.kt | 2 +- .../compose/ui/models/UpdaterDialogData.kt | 4 +- .../compose/ui/models/UpdaterDialogUIData.kt | 2 +- .../compose/ui/models/UpdaterViewModelData.kt | 4 +- .../compose/utils/AppUpdaterPreviewData.kt | 4 +- .../utils/GetApkIfActivityIsNotNull.kt | 8 +-- .../compose/utils/IsDarkThemeSelected.kt | 2 +- core/build.gradle.kts | 11 ---- core/src/main/AndroidManifest.xml | 25 +------- .../appupdater/core/data/Repository.kt | 13 ---- .../appupdater/core/data/model/Store.kt | 42 ------------ .../core/interactors/GetIsUpdateInProgress.kt | 8 --- .../interactors/GetRequestIdInteractor.kt | 8 --- .../core/interactors/SetIsUpdateInProgress.kt | 10 --- .../interactors/SetRequestIdInteractor.kt | 10 --- .../core/receiver/DownloadFinishedReceiver.kt | 51 --------------- .../appupdater/core/utils/Constants.kt | 4 +- .../core/utils/ContextExtensions.kt | 64 ------------------- .../appupdater/core/utils/CoroutineUtils.kt | 8 --- .../appupdater/core/utils/StoreListUtil.kt | 11 ---- directdownload/.gitignore | 1 + directdownload/build.gradle.kts | 56 ++++++++++++++++ directdownload/src/main/AndroidManifest.xml | 25 ++++++++ .../data/UpdateInProgressRepositoryImpl.kt | 26 ++++++++ .../data}/fileprovider/GenericFileProvider.kt | 2 +- .../domain/GetIsUpdateInProgress.kt | 8 +++ .../domain/GetRequestIdInteractor.kt | 7 ++ .../domain/SetIsUpdateInProgress.kt | 9 +++ .../domain/SetRequestIdInteractor.kt | 9 +++ .../domain/UpdateInProgressRepository.kt | 10 +++ .../receiver/DownloadFinishedReceiver.kt | 58 +++++++++++++++++ .../directdownload/utils/ContextExtensions.kt | 11 ++++ .../directdownload/utils/DownloadAPK.kt | 39 ++++++----- .../utils/DownloadAPKPermissionManager.kt | 55 ++++++++++++++++ .../directdownload}/utils/InstallApkUtil.kt | 36 +++++------ .../src/main/res/xml/provider_paths.xml | 0 gradle/libs.versions.toml | 8 +-- settings.gradle.kts | 2 +- store/.gitignore | 1 + store/build.gradle.kts | 60 +++++++++++++++++ .../store}/stores/AmazonAppStoreTest.kt | 10 +-- .../appupdater/store}/stores/AptoideTest.kt | 10 +-- .../store}/stores/CafeBazaarStoreTest.kt | 10 +-- .../appupdater/store}/stores/FDroidTest.kt | 10 +-- .../store}/stores/GooglePlayStoreTest.kt | 10 +-- .../store}/stores/HuaweiAppGalleryTest.kt | 10 +-- .../store}/stores/LenovoAppCenterTest.kt | 9 +-- .../store}/stores/MiGetAppStoreTest.kt | 9 +-- .../store}/stores/MyketStoreTest.kt | 10 +-- .../appupdater/store}/stores/NineAppsTest.kt | 10 +-- .../store}/stores/OneStoreAppMarketTest.kt | 9 +-- .../store}/stores/OppoAppMarketTest.kt | 10 +-- .../store}/stores/SamsungGalaxyStoreTest.kt | 9 +-- .../store}/stores/TencentStoreTest.kt | 9 +-- .../appupdater/store}/stores/VAppStoreTest.kt | 9 +-- .../store}/stores/ZTEAppCenterTest.kt | 9 +-- .../store}/utils/StoreIntentProviderTest.kt | 3 +- .../androidappupdater/store/StoreListUtil.kt | 6 ++ .../store/domain}/StoreIntentProvider.kt | 11 ++-- .../store/domain/StoreManager.kt | 7 +- .../store}/model/ShowStoreModel.kt | 2 +- .../androidappupdater/store/model/Store.kt | 42 ++++++++++++ .../store}/model/StoreListItem.kt | 8 +-- .../androidappupdater/store}/model/Theme.kt | 2 +- .../store}/stores/AmazonAppStore.kt | 4 +- .../store}/stores/AppStore.kt | 2 +- .../store}/stores/Aptoide.kt | 4 +- .../store}/stores/CafeBazaarStore.kt | 4 +- .../androidappupdater/store}/stores/FDroid.kt | 4 +- .../store}/stores/GooglePlayStore.kt | 4 +- .../store}/stores/HuaweiAppGallery.kt | 4 +- .../store}/stores/LenovoAppCenter.kt | 4 +- .../store}/stores/MiGetAppStore.kt | 4 +- .../store}/stores/MyketStore.kt | 4 +- .../store}/stores/NineApps.kt | 4 +- .../store}/stores/OneStoreAppMarket.kt | 4 +- .../store}/stores/OppoAppMarket.kt | 4 +- .../store}/stores/SamsungGalaxyStore.kt | 4 +- .../store}/stores/TencentAppStore.kt | 4 +- .../store}/stores/VAppStore.kt | 4 +- .../store}/stores/ZTEAppCenter.kt | 4 +- .../store}/utils/StoreListUtilTest.kt | 27 ++++++-- 106 files changed, 653 insertions(+), 570 deletions(-) delete mode 100644 appupdater/src/androidTest/java/com/pouyaheydari/appupdater/TestUtils.kt delete mode 100644 core/src/main/java/com/pouyaheydari/appupdater/core/data/Repository.kt delete mode 100644 core/src/main/java/com/pouyaheydari/appupdater/core/data/model/Store.kt delete mode 100644 core/src/main/java/com/pouyaheydari/appupdater/core/interactors/GetIsUpdateInProgress.kt delete mode 100644 core/src/main/java/com/pouyaheydari/appupdater/core/interactors/GetRequestIdInteractor.kt delete mode 100644 core/src/main/java/com/pouyaheydari/appupdater/core/interactors/SetIsUpdateInProgress.kt delete mode 100644 core/src/main/java/com/pouyaheydari/appupdater/core/interactors/SetRequestIdInteractor.kt delete mode 100644 core/src/main/java/com/pouyaheydari/appupdater/core/receiver/DownloadFinishedReceiver.kt delete mode 100644 core/src/main/java/com/pouyaheydari/appupdater/core/utils/ContextExtensions.kt delete mode 100644 core/src/main/java/com/pouyaheydari/appupdater/core/utils/CoroutineUtils.kt delete mode 100644 core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreListUtil.kt create mode 100644 directdownload/.gitignore create mode 100644 directdownload/build.gradle.kts create mode 100644 directdownload/src/main/AndroidManifest.xml create mode 100644 directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/data/UpdateInProgressRepositoryImpl.kt rename {core/src/main/java/com/pouyaheydari/appupdater/core => directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/data}/fileprovider/GenericFileProvider.kt (64%) create mode 100644 directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/domain/GetIsUpdateInProgress.kt create mode 100644 directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/domain/GetRequestIdInteractor.kt create mode 100644 directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/domain/SetIsUpdateInProgress.kt create mode 100644 directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/domain/SetRequestIdInteractor.kt create mode 100644 directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/domain/UpdateInProgressRepository.kt create mode 100644 directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/receiver/DownloadFinishedReceiver.kt create mode 100644 directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/utils/ContextExtensions.kt rename core/src/main/java/com/pouyaheydari/appupdater/core/utils/DownloadAPKUtil.kt => directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/utils/DownloadAPK.kt (59%) create mode 100644 directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/utils/DownloadAPKPermissionManager.kt rename {core/src/main/java/com/pouyaheydari/appupdater/core => directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload}/utils/InstallApkUtil.kt (56%) rename {core => directdownload}/src/main/res/xml/provider_paths.xml (100%) create mode 100644 store/.gitignore create mode 100644 store/build.gradle.kts rename {core/src/androidTest/java/com/pouyaheydari/appupdater/core => store/src/androidTest/java/com/pouyaheydari/appupdater/store}/stores/AmazonAppStoreTest.kt (72%) rename {core/src/androidTest/java/com/pouyaheydari/appupdater/core => store/src/androidTest/java/com/pouyaheydari/appupdater/store}/stores/AptoideTest.kt (72%) rename {core/src/androidTest/java/com/pouyaheydari/appupdater/core => store/src/androidTest/java/com/pouyaheydari/appupdater/store}/stores/CafeBazaarStoreTest.kt (72%) rename {core/src/androidTest/java/com/pouyaheydari/appupdater/core => store/src/androidTest/java/com/pouyaheydari/appupdater/store}/stores/FDroidTest.kt (72%) rename {core/src/androidTest/java/com/pouyaheydari/appupdater/core => store/src/androidTest/java/com/pouyaheydari/appupdater/store}/stores/GooglePlayStoreTest.kt (72%) rename {core/src/androidTest/java/com/pouyaheydari/appupdater/core => store/src/androidTest/java/com/pouyaheydari/appupdater/store}/stores/HuaweiAppGalleryTest.kt (72%) rename {core/src/androidTest/java/com/pouyaheydari/appupdater/core => store/src/androidTest/java/com/pouyaheydari/appupdater/store}/stores/LenovoAppCenterTest.kt (74%) rename {core/src/androidTest/java/com/pouyaheydari/appupdater/core => store/src/androidTest/java/com/pouyaheydari/appupdater/store}/stores/MiGetAppStoreTest.kt (75%) rename {core/src/androidTest/java/com/pouyaheydari/appupdater/core => store/src/androidTest/java/com/pouyaheydari/appupdater/store}/stores/MyketStoreTest.kt (72%) rename {core/src/androidTest/java/com/pouyaheydari/appupdater/core => store/src/androidTest/java/com/pouyaheydari/appupdater/store}/stores/NineAppsTest.kt (72%) rename {core/src/androidTest/java/com/pouyaheydari/appupdater/core => store/src/androidTest/java/com/pouyaheydari/appupdater/store}/stores/OneStoreAppMarketTest.kt (74%) rename {core/src/androidTest/java/com/pouyaheydari/appupdater/core => store/src/androidTest/java/com/pouyaheydari/appupdater/store}/stores/OppoAppMarketTest.kt (72%) rename {core/src/androidTest/java/com/pouyaheydari/appupdater/core => store/src/androidTest/java/com/pouyaheydari/appupdater/store}/stores/SamsungGalaxyStoreTest.kt (74%) rename {core/src/androidTest/java/com/pouyaheydari/appupdater/core => store/src/androidTest/java/com/pouyaheydari/appupdater/store}/stores/TencentStoreTest.kt (75%) rename {core/src/androidTest/java/com/pouyaheydari/appupdater/core => store/src/androidTest/java/com/pouyaheydari/appupdater/store}/stores/VAppStoreTest.kt (74%) rename {core/src/androidTest/java/com/pouyaheydari/appupdater/core => store/src/androidTest/java/com/pouyaheydari/appupdater/store}/stores/ZTEAppCenterTest.kt (74%) rename {core/src/androidTest/java/com/pouyaheydari/appupdater/core => store/src/androidTest/java/com/pouyaheydari/appupdater/store}/utils/StoreIntentProviderTest.kt (92%) create mode 100644 store/src/main/java/com/pouyaheydari/androidappupdater/store/StoreListUtil.kt rename {core/src/main/java/com/pouyaheydari/appupdater/core/utils => store/src/main/java/com/pouyaheydari/androidappupdater/store/domain}/StoreIntentProvider.kt (60%) rename core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreOpener.kt => store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreManager.kt (85%) rename {core/src/main/java/com/pouyaheydari/appupdater/core/data => store/src/main/java/com/pouyaheydari/androidappupdater/store}/model/ShowStoreModel.kt (76%) create mode 100644 store/src/main/java/com/pouyaheydari/androidappupdater/store/model/Store.kt rename {core/src/main/java/com/pouyaheydari/appupdater/core/data => store/src/main/java/com/pouyaheydari/androidappupdater/store}/model/StoreListItem.kt (85%) rename {core/src/main/java/com/pouyaheydari/appupdater/core/data => store/src/main/java/com/pouyaheydari/androidappupdater/store}/model/Theme.kt (62%) rename {core/src/main/java/com/pouyaheydari/appupdater/core => store/src/main/java/com/pouyaheydari/androidappupdater/store}/stores/AmazonAppStore.kt (77%) rename {core/src/main/java/com/pouyaheydari/appupdater/core => store/src/main/java/com/pouyaheydari/androidappupdater/store}/stores/AppStore.kt (64%) rename {core/src/main/java/com/pouyaheydari/appupdater/core => store/src/main/java/com/pouyaheydari/androidappupdater/store}/stores/Aptoide.kt (74%) rename {core/src/main/java/com/pouyaheydari/appupdater/core => store/src/main/java/com/pouyaheydari/androidappupdater/store}/stores/CafeBazaarStore.kt (74%) rename {core/src/main/java/com/pouyaheydari/appupdater/core => store/src/main/java/com/pouyaheydari/androidappupdater/store}/stores/FDroid.kt (74%) rename {core/src/main/java/com/pouyaheydari/appupdater/core => store/src/main/java/com/pouyaheydari/androidappupdater/store}/stores/GooglePlayStore.kt (74%) rename {core/src/main/java/com/pouyaheydari/appupdater/core => store/src/main/java/com/pouyaheydari/androidappupdater/store}/stores/HuaweiAppGallery.kt (77%) rename {core/src/main/java/com/pouyaheydari/appupdater/core => store/src/main/java/com/pouyaheydari/androidappupdater/store}/stores/LenovoAppCenter.kt (71%) rename {core/src/main/java/com/pouyaheydari/appupdater/core => store/src/main/java/com/pouyaheydari/androidappupdater/store}/stores/MiGetAppStore.kt (71%) rename {core/src/main/java/com/pouyaheydari/appupdater/core => store/src/main/java/com/pouyaheydari/androidappupdater/store}/stores/MyketStore.kt (73%) rename {core/src/main/java/com/pouyaheydari/appupdater/core => store/src/main/java/com/pouyaheydari/androidappupdater/store}/stores/NineApps.kt (75%) rename {core/src/main/java/com/pouyaheydari/appupdater/core => store/src/main/java/com/pouyaheydari/androidappupdater/store}/stores/OneStoreAppMarket.kt (74%) rename {core/src/main/java/com/pouyaheydari/appupdater/core => store/src/main/java/com/pouyaheydari/androidappupdater/store}/stores/OppoAppMarket.kt (75%) rename {core/src/main/java/com/pouyaheydari/appupdater/core => store/src/main/java/com/pouyaheydari/androidappupdater/store}/stores/SamsungGalaxyStore.kt (73%) rename {core/src/main/java/com/pouyaheydari/appupdater/core => store/src/main/java/com/pouyaheydari/androidappupdater/store}/stores/TencentAppStore.kt (71%) rename {core/src/main/java/com/pouyaheydari/appupdater/core => store/src/main/java/com/pouyaheydari/androidappupdater/store}/stores/VAppStore.kt (70%) rename {core/src/main/java/com/pouyaheydari/appupdater/core => store/src/main/java/com/pouyaheydari/androidappupdater/store}/stores/ZTEAppCenter.kt (71%) rename {core/src/test/java/com/pouyaheydari/appupdater/core => store/src/test/java/com/pouyaheydari/appupdater/store}/utils/StoreListUtilTest.kt (63%) diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/android/MainActivity.kt b/app/src/main/java/com/pouyaheydari/androidappupdater/ui/android/MainActivity.kt index 4c2c4c5a..9a62d9bf 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/android/MainActivity.kt +++ b/app/src/main/java/com/pouyaheydari/androidappupdater/ui/android/MainActivity.kt @@ -6,11 +6,11 @@ import android.os.Bundle import android.widget.Button import androidx.appcompat.app.AppCompatActivity import com.pouyaheydari.androidappupdater.R +import com.pouyaheydari.androidappupdater.store.model.Theme import com.pouyaheydari.androidappupdater.ui.compose.ComposeSampleActivity import com.pouyaheydari.androidappupdater.utils.getDSLList import com.pouyaheydari.androidappupdater.utils.getNormalList import com.pouyaheydari.appupdater.AppUpdaterDialog -import com.pouyaheydari.appupdater.core.data.model.Theme import com.pouyaheydari.appupdater.dsl.updateDialogBuilder import com.pouyaheydari.appupdater.pojo.UpdaterDialogData diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt b/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt index 34700177..c72412d0 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt +++ b/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt @@ -17,13 +17,13 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import com.pouyaheydari.androidappupdater.R +import com.pouyaheydari.androidappupdater.store.model.Theme import com.pouyaheydari.androidappupdater.ui.compose.theme.AndroidAppUpdaterTheme import com.pouyaheydari.androidappupdater.utils.directDownloadList import com.pouyaheydari.androidappupdater.utils.getNormalList import com.pouyaheydari.androidappupdater.utils.storeList import com.pouyaheydari.appupdater.compose.ui.AndroidAppUpdater import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogData -import com.pouyaheydari.appupdater.core.data.model.Theme import com.pouyaheydari.appupdater.core.R as coreR /** diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/utils/ComposePreviewData.kt b/app/src/main/java/com/pouyaheydari/androidappupdater/utils/ComposePreviewData.kt index b73a59ab..1484a755 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/utils/ComposePreviewData.kt +++ b/app/src/main/java/com/pouyaheydari/androidappupdater/utils/ComposePreviewData.kt @@ -1,7 +1,7 @@ package com.pouyaheydari.androidappupdater.utils -import com.pouyaheydari.appupdater.core.data.model.Store -import com.pouyaheydari.appupdater.core.data.model.StoreListItem +import com.pouyaheydari.androidappupdater.store.model.Store +import com.pouyaheydari.androidappupdater.store.model.StoreListItem import com.pouyaheydari.appupdater.core.R as coreR internal val directDownloadList = listOf( diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/utils/DSLPreviewData.kt b/app/src/main/java/com/pouyaheydari/androidappupdater/utils/DSLPreviewData.kt index 1faa47dd..6bdf9618 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/utils/DSLPreviewData.kt +++ b/app/src/main/java/com/pouyaheydari/androidappupdater/utils/DSLPreviewData.kt @@ -2,13 +2,10 @@ package com.pouyaheydari.androidappupdater.utils import android.content.Context import com.pouyaheydari.androidappupdater.R -import com.pouyaheydari.appupdater.core.data.model.Store +import com.pouyaheydari.androidappupdater.store.model.Store import com.pouyaheydari.appupdater.dsl.store import com.pouyaheydari.appupdater.core.R as coreR -/** - * @return A list of [com.pouyaheydari.appupdater.core.data.model.StoreListItem] to be used in the dsl sample code - */ internal fun getDSLList(context: Context) = listOf( store { store = Store.DIRECT_URL diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/utils/FragmentDialogPreviewData.kt b/app/src/main/java/com/pouyaheydari/androidappupdater/utils/FragmentDialogPreviewData.kt index e94bd173..1e45ea66 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/utils/FragmentDialogPreviewData.kt +++ b/app/src/main/java/com/pouyaheydari/androidappupdater/utils/FragmentDialogPreviewData.kt @@ -2,13 +2,10 @@ package com.pouyaheydari.androidappupdater.utils import android.content.Context import com.pouyaheydari.androidappupdater.R -import com.pouyaheydari.appupdater.core.data.model.Store -import com.pouyaheydari.appupdater.core.data.model.StoreListItem +import com.pouyaheydari.androidappupdater.store.model.Store +import com.pouyaheydari.androidappupdater.store.model.StoreListItem import com.pouyaheydari.appupdater.core.R as coreR -/** - * @return A list of [com.pouyaheydari.appupdater.core.data.model.StoreListItem] to be used in the compose and fragment sample codes - */ internal fun getNormalList(context: Context) = listOf( // direct download StoreListItem( diff --git a/appupdater/build.gradle.kts b/appupdater/build.gradle.kts index 0a22346d..dfad8f78 100644 --- a/appupdater/build.gradle.kts +++ b/appupdater/build.gradle.kts @@ -31,7 +31,9 @@ android { dependencies { - api(project(":core")) + api(project(":store")) + api(project(":directdownload")) + // support dependency implementation(libs.appcompat) implementation(libs.constraintLayout) diff --git a/appupdater/src/androidTest/java/com/pouyaheydari/appupdater/TestUtils.kt b/appupdater/src/androidTest/java/com/pouyaheydari/appupdater/TestUtils.kt deleted file mode 100644 index 3cb3e7ea..00000000 --- a/appupdater/src/androidTest/java/com/pouyaheydari/appupdater/TestUtils.kt +++ /dev/null @@ -1,48 +0,0 @@ -package com.pouyaheydari.appupdater - -import android.Manifest -import android.content.Context -import android.content.pm.PackageManager -import androidx.core.content.ContextCompat -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.utils.isPermissionGranted -import org.junit.Assert -import org.junit.Before -import org.junit.Test -import org.junit.runner.RunWith - -@RunWith(AndroidJUnit4::class) -internal class TestUtils { - private lateinit var appContext: Context - - /** - * Providing context - */ - @Before - fun setup() { - appContext = InstrumentationRegistry.getInstrumentation().context - } - - /** - * Checks permission checker - */ - @Test - fun testCheckPermission() { - val permission = Manifest.permission.WRITE_EXTERNAL_STORAGE - val permissionCheck = appContext.isPermissionGranted(permission) - if (ContextCompat.checkSelfPermission(appContext, permission) - == PackageManager.PERMISSION_GRANTED - ) { - Assert.assertTrue( - "The permission is granted but the function is returning false", - permissionCheck, - ) - } else { - Assert.assertFalse( - "The permission is not granted but the function is returning true", - permissionCheck, - ) - } - } -} diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterDialog.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterDialog.kt index 19a97d17..13e853d6 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterDialog.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterDialog.kt @@ -16,14 +16,13 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.GridLayoutManager +import com.pouyaheydari.androidappupdater.directdownload.utils.getApk +import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.model.Store.DIRECT_URL +import com.pouyaheydari.androidappupdater.store.model.StoreListItem +import com.pouyaheydari.androidappupdater.store.shouldShowStoresDivider import com.pouyaheydari.appupdater.adapters.DirectRecyclerAdapter import com.pouyaheydari.appupdater.adapters.StoresRecyclerAdapter -import com.pouyaheydari.appupdater.core.data.model.Store.DIRECT_URL -import com.pouyaheydari.appupdater.core.data.model.StoreListItem -import com.pouyaheydari.appupdater.core.data.model.Theme -import com.pouyaheydari.appupdater.core.utils.getApk -import com.pouyaheydari.appupdater.core.utils.shouldShowStoresDivider -import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore import com.pouyaheydari.appupdater.databinding.FragmentAppUpdaterDialogBinding import com.pouyaheydari.appupdater.mapper.mapToSelectedTheme import com.pouyaheydari.appupdater.pojo.DialogStates @@ -207,37 +206,6 @@ class AppUpdaterDialog : DialogFragment() { } companion object { - /** - * @param title Title of the dialog - * @param description Description that is shown below the title - * @param storeList List of all stores that user can update your app from (including [com.pouyaheydari.appupdater.core.data.model.Store.DIRECT_URL]) - * @param isForce Should the user be able to close the dialog? - * @param typeface Typeface to be used in text views - * - * @return a new instance of [AppUpdaterDialog] - */ - @Deprecated( - message = "This function is deprecated and will be removed in the next version. Use getInstance with UpdaterDialogData input parameter instead.", - replaceWith = ReplaceWith("this.getInstance(UpdaterDialogData())", "com.pouyaheydari.appupdater.pojo.UpdaterDialogData"), - ) - fun getInstance( - title: String, - description: String, - storeList: List, - isForce: Boolean = false, - typeface: Typeface? = null, - theme: Theme = Theme.SYSTEM_DEFAULT, - ): AppUpdaterDialog = getInstance( - UpdaterDialogData( - title = title, - description = description, - storeList = storeList, - isForceUpdate = isForce, - typeface = typeface, - theme = theme, - ), - ) - /** * @param dialogData Data to be shown in the dialog * diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterViewModel.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterViewModel.kt index 77de82a2..e574f241 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterViewModel.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterViewModel.kt @@ -2,13 +2,13 @@ package com.pouyaheydari.appupdater import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel -import com.pouyaheydari.appupdater.core.data.model.Store -import com.pouyaheydari.appupdater.core.data.model.StoreListItem -import com.pouyaheydari.appupdater.core.interactors.GetIsUpdateInProgress -import com.pouyaheydari.appupdater.core.utils.runWithDelay +import com.pouyaheydari.androidappupdater.directdownload.domain.GetIsUpdateInProgress +import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.model.Store +import com.pouyaheydari.androidappupdater.store.model.StoreListItem import com.pouyaheydari.appupdater.pojo.DialogStates import com.pouyaheydari.appupdater.utils.TypefaceHolder +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch @@ -48,4 +48,9 @@ internal class AppUpdaterViewModel : ViewModel() { TypefaceHolder.clear() super.onCleared() } + + private suspend fun runWithDelay(job: () -> Unit) { + delay(100) + job() + } } diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/adapters/DirectRecyclerAdapter.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/adapters/DirectRecyclerAdapter.kt index 0999bc09..ba0f71a4 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/adapters/DirectRecyclerAdapter.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/adapters/DirectRecyclerAdapter.kt @@ -4,7 +4,7 @@ import android.graphics.Typeface import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView -import com.pouyaheydari.appupdater.core.data.model.StoreListItem +import com.pouyaheydari.androidappupdater.store.model.StoreListItem import com.pouyaheydari.appupdater.databinding.DownloadDirectItemBinding /** diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/adapters/StoresRecyclerAdapter.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/adapters/StoresRecyclerAdapter.kt index 86c1fae0..232abcc2 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/adapters/StoresRecyclerAdapter.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/adapters/StoresRecyclerAdapter.kt @@ -5,7 +5,7 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView -import com.pouyaheydari.appupdater.core.data.model.StoreListItem +import com.pouyaheydari.androidappupdater.store.model.StoreListItem import com.pouyaheydari.appupdater.databinding.DownloadStoresItemBinding import com.pouyaheydari.appupdater.pojo.UserSelectedTheme import com.pouyaheydari.appupdater.pojo.UserSelectedTheme.DARK diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/dsl/DSLUtils.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/dsl/DSLUtils.kt index 5d7af3a9..6b83232a 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/dsl/DSLUtils.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/dsl/DSLUtils.kt @@ -1,7 +1,7 @@ package com.pouyaheydari.appupdater.dsl +import com.pouyaheydari.androidappupdater.store.model.StoreListItem import com.pouyaheydari.appupdater.AppUpdaterDialog -import com.pouyaheydari.appupdater.core.data.model.StoreListItem import com.pouyaheydari.appupdater.pojo.UpdaterDialogData /** diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/mapper/SelectedThemeMapper.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/mapper/SelectedThemeMapper.kt index 0ac8037e..33d2de15 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/mapper/SelectedThemeMapper.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/mapper/SelectedThemeMapper.kt @@ -2,10 +2,10 @@ package com.pouyaheydari.appupdater.mapper import android.content.Context import android.content.res.Configuration -import com.pouyaheydari.appupdater.core.data.model.Theme -import com.pouyaheydari.appupdater.core.data.model.Theme.DARK -import com.pouyaheydari.appupdater.core.data.model.Theme.LIGHT -import com.pouyaheydari.appupdater.core.data.model.Theme.SYSTEM_DEFAULT +import com.pouyaheydari.androidappupdater.store.model.Theme +import com.pouyaheydari.androidappupdater.store.model.Theme.DARK +import com.pouyaheydari.androidappupdater.store.model.Theme.LIGHT +import com.pouyaheydari.androidappupdater.store.model.Theme.SYSTEM_DEFAULT import com.pouyaheydari.appupdater.pojo.UserSelectedTheme /** diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/DialogStates.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/DialogStates.kt index a1aa6dc6..4e76c1a2 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/DialogStates.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/DialogStates.kt @@ -1,6 +1,6 @@ package com.pouyaheydari.appupdater.pojo -import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel /** * Represents UI states of the update dialog diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/UpdaterDialogData.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/UpdaterDialogData.kt index 51ddac1b..ca54c705 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/UpdaterDialogData.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/UpdaterDialogData.kt @@ -1,8 +1,8 @@ package com.pouyaheydari.appupdater.pojo import android.graphics.Typeface -import com.pouyaheydari.appupdater.core.data.model.StoreListItem -import com.pouyaheydari.appupdater.core.data.model.Theme +import com.pouyaheydari.androidappupdater.store.model.StoreListItem +import com.pouyaheydari.androidappupdater.store.model.Theme /** * This model is used to pass the data to dialog fragment via bundles diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/UpdaterFragmentModel.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/UpdaterFragmentModel.kt index ddf7ac43..8314fc79 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/UpdaterFragmentModel.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/UpdaterFragmentModel.kt @@ -2,8 +2,8 @@ package com.pouyaheydari.appupdater.pojo import android.os.Parcel import android.os.Parcelable -import com.pouyaheydari.appupdater.core.data.model.StoreListItem -import com.pouyaheydari.appupdater.core.data.model.Theme +import com.pouyaheydari.androidappupdater.store.model.StoreListItem +import com.pouyaheydari.androidappupdater.store.model.Theme /** * This model is used to pass the data to dialog fragment via bundles diff --git a/build.gradle.kts b/build.gradle.kts index 7e02eba6..c71da440 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -18,5 +18,5 @@ allprojects { } tasks.register("clean", Delete::class) { - delete(rootProject.buildDir) + delete(rootProject.layout.buildDirectory) } diff --git a/compose/build.gradle.kts b/compose/build.gradle.kts index ee31efce..02ac5428 100644 --- a/compose/build.gradle.kts +++ b/compose/build.gradle.kts @@ -45,7 +45,8 @@ android { dependencies { - api(project(":core")) + api(project(":store")) + api(project(":directdownload")) // compose val composeBom = platform(libs.androidx.compose.bom) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/data/mapper/UpdaterDialogUIMapper.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/data/mapper/UpdaterDialogUIMapper.kt index 86900b17..b75033c0 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/data/mapper/UpdaterDialogUIMapper.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/data/mapper/UpdaterDialogUIMapper.kt @@ -1,10 +1,10 @@ package com.pouyaheydari.appupdater.compose.data.mapper +import com.pouyaheydari.androidappupdater.store.model.Store +import com.pouyaheydari.androidappupdater.store.shouldShowStoresDivider import com.pouyaheydari.appupdater.compose.ui.models.DialogHeaderModel import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogUIData import com.pouyaheydari.appupdater.compose.ui.models.UpdaterViewModelData -import com.pouyaheydari.appupdater.core.data.model.Store -import com.pouyaheydari.appupdater.core.utils.shouldShowStoresDivider internal object UpdaterDialogUIMapper { fun map(viewModelData: UpdaterViewModelData): UpdaterDialogUIData = with(viewModelData) { diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt index 0d507fdf..4b2ce39a 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt @@ -6,6 +6,9 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.lifecycle.viewmodel.compose.viewModel +import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.model.Theme import com.pouyaheydari.appupdater.compose.ui.components.AppUpdaterDialog import com.pouyaheydari.appupdater.compose.ui.components.UpdateInProgressDialogComponent import com.pouyaheydari.appupdater.compose.ui.models.DialogScreenIntents @@ -16,9 +19,6 @@ import com.pouyaheydari.appupdater.compose.utils.getApkIfActivityIsNotNull import com.pouyaheydari.appupdater.compose.utils.isDarkThemeSelected import com.pouyaheydari.appupdater.compose.utils.previewDirectDownloadListData import com.pouyaheydari.appupdater.compose.utils.previewStoreListData -import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel -import com.pouyaheydari.appupdater.core.data.model.Theme -import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore import com.pouyaheydari.appupdater.core.R as coreR /** diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt index bab8bc44..a4165aff 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt @@ -4,13 +4,13 @@ import androidx.compose.runtime.State import androidx.compose.runtime.mutableStateOf import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.pouyaheydari.androidappupdater.directdownload.domain.GetIsUpdateInProgress +import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.model.StoreListItem import com.pouyaheydari.appupdater.compose.data.mapper.UpdaterDialogUIMapper import com.pouyaheydari.appupdater.compose.ui.models.DialogScreenIntents import com.pouyaheydari.appupdater.compose.ui.models.DialogScreenState import com.pouyaheydari.appupdater.compose.ui.models.UpdaterViewModelData -import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel -import com.pouyaheydari.appupdater.core.data.model.StoreListItem -import com.pouyaheydari.appupdater.core.interactors.GetIsUpdateInProgress import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch @@ -51,7 +51,7 @@ internal class AndroidAppUpdaterViewModel( private fun startDirectUrlApkDownload(item: StoreListItem) { observeUpdateProgress() - updateState { copy(shouldShowUpdateInProgress = true, shouldStartAPKDownload = true, downloadUrl = item.url) } + updateState { copy(shouldStartAPKDownload = true, downloadUrl = item.url) } } private fun observeUpdateProgress() { diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModelFactory.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModelFactory.kt index 726a729a..f2605905 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModelFactory.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModelFactory.kt @@ -2,9 +2,9 @@ package com.pouyaheydari.appupdater.compose.ui import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.pouyaheydari.androidappupdater.directdownload.domain.GetIsUpdateInProgress import com.pouyaheydari.appupdater.compose.data.mapper.UpdaterViewModelDataMapper import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogData -import com.pouyaheydari.appupdater.core.interactors.GetIsUpdateInProgress internal class AndroidAppUpdaterViewModelFactory( private val dialogData: UpdaterDialogData, diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt index 7c7922be..0232ced9 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt @@ -18,13 +18,13 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog +import com.pouyaheydari.androidappupdater.store.model.StoreListItem import com.pouyaheydari.appupdater.compose.ui.models.DialogHeaderModel import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogUIData import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme import com.pouyaheydari.appupdater.compose.utils.previewDirectDownloadListData import com.pouyaheydari.appupdater.compose.utils.previewStoreListData import com.pouyaheydari.appupdater.core.R -import com.pouyaheydari.appupdater.core.data.model.StoreListItem @Composable internal fun AppUpdaterDialog( diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenIntents.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenIntents.kt index 038e58cc..120d2af1 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenIntents.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenIntents.kt @@ -1,6 +1,6 @@ package com.pouyaheydari.appupdater.compose.ui.models -import com.pouyaheydari.appupdater.core.data.model.StoreListItem +import com.pouyaheydari.androidappupdater.store.model.StoreListItem internal sealed interface DialogScreenIntents { data class OnStoreClicked(val item: StoreListItem) : DialogScreenIntents diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenState.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenState.kt index 41ef0458..e39f8c62 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenState.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenState.kt @@ -1,6 +1,6 @@ package com.pouyaheydari.appupdater.compose.ui.models -import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel internal data class DialogScreenState( val shouldShowDialog: Boolean = true, diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogData.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogData.kt index a17cfa90..fe601c3e 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogData.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogData.kt @@ -1,8 +1,8 @@ package com.pouyaheydari.appupdater.compose.ui.models import android.graphics.Typeface -import com.pouyaheydari.appupdater.core.data.model.StoreListItem -import com.pouyaheydari.appupdater.core.data.model.Theme +import com.pouyaheydari.androidappupdater.store.model.StoreListItem +import com.pouyaheydari.androidappupdater.store.model.Theme /** * This model is used to pass data to config the [com.pouyaheydari.appupdater.compose.ui.AndroidAppUpdater] diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogUIData.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogUIData.kt index 6f95876e..85bd779c 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogUIData.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogUIData.kt @@ -1,6 +1,6 @@ package com.pouyaheydari.appupdater.compose.ui.models -import com.pouyaheydari.appupdater.core.data.model.StoreListItem +import com.pouyaheydari.androidappupdater.store.model.StoreListItem internal data class UpdaterDialogUIData( val dialogHeader: DialogHeaderModel = DialogHeaderModel(), diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterViewModelData.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterViewModelData.kt index e98854b2..ce4f53c9 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterViewModelData.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterViewModelData.kt @@ -1,7 +1,7 @@ package com.pouyaheydari.appupdater.compose.ui.models -import com.pouyaheydari.appupdater.core.data.model.StoreListItem -import com.pouyaheydari.appupdater.core.data.model.Theme +import com.pouyaheydari.androidappupdater.store.model.StoreListItem +import com.pouyaheydari.androidappupdater.store.model.Theme internal data class UpdaterViewModelData( val dialogTitle: String = "", diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/AppUpdaterPreviewData.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/AppUpdaterPreviewData.kt index 15517505..a38acdfd 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/AppUpdaterPreviewData.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/AppUpdaterPreviewData.kt @@ -1,7 +1,7 @@ package com.pouyaheydari.appupdater.compose.utils -import com.pouyaheydari.appupdater.core.data.model.Store -import com.pouyaheydari.appupdater.core.data.model.StoreListItem +import com.pouyaheydari.androidappupdater.store.model.Store +import com.pouyaheydari.androidappupdater.store.model.StoreListItem import com.pouyaheydari.appupdater.core.R as coreR private const val CUSTOM_URL = "https://cafebazaar.ir/download/bazaar.apk" diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/GetApkIfActivityIsNotNull.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/GetApkIfActivityIsNotNull.kt index 37cd53e0..86794677 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/GetApkIfActivityIsNotNull.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/GetApkIfActivityIsNotNull.kt @@ -2,12 +2,12 @@ package com.pouyaheydari.appupdater.compose.utils import android.app.Activity import android.util.Log -import com.pouyaheydari.appupdater.core.utils.TAG -import com.pouyaheydari.appupdater.core.utils.getApk +import com.pouyaheydari.androidappupdater.directdownload.utils.getApk +import com.pouyaheydari.appupdater.core.utils.ANDROID_APP_UPDATER_DEBUG_TAG -fun getApkIfActivityIsNotNull(activity: Activity?, url: String) { +suspend fun getApkIfActivityIsNotNull(activity: Activity?, url: String) { if (activity == null) { - Log.e(TAG, "Provided activity is null. Skipping downloading the apk") + Log.e(ANDROID_APP_UPDATER_DEBUG_TAG, "Provided activity is null. Skipping downloading the apk") } else { getApk(url, activity) } diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/IsDarkThemeSelected.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/IsDarkThemeSelected.kt index 4eeb7a9a..9f566748 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/IsDarkThemeSelected.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/IsDarkThemeSelected.kt @@ -2,7 +2,7 @@ package com.pouyaheydari.appupdater.compose.utils import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.runtime.Composable -import com.pouyaheydari.appupdater.core.data.model.Theme +import com.pouyaheydari.androidappupdater.store.model.Theme /** * Returns if the dialog should be shown in dark mode based on the user selected [theme] diff --git a/core/build.gradle.kts b/core/build.gradle.kts index e8fc663d..fb8ae69d 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -28,19 +28,8 @@ android { namespace = "com.pouyaheydari.appupdater.core" } dependencies { - implementation(libs.appcompat) implementation(libs.coroutines) - implementation(libs.kotlin.reflect) - - // testing - testImplementation(libs.junit4) - testImplementation(libs.mockito) - testImplementation(libs.mockito.kotlin) - androidTestImplementation(libs.androidTestJUnit) - androidTestImplementation(libs.androidTestRules) - androidTestImplementation(libs.androidTestEspresso) - androidTestImplementation(libs.espresso.intents) } afterEvaluate { diff --git a/core/src/main/AndroidManifest.xml b/core/src/main/AndroidManifest.xml index b327c214..8072ee00 100644 --- a/core/src/main/AndroidManifest.xml +++ b/core/src/main/AndroidManifest.xml @@ -1,25 +1,2 @@ - - - - - - - - - - - - - - - + diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/data/Repository.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/data/Repository.kt deleted file mode 100644 index 1fcad30b..00000000 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/data/Repository.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.pouyaheydari.appupdater.core.data - -import kotlinx.coroutines.flow.MutableSharedFlow - -/** - * Repository to store and publish the status of downloading the APK. - */ -internal object Repository { - - var requestId = -10L - - val shouldShowUpdateInProgressDialog = MutableSharedFlow(replay = 1) -} diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/data/model/Store.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/data/model/Store.kt deleted file mode 100644 index 49d0d28d..00000000 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/data/model/Store.kt +++ /dev/null @@ -1,42 +0,0 @@ -package com.pouyaheydari.appupdater.core.data.model - -import com.pouyaheydari.appupdater.core.stores.AmazonAppStore -import com.pouyaheydari.appupdater.core.stores.AppStore -import com.pouyaheydari.appupdater.core.stores.Aptoide -import com.pouyaheydari.appupdater.core.stores.CafeBazaarStore -import com.pouyaheydari.appupdater.core.stores.FDroid -import com.pouyaheydari.appupdater.core.stores.GooglePlayStore -import com.pouyaheydari.appupdater.core.stores.HuaweiAppGallery -import com.pouyaheydari.appupdater.core.stores.LenovoAppCenter -import com.pouyaheydari.appupdater.core.stores.MiGetAppStore -import com.pouyaheydari.appupdater.core.stores.MyketStore -import com.pouyaheydari.appupdater.core.stores.NineApps -import com.pouyaheydari.appupdater.core.stores.OneStoreAppMarket -import com.pouyaheydari.appupdater.core.stores.OppoAppMarket -import com.pouyaheydari.appupdater.core.stores.SamsungGalaxyStore -import com.pouyaheydari.appupdater.core.stores.TencentAppStore -import com.pouyaheydari.appupdater.core.stores.VAppStore -import com.pouyaheydari.appupdater.core.stores.ZTEAppCenter - -/** - * Enum class to select type of market - */ -enum class Store(val provider: Class?) { - DIRECT_URL(null), - GOOGLE_PLAY(GooglePlayStore::class.java), - CAFE_BAZAAR(CafeBazaarStore::class.java), - MYKET(MyketStore::class.java), - HUAWEI_APP_GALLERY(HuaweiAppGallery::class.java), - SAMSUNG_GALAXY_STORE(SamsungGalaxyStore::class.java), - AMAZON_APP_STORE(AmazonAppStore::class.java), - APTOIDE(Aptoide::class.java), - FDROID(FDroid::class.java), - MI_GET_APP_STORE(MiGetAppStore::class.java), - ONE_STORE_APP_MARKET(OneStoreAppMarket::class.java), - OPPO_APP_MARKET(OppoAppMarket::class.java), - V_APP_STORE(VAppStore::class.java), - NINE_APPS_STORE(NineApps::class.java), - TENCENT_APPS_STORE(TencentAppStore::class.java), - ZTE_APP_CENTER(ZTEAppCenter::class.java), - LENOVO_APP_CENTER(LenovoAppCenter::class.java), -} diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/interactors/GetIsUpdateInProgress.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/interactors/GetIsUpdateInProgress.kt deleted file mode 100644 index 7d2124e6..00000000 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/interactors/GetIsUpdateInProgress.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.pouyaheydari.appupdater.core.interactors - -import com.pouyaheydari.appupdater.core.data.Repository -import kotlinx.coroutines.flow.Flow - -class GetIsUpdateInProgress { - operator fun invoke(): Flow = Repository.shouldShowUpdateInProgressDialog -} diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/interactors/GetRequestIdInteractor.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/interactors/GetRequestIdInteractor.kt deleted file mode 100644 index 06d48ef7..00000000 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/interactors/GetRequestIdInteractor.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.pouyaheydari.appupdater.core.interactors - -import com.pouyaheydari.appupdater.core.data.Repository - -internal class GetRequestIdInteractor { - - operator fun invoke(): Long = Repository.requestId -} diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/interactors/SetIsUpdateInProgress.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/interactors/SetIsUpdateInProgress.kt deleted file mode 100644 index 8d2b8a8c..00000000 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/interactors/SetIsUpdateInProgress.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.pouyaheydari.appupdater.core.interactors - -import com.pouyaheydari.appupdater.core.data.Repository - -internal class SetIsUpdateInProgress { - - operator fun invoke(isUpdateInProgress: Boolean) { - Repository.shouldShowUpdateInProgressDialog.tryEmit(isUpdateInProgress) - } -} diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/interactors/SetRequestIdInteractor.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/interactors/SetRequestIdInteractor.kt deleted file mode 100644 index 4ab4ab41..00000000 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/interactors/SetRequestIdInteractor.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.pouyaheydari.appupdater.core.interactors - -import com.pouyaheydari.appupdater.core.data.Repository - -internal class SetRequestIdInteractor { - - operator fun invoke(requestId: Long) { - Repository.requestId = requestId - } -} diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/receiver/DownloadFinishedReceiver.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/receiver/DownloadFinishedReceiver.kt deleted file mode 100644 index b9b063c3..00000000 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/receiver/DownloadFinishedReceiver.kt +++ /dev/null @@ -1,51 +0,0 @@ -package com.pouyaheydari.appupdater.core.receiver - -import android.app.DownloadManager -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent -import android.os.Build -import android.util.Log -import com.pouyaheydari.appupdater.core.R -import com.pouyaheydari.appupdater.core.interactors.GetRequestIdInteractor -import com.pouyaheydari.appupdater.core.interactors.SetIsUpdateInProgress -import com.pouyaheydari.appupdater.core.utils.TAG -import com.pouyaheydari.appupdater.core.utils.getExistingApk -import com.pouyaheydari.appupdater.core.utils.installAPK - -/** - * Receives when download is finished and opens the install dialog - */ -internal class DownloadFinishedReceiver : BroadcastReceiver() { - - /** - * To show install page when apk got downloaded successfully - */ - override fun onReceive(context: Context?, intent: Intent?) { - val action = intent?.action - if (action == DownloadManager.ACTION_DOWNLOAD_COMPLETE) { - val referenceId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1) - - // if downloaded file is our apk - if (referenceId == GetRequestIdInteractor().invoke()) { - context?.let { - hideUpdateInProgress() - verifyDownloadedApkExists(it) - } - } - } - } - - private fun hideUpdateInProgress() { - SetIsUpdateInProgress().invoke(false) - } - - private fun verifyDownloadedApkExists(context: Context) { - val existingApk = context.getExistingApk() - if (!existingApk.exists()) { - Log.e(TAG, context.getString(R.string.appupdater_couldnt_find_downloaded_file)) - } else { - installAPK(context, existingApk, Build.VERSION.SDK_INT) - } - } -} diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/utils/Constants.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/utils/Constants.kt index 31257630..2ae5b35d 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/utils/Constants.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/utils/Constants.kt @@ -2,5 +2,5 @@ package com.pouyaheydari.appupdater.core.utils // A file to store constants of the project -const val TAG = "AndroidAppUpdater" -internal const val APK_NAME = "NewAPK.apk" +const val ANDROID_APP_UPDATER_DEBUG_TAG = "AndroidAppUpdater" +const val APK_NAME = "NewAPK.apk" diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/utils/ContextExtensions.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/utils/ContextExtensions.kt deleted file mode 100644 index d9aad636..00000000 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/utils/ContextExtensions.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.pouyaheydari.appupdater.core.utils - -import android.app.Activity -import android.content.Context -import android.content.Intent -import android.content.pm.PackageManager -import android.net.Uri -import android.os.Build -import android.os.Environment -import android.provider.Settings -import androidx.core.app.ActivityCompat -import androidx.core.content.ContextCompat -import java.io.File -import java.util.Locale - -private const val PERMISSION_REQUEST_CODE = 2000 - -/** - * This function deletes the previously downloaded apk file if present, - * to avoid filling up user's phone storage. - */ -internal fun Context.deleteExistingFile() { - val file = getExistingApk() - if (file.exists()) { - file.delete() - } -} - -/** - * @return a File to the previously downloaded APK file if present. - */ -internal fun Context.getExistingApk() = File("${this.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)}/$APK_NAME") - -/** - * Check if application has a permission or not - */ -internal fun Context?.isPermissionGranted(permission: String): Boolean = if (this != null) { - ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED -} else { - false -} - -/** - * shows get permission page to user - */ -internal fun Activity?.getPermission(permission: Array) { - if (this != null) { - ActivityCompat.requestPermissions(this, permission, PERMISSION_REQUEST_CODE) - } else { - throw NullPointerException("Provided activity is null") - } -} - -/** - * Shows the unknown source install page - */ -internal fun Context.showRequest() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - this.startActivity( - Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES) - .setData(Uri.parse(String.format(Locale.ENGLISH, "package:%s", this.packageName))), - ) - } -} diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/utils/CoroutineUtils.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/utils/CoroutineUtils.kt deleted file mode 100644 index 5b519073..00000000 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/utils/CoroutineUtils.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.pouyaheydari.appupdater.core.utils - -import kotlinx.coroutines.delay - -suspend fun runWithDelay(job: () -> Unit) { - delay(100) - job() -} diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreListUtil.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreListUtil.kt deleted file mode 100644 index 9eb7b7a6..00000000 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreListUtil.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.pouyaheydari.appupdater.core.utils - -import com.pouyaheydari.appupdater.core.data.model.Store -import com.pouyaheydari.appupdater.core.data.model.StoreListItem - -/** - * Checks if both [Store.DIRECT_URL] & any other stores available or not. - * Based on the result, a divider gets shown in the update dialog - */ -fun shouldShowStoresDivider(directDownloadList: List, storeList: List): Boolean = - directDownloadList.isNotEmpty() && storeList.isNotEmpty() diff --git a/directdownload/.gitignore b/directdownload/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/directdownload/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/directdownload/build.gradle.kts b/directdownload/build.gradle.kts new file mode 100644 index 00000000..61c40b3f --- /dev/null +++ b/directdownload/build.gradle.kts @@ -0,0 +1,56 @@ +plugins { + id("com.android.library") + id("kotlin-android") + `maven-publish` +} + +android { + compileSdk = libs.versions.compileSdkVersion.get().toInt() + defaultConfig { + minSdk = libs.versions.minSdkVersion.get().toInt() + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + kotlinOptions { + jvmTarget = "17" + } + publishing { + singleVariant("release") { + withSourcesJar() + withJavadocJar() + } + } + namespace = "com.pouyaheydari.androidappupdater.directdownload" +} + +dependencies { + api(project(":core")) + implementation(libs.appcompat) + implementation(libs.coroutines) + + // testing + testImplementation(libs.junit4) + testImplementation(libs.mockito) + testImplementation(libs.mockito.kotlin) + androidTestImplementation(libs.androidTestJUnit) + androidTestImplementation(libs.androidTestRules) + androidTestImplementation(libs.androidTestEspresso) + androidTestImplementation(libs.espresso.intents) +} + +afterEvaluate { + publishing { + publications { + register("release") { + from(components["release"]) + groupId = "com.pouyaheydari.updater" + artifactId = "directdownload" + version = libs.versions.appVersion.get() + } + } + } +} diff --git a/directdownload/src/main/AndroidManifest.xml b/directdownload/src/main/AndroidManifest.xml new file mode 100644 index 00000000..81377e3c --- /dev/null +++ b/directdownload/src/main/AndroidManifest.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + diff --git a/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/data/UpdateInProgressRepositoryImpl.kt b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/data/UpdateInProgressRepositoryImpl.kt new file mode 100644 index 00000000..730b73fa --- /dev/null +++ b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/data/UpdateInProgressRepositoryImpl.kt @@ -0,0 +1,26 @@ +package com.pouyaheydari.androidappupdater.directdownload.data + +import com.pouyaheydari.androidappupdater.directdownload.domain.UpdateInProgressRepository +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.asSharedFlow +import java.util.concurrent.atomic.AtomicLong + +private const val NO_REQUEST_ID = -10L + +internal object UpdateInProgressRepositoryImpl : UpdateInProgressRepository { + private var requestId: AtomicLong = AtomicLong(NO_REQUEST_ID) + private val shouldShowUpdateInProgressDialog = MutableSharedFlow(replay = 1) + + override fun getRequestId(): Long = requestId.get() + + override fun setRequestId(id: Long) { + requestId.set(id) + } + + override fun getUpdateInProgressFlow(): Flow = shouldShowUpdateInProgressDialog.asSharedFlow() + + override suspend fun updateApkDownloadProgress(isInProgress: Boolean) { + shouldShowUpdateInProgressDialog.emit(isInProgress) + } +} diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/fileprovider/GenericFileProvider.kt b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/data/fileprovider/GenericFileProvider.kt similarity index 64% rename from core/src/main/java/com/pouyaheydari/appupdater/core/fileprovider/GenericFileProvider.kt rename to directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/data/fileprovider/GenericFileProvider.kt index dc2836e3..75cf78d8 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/fileprovider/GenericFileProvider.kt +++ b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/data/fileprovider/GenericFileProvider.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.core.fileprovider +package com.pouyaheydari.androidappupdater.directdownload.data.fileprovider import androidx.core.content.FileProvider diff --git a/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/domain/GetIsUpdateInProgress.kt b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/domain/GetIsUpdateInProgress.kt new file mode 100644 index 00000000..409210b6 --- /dev/null +++ b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/domain/GetIsUpdateInProgress.kt @@ -0,0 +1,8 @@ +package com.pouyaheydari.androidappupdater.directdownload.domain + +import com.pouyaheydari.androidappupdater.directdownload.data.UpdateInProgressRepositoryImpl +import kotlinx.coroutines.flow.Flow + +class GetIsUpdateInProgress(private val repository: UpdateInProgressRepository = UpdateInProgressRepositoryImpl) { + operator fun invoke(): Flow = repository.getUpdateInProgressFlow() +} diff --git a/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/domain/GetRequestIdInteractor.kt b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/domain/GetRequestIdInteractor.kt new file mode 100644 index 00000000..cb6681ed --- /dev/null +++ b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/domain/GetRequestIdInteractor.kt @@ -0,0 +1,7 @@ +package com.pouyaheydari.androidappupdater.directdownload.domain + +import com.pouyaheydari.androidappupdater.directdownload.data.UpdateInProgressRepositoryImpl + +internal class GetRequestIdInteractor(private val repository: UpdateInProgressRepository = UpdateInProgressRepositoryImpl) { + operator fun invoke(): Long = repository.getRequestId() +} diff --git a/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/domain/SetIsUpdateInProgress.kt b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/domain/SetIsUpdateInProgress.kt new file mode 100644 index 00000000..e88fd574 --- /dev/null +++ b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/domain/SetIsUpdateInProgress.kt @@ -0,0 +1,9 @@ +package com.pouyaheydari.androidappupdater.directdownload.domain + +import com.pouyaheydari.androidappupdater.directdownload.data.UpdateInProgressRepositoryImpl + +internal class SetIsUpdateInProgress(private val repository: UpdateInProgressRepository = UpdateInProgressRepositoryImpl) { + suspend operator fun invoke(isUpdateInProgress: Boolean) { + repository.updateApkDownloadProgress(isUpdateInProgress) + } +} diff --git a/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/domain/SetRequestIdInteractor.kt b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/domain/SetRequestIdInteractor.kt new file mode 100644 index 00000000..3b6c0c8c --- /dev/null +++ b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/domain/SetRequestIdInteractor.kt @@ -0,0 +1,9 @@ +package com.pouyaheydari.androidappupdater.directdownload.domain + +import com.pouyaheydari.androidappupdater.directdownload.data.UpdateInProgressRepositoryImpl + +internal class SetRequestIdInteractor(private val repository: UpdateInProgressRepository = UpdateInProgressRepositoryImpl) { + operator fun invoke(requestId: Long) { + repository.setRequestId(requestId) + } +} diff --git a/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/domain/UpdateInProgressRepository.kt b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/domain/UpdateInProgressRepository.kt new file mode 100644 index 00000000..65e77425 --- /dev/null +++ b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/domain/UpdateInProgressRepository.kt @@ -0,0 +1,10 @@ +package com.pouyaheydari.androidappupdater.directdownload.domain + +import kotlinx.coroutines.flow.Flow + +interface UpdateInProgressRepository { + fun getRequestId(): Long + fun setRequestId(id: Long) + fun getUpdateInProgressFlow(): Flow + suspend fun updateApkDownloadProgress(isInProgress: Boolean) +} diff --git a/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/receiver/DownloadFinishedReceiver.kt b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/receiver/DownloadFinishedReceiver.kt new file mode 100644 index 00000000..4b8fd5a6 --- /dev/null +++ b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/receiver/DownloadFinishedReceiver.kt @@ -0,0 +1,58 @@ +package com.pouyaheydari.androidappupdater.directdownload.receiver + +import android.app.DownloadManager +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.os.Build +import android.util.Log +import com.pouyaheydari.androidappupdater.directdownload.domain.GetRequestIdInteractor +import com.pouyaheydari.androidappupdater.directdownload.domain.SetIsUpdateInProgress +import com.pouyaheydari.androidappupdater.directdownload.utils.getExistingApk +import com.pouyaheydari.androidappupdater.directdownload.utils.installAPK +import com.pouyaheydari.appupdater.core.R +import com.pouyaheydari.appupdater.core.utils.ANDROID_APP_UPDATER_DEBUG_TAG +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch + +/** + * Receives when download is finished and opens the install dialog + */ +internal class DownloadFinishedReceiver : BroadcastReceiver() { + private val coroutineScope = CoroutineScope(Dispatchers.Main) + private val getRequestIdInteractor by lazy { GetRequestIdInteractor() } + private val setIsUpdateInProgress by lazy { SetIsUpdateInProgress() } + + /** + * To show install page when apk got downloaded successfully + */ + override fun onReceive(context: Context?, intent: Intent?) { + if (intent?.action == DownloadManager.ACTION_DOWNLOAD_COMPLETE) { + val referenceId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1) + + // if downloaded file is our apk + if (referenceId == getRequestIdInteractor()) { + context?.let { + hideUpdateInProgress() + verifyDownloadedApkExists(it) + } + } + } + } + + private fun hideUpdateInProgress() { + coroutineScope.launch { + setIsUpdateInProgress(false) + } + } + + private fun verifyDownloadedApkExists(context: Context) { + val existingApk = context.getExistingApk() + if (!existingApk.exists()) { + Log.e(ANDROID_APP_UPDATER_DEBUG_TAG, context.getString(R.string.appupdater_couldnt_find_downloaded_file)) + } else { + installAPK(context, existingApk, Build.VERSION.SDK_INT) + } + } +} diff --git a/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/utils/ContextExtensions.kt b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/utils/ContextExtensions.kt new file mode 100644 index 00000000..a13afa6b --- /dev/null +++ b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/utils/ContextExtensions.kt @@ -0,0 +1,11 @@ +package com.pouyaheydari.androidappupdater.directdownload.utils + +import android.content.Context +import android.os.Environment +import com.pouyaheydari.appupdater.core.utils.APK_NAME +import java.io.File + +/** + * @return a File to the previously downloaded APK file if present. + */ +internal fun Context.getExistingApk() = File("${this.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)}/$APK_NAME") diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/utils/DownloadAPKUtil.kt b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/utils/DownloadAPK.kt similarity index 59% rename from core/src/main/java/com/pouyaheydari/appupdater/core/utils/DownloadAPKUtil.kt rename to directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/utils/DownloadAPK.kt index b04b5837..ba0e184b 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/utils/DownloadAPKUtil.kt +++ b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/utils/DownloadAPK.kt @@ -1,6 +1,5 @@ -package com.pouyaheydari.appupdater.core.utils +package com.pouyaheydari.androidappupdater.directdownload.utils -import android.Manifest import android.app.Activity import android.app.DownloadManager import android.app.DownloadManager.Request.NETWORK_MOBILE @@ -11,42 +10,40 @@ import android.net.Uri import android.os.Build import android.os.Environment import com.pouyaheydari.appupdater.core.R -import com.pouyaheydari.appupdater.core.interactors.SetIsUpdateInProgress -import com.pouyaheydari.appupdater.core.interactors.SetRequestIdInteractor +import com.pouyaheydari.appupdater.core.utils.APK_NAME /** * Checks for needed permissions and tries to download the apk */ -fun getApk(url: String, activity: Activity) { - val permission = Manifest.permission.WRITE_EXTERNAL_STORAGE - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && !activity.packageManager.canRequestPackageInstalls()) { - activity.showRequest() - } - - if (activity.isPermissionGranted(permission) || Build.VERSION.SDK_INT > Build.VERSION_CODES.P) { +suspend fun getApk(url: String, activity: Activity) { + if (checkAndRequestRequiredPermissionsBasedOnOsVersion(activity, Build.VERSION.SDK_INT)) { prepareToDownloadApk(url, activity) - } else { - activity.getPermission(arrayOf(permission)) } } -private fun prepareToDownloadApk(url: String, context: Context) { +private suspend fun prepareToDownloadApk(url: String, context: Context) { // Show update in Progress alert dialog to the user showUpdateInProgress() // Delete APK if user downloaded the apk before - context.deleteExistingFile() + deleteExistingApkIfAvailable(context) // Start downloading the APK - downloadNewApk(url, context) + startDownloadManagerToDownloadNewApk(url, context) +} + +private fun deleteExistingApkIfAvailable(context: Context) { + val file = context.getExistingApk() + if (file.exists()) { + file.delete() + } } -private fun showUpdateInProgress() { - SetIsUpdateInProgress().invoke(true) +private suspend fun showUpdateInProgress() { + com.pouyaheydari.androidappupdater.directdownload.domain.SetIsUpdateInProgress().invoke(true) } -private fun downloadNewApk(url: String, context: Context) { +private fun startDownloadManagerToDownloadNewApk(url: String, context: Context) { val downloadManager = DownloadManager.Request(Uri.parse(url)).run { // setting title and description to be shown on download notification setTitle(context.getString(R.string.appupdater_download_notification_title)) @@ -59,5 +56,5 @@ private fun downloadNewApk(url: String, context: Context) { // enqueue the file to start download val manager = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager - SetRequestIdInteractor().invoke(manager.enqueue(downloadManager)) + com.pouyaheydari.androidappupdater.directdownload.domain.SetRequestIdInteractor().invoke(manager.enqueue(downloadManager)) } diff --git a/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/utils/DownloadAPKPermissionManager.kt b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/utils/DownloadAPKPermissionManager.kt new file mode 100644 index 00000000..5e3cb981 --- /dev/null +++ b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/utils/DownloadAPKPermissionManager.kt @@ -0,0 +1,55 @@ +package com.pouyaheydari.androidappupdater.directdownload.utils + +import android.Manifest +import android.annotation.SuppressLint +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.net.Uri +import android.os.Build +import android.provider.Settings +import androidx.annotation.RequiresApi +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat +import java.util.Locale + +private const val PERMISSION_REQUEST_CODE = 2000 + +@SuppressLint("NewApi") +internal fun checkAndRequestRequiredPermissionsBasedOnOsVersion(activity: Activity, androidVersion: Int): Boolean = when { + isInstallFromUnknownSourcePermissionRequired(androidVersion, activity) -> requestInstallFromUnknownSourcePermission(activity) + haveAllPermissionsResolved(activity, androidVersion) -> true + else -> getWriteToStoragePermission(activity) +} + +@SuppressLint("NewApi") +private fun isInstallFromUnknownSourcePermissionRequired(androidVersion: Int, activity: Activity) = + androidVersion >= Build.VERSION_CODES.P && !activity.packageManager.canRequestPackageInstalls() + +// TODO: Add a dialog to explain to the user why are we getting this permission +@RequiresApi(Build.VERSION_CODES.O) +internal fun requestInstallFromUnknownSourcePermission(context: Context): Boolean { + val uri = Uri.parse(String.format(Locale.ENGLISH, "package:%s", context.packageName)) + val intent = Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, uri).apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK + } + context.startActivity(intent) + return false +} + +private fun haveAllPermissionsResolved(activity: Activity, androidVersion: Int) = + hasWriteToStoragePermission(activity) || androidVersion > Build.VERSION_CODES.P + +private fun hasWriteToStoragePermission(context: Context): Boolean = + ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED + +// TODO: Use ActivityCompat.shouldShowRequestPermissionRationale to provide details on why the permission is needed +private fun getWriteToStoragePermission(activity: Activity): Boolean { + ActivityCompat.requestPermissions( + activity, + arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), + PERMISSION_REQUEST_CODE, + ) + return false +} diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/utils/InstallApkUtil.kt b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/utils/InstallApkUtil.kt similarity index 56% rename from core/src/main/java/com/pouyaheydari/appupdater/core/utils/InstallApkUtil.kt rename to directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/utils/InstallApkUtil.kt index 0cb5b190..db82c5ca 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/utils/InstallApkUtil.kt +++ b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/utils/InstallApkUtil.kt @@ -1,5 +1,6 @@ -package com.pouyaheydari.appupdater.core.utils +package com.pouyaheydari.androidappupdater.directdownload.utils +import android.annotation.SuppressLint import android.content.ActivityNotFoundException import android.content.Context import android.content.Intent @@ -7,6 +8,7 @@ import android.net.Uri import android.os.Build import android.util.Log import androidx.core.content.FileProvider +import com.pouyaheydari.appupdater.core.utils.ANDROID_APP_UPDATER_DEBUG_TAG import java.io.File /** @@ -20,27 +22,26 @@ internal fun installAPK(context: Context, apk: File, androidVersion: Int) { } } +@SuppressLint("NewApi") private fun installAPKForPAndAbove(context: Context, apk: File) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - if (context.packageManager.canRequestPackageInstalls()) { - try { - val intent = Intent(Intent.ACTION_VIEW, getFileUri(context, apk)).run { - addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_ACTIVITY_NEW_TASK) - } - context.startActivity(intent) - } catch (e: ActivityNotFoundException) { - Log.e(TAG, e.message.orEmpty()) + if (context.packageManager.canRequestPackageInstalls()) { + try { + val intent = Intent(Intent.ACTION_VIEW, getFileUri(context, apk)).run { + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_ACTIVITY_NEW_TASK) } - } else { - context.showRequest() + context.startActivity(intent) + } catch (e: ActivityNotFoundException) { + Log.e(ANDROID_APP_UPDATER_DEBUG_TAG, e.message.orEmpty()) } + } else { + requestInstallFromUnknownSourcePermission(context) } } @Suppress("DEPRECATION") private fun installAPKForNtoO(context: Context, apk: File) { - val install = Intent(Intent.ACTION_INSTALL_PACKAGE, getFileUri(context, apk)).run { - addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_ACTIVITY_NEW_TASK) + val install = Intent(Intent.ACTION_INSTALL_PACKAGE, getFileUri(context, apk)).apply { + flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_ACTIVITY_NEW_TASK } context.startActivity(install) } @@ -52,10 +53,9 @@ private fun getFileUri(context: Context, apk: File): Uri = FileProvider.getUriFo ) private fun installAPKForMAndBellow(context: Context, apk: File) { - val apkUri = Uri.fromFile(apk) - val intent = Intent(Intent.ACTION_VIEW).run { - setDataAndType(apkUri, "application/vnd.android.package-archive") - addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + val intent = Intent(Intent.ACTION_VIEW, Uri.fromFile(apk)).apply { + type = "application/vnd.android.package-archive" + flags = Intent.FLAG_ACTIVITY_NEW_TASK } context.startActivity(intent) } diff --git a/core/src/main/res/xml/provider_paths.xml b/directdownload/src/main/res/xml/provider_paths.xml similarity index 100% rename from core/src/main/res/xml/provider_paths.xml rename to directdownload/src/main/res/xml/provider_paths.xml diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 58d10190..a867d906 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,8 +4,8 @@ compileSdkVersion = "34" minSdkVersion = "16" composeMinSdkVersion = "21" targetSdkVersion = "34" -agp = "8.2.2" -kotlin = "1.9.21" +agp = "8.3.0" +kotlin = "1.9.22" appcompat = "1.6.1" constraintLayout = "2.1.4" junit4 = "4.13.2" @@ -13,11 +13,11 @@ androidTestJUnit = "1.1.5" androidTestRules = "1.5.0" androidTestEspresso = "3.5.1" recyclerView = "1.3.2" -composeCompilerExtension = "1.5.7" +composeCompilerExtension = "1.5.10" lifecycle = "2.7.0" coroutines = "1.7.3" fragment = "1.6.2" -androidxComposeBom = "2023.10.01" +androidxComposeBom = "2024.02.01" composeActivity = "1.8.2" mockito = "5.10.0" mockitoKotlin = "5.2.1" diff --git a/settings.gradle.kts b/settings.gradle.kts index fb5c8de2..f565d899 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1 +1 @@ -include(":app", ":appupdater", ":core", ":compose") +include(":app", ":appupdater", ":core", ":compose", ":store", ":directdownload") diff --git a/store/.gitignore b/store/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/store/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/store/build.gradle.kts b/store/build.gradle.kts new file mode 100644 index 00000000..8c9522d4 --- /dev/null +++ b/store/build.gradle.kts @@ -0,0 +1,60 @@ +plugins { + id("com.android.library") + id("kotlin-android") + `maven-publish` +} + +android { + compileSdk = libs.versions.compileSdkVersion.get().toInt() + defaultConfig { + minSdk = libs.versions.minSdkVersion.get().toInt() + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + kotlinOptions { + jvmTarget = "17" + } + publishing { + singleVariant("release") { + withSourcesJar() + withJavadocJar() + } + } + namespace = "com.pouyaheydari.appupdater.store" +} +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} +dependencies { + api(project(":core")) + + implementation(libs.kotlin.reflect) + + // testing + testImplementation(libs.junit4) + testImplementation(libs.mockito) + testImplementation(libs.mockito.kotlin) + androidTestImplementation(libs.androidTestJUnit) + androidTestImplementation(libs.androidTestRules) + androidTestImplementation(libs.androidTestEspresso) + androidTestImplementation(libs.espresso.intents) +} + +afterEvaluate { + publishing { + publications { + register("release") { + from(components["release"]) + groupId = "com.pouyaheydari.updater" + artifactId = "store" + version = libs.versions.appVersion.get() + } + } + } +} diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/AmazonAppStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/AmazonAppStoreTest.kt similarity index 72% rename from core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/AmazonAppStoreTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/AmazonAppStoreTest.kt index 3a27cf6e..f7cc7654 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/AmazonAppStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/AmazonAppStoreTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.appupdater.store.stores import android.net.Uri import androidx.test.espresso.intent.Intents @@ -6,9 +6,11 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel -import com.pouyaheydari.appupdater.core.data.model.Store -import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.model.Store +import com.pouyaheydari.androidappupdater.store.stores.AMAZON_APP_STORE_URL +import com.pouyaheydari.androidappupdater.store.stores.AMAZON_PACKAGE import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/AptoideTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/AptoideTest.kt similarity index 72% rename from core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/AptoideTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/AptoideTest.kt index 14d486c1..68a58c0f 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/AptoideTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/AptoideTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.appupdater.store.stores import android.net.Uri import androidx.test.espresso.intent.Intents @@ -6,9 +6,11 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel -import com.pouyaheydari.appupdater.core.data.model.Store -import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.model.Store +import com.pouyaheydari.androidappupdater.store.stores.APTOIDE_PACKAGE +import com.pouyaheydari.androidappupdater.store.stores.APTOIDE_URL import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/CafeBazaarStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/CafeBazaarStoreTest.kt similarity index 72% rename from core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/CafeBazaarStoreTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/CafeBazaarStoreTest.kt index 860e2f28..5c65acf1 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/CafeBazaarStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/CafeBazaarStoreTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.appupdater.store.stores import android.net.Uri import androidx.test.espresso.intent.Intents @@ -6,9 +6,11 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel -import com.pouyaheydari.appupdater.core.data.model.Store -import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.model.Store +import com.pouyaheydari.androidappupdater.store.stores.BAZAAR_PACKAGE +import com.pouyaheydari.androidappupdater.store.stores.BAZAAR_URL import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/FDroidTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/FDroidTest.kt similarity index 72% rename from core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/FDroidTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/FDroidTest.kt index 8b67453b..017c3c1b 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/FDroidTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/FDroidTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.appupdater.store.stores import android.net.Uri import androidx.test.espresso.intent.Intents @@ -6,9 +6,11 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel -import com.pouyaheydari.appupdater.core.data.model.Store -import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.model.Store +import com.pouyaheydari.androidappupdater.store.stores.FDROID_PACKAGE +import com.pouyaheydari.androidappupdater.store.stores.FDROID_URL import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/GooglePlayStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/GooglePlayStoreTest.kt similarity index 72% rename from core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/GooglePlayStoreTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/GooglePlayStoreTest.kt index 58ec2398..4b43998c 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/GooglePlayStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/GooglePlayStoreTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.appupdater.store.stores import android.net.Uri import androidx.test.espresso.intent.Intents @@ -6,9 +6,11 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel -import com.pouyaheydari.appupdater.core.data.model.Store -import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.model.Store +import com.pouyaheydari.androidappupdater.store.stores.PLAY_PACKAGE +import com.pouyaheydari.androidappupdater.store.stores.PLAY_URL import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/HuaweiAppGalleryTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/HuaweiAppGalleryTest.kt similarity index 72% rename from core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/HuaweiAppGalleryTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/HuaweiAppGalleryTest.kt index 91f73895..41523bed 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/HuaweiAppGalleryTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/HuaweiAppGalleryTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.appupdater.store.stores import android.net.Uri import androidx.test.espresso.intent.Intents @@ -6,9 +6,11 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel -import com.pouyaheydari.appupdater.core.data.model.Store -import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.model.Store +import com.pouyaheydari.androidappupdater.store.stores.HUAWEI_APP_GALLERY_PACKAGE +import com.pouyaheydari.androidappupdater.store.stores.HUAWEI_APP_GALLERY_URL import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/LenovoAppCenterTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/LenovoAppCenterTest.kt similarity index 74% rename from core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/LenovoAppCenterTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/LenovoAppCenterTest.kt index 4acc2f6d..d10eac4c 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/LenovoAppCenterTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/LenovoAppCenterTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.appupdater.store.stores import android.net.Uri import androidx.test.espresso.intent.Intents @@ -6,9 +6,10 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel -import com.pouyaheydari.appupdater.core.data.model.Store -import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.model.Store +import com.pouyaheydari.androidappupdater.store.stores.LENOVO_APP_CENTER_URL import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/MiGetAppStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/MiGetAppStoreTest.kt similarity index 75% rename from core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/MiGetAppStoreTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/MiGetAppStoreTest.kt index 63635b5e..245aa827 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/MiGetAppStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/MiGetAppStoreTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.appupdater.store.stores import android.net.Uri import androidx.test.espresso.intent.Intents @@ -6,9 +6,10 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel -import com.pouyaheydari.appupdater.core.data.model.Store -import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.model.Store +import com.pouyaheydari.androidappupdater.store.stores.MI_APP_STORE_URL import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/MyketStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/MyketStoreTest.kt similarity index 72% rename from core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/MyketStoreTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/MyketStoreTest.kt index 9cb45a94..91ba33f8 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/MyketStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/MyketStoreTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.appupdater.store.stores import android.net.Uri import androidx.test.espresso.intent.Intents @@ -6,9 +6,11 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel -import com.pouyaheydari.appupdater.core.data.model.Store -import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.model.Store +import com.pouyaheydari.androidappupdater.store.stores.MYKET_PACKAGE +import com.pouyaheydari.androidappupdater.store.stores.MYKET_URL import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/NineAppsTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/NineAppsTest.kt similarity index 72% rename from core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/NineAppsTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/NineAppsTest.kt index 82e80a65..9743768e 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/NineAppsTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/NineAppsTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.appupdater.store.stores import android.net.Uri import androidx.test.espresso.intent.Intents @@ -6,9 +6,11 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel -import com.pouyaheydari.appupdater.core.data.model.Store -import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.model.Store +import com.pouyaheydari.androidappupdater.store.stores.NINE_APPS_PACKAGE +import com.pouyaheydari.androidappupdater.store.stores.NINE_APPS_STORE_URL import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/OneStoreAppMarketTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/OneStoreAppMarketTest.kt similarity index 74% rename from core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/OneStoreAppMarketTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/OneStoreAppMarketTest.kt index caa751c0..e706e55c 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/OneStoreAppMarketTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/OneStoreAppMarketTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.appupdater.store.stores import android.net.Uri import androidx.test.espresso.intent.Intents @@ -6,9 +6,10 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel -import com.pouyaheydari.appupdater.core.data.model.Store -import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.model.Store +import com.pouyaheydari.androidappupdater.store.stores.ONE_STORE_APP_MARKET_URL import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/OppoAppMarketTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/OppoAppMarketTest.kt similarity index 72% rename from core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/OppoAppMarketTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/OppoAppMarketTest.kt index eb405ce6..21c711e4 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/OppoAppMarketTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/OppoAppMarketTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.appupdater.store.stores import android.net.Uri import androidx.test.espresso.intent.Intents @@ -6,9 +6,11 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel -import com.pouyaheydari.appupdater.core.data.model.Store -import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.model.Store +import com.pouyaheydari.androidappupdater.store.stores.OPPO_APP_MARKET_URL +import com.pouyaheydari.androidappupdater.store.stores.OPPO_PACKAGE import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/SamsungGalaxyStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/SamsungGalaxyStoreTest.kt similarity index 74% rename from core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/SamsungGalaxyStoreTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/SamsungGalaxyStoreTest.kt index 8eaac3f8..f04e238b 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/SamsungGalaxyStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/SamsungGalaxyStoreTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.appupdater.store.stores import android.net.Uri import androidx.test.espresso.intent.Intents @@ -6,9 +6,10 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel -import com.pouyaheydari.appupdater.core.data.model.Store -import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.model.Store +import com.pouyaheydari.androidappupdater.store.stores.SAMSUNG_GALAXY_STORE_URL import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/TencentStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/TencentStoreTest.kt similarity index 75% rename from core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/TencentStoreTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/TencentStoreTest.kt index 4e2b82be..3126e4ba 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/TencentStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/TencentStoreTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.appupdater.store.stores import android.net.Uri import androidx.test.espresso.intent.Intents @@ -6,9 +6,10 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel -import com.pouyaheydari.appupdater.core.data.model.Store -import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.model.Store +import com.pouyaheydari.androidappupdater.store.stores.TENCENT_APP_STORE_URL import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/VAppStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/VAppStoreTest.kt similarity index 74% rename from core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/VAppStoreTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/VAppStoreTest.kt index d406fd7c..214511ac 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/VAppStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/VAppStoreTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.appupdater.store.stores import android.net.Uri import androidx.test.espresso.intent.Intents @@ -6,9 +6,10 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel -import com.pouyaheydari.appupdater.core.data.model.Store -import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.model.Store +import com.pouyaheydari.androidappupdater.store.stores.V_APP_STORE_URL import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/ZTEAppCenterTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/ZTEAppCenterTest.kt similarity index 74% rename from core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/ZTEAppCenterTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/ZTEAppCenterTest.kt index 2e5d235a..8f246fe9 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/stores/ZTEAppCenterTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/ZTEAppCenterTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.appupdater.store.stores import android.net.Uri import androidx.test.espresso.intent.Intents @@ -6,9 +6,10 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel -import com.pouyaheydari.appupdater.core.data.model.Store -import com.pouyaheydari.appupdater.core.utils.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.model.Store +import com.pouyaheydari.androidappupdater.store.stores.ZTE_APP_CENTER_URL import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith diff --git a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/utils/StoreIntentProviderTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/utils/StoreIntentProviderTest.kt similarity index 92% rename from core/src/androidTest/java/com/pouyaheydari/appupdater/core/utils/StoreIntentProviderTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/utils/StoreIntentProviderTest.kt index 659577f2..7a525190 100644 --- a/core/src/androidTest/java/com/pouyaheydari/appupdater/core/utils/StoreIntentProviderTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/utils/StoreIntentProviderTest.kt @@ -1,8 +1,9 @@ -package com.pouyaheydari.appupdater.core.utils +package com.pouyaheydari.appupdater.store.utils import android.content.Intent import android.net.Uri import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider import org.junit.Assert.assertEquals import org.junit.Assert.assertNull import org.junit.Assert.assertThrows diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/StoreListUtil.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/StoreListUtil.kt new file mode 100644 index 00000000..525b915f --- /dev/null +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/StoreListUtil.kt @@ -0,0 +1,6 @@ +package com.pouyaheydari.androidappupdater.store + +import com.pouyaheydari.androidappupdater.store.model.StoreListItem + +fun shouldShowStoresDivider(directDownloadList: List, storeList: List): Boolean = + directDownloadList.isNotEmpty() && storeList.isNotEmpty() diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreIntentProvider.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreIntentProvider.kt similarity index 60% rename from core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreIntentProvider.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreIntentProvider.kt index 4895678c..55ca5100 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreIntentProvider.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreIntentProvider.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.core.utils +package com.pouyaheydari.androidappupdater.store.domain import android.content.Intent import android.net.Uri @@ -13,10 +13,9 @@ internal object StoreIntentProvider { return this } - fun build(): Intent = - Intent(Intent.ACTION_VIEW, Uri.parse(uriString)).apply { - flags = Intent.FLAG_ACTIVITY_NEW_TASK - storePackageName?.takeIf { it.isNotBlank() }?.let { setPackage(it) } - } + fun build(): Intent = Intent(Intent.ACTION_VIEW, Uri.parse(uriString)).apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK + storePackageName?.takeIf { it.isNotBlank() }?.let { setPackage(it) } + } } } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreOpener.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreManager.kt similarity index 85% rename from core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreOpener.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreManager.kt index e6e3907e..2d2473da 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/utils/StoreOpener.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreManager.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.core.utils +package com.pouyaheydari.androidappupdater.store.domain import android.content.ActivityNotFoundException import android.content.Context @@ -6,7 +6,8 @@ import android.content.Intent import android.content.Intent.FLAG_ACTIVITY_NEW_TASK import android.net.Uri import android.util.Log -import com.pouyaheydari.appupdater.core.data.model.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel +import com.pouyaheydari.appupdater.core.utils.ANDROID_APP_UPDATER_DEBUG_TAG import java.util.Locale fun showAppInSelectedStore(context: Context?, storeModel: ShowStoreModel) { @@ -44,6 +45,6 @@ private fun showFallbackUrlInDefaultBrowser(context: Context?, storeModel: ShowS private fun handleError(storeName: String, errorCallBack: () -> Unit) { val lowerCaseStoreName = storeName.lowercase(Locale.ROOT).replace("_", " ") - Log.e(TAG, "$lowerCaseStoreName is not installed") + Log.e(ANDROID_APP_UPDATER_DEBUG_TAG, "$lowerCaseStoreName is not installed") errorCallBack() } diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/data/model/ShowStoreModel.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/model/ShowStoreModel.kt similarity index 76% rename from core/src/main/java/com/pouyaheydari/appupdater/core/data/model/ShowStoreModel.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/model/ShowStoreModel.kt index 9b780d2c..45051566 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/data/model/ShowStoreModel.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/model/ShowStoreModel.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.core.data.model +package com.pouyaheydari.androidappupdater.store.model data class ShowStoreModel( val packageName: String = "", diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/model/Store.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/model/Store.kt new file mode 100644 index 00000000..ff69b8a1 --- /dev/null +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/model/Store.kt @@ -0,0 +1,42 @@ +package com.pouyaheydari.androidappupdater.store.model + +import com.pouyaheydari.androidappupdater.store.stores.AmazonAppStore +import com.pouyaheydari.androidappupdater.store.stores.AppStore +import com.pouyaheydari.androidappupdater.store.stores.Aptoide +import com.pouyaheydari.androidappupdater.store.stores.CafeBazaarStore +import com.pouyaheydari.androidappupdater.store.stores.FDroid +import com.pouyaheydari.androidappupdater.store.stores.GooglePlayStore +import com.pouyaheydari.androidappupdater.store.stores.HuaweiAppGallery +import com.pouyaheydari.androidappupdater.store.stores.LenovoAppCenter +import com.pouyaheydari.androidappupdater.store.stores.MiGetAppStore +import com.pouyaheydari.androidappupdater.store.stores.MyketStore +import com.pouyaheydari.androidappupdater.store.stores.NineApps +import com.pouyaheydari.androidappupdater.store.stores.OneStoreAppMarket +import com.pouyaheydari.androidappupdater.store.stores.OppoAppMarket +import com.pouyaheydari.androidappupdater.store.stores.SamsungGalaxyStore +import com.pouyaheydari.androidappupdater.store.stores.TencentAppStore +import com.pouyaheydari.androidappupdater.store.stores.VAppStore +import com.pouyaheydari.androidappupdater.store.stores.ZTEAppCenter + +/** + * Enum class to select type of market + */ +enum class Store(val provider: Class?) { + DIRECT_URL(null), + GOOGLE_PLAY(GooglePlayStore::class.java), + CAFE_BAZAAR(CafeBazaarStore::class.java), + MYKET(MyketStore::class.java), + HUAWEI_APP_GALLERY(HuaweiAppGallery::class.java), + SAMSUNG_GALAXY_STORE(SamsungGalaxyStore::class.java), + AMAZON_APP_STORE(AmazonAppStore::class.java), + APTOIDE(Aptoide::class.java), + FDROID(FDroid::class.java), + MI_GET_APP_STORE(MiGetAppStore::class.java), + ONE_STORE_APP_MARKET(OneStoreAppMarket::class.java), + OPPO_APP_MARKET(OppoAppMarket::class.java), + V_APP_STORE(VAppStore::class.java), + NINE_APPS_STORE(NineApps::class.java), + TENCENT_APPS_STORE(TencentAppStore::class.java), + ZTE_APP_CENTER(ZTEAppCenter::class.java), + LENOVO_APP_CENTER(LenovoAppCenter::class.java), +} diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/data/model/StoreListItem.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/model/StoreListItem.kt similarity index 85% rename from core/src/main/java/com/pouyaheydari/appupdater/core/data/model/StoreListItem.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/model/StoreListItem.kt index d7e3e886..06b73fa3 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/data/model/StoreListItem.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/model/StoreListItem.kt @@ -1,16 +1,16 @@ -package com.pouyaheydari.appupdater.core.data.model +package com.pouyaheydari.androidappupdater.store.model import android.os.Parcel import android.os.Parcelable -import com.pouyaheydari.appupdater.core.R +import com.pouyaheydari.appupdater.core.R as coreR /** * The model that we are using for list of stores */ data class StoreListItem( var store: Store = Store.DIRECT_URL, - var title: String = "Store", - var icon: Int = R.drawable.appupdater_ic_cloud, + var title: String = "", + var icon: Int = coreR.drawable.appupdater_ic_cloud, var url: String = "", var packageName: String = "", ) : Parcelable { diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/data/model/Theme.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/model/Theme.kt similarity index 62% rename from core/src/main/java/com/pouyaheydari/appupdater/core/data/model/Theme.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/model/Theme.kt index 67270f9d..1afc2f33 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/data/model/Theme.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/model/Theme.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.core.data.model +package com.pouyaheydari.androidappupdater.store.model /** * Specifies the theme of dialog diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/AmazonAppStore.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/AmazonAppStore.kt similarity index 77% rename from core/src/main/java/com/pouyaheydari/appupdater/core/stores/AmazonAppStore.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/AmazonAppStore.kt index d5b6ef2a..1de8bde8 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/AmazonAppStore.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/AmazonAppStore.kt @@ -1,6 +1,6 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.androidappupdater.store.stores -import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider +import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider const val AMAZON_APP_STORE_URL = "amzn://apps/android?p=" const val AMAZON_PACKAGE = "com.amazon.venezia" diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/AppStore.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/AppStore.kt similarity index 64% rename from core/src/main/java/com/pouyaheydari/appupdater/core/stores/AppStore.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/AppStore.kt index 2d12495f..d27fe973 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/AppStore.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/AppStore.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.androidappupdater.store.stores import android.content.Intent diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/Aptoide.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/Aptoide.kt similarity index 74% rename from core/src/main/java/com/pouyaheydari/appupdater/core/stores/Aptoide.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/Aptoide.kt index bb95a193..236ce003 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/Aptoide.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/Aptoide.kt @@ -1,6 +1,6 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.androidappupdater.store.stores -import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider +import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider const val APTOIDE_URL = "aptoideinstall://package=" const val APTOIDE_PACKAGE = "cm.aptoide.pt" diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/CafeBazaarStore.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/CafeBazaarStore.kt similarity index 74% rename from core/src/main/java/com/pouyaheydari/appupdater/core/stores/CafeBazaarStore.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/CafeBazaarStore.kt index ca510609..3dc1ddb1 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/CafeBazaarStore.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/CafeBazaarStore.kt @@ -1,6 +1,6 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.androidappupdater.store.stores -import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider +import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider const val BAZAAR_URL = "bazaar://details?id=" const val BAZAAR_PACKAGE = "com.farsitel.bazaar" diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/FDroid.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/FDroid.kt similarity index 74% rename from core/src/main/java/com/pouyaheydari/appupdater/core/stores/FDroid.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/FDroid.kt index 1092cf8b..bde44692 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/FDroid.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/FDroid.kt @@ -1,6 +1,6 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.androidappupdater.store.stores -import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider +import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider const val FDROID_URL = "fdroid.app://details?id=" const val FDROID_PACKAGE = "org.fdroid.fdroid" diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/GooglePlayStore.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/GooglePlayStore.kt similarity index 74% rename from core/src/main/java/com/pouyaheydari/appupdater/core/stores/GooglePlayStore.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/GooglePlayStore.kt index 871b32f7..124a0b7f 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/GooglePlayStore.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/GooglePlayStore.kt @@ -1,6 +1,6 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.androidappupdater.store.stores -import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider +import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider const val PLAY_URL = "market://details?id=" const val PLAY_PACKAGE = "com.android.vending" diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/HuaweiAppGallery.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/HuaweiAppGallery.kt similarity index 77% rename from core/src/main/java/com/pouyaheydari/appupdater/core/stores/HuaweiAppGallery.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/HuaweiAppGallery.kt index 3d34f852..0bf717c1 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/HuaweiAppGallery.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/HuaweiAppGallery.kt @@ -1,6 +1,6 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.androidappupdater.store.stores -import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider +import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider const val HUAWEI_APP_GALLERY_URL = "appmarket://details?id=" const val HUAWEI_APP_GALLERY_PACKAGE = "com.huawei.appmarket" diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/LenovoAppCenter.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/LenovoAppCenter.kt similarity index 71% rename from core/src/main/java/com/pouyaheydari/appupdater/core/stores/LenovoAppCenter.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/LenovoAppCenter.kt index 92daba2d..814a4ad0 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/LenovoAppCenter.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/LenovoAppCenter.kt @@ -1,6 +1,6 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.androidappupdater.store.stores -import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider +import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider const val LENOVO_APP_CENTER_URL = "leapp://ptn/appinfo.do?pn=" diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/MiGetAppStore.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/MiGetAppStore.kt similarity index 71% rename from core/src/main/java/com/pouyaheydari/appupdater/core/stores/MiGetAppStore.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/MiGetAppStore.kt index 88e267da..61098469 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/MiGetAppStore.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/MiGetAppStore.kt @@ -1,6 +1,6 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.androidappupdater.store.stores -import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider +import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider const val MI_APP_STORE_URL = "mimarket://details?id=" diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/MyketStore.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/MyketStore.kt similarity index 73% rename from core/src/main/java/com/pouyaheydari/appupdater/core/stores/MyketStore.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/MyketStore.kt index 283bbdff..2ea44c71 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/MyketStore.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/MyketStore.kt @@ -1,6 +1,6 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.androidappupdater.store.stores -import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider +import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider const val MYKET_URL = "myket://details?id=" const val MYKET_PACKAGE = "ir.mservices.market" diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/NineApps.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/NineApps.kt similarity index 75% rename from core/src/main/java/com/pouyaheydari/appupdater/core/stores/NineApps.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/NineApps.kt index b5317843..c53fac8c 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/NineApps.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/NineApps.kt @@ -1,6 +1,6 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.androidappupdater.store.stores -import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider +import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider const val NINE_APPS_STORE_URL = "nineapps://AppDetail?id=" const val NINE_APPS_PACKAGE = "com.gamefun.apk2u" diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/OneStoreAppMarket.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/OneStoreAppMarket.kt similarity index 74% rename from core/src/main/java/com/pouyaheydari/appupdater/core/stores/OneStoreAppMarket.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/OneStoreAppMarket.kt index 6635ab6f..83dfe206 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/OneStoreAppMarket.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/OneStoreAppMarket.kt @@ -1,6 +1,6 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.androidappupdater.store.stores -import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider +import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider const val ONE_STORE_APP_MARKET_URL = "onestore://common/product/" diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/OppoAppMarket.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/OppoAppMarket.kt similarity index 75% rename from core/src/main/java/com/pouyaheydari/appupdater/core/stores/OppoAppMarket.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/OppoAppMarket.kt index 7d0209e8..928d5a15 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/OppoAppMarket.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/OppoAppMarket.kt @@ -1,6 +1,6 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.androidappupdater.store.stores -import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider +import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider const val OPPO_APP_MARKET_URL = "market://details?id=" const val OPPO_PACKAGE = "com.heytap.market" diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/SamsungGalaxyStore.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/SamsungGalaxyStore.kt similarity index 73% rename from core/src/main/java/com/pouyaheydari/appupdater/core/stores/SamsungGalaxyStore.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/SamsungGalaxyStore.kt index d3fcccbc..f48f2fb3 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/SamsungGalaxyStore.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/SamsungGalaxyStore.kt @@ -1,6 +1,6 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.androidappupdater.store.stores -import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider +import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider const val SAMSUNG_GALAXY_STORE_URL = "samsungapps://ProductDetail/" diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/TencentAppStore.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/TencentAppStore.kt similarity index 71% rename from core/src/main/java/com/pouyaheydari/appupdater/core/stores/TencentAppStore.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/TencentAppStore.kt index c0adf798..7c3dcca7 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/TencentAppStore.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/TencentAppStore.kt @@ -1,6 +1,6 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.androidappupdater.store.stores -import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider +import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider const val TENCENT_APP_STORE_URL = "tmast://appdetails?pname=" diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/VAppStore.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/VAppStore.kt similarity index 70% rename from core/src/main/java/com/pouyaheydari/appupdater/core/stores/VAppStore.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/VAppStore.kt index 30c13e15..90ac70c2 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/VAppStore.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/VAppStore.kt @@ -1,6 +1,6 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.androidappupdater.store.stores -import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider +import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider const val V_APP_STORE_URL = "vivoMarket://details?id=" diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/ZTEAppCenter.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/ZTEAppCenter.kt similarity index 71% rename from core/src/main/java/com/pouyaheydari/appupdater/core/stores/ZTEAppCenter.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/ZTEAppCenter.kt index e8606425..d7824d71 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/stores/ZTEAppCenter.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/ZTEAppCenter.kt @@ -1,6 +1,6 @@ -package com.pouyaheydari.appupdater.core.stores +package com.pouyaheydari.androidappupdater.store.stores -import com.pouyaheydari.appupdater.core.utils.StoreIntentProvider +import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider const val ZTE_APP_CENTER_URL = "zte_market://appdetails?pname=" diff --git a/core/src/test/java/com/pouyaheydari/appupdater/core/utils/StoreListUtilTest.kt b/store/src/test/java/com/pouyaheydari/appupdater/store/utils/StoreListUtilTest.kt similarity index 63% rename from core/src/test/java/com/pouyaheydari/appupdater/core/utils/StoreListUtilTest.kt rename to store/src/test/java/com/pouyaheydari/appupdater/store/utils/StoreListUtilTest.kt index 72518706..8faa15a2 100644 --- a/core/src/test/java/com/pouyaheydari/appupdater/core/utils/StoreListUtilTest.kt +++ b/store/src/test/java/com/pouyaheydari/appupdater/store/utils/StoreListUtilTest.kt @@ -1,7 +1,8 @@ -package com.pouyaheydari.appupdater.core.utils +package com.pouyaheydari.appupdater.store.utils -import com.pouyaheydari.appupdater.core.data.model.Store -import com.pouyaheydari.appupdater.core.data.model.StoreListItem +import com.pouyaheydari.androidappupdater.store.model.Store +import com.pouyaheydari.androidappupdater.store.model.StoreListItem +import com.pouyaheydari.androidappupdater.store.shouldShowStoresDivider import org.junit.Assert.assertEquals import org.junit.Test @@ -11,7 +12,10 @@ internal class StoreListUtilTest { val directDownloadList = listOf(StoreListItem(store = Store.DIRECT_URL)) val storeList = listOf(StoreListItem(store = Store.GOOGLE_PLAY)) - val result = shouldShowStoresDivider(directDownloadList, storeList) + val result = shouldShowStoresDivider( + directDownloadList, + storeList, + ) assertEquals(true, result) } @@ -21,7 +25,10 @@ internal class StoreListUtilTest { val directDownloadList = listOf(StoreListItem(store = Store.DIRECT_URL)) val storeList = listOf() - val result = shouldShowStoresDivider(directDownloadList, storeList) + val result = shouldShowStoresDivider( + directDownloadList, + storeList, + ) assertEquals(false, result) } @@ -31,7 +38,10 @@ internal class StoreListUtilTest { val directDownloadList = listOf() val storeList = listOf(StoreListItem(store = Store.GOOGLE_PLAY)) - val result = shouldShowStoresDivider(directDownloadList, storeList) + val result = shouldShowStoresDivider( + directDownloadList, + storeList, + ) assertEquals(false, result) } @@ -41,7 +51,10 @@ internal class StoreListUtilTest { val directDownloadList = listOf() val storeList = listOf() - val result = shouldShowStoresDivider(directDownloadList, storeList) + val result = shouldShowStoresDivider( + directDownloadList, + storeList, + ) assertEquals(false, result) } From 2d3242db65dae8b32b770326f328de9735aab2b3 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Sun, 17 Mar 2024 18:57:29 +0100 Subject: [PATCH 020/117] Divided direct download and store list items into 2 different properties to separate concerns --- app/build.gradle.kts | 10 +- .../ui/android/MainActivity.kt | 16 ++- .../ui/compose/ComposeSampleActivity.kt | 10 +- .../utils/ComposePreviewData.kt | 111 +++++++------- .../androidappupdater/utils/DSLPreviewData.kt | 94 +++++------- .../utils/FragmentDialogPreviewData.kt | 136 ------------------ appupdater/build.gradle.kts | 12 +- .../appupdater/AppUpdaterDialog.kt | 31 ++-- .../appupdater/AppUpdaterViewModel.kt | 30 ++-- .../adapters/DirectRecyclerAdapter.kt | 8 +- .../adapters/StoresRecyclerAdapter.kt | 2 +- .../pouyaheydari/appupdater/dsl/DSLUtils.kt | 5 +- .../appupdater/mapper/SelectedThemeMapper.kt | 8 +- .../appupdater/pojo/DialogStates.kt | 2 +- .../appupdater/pojo/UpdaterDialogData.kt | 6 +- .../appupdater/pojo/UpdaterFragmentModel.kt | 7 +- compose/build.gradle.kts | 4 +- .../data/mapper/UpdaterDialogUIMapper.kt | 14 +- .../data/mapper/UpdaterViewModelDataMapper.kt | 1 + .../compose/ui/AndroidAppUpdaterScreen.kt | 13 +- .../compose/ui/AndroidAppUpdaterViewModel.kt | 9 +- .../components/AppUpdaterDialogComponent.kt | 7 +- .../compose/ui/components/DividerComponent.kt | 6 +- .../compose/ui/models/DialogScreenIntents.kt | 5 +- .../compose/ui/models/DialogScreenState.kt | 2 +- .../compose/ui/models/UpdaterDialogData.kt | 8 +- .../compose/ui/models/UpdaterDialogUIData.kt | 5 +- .../compose/ui/models/UpdaterViewModelData.kt | 8 +- .../compose/utils/AppUpdaterPreviewData.kt | 81 ++++++----- .../compose/utils/IsDarkThemeSelected.kt | 2 +- core/build.gradle.kts | 2 +- .../appupdater/core}/model/Theme.kt | 2 +- directdownload/build.gradle.kts | 10 +- .../data/model/DirectDownloadListItem.kt | 28 ++++ gradle.properties | 5 +- gradle/libs.versions.toml | 24 ++-- gradle/wrapper/gradle-wrapper.properties | 1 - store/build.gradle.kts | 9 +- .../store/stores/AmazonAppStoreTest.kt | 6 +- .../appupdater/store/stores/AptoideTest.kt | 6 +- .../store/stores/CafeBazaarStoreTest.kt | 6 +- .../appupdater/store/stores/FDroidTest.kt | 6 +- .../store/stores/GooglePlayStoreTest.kt | 6 +- .../store/stores/HuaweiAppGalleryTest.kt | 6 +- .../store/stores/LenovoAppCenterTest.kt | 6 +- .../store/stores/MiGetAppStoreTest.kt | 6 +- .../appupdater/store/stores/MyketStoreTest.kt | 6 +- .../appupdater/store/stores/NineAppsTest.kt | 6 +- .../store/stores/OneStoreAppMarketTest.kt | 6 +- .../store/stores/OppoAppMarketTest.kt | 6 +- .../store/stores/SamsungGalaxyStoreTest.kt | 6 +- .../store/stores/TencentStoreTest.kt | 6 +- .../appupdater/store/stores/VAppStoreTest.kt | 6 +- .../store/stores/ZTEAppCenterTest.kt | 6 +- .../androidappupdater/store/ShowStoreModel.kt | 10 ++ .../androidappupdater/store/StoreListUtil.kt | 6 - .../store/domain/StoreFactory.kt | 40 ++++++ .../store/{model => domain}/StoreListItem.kt | 19 ++- .../store/domain/StoreManager.kt | 11 +- .../store/model/ShowStoreModel.kt | 8 -- .../androidappupdater/store/model/Store.kt | 42 ------ .../store/stores/AmazonAppStore.kt | 24 +++- .../store/stores/AppStore.kt | 5 +- .../androidappupdater/store/stores/Aptoide.kt | 28 +++- .../store/stores/CafeBazaarStore.kt | 28 +++- .../androidappupdater/store/stores/FDroid.kt | 28 +++- .../store/stores/GooglePlayStore.kt | 28 +++- .../store/stores/HuaweiAppGallery.kt | 28 +++- .../store/stores/LenovoAppCenter.kt | 26 +++- .../store/stores/MiGetAppStore.kt | 26 +++- .../store/stores/MyketStore.kt | 28 +++- .../store/stores/NineApps.kt | 28 +++- .../store/stores/OneStoreAppMarket.kt | 26 +++- .../store/stores/OppoAppMarket.kt | 28 +++- .../store/stores/SamsungGalaxyStore.kt | 26 +++- .../store/stores/TencentAppStore.kt | 24 +++- .../store/stores/VAppStore.kt | 24 +++- .../store/stores/ZTEAppCenter.kt | 24 +++- .../store/utils/StoreListUtilTest.kt | 61 -------- 79 files changed, 815 insertions(+), 641 deletions(-) delete mode 100644 app/src/main/java/com/pouyaheydari/androidappupdater/utils/FragmentDialogPreviewData.kt rename {store/src/main/java/com/pouyaheydari/androidappupdater/store => core/src/main/java/com/pouyaheydari/appupdater/core}/model/Theme.kt (62%) create mode 100644 directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/data/model/DirectDownloadListItem.kt create mode 100644 store/src/main/java/com/pouyaheydari/androidappupdater/store/ShowStoreModel.kt delete mode 100644 store/src/main/java/com/pouyaheydari/androidappupdater/store/StoreListUtil.kt create mode 100644 store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreFactory.kt rename store/src/main/java/com/pouyaheydari/androidappupdater/store/{model => domain}/StoreListItem.kt (66%) delete mode 100644 store/src/main/java/com/pouyaheydari/androidappupdater/store/model/ShowStoreModel.kt delete mode 100644 store/src/main/java/com/pouyaheydari/androidappupdater/store/model/Store.kt delete mode 100644 store/src/test/java/com/pouyaheydari/appupdater/store/utils/StoreListUtilTest.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ebf90c27..9bc4cd3a 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -46,8 +46,8 @@ dependencies { implementation(project(":compose")) // support dependency - implementation(libs.appcompat) - implementation(libs.constraintLayout) + implementation(libs.androidx.appcompat) + implementation(libs.androidx.constraintLayout) // compose val composeBom = platform(libs.androidx.compose.bom) @@ -60,8 +60,8 @@ dependencies { // testing dependency testImplementation(libs.junit4) - androidTestImplementation(libs.androidTestJUnit) - androidTestImplementation(libs.androidTestRules) - androidTestImplementation(libs.androidTestEspresso) + androidTestImplementation(libs.androidx.test.junit) + androidTestImplementation(libs.androidx.test.rules) + androidTestImplementation(libs.androidx.test.ui.espresso.core) androidTestImplementation(composeBom) } diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/android/MainActivity.kt b/app/src/main/java/com/pouyaheydari/androidappupdater/ui/android/MainActivity.kt index 9a62d9bf..e3f474f6 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/android/MainActivity.kt +++ b/app/src/main/java/com/pouyaheydari/androidappupdater/ui/android/MainActivity.kt @@ -6,11 +6,13 @@ import android.os.Bundle import android.widget.Button import androidx.appcompat.app.AppCompatActivity import com.pouyaheydari.androidappupdater.R -import com.pouyaheydari.androidappupdater.store.model.Theme import com.pouyaheydari.androidappupdater.ui.compose.ComposeSampleActivity -import com.pouyaheydari.androidappupdater.utils.getDSLList -import com.pouyaheydari.androidappupdater.utils.getNormalList +import com.pouyaheydari.androidappupdater.utils.directDownloadList +import com.pouyaheydari.androidappupdater.utils.getDSLStoreList +import com.pouyaheydari.androidappupdater.utils.getDslDirectDownloadLink +import com.pouyaheydari.androidappupdater.utils.storeList import com.pouyaheydari.appupdater.AppUpdaterDialog +import com.pouyaheydari.appupdater.core.model.Theme import com.pouyaheydari.appupdater.dsl.updateDialogBuilder import com.pouyaheydari.appupdater.pojo.UpdaterDialogData @@ -48,9 +50,10 @@ internal class MainActivity : AppCompatActivity() { title = getString(R.string.library_title) description = getString(R.string.library_description) isForceUpdate = false + storeList = getDSLStoreList(context = this@MainActivity) + directDownloadList = getDslDirectDownloadLink(context = this@MainActivity) typeface = Typeface.createFromAsset(assets, FONT_PATH) theme = Theme.SYSTEM_DEFAULT - storeList = getDSLList(this@MainActivity) }.show(supportFragmentManager, TAG) } @@ -60,14 +63,13 @@ internal class MainActivity : AppCompatActivity() { * core and appupdater */ private fun kotlinSample() { - // make a list of stores - val list = getNormalList(this) // creating update dialog AppUpdaterDialog.getInstance( UpdaterDialogData( title = getString(R.string.library_title), description = getString(R.string.library_description), - storeList = list, + storeList = storeList(this), + directDownloadList = directDownloadList(this), isForceUpdate = false, typeface = Typeface.createFromAsset(assets, FONT_PATH), theme = Theme.LIGHT, diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt b/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt index c72412d0..9fd18764 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt +++ b/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt @@ -14,16 +14,16 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import com.pouyaheydari.androidappupdater.R -import com.pouyaheydari.androidappupdater.store.model.Theme import com.pouyaheydari.androidappupdater.ui.compose.theme.AndroidAppUpdaterTheme import com.pouyaheydari.androidappupdater.utils.directDownloadList -import com.pouyaheydari.androidappupdater.utils.getNormalList import com.pouyaheydari.androidappupdater.utils.storeList import com.pouyaheydari.appupdater.compose.ui.AndroidAppUpdater import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogData +import com.pouyaheydari.appupdater.core.model.Theme import com.pouyaheydari.appupdater.core.R as coreR /** @@ -48,7 +48,8 @@ internal class ComposeSampleActivity : ComponentActivity() { UpdaterDialogData( dialogTitle = stringResource(id = coreR.string.appupdater_app_name), dialogDescription = stringResource(id = R.string.library_description), - storeList = getNormalList(this), + storeList = storeList(this), + directDownloadList = directDownloadList(this), theme = Theme.SYSTEM_DEFAULT, onDismissRequested = { state = false }, ), @@ -67,7 +68,8 @@ private fun DefaultPreview() { UpdaterDialogData( dialogTitle = stringResource(id = coreR.string.appupdater_app_name), dialogDescription = stringResource(id = R.string.library_description), - storeList = directDownloadList + storeList, + storeList = storeList(LocalContext.current), + directDownloadList = directDownloadList(LocalContext.current), theme = Theme.DARK, ), ) diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/utils/ComposePreviewData.kt b/app/src/main/java/com/pouyaheydari/androidappupdater/utils/ComposePreviewData.kt index 1484a755..753128f4 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/utils/ComposePreviewData.kt +++ b/app/src/main/java/com/pouyaheydari/androidappupdater/utils/ComposePreviewData.kt @@ -1,91 +1,102 @@ package com.pouyaheydari.androidappupdater.utils -import com.pouyaheydari.androidappupdater.store.model.Store -import com.pouyaheydari.androidappupdater.store.model.StoreListItem +import android.content.Context +import com.pouyaheydari.androidappupdater.R +import com.pouyaheydari.androidappupdater.directdownload.data.model.DirectDownloadListItem +import com.pouyaheydari.androidappupdater.store.domain.StoreFactory +import com.pouyaheydari.androidappupdater.store.domain.StoreListItem import com.pouyaheydari.appupdater.core.R as coreR -internal val directDownloadList = listOf( - StoreListItem( - store = Store.DIRECT_URL, - title = "Direct Download 1", - icon = coreR.drawable.appupdater_ic_cloud, +internal fun directDownloadList(context: Context) = listOf( + DirectDownloadListItem( + title = context.getString(R.string.direct_download, "1"), url = APK_URL, - packageName = SAMPLE_PACKAGE_NAME, ), - StoreListItem( - store = Store.DIRECT_URL, - title = "Direct Download 2", - icon = coreR.drawable.appupdater_ic_cloud, + DirectDownloadListItem( + title = context.getString(R.string.direct_download, "2"), url = APK_URL, - packageName = SAMPLE_PACKAGE_NAME, ), ) -internal val storeList = listOf( +internal fun storeList(context: Context) = listOf( StoreListItem( - Store.GOOGLE_PLAY, - "Google Play", - packageName = SAMPLE_PACKAGE_NAME, + StoreFactory.getGooglePlayStore(SAMPLE_PACKAGE_NAME), + context.getString(R.string.play), icon = coreR.drawable.appupdater_ic_google_play, ), StoreListItem( - Store.CAFE_BAZAAR, - "Cafe Bazaar", - packageName = SAMPLE_PACKAGE_NAME, + StoreFactory.getCafeBazaarStore(SAMPLE_PACKAGE_NAME), + context.getString(R.string.bazaar), icon = coreR.drawable.appupdater_ic_bazar, ), StoreListItem( - Store.MYKET, - "Myket", - packageName = SAMPLE_PACKAGE_NAME, + StoreFactory.getMyketStore(SAMPLE_PACKAGE_NAME), + context.getString(R.string.myket), icon = coreR.drawable.appupdater_ic_myket, ), StoreListItem( - Store.HUAWEI_APP_GALLERY, - "App Gallery", - packageName = SAMPLE_PACKAGE_NAME, + StoreFactory.getHuaweiAppGalleryStore(SAMPLE_PACKAGE_NAME), + context.getString(R.string.app_gallery), icon = coreR.drawable.appupdater_ic_app_gallery, ), StoreListItem( - Store.SAMSUNG_GALAXY_STORE, - "Galaxy Store", - packageName = SAMPLE_PACKAGE_NAME, + StoreFactory.getSamsungGalaxyStore(SAMPLE_PACKAGE_NAME), + context.getString(R.string.galaxy_store), icon = coreR.drawable.appupdater_ic_galaxy_store, ), StoreListItem( - Store.AMAZON_APP_STORE, - "Amazon App Store", - packageName = SAMPLE_PACKAGE_NAME, + StoreFactory.getAmazonAppStore(SAMPLE_PACKAGE_NAME), + context.getString(R.string.amazon_store), icon = coreR.drawable.appupdater_ic_amazon_app_store, ), StoreListItem( - Store.APTOIDE, - "Aptoide", - packageName = SAMPLE_PACKAGE_NAME, + StoreFactory.getAptoideStore(SAMPLE_PACKAGE_NAME), + context.getString(R.string.aptoide), icon = coreR.drawable.appupdater_ic_aptoide, ), StoreListItem( - Store.FDROID, - "FDroid", - packageName = FDROID_SAMPLE_PACKAGE_NAME, + StoreFactory.getOppoAppMarketStore(SAMPLE_PACKAGE_NAME), + context.getString(R.string.oppo_app_market), + icon = coreR.drawable.appupdater_ic_oppo_app_market, + ), + StoreListItem( + StoreFactory.getVAppStore(SAMPLE_PACKAGE_NAME), + context.getString(R.string.v_app_store), + icon = coreR.drawable.appupdater_ic_v_app_store, + ), + StoreListItem( + StoreFactory.getNineAppsStore(SAMPLE_PACKAGE_NAME), + context.getString(R.string.nine_apps), + icon = coreR.drawable.appupdater_ic_nine_apps, + ), + StoreListItem( + StoreFactory.getTencentAppStore(SAMPLE_PACKAGE_NAME), + context.getString(R.string.tencent_app_store), + icon = coreR.drawable.appupdater_ic_tencent_app_store, + ), + StoreListItem( + StoreFactory.getZTEStore(SAMPLE_PACKAGE_NAME), + context.getString(R.string.zte_app_store), + icon = coreR.drawable.appupdater_ic_zte_app_center, + ), + StoreListItem( + StoreFactory.getLenovoAppCenterStore(SAMPLE_PACKAGE_NAME), + context.getString(R.string.lenovo_app_center), + icon = coreR.drawable.appupdater_ic_zte_app_center, + ), + StoreListItem( + StoreFactory.getFdroidStore(FDROID_SAMPLE_PACKAGE_NAME), + context.getString(R.string.fdroid), icon = coreR.drawable.appupdater_ic_fdroid, ), StoreListItem( - Store.MI_GET_APP_STORE, - "Mi GetApp", - packageName = GET_APP_SAMPLE_PACKAGE_NAME, + StoreFactory.getMiStore(GET_APP_SAMPLE_PACKAGE_NAME), + context.getString(R.string.mi_get_app), icon = coreR.drawable.appupdater_ic_get_app_store, ), StoreListItem( - Store.ONE_STORE_APP_MARKET, - "One Store", - packageName = ONE_STORE_SAMPLE_PACKAGE_NAME, + StoreFactory.getOneStore(ONE_STORE_SAMPLE_PACKAGE_NAME), + context.getString(R.string.one_store), icon = coreR.drawable.appupdater_ic_one_store, ), - StoreListItem( - Store.OPPO_APP_MARKET, - "Oppo App Market", - packageName = SAMPLE_PACKAGE_NAME, - icon = coreR.drawable.appupdater_ic_oppo_app_market, - ), ) diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/utils/DSLPreviewData.kt b/app/src/main/java/com/pouyaheydari/androidappupdater/utils/DSLPreviewData.kt index 6bdf9618..1fbadcc6 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/utils/DSLPreviewData.kt +++ b/app/src/main/java/com/pouyaheydari/androidappupdater/utils/DSLPreviewData.kt @@ -2,133 +2,117 @@ package com.pouyaheydari.androidappupdater.utils import android.content.Context import com.pouyaheydari.androidappupdater.R -import com.pouyaheydari.androidappupdater.store.model.Store +import com.pouyaheydari.androidappupdater.store.domain.StoreFactory +import com.pouyaheydari.appupdater.dsl.directDownload import com.pouyaheydari.appupdater.dsl.store import com.pouyaheydari.appupdater.core.R as coreR -internal fun getDSLList(context: Context) = listOf( - store { - store = Store.DIRECT_URL +internal fun getDslDirectDownloadLink(context: Context) = listOf( + directDownload { title = context.getString(R.string.direct_download, "1") url = APK_URL - packageName = SAMPLE_PACKAGE_NAME }, - store { - store = Store.DIRECT_URL + directDownload { title = context.getString(R.string.direct_download, "2") url = APK_URL - packageName = SAMPLE_PACKAGE_NAME }, +) + +internal fun getDSLStoreList(context: Context) = listOf( store { - store = Store.GOOGLE_PLAY + store = StoreFactory.getGooglePlayStore(SAMPLE_PACKAGE_NAME) title = context.getString(R.string.play) icon = coreR.drawable.appupdater_ic_google_play - packageName = SAMPLE_PACKAGE_NAME url = WEBSITE_URL }, store { - store = Store.CAFE_BAZAAR + store = StoreFactory.getCafeBazaarStore(SAMPLE_PACKAGE_NAME) title = context.getString(R.string.bazaar) icon = coreR.drawable.appupdater_ic_bazar - packageName = SAMPLE_PACKAGE_NAME url = WEBSITE_URL }, store { - store = Store.MYKET + store = StoreFactory.getMyketStore(SAMPLE_PACKAGE_NAME) title = context.getString(R.string.myket) icon = coreR.drawable.appupdater_ic_myket - packageName = SAMPLE_PACKAGE_NAME url = WEBSITE_URL }, store { - store = Store.HUAWEI_APP_GALLERY + store = StoreFactory.getHuaweiAppGalleryStore(SAMPLE_PACKAGE_NAME) title = context.getString(R.string.app_gallery) icon = coreR.drawable.appupdater_ic_app_gallery - packageName = SAMPLE_PACKAGE_NAME url = WEBSITE_URL }, store { - store = Store.SAMSUNG_GALAXY_STORE + store = StoreFactory.getSamsungGalaxyStore(SAMPLE_PACKAGE_NAME) title = context.getString(R.string.galaxy_store) icon = coreR.drawable.appupdater_ic_galaxy_store - packageName = SAMPLE_PACKAGE_NAME url = WEBSITE_URL }, store { - store = Store.AMAZON_APP_STORE + store = StoreFactory.getAmazonAppStore(SAMPLE_PACKAGE_NAME) title = context.getString(R.string.amazon_store) icon = coreR.drawable.appupdater_ic_amazon_app_store - packageName = SAMPLE_PACKAGE_NAME url = WEBSITE_URL }, store { - store = Store.APTOIDE + store = StoreFactory.getAptoideStore(SAMPLE_PACKAGE_NAME) title = context.getString(R.string.aptoide) icon = coreR.drawable.appupdater_ic_aptoide - packageName = SAMPLE_PACKAGE_NAME - url = WEBSITE_URL - }, - store { - store = Store.FDROID - title = context.getString(R.string.fdroid) - icon = coreR.drawable.appupdater_ic_fdroid - packageName = FDROID_SAMPLE_PACKAGE_NAME - url = WEBSITE_URL - }, - store { - store = Store.MI_GET_APP_STORE - title = context.getString(R.string.mi_get_app) - icon = coreR.drawable.appupdater_ic_get_app_store - packageName = GET_APP_SAMPLE_PACKAGE_NAME - url = WEBSITE_URL - }, - store { - store = Store.ONE_STORE_APP_MARKET - title = context.getString(R.string.one_store) - icon = coreR.drawable.appupdater_ic_one_store - packageName = ONE_STORE_SAMPLE_PACKAGE_NAME url = WEBSITE_URL }, store { - store = Store.OPPO_APP_MARKET + store = StoreFactory.getOppoAppMarketStore(SAMPLE_PACKAGE_NAME) title = context.getString(R.string.oppo_app_market) icon = coreR.drawable.appupdater_ic_oppo_app_market - packageName = SAMPLE_PACKAGE_NAME url = WEBSITE_URL }, store { - store = Store.V_APP_STORE + store = StoreFactory.getVAppStore(SAMPLE_PACKAGE_NAME) title = context.getString(R.string.v_app_store) icon = coreR.drawable.appupdater_ic_v_app_store - packageName = SAMPLE_PACKAGE_NAME url = WEBSITE_URL }, store { - store = Store.NINE_APPS_STORE + store = StoreFactory.getNineAppsStore(SAMPLE_PACKAGE_NAME) title = context.getString(R.string.nine_apps) icon = coreR.drawable.appupdater_ic_nine_apps - packageName = SAMPLE_PACKAGE_NAME url = WEBSITE_URL }, store { - store = Store.TENCENT_APPS_STORE + store = StoreFactory.getTencentAppStore(SAMPLE_PACKAGE_NAME) title = context.getString(R.string.tencent_app_store) icon = coreR.drawable.appupdater_ic_tencent_app_store - packageName = SAMPLE_PACKAGE_NAME url = WEBSITE_URL }, store { - store = Store.ZTE_APP_CENTER + store = StoreFactory.getZTEStore(SAMPLE_PACKAGE_NAME) title = context.getString(R.string.zte_app_store) icon = coreR.drawable.appupdater_ic_zte_app_center - packageName = SAMPLE_PACKAGE_NAME url = WEBSITE_URL }, store { - store = Store.LENOVO_APP_CENTER + store = StoreFactory.getLenovoAppCenterStore(SAMPLE_PACKAGE_NAME) title = context.getString(R.string.lenovo_app_center) icon = coreR.drawable.appupdater_ic_lenovo_app_center - packageName = SAMPLE_PACKAGE_NAME + url = WEBSITE_URL + }, + store { + store = StoreFactory.getFdroidStore(FDROID_SAMPLE_PACKAGE_NAME) + title = context.getString(R.string.fdroid) + icon = coreR.drawable.appupdater_ic_fdroid + url = WEBSITE_URL + }, + store { + store = StoreFactory.getMiStore(GET_APP_SAMPLE_PACKAGE_NAME) + title = context.getString(R.string.mi_get_app) + icon = coreR.drawable.appupdater_ic_get_app_store + url = WEBSITE_URL + }, + store { + store = StoreFactory.getOneStore(ONE_STORE_SAMPLE_PACKAGE_NAME) + title = context.getString(R.string.one_store) + icon = coreR.drawable.appupdater_ic_one_store url = WEBSITE_URL }, ) diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/utils/FragmentDialogPreviewData.kt b/app/src/main/java/com/pouyaheydari/androidappupdater/utils/FragmentDialogPreviewData.kt deleted file mode 100644 index 1e45ea66..00000000 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/utils/FragmentDialogPreviewData.kt +++ /dev/null @@ -1,136 +0,0 @@ -package com.pouyaheydari.androidappupdater.utils - -import android.content.Context -import com.pouyaheydari.androidappupdater.R -import com.pouyaheydari.androidappupdater.store.model.Store -import com.pouyaheydari.androidappupdater.store.model.StoreListItem -import com.pouyaheydari.appupdater.core.R as coreR - -internal fun getNormalList(context: Context) = listOf( - // direct download - StoreListItem( - store = Store.DIRECT_URL, - title = context.getString(R.string.direct_download, "1"), - url = APK_URL, - packageName = SAMPLE_PACKAGE_NAME, - ), - StoreListItem( - store = Store.DIRECT_URL, - title = context.getString(R.string.direct_download, "2"), - url = APK_URL, - packageName = SAMPLE_PACKAGE_NAME, - ), - // stores - StoreListItem( - store = Store.GOOGLE_PLAY, - title = context.getString(R.string.play), - packageName = SAMPLE_PACKAGE_NAME, - icon = coreR.drawable.appupdater_ic_google_play, - url = WEBSITE_URL, - ), - StoreListItem( - store = Store.CAFE_BAZAAR, - title = context.getString(R.string.bazaar), - packageName = SAMPLE_PACKAGE_NAME, - icon = coreR.drawable.appupdater_ic_bazar, - url = WEBSITE_URL, - ), - StoreListItem( - store = Store.MYKET, - title = context.getString(R.string.myket), - packageName = SAMPLE_PACKAGE_NAME, - icon = coreR.drawable.appupdater_ic_myket, - url = WEBSITE_URL, - ), - StoreListItem( - store = Store.HUAWEI_APP_GALLERY, - title = context.getString(R.string.app_gallery), - packageName = SAMPLE_PACKAGE_NAME, - icon = coreR.drawable.appupdater_ic_app_gallery, - url = WEBSITE_URL, - ), - StoreListItem( - store = Store.SAMSUNG_GALAXY_STORE, - title = context.getString(R.string.galaxy_store), - packageName = SAMPLE_PACKAGE_NAME, - icon = coreR.drawable.appupdater_ic_galaxy_store, - url = WEBSITE_URL, - ), - StoreListItem( - store = Store.AMAZON_APP_STORE, - title = context.getString(R.string.amazon_store), - packageName = SAMPLE_PACKAGE_NAME, - icon = coreR.drawable.appupdater_ic_amazon_app_store, - url = WEBSITE_URL, - ), - StoreListItem( - store = Store.APTOIDE, - title = context.getString(R.string.aptoide), - packageName = SAMPLE_PACKAGE_NAME, - icon = coreR.drawable.appupdater_ic_aptoide, - url = WEBSITE_URL, - ), - StoreListItem( - store = Store.FDROID, - title = context.getString(R.string.fdroid), - packageName = FDROID_SAMPLE_PACKAGE_NAME, - icon = coreR.drawable.appupdater_ic_fdroid, - url = WEBSITE_URL, - ), - StoreListItem( - store = Store.MI_GET_APP_STORE, - title = context.getString(R.string.mi_get_app), - packageName = GET_APP_SAMPLE_PACKAGE_NAME, - icon = coreR.drawable.appupdater_ic_get_app_store, - url = WEBSITE_URL, - ), - StoreListItem( - store = Store.ONE_STORE_APP_MARKET, - title = context.getString(R.string.one_store), - packageName = ONE_STORE_SAMPLE_PACKAGE_NAME, - icon = coreR.drawable.appupdater_ic_one_store, - url = WEBSITE_URL, - ), - StoreListItem( - store = Store.OPPO_APP_MARKET, - title = context.getString(R.string.oppo_app_market), - packageName = SAMPLE_PACKAGE_NAME, - icon = coreR.drawable.appupdater_ic_oppo_app_market, - url = WEBSITE_URL, - ), - StoreListItem( - store = Store.V_APP_STORE, - title = context.getString(R.string.v_app_store), - packageName = SAMPLE_PACKAGE_NAME, - icon = coreR.drawable.appupdater_ic_v_app_store, - url = WEBSITE_URL, - ), - StoreListItem( - store = Store.NINE_APPS_STORE, - title = context.getString(R.string.nine_apps), - packageName = SAMPLE_PACKAGE_NAME, - icon = coreR.drawable.appupdater_ic_nine_apps, - url = WEBSITE_URL, - ), - StoreListItem( - store = Store.TENCENT_APPS_STORE, - title = context.getString(R.string.tencent_app_store), - packageName = SAMPLE_PACKAGE_NAME, - icon = coreR.drawable.appupdater_ic_tencent_app_store, - url = WEBSITE_URL, - ), - StoreListItem( - store = Store.ZTE_APP_CENTER, - title = context.getString(R.string.zte_app_store), - packageName = SAMPLE_PACKAGE_NAME, - icon = coreR.drawable.appupdater_ic_zte_app_center, - url = WEBSITE_URL, - ), - StoreListItem( - store = Store.LENOVO_APP_CENTER, - title = context.getString(R.string.lenovo_app_center), - packageName = SAMPLE_PACKAGE_NAME, - icon = coreR.drawable.appupdater_ic_lenovo_app_center, - url = WEBSITE_URL, - ), -) diff --git a/appupdater/build.gradle.kts b/appupdater/build.gradle.kts index dfad8f78..846731f6 100644 --- a/appupdater/build.gradle.kts +++ b/appupdater/build.gradle.kts @@ -35,17 +35,17 @@ dependencies { api(project(":directdownload")) // support dependency - implementation(libs.appcompat) - implementation(libs.constraintLayout) - implementation(libs.recyclerView) + implementation(libs.androidx.appcompat) + implementation(libs.androidx.constraintLayout) + implementation(libs.androidx.recyclerView) implementation(libs.coroutines) implementation(libs.androidx.fragment) // testing dependency testImplementation(libs.junit4) - androidTestImplementation(libs.androidTestJUnit) - androidTestImplementation(libs.androidTestRules) - androidTestImplementation(libs.androidTestEspresso) + androidTestImplementation(libs.androidx.test.junit) + androidTestImplementation(libs.androidx.test.rules) + androidTestImplementation(libs.androidx.test.ui.espresso.core) } afterEvaluate { diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterDialog.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterDialog.kt index 13e853d6..33215470 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterDialog.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterDialog.kt @@ -16,11 +16,10 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.GridLayoutManager +import com.pouyaheydari.androidappupdater.directdownload.data.model.DirectDownloadListItem import com.pouyaheydari.androidappupdater.directdownload.utils.getApk +import com.pouyaheydari.androidappupdater.store.domain.StoreListItem import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.model.Store.DIRECT_URL -import com.pouyaheydari.androidappupdater.store.model.StoreListItem -import com.pouyaheydari.androidappupdater.store.shouldShowStoresDivider import com.pouyaheydari.appupdater.adapters.DirectRecyclerAdapter import com.pouyaheydari.appupdater.adapters.StoresRecyclerAdapter import com.pouyaheydari.appupdater.databinding.FragmentAppUpdaterDialogBinding @@ -110,12 +109,13 @@ class AppUpdaterDialog : DialogFragment() { val data = arguments?.parcelable(UPDATE_DIALOG_KEY) ?: UpdaterFragmentModel.EMPTY val title = data.title val description = data.description - val list = data.storeList + val storeList = data.storeList + val directDownloadList = data.directDownloadList val theme = mapToSelectedTheme(data.theme, requireContext()) setTheme(theme) val typeface = TypefaceHolder.typeface setTypeface(typeface) - setUpProperties(title, description, list, theme, typeface) + setUpProperties(title, description, storeList, directDownloadList, theme, typeface) subscribeToUpdateInProgressDialog(theme) } @@ -146,35 +146,36 @@ class AppUpdaterDialog : DialogFragment() { private fun setUpProperties( title: String?, description: String?, - list: List, + storeList: List, + directDownloadList: List, theme: UserSelectedTheme, typeface: Typeface?, ) { binding.txtTitle.text = title binding.txtDescription.text = description - val directLinks = list.filter { it.store == DIRECT_URL } - val storeList = list.filterNot { it.store == DIRECT_URL } - - hideOrLayoutIfNeeded(shouldShowStoresDivider(directLinks, storeList)) + hideOrLayoutIfNeeded(shouldShowStoresDivider(directDownloadList, storeList)) - setUpBothRecyclers(directLinks, storeList, theme, typeface) + setUpBothRecyclers(directDownloadList, storeList, theme, typeface) } + private fun shouldShowStoresDivider(directDownloadList: List, storeList: List): Boolean = + directDownloadList.isNotEmpty() && storeList.isNotEmpty() + private fun setUpBothRecyclers( - directDownloadList: List, + directDownloadList: List, storeList: List, theme: UserSelectedTheme, typeface: Typeface?, ) { if (directDownloadList.isNotEmpty()) { - binding.recyclerDirect.adapter = DirectRecyclerAdapter(directDownloadList, typeface) { viewModel.onListListener(it) } + binding.recyclerDirect.adapter = DirectRecyclerAdapter(directDownloadList, typeface) { viewModel.onDirectDownloadLinkClicked(it) } } if (storeList.isNotEmpty()) { val spanCount = if (storeList.size > 1) 2 else 1 binding.recyclerStores.layoutManager = GridLayoutManager(requireContext(), spanCount) - binding.recyclerStores.adapter = StoresRecyclerAdapter(storeList, theme, typeface) { viewModel.onListListener(it) } + binding.recyclerStores.adapter = StoresRecyclerAdapter(storeList, theme, typeface) { viewModel.onStoreCLicked(it) } } } @@ -213,7 +214,7 @@ class AppUpdaterDialog : DialogFragment() { */ fun getInstance(dialogData: UpdaterDialogData): AppUpdaterDialog = with(dialogData) { val fragment = AppUpdaterDialog() - val data = UpdaterFragmentModel(title, description, storeList, !isForceUpdate, theme) + val data = UpdaterFragmentModel(title, description, storeList, directDownloadList, !isForceUpdate, theme) TypefaceHolder.typeface = typeface // bundle to add data to our dialog diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterViewModel.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterViewModel.kt index e574f241..d9626f9e 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterViewModel.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterViewModel.kt @@ -2,10 +2,10 @@ package com.pouyaheydari.appupdater import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.pouyaheydari.androidappupdater.directdownload.data.model.DirectDownloadListItem import com.pouyaheydari.androidappupdater.directdownload.domain.GetIsUpdateInProgress -import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel -import com.pouyaheydari.androidappupdater.store.model.Store -import com.pouyaheydari.androidappupdater.store.model.StoreListItem +import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.StoreListItem import com.pouyaheydari.appupdater.pojo.DialogStates import com.pouyaheydari.appupdater.utils.TypefaceHolder import kotlinx.coroutines.delay @@ -19,23 +19,21 @@ import kotlinx.coroutines.launch internal class AppUpdaterViewModel : ViewModel() { val screenState = MutableStateFlow(DialogStates.HideUpdateInProgress) - fun onListListener(item: StoreListItem) { - when (item.store) { - Store.DIRECT_URL -> { - observeUpdateInProgressStatus() - screenState.value = DialogStates.DownloadApk(item.url) - } - - else -> viewModelScope.launch { - val storeModel = ShowStoreModel(item.packageName, item.store, item.url) - screenState.value = DialogStates.OpenStore(storeModel) - runWithDelay { - screenState.value = DialogStates.HideUpdateInProgress - } + fun onStoreCLicked(item: StoreListItem) { + viewModelScope.launch { + val storeModel = ShowStoreModel(item.store, item.url) + screenState.value = DialogStates.OpenStore(storeModel) + runWithDelay { + screenState.value = DialogStates.HideUpdateInProgress } } } + fun onDirectDownloadLinkClicked(item: DirectDownloadListItem) { + observeUpdateInProgressStatus() + screenState.value = DialogStates.DownloadApk(item.url) + } + private fun observeUpdateInProgressStatus() { viewModelScope.launch { GetIsUpdateInProgress().invoke().collectLatest { diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/adapters/DirectRecyclerAdapter.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/adapters/DirectRecyclerAdapter.kt index ba0f71a4..e18cbfa4 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/adapters/DirectRecyclerAdapter.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/adapters/DirectRecyclerAdapter.kt @@ -4,16 +4,16 @@ import android.graphics.Typeface import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView -import com.pouyaheydari.androidappupdater.store.model.StoreListItem +import com.pouyaheydari.androidappupdater.directdownload.data.model.DirectDownloadListItem import com.pouyaheydari.appupdater.databinding.DownloadDirectItemBinding /** * Adapter to show Direct download links */ internal class DirectRecyclerAdapter( - private val list: List, + private val list: List, private val typeface: Typeface?, - private val listener: (StoreListItem) -> Unit, + private val listener: (DirectDownloadListItem) -> Unit, ) : RecyclerView.Adapter() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SoresViewHolder = DownloadDirectItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) @@ -30,7 +30,7 @@ internal class DirectRecyclerAdapter( /** * Binds data to layout */ - fun onBind(item: StoreListItem) { + fun onBind(item: DirectDownloadListItem) { val txtDirect = binding.txtDirect txtDirect.text = item.title typeface?.let { txtDirect.typeface = it } diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/adapters/StoresRecyclerAdapter.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/adapters/StoresRecyclerAdapter.kt index 232abcc2..c28abf78 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/adapters/StoresRecyclerAdapter.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/adapters/StoresRecyclerAdapter.kt @@ -5,7 +5,7 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView -import com.pouyaheydari.androidappupdater.store.model.StoreListItem +import com.pouyaheydari.androidappupdater.store.domain.StoreListItem import com.pouyaheydari.appupdater.databinding.DownloadStoresItemBinding import com.pouyaheydari.appupdater.pojo.UserSelectedTheme import com.pouyaheydari.appupdater.pojo.UserSelectedTheme.DARK diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/dsl/DSLUtils.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/dsl/DSLUtils.kt index 6b83232a..b54a92cb 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/dsl/DSLUtils.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/dsl/DSLUtils.kt @@ -1,6 +1,7 @@ package com.pouyaheydari.appupdater.dsl -import com.pouyaheydari.androidappupdater.store.model.StoreListItem +import com.pouyaheydari.androidappupdater.directdownload.data.model.DirectDownloadListItem +import com.pouyaheydari.androidappupdater.store.domain.StoreListItem import com.pouyaheydari.appupdater.AppUpdaterDialog import com.pouyaheydari.appupdater.pojo.UpdaterDialogData @@ -9,6 +10,8 @@ import com.pouyaheydari.appupdater.pojo.UpdaterDialogData */ inline fun store(block: StoreListItem.() -> Unit): StoreListItem = StoreListItem().apply(block) +inline fun directDownload(block: DirectDownloadListItem.() -> Unit): DirectDownloadListItem = DirectDownloadListItem().apply(block) + /** * This inline function helps building UpdateDialog in DSL way */ diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/mapper/SelectedThemeMapper.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/mapper/SelectedThemeMapper.kt index 33d2de15..e3c23f25 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/mapper/SelectedThemeMapper.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/mapper/SelectedThemeMapper.kt @@ -2,10 +2,10 @@ package com.pouyaheydari.appupdater.mapper import android.content.Context import android.content.res.Configuration -import com.pouyaheydari.androidappupdater.store.model.Theme -import com.pouyaheydari.androidappupdater.store.model.Theme.DARK -import com.pouyaheydari.androidappupdater.store.model.Theme.LIGHT -import com.pouyaheydari.androidappupdater.store.model.Theme.SYSTEM_DEFAULT +import com.pouyaheydari.appupdater.core.model.Theme +import com.pouyaheydari.appupdater.core.model.Theme.DARK +import com.pouyaheydari.appupdater.core.model.Theme.LIGHT +import com.pouyaheydari.appupdater.core.model.Theme.SYSTEM_DEFAULT import com.pouyaheydari.appupdater.pojo.UserSelectedTheme /** diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/DialogStates.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/DialogStates.kt index 4e76c1a2..3415365d 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/DialogStates.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/DialogStates.kt @@ -1,6 +1,6 @@ package com.pouyaheydari.appupdater.pojo -import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.ShowStoreModel /** * Represents UI states of the update dialog diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/UpdaterDialogData.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/UpdaterDialogData.kt index ca54c705..56105cdc 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/UpdaterDialogData.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/UpdaterDialogData.kt @@ -1,8 +1,9 @@ package com.pouyaheydari.appupdater.pojo import android.graphics.Typeface -import com.pouyaheydari.androidappupdater.store.model.StoreListItem -import com.pouyaheydari.androidappupdater.store.model.Theme +import com.pouyaheydari.androidappupdater.directdownload.data.model.DirectDownloadListItem +import com.pouyaheydari.androidappupdater.store.domain.StoreListItem +import com.pouyaheydari.appupdater.core.model.Theme /** * This model is used to pass the data to dialog fragment via bundles @@ -11,6 +12,7 @@ data class UpdaterDialogData( var title: String = "", var description: String = "", var storeList: List = listOf(), + var directDownloadList: List = listOf(), var isForceUpdate: Boolean = false, var typeface: Typeface? = null, var theme: Theme = Theme.SYSTEM_DEFAULT, diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/UpdaterFragmentModel.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/UpdaterFragmentModel.kt index 8314fc79..68f9ca36 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/UpdaterFragmentModel.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/UpdaterFragmentModel.kt @@ -2,8 +2,9 @@ package com.pouyaheydari.appupdater.pojo import android.os.Parcel import android.os.Parcelable -import com.pouyaheydari.androidappupdater.store.model.StoreListItem -import com.pouyaheydari.androidappupdater.store.model.Theme +import com.pouyaheydari.androidappupdater.directdownload.data.model.DirectDownloadListItem +import com.pouyaheydari.androidappupdater.store.domain.StoreListItem +import com.pouyaheydari.appupdater.core.model.Theme /** * This model is used to pass the data to dialog fragment via bundles @@ -12,6 +13,7 @@ data class UpdaterFragmentModel( var title: String = "", var description: String = "", var storeList: List = listOf(), + var directDownloadList: List = listOf(), var isForceUpdate: Boolean = false, var theme: Theme = Theme.SYSTEM_DEFAULT, ) : Parcelable { @@ -19,6 +21,7 @@ data class UpdaterFragmentModel( parcel.readString().orEmpty(), parcel.readString().orEmpty(), parcel.createTypedArrayList(StoreListItem).orEmpty(), + parcel.createTypedArrayList(DirectDownloadListItem).orEmpty(), parcel.readByte() != 0.toByte(), Theme.entries[parcel.readInt()], ) diff --git a/compose/build.gradle.kts b/compose/build.gradle.kts index 02ac5428..9d3ae137 100644 --- a/compose/build.gradle.kts +++ b/compose/build.gradle.kts @@ -59,8 +59,8 @@ dependencies { // testing testImplementation(libs.junit4) - androidTestImplementation(libs.androidTestJUnit) - androidTestImplementation(libs.androidTestEspresso) + androidTestImplementation(libs.androidx.test.junit) + androidTestImplementation(libs.androidx.test.ui.espresso.core) androidTestImplementation(composeBom) } diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/data/mapper/UpdaterDialogUIMapper.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/data/mapper/UpdaterDialogUIMapper.kt index b75033c0..34515e4c 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/data/mapper/UpdaterDialogUIMapper.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/data/mapper/UpdaterDialogUIMapper.kt @@ -1,20 +1,22 @@ package com.pouyaheydari.appupdater.compose.data.mapper -import com.pouyaheydari.androidappupdater.store.model.Store -import com.pouyaheydari.androidappupdater.store.shouldShowStoresDivider +import com.pouyaheydari.androidappupdater.directdownload.data.model.DirectDownloadListItem +import com.pouyaheydari.androidappupdater.store.domain.StoreListItem import com.pouyaheydari.appupdater.compose.ui.models.DialogHeaderModel import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogUIData import com.pouyaheydari.appupdater.compose.ui.models.UpdaterViewModelData internal object UpdaterDialogUIMapper { fun map(viewModelData: UpdaterViewModelData): UpdaterDialogUIData = with(viewModelData) { - val (directDownloadItems, storeItems) = storeList.partition { it.store == Store.DIRECT_URL } UpdaterDialogUIData( dialogHeader = DialogHeaderModel(dialogTitle, dialogDescription), - directDownloadList = directDownloadItems, - storeList = storeItems, - shouldShowDividers = shouldShowStoresDivider(directDownloadItems, storeItems), + directDownloadList = viewModelData.directDownloadList, + storeList = viewModelData.storeList, + shouldShowDividers = shouldShowStoresDivider(viewModelData.directDownloadList, viewModelData.storeList), onDismissRequested = onDismissRequested, ) } + + private fun shouldShowStoresDivider(directDownloadList: List, storeList: List) = + directDownloadList.isNotEmpty() && storeList.isNotEmpty() } diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/data/mapper/UpdaterViewModelDataMapper.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/data/mapper/UpdaterViewModelDataMapper.kt index 05200234..f56b6a77 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/data/mapper/UpdaterViewModelDataMapper.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/data/mapper/UpdaterViewModelDataMapper.kt @@ -9,6 +9,7 @@ internal object UpdaterViewModelDataMapper { dialogTitle = dialogTitle, dialogDescription = dialogDescription, storeList = storeList, + directDownloadList = directDownloadList, onDismissRequested = onDismissRequested, theme = theme, ) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt index 4b2ce39a..031d6b2f 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt @@ -6,9 +6,8 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.lifecycle.viewmodel.compose.viewModel +import com.pouyaheydari.androidappupdater.store.ShowStoreModel import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel -import com.pouyaheydari.androidappupdater.store.model.Theme import com.pouyaheydari.appupdater.compose.ui.components.AppUpdaterDialog import com.pouyaheydari.appupdater.compose.ui.components.UpdateInProgressDialogComponent import com.pouyaheydari.appupdater.compose.ui.models.DialogScreenIntents @@ -19,6 +18,7 @@ import com.pouyaheydari.appupdater.compose.utils.getApkIfActivityIsNotNull import com.pouyaheydari.appupdater.compose.utils.isDarkThemeSelected import com.pouyaheydari.appupdater.compose.utils.previewDirectDownloadListData import com.pouyaheydari.appupdater.compose.utils.previewStoreListData +import com.pouyaheydari.appupdater.core.model.Theme import com.pouyaheydari.appupdater.core.R as coreR /** @@ -82,7 +82,8 @@ private fun LightPreview() { UpdaterDialogData( dialogTitle = stringResource(id = coreR.string.appupdater_app_name), dialogDescription = stringResource(id = coreR.string.appupdater_download_notification_desc), - storeList = previewDirectDownloadListData + previewStoreListData, + storeList = previewStoreListData, + directDownloadList = previewDirectDownloadListData, theme = Theme.LIGHT, ), ) @@ -112,7 +113,8 @@ private fun LightPreviewSingleDirectLinkItem() { UpdaterDialogData( dialogTitle = stringResource(id = coreR.string.appupdater_app_name), dialogDescription = stringResource(id = coreR.string.appupdater_download_notification_desc), - storeList = previewDirectDownloadListData.subList(0, 1), + storeList = listOf(), + directDownloadList = previewDirectDownloadListData.subList(0, 1), theme = Theme.LIGHT, ), ) @@ -127,7 +129,8 @@ private fun DarkPreview() { UpdaterDialogData( dialogTitle = stringResource(id = coreR.string.appupdater_app_name), dialogDescription = stringResource(id = coreR.string.appupdater_download_notification_desc), - storeList = previewDirectDownloadListData + previewStoreListData, + storeList = previewStoreListData, + directDownloadList = previewDirectDownloadListData, theme = Theme.DARK, ), ) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt index a4165aff..29108cff 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt @@ -4,9 +4,10 @@ import androidx.compose.runtime.State import androidx.compose.runtime.mutableStateOf import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.pouyaheydari.androidappupdater.directdownload.data.model.DirectDownloadListItem import com.pouyaheydari.androidappupdater.directdownload.domain.GetIsUpdateInProgress -import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel -import com.pouyaheydari.androidappupdater.store.model.StoreListItem +import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.StoreListItem import com.pouyaheydari.appupdater.compose.data.mapper.UpdaterDialogUIMapper import com.pouyaheydari.appupdater.compose.ui.models.DialogScreenIntents import com.pouyaheydari.appupdater.compose.ui.models.DialogScreenState @@ -44,12 +45,12 @@ internal class AndroidAppUpdaterViewModel( private fun showAppInSelectedStore(item: StoreListItem) { viewModelScope.launch { - val storeModel = ShowStoreModel(item.packageName, item.store, item.url) + val storeModel = ShowStoreModel(item.store, item.url) updateState { copy(selectedStore = storeModel, shouldOpenStore = true) } } } - private fun startDirectUrlApkDownload(item: StoreListItem) { + private fun startDirectUrlApkDownload(item: DirectDownloadListItem) { observeUpdateProgress() updateState { copy(shouldStartAPKDownload = true, downloadUrl = item.url) } } diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt index 0232ced9..f8bef9c3 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt @@ -18,7 +18,8 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog -import com.pouyaheydari.androidappupdater.store.model.StoreListItem +import com.pouyaheydari.androidappupdater.directdownload.data.model.DirectDownloadListItem +import com.pouyaheydari.androidappupdater.store.domain.StoreListItem import com.pouyaheydari.appupdater.compose.ui.models.DialogHeaderModel import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogUIData import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme @@ -30,7 +31,7 @@ import com.pouyaheydari.appupdater.core.R internal fun AppUpdaterDialog( dialogContent: UpdaterDialogUIData, onStoreClickListener: (StoreListItem) -> Unit = {}, - onDirectLinkClickListener: (StoreListItem) -> Unit = {}, + onDirectLinkClickListener: (DirectDownloadListItem) -> Unit = {}, typeface: Typeface? = null, ) { Dialog(onDismissRequest = { dialogContent.onDismissRequested() }) { @@ -42,7 +43,7 @@ internal fun AppUpdaterDialog( private fun DialogContent( dialogContent: UpdaterDialogUIData, onStoreClickListener: (StoreListItem) -> Unit, - onDirectLinkClickListener: (StoreListItem) -> Unit, + onDirectLinkClickListener: (DirectDownloadListItem) -> Unit, typeface: Typeface?, ) { Card( diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt index 6268f4e5..0207a8b3 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt @@ -3,7 +3,7 @@ package com.pouyaheydari.appupdater.compose.ui.components import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Divider +import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -26,7 +26,7 @@ internal fun DividerComponent(modifier: Modifier = Modifier) { .fillMaxWidth() .padding(top = 16.dp), ) { - Divider( + HorizontalDivider( color = MaterialTheme.colorScheme.background, modifier = Modifier .weight(1F) @@ -35,7 +35,7 @@ internal fun DividerComponent(modifier: Modifier = Modifier) { Text( text = stringResource(id = coreR.string.appupdater_or), ) - Divider( + HorizontalDivider( color = MaterialTheme.colorScheme.background, modifier = Modifier .weight(1F) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenIntents.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenIntents.kt index 120d2af1..1b7775e8 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenIntents.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenIntents.kt @@ -1,9 +1,10 @@ package com.pouyaheydari.appupdater.compose.ui.models -import com.pouyaheydari.androidappupdater.store.model.StoreListItem +import com.pouyaheydari.androidappupdater.directdownload.data.model.DirectDownloadListItem +import com.pouyaheydari.androidappupdater.store.domain.StoreListItem internal sealed interface DialogScreenIntents { data class OnStoreClicked(val item: StoreListItem) : DialogScreenIntents - data class OnDirectLinkClicked(val item: StoreListItem) : DialogScreenIntents + data class OnDirectLinkClicked(val item: DirectDownloadListItem) : DialogScreenIntents data object OnStoreOpened : DialogScreenIntents } diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenState.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenState.kt index e39f8c62..d89adff0 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenState.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenState.kt @@ -1,6 +1,6 @@ package com.pouyaheydari.appupdater.compose.ui.models -import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.ShowStoreModel internal data class DialogScreenState( val shouldShowDialog: Boolean = true, diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogData.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogData.kt index fe601c3e..b796e73d 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogData.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogData.kt @@ -1,8 +1,9 @@ package com.pouyaheydari.appupdater.compose.ui.models import android.graphics.Typeface -import com.pouyaheydari.androidappupdater.store.model.StoreListItem -import com.pouyaheydari.androidappupdater.store.model.Theme +import com.pouyaheydari.androidappupdater.directdownload.data.model.DirectDownloadListItem +import com.pouyaheydari.androidappupdater.store.domain.StoreListItem +import com.pouyaheydari.appupdater.core.model.Theme /** * This model is used to pass data to config the [com.pouyaheydari.appupdater.compose.ui.AndroidAppUpdater] @@ -11,7 +12,8 @@ data class UpdaterDialogData( val dialogTitle: String = "", val dialogDescription: String = "", val storeList: List = listOf(), - inline val onDismissRequested: () -> Unit = {}, + val directDownloadList: List = listOf(), + val onDismissRequested: () -> Unit = {}, val typeface: Typeface? = null, val theme: Theme = Theme.SYSTEM_DEFAULT, ) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogUIData.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogUIData.kt index 85bd779c..503730e9 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogUIData.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogUIData.kt @@ -1,10 +1,11 @@ package com.pouyaheydari.appupdater.compose.ui.models -import com.pouyaheydari.androidappupdater.store.model.StoreListItem +import com.pouyaheydari.androidappupdater.directdownload.data.model.DirectDownloadListItem +import com.pouyaheydari.androidappupdater.store.domain.StoreListItem internal data class UpdaterDialogUIData( val dialogHeader: DialogHeaderModel = DialogHeaderModel(), - val directDownloadList: List = emptyList(), + val directDownloadList: List = emptyList(), val storeList: List = emptyList(), val shouldShowDividers: Boolean = false, inline val onDismissRequested: () -> Unit = {}, diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterViewModelData.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterViewModelData.kt index ce4f53c9..86e1ac94 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterViewModelData.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterViewModelData.kt @@ -1,12 +1,14 @@ package com.pouyaheydari.appupdater.compose.ui.models -import com.pouyaheydari.androidappupdater.store.model.StoreListItem -import com.pouyaheydari.androidappupdater.store.model.Theme +import com.pouyaheydari.androidappupdater.directdownload.data.model.DirectDownloadListItem +import com.pouyaheydari.androidappupdater.store.domain.StoreListItem +import com.pouyaheydari.appupdater.core.model.Theme internal data class UpdaterViewModelData( val dialogTitle: String = "", val dialogDescription: String = "", val storeList: List = listOf(), - inline val onDismissRequested: () -> Unit = {}, + val directDownloadList: List = listOf(), + val onDismissRequested: () -> Unit = {}, val theme: Theme = Theme.SYSTEM_DEFAULT, ) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/AppUpdaterPreviewData.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/AppUpdaterPreviewData.kt index a38acdfd..236f6ec7 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/AppUpdaterPreviewData.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/AppUpdaterPreviewData.kt @@ -1,7 +1,8 @@ package com.pouyaheydari.appupdater.compose.utils -import com.pouyaheydari.androidappupdater.store.model.Store -import com.pouyaheydari.androidappupdater.store.model.StoreListItem +import com.pouyaheydari.androidappupdater.directdownload.data.model.DirectDownloadListItem +import com.pouyaheydari.androidappupdater.store.domain.StoreFactory +import com.pouyaheydari.androidappupdater.store.domain.StoreListItem import com.pouyaheydari.appupdater.core.R as coreR private const val CUSTOM_URL = "https://cafebazaar.ir/download/bazaar.apk" @@ -11,87 +12,95 @@ private const val GET_APP_SAMPLE_PACKAGE_NAME = "com.opera.browser" private const val ONE_STORE_SAMPLE_PACKAGE_NAME = "com.kakao.talk" internal val previewDirectDownloadListData = listOf( - StoreListItem( - store = Store.DIRECT_URL, + DirectDownloadListItem( title = "Direct Download 1", - icon = coreR.drawable.appupdater_ic_cloud, url = CUSTOM_URL, - packageName = SAMPLE_PACKAGE_NAME, ), - StoreListItem( - store = Store.DIRECT_URL, + DirectDownloadListItem( title = "Direct Download 2", - icon = coreR.drawable.appupdater_ic_cloud, url = CUSTOM_URL, - packageName = SAMPLE_PACKAGE_NAME, ), ) internal val previewStoreListData = listOf( StoreListItem( - Store.GOOGLE_PLAY, + StoreFactory.getGooglePlayStore(SAMPLE_PACKAGE_NAME), "Google Play", - packageName = SAMPLE_PACKAGE_NAME, icon = coreR.drawable.appupdater_ic_google_play, ), StoreListItem( - Store.CAFE_BAZAAR, + StoreFactory.getCafeBazaarStore(SAMPLE_PACKAGE_NAME), "Cafe Bazaar", - packageName = SAMPLE_PACKAGE_NAME, icon = coreR.drawable.appupdater_ic_bazar, ), StoreListItem( - Store.MYKET, + StoreFactory.getMyketStore(SAMPLE_PACKAGE_NAME), "Myket", - packageName = SAMPLE_PACKAGE_NAME, icon = coreR.drawable.appupdater_ic_myket, ), StoreListItem( - Store.HUAWEI_APP_GALLERY, + StoreFactory.getHuaweiAppGalleryStore(SAMPLE_PACKAGE_NAME), "App Gallery", - packageName = SAMPLE_PACKAGE_NAME, icon = coreR.drawable.appupdater_ic_app_gallery, ), StoreListItem( - Store.SAMSUNG_GALAXY_STORE, + StoreFactory.getSamsungGalaxyStore(SAMPLE_PACKAGE_NAME), "Galaxy Store", - packageName = SAMPLE_PACKAGE_NAME, icon = coreR.drawable.appupdater_ic_galaxy_store, ), StoreListItem( - Store.AMAZON_APP_STORE, + StoreFactory.getAmazonAppStore(SAMPLE_PACKAGE_NAME), "Amazon App Store", - packageName = SAMPLE_PACKAGE_NAME, icon = coreR.drawable.appupdater_ic_amazon_app_store, ), StoreListItem( - Store.APTOIDE, + StoreFactory.getAptoideStore(SAMPLE_PACKAGE_NAME), "Aptoide", - packageName = SAMPLE_PACKAGE_NAME, icon = coreR.drawable.appupdater_ic_aptoide, ), StoreListItem( - Store.FDROID, + StoreFactory.getOppoAppMarketStore(SAMPLE_PACKAGE_NAME), + "Oppo App Market", + icon = coreR.drawable.appupdater_ic_oppo_app_market, + ), + StoreListItem( + StoreFactory.getVAppStore(SAMPLE_PACKAGE_NAME), + "V-APP Store", + icon = coreR.drawable.appupdater_ic_v_app_store, + ), + StoreListItem( + StoreFactory.getNineAppsStore(SAMPLE_PACKAGE_NAME), + "Nine Apps", + icon = coreR.drawable.appupdater_ic_nine_apps, + ), + StoreListItem( + StoreFactory.getTencentAppStore(SAMPLE_PACKAGE_NAME), + "Tencent AppStore", + icon = coreR.drawable.appupdater_ic_tencent_app_store, + ), + StoreListItem( + StoreFactory.getZTEStore(SAMPLE_PACKAGE_NAME), + "ZTE App Store", + icon = coreR.drawable.appupdater_ic_zte_app_center, + ), + StoreListItem( + StoreFactory.getLenovoAppCenterStore(SAMPLE_PACKAGE_NAME), + "Lenovo App Center", + icon = coreR.drawable.appupdater_ic_zte_app_center, + ), + StoreListItem( + StoreFactory.getFdroidStore(FDROID_SAMPLE_PACKAGE_NAME), "FDroid", - packageName = FDROID_SAMPLE_PACKAGE_NAME, icon = coreR.drawable.appupdater_ic_fdroid, ), StoreListItem( - Store.MI_GET_APP_STORE, + StoreFactory.getMiStore(GET_APP_SAMPLE_PACKAGE_NAME), "Mi GetApp", - packageName = GET_APP_SAMPLE_PACKAGE_NAME, icon = coreR.drawable.appupdater_ic_get_app_store, ), StoreListItem( - Store.ONE_STORE_APP_MARKET, + StoreFactory.getOneStore(ONE_STORE_SAMPLE_PACKAGE_NAME), "One Store", - packageName = ONE_STORE_SAMPLE_PACKAGE_NAME, icon = coreR.drawable.appupdater_ic_one_store, ), - StoreListItem( - Store.OPPO_APP_MARKET, - "Oppo App Market", - packageName = SAMPLE_PACKAGE_NAME, - icon = coreR.drawable.appupdater_ic_oppo_app_market, - ), ) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/IsDarkThemeSelected.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/IsDarkThemeSelected.kt index 9f566748..2e259e1d 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/IsDarkThemeSelected.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/IsDarkThemeSelected.kt @@ -2,7 +2,7 @@ package com.pouyaheydari.appupdater.compose.utils import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.runtime.Composable -import com.pouyaheydari.androidappupdater.store.model.Theme +import com.pouyaheydari.appupdater.core.model.Theme /** * Returns if the dialog should be shown in dark mode based on the user selected [theme] diff --git a/core/build.gradle.kts b/core/build.gradle.kts index fb8ae69d..ea88ae25 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -28,7 +28,7 @@ android { namespace = "com.pouyaheydari.appupdater.core" } dependencies { - implementation(libs.appcompat) + implementation(libs.androidx.appcompat) implementation(libs.coroutines) } diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/model/Theme.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/model/Theme.kt similarity index 62% rename from store/src/main/java/com/pouyaheydari/androidappupdater/store/model/Theme.kt rename to core/src/main/java/com/pouyaheydari/appupdater/core/model/Theme.kt index 1afc2f33..b256813f 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/model/Theme.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/model/Theme.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.androidappupdater.store.model +package com.pouyaheydari.appupdater.core.model /** * Specifies the theme of dialog diff --git a/directdownload/build.gradle.kts b/directdownload/build.gradle.kts index 61c40b3f..fa7f2788 100644 --- a/directdownload/build.gradle.kts +++ b/directdownload/build.gradle.kts @@ -29,17 +29,17 @@ android { dependencies { api(project(":core")) - implementation(libs.appcompat) + implementation(libs.androidx.appcompat) implementation(libs.coroutines) // testing testImplementation(libs.junit4) testImplementation(libs.mockito) testImplementation(libs.mockito.kotlin) - androidTestImplementation(libs.androidTestJUnit) - androidTestImplementation(libs.androidTestRules) - androidTestImplementation(libs.androidTestEspresso) - androidTestImplementation(libs.espresso.intents) + androidTestImplementation(libs.androidx.test.junit) + androidTestImplementation(libs.androidx.test.rules) + androidTestImplementation(libs.androidx.test.ui.espresso.core) + androidTestImplementation(libs.androidx.test.ui.espresso.intents) } afterEvaluate { diff --git a/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/data/model/DirectDownloadListItem.kt b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/data/model/DirectDownloadListItem.kt new file mode 100644 index 00000000..ff97b478 --- /dev/null +++ b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/data/model/DirectDownloadListItem.kt @@ -0,0 +1,28 @@ +package com.pouyaheydari.androidappupdater.directdownload.data.model + +import android.os.Parcel +import android.os.Parcelable + +data class DirectDownloadListItem(var title: String = "", var url: String = "") : Parcelable { + private constructor(parcel: Parcel) : this( + parcel.readString().orEmpty(), + parcel.readString().orEmpty(), + ) + + override fun describeContents(): Int = 0 + + override fun writeToParcel(dest: Parcel, flags: Int) { + dest.writeString(title) + dest.writeString(url) + } + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): DirectDownloadListItem { + return DirectDownloadListItem(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } +} diff --git a/gradle.properties b/gradle.properties index d7c010e7..9f2269bb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,7 @@ -org.gradle.jvmargs=-Xmx1536m +org.gradle.jvmargs=-Dfile.encoding\=UTF-8 -XX\:+UseParallelGC -Xmx10G kotlin.code.style=official +android.enableAppCompileTimeRClass=true +android.nonTransitiveRClass=true +android.nonFinalResIds=true android.useAndroidX=true org.gradle.parallel=true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a867d906..9c14a4be 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,6 +7,7 @@ targetSdkVersion = "34" agp = "8.3.0" kotlin = "1.9.22" appcompat = "1.6.1" +androidXCore = "1.12.0" constraintLayout = "2.1.4" junit4 = "4.13.2" androidTestJUnit = "1.1.5" @@ -26,16 +27,11 @@ mockitoKotlin = "5.2.1" agp = { module = "com.android.tools.build:gradle", version.ref = "agp" } kotlin-gradle-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } kotlin-reflect = { group = "org.jetbrains.kotlin", name = "kotlin-reflect", version.ref = "kotlin" } -appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } -constraintLayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintLayout" } -junit4 = { group = "junit", name = "junit", version.ref = "junit4" } -mockito = { group = "org.mockito", name = "mockito-core", version.ref = "mockito" } -mockito-kotlin = { group = "org.mockito.kotlin", name = "mockito-kotlin", version.ref = "mockitoKotlin" } -espresso-intents = { group = "androidx.test.espresso", name = "espresso-intents", version.ref = "androidTestEspresso" } -androidTestJUnit = { group = "androidx.test.ext", name = "junit", version.ref = "androidTestJUnit" } -androidTestRules = { group = "androidx.test", name = "rules", version.ref = "androidTestRules" } -androidTestEspresso = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "androidTestEspresso" } -recyclerView = { group = "androidx.recyclerview", name = "recyclerview", version.ref = "recyclerView" } +androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } +androidx-constraintLayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintLayout" } +androidx-recyclerView = { group = "androidx.recyclerview", name = "recyclerview", version.ref = "recyclerView" } +androidx-core = { group = "androidx.core", name = "core", version.ref = "androidXCore" } +androidx-fragment = { group = "androidx.fragment", name = "fragment-ktx", version.ref = "fragment" } androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "androidxComposeBom" } androidx-compose-foundation = { group = "androidx.compose.foundation", name = "foundation" } androidx-compose-viewModel = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "lifecycle" } @@ -43,5 +39,11 @@ androidx-compose-material = { group = "androidx.compose.material3", name = "mate androidx-compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } androidx-compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } androidx-compose-activity = { group = "androidx.activity", name = "activity-compose", version.ref = "composeActivity" } +junit4 = { group = "junit", name = "junit", version.ref = "junit4" } +mockito = { group = "org.mockito", name = "mockito-core", version.ref = "mockito" } +mockito-kotlin = { group = "org.mockito.kotlin", name = "mockito-kotlin", version.ref = "mockitoKotlin" } +androidx-test-ui-espresso-intents = { group = "androidx.test.espresso", name = "espresso-intents", version.ref = "androidTestEspresso" } +androidx-test-junit = { group = "androidx.test.ext", name = "junit", version.ref = "androidTestJUnit" } +androidx-test-rules = { group = "androidx.test", name = "rules", version.ref = "androidTestRules" } +androidx-test-ui-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "androidTestEspresso" } coroutines = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "coroutines" } -androidx-fragment = { group = "androidx.fragment", name = "fragment-ktx", version.ref = "fragment" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 1af9e093..d3ca171f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip -networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/store/build.gradle.kts b/store/build.gradle.kts index 8c9522d4..46803c5f 100644 --- a/store/build.gradle.kts +++ b/store/build.gradle.kts @@ -35,15 +35,16 @@ dependencies { api(project(":core")) implementation(libs.kotlin.reflect) + implementation(libs.androidx.core) // testing testImplementation(libs.junit4) testImplementation(libs.mockito) testImplementation(libs.mockito.kotlin) - androidTestImplementation(libs.androidTestJUnit) - androidTestImplementation(libs.androidTestRules) - androidTestImplementation(libs.androidTestEspresso) - androidTestImplementation(libs.espresso.intents) + androidTestImplementation(libs.androidx.test.junit) + androidTestImplementation(libs.androidx.test.rules) + androidTestImplementation(libs.androidx.test.ui.espresso.core) + androidTestImplementation(libs.androidx.test.ui.espresso.intents) } afterEvaluate { diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/AmazonAppStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/AmazonAppStoreTest.kt index f7cc7654..2c3db9fe 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/AmazonAppStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/AmazonAppStoreTest.kt @@ -6,9 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry +import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel -import com.pouyaheydari.androidappupdater.store.model.Store import com.pouyaheydari.androidappupdater.store.stores.AMAZON_APP_STORE_URL import com.pouyaheydari.androidappupdater.store.stores.AMAZON_PACKAGE import org.junit.Rule @@ -25,7 +25,7 @@ class AmazonAppStoreTest { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName val url = "https://pouyaheydari.com" - val storeModel = ShowStoreModel(packageName, Store.AMAZON_APP_STORE, url) + val storeModel = ShowStoreModel(StoreFactory.getAmazonAppStore(packageName), url) showAppInSelectedStore(appContext, storeModel) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/AptoideTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/AptoideTest.kt index 68a58c0f..00c64940 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/AptoideTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/AptoideTest.kt @@ -6,9 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry +import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel -import com.pouyaheydari.androidappupdater.store.model.Store import com.pouyaheydari.androidappupdater.store.stores.APTOIDE_PACKAGE import com.pouyaheydari.androidappupdater.store.stores.APTOIDE_URL import org.junit.Rule @@ -25,7 +25,7 @@ internal class AptoideTest { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName val url = "https://pouyaheydari.com" - val storeModel = ShowStoreModel(packageName, Store.APTOIDE, url) + val storeModel = ShowStoreModel(StoreFactory.getAptoideStore(packageName), url) showAppInSelectedStore(appContext, storeModel) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/CafeBazaarStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/CafeBazaarStoreTest.kt index 5c65acf1..c6a9881a 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/CafeBazaarStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/CafeBazaarStoreTest.kt @@ -6,9 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry +import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel -import com.pouyaheydari.androidappupdater.store.model.Store import com.pouyaheydari.androidappupdater.store.stores.BAZAAR_PACKAGE import com.pouyaheydari.androidappupdater.store.stores.BAZAAR_URL import org.junit.Rule @@ -25,7 +25,7 @@ internal class CafeBazaarStoreTest { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName val url = "https://pouyaheydari.com" - val storeModel = ShowStoreModel(packageName, Store.CAFE_BAZAAR, url) + val storeModel = ShowStoreModel(StoreFactory.getCafeBazaarStore(packageName), url) showAppInSelectedStore(appContext, storeModel) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/FDroidTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/FDroidTest.kt index 017c3c1b..8ea9e6c6 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/FDroidTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/FDroidTest.kt @@ -6,9 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry +import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel -import com.pouyaheydari.androidappupdater.store.model.Store import com.pouyaheydari.androidappupdater.store.stores.FDROID_PACKAGE import com.pouyaheydari.androidappupdater.store.stores.FDROID_URL import org.junit.Rule @@ -25,7 +25,7 @@ internal class FDroidTest { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName val url = "https://pouyaheydari.com" - val storeModel = ShowStoreModel(packageName, Store.FDROID, url) + val storeModel = ShowStoreModel(StoreFactory.getFdroidStore(packageName), url) showAppInSelectedStore(appContext, storeModel) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/GooglePlayStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/GooglePlayStoreTest.kt index 4b43998c..d016d76e 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/GooglePlayStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/GooglePlayStoreTest.kt @@ -6,9 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry +import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel -import com.pouyaheydari.androidappupdater.store.model.Store import com.pouyaheydari.androidappupdater.store.stores.PLAY_PACKAGE import com.pouyaheydari.androidappupdater.store.stores.PLAY_URL import org.junit.Rule @@ -25,7 +25,7 @@ internal class GooglePlayStoreTest { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName val url = "https://pouyaheydari.com" - val storeModel = ShowStoreModel(packageName, Store.GOOGLE_PLAY, url) + val storeModel = ShowStoreModel(StoreFactory.getGooglePlayStore(packageName), url) showAppInSelectedStore(appContext, storeModel) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/HuaweiAppGalleryTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/HuaweiAppGalleryTest.kt index 41523bed..0b4f761b 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/HuaweiAppGalleryTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/HuaweiAppGalleryTest.kt @@ -6,9 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry +import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel -import com.pouyaheydari.androidappupdater.store.model.Store import com.pouyaheydari.androidappupdater.store.stores.HUAWEI_APP_GALLERY_PACKAGE import com.pouyaheydari.androidappupdater.store.stores.HUAWEI_APP_GALLERY_URL import org.junit.Rule @@ -25,7 +25,7 @@ internal class HuaweiAppGalleryTest { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName val url = "https://pouyaheydari.com" - val storeModel = ShowStoreModel(packageName, Store.HUAWEI_APP_GALLERY, url) + val storeModel = ShowStoreModel(StoreFactory.getHuaweiAppGalleryStore(packageName), url) showAppInSelectedStore(appContext, storeModel) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/LenovoAppCenterTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/LenovoAppCenterTest.kt index d10eac4c..9e712a69 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/LenovoAppCenterTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/LenovoAppCenterTest.kt @@ -6,9 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry +import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel -import com.pouyaheydari.androidappupdater.store.model.Store import com.pouyaheydari.androidappupdater.store.stores.LENOVO_APP_CENTER_URL import org.junit.Rule import org.junit.Test @@ -24,7 +24,7 @@ internal class LenovoAppCenterTest { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName val url = "https://pouyaheydari.com" - val storeModel = ShowStoreModel(packageName, Store.LENOVO_APP_CENTER, url) + val storeModel = ShowStoreModel(StoreFactory.getLenovoAppCenterStore(packageName), url) showAppInSelectedStore(appContext, storeModel) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/MiGetAppStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/MiGetAppStoreTest.kt index 245aa827..2257087a 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/MiGetAppStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/MiGetAppStoreTest.kt @@ -6,9 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry +import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel -import com.pouyaheydari.androidappupdater.store.model.Store import com.pouyaheydari.androidappupdater.store.stores.MI_APP_STORE_URL import org.junit.Rule import org.junit.Test @@ -24,7 +24,7 @@ internal class MiGetAppStoreTest { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName val url = "https://pouyaheydari.com" - val storeModel = ShowStoreModel(packageName, Store.MI_GET_APP_STORE, url) + val storeModel = ShowStoreModel(StoreFactory.getMiStore(packageName), url) showAppInSelectedStore(appContext, storeModel) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/MyketStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/MyketStoreTest.kt index 91ba33f8..ceb77132 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/MyketStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/MyketStoreTest.kt @@ -6,9 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry +import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel -import com.pouyaheydari.androidappupdater.store.model.Store import com.pouyaheydari.androidappupdater.store.stores.MYKET_PACKAGE import com.pouyaheydari.androidappupdater.store.stores.MYKET_URL import org.junit.Rule @@ -25,7 +25,7 @@ internal class MyketStoreTest { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName val url = "https://pouyaheydari.com" - val storeModel = ShowStoreModel(packageName, Store.MYKET, url) + val storeModel = ShowStoreModel(StoreFactory.getMyketStore(packageName), url) showAppInSelectedStore(appContext, storeModel) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/NineAppsTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/NineAppsTest.kt index 9743768e..18871429 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/NineAppsTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/NineAppsTest.kt @@ -6,9 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry +import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel -import com.pouyaheydari.androidappupdater.store.model.Store import com.pouyaheydari.androidappupdater.store.stores.NINE_APPS_PACKAGE import com.pouyaheydari.androidappupdater.store.stores.NINE_APPS_STORE_URL import org.junit.Rule @@ -25,7 +25,7 @@ internal class NineAppsTest { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName val url = "https://pouyaheydari.com" - val storeModel = ShowStoreModel(packageName, Store.NINE_APPS_STORE, url) + val storeModel = ShowStoreModel(StoreFactory.getNineAppsStore(packageName), url) showAppInSelectedStore(appContext, storeModel) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/OneStoreAppMarketTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/OneStoreAppMarketTest.kt index e706e55c..68d9dead 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/OneStoreAppMarketTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/OneStoreAppMarketTest.kt @@ -6,9 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry +import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel -import com.pouyaheydari.androidappupdater.store.model.Store import com.pouyaheydari.androidappupdater.store.stores.ONE_STORE_APP_MARKET_URL import org.junit.Rule import org.junit.Test @@ -24,7 +24,7 @@ internal class OneStoreAppMarketTest { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName val url = "https://pouyaheydari.com" - val storeModel = ShowStoreModel(packageName, Store.ONE_STORE_APP_MARKET, url) + val storeModel = ShowStoreModel(StoreFactory.getOneStore(packageName), url) showAppInSelectedStore(appContext, storeModel) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/OppoAppMarketTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/OppoAppMarketTest.kt index 21c711e4..7775cc9a 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/OppoAppMarketTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/OppoAppMarketTest.kt @@ -6,9 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry +import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel -import com.pouyaheydari.androidappupdater.store.model.Store import com.pouyaheydari.androidappupdater.store.stores.OPPO_APP_MARKET_URL import com.pouyaheydari.androidappupdater.store.stores.OPPO_PACKAGE import org.junit.Rule @@ -25,7 +25,7 @@ internal class OppoAppMarketTest { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName val url = "https://pouyaheydari.com" - val storeModel = ShowStoreModel(packageName, Store.OPPO_APP_MARKET, url) + val storeModel = ShowStoreModel(StoreFactory.getOppoAppMarketStore(packageName), url) showAppInSelectedStore(appContext, storeModel) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/SamsungGalaxyStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/SamsungGalaxyStoreTest.kt index f04e238b..ad485de8 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/SamsungGalaxyStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/SamsungGalaxyStoreTest.kt @@ -6,9 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry +import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel -import com.pouyaheydari.androidappupdater.store.model.Store import com.pouyaheydari.androidappupdater.store.stores.SAMSUNG_GALAXY_STORE_URL import org.junit.Rule import org.junit.Test @@ -24,7 +24,7 @@ internal class SamsungGalaxyStoreTest { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName val url = "https://pouyaheydari.com" - val storeModel = ShowStoreModel(packageName, Store.SAMSUNG_GALAXY_STORE, url) + val storeModel = ShowStoreModel(StoreFactory.getSamsungGalaxyStore(packageName), url) showAppInSelectedStore(appContext, storeModel) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/TencentStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/TencentStoreTest.kt index 3126e4ba..06e3b135 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/TencentStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/TencentStoreTest.kt @@ -6,9 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry +import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel -import com.pouyaheydari.androidappupdater.store.model.Store import com.pouyaheydari.androidappupdater.store.stores.TENCENT_APP_STORE_URL import org.junit.Rule import org.junit.Test @@ -24,7 +24,7 @@ internal class TencentStoreTest { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName val url = "https://pouyaheydari.com" - val tencentStoreModel = ShowStoreModel(packageName, Store.TENCENT_APPS_STORE, url) + val tencentStoreModel = ShowStoreModel(StoreFactory.getTencentAppStore(packageName), url) showAppInSelectedStore(appContext, tencentStoreModel) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/VAppStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/VAppStoreTest.kt index 214511ac..e8325713 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/VAppStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/VAppStoreTest.kt @@ -6,9 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry +import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel -import com.pouyaheydari.androidappupdater.store.model.Store import com.pouyaheydari.androidappupdater.store.stores.V_APP_STORE_URL import org.junit.Rule import org.junit.Test @@ -24,7 +24,7 @@ internal class VAppStoreTest { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName val url = "https://pouyaheydari.com" - val storeModel = ShowStoreModel(packageName, Store.V_APP_STORE, url) + val storeModel = ShowStoreModel(StoreFactory.getVAppStore(packageName), url) showAppInSelectedStore(appContext, storeModel) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/ZTEAppCenterTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/ZTEAppCenterTest.kt index 8f246fe9..4adcdde6 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/ZTEAppCenterTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/ZTEAppCenterTest.kt @@ -6,9 +6,9 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry +import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel -import com.pouyaheydari.androidappupdater.store.model.Store import com.pouyaheydari.androidappupdater.store.stores.ZTE_APP_CENTER_URL import org.junit.Rule import org.junit.Test @@ -24,7 +24,7 @@ internal class ZTEAppCenterTest { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName val url = "https://pouyaheydari.com" - val storeModel = ShowStoreModel(packageName, Store.ZTE_APP_CENTER, url) + val storeModel = ShowStoreModel(StoreFactory.getZTEStore(packageName), url) showAppInSelectedStore(appContext, storeModel) diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/ShowStoreModel.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/ShowStoreModel.kt new file mode 100644 index 00000000..12859dba --- /dev/null +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/ShowStoreModel.kt @@ -0,0 +1,10 @@ +package com.pouyaheydari.androidappupdater.store + +import com.pouyaheydari.androidappupdater.store.domain.StoreFactory +import com.pouyaheydari.androidappupdater.store.stores.AppStore + +data class ShowStoreModel( + val store: AppStore = StoreFactory.getGooglePlayStore(""), + val fallbackUrl: String = "", + val errorCallBack: () -> Unit = {}, +) diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/StoreListUtil.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/StoreListUtil.kt deleted file mode 100644 index 525b915f..00000000 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/StoreListUtil.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.pouyaheydari.androidappupdater.store - -import com.pouyaheydari.androidappupdater.store.model.StoreListItem - -fun shouldShowStoresDivider(directDownloadList: List, storeList: List): Boolean = - directDownloadList.isNotEmpty() && storeList.isNotEmpty() diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreFactory.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreFactory.kt new file mode 100644 index 00000000..d812e0da --- /dev/null +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreFactory.kt @@ -0,0 +1,40 @@ +package com.pouyaheydari.androidappupdater.store.domain + +import com.pouyaheydari.androidappupdater.store.stores.AmazonAppStore +import com.pouyaheydari.androidappupdater.store.stores.Aptoide +import com.pouyaheydari.androidappupdater.store.stores.CafeBazaarStore +import com.pouyaheydari.androidappupdater.store.stores.FDroid +import com.pouyaheydari.androidappupdater.store.stores.GooglePlayStore +import com.pouyaheydari.androidappupdater.store.stores.HuaweiAppGallery +import com.pouyaheydari.androidappupdater.store.stores.LenovoAppCenter +import com.pouyaheydari.androidappupdater.store.stores.MiGetAppStore +import com.pouyaheydari.androidappupdater.store.stores.MyketStore +import com.pouyaheydari.androidappupdater.store.stores.NineApps +import com.pouyaheydari.androidappupdater.store.stores.OneStoreAppMarket +import com.pouyaheydari.androidappupdater.store.stores.OppoAppMarket +import com.pouyaheydari.androidappupdater.store.stores.SamsungGalaxyStore +import com.pouyaheydari.androidappupdater.store.stores.TencentAppStore +import com.pouyaheydari.androidappupdater.store.stores.VAppStore +import com.pouyaheydari.androidappupdater.store.stores.ZTEAppCenter + +/** + * Enum class to select type of market + */ +object StoreFactory { + fun getGooglePlayStore(packageName: String) = GooglePlayStore(packageName) + fun getAmazonAppStore(packageName: String) = AmazonAppStore(packageName) + fun getAptoideStore(packageName: String) = Aptoide(packageName) + fun getCafeBazaarStore(packageName: String) = CafeBazaarStore(packageName) + fun getFdroidStore(packageName: String) = FDroid(packageName) + fun getHuaweiAppGalleryStore(packageName: String) = HuaweiAppGallery(packageName) + fun getLenovoAppCenterStore(packageName: String) = LenovoAppCenter(packageName) + fun getMiStore(packageName: String) = MiGetAppStore(packageName) + fun getMyketStore(packageName: String) = MyketStore(packageName) + fun getNineAppsStore(packageName: String) = NineApps(packageName) + fun getOneStore(packageName: String) = OneStoreAppMarket(packageName) + fun getOppoAppMarketStore(packageName: String) = OppoAppMarket(packageName) + fun getSamsungGalaxyStore(packageName: String) = SamsungGalaxyStore(packageName) + fun getTencentAppStore(packageName: String) = TencentAppStore(packageName) + fun getVAppStore(packageName: String) = VAppStore(packageName) + fun getZTEStore(packageName: String) = ZTEAppCenter(packageName) +} diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/model/StoreListItem.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreListItem.kt similarity index 66% rename from store/src/main/java/com/pouyaheydari/androidappupdater/store/model/StoreListItem.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreListItem.kt index 06b73fa3..bdbf1aaa 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/model/StoreListItem.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreListItem.kt @@ -1,38 +1,35 @@ -package com.pouyaheydari.androidappupdater.store.model +package com.pouyaheydari.androidappupdater.store.domain import android.os.Parcel import android.os.Parcelable +import androidx.core.os.ParcelCompat +import com.pouyaheydari.androidappupdater.store.stores.AppStore import com.pouyaheydari.appupdater.core.R as coreR /** * The model that we are using for list of stores */ data class StoreListItem( - var store: Store = Store.DIRECT_URL, + var store: AppStore = StoreFactory.getGooglePlayStore(""), var title: String = "", var icon: Int = coreR.drawable.appupdater_ic_cloud, var url: String = "", - var packageName: String = "", ) : Parcelable { - constructor(parcel: Parcel) : this( - Store.entries[parcel.readInt()], + private constructor(parcel: Parcel) : this( + ParcelCompat.readParcelable(parcel, AppStore::class.java.classLoader, AppStore::class.java)!!, parcel.readString().orEmpty(), parcel.readInt(), parcel.readString().orEmpty(), - parcel.readString().orEmpty(), ) override fun writeToParcel(parcel: Parcel, flags: Int) { - parcel.writeInt(store.ordinal) + parcel.writeParcelable(store, flags) parcel.writeString(title) parcel.writeInt(icon) parcel.writeString(url) - parcel.writeString(packageName) } - override fun describeContents(): Int { - return 0 - } + override fun describeContents(): Int = 0 companion object CREATOR : Parcelable.Creator { override fun createFromParcel(parcel: Parcel): StoreListItem { diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreManager.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreManager.kt index 2d2473da..7640f239 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreManager.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreManager.kt @@ -6,13 +6,13 @@ import android.content.Intent import android.content.Intent.FLAG_ACTIVITY_NEW_TASK import android.net.Uri import android.util.Log -import com.pouyaheydari.androidappupdater.store.model.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.ShowStoreModel import com.pouyaheydari.appupdater.core.utils.ANDROID_APP_UPDATER_DEBUG_TAG import java.util.Locale fun showAppInSelectedStore(context: Context?, storeModel: ShowStoreModel) { try { - val intent = getStoreIntent(storeModel) + val intent = storeModel.store.getIntent() context?.startActivity(intent) } catch (e: ActivityNotFoundException) { e.printStackTrace() @@ -20,14 +20,11 @@ fun showAppInSelectedStore(context: Context?, storeModel: ShowStoreModel) { } } -private fun getStoreIntent(storeModel: ShowStoreModel) = - storeModel.store.provider?.kotlin?.objectInstance?.getIntent(storeModel.packageName) - private fun showFallbackUrlOrCallErrorFallback(storeModel: ShowStoreModel, context: Context?) { if (storeModel.fallbackUrl.isNotEmpty()) { showFallbackUrlInDefaultBrowser(context, storeModel) } else { - handleError(storeModel.store.name, storeModel.errorCallBack) + handleError(storeModel.store.javaClass.name, storeModel.errorCallBack) } } @@ -39,7 +36,7 @@ private fun showFallbackUrlInDefaultBrowser(context: Context?, storeModel: ShowS context?.startActivity(webViewIntent) } catch (e: ActivityNotFoundException) { e.printStackTrace() - handleError(storeModel.store.name, storeModel.errorCallBack) + handleError(storeModel.store.javaClass.name, storeModel.errorCallBack) } } diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/model/ShowStoreModel.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/model/ShowStoreModel.kt deleted file mode 100644 index 45051566..00000000 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/model/ShowStoreModel.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.pouyaheydari.androidappupdater.store.model - -data class ShowStoreModel( - val packageName: String = "", - val store: Store = Store.GOOGLE_PLAY, - val fallbackUrl: String = "", - val errorCallBack: () -> Unit = {}, -) diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/model/Store.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/model/Store.kt deleted file mode 100644 index ff69b8a1..00000000 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/model/Store.kt +++ /dev/null @@ -1,42 +0,0 @@ -package com.pouyaheydari.androidappupdater.store.model - -import com.pouyaheydari.androidappupdater.store.stores.AmazonAppStore -import com.pouyaheydari.androidappupdater.store.stores.AppStore -import com.pouyaheydari.androidappupdater.store.stores.Aptoide -import com.pouyaheydari.androidappupdater.store.stores.CafeBazaarStore -import com.pouyaheydari.androidappupdater.store.stores.FDroid -import com.pouyaheydari.androidappupdater.store.stores.GooglePlayStore -import com.pouyaheydari.androidappupdater.store.stores.HuaweiAppGallery -import com.pouyaheydari.androidappupdater.store.stores.LenovoAppCenter -import com.pouyaheydari.androidappupdater.store.stores.MiGetAppStore -import com.pouyaheydari.androidappupdater.store.stores.MyketStore -import com.pouyaheydari.androidappupdater.store.stores.NineApps -import com.pouyaheydari.androidappupdater.store.stores.OneStoreAppMarket -import com.pouyaheydari.androidappupdater.store.stores.OppoAppMarket -import com.pouyaheydari.androidappupdater.store.stores.SamsungGalaxyStore -import com.pouyaheydari.androidappupdater.store.stores.TencentAppStore -import com.pouyaheydari.androidappupdater.store.stores.VAppStore -import com.pouyaheydari.androidappupdater.store.stores.ZTEAppCenter - -/** - * Enum class to select type of market - */ -enum class Store(val provider: Class?) { - DIRECT_URL(null), - GOOGLE_PLAY(GooglePlayStore::class.java), - CAFE_BAZAAR(CafeBazaarStore::class.java), - MYKET(MyketStore::class.java), - HUAWEI_APP_GALLERY(HuaweiAppGallery::class.java), - SAMSUNG_GALAXY_STORE(SamsungGalaxyStore::class.java), - AMAZON_APP_STORE(AmazonAppStore::class.java), - APTOIDE(Aptoide::class.java), - FDROID(FDroid::class.java), - MI_GET_APP_STORE(MiGetAppStore::class.java), - ONE_STORE_APP_MARKET(OneStoreAppMarket::class.java), - OPPO_APP_MARKET(OppoAppMarket::class.java), - V_APP_STORE(VAppStore::class.java), - NINE_APPS_STORE(NineApps::class.java), - TENCENT_APPS_STORE(TencentAppStore::class.java), - ZTE_APP_CENTER(ZTEAppCenter::class.java), - LENOVO_APP_CENTER(LenovoAppCenter::class.java), -} diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/AmazonAppStore.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/AmazonAppStore.kt index 1de8bde8..8b8338c1 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/AmazonAppStore.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/AmazonAppStore.kt @@ -1,5 +1,7 @@ package com.pouyaheydari.androidappupdater.store.stores +import android.os.Parcel +import android.os.Parcelable import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider const val AMAZON_APP_STORE_URL = "amzn://apps/android?p=" @@ -8,10 +10,28 @@ const val AMAZON_PACKAGE = "com.amazon.venezia" /** * Opens application's page in [Amazon App Store](https://www.amazon.com/gp/mas/get/amazonapp) */ -object AmazonAppStore : AppStore { - override fun getIntent(packageName: String) = +data class AmazonAppStore(val packageName: String) : AppStore { + private constructor(parcel: Parcel) : this(parcel.readString().orEmpty()) + + override fun getIntent() = StoreIntentProvider .Builder("$AMAZON_APP_STORE_URL$packageName") .withPackage(AMAZON_PACKAGE) .build() + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeString(packageName) + } + + override fun describeContents() = 0 + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): AmazonAppStore { + return AmazonAppStore(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } } diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/AppStore.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/AppStore.kt index d27fe973..676f0661 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/AppStore.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/AppStore.kt @@ -1,7 +1,8 @@ package com.pouyaheydari.androidappupdater.store.stores import android.content.Intent +import android.os.Parcelable -interface AppStore { - fun getIntent(packageName: String): Intent +sealed interface AppStore : Parcelable { + fun getIntent(): Intent } diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/Aptoide.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/Aptoide.kt index 236ce003..c8662a06 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/Aptoide.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/Aptoide.kt @@ -1,16 +1,36 @@ package com.pouyaheydari.androidappupdater.store.stores +import android.os.Parcel +import android.os.Parcelable import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider -const val APTOIDE_URL = "aptoideinstall://package=" -const val APTOIDE_PACKAGE = "cm.aptoide.pt" +internal const val APTOIDE_URL = "aptoideinstall://package=" +internal const val APTOIDE_PACKAGE = "cm.aptoide.pt" /** * Opens application's page in [Aptoide App Store](https://en.aptoide.com/) */ -object Aptoide : AppStore { - override fun getIntent(packageName: String) = StoreIntentProvider +data class Aptoide(val packageName: String) : AppStore { + private constructor(parcel: Parcel) : this(parcel.readString().orEmpty()) + + override fun getIntent() = StoreIntentProvider .Builder("$APTOIDE_URL$packageName") .withPackage(APTOIDE_PACKAGE) .build() + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeString(packageName) + } + + override fun describeContents() = 0 + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): Aptoide { + return Aptoide(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } } diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/CafeBazaarStore.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/CafeBazaarStore.kt index 3dc1ddb1..6d987fb7 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/CafeBazaarStore.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/CafeBazaarStore.kt @@ -1,16 +1,36 @@ package com.pouyaheydari.androidappupdater.store.stores +import android.os.Parcel +import android.os.Parcelable import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider -const val BAZAAR_URL = "bazaar://details?id=" -const val BAZAAR_PACKAGE = "com.farsitel.bazaar" +internal const val BAZAAR_URL = "bazaar://details?id=" +internal const val BAZAAR_PACKAGE = "com.farsitel.bazaar" /** * Opens application's page in [CafeBazaar App Store](https://cafebazaar.ir) */ -object CafeBazaarStore : AppStore { - override fun getIntent(packageName: String) = StoreIntentProvider +data class CafeBazaarStore(val packageName: String) : AppStore { + constructor(parcel: Parcel) : this(parcel.readString().orEmpty()) + + override fun getIntent() = StoreIntentProvider .Builder("$BAZAAR_URL$packageName") .withPackage(BAZAAR_PACKAGE) .build() + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeString(packageName) + } + + override fun describeContents() = 0 + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): CafeBazaarStore { + return CafeBazaarStore(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } } diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/FDroid.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/FDroid.kt index bde44692..a70c9482 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/FDroid.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/FDroid.kt @@ -1,16 +1,36 @@ package com.pouyaheydari.androidappupdater.store.stores +import android.os.Parcel +import android.os.Parcelable import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider -const val FDROID_URL = "fdroid.app://details?id=" -const val FDROID_PACKAGE = "org.fdroid.fdroid" +internal const val FDROID_URL = "fdroid.app://details?id=" +internal const val FDROID_PACKAGE = "org.fdroid.fdroid" /** * Opens application's page in [F-Droid App Store](https://f-droid.org/) */ -object FDroid : AppStore { - override fun getIntent(packageName: String) = StoreIntentProvider +data class FDroid(val packageName: String) : AppStore { + constructor(parcel: Parcel) : this(parcel.readString().orEmpty()) + + override fun getIntent() = StoreIntentProvider .Builder("$FDROID_URL$packageName") .withPackage(FDROID_PACKAGE) .build() + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeString(packageName) + } + + override fun describeContents() = 0 + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): FDroid { + return FDroid(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } } diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/GooglePlayStore.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/GooglePlayStore.kt index 124a0b7f..11711948 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/GooglePlayStore.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/GooglePlayStore.kt @@ -1,16 +1,36 @@ package com.pouyaheydari.androidappupdater.store.stores +import android.os.Parcel +import android.os.Parcelable import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider -const val PLAY_URL = "market://details?id=" -const val PLAY_PACKAGE = "com.android.vending" +internal const val PLAY_URL = "market://details?id=" +internal const val PLAY_PACKAGE = "com.android.vending" /** * Opens application's page in [GooglePlay Store](https://play.google.com) */ -object GooglePlayStore : AppStore { - override fun getIntent(packageName: String) = StoreIntentProvider +data class GooglePlayStore(val packageName: String) : AppStore { + private constructor(parcel: Parcel) : this(parcel.readString().orEmpty()) + + override fun getIntent() = StoreIntentProvider .Builder("$PLAY_URL$packageName") .withPackage(PLAY_PACKAGE) .build() + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeString(packageName) + } + + override fun describeContents() = 0 + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): GooglePlayStore { + return GooglePlayStore(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } } diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/HuaweiAppGallery.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/HuaweiAppGallery.kt index 0bf717c1..57a7330a 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/HuaweiAppGallery.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/HuaweiAppGallery.kt @@ -1,16 +1,36 @@ package com.pouyaheydari.androidappupdater.store.stores +import android.os.Parcel +import android.os.Parcelable import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider -const val HUAWEI_APP_GALLERY_URL = "appmarket://details?id=" -const val HUAWEI_APP_GALLERY_PACKAGE = "com.huawei.appmarket" +internal const val HUAWEI_APP_GALLERY_URL = "appmarket://details?id=" +internal const val HUAWEI_APP_GALLERY_PACKAGE = "com.huawei.appmarket" /** * Opens application's page in [Huawei App Gallery](https://appgallery.huawei.com/) */ -object HuaweiAppGallery : AppStore { - override fun getIntent(packageName: String) = StoreIntentProvider +data class HuaweiAppGallery(val packageName: String) : AppStore { + constructor(parcel: Parcel) : this(parcel.readString().orEmpty()) + + override fun getIntent() = StoreIntentProvider .Builder("$HUAWEI_APP_GALLERY_URL$packageName") .withPackage(HUAWEI_APP_GALLERY_PACKAGE) .build() + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeString(packageName) + } + + override fun describeContents() = 0 + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): HuaweiAppGallery { + return HuaweiAppGallery(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } } diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/LenovoAppCenter.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/LenovoAppCenter.kt index 814a4ad0..6f9f889c 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/LenovoAppCenter.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/LenovoAppCenter.kt @@ -1,14 +1,34 @@ package com.pouyaheydari.androidappupdater.store.stores +import android.os.Parcel +import android.os.Parcelable import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider -const val LENOVO_APP_CENTER_URL = "leapp://ptn/appinfo.do?pn=" +internal const val LENOVO_APP_CENTER_URL = "leapp://ptn/appinfo.do?pn=" /** * Opens application's page in [Lenovo App Store](https://www.lenovomm.com/) */ -object LenovoAppCenter : AppStore { - override fun getIntent(packageName: String) = StoreIntentProvider +data class LenovoAppCenter(val packageName: String) : AppStore { + constructor(parcel: Parcel) : this(parcel.readString().orEmpty()) + + override fun getIntent() = StoreIntentProvider .Builder("$LENOVO_APP_CENTER_URL$packageName") .build() + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeString(packageName) + } + + override fun describeContents() = 0 + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): LenovoAppCenter { + return LenovoAppCenter(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } } diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/MiGetAppStore.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/MiGetAppStore.kt index 61098469..b34638d9 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/MiGetAppStore.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/MiGetAppStore.kt @@ -1,15 +1,35 @@ package com.pouyaheydari.androidappupdater.store.stores +import android.os.Parcel +import android.os.Parcelable import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider -const val MI_APP_STORE_URL = "mimarket://details?id=" +internal const val MI_APP_STORE_URL = "mimarket://details?id=" /** * Opens application's page in [Xiaomi GetApp store](https://global.app.mi.com/) */ -object MiGetAppStore : AppStore { - override fun getIntent(packageName: String) = +data class MiGetAppStore(val packageName: String) : AppStore { + constructor(parcel: Parcel) : this(parcel.readString().orEmpty()) + + override fun getIntent() = StoreIntentProvider .Builder("$MI_APP_STORE_URL$packageName") .build() + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeString(packageName) + } + + override fun describeContents() = 0 + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): MiGetAppStore { + return MiGetAppStore(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } } diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/MyketStore.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/MyketStore.kt index 2ea44c71..c85faf07 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/MyketStore.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/MyketStore.kt @@ -1,16 +1,36 @@ package com.pouyaheydari.androidappupdater.store.stores +import android.os.Parcel +import android.os.Parcelable import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider -const val MYKET_URL = "myket://details?id=" -const val MYKET_PACKAGE = "ir.mservices.market" +internal const val MYKET_URL = "myket://details?id=" +internal const val MYKET_PACKAGE = "ir.mservices.market" /** * Opens application's page in [Myket Store](https://myket.ir/) */ -object MyketStore : AppStore { - override fun getIntent(packageName: String) = StoreIntentProvider +data class MyketStore(val packageName: String) : AppStore { + constructor(parcel: Parcel) : this(parcel.readString().orEmpty()) + + override fun getIntent() = StoreIntentProvider .Builder("$MYKET_URL$packageName") .withPackage(MYKET_PACKAGE) .build() + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeString(packageName) + } + + override fun describeContents() = 0 + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): MyketStore { + return MyketStore(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } } diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/NineApps.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/NineApps.kt index c53fac8c..6ce096c8 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/NineApps.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/NineApps.kt @@ -1,16 +1,36 @@ package com.pouyaheydari.androidappupdater.store.stores +import android.os.Parcel +import android.os.Parcelable import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider -const val NINE_APPS_STORE_URL = "nineapps://AppDetail?id=" -const val NINE_APPS_PACKAGE = "com.gamefun.apk2u" +internal const val NINE_APPS_STORE_URL = "nineapps://AppDetail?id=" +internal const val NINE_APPS_PACKAGE = "com.gamefun.apk2u" /** * Opens application's page in [9-Apps](https://www.9apps.com/) */ -object NineApps : AppStore { - override fun getIntent(packageName: String) = StoreIntentProvider +data class NineApps(val packageName: String) : AppStore { + constructor(parcel: Parcel) : this(parcel.readString().orEmpty()) + + override fun getIntent() = StoreIntentProvider .Builder("$NINE_APPS_STORE_URL$packageName") .withPackage(NINE_APPS_PACKAGE) .build() + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeString(packageName) + } + + override fun describeContents() = 0 + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): NineApps { + return NineApps(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } } diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/OneStoreAppMarket.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/OneStoreAppMarket.kt index 83dfe206..43456832 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/OneStoreAppMarket.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/OneStoreAppMarket.kt @@ -1,15 +1,35 @@ package com.pouyaheydari.androidappupdater.store.stores +import android.os.Parcel +import android.os.Parcelable import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider -const val ONE_STORE_APP_MARKET_URL = "onestore://common/product/" +internal const val ONE_STORE_APP_MARKET_URL = "onestore://common/product/" /** * Opens application's page in [OneStore App Market](https://m.onestore.co.kr/mobilepoc/main/main.omp) */ -object OneStoreAppMarket : AppStore { - override fun getIntent(packageName: String) = +data class OneStoreAppMarket(val packageName: String) : AppStore { + constructor(parcel: Parcel) : this(parcel.readString().orEmpty()) + + override fun getIntent() = StoreIntentProvider .Builder("$ONE_STORE_APP_MARKET_URL$packageName") .build() + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeString(packageName) + } + + override fun describeContents() = 0 + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): OneStoreAppMarket { + return OneStoreAppMarket(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } } diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/OppoAppMarket.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/OppoAppMarket.kt index 928d5a15..8d59dbae 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/OppoAppMarket.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/OppoAppMarket.kt @@ -1,16 +1,36 @@ package com.pouyaheydari.androidappupdater.store.stores +import android.os.Parcel +import android.os.Parcelable import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider -const val OPPO_APP_MARKET_URL = "market://details?id=" -const val OPPO_PACKAGE = "com.heytap.market" +internal const val OPPO_APP_MARKET_URL = "market://details?id=" +internal const val OPPO_PACKAGE = "com.heytap.market" /** * Opens application's page in [OppoAppMarket](https://oppomobile.com/) */ -object OppoAppMarket : AppStore { - override fun getIntent(packageName: String) = StoreIntentProvider +data class OppoAppMarket(val packageName: String) : AppStore { + constructor(parcel: Parcel) : this(parcel.readString().orEmpty()) + + override fun getIntent() = StoreIntentProvider .Builder("$OPPO_APP_MARKET_URL$packageName") .withPackage(OPPO_PACKAGE) .build() + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeString(packageName) + } + + override fun describeContents() = 0 + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): OppoAppMarket { + return OppoAppMarket(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } } diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/SamsungGalaxyStore.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/SamsungGalaxyStore.kt index f48f2fb3..9c923f40 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/SamsungGalaxyStore.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/SamsungGalaxyStore.kt @@ -1,14 +1,34 @@ package com.pouyaheydari.androidappupdater.store.stores +import android.os.Parcel +import android.os.Parcelable import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider -const val SAMSUNG_GALAXY_STORE_URL = "samsungapps://ProductDetail/" +internal const val SAMSUNG_GALAXY_STORE_URL = "samsungapps://ProductDetail/" /** * Opens application's page in [Samsung Galaxy store](https://www.samsung.com/de/apps/galaxy-store/) */ -object SamsungGalaxyStore : AppStore { - override fun getIntent(packageName: String) = StoreIntentProvider +data class SamsungGalaxyStore(val packageName: String) : AppStore { + constructor(parcel: Parcel) : this(parcel.readString().orEmpty()) + + override fun getIntent() = StoreIntentProvider .Builder("$SAMSUNG_GALAXY_STORE_URL$packageName") .build() + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeString(packageName) + } + + override fun describeContents() = 0 + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): SamsungGalaxyStore { + return SamsungGalaxyStore(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } } diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/TencentAppStore.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/TencentAppStore.kt index 7c3dcca7..50f80d0a 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/TencentAppStore.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/TencentAppStore.kt @@ -1,5 +1,7 @@ package com.pouyaheydari.androidappupdater.store.stores +import android.os.Parcel +import android.os.Parcelable import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider const val TENCENT_APP_STORE_URL = "tmast://appdetails?pname=" @@ -7,8 +9,26 @@ const val TENCENT_APP_STORE_URL = "tmast://appdetails?pname=" /** * Opens application's page in [Tencent App Store](https://appstore.tencent.com/) */ -object TencentAppStore : AppStore { - override fun getIntent(packageName: String) = StoreIntentProvider +data class TencentAppStore(val packageName: String) : AppStore { + constructor(parcel: Parcel) : this(parcel.readString().orEmpty()) + + override fun getIntent() = StoreIntentProvider .Builder("$TENCENT_APP_STORE_URL$packageName") .build() + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeString(packageName) + } + + override fun describeContents() = 0 + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): TencentAppStore { + return TencentAppStore(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } } diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/VAppStore.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/VAppStore.kt index 90ac70c2..23e22743 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/VAppStore.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/VAppStore.kt @@ -1,5 +1,7 @@ package com.pouyaheydari.androidappupdater.store.stores +import android.os.Parcel +import android.os.Parcelable import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider const val V_APP_STORE_URL = "vivoMarket://details?id=" @@ -7,8 +9,26 @@ const val V_APP_STORE_URL = "vivoMarket://details?id=" /** * Opens application's page in [V-AppStore](https://developer.vivo.com/home) */ -object VAppStore : AppStore { - override fun getIntent(packageName: String) = StoreIntentProvider +data class VAppStore(val packageName: String) : AppStore { + constructor(parcel: Parcel) : this(parcel.readString().orEmpty()) + + override fun getIntent() = StoreIntentProvider .Builder("$V_APP_STORE_URL$packageName") .build() + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeString(packageName) + } + + override fun describeContents() = 0 + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): VAppStore { + return VAppStore(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } } diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/ZTEAppCenter.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/ZTEAppCenter.kt index d7824d71..6b266e83 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/ZTEAppCenter.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/ZTEAppCenter.kt @@ -1,5 +1,7 @@ package com.pouyaheydari.androidappupdater.store.stores +import android.os.Parcel +import android.os.Parcelable import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider const val ZTE_APP_CENTER_URL = "zte_market://appdetails?pname=" @@ -7,8 +9,26 @@ const val ZTE_APP_CENTER_URL = "zte_market://appdetails?pname=" /** * Opens application's page in [ZTE App Store](https://apps.ztems.com/) */ -object ZTEAppCenter : AppStore { - override fun getIntent(packageName: String) = StoreIntentProvider +data class ZTEAppCenter(val packageName: String) : AppStore { + constructor(parcel: Parcel) : this(parcel.readString().orEmpty()) + + override fun getIntent() = StoreIntentProvider .Builder("$ZTE_APP_CENTER_URL$packageName") .build() + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeString(packageName) + } + + override fun describeContents() = 0 + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): ZTEAppCenter { + return ZTEAppCenter(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } } diff --git a/store/src/test/java/com/pouyaheydari/appupdater/store/utils/StoreListUtilTest.kt b/store/src/test/java/com/pouyaheydari/appupdater/store/utils/StoreListUtilTest.kt deleted file mode 100644 index 8faa15a2..00000000 --- a/store/src/test/java/com/pouyaheydari/appupdater/store/utils/StoreListUtilTest.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.pouyaheydari.appupdater.store.utils - -import com.pouyaheydari.androidappupdater.store.model.Store -import com.pouyaheydari.androidappupdater.store.model.StoreListItem -import com.pouyaheydari.androidappupdater.store.shouldShowStoresDivider -import org.junit.Assert.assertEquals -import org.junit.Test - -internal class StoreListUtilTest { - @Test - fun `when both lists are not empty, then shouldShowStoresDivider return true`() { - val directDownloadList = listOf(StoreListItem(store = Store.DIRECT_URL)) - val storeList = listOf(StoreListItem(store = Store.GOOGLE_PLAY)) - - val result = shouldShowStoresDivider( - directDownloadList, - storeList, - ) - - assertEquals(true, result) - } - - @Test - fun `when only direct download link is not empty, then shouldShowStoresDivider return false`() { - val directDownloadList = listOf(StoreListItem(store = Store.DIRECT_URL)) - val storeList = listOf() - - val result = shouldShowStoresDivider( - directDownloadList, - storeList, - ) - - assertEquals(false, result) - } - - @Test - fun `when only app stores list is not empty, then shouldShowStoresDivider return false`() { - val directDownloadList = listOf() - val storeList = listOf(StoreListItem(store = Store.GOOGLE_PLAY)) - - val result = shouldShowStoresDivider( - directDownloadList, - storeList, - ) - - assertEquals(false, result) - } - - @Test - fun `when both lists are empty, then shouldShowStoresDivider return false`() { - val directDownloadList = listOf() - val storeList = listOf() - - val result = shouldShowStoresDivider( - directDownloadList, - storeList, - ) - - assertEquals(false, result) - } -} From 45e2c742dace4ac53280f998fdbccc9e100e5d9d Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Wed, 10 Apr 2024 21:21:54 +0200 Subject: [PATCH 021/117] Added error callback when opening a store encounters error --- .../ui/android/MainActivity.kt | 7 ++ .../ui/compose/ComposeSampleActivity.kt | 4 + app/src/main/res/values/strings.xml | 1 + .../appupdater/AppUpdaterDialog.kt | 10 ++- .../appupdater/AppUpdaterViewModel.kt | 22 ++++- .../appupdater/pojo/DialogStates.kt | 1 + .../appupdater/pojo/UpdaterDialogData.kt | 1 + .../appupdater/utils/ErrorCallbackHolder.kt | 14 ++++ compose/build.gradle.kts | 1 + .../compose/ui/AndroidAppUpdaterScreen.kt | 80 +++++++++++++------ .../compose/ui/AndroidAppUpdaterViewModel.kt | 38 +++++---- .../UpdateInProgressDialogComponent.kt | 53 ++++++------ .../compose/ui/models/DialogScreenIntents.kt | 3 + .../compose/ui/models/DialogScreenState.kt | 6 ++ .../compose/ui/models/UpdaterDialogData.kt | 1 + .../utils/GetApkIfActivityIsNotNull.kt | 4 +- directdownload/src/main/AndroidManifest.xml | 4 +- .../data/UpdateInProgressRepositoryImpl.kt | 5 +- .../data/fileprovider/GenericFileProvider.kt | 8 -- .../directdownload/utils/ContextExtensions.kt | 2 +- .../directdownload/utils/DownloadAPK.kt | 13 +-- .../directdownload/utils/InstallApkUtil.kt | 2 +- gradle/libs.versions.toml | 1 + .../androidappupdater/store/ShowStoreModel.kt | 3 +- .../store/domain/StoreListItem.kt | 2 +- .../store/domain/StoreManager.kt | 27 +------ 26 files changed, 186 insertions(+), 127 deletions(-) create mode 100644 appupdater/src/main/java/com/pouyaheydari/appupdater/utils/ErrorCallbackHolder.kt delete mode 100644 directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/data/fileprovider/GenericFileProvider.kt diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/android/MainActivity.kt b/app/src/main/java/com/pouyaheydari/androidappupdater/ui/android/MainActivity.kt index e3f474f6..e19ca2ee 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/android/MainActivity.kt +++ b/app/src/main/java/com/pouyaheydari/androidappupdater/ui/android/MainActivity.kt @@ -4,6 +4,7 @@ import android.content.Intent import android.graphics.Typeface import android.os.Bundle import android.widget.Button +import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.pouyaheydari.androidappupdater.R import com.pouyaheydari.androidappupdater.ui.compose.ComposeSampleActivity @@ -54,6 +55,9 @@ internal class MainActivity : AppCompatActivity() { directDownloadList = getDslDirectDownloadLink(context = this@MainActivity) typeface = Typeface.createFromAsset(assets, FONT_PATH) theme = Theme.SYSTEM_DEFAULT + errorWhileOpeningStoreCallback = { + Toast.makeText(this@MainActivity, getString(R.string.store_is_not_installed, it), Toast.LENGTH_SHORT).show() + } }.show(supportFragmentManager, TAG) } @@ -73,6 +77,9 @@ internal class MainActivity : AppCompatActivity() { isForceUpdate = false, typeface = Typeface.createFromAsset(assets, FONT_PATH), theme = Theme.LIGHT, + errorWhileOpeningStoreCallback = { + Toast.makeText(this@MainActivity, getString(R.string.store_is_not_installed, it), Toast.LENGTH_SHORT).show() + }, ), ).show(supportFragmentManager, TAG) } diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt b/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt index 9fd18764..f30386cf 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt +++ b/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt @@ -1,6 +1,7 @@ package com.pouyaheydari.androidappupdater.ui.compose import android.os.Bundle +import android.widget.Toast import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.layout.Box @@ -52,6 +53,9 @@ internal class ComposeSampleActivity : ComponentActivity() { directDownloadList = directDownloadList(this), theme = Theme.SYSTEM_DEFAULT, onDismissRequested = { state = false }, + errorWhileOpeningStoreCallback = { + Toast.makeText(this@ComposeSampleActivity, getString(R.string.store_is_not_installed, it), Toast.LENGTH_LONG).show() + }, ), ) } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 03fff0d5..06a0fedb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -23,6 +23,7 @@ ZTE App Store Lenovo App Center Show Compose Dialog + %s Store is not installed diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterDialog.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterDialog.kt index 33215470..9e1f7c71 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterDialog.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterDialog.kt @@ -30,6 +30,7 @@ import com.pouyaheydari.appupdater.pojo.UpdaterFragmentModel import com.pouyaheydari.appupdater.pojo.UserSelectedTheme import com.pouyaheydari.appupdater.pojo.UserSelectedTheme.DARK import com.pouyaheydari.appupdater.pojo.UserSelectedTheme.LIGHT +import com.pouyaheydari.appupdater.utils.ErrorCallbackHolder import com.pouyaheydari.appupdater.utils.TypefaceHolder import com.pouyaheydari.appupdater.utils.getDialogWidth import com.pouyaheydari.appupdater.utils.parcelable @@ -96,8 +97,12 @@ class AppUpdaterDialog : DialogFragment() { .distinctUntilChanged() .onEach { when (it) { - is DialogStates.DownloadApk -> getApk(it.apkUrl, requireActivity()) + is DialogStates.DownloadApk -> getApk(it.apkUrl, requireActivity()) { + viewModel.onDownloadStarted() + } + is DialogStates.OpenStore -> showAppInSelectedStore(context, it.store) + is DialogStates.ExecuteErrorCallback -> ErrorCallbackHolder.callback?.invoke(it.storeName) DialogStates.HideUpdateInProgress -> hideUpdateInProgressDialog() DialogStates.ShowUpdateInProgress -> showUpdateInProgressDialog(theme) DialogStates.Empty -> hideUpdateInProgressDialog() @@ -175,7 +180,7 @@ class AppUpdaterDialog : DialogFragment() { if (storeList.isNotEmpty()) { val spanCount = if (storeList.size > 1) 2 else 1 binding.recyclerStores.layoutManager = GridLayoutManager(requireContext(), spanCount) - binding.recyclerStores.adapter = StoresRecyclerAdapter(storeList, theme, typeface) { viewModel.onStoreCLicked(it) } + binding.recyclerStores.adapter = StoresRecyclerAdapter(storeList, theme, typeface) { viewModel.onStoreClicked(it) } } } @@ -217,6 +222,7 @@ class AppUpdaterDialog : DialogFragment() { val data = UpdaterFragmentModel(title, description, storeList, directDownloadList, !isForceUpdate, theme) TypefaceHolder.typeface = typeface + ErrorCallbackHolder.callback = errorWhileOpeningStoreCallback // bundle to add data to our dialog val bundle = Bundle().apply { putParcelable(UPDATE_DIALOG_KEY, data) } fragment.arguments = bundle diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterViewModel.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterViewModel.kt index d9626f9e..890f8e38 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterViewModel.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterViewModel.kt @@ -7,6 +7,7 @@ import com.pouyaheydari.androidappupdater.directdownload.domain.GetIsUpdateInPro import com.pouyaheydari.androidappupdater.store.ShowStoreModel import com.pouyaheydari.androidappupdater.store.domain.StoreListItem import com.pouyaheydari.appupdater.pojo.DialogStates +import com.pouyaheydari.appupdater.utils.ErrorCallbackHolder import com.pouyaheydari.appupdater.utils.TypefaceHolder import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow @@ -19,21 +20,33 @@ import kotlinx.coroutines.launch internal class AppUpdaterViewModel : ViewModel() { val screenState = MutableStateFlow(DialogStates.HideUpdateInProgress) - fun onStoreCLicked(item: StoreListItem) { + fun onStoreClicked(item: StoreListItem) { viewModelScope.launch { - val storeModel = ShowStoreModel(item.store, item.url) + val storeModel = ShowStoreModel(item.store, ::onErrorWhileOpeningStore) screenState.value = DialogStates.OpenStore(storeModel) runWithDelay { - screenState.value = DialogStates.HideUpdateInProgress + screenState.value = DialogStates.Empty } } } fun onDirectDownloadLinkClicked(item: DirectDownloadListItem) { - observeUpdateInProgressStatus() screenState.value = DialogStates.DownloadApk(item.url) } + fun onDownloadStarted() { + observeUpdateInProgressStatus() + } + + private fun onErrorWhileOpeningStore(storeName: String) { + viewModelScope.launch { + screenState.value = DialogStates.ExecuteErrorCallback(storeName) + runWithDelay { + screenState.value = DialogStates.Empty + } + } + } + private fun observeUpdateInProgressStatus() { viewModelScope.launch { GetIsUpdateInProgress().invoke().collectLatest { @@ -44,6 +57,7 @@ internal class AppUpdaterViewModel : ViewModel() { override fun onCleared() { TypefaceHolder.clear() + ErrorCallbackHolder.clear() super.onCleared() } diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/DialogStates.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/DialogStates.kt index 3415365d..bedddf71 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/DialogStates.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/DialogStates.kt @@ -11,4 +11,5 @@ sealed interface DialogStates { data object HideUpdateInProgress : DialogStates data class OpenStore(val store: ShowStoreModel) : DialogStates data class DownloadApk(val apkUrl: String) : DialogStates + data class ExecuteErrorCallback(val storeName: String) : DialogStates } diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/UpdaterDialogData.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/UpdaterDialogData.kt index 56105cdc..3e397362 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/UpdaterDialogData.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/UpdaterDialogData.kt @@ -15,5 +15,6 @@ data class UpdaterDialogData( var directDownloadList: List = listOf(), var isForceUpdate: Boolean = false, var typeface: Typeface? = null, + var errorWhileOpeningStoreCallback: ((String) -> Unit)? = null, var theme: Theme = Theme.SYSTEM_DEFAULT, ) diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/utils/ErrorCallbackHolder.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/utils/ErrorCallbackHolder.kt new file mode 100644 index 00000000..8e555865 --- /dev/null +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/utils/ErrorCallbackHolder.kt @@ -0,0 +1,14 @@ +package com.pouyaheydari.appupdater.utils + +import android.graphics.Typeface + +/** + * Holds an instance of [Typeface] to be used in dialogs while being shown. + */ +internal object ErrorCallbackHolder { + var callback: ((String) -> Unit)? = null + + fun clear() { + callback = null + } +} diff --git a/compose/build.gradle.kts b/compose/build.gradle.kts index 9d3ae137..ec31af62 100644 --- a/compose/build.gradle.kts +++ b/compose/build.gradle.kts @@ -56,6 +56,7 @@ dependencies { implementation(libs.androidx.compose.material) implementation(libs.androidx.compose.ui.tooling) implementation(libs.androidx.compose.ui.tooling.preview) + implementation(libs.androidx.lifecycle) // testing testImplementation(libs.junit4) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt index 031d6b2f..85e07eb6 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt @@ -1,16 +1,20 @@ package com.pouyaheydari.appupdater.compose.ui +import android.app.Activity +import android.content.Context import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewFontScale +import androidx.compose.ui.tooling.preview.PreviewScreenSizes +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel import com.pouyaheydari.androidappupdater.store.ShowStoreModel import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore import com.pouyaheydari.appupdater.compose.ui.components.AppUpdaterDialog import com.pouyaheydari.appupdater.compose.ui.components.UpdateInProgressDialogComponent import com.pouyaheydari.appupdater.compose.ui.models.DialogScreenIntents +import com.pouyaheydari.appupdater.compose.ui.models.ErrorWhileOpeningStore import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogData import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme import com.pouyaheydari.appupdater.compose.utils.getActivity @@ -29,9 +33,11 @@ import com.pouyaheydari.appupdater.core.R as coreR @Composable fun AndroidAppUpdater(dialogData: UpdaterDialogData) { val viewModel: AndroidAppUpdaterViewModel = viewModel(factory = AndroidAppUpdaterViewModelFactory(dialogData)) - val state = viewModel.uiState.value + val state = viewModel.uiState.collectAsStateWithLifecycle().value AndroidAppUpdaterTheme(darkTheme = isDarkThemeSelected(dialogData.theme)) { + val activity = LocalContext.current.getActivity() + if (state.shouldShowDialog) { AppUpdaterDialog( dialogContent = state.dialogContent, @@ -40,41 +46,60 @@ fun AndroidAppUpdater(dialogData: UpdaterDialogData) { typeface = dialogData.typeface, ) } - if (state.shouldShowUpdateInProgress) { - UpdateInProgressDialogComponent() + + UpdateInProgressDialogComponent(isUpdateInProgress = state.shouldShowUpdateInProgress) + + setupErrorCallback(state.errorWhileOpeningStore, dialogData.errorWhileOpeningStoreCallback) { + viewModel.handleIntent(DialogScreenIntents.OnErrorCallbackExecuted) } - SetupStoreOpener(state.selectedStore, state.shouldOpenStore) { + setupStoreOpener(state.selectedStore, state.shouldOpenStore, activity) { viewModel.handleIntent(DialogScreenIntents.OnStoreOpened) } - SetupDirectApkDownload(state.downloadUrl, state.shouldStartAPKDownload) + + setupDirectApkDownload( + state.downloadUrl, + state.shouldStartAPKDownload, + activity, + { viewModel.handleIntent(DialogScreenIntents.OnApkDownloadRequested) }, + { viewModel.handleIntent(DialogScreenIntents.OnApkDownloadStarted) }, + ) } } -@Composable -private fun SetupDirectApkDownload(url: String, shouldStartAPKDownload: Boolean) { - val activity = LocalContext.current.getActivity() - - LaunchedEffect(key1 = url) { - if (shouldStartAPKDownload) { - getApkIfActivityIsNotNull(activity, url) - } +private fun setupErrorCallback( + errorWhileOpeningStore: ErrorWhileOpeningStore, + callback: (String) -> Unit, + onCallbackCalledListener: () -> Unit, +) { + if (errorWhileOpeningStore.shouldNotifyCaller) { + callback(errorWhileOpeningStore.storeName) + onCallbackCalledListener() } } -@Composable -private fun SetupStoreOpener(store: ShowStoreModel, shouldOpenStore: Boolean, onStoreOpenedListener: () -> Unit) { - val context = LocalContext.current +private fun setupDirectApkDownload( + url: String, + shouldStartAPKDownload: Boolean, + activity: Activity?, + onDownloadApkRequested: () -> Unit, + onDownloadingApkStarted: () -> Unit, +) { + if (shouldStartAPKDownload) { + getApkIfActivityIsNotNull(activity, url, onDownloadingApkStarted) + onDownloadApkRequested() + } +} - LaunchedEffect(key1 = store) { - if (shouldOpenStore) { - showAppInSelectedStore(context, store) - } +private fun setupStoreOpener(store: ShowStoreModel, shouldOpenStore: Boolean, context: Context?, onStoreOpenedListener: () -> Unit) { + if (shouldOpenStore) { + showAppInSelectedStore(context, store) onStoreOpenedListener() } } -@Preview(showBackground = true) +@PreviewFontScale +@PreviewScreenSizes @Composable private fun LightPreview() { AndroidAppUpdaterTheme { @@ -90,7 +115,8 @@ private fun LightPreview() { } } -@Preview(showBackground = true) +@PreviewFontScale +@PreviewScreenSizes @Composable private fun LightPreviewSingleStoreItem() { AndroidAppUpdaterTheme { @@ -105,7 +131,8 @@ private fun LightPreviewSingleStoreItem() { } } -@Preview(showBackground = true) +@PreviewFontScale +@PreviewScreenSizes @Composable private fun LightPreviewSingleDirectLinkItem() { AndroidAppUpdaterTheme { @@ -121,7 +148,8 @@ private fun LightPreviewSingleDirectLinkItem() { } } -@Preview(showBackground = true) +@PreviewFontScale +@PreviewScreenSizes @Composable private fun DarkPreview() { AndroidAppUpdaterTheme { diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt index 29108cff..4407d782 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt @@ -1,7 +1,5 @@ package com.pouyaheydari.appupdater.compose.ui -import androidx.compose.runtime.State -import androidx.compose.runtime.mutableStateOf import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.pouyaheydari.androidappupdater.directdownload.data.model.DirectDownloadListItem @@ -12,7 +10,11 @@ import com.pouyaheydari.appupdater.compose.data.mapper.UpdaterDialogUIMapper import com.pouyaheydari.appupdater.compose.ui.models.DialogScreenIntents import com.pouyaheydari.appupdater.compose.ui.models.DialogScreenState import com.pouyaheydari.appupdater.compose.ui.models.UpdaterViewModelData +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch /** @@ -22,9 +24,9 @@ internal class AndroidAppUpdaterViewModel( viewModelData: UpdaterViewModelData, private val isUpdateInProgress: GetIsUpdateInProgress, ) : ViewModel() { - private val _uiState = mutableStateOf(DialogScreenState()) - val uiState: State - get() = _uiState + private val _uiState = MutableStateFlow(DialogScreenState()) + val uiState: StateFlow + get() = _uiState.asStateFlow() init { showUpdaterDialog(viewModelData) @@ -32,38 +34,40 @@ internal class AndroidAppUpdaterViewModel( private fun showUpdaterDialog(viewModelData: UpdaterViewModelData) { val dialogContent = UpdaterDialogUIMapper.map(viewModelData) - updateState { copy(shouldShowDialog = true, dialogContent = dialogContent) } + _uiState.update { it.copy(shouldShowDialog = true, dialogContent = dialogContent) } } fun handleIntent(intent: DialogScreenIntents) { when (intent) { is DialogScreenIntents.OnDirectLinkClicked -> startDirectUrlApkDownload(intent.item) is DialogScreenIntents.OnStoreClicked -> showAppInSelectedStore(intent.item) - DialogScreenIntents.OnStoreOpened -> updateState { copy(shouldOpenStore = false) } + DialogScreenIntents.OnStoreOpened -> _uiState.update { it.copy(shouldOpenStore = false) } + DialogScreenIntents.OnErrorCallbackExecuted -> _uiState.update { it.copy(errorWhileOpeningStore = it.errorWhileOpeningStore.copy(shouldNotifyCaller = false)) } + DialogScreenIntents.OnApkDownloadRequested -> _uiState.update { it.copy(shouldStartAPKDownload = false) } + DialogScreenIntents.OnApkDownloadStarted -> observeUpdateProgress() } } private fun showAppInSelectedStore(item: StoreListItem) { - viewModelScope.launch { - val storeModel = ShowStoreModel(item.store, item.url) - updateState { copy(selectedStore = storeModel, shouldOpenStore = true) } + val storeModel = ShowStoreModel(item.store, ::observeErrorWhileShowingStore) + _uiState.update { it.copy(selectedStore = storeModel, shouldOpenStore = true) } + } + + private fun observeErrorWhileShowingStore(storeName: String) { + _uiState.update { + it.copy(errorWhileOpeningStore = it.errorWhileOpeningStore.copy(shouldNotifyCaller = true, storeName = storeName)) } } private fun startDirectUrlApkDownload(item: DirectDownloadListItem) { - observeUpdateProgress() - updateState { copy(shouldStartAPKDownload = true, downloadUrl = item.url) } + _uiState.update { it.copy(shouldStartAPKDownload = true, downloadUrl = item.url) } } private fun observeUpdateProgress() { viewModelScope.launch { isUpdateInProgress().collectLatest { updateInProgress -> - updateState { copy(shouldShowUpdateInProgress = updateInProgress, shouldStartAPKDownload = false, shouldOpenStore = false) } + _uiState.update { it.copy(shouldShowUpdateInProgress = updateInProgress, shouldStartAPKDownload = false, shouldOpenStore = false) } } } } - - private fun updateState(reduce: DialogScreenState.() -> DialogScreenState) { - _uiState.value = _uiState.value.reduce() - } } diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt index b57a9aa2..2bf42965 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt @@ -1,5 +1,6 @@ package com.pouyaheydari.appupdater.compose.ui.components +import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding @@ -22,34 +23,36 @@ import com.pouyaheydari.appupdater.core.R as coreR * Update in progress dialog is not dismissible by the user. */ @Composable -internal fun UpdateInProgressDialogComponent(modifier: Modifier = Modifier) { - Dialog(onDismissRequest = { /* Do nothing */ }) { - Card( - modifier = modifier.fillMaxWidth(), - shape = RoundedCornerShape(12.dp), - elevation = CardDefaults.cardElevation(8.dp), - colors = CardDefaults.cardColors(MaterialTheme.colorScheme.surface), - ) { - Column( - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 16.dp, horizontal = 8.dp), +internal fun UpdateInProgressDialogComponent(modifier: Modifier = Modifier, isUpdateInProgress: Boolean = false) { + AnimatedVisibility(visible = isUpdateInProgress) { + Dialog(onDismissRequest = { /* Do nothing */ }) { + Card( + modifier = modifier.fillMaxWidth(), + shape = RoundedCornerShape(12.dp), + elevation = CardDefaults.cardElevation(8.dp), + colors = CardDefaults.cardColors(MaterialTheme.colorScheme.surface), ) { - Text( - text = stringResource(id = (coreR.string.appupdater_please_wait)), - style = MaterialTheme.typography.titleLarge, - modifier = Modifier.padding(horizontal = 8.dp), - ) - Text( - text = stringResource(id = (coreR.string.appupdater_downloading_new_version)), - style = MaterialTheme.typography.bodyLarge, - modifier = Modifier.padding(all = 8.dp), - ) - LinearProgressIndicator( + Column( modifier = Modifier .fillMaxWidth() - .padding(all = 8.dp), - ) + .padding(vertical = 16.dp, horizontal = 8.dp), + ) { + Text( + text = stringResource(id = (coreR.string.appupdater_please_wait)), + style = MaterialTheme.typography.titleLarge, + modifier = Modifier.padding(horizontal = 8.dp), + ) + Text( + text = stringResource(id = (coreR.string.appupdater_downloading_new_version)), + style = MaterialTheme.typography.bodyLarge, + modifier = Modifier.padding(all = 8.dp), + ) + LinearProgressIndicator( + modifier = Modifier + .fillMaxWidth() + .padding(all = 8.dp), + ) + } } } } diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenIntents.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenIntents.kt index 1b7775e8..351cd807 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenIntents.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenIntents.kt @@ -7,4 +7,7 @@ internal sealed interface DialogScreenIntents { data class OnStoreClicked(val item: StoreListItem) : DialogScreenIntents data class OnDirectLinkClicked(val item: DirectDownloadListItem) : DialogScreenIntents data object OnStoreOpened : DialogScreenIntents + data object OnErrorCallbackExecuted : DialogScreenIntents + data object OnApkDownloadStarted : DialogScreenIntents + data object OnApkDownloadRequested : DialogScreenIntents } diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenState.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenState.kt index d89adff0..1ebff68b 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenState.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenState.kt @@ -5,9 +5,15 @@ import com.pouyaheydari.androidappupdater.store.ShowStoreModel internal data class DialogScreenState( val shouldShowDialog: Boolean = true, val shouldShowUpdateInProgress: Boolean = false, + val errorWhileOpeningStore: ErrorWhileOpeningStore = ErrorWhileOpeningStore(), val selectedStore: ShowStoreModel = ShowStoreModel(), val shouldOpenStore: Boolean = false, val downloadUrl: String = "", val shouldStartAPKDownload: Boolean = false, val dialogContent: UpdaterDialogUIData = UpdaterDialogUIData(), ) + +internal data class ErrorWhileOpeningStore( + val shouldNotifyCaller: Boolean = false, + val storeName: String = "", +) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogData.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogData.kt index b796e73d..3cb47b0a 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogData.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogData.kt @@ -14,6 +14,7 @@ data class UpdaterDialogData( val storeList: List = listOf(), val directDownloadList: List = listOf(), val onDismissRequested: () -> Unit = {}, + val errorWhileOpeningStoreCallback: (String) -> Unit = {}, val typeface: Typeface? = null, val theme: Theme = Theme.SYSTEM_DEFAULT, ) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/GetApkIfActivityIsNotNull.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/GetApkIfActivityIsNotNull.kt index 86794677..6dd100b9 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/GetApkIfActivityIsNotNull.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/GetApkIfActivityIsNotNull.kt @@ -5,10 +5,10 @@ import android.util.Log import com.pouyaheydari.androidappupdater.directdownload.utils.getApk import com.pouyaheydari.appupdater.core.utils.ANDROID_APP_UPDATER_DEBUG_TAG -suspend fun getApkIfActivityIsNotNull(activity: Activity?, url: String) { +fun getApkIfActivityIsNotNull(activity: Activity?, url: String, onDownloadingApkStarted: () -> Unit) { if (activity == null) { Log.e(ANDROID_APP_UPDATER_DEBUG_TAG, "Provided activity is null. Skipping downloading the apk") } else { - getApk(url, activity) + getApk(url, activity, onDownloadingApkStarted) } } diff --git a/directdownload/src/main/AndroidManifest.xml b/directdownload/src/main/AndroidManifest.xml index 81377e3c..ad733f92 100644 --- a/directdownload/src/main/AndroidManifest.xml +++ b/directdownload/src/main/AndroidManifest.xml @@ -4,8 +4,8 @@ = shouldShowUpdateInProgressDialog.asSharedFlow() + override fun getUpdateInProgressFlow(): Flow = shouldShowUpdateInProgressDialog.asSharedFlow().onStart { + emit(true) + } override suspend fun updateApkDownloadProgress(isInProgress: Boolean) { shouldShowUpdateInProgressDialog.emit(isInProgress) diff --git a/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/data/fileprovider/GenericFileProvider.kt b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/data/fileprovider/GenericFileProvider.kt deleted file mode 100644 index 75cf78d8..00000000 --- a/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/data/fileprovider/GenericFileProvider.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.pouyaheydari.androidappupdater.directdownload.data.fileprovider - -import androidx.core.content.FileProvider - -/** - * To accessing the downloaded APK - */ -internal class GenericFileProvider : FileProvider() diff --git a/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/utils/ContextExtensions.kt b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/utils/ContextExtensions.kt index a13afa6b..86595f04 100644 --- a/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/utils/ContextExtensions.kt +++ b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/utils/ContextExtensions.kt @@ -8,4 +8,4 @@ import java.io.File /** * @return a File to the previously downloaded APK file if present. */ -internal fun Context.getExistingApk() = File("${this.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)}/$APK_NAME") +internal fun Context.getExistingApk() = File("${getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)}/$APK_NAME") diff --git a/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/utils/DownloadAPK.kt b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/utils/DownloadAPK.kt index ba0e184b..e68654a2 100644 --- a/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/utils/DownloadAPK.kt +++ b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/utils/DownloadAPK.kt @@ -15,20 +15,17 @@ import com.pouyaheydari.appupdater.core.utils.APK_NAME /** * Checks for needed permissions and tries to download the apk */ -suspend fun getApk(url: String, activity: Activity) { +fun getApk(url: String, activity: Activity, onDownloadingApkStarted: () -> Unit) { if (checkAndRequestRequiredPermissionsBasedOnOsVersion(activity, Build.VERSION.SDK_INT)) { prepareToDownloadApk(url, activity) + onDownloadingApkStarted() } } -private suspend fun prepareToDownloadApk(url: String, context: Context) { - // Show update in Progress alert dialog to the user - showUpdateInProgress() - +private fun prepareToDownloadApk(url: String, context: Context) { // Delete APK if user downloaded the apk before deleteExistingApkIfAvailable(context) - // Start downloading the APK startDownloadManagerToDownloadNewApk(url, context) } @@ -39,10 +36,6 @@ private fun deleteExistingApkIfAvailable(context: Context) { } } -private suspend fun showUpdateInProgress() { - com.pouyaheydari.androidappupdater.directdownload.domain.SetIsUpdateInProgress().invoke(true) -} - private fun startDownloadManagerToDownloadNewApk(url: String, context: Context) { val downloadManager = DownloadManager.Request(Uri.parse(url)).run { // setting title and description to be shown on download notification diff --git a/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/utils/InstallApkUtil.kt b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/utils/InstallApkUtil.kt index db82c5ca..7b55a277 100644 --- a/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/utils/InstallApkUtil.kt +++ b/directdownload/src/main/java/com/pouyaheydari/androidappupdater/directdownload/utils/InstallApkUtil.kt @@ -48,7 +48,7 @@ private fun installAPKForNtoO(context: Context, apk: File) { private fun getFileUri(context: Context, apk: File): Uri = FileProvider.getUriForFile( context, - "${context.packageName}.fileProvider.GenericFileProvider", + "${context.packageName}.fileprovider", apk, ) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9c14a4be..38b502b0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -32,6 +32,7 @@ androidx-constraintLayout = { group = "androidx.constraintlayout", name = "const androidx-recyclerView = { group = "androidx.recyclerview", name = "recyclerview", version.ref = "recyclerView" } androidx-core = { group = "androidx.core", name = "core", version.ref = "androidXCore" } androidx-fragment = { group = "androidx.fragment", name = "fragment-ktx", version.ref = "fragment" } +androidx-lifecycle = {group = "androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "lifecycle"} androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "androidxComposeBom" } androidx-compose-foundation = { group = "androidx.compose.foundation", name = "foundation" } androidx-compose-viewModel = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "lifecycle" } diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/ShowStoreModel.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/ShowStoreModel.kt index 12859dba..6b6c6288 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/ShowStoreModel.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/ShowStoreModel.kt @@ -5,6 +5,5 @@ import com.pouyaheydari.androidappupdater.store.stores.AppStore data class ShowStoreModel( val store: AppStore = StoreFactory.getGooglePlayStore(""), - val fallbackUrl: String = "", - val errorCallBack: () -> Unit = {}, + val errorCallBack: (String) -> Unit = {}, ) diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreListItem.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreListItem.kt index bdbf1aaa..7bf43932 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreListItem.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreListItem.kt @@ -16,7 +16,7 @@ data class StoreListItem( var url: String = "", ) : Parcelable { private constructor(parcel: Parcel) : this( - ParcelCompat.readParcelable(parcel, AppStore::class.java.classLoader, AppStore::class.java)!!, + ParcelCompat.readParcelable(parcel, AppStore::class.java.classLoader, AppStore::class.java) ?: StoreFactory.getGooglePlayStore(""), parcel.readString().orEmpty(), parcel.readInt(), parcel.readString().orEmpty(), diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreManager.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreManager.kt index 7640f239..32a7a38f 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreManager.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreManager.kt @@ -2,9 +2,6 @@ package com.pouyaheydari.androidappupdater.store.domain import android.content.ActivityNotFoundException import android.content.Context -import android.content.Intent -import android.content.Intent.FLAG_ACTIVITY_NEW_TASK -import android.net.Uri import android.util.Log import com.pouyaheydari.androidappupdater.store.ShowStoreModel import com.pouyaheydari.appupdater.core.utils.ANDROID_APP_UPDATER_DEBUG_TAG @@ -14,34 +11,14 @@ fun showAppInSelectedStore(context: Context?, storeModel: ShowStoreModel) { try { val intent = storeModel.store.getIntent() context?.startActivity(intent) - } catch (e: ActivityNotFoundException) { - e.printStackTrace() - showFallbackUrlOrCallErrorFallback(storeModel, context) - } -} - -private fun showFallbackUrlOrCallErrorFallback(storeModel: ShowStoreModel, context: Context?) { - if (storeModel.fallbackUrl.isNotEmpty()) { - showFallbackUrlInDefaultBrowser(context, storeModel) - } else { - handleError(storeModel.store.javaClass.name, storeModel.errorCallBack) - } -} - -private fun showFallbackUrlInDefaultBrowser(context: Context?, storeModel: ShowStoreModel) { - try { - val webViewIntent = Intent(Intent.ACTION_VIEW, Uri.parse(storeModel.fallbackUrl)).run { - addFlags(FLAG_ACTIVITY_NEW_TASK) - } - context?.startActivity(webViewIntent) } catch (e: ActivityNotFoundException) { e.printStackTrace() handleError(storeModel.store.javaClass.name, storeModel.errorCallBack) } } -private fun handleError(storeName: String, errorCallBack: () -> Unit) { +private fun handleError(storeName: String, errorCallBack: (String) -> Unit) { val lowerCaseStoreName = storeName.lowercase(Locale.ROOT).replace("_", " ") Log.e(ANDROID_APP_UPDATER_DEBUG_TAG, "$lowerCaseStoreName is not installed") - errorCallBack() + errorCallBack(storeName) } From d9aa1eff7d63b9a0dfa2c20e802c9251783a766a Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Thu, 11 Apr 2024 15:58:34 +0200 Subject: [PATCH 022/117] Removed redundant comments --- core/src/main/AndroidManifest.xml | 2 -- .../java/com/pouyaheydari/appupdater/core/utils/Constants.kt | 2 -- 2 files changed, 4 deletions(-) delete mode 100644 core/src/main/AndroidManifest.xml diff --git a/core/src/main/AndroidManifest.xml b/core/src/main/AndroidManifest.xml deleted file mode 100644 index 8072ee00..00000000 --- a/core/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/core/src/main/java/com/pouyaheydari/appupdater/core/utils/Constants.kt b/core/src/main/java/com/pouyaheydari/appupdater/core/utils/Constants.kt index 2ae5b35d..ff99d841 100644 --- a/core/src/main/java/com/pouyaheydari/appupdater/core/utils/Constants.kt +++ b/core/src/main/java/com/pouyaheydari/appupdater/core/utils/Constants.kt @@ -1,6 +1,4 @@ package com.pouyaheydari.appupdater.core.utils -// A file to store constants of the project - const val ANDROID_APP_UPDATER_DEBUG_TAG = "AndroidAppUpdater" const val APK_NAME = "NewAPK.apk" From de9efc54882bea291039925efe6dd3138ae17670 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Thu, 11 Apr 2024 16:10:55 +0200 Subject: [PATCH 023/117] Updated stores test according to new changes --- .../appupdater/store/stores/AmazonAppStoreTest.kt | 9 ++++----- .../pouyaheydari/appupdater/store/stores/AptoideTest.kt | 9 ++++----- .../appupdater/store/stores/CafeBazaarStoreTest.kt | 9 ++++----- .../pouyaheydari/appupdater/store/stores/FDroidTest.kt | 9 ++++----- .../appupdater/store/stores/GooglePlayStoreTest.kt | 9 ++++----- .../appupdater/store/stores/HuaweiAppGalleryTest.kt | 9 ++++----- .../appupdater/store/stores/LenovoAppCenterTest.kt | 7 +++---- .../appupdater/store/stores/MiGetAppStoreTest.kt | 7 +++---- .../appupdater/store/stores/MyketStoreTest.kt | 9 ++++----- .../pouyaheydari/appupdater/store/stores/NineAppsTest.kt | 9 ++++----- .../appupdater/store/stores/OneStoreAppMarketTest.kt | 7 +++---- .../appupdater/store/stores/OppoAppMarketTest.kt | 9 ++++----- .../appupdater/store/stores/SamsungGalaxyStoreTest.kt | 7 +++---- .../appupdater/store/stores/TencentStoreTest.kt | 7 +++---- .../appupdater/store/stores/VAppStoreTest.kt | 7 +++---- .../appupdater/store/stores/ZTEAppCenterTest.kt | 7 +++---- 16 files changed, 57 insertions(+), 73 deletions(-) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/AmazonAppStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/AmazonAppStoreTest.kt index 2c3db9fe..d214716a 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/AmazonAppStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/AmazonAppStoreTest.kt @@ -6,11 +6,11 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.ShowStoreModel import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.stores.AMAZON_APP_STORE_URL -import com.pouyaheydari.androidappupdater.store.stores.AMAZON_PACKAGE +import com.pouyaheydari.androidappupdater.store.domain.stores.AMAZON_APP_STORE_URL +import com.pouyaheydari.androidappupdater.store.domain.stores.AMAZON_PACKAGE import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -24,8 +24,7 @@ class AmazonAppStoreTest { fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName - val url = "https://pouyaheydari.com" - val storeModel = ShowStoreModel(StoreFactory.getAmazonAppStore(packageName), url) + val storeModel = ShowStoreModel(StoreFactory.getAmazonAppStore(packageName)) showAppInSelectedStore(appContext, storeModel) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/AptoideTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/AptoideTest.kt index 00c64940..3638e249 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/AptoideTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/AptoideTest.kt @@ -6,11 +6,11 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.ShowStoreModel import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.stores.APTOIDE_PACKAGE -import com.pouyaheydari.androidappupdater.store.stores.APTOIDE_URL +import com.pouyaheydari.androidappupdater.store.domain.stores.APTOIDE_PACKAGE +import com.pouyaheydari.androidappupdater.store.domain.stores.APTOIDE_URL import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -24,8 +24,7 @@ internal class AptoideTest { fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName - val url = "https://pouyaheydari.com" - val storeModel = ShowStoreModel(StoreFactory.getAptoideStore(packageName), url) + val storeModel = ShowStoreModel(StoreFactory.getAptoideStore(packageName)) showAppInSelectedStore(appContext, storeModel) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/CafeBazaarStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/CafeBazaarStoreTest.kt index c6a9881a..d2aae02d 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/CafeBazaarStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/CafeBazaarStoreTest.kt @@ -6,11 +6,11 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.ShowStoreModel import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.stores.BAZAAR_PACKAGE -import com.pouyaheydari.androidappupdater.store.stores.BAZAAR_URL +import com.pouyaheydari.androidappupdater.store.domain.stores.BAZAAR_PACKAGE +import com.pouyaheydari.androidappupdater.store.domain.stores.BAZAAR_URL import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -24,8 +24,7 @@ internal class CafeBazaarStoreTest { fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName - val url = "https://pouyaheydari.com" - val storeModel = ShowStoreModel(StoreFactory.getCafeBazaarStore(packageName), url) + val storeModel = ShowStoreModel(StoreFactory.getCafeBazaarStore(packageName)) showAppInSelectedStore(appContext, storeModel) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/FDroidTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/FDroidTest.kt index 8ea9e6c6..04bb681c 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/FDroidTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/FDroidTest.kt @@ -6,11 +6,11 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.ShowStoreModel import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.stores.FDROID_PACKAGE -import com.pouyaheydari.androidappupdater.store.stores.FDROID_URL +import com.pouyaheydari.androidappupdater.store.domain.stores.FDROID_PACKAGE +import com.pouyaheydari.androidappupdater.store.domain.stores.FDROID_URL import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -24,8 +24,7 @@ internal class FDroidTest { fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName - val url = "https://pouyaheydari.com" - val storeModel = ShowStoreModel(StoreFactory.getFdroidStore(packageName), url) + val storeModel = ShowStoreModel(StoreFactory.getFdroidStore(packageName)) showAppInSelectedStore(appContext, storeModel) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/GooglePlayStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/GooglePlayStoreTest.kt index d016d76e..4836f67f 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/GooglePlayStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/GooglePlayStoreTest.kt @@ -6,11 +6,11 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.ShowStoreModel import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.stores.PLAY_PACKAGE -import com.pouyaheydari.androidappupdater.store.stores.PLAY_URL +import com.pouyaheydari.androidappupdater.store.domain.stores.PLAY_PACKAGE +import com.pouyaheydari.androidappupdater.store.domain.stores.PLAY_URL import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -24,8 +24,7 @@ internal class GooglePlayStoreTest { fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName - val url = "https://pouyaheydari.com" - val storeModel = ShowStoreModel(StoreFactory.getGooglePlayStore(packageName), url) + val storeModel = ShowStoreModel(StoreFactory.getGooglePlayStore(packageName)) showAppInSelectedStore(appContext, storeModel) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/HuaweiAppGalleryTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/HuaweiAppGalleryTest.kt index 0b4f761b..d4decbdf 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/HuaweiAppGalleryTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/HuaweiAppGalleryTest.kt @@ -6,11 +6,11 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.ShowStoreModel import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.stores.HUAWEI_APP_GALLERY_PACKAGE -import com.pouyaheydari.androidappupdater.store.stores.HUAWEI_APP_GALLERY_URL +import com.pouyaheydari.androidappupdater.store.domain.stores.HUAWEI_APP_GALLERY_PACKAGE +import com.pouyaheydari.androidappupdater.store.domain.stores.HUAWEI_APP_GALLERY_URL import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -24,8 +24,7 @@ internal class HuaweiAppGalleryTest { fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName - val url = "https://pouyaheydari.com" - val storeModel = ShowStoreModel(StoreFactory.getHuaweiAppGalleryStore(packageName), url) + val storeModel = ShowStoreModel(StoreFactory.getHuaweiAppGalleryStore(packageName)) showAppInSelectedStore(appContext, storeModel) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/LenovoAppCenterTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/LenovoAppCenterTest.kt index 9e712a69..0564892e 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/LenovoAppCenterTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/LenovoAppCenterTest.kt @@ -6,10 +6,10 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.ShowStoreModel import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.stores.LENOVO_APP_CENTER_URL +import com.pouyaheydari.androidappupdater.store.domain.stores.LENOVO_APP_CENTER_URL import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -23,8 +23,7 @@ internal class LenovoAppCenterTest { fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName - val url = "https://pouyaheydari.com" - val storeModel = ShowStoreModel(StoreFactory.getLenovoAppCenterStore(packageName), url) + val storeModel = ShowStoreModel(StoreFactory.getLenovoAppCenterStore(packageName)) showAppInSelectedStore(appContext, storeModel) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/MiGetAppStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/MiGetAppStoreTest.kt index 2257087a..f01667e1 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/MiGetAppStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/MiGetAppStoreTest.kt @@ -6,10 +6,10 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.ShowStoreModel import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.stores.MI_APP_STORE_URL +import com.pouyaheydari.androidappupdater.store.domain.stores.MI_APP_STORE_URL import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -23,8 +23,7 @@ internal class MiGetAppStoreTest { fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName - val url = "https://pouyaheydari.com" - val storeModel = ShowStoreModel(StoreFactory.getMiStore(packageName), url) + val storeModel = ShowStoreModel(StoreFactory.getMiStore(packageName)) showAppInSelectedStore(appContext, storeModel) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/MyketStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/MyketStoreTest.kt index ceb77132..659472d4 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/MyketStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/MyketStoreTest.kt @@ -6,11 +6,11 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.ShowStoreModel import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.stores.MYKET_PACKAGE -import com.pouyaheydari.androidappupdater.store.stores.MYKET_URL +import com.pouyaheydari.androidappupdater.store.domain.stores.MYKET_PACKAGE +import com.pouyaheydari.androidappupdater.store.domain.stores.MYKET_URL import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -24,8 +24,7 @@ internal class MyketStoreTest { fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName - val url = "https://pouyaheydari.com" - val storeModel = ShowStoreModel(StoreFactory.getMyketStore(packageName), url) + val storeModel = ShowStoreModel(StoreFactory.getMyketStore(packageName)) showAppInSelectedStore(appContext, storeModel) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/NineAppsTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/NineAppsTest.kt index 18871429..f9a4ad11 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/NineAppsTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/NineAppsTest.kt @@ -6,11 +6,11 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.ShowStoreModel import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.stores.NINE_APPS_PACKAGE -import com.pouyaheydari.androidappupdater.store.stores.NINE_APPS_STORE_URL +import com.pouyaheydari.androidappupdater.store.domain.stores.NINE_APPS_PACKAGE +import com.pouyaheydari.androidappupdater.store.domain.stores.NINE_APPS_STORE_URL import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -24,8 +24,7 @@ internal class NineAppsTest { fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName - val url = "https://pouyaheydari.com" - val storeModel = ShowStoreModel(StoreFactory.getNineAppsStore(packageName), url) + val storeModel = ShowStoreModel(StoreFactory.getNineAppsStore(packageName)) showAppInSelectedStore(appContext, storeModel) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/OneStoreAppMarketTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/OneStoreAppMarketTest.kt index 68d9dead..4afd2037 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/OneStoreAppMarketTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/OneStoreAppMarketTest.kt @@ -6,10 +6,10 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.ShowStoreModel import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.stores.ONE_STORE_APP_MARKET_URL +import com.pouyaheydari.androidappupdater.store.domain.stores.ONE_STORE_APP_MARKET_URL import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -23,8 +23,7 @@ internal class OneStoreAppMarketTest { fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName - val url = "https://pouyaheydari.com" - val storeModel = ShowStoreModel(StoreFactory.getOneStore(packageName), url) + val storeModel = ShowStoreModel(StoreFactory.getOneStore(packageName)) showAppInSelectedStore(appContext, storeModel) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/OppoAppMarketTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/OppoAppMarketTest.kt index 7775cc9a..99d9b6e1 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/OppoAppMarketTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/OppoAppMarketTest.kt @@ -6,11 +6,11 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.ShowStoreModel import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.stores.OPPO_APP_MARKET_URL -import com.pouyaheydari.androidappupdater.store.stores.OPPO_PACKAGE +import com.pouyaheydari.androidappupdater.store.domain.stores.OPPO_APP_MARKET_URL +import com.pouyaheydari.androidappupdater.store.domain.stores.OPPO_PACKAGE import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -24,8 +24,7 @@ internal class OppoAppMarketTest { fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName - val url = "https://pouyaheydari.com" - val storeModel = ShowStoreModel(StoreFactory.getOppoAppMarketStore(packageName), url) + val storeModel = ShowStoreModel(StoreFactory.getOppoAppMarketStore(packageName)) showAppInSelectedStore(appContext, storeModel) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/SamsungGalaxyStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/SamsungGalaxyStoreTest.kt index ad485de8..690385c3 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/SamsungGalaxyStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/SamsungGalaxyStoreTest.kt @@ -6,10 +6,10 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.ShowStoreModel import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.stores.SAMSUNG_GALAXY_STORE_URL +import com.pouyaheydari.androidappupdater.store.domain.stores.SAMSUNG_GALAXY_STORE_URL import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -23,8 +23,7 @@ internal class SamsungGalaxyStoreTest { fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName - val url = "https://pouyaheydari.com" - val storeModel = ShowStoreModel(StoreFactory.getSamsungGalaxyStore(packageName), url) + val storeModel = ShowStoreModel(StoreFactory.getSamsungGalaxyStore(packageName)) showAppInSelectedStore(appContext, storeModel) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/TencentStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/TencentStoreTest.kt index 06e3b135..796b99bc 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/TencentStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/TencentStoreTest.kt @@ -6,10 +6,10 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.ShowStoreModel import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.stores.TENCENT_APP_STORE_URL +import com.pouyaheydari.androidappupdater.store.domain.stores.TENCENT_APP_STORE_URL import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -23,8 +23,7 @@ internal class TencentStoreTest { fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName - val url = "https://pouyaheydari.com" - val tencentStoreModel = ShowStoreModel(StoreFactory.getTencentAppStore(packageName), url) + val tencentStoreModel = ShowStoreModel(StoreFactory.getTencentAppStore(packageName)) showAppInSelectedStore(appContext, tencentStoreModel) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/VAppStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/VAppStoreTest.kt index e8325713..82333aaa 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/VAppStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/VAppStoreTest.kt @@ -6,10 +6,10 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.ShowStoreModel import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.stores.V_APP_STORE_URL +import com.pouyaheydari.androidappupdater.store.domain.stores.V_APP_STORE_URL import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -23,8 +23,7 @@ internal class VAppStoreTest { fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName - val url = "https://pouyaheydari.com" - val storeModel = ShowStoreModel(StoreFactory.getVAppStore(packageName), url) + val storeModel = ShowStoreModel(StoreFactory.getVAppStore(packageName)) showAppInSelectedStore(appContext, storeModel) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/ZTEAppCenterTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/ZTEAppCenterTest.kt index 4adcdde6..e269ecde 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/ZTEAppCenterTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/ZTEAppCenterTest.kt @@ -6,10 +6,10 @@ import androidx.test.espresso.intent.matcher.IntentMatchers import androidx.test.espresso.intent.rule.IntentsRule import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.ShowStoreModel import com.pouyaheydari.androidappupdater.store.domain.StoreFactory import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.androidappupdater.store.stores.ZTE_APP_CENTER_URL +import com.pouyaheydari.androidappupdater.store.domain.stores.ZTE_APP_CENTER_URL import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -23,8 +23,7 @@ internal class ZTEAppCenterTest { fun whenCalling_setStoreData_then_intentGetsFiredCorrectly() { val appContext = InstrumentationRegistry.getInstrumentation().targetContext val packageName = appContext.packageName - val url = "https://pouyaheydari.com" - val storeModel = ShowStoreModel(StoreFactory.getZTEStore(packageName), url) + val storeModel = ShowStoreModel(StoreFactory.getZTEStore(packageName)) showAppInSelectedStore(appContext, storeModel) From 4f35beab97fbaf36b897cdfdf531e153f89bba32 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Thu, 11 Apr 2024 16:11:57 +0200 Subject: [PATCH 024/117] Moved stores to domain package --- .../appupdater/AppUpdaterViewModel.kt | 2 +- .../appupdater/pojo/DialogStates.kt | 2 +- .../compose/ui/AndroidAppUpdaterScreen.kt | 2 +- .../compose/ui/AndroidAppUpdaterViewModel.kt | 2 +- .../compose/ui/models/DialogScreenState.kt | 2 +- .../androidappupdater/store/ShowStoreModel.kt | 9 ------ .../store/domain/ShowStoreModel.kt | 8 +++++ .../store/domain/StoreFactory.kt | 32 +++++++++---------- .../store/domain/StoreListItem.kt | 2 +- .../store/domain/StoreManager.kt | 1 - .../{ => domain}/stores/AmazonAppStore.kt | 6 ++-- .../store/{ => domain}/stores/AppStore.kt | 2 +- .../store/{ => domain}/stores/Aptoide.kt | 2 +- .../{ => domain}/stores/CafeBazaarStore.kt | 2 +- .../store/{ => domain}/stores/FDroid.kt | 2 +- .../{ => domain}/stores/GooglePlayStore.kt | 2 +- .../{ => domain}/stores/HuaweiAppGallery.kt | 2 +- .../{ => domain}/stores/LenovoAppCenter.kt | 2 +- .../{ => domain}/stores/MiGetAppStore.kt | 2 +- .../store/{ => domain}/stores/MyketStore.kt | 2 +- .../store/{ => domain}/stores/NineApps.kt | 2 +- .../{ => domain}/stores/OneStoreAppMarket.kt | 2 +- .../{ => domain}/stores/OppoAppMarket.kt | 2 +- .../{ => domain}/stores/SamsungGalaxyStore.kt | 2 +- .../{ => domain}/stores/TencentAppStore.kt | 4 +-- .../store/{ => domain}/stores/VAppStore.kt | 4 +-- .../store/{ => domain}/stores/ZTEAppCenter.kt | 4 +-- 27 files changed, 52 insertions(+), 54 deletions(-) delete mode 100644 store/src/main/java/com/pouyaheydari/androidappupdater/store/ShowStoreModel.kt create mode 100644 store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/ShowStoreModel.kt rename store/src/main/java/com/pouyaheydari/androidappupdater/store/{ => domain}/stores/AmazonAppStore.kt (84%) rename store/src/main/java/com/pouyaheydari/androidappupdater/store/{ => domain}/stores/AppStore.kt (67%) rename store/src/main/java/com/pouyaheydari/androidappupdater/store/{ => domain}/stores/Aptoide.kt (94%) rename store/src/main/java/com/pouyaheydari/androidappupdater/store/{ => domain}/stores/CafeBazaarStore.kt (94%) rename store/src/main/java/com/pouyaheydari/androidappupdater/store/{ => domain}/stores/FDroid.kt (94%) rename store/src/main/java/com/pouyaheydari/androidappupdater/store/{ => domain}/stores/GooglePlayStore.kt (94%) rename store/src/main/java/com/pouyaheydari/androidappupdater/store/{ => domain}/stores/HuaweiAppGallery.kt (94%) rename store/src/main/java/com/pouyaheydari/androidappupdater/store/{ => domain}/stores/LenovoAppCenter.kt (94%) rename store/src/main/java/com/pouyaheydari/androidappupdater/store/{ => domain}/stores/MiGetAppStore.kt (94%) rename store/src/main/java/com/pouyaheydari/androidappupdater/store/{ => domain}/stores/MyketStore.kt (94%) rename store/src/main/java/com/pouyaheydari/androidappupdater/store/{ => domain}/stores/NineApps.kt (94%) rename store/src/main/java/com/pouyaheydari/androidappupdater/store/{ => domain}/stores/OneStoreAppMarket.kt (94%) rename store/src/main/java/com/pouyaheydari/androidappupdater/store/{ => domain}/stores/OppoAppMarket.kt (94%) rename store/src/main/java/com/pouyaheydari/androidappupdater/store/{ => domain}/stores/SamsungGalaxyStore.kt (94%) rename store/src/main/java/com/pouyaheydari/androidappupdater/store/{ => domain}/stores/TencentAppStore.kt (87%) rename store/src/main/java/com/pouyaheydari/androidappupdater/store/{ => domain}/stores/VAppStore.kt (87%) rename store/src/main/java/com/pouyaheydari/androidappupdater/store/{ => domain}/stores/ZTEAppCenter.kt (87%) diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterViewModel.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterViewModel.kt index 890f8e38..522182fd 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterViewModel.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/AppUpdaterViewModel.kt @@ -4,7 +4,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.pouyaheydari.androidappupdater.directdownload.data.model.DirectDownloadListItem import com.pouyaheydari.androidappupdater.directdownload.domain.GetIsUpdateInProgress -import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.ShowStoreModel import com.pouyaheydari.androidappupdater.store.domain.StoreListItem import com.pouyaheydari.appupdater.pojo.DialogStates import com.pouyaheydari.appupdater.utils.ErrorCallbackHolder diff --git a/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/DialogStates.kt b/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/DialogStates.kt index bedddf71..6f0be5d6 100644 --- a/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/DialogStates.kt +++ b/appupdater/src/main/java/com/pouyaheydari/appupdater/pojo/DialogStates.kt @@ -1,6 +1,6 @@ package com.pouyaheydari.appupdater.pojo -import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.ShowStoreModel /** * Represents UI states of the update dialog diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt index 85e07eb6..7c99bd2b 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt @@ -9,7 +9,7 @@ import androidx.compose.ui.tooling.preview.PreviewFontScale import androidx.compose.ui.tooling.preview.PreviewScreenSizes import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel -import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.ShowStoreModel import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore import com.pouyaheydari.appupdater.compose.ui.components.AppUpdaterDialog import com.pouyaheydari.appupdater.compose.ui.components.UpdateInProgressDialogComponent diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt index 4407d782..4baef2bc 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt @@ -4,7 +4,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.pouyaheydari.androidappupdater.directdownload.data.model.DirectDownloadListItem import com.pouyaheydari.androidappupdater.directdownload.domain.GetIsUpdateInProgress -import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.ShowStoreModel import com.pouyaheydari.androidappupdater.store.domain.StoreListItem import com.pouyaheydari.appupdater.compose.data.mapper.UpdaterDialogUIMapper import com.pouyaheydari.appupdater.compose.ui.models.DialogScreenIntents diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenState.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenState.kt index 1ebff68b..82115e4b 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenState.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogScreenState.kt @@ -1,6 +1,6 @@ package com.pouyaheydari.appupdater.compose.ui.models -import com.pouyaheydari.androidappupdater.store.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.ShowStoreModel internal data class DialogScreenState( val shouldShowDialog: Boolean = true, diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/ShowStoreModel.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/ShowStoreModel.kt deleted file mode 100644 index 6b6c6288..00000000 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/ShowStoreModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.pouyaheydari.androidappupdater.store - -import com.pouyaheydari.androidappupdater.store.domain.StoreFactory -import com.pouyaheydari.androidappupdater.store.stores.AppStore - -data class ShowStoreModel( - val store: AppStore = StoreFactory.getGooglePlayStore(""), - val errorCallBack: (String) -> Unit = {}, -) diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/ShowStoreModel.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/ShowStoreModel.kt new file mode 100644 index 00000000..0cfe1efa --- /dev/null +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/ShowStoreModel.kt @@ -0,0 +1,8 @@ +package com.pouyaheydari.androidappupdater.store.domain + +import com.pouyaheydari.androidappupdater.store.domain.stores.AppStore + +data class ShowStoreModel( + val store: AppStore = StoreFactory.getGooglePlayStore(""), + val errorCallBack: (String) -> Unit = {}, +) diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreFactory.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreFactory.kt index d812e0da..0d61ec8e 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreFactory.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreFactory.kt @@ -1,21 +1,21 @@ package com.pouyaheydari.androidappupdater.store.domain -import com.pouyaheydari.androidappupdater.store.stores.AmazonAppStore -import com.pouyaheydari.androidappupdater.store.stores.Aptoide -import com.pouyaheydari.androidappupdater.store.stores.CafeBazaarStore -import com.pouyaheydari.androidappupdater.store.stores.FDroid -import com.pouyaheydari.androidappupdater.store.stores.GooglePlayStore -import com.pouyaheydari.androidappupdater.store.stores.HuaweiAppGallery -import com.pouyaheydari.androidappupdater.store.stores.LenovoAppCenter -import com.pouyaheydari.androidappupdater.store.stores.MiGetAppStore -import com.pouyaheydari.androidappupdater.store.stores.MyketStore -import com.pouyaheydari.androidappupdater.store.stores.NineApps -import com.pouyaheydari.androidappupdater.store.stores.OneStoreAppMarket -import com.pouyaheydari.androidappupdater.store.stores.OppoAppMarket -import com.pouyaheydari.androidappupdater.store.stores.SamsungGalaxyStore -import com.pouyaheydari.androidappupdater.store.stores.TencentAppStore -import com.pouyaheydari.androidappupdater.store.stores.VAppStore -import com.pouyaheydari.androidappupdater.store.stores.ZTEAppCenter +import com.pouyaheydari.androidappupdater.store.domain.stores.AmazonAppStore +import com.pouyaheydari.androidappupdater.store.domain.stores.Aptoide +import com.pouyaheydari.androidappupdater.store.domain.stores.CafeBazaarStore +import com.pouyaheydari.androidappupdater.store.domain.stores.FDroid +import com.pouyaheydari.androidappupdater.store.domain.stores.GooglePlayStore +import com.pouyaheydari.androidappupdater.store.domain.stores.HuaweiAppGallery +import com.pouyaheydari.androidappupdater.store.domain.stores.LenovoAppCenter +import com.pouyaheydari.androidappupdater.store.domain.stores.MiGetAppStore +import com.pouyaheydari.androidappupdater.store.domain.stores.MyketStore +import com.pouyaheydari.androidappupdater.store.domain.stores.NineApps +import com.pouyaheydari.androidappupdater.store.domain.stores.OneStoreAppMarket +import com.pouyaheydari.androidappupdater.store.domain.stores.OppoAppMarket +import com.pouyaheydari.androidappupdater.store.domain.stores.SamsungGalaxyStore +import com.pouyaheydari.androidappupdater.store.domain.stores.TencentAppStore +import com.pouyaheydari.androidappupdater.store.domain.stores.VAppStore +import com.pouyaheydari.androidappupdater.store.domain.stores.ZTEAppCenter /** * Enum class to select type of market diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreListItem.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreListItem.kt index 7bf43932..8e2d630b 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreListItem.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreListItem.kt @@ -3,7 +3,7 @@ package com.pouyaheydari.androidappupdater.store.domain import android.os.Parcel import android.os.Parcelable import androidx.core.os.ParcelCompat -import com.pouyaheydari.androidappupdater.store.stores.AppStore +import com.pouyaheydari.androidappupdater.store.domain.stores.AppStore import com.pouyaheydari.appupdater.core.R as coreR /** diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreManager.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreManager.kt index 32a7a38f..b6e97b9f 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreManager.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/StoreManager.kt @@ -3,7 +3,6 @@ package com.pouyaheydari.androidappupdater.store.domain import android.content.ActivityNotFoundException import android.content.Context import android.util.Log -import com.pouyaheydari.androidappupdater.store.ShowStoreModel import com.pouyaheydari.appupdater.core.utils.ANDROID_APP_UPDATER_DEBUG_TAG import java.util.Locale diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/AmazonAppStore.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/AmazonAppStore.kt similarity index 84% rename from store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/AmazonAppStore.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/AmazonAppStore.kt index 8b8338c1..dbcf23af 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/AmazonAppStore.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/AmazonAppStore.kt @@ -1,11 +1,11 @@ -package com.pouyaheydari.androidappupdater.store.stores +package com.pouyaheydari.androidappupdater.store.domain.stores import android.os.Parcel import android.os.Parcelable import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider -const val AMAZON_APP_STORE_URL = "amzn://apps/android?p=" -const val AMAZON_PACKAGE = "com.amazon.venezia" +internal const val AMAZON_APP_STORE_URL = "amzn://apps/android?p=" +internal const val AMAZON_PACKAGE = "com.amazon.venezia" /** * Opens application's page in [Amazon App Store](https://www.amazon.com/gp/mas/get/amazonapp) diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/AppStore.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/AppStore.kt similarity index 67% rename from store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/AppStore.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/AppStore.kt index 676f0661..b5ca59e8 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/AppStore.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/AppStore.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.androidappupdater.store.stores +package com.pouyaheydari.androidappupdater.store.domain.stores import android.content.Intent import android.os.Parcelable diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/Aptoide.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/Aptoide.kt similarity index 94% rename from store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/Aptoide.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/Aptoide.kt index c8662a06..2ce15bc7 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/Aptoide.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/Aptoide.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.androidappupdater.store.stores +package com.pouyaheydari.androidappupdater.store.domain.stores import android.os.Parcel import android.os.Parcelable diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/CafeBazaarStore.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/CafeBazaarStore.kt similarity index 94% rename from store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/CafeBazaarStore.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/CafeBazaarStore.kt index 6d987fb7..021fa7aa 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/CafeBazaarStore.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/CafeBazaarStore.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.androidappupdater.store.stores +package com.pouyaheydari.androidappupdater.store.domain.stores import android.os.Parcel import android.os.Parcelable diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/FDroid.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/FDroid.kt similarity index 94% rename from store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/FDroid.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/FDroid.kt index a70c9482..ff125567 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/FDroid.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/FDroid.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.androidappupdater.store.stores +package com.pouyaheydari.androidappupdater.store.domain.stores import android.os.Parcel import android.os.Parcelable diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/GooglePlayStore.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/GooglePlayStore.kt similarity index 94% rename from store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/GooglePlayStore.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/GooglePlayStore.kt index 11711948..9f79f12c 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/GooglePlayStore.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/GooglePlayStore.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.androidappupdater.store.stores +package com.pouyaheydari.androidappupdater.store.domain.stores import android.os.Parcel import android.os.Parcelable diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/HuaweiAppGallery.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/HuaweiAppGallery.kt similarity index 94% rename from store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/HuaweiAppGallery.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/HuaweiAppGallery.kt index 57a7330a..09a3be3d 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/HuaweiAppGallery.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/HuaweiAppGallery.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.androidappupdater.store.stores +package com.pouyaheydari.androidappupdater.store.domain.stores import android.os.Parcel import android.os.Parcelable diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/LenovoAppCenter.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/LenovoAppCenter.kt similarity index 94% rename from store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/LenovoAppCenter.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/LenovoAppCenter.kt index 6f9f889c..8166426d 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/LenovoAppCenter.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/LenovoAppCenter.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.androidappupdater.store.stores +package com.pouyaheydari.androidappupdater.store.domain.stores import android.os.Parcel import android.os.Parcelable diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/MiGetAppStore.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/MiGetAppStore.kt similarity index 94% rename from store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/MiGetAppStore.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/MiGetAppStore.kt index b34638d9..31deab4e 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/MiGetAppStore.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/MiGetAppStore.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.androidappupdater.store.stores +package com.pouyaheydari.androidappupdater.store.domain.stores import android.os.Parcel import android.os.Parcelable diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/MyketStore.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/MyketStore.kt similarity index 94% rename from store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/MyketStore.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/MyketStore.kt index c85faf07..8b59395d 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/MyketStore.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/MyketStore.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.androidappupdater.store.stores +package com.pouyaheydari.androidappupdater.store.domain.stores import android.os.Parcel import android.os.Parcelable diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/NineApps.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/NineApps.kt similarity index 94% rename from store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/NineApps.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/NineApps.kt index 6ce096c8..9d791720 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/NineApps.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/NineApps.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.androidappupdater.store.stores +package com.pouyaheydari.androidappupdater.store.domain.stores import android.os.Parcel import android.os.Parcelable diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/OneStoreAppMarket.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/OneStoreAppMarket.kt similarity index 94% rename from store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/OneStoreAppMarket.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/OneStoreAppMarket.kt index 43456832..0a9d8e86 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/OneStoreAppMarket.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/OneStoreAppMarket.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.androidappupdater.store.stores +package com.pouyaheydari.androidappupdater.store.domain.stores import android.os.Parcel import android.os.Parcelable diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/OppoAppMarket.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/OppoAppMarket.kt similarity index 94% rename from store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/OppoAppMarket.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/OppoAppMarket.kt index 8d59dbae..2a1df600 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/OppoAppMarket.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/OppoAppMarket.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.androidappupdater.store.stores +package com.pouyaheydari.androidappupdater.store.domain.stores import android.os.Parcel import android.os.Parcelable diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/SamsungGalaxyStore.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/SamsungGalaxyStore.kt similarity index 94% rename from store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/SamsungGalaxyStore.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/SamsungGalaxyStore.kt index 9c923f40..39952725 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/SamsungGalaxyStore.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/SamsungGalaxyStore.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.androidappupdater.store.stores +package com.pouyaheydari.androidappupdater.store.domain.stores import android.os.Parcel import android.os.Parcelable diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/TencentAppStore.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/TencentAppStore.kt similarity index 87% rename from store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/TencentAppStore.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/TencentAppStore.kt index 50f80d0a..ca051b5e 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/TencentAppStore.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/TencentAppStore.kt @@ -1,10 +1,10 @@ -package com.pouyaheydari.androidappupdater.store.stores +package com.pouyaheydari.androidappupdater.store.domain.stores import android.os.Parcel import android.os.Parcelable import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider -const val TENCENT_APP_STORE_URL = "tmast://appdetails?pname=" +internal const val TENCENT_APP_STORE_URL = "tmast://appdetails?pname=" /** * Opens application's page in [Tencent App Store](https://appstore.tencent.com/) diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/VAppStore.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/VAppStore.kt similarity index 87% rename from store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/VAppStore.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/VAppStore.kt index 23e22743..573bd529 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/VAppStore.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/VAppStore.kt @@ -1,10 +1,10 @@ -package com.pouyaheydari.androidappupdater.store.stores +package com.pouyaheydari.androidappupdater.store.domain.stores import android.os.Parcel import android.os.Parcelable import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider -const val V_APP_STORE_URL = "vivoMarket://details?id=" +internal const val V_APP_STORE_URL = "vivoMarket://details?id=" /** * Opens application's page in [V-AppStore](https://developer.vivo.com/home) diff --git a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/ZTEAppCenter.kt b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/ZTEAppCenter.kt similarity index 87% rename from store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/ZTEAppCenter.kt rename to store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/ZTEAppCenter.kt index 6b266e83..9e04898f 100644 --- a/store/src/main/java/com/pouyaheydari/androidappupdater/store/stores/ZTEAppCenter.kt +++ b/store/src/main/java/com/pouyaheydari/androidappupdater/store/domain/stores/ZTEAppCenter.kt @@ -1,10 +1,10 @@ -package com.pouyaheydari.androidappupdater.store.stores +package com.pouyaheydari.androidappupdater.store.domain.stores import android.os.Parcel import android.os.Parcelable import com.pouyaheydari.androidappupdater.store.domain.StoreIntentProvider -const val ZTE_APP_CENTER_URL = "zte_market://appdetails?pname=" +internal const val ZTE_APP_CENTER_URL = "zte_market://appdetails?pname=" /** * Opens application's page in [ZTE App Store](https://apps.ztems.com/) From d0a26c4a5218ad7201182b87b2e1d7305181e330 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Thu, 11 Apr 2024 16:14:44 +0200 Subject: [PATCH 025/117] Fixed packaging in androidTest according to the source packaging --- .../store/{utils => domain}/StoreIntentProviderTest.kt | 2 +- .../appupdater/store/{ => domain}/stores/AmazonAppStoreTest.kt | 2 +- .../appupdater/store/{ => domain}/stores/AptoideTest.kt | 2 +- .../appupdater/store/{ => domain}/stores/CafeBazaarStoreTest.kt | 2 +- .../appupdater/store/{ => domain}/stores/FDroidTest.kt | 2 +- .../appupdater/store/{ => domain}/stores/GooglePlayStoreTest.kt | 2 +- .../store/{ => domain}/stores/HuaweiAppGalleryTest.kt | 2 +- .../appupdater/store/{ => domain}/stores/LenovoAppCenterTest.kt | 2 +- .../appupdater/store/{ => domain}/stores/MiGetAppStoreTest.kt | 2 +- .../appupdater/store/{ => domain}/stores/MyketStoreTest.kt | 2 +- .../appupdater/store/{ => domain}/stores/NineAppsTest.kt | 2 +- .../store/{ => domain}/stores/OneStoreAppMarketTest.kt | 2 +- .../appupdater/store/{ => domain}/stores/OppoAppMarketTest.kt | 2 +- .../store/{ => domain}/stores/SamsungGalaxyStoreTest.kt | 2 +- .../appupdater/store/{ => domain}/stores/TencentStoreTest.kt | 2 +- .../appupdater/store/{ => domain}/stores/VAppStoreTest.kt | 2 +- .../appupdater/store/{ => domain}/stores/ZTEAppCenterTest.kt | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) rename store/src/androidTest/java/com/pouyaheydari/appupdater/store/{utils => domain}/StoreIntentProviderTest.kt (97%) rename store/src/androidTest/java/com/pouyaheydari/appupdater/store/{ => domain}/stores/AmazonAppStoreTest.kt (96%) rename store/src/androidTest/java/com/pouyaheydari/appupdater/store/{ => domain}/stores/AptoideTest.kt (96%) rename store/src/androidTest/java/com/pouyaheydari/appupdater/store/{ => domain}/stores/CafeBazaarStoreTest.kt (96%) rename store/src/androidTest/java/com/pouyaheydari/appupdater/store/{ => domain}/stores/FDroidTest.kt (96%) rename store/src/androidTest/java/com/pouyaheydari/appupdater/store/{ => domain}/stores/GooglePlayStoreTest.kt (96%) rename store/src/androidTest/java/com/pouyaheydari/appupdater/store/{ => domain}/stores/HuaweiAppGalleryTest.kt (96%) rename store/src/androidTest/java/com/pouyaheydari/appupdater/store/{ => domain}/stores/LenovoAppCenterTest.kt (95%) rename store/src/androidTest/java/com/pouyaheydari/appupdater/store/{ => domain}/stores/MiGetAppStoreTest.kt (95%) rename store/src/androidTest/java/com/pouyaheydari/appupdater/store/{ => domain}/stores/MyketStoreTest.kt (96%) rename store/src/androidTest/java/com/pouyaheydari/appupdater/store/{ => domain}/stores/NineAppsTest.kt (96%) rename store/src/androidTest/java/com/pouyaheydari/appupdater/store/{ => domain}/stores/OneStoreAppMarketTest.kt (95%) rename store/src/androidTest/java/com/pouyaheydari/appupdater/store/{ => domain}/stores/OppoAppMarketTest.kt (96%) rename store/src/androidTest/java/com/pouyaheydari/appupdater/store/{ => domain}/stores/SamsungGalaxyStoreTest.kt (95%) rename store/src/androidTest/java/com/pouyaheydari/appupdater/store/{ => domain}/stores/TencentStoreTest.kt (95%) rename store/src/androidTest/java/com/pouyaheydari/appupdater/store/{ => domain}/stores/VAppStoreTest.kt (95%) rename store/src/androidTest/java/com/pouyaheydari/appupdater/store/{ => domain}/stores/ZTEAppCenterTest.kt (95%) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/utils/StoreIntentProviderTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/StoreIntentProviderTest.kt similarity index 97% rename from store/src/androidTest/java/com/pouyaheydari/appupdater/store/utils/StoreIntentProviderTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/StoreIntentProviderTest.kt index 7a525190..00b14494 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/utils/StoreIntentProviderTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/StoreIntentProviderTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.store.utils +package com.pouyaheydari.appupdater.store.domain import android.content.Intent import android.net.Uri diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/AmazonAppStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/AmazonAppStoreTest.kt similarity index 96% rename from store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/AmazonAppStoreTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/AmazonAppStoreTest.kt index d214716a..401841c0 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/AmazonAppStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/AmazonAppStoreTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.store.stores +package com.pouyaheydari.appupdater.store.domain.stores import android.net.Uri import androidx.test.espresso.intent.Intents diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/AptoideTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/AptoideTest.kt similarity index 96% rename from store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/AptoideTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/AptoideTest.kt index 3638e249..8aff64d1 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/AptoideTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/AptoideTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.store.stores +package com.pouyaheydari.appupdater.store.domain.stores import android.net.Uri import androidx.test.espresso.intent.Intents diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/CafeBazaarStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/CafeBazaarStoreTest.kt similarity index 96% rename from store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/CafeBazaarStoreTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/CafeBazaarStoreTest.kt index d2aae02d..7de5d517 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/CafeBazaarStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/CafeBazaarStoreTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.store.stores +package com.pouyaheydari.appupdater.store.domain.stores import android.net.Uri import androidx.test.espresso.intent.Intents diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/FDroidTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/FDroidTest.kt similarity index 96% rename from store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/FDroidTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/FDroidTest.kt index 04bb681c..de980b1e 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/FDroidTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/FDroidTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.store.stores +package com.pouyaheydari.appupdater.store.domain.stores import android.net.Uri import androidx.test.espresso.intent.Intents diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/GooglePlayStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/GooglePlayStoreTest.kt similarity index 96% rename from store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/GooglePlayStoreTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/GooglePlayStoreTest.kt index 4836f67f..c4868031 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/GooglePlayStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/GooglePlayStoreTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.store.stores +package com.pouyaheydari.appupdater.store.domain.stores import android.net.Uri import androidx.test.espresso.intent.Intents diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/HuaweiAppGalleryTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/HuaweiAppGalleryTest.kt similarity index 96% rename from store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/HuaweiAppGalleryTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/HuaweiAppGalleryTest.kt index d4decbdf..e3e7e223 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/HuaweiAppGalleryTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/HuaweiAppGalleryTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.store.stores +package com.pouyaheydari.appupdater.store.domain.stores import android.net.Uri import androidx.test.espresso.intent.Intents diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/LenovoAppCenterTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/LenovoAppCenterTest.kt similarity index 95% rename from store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/LenovoAppCenterTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/LenovoAppCenterTest.kt index 0564892e..0dd681c4 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/LenovoAppCenterTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/LenovoAppCenterTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.store.stores +package com.pouyaheydari.appupdater.store.domain.stores import android.net.Uri import androidx.test.espresso.intent.Intents diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/MiGetAppStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/MiGetAppStoreTest.kt similarity index 95% rename from store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/MiGetAppStoreTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/MiGetAppStoreTest.kt index f01667e1..6ee631c3 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/MiGetAppStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/MiGetAppStoreTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.store.stores +package com.pouyaheydari.appupdater.store.domain.stores import android.net.Uri import androidx.test.espresso.intent.Intents diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/MyketStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/MyketStoreTest.kt similarity index 96% rename from store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/MyketStoreTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/MyketStoreTest.kt index 659472d4..0267fd38 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/MyketStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/MyketStoreTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.store.stores +package com.pouyaheydari.appupdater.store.domain.stores import android.net.Uri import androidx.test.espresso.intent.Intents diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/NineAppsTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/NineAppsTest.kt similarity index 96% rename from store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/NineAppsTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/NineAppsTest.kt index f9a4ad11..e5990bf1 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/NineAppsTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/NineAppsTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.store.stores +package com.pouyaheydari.appupdater.store.domain.stores import android.net.Uri import androidx.test.espresso.intent.Intents diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/OneStoreAppMarketTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/OneStoreAppMarketTest.kt similarity index 95% rename from store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/OneStoreAppMarketTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/OneStoreAppMarketTest.kt index 4afd2037..5adbc238 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/OneStoreAppMarketTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/OneStoreAppMarketTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.store.stores +package com.pouyaheydari.appupdater.store.domain.stores import android.net.Uri import androidx.test.espresso.intent.Intents diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/OppoAppMarketTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/OppoAppMarketTest.kt similarity index 96% rename from store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/OppoAppMarketTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/OppoAppMarketTest.kt index 99d9b6e1..ed2e2620 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/OppoAppMarketTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/OppoAppMarketTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.store.stores +package com.pouyaheydari.appupdater.store.domain.stores import android.net.Uri import androidx.test.espresso.intent.Intents diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/SamsungGalaxyStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/SamsungGalaxyStoreTest.kt similarity index 95% rename from store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/SamsungGalaxyStoreTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/SamsungGalaxyStoreTest.kt index 690385c3..4956e2b8 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/SamsungGalaxyStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/SamsungGalaxyStoreTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.store.stores +package com.pouyaheydari.appupdater.store.domain.stores import android.net.Uri import androidx.test.espresso.intent.Intents diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/TencentStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/TencentStoreTest.kt similarity index 95% rename from store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/TencentStoreTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/TencentStoreTest.kt index 796b99bc..1c42a53f 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/TencentStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/TencentStoreTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.store.stores +package com.pouyaheydari.appupdater.store.domain.stores import android.net.Uri import androidx.test.espresso.intent.Intents diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/VAppStoreTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/VAppStoreTest.kt similarity index 95% rename from store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/VAppStoreTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/VAppStoreTest.kt index 82333aaa..d3783b1c 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/VAppStoreTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/VAppStoreTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.store.stores +package com.pouyaheydari.appupdater.store.domain.stores import android.net.Uri import androidx.test.espresso.intent.Intents diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/ZTEAppCenterTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/ZTEAppCenterTest.kt similarity index 95% rename from store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/ZTEAppCenterTest.kt rename to store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/ZTEAppCenterTest.kt index e269ecde..11d1be48 100644 --- a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/stores/ZTEAppCenterTest.kt +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/stores/ZTEAppCenterTest.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.store.stores +package com.pouyaheydari.appupdater.store.domain.stores import android.net.Uri import androidx.test.espresso.intent.Intents From d10a02e8e2057bca70954fdd69e58ddbac89bf40 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Thu, 11 Apr 2024 16:23:19 +0200 Subject: [PATCH 026/117] Added tests for StoreFactory --- .../store/domain/StoreFactoryTest.kt | 183 ++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 store/src/test/java/com/pouyaheydari/appupdater/store/domain/StoreFactoryTest.kt diff --git a/store/src/test/java/com/pouyaheydari/appupdater/store/domain/StoreFactoryTest.kt b/store/src/test/java/com/pouyaheydari/appupdater/store/domain/StoreFactoryTest.kt new file mode 100644 index 00000000..317ec4cf --- /dev/null +++ b/store/src/test/java/com/pouyaheydari/appupdater/store/domain/StoreFactoryTest.kt @@ -0,0 +1,183 @@ +package com.pouyaheydari.appupdater.store.domain + +import com.pouyaheydari.androidappupdater.store.domain.StoreFactory +import com.pouyaheydari.androidappupdater.store.domain.stores.AmazonAppStore +import com.pouyaheydari.androidappupdater.store.domain.stores.Aptoide +import com.pouyaheydari.androidappupdater.store.domain.stores.CafeBazaarStore +import com.pouyaheydari.androidappupdater.store.domain.stores.FDroid +import com.pouyaheydari.androidappupdater.store.domain.stores.GooglePlayStore +import com.pouyaheydari.androidappupdater.store.domain.stores.HuaweiAppGallery +import com.pouyaheydari.androidappupdater.store.domain.stores.LenovoAppCenter +import com.pouyaheydari.androidappupdater.store.domain.stores.MiGetAppStore +import com.pouyaheydari.androidappupdater.store.domain.stores.MyketStore +import com.pouyaheydari.androidappupdater.store.domain.stores.NineApps +import com.pouyaheydari.androidappupdater.store.domain.stores.OneStoreAppMarket +import com.pouyaheydari.androidappupdater.store.domain.stores.OppoAppMarket +import com.pouyaheydari.androidappupdater.store.domain.stores.SamsungGalaxyStore +import com.pouyaheydari.androidappupdater.store.domain.stores.TencentAppStore +import com.pouyaheydari.androidappupdater.store.domain.stores.VAppStore +import com.pouyaheydari.androidappupdater.store.domain.stores.ZTEAppCenter +import org.junit.Assert.assertEquals +import org.junit.Test + +class StoreFactoryTest { + @Test + fun `whenever getGooglePlayStore is called, then proper instance gets returned`() { + val packageName = "PackageName" + val expected = GooglePlayStore(packageName) + + val result = StoreFactory.getGooglePlayStore(packageName) + + assertEquals(expected, result) + } + + @Test + fun `whenever getAmazonAppStore is called, then proper instance gets returned`() { + val packageName = "PackageName" + val expected = AmazonAppStore(packageName) + + val result = StoreFactory.getAmazonAppStore(packageName) + + assertEquals(expected, result) + } + + @Test + fun `whenever getAptoideStore is called, then proper instance gets returned`() { + val packageName = "PackageName" + val expected = Aptoide(packageName) + + val result = StoreFactory.getAptoideStore(packageName) + + assertEquals(expected, result) + } + + @Test + fun `whenever getCafeBazaarStore is called, then proper instance gets returned`() { + val packageName = "PackageName" + val expected = CafeBazaarStore(packageName) + + val result = StoreFactory.getCafeBazaarStore(packageName) + + assertEquals(expected, result) + } + + @Test + fun `whenever getFdroidStore is called, then proper instance gets returned`() { + val packageName = "PackageName" + val expected = FDroid(packageName) + + val result = StoreFactory.getFdroidStore(packageName) + + assertEquals(expected, result) + } + + @Test + fun `whenever getHuaweiAppGalleryStore is called, then proper instance gets returned`() { + val packageName = "PackageName" + val expected = HuaweiAppGallery(packageName) + + val result = StoreFactory.getHuaweiAppGalleryStore(packageName) + + assertEquals(expected, result) + } + + @Test + fun `whenever getLenovoAppCenterStore is called, then proper instance gets returned`() { + val packageName = "PackageName" + val expected = LenovoAppCenter(packageName) + + val result = StoreFactory.getLenovoAppCenterStore(packageName) + + assertEquals(expected, result) + } + + @Test + fun `whenever getMiStore is called, then proper instance gets returned`() { + val packageName = "PackageName" + val expected = MiGetAppStore(packageName) + + val result = StoreFactory.getMiStore(packageName) + + assertEquals(expected, result) + } + + @Test + fun `whenever getMyketStore is called, then proper instance gets returned`() { + val packageName = "PackageName" + val expected = MyketStore(packageName) + + val result = StoreFactory.getMyketStore(packageName) + + assertEquals(expected, result) + } + + @Test + fun `whenever getNineAppsStore is called, then proper instance gets returned`() { + val packageName = "PackageName" + val expected = NineApps(packageName) + + val result = StoreFactory.getNineAppsStore(packageName) + + assertEquals(expected, result) + } + + @Test + fun `whenever getOneStore is called, then proper instance gets returned`() { + val packageName = "PackageName" + val expected = OneStoreAppMarket(packageName) + + val result = StoreFactory.getOneStore(packageName) + + assertEquals(expected, result) + } + + @Test + fun `whenever getOppoAppMarketStore is called, then proper instance gets returned`() { + val packageName = "PackageName" + val expected = OppoAppMarket(packageName) + + val result = StoreFactory.getOppoAppMarketStore(packageName) + + assertEquals(expected, result) + } + + @Test + fun `whenever getSamsungGalaxyStore is called, then proper instance gets returned`() { + val packageName = "PackageName" + val expected = SamsungGalaxyStore(packageName) + + val result = StoreFactory.getSamsungGalaxyStore(packageName) + + assertEquals(expected, result) + } + + @Test + fun `whenever getTencentAppStore is called, then proper instance gets returned`() { + val packageName = "PackageName" + val expected = TencentAppStore(packageName) + + val result = StoreFactory.getTencentAppStore(packageName) + + assertEquals(expected, result) + } + + @Test + fun `whenever getVAppStore is called, then proper instance gets returned`() { + val packageName = "PackageName" + val expected = VAppStore(packageName) + + val result = StoreFactory.getVAppStore(packageName) + + assertEquals(expected, result) + } + + @Test + fun `whenever getZTEStore is called, then proper instance gets returned`() { + val packageName = "PackageName" + val expected = ZTEAppCenter(packageName) + + val result = StoreFactory.getZTEStore(packageName) + + assertEquals(expected, result) + } +} From b6f3906f55c0ecea79cbb20fc27b9a5e41d12dd3 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Thu, 11 Apr 2024 17:23:02 +0200 Subject: [PATCH 027/117] Added tests for StoreManager --- gradle/libs.versions.toml | 1 + store/build.gradle.kts | 2 + .../store/domain/StoreManagerTest.kt | 49 +++++++++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/StoreManagerTest.kt diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 38b502b0..69bb9843 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -42,6 +42,7 @@ androidx-compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-toolin androidx-compose-activity = { group = "androidx.activity", name = "activity-compose", version.ref = "composeActivity" } junit4 = { group = "junit", name = "junit", version.ref = "junit4" } mockito = { group = "org.mockito", name = "mockito-core", version.ref = "mockito" } +mockito-android = {group = "org.mockito", name = "mockito-android", version.ref = "mockito"} mockito-kotlin = { group = "org.mockito.kotlin", name = "mockito-kotlin", version.ref = "mockitoKotlin" } androidx-test-ui-espresso-intents = { group = "androidx.test.espresso", name = "espresso-intents", version.ref = "androidTestEspresso" } androidx-test-junit = { group = "androidx.test.ext", name = "junit", version.ref = "androidTestJUnit" } diff --git a/store/build.gradle.kts b/store/build.gradle.kts index 46803c5f..818522cc 100644 --- a/store/build.gradle.kts +++ b/store/build.gradle.kts @@ -41,6 +41,8 @@ dependencies { testImplementation(libs.junit4) testImplementation(libs.mockito) testImplementation(libs.mockito.kotlin) + androidTestImplementation(libs.mockito.kotlin) + androidTestImplementation(libs.mockito.android) androidTestImplementation(libs.androidx.test.junit) androidTestImplementation(libs.androidx.test.rules) androidTestImplementation(libs.androidx.test.ui.espresso.core) diff --git a/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/StoreManagerTest.kt b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/StoreManagerTest.kt new file mode 100644 index 00000000..3e524050 --- /dev/null +++ b/store/src/androidTest/java/com/pouyaheydari/appupdater/store/domain/StoreManagerTest.kt @@ -0,0 +1,49 @@ +package com.pouyaheydari.appupdater.store.domain + +import android.content.ActivityNotFoundException +import android.content.Context +import androidx.test.espresso.intent.Intents +import androidx.test.espresso.intent.matcher.IntentMatchers +import androidx.test.espresso.intent.rule.IntentsRule +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import com.pouyaheydari.androidappupdater.store.domain.ShowStoreModel +import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore +import com.pouyaheydari.androidappupdater.store.domain.stores.GooglePlayStore +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.kotlin.any +import org.mockito.kotlin.mock +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever + +@RunWith(AndroidJUnit4::class) +class StoreManagerTest { + @get:Rule + val intentsTestRule = IntentsRule() + + @Test + fun test_showAppInSelectedStore_sendsCorrectIntent() { + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + val packageName = "PackageName" + val store = GooglePlayStore(packageName) + val storeModel = ShowStoreModel(store = store, errorCallBack = {}) + + showAppInSelectedStore(appContext, storeModel) + + Intents.intended(IntentMatchers.filterEquals(store.getIntent())) + } + + @Test + fun test_showAppInSelectedStore_storeNotInstalled_invokesErrorCallback() { + val callback: (String) -> Unit = mock() + val storeModel = ShowStoreModel(store = GooglePlayStore("PackageName"), errorCallBack = callback) + val context: Context = mock() + whenever(context.startActivity(any())).thenThrow(ActivityNotFoundException::class.java) + + showAppInSelectedStore(context, storeModel) + + verify(callback).invoke(any()) + } +} From ac1b37b71c51dc2f7eb6b420811cb1627a307cee Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Thu, 11 Apr 2024 17:28:27 +0200 Subject: [PATCH 028/117] Updated agp version --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 69bb9843..bc531f97 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,7 +4,7 @@ compileSdkVersion = "34" minSdkVersion = "16" composeMinSdkVersion = "21" targetSdkVersion = "34" -agp = "8.3.0" +agp = "8.3.1" kotlin = "1.9.22" appcompat = "1.6.1" androidXCore = "1.12.0" From d7d188313812d735e9c15f6222ba23e44255d67a Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Thu, 11 Apr 2024 17:28:51 +0200 Subject: [PATCH 029/117] Updated mockito version --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index bc531f97..796a16fc 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -20,7 +20,7 @@ coroutines = "1.7.3" fragment = "1.6.2" androidxComposeBom = "2024.02.01" composeActivity = "1.8.2" -mockito = "5.10.0" +mockito = "5.11.0" mockitoKotlin = "5.2.1" [libraries] From 7d0d3b5d2a15627d1f60057e2b1e28262e38ba3f Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Thu, 11 Apr 2024 17:31:00 +0200 Subject: [PATCH 030/117] Updated agp version --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 796a16fc..18b37630 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,7 +4,7 @@ compileSdkVersion = "34" minSdkVersion = "16" composeMinSdkVersion = "21" targetSdkVersion = "34" -agp = "8.3.1" +agp = "8.3.2" kotlin = "1.9.22" appcompat = "1.6.1" androidXCore = "1.12.0" From 6e5ac128c3eabe83ab03cd184b3ec80c3871d333 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Thu, 11 Apr 2024 17:32:01 +0200 Subject: [PATCH 031/117] Updated coroutines version --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 18b37630..4a70d066 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -16,7 +16,7 @@ androidTestEspresso = "3.5.1" recyclerView = "1.3.2" composeCompilerExtension = "1.5.10" lifecycle = "2.7.0" -coroutines = "1.7.3" +coroutines = "1.8.0" fragment = "1.6.2" androidxComposeBom = "2024.02.01" composeActivity = "1.8.2" From 102bb74d5fe1a9a6992293158291e93d60676a00 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Thu, 11 Apr 2024 17:37:37 +0200 Subject: [PATCH 032/117] Updated compose and kotlin version --- gradle/libs.versions.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4a70d066..2d9280c6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ minSdkVersion = "16" composeMinSdkVersion = "21" targetSdkVersion = "34" agp = "8.3.2" -kotlin = "1.9.22" +kotlin = "1.9.23" appcompat = "1.6.1" androidXCore = "1.12.0" constraintLayout = "2.1.4" @@ -14,11 +14,11 @@ androidTestJUnit = "1.1.5" androidTestRules = "1.5.0" androidTestEspresso = "3.5.1" recyclerView = "1.3.2" -composeCompilerExtension = "1.5.10" +composeCompilerExtension = "1.5.11" lifecycle = "2.7.0" coroutines = "1.8.0" fragment = "1.6.2" -androidxComposeBom = "2024.02.01" +androidxComposeBom = "2024.04.00" composeActivity = "1.8.2" mockito = "5.11.0" mockitoKotlin = "5.2.1" From fa174b5a37b2bd357bb1c9607fcb52e9edd584da Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Thu, 11 Apr 2024 17:43:40 +0200 Subject: [PATCH 033/117] Removed kotlin reflect dependency --- gradle/libs.versions.toml | 1 - store/build.gradle.kts | 3 --- 2 files changed, 4 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2d9280c6..5a1d6fbc 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -26,7 +26,6 @@ mockitoKotlin = "5.2.1" [libraries] agp = { module = "com.android.tools.build:gradle", version.ref = "agp" } kotlin-gradle-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } -kotlin-reflect = { group = "org.jetbrains.kotlin", name = "kotlin-reflect", version.ref = "kotlin" } androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } androidx-constraintLayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintLayout" } androidx-recyclerView = { group = "androidx.recyclerview", name = "recyclerview", version.ref = "recyclerView" } diff --git a/store/build.gradle.kts b/store/build.gradle.kts index 818522cc..6d6ad1af 100644 --- a/store/build.gradle.kts +++ b/store/build.gradle.kts @@ -34,13 +34,10 @@ java { dependencies { api(project(":core")) - implementation(libs.kotlin.reflect) implementation(libs.androidx.core) // testing testImplementation(libs.junit4) - testImplementation(libs.mockito) - testImplementation(libs.mockito.kotlin) androidTestImplementation(libs.mockito.kotlin) androidTestImplementation(libs.mockito.android) androidTestImplementation(libs.androidx.test.junit) From 05cf2990d39ed0c46ce077dd3759625cd5282fd5 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Thu, 11 Apr 2024 17:44:14 +0200 Subject: [PATCH 034/117] Updated mockito kotlin version --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5a1d6fbc..ee635ef4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -21,7 +21,7 @@ fragment = "1.6.2" androidxComposeBom = "2024.04.00" composeActivity = "1.8.2" mockito = "5.11.0" -mockitoKotlin = "5.2.1" +mockitoKotlin = "5.3.1" [libraries] agp = { module = "com.android.tools.build:gradle", version.ref = "agp" } From 802e5f125f4f0735b0cc1ae87ea23f63b6563e21 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Mon, 15 Apr 2024 14:33:31 +0200 Subject: [PATCH 035/117] Moved utils package inside ui package --- .../compose/ui/AndroidAppUpdaterScreen.kt | 33 ++++++++++++++++--- .../components/AppUpdaterDialogComponent.kt | 4 +-- .../{ => ui}/utils/AppUpdaterPreviewData.kt | 2 +- .../compose/utils/ActivityResolver.kt | 17 ---------- .../utils/GetApkIfActivityIsNotNull.kt | 14 -------- .../compose/utils/IsDarkThemeSelected.kt | 15 --------- 6 files changed, 31 insertions(+), 54 deletions(-) rename compose/src/main/java/com/pouyaheydari/appupdater/compose/{ => ui}/utils/AppUpdaterPreviewData.kt (98%) delete mode 100644 compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/ActivityResolver.kt delete mode 100644 compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/GetApkIfActivityIsNotNull.kt delete mode 100644 compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/IsDarkThemeSelected.kt diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt index 7c99bd2b..e9b83d5a 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt @@ -2,6 +2,9 @@ package com.pouyaheydari.appupdater.compose.ui import android.app.Activity import android.content.Context +import android.content.ContextWrapper +import android.util.Log +import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource @@ -9,6 +12,7 @@ import androidx.compose.ui.tooling.preview.PreviewFontScale import androidx.compose.ui.tooling.preview.PreviewScreenSizes import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel +import com.pouyaheydari.androidappupdater.directdownload.utils.getApk import com.pouyaheydari.androidappupdater.store.domain.ShowStoreModel import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore import com.pouyaheydari.appupdater.compose.ui.components.AppUpdaterDialog @@ -17,12 +21,10 @@ import com.pouyaheydari.appupdater.compose.ui.models.DialogScreenIntents import com.pouyaheydari.appupdater.compose.ui.models.ErrorWhileOpeningStore import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogData import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme -import com.pouyaheydari.appupdater.compose.utils.getActivity -import com.pouyaheydari.appupdater.compose.utils.getApkIfActivityIsNotNull -import com.pouyaheydari.appupdater.compose.utils.isDarkThemeSelected -import com.pouyaheydari.appupdater.compose.utils.previewDirectDownloadListData -import com.pouyaheydari.appupdater.compose.utils.previewStoreListData +import com.pouyaheydari.appupdater.compose.ui.utils.previewDirectDownloadListData +import com.pouyaheydari.appupdater.compose.ui.utils.previewStoreListData import com.pouyaheydari.appupdater.core.model.Theme +import com.pouyaheydari.appupdater.core.utils.ANDROID_APP_UPDATER_DEBUG_TAG import com.pouyaheydari.appupdater.core.R as coreR /** @@ -67,6 +69,13 @@ fun AndroidAppUpdater(dialogData: UpdaterDialogData) { } } +@Composable +private fun isDarkThemeSelected(theme: Theme): Boolean = when (theme) { + Theme.DARK -> true + Theme.LIGHT -> false + Theme.SYSTEM_DEFAULT -> isSystemInDarkTheme() +} + private fun setupErrorCallback( errorWhileOpeningStore: ErrorWhileOpeningStore, callback: (String) -> Unit, @@ -91,6 +100,20 @@ private fun setupDirectApkDownload( } } +private fun getApkIfActivityIsNotNull(activity: Activity?, url: String, onDownloadingApkStarted: () -> Unit) { + if (activity == null) { + Log.e(ANDROID_APP_UPDATER_DEBUG_TAG, "Provided activity is null. Skipping downloading the apk") + } else { + getApk(url, activity, onDownloadingApkStarted) + } +} + +private fun Context.getActivity(): Activity? = when (this) { + is Activity -> this + is ContextWrapper -> baseContext.getActivity() + else -> null +} + private fun setupStoreOpener(store: ShowStoreModel, shouldOpenStore: Boolean, context: Context?, onStoreOpenedListener: () -> Unit) { if (shouldOpenStore) { showAppInSelectedStore(context, store) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt index f8bef9c3..1c0c9a3b 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt @@ -23,8 +23,8 @@ import com.pouyaheydari.androidappupdater.store.domain.StoreListItem import com.pouyaheydari.appupdater.compose.ui.models.DialogHeaderModel import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogUIData import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme -import com.pouyaheydari.appupdater.compose.utils.previewDirectDownloadListData -import com.pouyaheydari.appupdater.compose.utils.previewStoreListData +import com.pouyaheydari.appupdater.compose.ui.utils.previewDirectDownloadListData +import com.pouyaheydari.appupdater.compose.ui.utils.previewStoreListData import com.pouyaheydari.appupdater.core.R @Composable diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/AppUpdaterPreviewData.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/utils/AppUpdaterPreviewData.kt similarity index 98% rename from compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/AppUpdaterPreviewData.kt rename to compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/utils/AppUpdaterPreviewData.kt index 236f6ec7..86ec4fba 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/AppUpdaterPreviewData.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/utils/AppUpdaterPreviewData.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.appupdater.compose.utils +package com.pouyaheydari.appupdater.compose.ui.utils import com.pouyaheydari.androidappupdater.directdownload.data.model.DirectDownloadListItem import com.pouyaheydari.androidappupdater.store.domain.StoreFactory diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/ActivityResolver.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/ActivityResolver.kt deleted file mode 100644 index e53a977f..00000000 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/ActivityResolver.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.pouyaheydari.appupdater.compose.utils - -import android.app.Activity -import android.content.Context -import android.content.ContextWrapper -import androidx.compose.ui.platform.LocalContext - -/** - * Tries to return an [Activity] instance from the compose [LocalContext] - * - * @return Either an [Activity] instance or null - */ -internal fun Context.getActivity(): Activity? = when (this) { - is Activity -> this - is ContextWrapper -> baseContext.getActivity() - else -> null -} diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/GetApkIfActivityIsNotNull.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/GetApkIfActivityIsNotNull.kt deleted file mode 100644 index 6dd100b9..00000000 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/GetApkIfActivityIsNotNull.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.pouyaheydari.appupdater.compose.utils - -import android.app.Activity -import android.util.Log -import com.pouyaheydari.androidappupdater.directdownload.utils.getApk -import com.pouyaheydari.appupdater.core.utils.ANDROID_APP_UPDATER_DEBUG_TAG - -fun getApkIfActivityIsNotNull(activity: Activity?, url: String, onDownloadingApkStarted: () -> Unit) { - if (activity == null) { - Log.e(ANDROID_APP_UPDATER_DEBUG_TAG, "Provided activity is null. Skipping downloading the apk") - } else { - getApk(url, activity, onDownloadingApkStarted) - } -} diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/IsDarkThemeSelected.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/IsDarkThemeSelected.kt deleted file mode 100644 index 2e259e1d..00000000 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/utils/IsDarkThemeSelected.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.pouyaheydari.appupdater.compose.utils - -import androidx.compose.foundation.isSystemInDarkTheme -import androidx.compose.runtime.Composable -import com.pouyaheydari.appupdater.core.model.Theme - -/** - * Returns if the dialog should be shown in dark mode based on the user selected [theme] - */ -@Composable -internal fun isDarkThemeSelected(theme: Theme): Boolean = when (theme) { - Theme.DARK -> true - Theme.LIGHT -> false - Theme.SYSTEM_DEFAULT -> isSystemInDarkTheme() -} From 743e74283951d089c3e9ebee316176185f7896e0 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Mon, 15 Apr 2024 15:56:17 +0200 Subject: [PATCH 036/117] Updated compose previews --- .../ui/components/AppUpdaterDialogComponent.kt | 10 +++++++--- .../compose/ui/components/DialogHeaderComponent.kt | 13 +++++++++---- .../ui/components/DirectDownloadLinkComponent.kt | 8 +++++--- .../compose/ui/components/DividerComponent.kt | 6 ++++-- .../ui/components/SquareStoreItemComponent.kt | 10 ++++++---- .../components/UpdateInProgressDialogComponent.kt | 8 +++++--- .../compose/ui/models/UpdaterDialogUIData.kt | 2 +- 7 files changed, 37 insertions(+), 20 deletions(-) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt index 1c0c9a3b..60faa1c8 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt @@ -16,6 +16,8 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewFontScale +import androidx.compose.ui.tooling.preview.PreviewScreenSizes import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import com.pouyaheydari.androidappupdater.directdownload.data.model.DirectDownloadListItem @@ -29,7 +31,7 @@ import com.pouyaheydari.appupdater.core.R @Composable internal fun AppUpdaterDialog( - dialogContent: UpdaterDialogUIData, + dialogContent: UpdaterDialogUIData = UpdaterDialogUIData(), onStoreClickListener: (StoreListItem) -> Unit = {}, onDirectLinkClickListener: (DirectDownloadListItem) -> Unit = {}, typeface: Typeface? = null, @@ -104,7 +106,8 @@ private fun Preview() { } } -@Preview(showBackground = true) +@PreviewFontScale +@PreviewScreenSizes @Composable private fun PreviewSingleStoreItem() { AndroidAppUpdaterTheme { @@ -123,7 +126,8 @@ private fun PreviewSingleStoreItem() { } } -@Preview(showBackground = true) +@PreviewFontScale +@PreviewScreenSizes @Composable private fun PreviewSingleDirectLinkItem() { AndroidAppUpdaterTheme { diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DialogHeaderComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DialogHeaderComponent.kt index 5445c566..db03613d 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DialogHeaderComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DialogHeaderComponent.kt @@ -16,7 +16,8 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewFontScale +import androidx.compose.ui.tooling.preview.PreviewScreenSizes import androidx.compose.ui.unit.dp import com.pouyaheydari.appupdater.compose.ui.models.DialogHeaderModel import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme @@ -28,7 +29,11 @@ import com.pouyaheydari.appupdater.core.R as coreR * @param content DialogHeaderComponentModel */ @Composable -internal fun DialogHeaderComponent(modifier: Modifier = Modifier, content: DialogHeaderModel, typeface: Typeface?) { +internal fun DialogHeaderComponent( + modifier: Modifier = Modifier, + content: DialogHeaderModel = DialogHeaderModel(), + typeface: Typeface? = null, +) { Column(modifier = modifier, horizontalAlignment = CenterHorizontally) { Image( modifier = Modifier @@ -60,7 +65,8 @@ internal fun DialogHeaderComponent(modifier: Modifier = Modifier, content: Dialo } } -@Preview(showSystemUi = true) +@PreviewFontScale +@PreviewScreenSizes @Composable private fun Preview() { AndroidAppUpdaterTheme { @@ -69,7 +75,6 @@ private fun Preview() { dialogTitle = stringResource(id = coreR.string.appupdater_app_name), dialogDescription = stringResource(id = coreR.string.appupdater_download_notification_desc), ), - typeface = null, ) } } diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponent.kt index e16b2e35..a6b927ba 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponent.kt @@ -6,14 +6,15 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewFontScale +import androidx.compose.ui.tooling.preview.PreviewScreenSizes import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme import com.pouyaheydari.appupdater.compose.ui.theme.Blue @Composable internal fun DirectDownloadLinkComponent( modifier: Modifier = Modifier, - title: String, + title: String = "", onClickListener: () -> Unit = {}, ) { Text( @@ -25,7 +26,8 @@ internal fun DirectDownloadLinkComponent( ) } -@Preview +@PreviewFontScale +@PreviewScreenSizes @Composable private fun Preview() { AndroidAppUpdaterTheme { diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt index 0207a8b3..6797df0c 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt @@ -10,7 +10,8 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewFontScale +import androidx.compose.ui.tooling.preview.PreviewScreenSizes import androidx.compose.ui.unit.dp import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme import com.pouyaheydari.appupdater.core.R as coreR @@ -44,7 +45,8 @@ internal fun DividerComponent(modifier: Modifier = Modifier) { } } -@Preview(showBackground = true) +@PreviewFontScale +@PreviewScreenSizes @Composable private fun Preview() { AndroidAppUpdaterTheme { diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt index 707fa7ff..dc6b8daf 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt @@ -11,7 +11,8 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment.Companion.CenterHorizontally import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource -import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewFontScale +import androidx.compose.ui.tooling.preview.PreviewScreenSizes import androidx.compose.ui.unit.dp import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme import com.pouyaheydari.appupdater.core.R @@ -19,8 +20,8 @@ import com.pouyaheydari.appupdater.core.R @Composable internal fun SquareStoreItemComponent( modifier: Modifier = Modifier, - title: String, - @DrawableRes icon: Int, + title: String = "", + @DrawableRes icon: Int = R.drawable.appupdater_ic_google_play, onClickListener: () -> Unit = {}, ) { Column( @@ -37,7 +38,8 @@ internal fun SquareStoreItemComponent( } } -@Preview +@PreviewFontScale +@PreviewScreenSizes @Composable private fun Preview() { AndroidAppUpdaterTheme { diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt index 2bf42965..5a4236fb 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt @@ -13,7 +13,8 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewFontScale +import androidx.compose.ui.tooling.preview.PreviewScreenSizes import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme @@ -58,10 +59,11 @@ internal fun UpdateInProgressDialogComponent(modifier: Modifier = Modifier, isUp } } -@Preview +@PreviewFontScale +@PreviewScreenSizes @Composable private fun UpdateInProgressDialogPreview() { AndroidAppUpdaterTheme { - UpdateInProgressDialogComponent() + UpdateInProgressDialogComponent(isUpdateInProgress = true) } } diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogUIData.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogUIData.kt index 503730e9..5ff75299 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogUIData.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogUIData.kt @@ -8,5 +8,5 @@ internal data class UpdaterDialogUIData( val directDownloadList: List = emptyList(), val storeList: List = emptyList(), val shouldShowDividers: Boolean = false, - inline val onDismissRequested: () -> Unit = {}, + val onDismissRequested: () -> Unit = {}, ) From df6760ef5c906afde74053d048697f604903efd5 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Mon, 15 Apr 2024 16:41:38 +0200 Subject: [PATCH 037/117] Added UI test for DividerComponent --- compose/build.gradle.kts | 3 +- .../compose/ExampleInstrumentedTest.kt | 22 ----------- .../ui/components/DividerComponentTest.kt | 38 +++++++++++++++++++ .../compose/ui/components/DividerComponent.kt | 10 ++--- gradle/libs.versions.toml | 8 ++-- 5 files changed, 49 insertions(+), 32 deletions(-) delete mode 100644 compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ExampleInstrumentedTest.kt create mode 100644 compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponentTest.kt diff --git a/compose/build.gradle.kts b/compose/build.gradle.kts index ec31af62..4e1ac267 100644 --- a/compose/build.gradle.kts +++ b/compose/build.gradle.kts @@ -62,7 +62,8 @@ dependencies { testImplementation(libs.junit4) androidTestImplementation(libs.androidx.test.junit) androidTestImplementation(libs.androidx.test.ui.espresso.core) - androidTestImplementation(composeBom) + androidTestImplementation(libs.androidx.compose.ui.test.junit) + debugImplementation(libs.androidx.compose.ui.test.manifest) } afterEvaluate { diff --git a/compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ExampleInstrumentedTest.kt b/compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ExampleInstrumentedTest.kt deleted file mode 100644 index 333a6fc9..00000000 --- a/compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.pouyaheydari.appupdater.compose - -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.platform.app.InstrumentationRegistry -import org.junit.Assert.assertEquals -import org.junit.Test -import org.junit.runner.RunWith - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.pouyaheydari.appupdater.compose.test", appContext.packageName) - } -} diff --git a/compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponentTest.kt b/compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponentTest.kt new file mode 100644 index 00000000..fcc13cfb --- /dev/null +++ b/compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponentTest.kt @@ -0,0 +1,38 @@ +package com.pouyaheydari.appupdater.compose.ui.components + +import android.Manifest +import android.content.Context +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithText +import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import com.pouyaheydari.appupdater.core.R as coreR + +internal class DividerComponentTest { + @get:Rule + val composeTestRule = createComposeRule() + + @Before + fun setUp() { + val instrumentation = getInstrumentation() + val packageName = instrumentation.context.packageName + val permission = Manifest.permission.POST_NOTIFICATIONS + instrumentation.uiAutomation.grantRuntimePermission(packageName, permission) + } + + @Test + fun test_orTextIsDisplayed() { + val context: Context = getInstrumentation().targetContext + + composeTestRule.setContent { + DividerComponent() + } + + composeTestRule + .onNodeWithText(context.resources.getString(coreR.string.appupdater_or)) + .assertIsDisplayed() + } +} diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt index 6797df0c..e6691f18 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt @@ -23,9 +23,7 @@ import com.pouyaheydari.appupdater.core.R as coreR internal fun DividerComponent(modifier: Modifier = Modifier) { Row( verticalAlignment = Alignment.CenterVertically, - modifier = modifier - .fillMaxWidth() - .padding(top = 16.dp), + modifier = modifier.fillMaxWidth(), ) { HorizontalDivider( color = MaterialTheme.colorScheme.background, @@ -33,9 +31,9 @@ internal fun DividerComponent(modifier: Modifier = Modifier) { .weight(1F) .padding(start = 16.dp, end = 8.dp), ) - Text( - text = stringResource(id = coreR.string.appupdater_or), - ) + + Text(text = stringResource(id = coreR.string.appupdater_or)) + HorizontalDivider( color = MaterialTheme.colorScheme.background, modifier = Modifier diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ee635ef4..dbcbeec7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,7 +2,7 @@ appVersion = "1000" compileSdkVersion = "34" minSdkVersion = "16" -composeMinSdkVersion = "21" +composeMinSdkVersion = "23" targetSdkVersion = "34" agp = "8.3.2" kotlin = "1.9.23" @@ -31,7 +31,7 @@ androidx-constraintLayout = { group = "androidx.constraintlayout", name = "const androidx-recyclerView = { group = "androidx.recyclerview", name = "recyclerview", version.ref = "recyclerView" } androidx-core = { group = "androidx.core", name = "core", version.ref = "androidXCore" } androidx-fragment = { group = "androidx.fragment", name = "fragment-ktx", version.ref = "fragment" } -androidx-lifecycle = {group = "androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "lifecycle"} +androidx-lifecycle = { group = "androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "lifecycle" } androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "androidxComposeBom" } androidx-compose-foundation = { group = "androidx.compose.foundation", name = "foundation" } androidx-compose-viewModel = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "lifecycle" } @@ -39,9 +39,11 @@ androidx-compose-material = { group = "androidx.compose.material3", name = "mate androidx-compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } androidx-compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } androidx-compose-activity = { group = "androidx.activity", name = "activity-compose", version.ref = "composeActivity" } +androidx-compose-ui-test-junit = { group = "androidx.compose.ui", name = "ui-test-junit4" } +androidx-compose-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } junit4 = { group = "junit", name = "junit", version.ref = "junit4" } mockito = { group = "org.mockito", name = "mockito-core", version.ref = "mockito" } -mockito-android = {group = "org.mockito", name = "mockito-android", version.ref = "mockito"} +mockito-android = { group = "org.mockito", name = "mockito-android", version.ref = "mockito" } mockito-kotlin = { group = "org.mockito.kotlin", name = "mockito-kotlin", version.ref = "mockitoKotlin" } androidx-test-ui-espresso-intents = { group = "androidx.test.espresso", name = "espresso-intents", version.ref = "androidTestEspresso" } androidx-test-junit = { group = "androidx.test.ext", name = "junit", version.ref = "androidTestJUnit" } From 8f4f91b65a53b52669cfe170a0fde08a8ed5b6de Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Mon, 15 Apr 2024 17:12:04 +0200 Subject: [PATCH 038/117] Upgraded min sdk version to 23 --- app/build.gradle.kts | 2 +- build.gradle.kts | 12 ------------ compose/build.gradle.kts | 2 +- gradle/libs.versions.toml | 3 +-- settings.gradle.kts | 16 ++++++++++++++++ 5 files changed, 19 insertions(+), 16 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9bc4cd3a..1e01f4a6 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -7,7 +7,7 @@ android { compileSdk = libs.versions.compileSdkVersion.get().toInt() defaultConfig { applicationId = "com.pouyaheydari.androidappupdater" - minSdk = libs.versions.composeMinSdkVersion.get().toInt() + minSdk = libs.versions.minSdkVersion.get().toInt() targetSdk = libs.versions.targetSdkVersion.get().toInt() versionCode = libs.versions.appVersion.get().toInt() versionName = libs.versions.appVersion.get() diff --git a/build.gradle.kts b/build.gradle.kts index c71da440..73ea7d11 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,15 +8,3 @@ buildscript { classpath(libs.kotlin.gradle.plugin) } } - -allprojects { - repositories { - maven("https://maven.google.com") - google() - mavenCentral() - } -} - -tasks.register("clean", Delete::class) { - delete(rootProject.layout.buildDirectory) -} diff --git a/compose/build.gradle.kts b/compose/build.gradle.kts index 4e1ac267..f2e5200e 100644 --- a/compose/build.gradle.kts +++ b/compose/build.gradle.kts @@ -7,7 +7,7 @@ plugins { android { compileSdk = libs.versions.compileSdkVersion.get().toInt() defaultConfig { - minSdk = libs.versions.composeMinSdkVersion.get().toInt() + minSdk = libs.versions.minSdkVersion.get().toInt() testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { useSupportLibrary = true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index dbcbeec7..d5bfdd75 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,8 +1,7 @@ [versions] appVersion = "1000" compileSdkVersion = "34" -minSdkVersion = "16" -composeMinSdkVersion = "23" +minSdkVersion = "23" targetSdkVersion = "34" agp = "8.3.2" kotlin = "1.9.23" diff --git a/settings.gradle.kts b/settings.gradle.kts index f565d899..5a01ac8e 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1 +1,17 @@ +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + } +} + include(":app", ":appupdater", ":core", ":compose", ":store", ":directdownload") From e0d09b620b68b30e06f5476f9462749f95ca9832 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Mon, 15 Apr 2024 17:12:22 +0200 Subject: [PATCH 039/117] Removed redundant manifest files --- appupdater/src/main/AndroidManifest.xml | 1 - compose/src/main/AndroidManifest.xml | 2 -- 2 files changed, 3 deletions(-) delete mode 100644 appupdater/src/main/AndroidManifest.xml delete mode 100644 compose/src/main/AndroidManifest.xml diff --git a/appupdater/src/main/AndroidManifest.xml b/appupdater/src/main/AndroidManifest.xml deleted file mode 100644 index cc947c56..00000000 --- a/appupdater/src/main/AndroidManifest.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/compose/src/main/AndroidManifest.xml b/compose/src/main/AndroidManifest.xml deleted file mode 100644 index 8072ee00..00000000 --- a/compose/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - From f2883f4e0451f499c6e8820cb3a930184c61ec83 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Mon, 15 Apr 2024 18:16:23 +0200 Subject: [PATCH 040/117] Added ui test for DirectDownloadLinkComponent --- compose/build.gradle.kts | 2 + .../DirectDownloadLinkComponentTest.kt | 50 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponentTest.kt diff --git a/compose/build.gradle.kts b/compose/build.gradle.kts index f2e5200e..04cfafac 100644 --- a/compose/build.gradle.kts +++ b/compose/build.gradle.kts @@ -63,6 +63,8 @@ dependencies { androidTestImplementation(libs.androidx.test.junit) androidTestImplementation(libs.androidx.test.ui.espresso.core) androidTestImplementation(libs.androidx.compose.ui.test.junit) + androidTestImplementation(libs.mockito.android) + androidTestImplementation(libs.mockito.kotlin) debugImplementation(libs.androidx.compose.ui.test.manifest) } diff --git a/compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponentTest.kt b/compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponentTest.kt new file mode 100644 index 00000000..09193fa4 --- /dev/null +++ b/compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponentTest.kt @@ -0,0 +1,50 @@ +package com.pouyaheydari.appupdater.compose.ui.components + +import android.Manifest +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.mockito.Mockito.mock +import org.mockito.kotlin.verify + +class DirectDownloadLinkComponentTest { + @get:Rule + val composeTestRule = createComposeRule() + + @Before + fun setUp() { + val instrumentation = InstrumentationRegistry.getInstrumentation() + val packageName = instrumentation.context.packageName + val permission = Manifest.permission.POST_NOTIFICATIONS + instrumentation.uiAutomation.grantRuntimePermission(packageName, permission) + } + + @Test + fun test_whenComponentIsCalled_thenCorrectTextIsBeingDisplayed() { + val title = "Text" + + composeTestRule.setContent { + DirectDownloadLinkComponent(title = title) + } + + composeTestRule.onNodeWithText(title).assertIsDisplayed() + } + + @Test + fun test_whenComponentIsCalled_andUserClickOnText_thenOnClickListenerIsCalled() { + val title = "Text" + val clickListener: () -> Unit = mock() + + composeTestRule.setContent { + DirectDownloadLinkComponent(title = title, onClickListener = clickListener) + } + composeTestRule.onNodeWithText(title).performClick() + + verify(clickListener).invoke() + } +} From 0fa55a30de85c92907a3182354332bd29054e970 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Mon, 15 Apr 2024 18:42:55 +0200 Subject: [PATCH 041/117] Added padding to store list items --- .../compose/ui/components/AppUpdaterDialogComponent.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt index 60faa1c8..9542dd61 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt @@ -15,7 +15,6 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewFontScale import androidx.compose.ui.tooling.preview.PreviewScreenSizes import androidx.compose.ui.unit.dp @@ -76,7 +75,7 @@ private fun DialogContent( storeList.forEach { item(span = { getStoreListGridItemSpan(storeList.size, maxLineSpan) }) { - SquareStoreItemComponent(title = it.title, icon = it.icon) { onStoreClickListener(it) } + SquareStoreItemComponent(modifier = Modifier.padding(8.dp), title = it.title, icon = it.icon) { onStoreClickListener(it) } } } } @@ -87,7 +86,8 @@ private fun DialogContent( private fun getStoreListGridItemSpan(storeListSize: Int, maxLineSpan: Int) = if (storeListSize > 1) GridItemSpan(1) else GridItemSpan(maxLineSpan) -@Preview(showBackground = true) +@PreviewFontScale +@PreviewScreenSizes @Composable private fun Preview() { AndroidAppUpdaterTheme { From 0ed3f5e96d3c2291407a47b0bdec4b72bea0b58d Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Mon, 15 Apr 2024 18:44:20 +0200 Subject: [PATCH 042/117] Added a 80dp fixed size for store images and max 1 lines with ellipsis --- .../compose/ui/components/SquareStoreItemComponent.kt | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt index dc6b8daf..dea0401b 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt @@ -5,12 +5,14 @@ import androidx.compose.foundation.Image import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment.Companion.CenterHorizontally import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.PreviewFontScale import androidx.compose.ui.tooling.preview.PreviewScreenSizes import androidx.compose.ui.unit.dp @@ -28,10 +30,17 @@ internal fun SquareStoreItemComponent( modifier = modifier.clickable { onClickListener() }, horizontalAlignment = CenterHorizontally, ) { - Image(painter = painterResource(id = icon), contentDescription = null) + Image( + modifier = Modifier.size(80.dp), + painter = painterResource(id = icon), + contentDescription = null, + ) + Text( modifier = Modifier.padding(top = 8.dp), text = title, + maxLines = 1, + overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurface, ) From 65c8ef85d35bb67d8a0a4b62b47958be332f0a2f Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Mon, 15 Apr 2024 18:45:33 +0200 Subject: [PATCH 043/117] Replaced myket png image with svg --- .../res/drawable-nodpi/appupdater_ic_myket.png | Bin 4422 -> 0 bytes .../main/res/drawable/appupdater_ic_myket.xml | 9 +++++++++ 2 files changed, 9 insertions(+) delete mode 100644 core/src/main/res/drawable-nodpi/appupdater_ic_myket.png create mode 100644 core/src/main/res/drawable/appupdater_ic_myket.xml diff --git a/core/src/main/res/drawable-nodpi/appupdater_ic_myket.png b/core/src/main/res/drawable-nodpi/appupdater_ic_myket.png deleted file mode 100644 index 4c07c521f8b8d8e66d3231c4f1a12804d5dae685..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4422 zcmd^D_gjrHbbh0vlf6db}5OA5j%I}kC)ajrNF_SDH*oCyNK zuYz~?rg=LZF$yLTH8C4Dn$bk^IvRm6F^?u=g2Qk$P`rH%1?LuX)IB&REZ7i>G&fT=i8fj%AmV5kkm zS}0BJjg-C{IywE{rbOc3)>N7+?!WQ=uf$aMQ)HZ$D~?KvpaicsE<|O+71_v|g2T{A z6n7Gd@V$!8p(GlK8cHH7TU#sdal!=S!#DK3e*&DGj2yzLG)#Cf&cVhMxlW;p$779j ztgZDet?djC>R1_~P_~v<26k442W@Qi4D@sk=pNMmj1f4^EEpN-?+ zbGxqmJ^8rs^>L@H&oz6Jps@a25Y9*3Z4Yxmtr!+op#L)v-a_pZ>?nY^cThA2AG6!K#2_$d<{}z7C2S*Mha-nw~ zf|_7oDX15NKn}>Wz~wbO9D0Oaz?om^@emu&9Qm6%fybhAFVF24gmiEyAz8U{(cN@}O=CREj}}4(+or@f9rD zAdw3-6TqJXoJmkD1VIJ_Ho%>JNa=^hX~-Oc@vo5D512;S&H}3%INbrcBXFx9Hf2L( zJD5~~Q6(5vLG=V&=?33=$RC5vbjTeA<|v3UpyU(W8GwxUaOoY$vOt0fax7?=hSpiA z`~*scz?Th#7Wk0`mIAVe}9Y%JZQyC>44ETp{@UkeFej~9%+M1Nqx=1V}>N%F^3xxM%) zov~~5z;H-=O%JElm@oFgrqfk?F`eE)x82)LQ&1=mYf4m6fAjpezS2fbu|lTtbYmJ9 ze|~sb2qsA9r^hl`}AA zm!-*G)~fo>(1Kk0|z9Ao8_Z6~Kh_WqWk!JDM#BOKf18{2Q>GUQki*_jBX)TsE0 zn{kuFoDUWk8cd0<%!mr6jIeY*F8JvsLb0{LiQ@$&D{AS`C&)Y1K#HSi*w!!=E3){#BU0*$rbiK*Vza`d5 zE~IGG^8N05BGrp9h_SFb+sYF}A5y>WDSyM6wdSpy-#UJYA?SPI^OdX8l_9Op7LsK% zawOIj^u;5s<4d`HLRhy!!()W)i!O7Fi{9rI34fq3zUYqGZI-tA&5H(mKbFPeaQz?1 zT8iij!8bWCPV8V^^?qvC1%!1BX) zpQ8A8>507h!$n%+PW^krhzyQf`O_YBpG|xVB0_+ZlEAy5y08f6zLauvcvHI_@^G`S z8wZ^JwM9&F$^3GWuWL<{%w;Cs;+*e;WbKxt9=*n^_k8G{=(rno2C^9m9FDH;P}0ez z7;mn4Z#@b-s&c%u<%q{e(a-x+k~m9psR^9B^*PktQYrfStOdUS)f*7>nCpIb*zORg z(SR-|zvYMYv$wqlYeU}q1{kBl`6b+lRX#uFJ~!8{5>NITDjd7FfK9tHr9XFhH~yxi zz_q+o^K5xss8Oy`V`OPvoQ7ob7xQh&ou6_t$V@e|Y-_>tgTX(Fm>;kAc|Osj4-Se#NO!|k`cbFZVd@Ea-{W2&z1yp~Pa?NXv)94bOv3bsko_2=p%#p9ko4t#Vz zR@RnLZtzaLB{5w+HpT8osnyv^2^KN2^2^pR#KLLEE(I611ib*2GQXv@5U`{!{Osjr-sv*Gf-m~}zPQro3#b&Qf z%f3mb6T5_addO*~dwW-PyQ;Ac2bWDu22nJj-mO_h0hRLu9E|=_#T-_vttXB|m({?G z7u78m@@~zFL}!(bW0`FJX^+uRord6@hLZ-UpacfnG)1`B3g1RG@FUlvNTI6%A&l5L?OZ$8Z98WlZ zui=iUN3C;pe#5Z6kkW@JZKg|f&+-n!*_r0EUy6<9;tK5hn?mR0dqxn~L{KQ6Aea>r z_DK<*%chveDwwf$+@9Rd4zYLNix$H?f8<^#WBrbO@i2Et1pTuwmm-o@;mZvYLFf2# z8!kCzd9pUMJ99ksuh3t5?Nd-D$PMI*1ckYxdK9-e$7|;2`Us=be7TxGJXz4daYaSY zslHrS5p;K?pyN5f&^d@f#6R5H&LbicPC+TvLNtIusx?UzbGldCCk}uI;5-U00_P%y8 z&2|xzjChNkWmSR8TCoxWzyH!biMM@c%JH@}*^FCmJy7E*u#@c5;6agANK`Zv!n7Yd zlscjtS($CYZT)%C>_Lx@`TQ%t^oTK=s+9}{SB}!~!H0S5juE~mefb#uv75X74L)_9 z+>t@v@$keh!{)|cBK)htfL3TL$#jZ0s-ybg(yyM9PO{GOXH|U5)O0)arTcIu^`4(e zvC`WN@tT&W9I4yQ0+z{B@_pugg6EISHr>ZZ*NNA-9!s6SIMq^3Jf~MD6FcL6=PY*R zvy9T##H=B@VOyTV6F1q^P8U{2$OBD@;`FMqL0E8~xF`O;kJrxABoIqUf~q-+m0@!e zBQO)<7?}Q*%U&GE=HTUyrrp*l4AM`!7eXfvudeo1$mcWsXxN$NkNl-V%<`L6p3iuF zCqM3@tvW8d(1trcsu_)_Pv19fnq27#D>c2&uXZ=PPfFmC3iW=0&{Q=HO-7GX!wH!& zYvce!3hH?zgC`X*=W#!+Zs%)DSDD#s2wl@A^dGZPR%@+ATK<&x-KDzTz~V{xraUNRcx7Kd&U-i3vjN9jBTJ%OX*%SI-SfZU4ily-+}abxet4K zk3A2c7!Xhs>T&ep9%dmjk#X$E&k-;8T#26Z<0vUzF3~gz6S>$M@NS~R-+#J>0*zsou;* zoG8lM*=+Xst(x7*fn<-de*ci&oHBp6;;o^tZh0?ej6d8SxGX$>FM3!k_Yq#aaB=*8 zOTDSB#FE}NT72$9sq!-?oYHU1BTq+)R2a#wp-0B^x0dHSO*PyUnRE$Q)59S7rPDHd z7fy6DvBE`4a+f;3K2^MKluK5)9jh}-*812k9DEu zGgKR`BKqY}C)#e6?Ol7aPyB_<(?14&wfVK>?#X8_f;z4C$GA5f-qK@DKRg!Hb$x&H zwj@HEPQ%=TrF?^Z_e?eGl9UxnLN)K-eeBV;wKPK-ecaC8b9^E0$Fj_}Yp0L4$``Ha z3Wj93v)fkc-ikiem{_(j0f#ihrJ^HxsVba_A*tCX?IoUH>wM~qXZ!Nv4{9;B+H!2` z0*?2DBt7#hp5AkY;+J^!E4@v%x2!9_&1vtgoV=PE9_Ow?!k)eL@$B{xt8GsfuFbVB c81RWBno3HmF1krZZT#7Ausv#%Z50^%Z}#6-)&Kwi diff --git a/core/src/main/res/drawable/appupdater_ic_myket.xml b/core/src/main/res/drawable/appupdater_ic_myket.xml new file mode 100644 index 00000000..70a5f016 --- /dev/null +++ b/core/src/main/res/drawable/appupdater_ic_myket.xml @@ -0,0 +1,9 @@ + + + + + + + + + From 2226eb540329e3d2170e095529256fe2aa294d68 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Mon, 15 Apr 2024 19:53:19 +0200 Subject: [PATCH 044/117] Changed image size to 64dp --- .../compose/ui/components/SquareStoreItemComponent.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt index dea0401b..7eadbe98 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt @@ -31,7 +31,7 @@ internal fun SquareStoreItemComponent( horizontalAlignment = CenterHorizontally, ) { Image( - modifier = Modifier.size(80.dp), + modifier = Modifier.size(64.dp), painter = painterResource(id = icon), contentDescription = null, ) From ca3e883887d8d809b97c629e65dbd86d1cbdae51 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Mon, 15 Apr 2024 19:53:40 +0200 Subject: [PATCH 045/117] Replaced google play png image with svg --- .../appupdater_ic_google_play.png | Bin 10830 -> 0 bytes .../drawable/appupdater_ic_google_play.xml | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+) delete mode 100644 core/src/main/res/drawable-nodpi/appupdater_ic_google_play.png create mode 100644 core/src/main/res/drawable/appupdater_ic_google_play.xml diff --git a/core/src/main/res/drawable-nodpi/appupdater_ic_google_play.png b/core/src/main/res/drawable-nodpi/appupdater_ic_google_play.png deleted file mode 100644 index dd787d19e58fc08a7c3841075fe28e69b30aa7a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10830 zcmZvC1zcOf(rT;5R ziV^aC*iEvz&RdIj?*Pm&8U=s|#09|r6@k3~KvDqWKWG3z0Z8_5S{=v`*657#}_d_#YcNaR1iN$btV44U+@V zDrnBZI#fq_U1u1a*}n}a$(Z2|0Klyi)>yfZDU0m_bd=+1>3O|7rn*-N7)@ z-rU86+TGsH!5Qo>Lh}y^FpU1o2GLOeL&U{aghuC`Dzy~U$()*xor9f&Mih;jnp)V& z%mS<~E&DHZ*qsQCm5Ylb7zFwY$Bp|h5D=%Jpdg5Y3&h3629scO{_Nml;?CyaO#9D4 z{%0I%bLS6E){ZXLPzUP2U4U0pgLW+JJ-L6LXQ(D#{jH7ZlVaj=hhzJj`eRMyb;- zvZ|XThFeB6RWg)d8(b^oo4dUyEh&8 zJ|hX&_GBpnIjwro)_aKrz&rk{hJ_sQeq&pkmAraBBeRiJ0pDbf>CnrnQ!f?=E|WE? zEgIw80J?(Z*b$^Z-I~c=%@xy!Lty|H$t4PY??$oOZv`2@7mYM#k@|m~LSBhS*n6EX z)E^X98aWKFR^38_d$Y#_4m4;@Nr#f7j zqkX}finX{8qYJg0Yhsji@ugK6sUBzRfmqr~%bgGH2aKxt)ar79G`=g{AVbfI#KjYW z!Ykfcj_m;biAs{bXGiP0&5HI z2aGaB)Lf>Z&$P+&CnO&_R~d-V=6Nl|oD)dV^a2-3SXx1v-ns8s=YQdT5?3l&B)hx) zcDk2Y1~5SJQ`DezWXg-vm$q_Emz^m$pR>)~TCUn3xO&(-TbjN_*7W8=PC$sBj4f%o96<^%*!~UYdMPHxy*t&RLKdM< z+0%<|;b+P0Qp)uJL}R9?)D%ft+u5T)iLNv>?LpV7kel~E9mcP;PXTVU+EK=tJ+{wM z?%7MS{{ETv<*M_z4)62{L}JSh2D_9@nK_T9UYs7!bT|SLbybh|GWhmC?Myb#>d%yL zfIbL_o+T4_Sy@YS5S)CWUZNN2=Rbe$V<7zQ8}u_Uip1k83MDV#p~3(6Z$Gw+V%%aQ z(_i;%Jp@(4fB0jF6PX^DetCYFWLUMo_f`pJdr%U$?*WGTJCeaS3Phn0sG-)5x|4Xh z?&C%B*%hjJ$VxvOG;c#h=eSz*c7L%AHxiYq$D!^k4T^z8Jm4}BJ4?f)P4Bmo&U0SG z$k-mp0qhanNNwLHM!#~=z@>*clGNhOY!VXj+v(lj+Fr_J;iy?VQ7t}QxHJ@^r#;%0 z+!N)L;fygp^3d5BQ#c`Ho^AX&g|_p(3OAZ8VD{~xcXgQ#WBMoPEVKwVZJg2mK2ETNQ=u2RtSC;@^5Qk5Qa$hV6X~No^_RM(*&JO<-h~EF4bK z1kOvhEl0MAHpp6PL(L8E33?XW7d2c+K~UYEx>D@`rha|lySXVL&dc&DHqmk}Abj9> zo18suxDB(JwCYej{~gv(FF_g{>~R!fTGOc=lMW(t32{z&_w7-GWo|+1YLSS847#~-#a>Qs*lY~$A-7IK~`dW_O-Ryd{~7QQQ0vi^O&0*+P?*eFCFS2a53ji z+eB2@?Ni>8o35|>lqc8nySKWWB>3|rz< z^1okLBf;rT->+dG2(Ta7z#n|OV}LEEH&Vp48t|U_2Z3tdcM%_p?#>Zpj778_jcrDU z11gq|aqhV70i~_Y*R4IVbYrI_s4t>^CuGJgnFq{_p)u;|1760bmo)gloho{5HG4jP zC%L&9spfHIKtpk4GGX&ni1)<&tmD6sh%Z4nfhAY?&OwXkSbVHTIfx0T^7m8d^ki+>{n4?8wjksQLL6MyQN&C^{>-hDa~;Xd&c}@^wUhT7RyRQ zJMPvVDeNiOeUFSCltMd=X>})qrah8zRjJ@pY}+=fS;Q0#Vm7{;N&k*of3$5=F;}M^ zY>HZsmEcKa7pgBzz_yXu?Hc zt8e{FF1S`u${*_&FC`IDS>@vD`FkUth9@;2F52W!n$mO`xn;RO#xMWjXT89Xl?2U?))O- z{*wg=wfZuqp(%7WzHw&#sp_F=%#F;RPdk45ve;8_r>JZQ^BWFuHPc=;j`S2#)a~Jo zkVZdC18-tINWeBaG5ebwTp27a5fO`OIT#fN2;G2W+mu3G->=M#*Vf3HRO(g{uSG%( zy4NQ*d;NkO7}z3f6jg^`tYsj4w6$j4=7)q|*`A#DG&c&k%`MzIGO7{DFy%rTgU-s{ zZX1uvL{qtxhcg}x)8RV!A(?h&BSmqG#ES8jYukC|fVS`N;MF z0%CV5K49}9JBC5~-EFph^xcTw^KT{lrp6S-=(?8?v&$o@nPX9`?3ujqwwRs{?u-?9 ztML4sYzDJS(^N3VS7SlVOL%XE;J$Lua?s#YUW9s! zh3)sPxNK7Fkl^U%HKW*-Nc6ii17>lur`@Z*Zj@k#6@8+qiZ#Q(3D*eyaw|by&?`$K ztui5QTLm$0u8^SHxJiNPoTcCg=ZI}M4d>0f^0-l&elvQ1w^njL#dxT!jM+Y2-NiR# zjidS0fw^8z^9RU46Wsm<#kVs|eDsSmZ~HTy_zh3b;gSKZsc=Yp%}KBtiZ(%72{5!o zbXwZm=Bo$(RY~KV=xRfidDc$h*^D3O&7#CQD1=mdS|JCRNAL5-uHf?|(JV#Y6B9D$ z{aACV`J@0#ee;)EL2Nm;RUS&bkG7Ie&(|4K?i;?Z{o0ATT!!FpM_xs??QDa;lFLhdfy;-sZ$e+CA2UnJgc}rH6an}79Z`fT& z=04aC*v1mO@j}bklQ)w5ndILGe_+@19v1qgImK*)+gmMg8keF?d7A6AU-TPlJQYoi zr|5iNiu5;KBENzwuosUY4v|F@j_6Rv9*J8;iOAVR9JM0e*WrI;dJKF!HMaX0cElRm zqwA+N&{1a(?cgm~DO6r?m<36>aqwjLl;l}GY10eySx5!Ep7_2#PD)!7yx5VJ=gy3H_Ti}er}G<~YZVWb zH21dh;!WuCGsRW12#H_hCP{6q?vW_FNEUNXuBeMu23)==d=$M? z%F(y;lQ~Z9Y@x>CptM7q;Chc5b1TcsiFwcLxfV5 z?eHyOzzN%s#On&gCuZW&ro^#s#R*(NggXLs|;cRFP2hQo`Ht{Z(9S5t10HK0#8s_>!C&4v&Z zGF&TF3>2%=oc!K=%!jCX|F06`c+ynhLwrID?C{;kcB1lU#XDS{9;pS4kAi+91b>bq zB=Bj@9Ank$UTbET-rZ0&znLR@5Ca&H#f3R_G9!=!-_honbj~ya>x_bKdM)masEVdUG#GBV-|>XV;wbI_C;3gyo6HlZujWtievZR-wB^S zl-$}cYm|%%%JvZZR}^;c0I=Q?N0kJNlMxy(r;f+StOyDvxF%B;_pCCF{mcn*G$c5G{ee|(N z8L&xvY+)w z`?H%%6YC^eVwGvnbUJx!)y;UzlHybu_S$sdELGedhq(2HExWsSlLVKcIHH)s4yntd z5I3-P?rJ50W|ASmL20paAoLUjrlMFPCT7pI`steN2gC_hCPEnUy4E`PT5Inie8G6u z6bSA-mK|`S@HJLc!3%DD+zXk<$zD0rdUz@{=Y?}DR-u^RWWapDbpO7>5AMH(I|6XS{!QAAZea2ttZg2k}0L64m@nlnK4; z*2fxSW&|q&DM)b0p9S?c6$3?YKtu8;p*ZLEPDprr;&fUiXR}R6usw*P3`Mq_DVIOy zQS~k9Zoa`;M{yrSPRAt~4xA>%5RLMV9C@tVIKnr@{pX1y2X#=Lfl0kO%J;+!OxKYn zWPLP8jqLOeX8mZ_hsE}yU$`l*We1c1hpo*LEIBg7aY1~f%qJ$=t}pQ@fp_yH-whx6 zADuxFL~!rSV51!AM4@2YS*s785dti$jg5VgH%iWZ0c#WI8kS(@#{+*YgRVFmv^h%v0sDS7HN zMdJsWg9|sqj4m~TW+#;OL5qo&2C0L-<5dnNK|uLj zV`S{~=JcSIrqQMBk)Cx+v-xkXk&nNXxZ~2SnSqI5? z6sV`kBM>bMS7FN1kgU{<`An;0ySyhk30sOp^mL=niU@v+;mkS!3~S~&bC6;z$>rcx z86*t-D%@zi;Q_db?0 z_@F800wyo-!dlGD`u634NpLV!8ZV)D95dg471*(?NXX*-mJvr~Gi0EubB|*8rKK+^=daJB(6#;D- z2DDRJH9xFq#Mb>ZpO^DBc-$vxqoe>hvTmgb%S*M;p27hX$LJ$Z$9MyJR{?2?ke1)@ zi>itJiz>RIDA3%egZR13J~uF>(i|c3TEs61MGnDRuc3zq=6i8J+D#y6gJDDF#U%oa zvHf_}q188}&|&g4HPRE+7f5lF+Tbd@QF4p|#WZBs`H<(#s4$L}jbuOzv~s$^bj3Zs z>Cg%T2a-D(Qv_%ApwGTW5Q2=<1HYAJ4Ij$ zEi?~b?=`v|q#vdWJcLE5fL=WD(%#H@3uEcFT?ed^!9Tj0)swA$^{zQg(zzXKOYZrz z#TssVJ03vn4YeC9H^D|mM=T;f+w@z9x3{@2&F=|X`3GoaOKE1M-$rA%*WX=i%y{t* z!|ONG9lQB3XGO647+kflo{zd7k7sx+UR7)@jCJ0A*Lcssn8nn1=;n&)L$}j+cX!c$ zAFhsVN016d9}hvIWAt8|ydn~P%zHi)>g=wS^hM$RMB`^6KdMR9LsaxM)-Lj)L z3NxSJ9+a$VytcM4A4`VeGo->ze&CLE0Tx0d`hl_Kh%Em79-CVk>k{UApMdt z8o`kzzWj#St{C379Eu;6q7wdn5{bKBwfEh8=ygYOfsF1cc}^R4jw=e8cq;>+^UXw` zRrfB5ifk~K)Y%qobaZvJ`Iyl4F+HekGz-3EEOik?d3Kv5NO*6t|^a8Shf|V&fzIlfYBjubz zxAqQeXny?O(56*15qEE*_+TbWarZ$9VQp5KZIp;pa%bK%;~#okB1bxDR5fyX+w>U* z)M{a=7%wsTPmMPY9B2aKWYl1Kxx+qsSlx5UQbakykl#H>1)n>Yp4PC3Dwj${F?{@i zS%cKh{X;u8svp;#d>HM~qkJg&*gGb+n3bFSk-6B}a#}`4@WaQtAC`^){(0P^I1s+4 zF;cBiOyrq()HL;4oU07>kdcf}#=ChcWmEd`9(a99E~J+=N1loCi0~1KQ@}mC9_}|B z%I4T9)uSxy(yM1wfI(ul-lk&^Z^#$og+jAs%FA(hGPT@}9YD0S2K5@=rI!2D^P9H@|^_QF3>fiQ;!&~DV_z$N&NLIr3{)RpB zgB>0!t8%;ilt!-bhYhzZ4d~BLU;q*Pm{oOSsq1r|1?6aAP3uT|LKW#ucBJM1I> zaxsx_UnHuPFY>nq?a0=v*vwq9njok`IoosMtoTGjqi`e+phvze+~!`0BvY&x=Qv z(4IayIHt%%pyKN79w}_g=QQ^_{(<+oxyR6kZV#XRrYH`%fky_#s%KnQ!{xfj=b9VY z=+!_P-!C|1JUp^d*r9~4QolrQPyM0K3{OBe$L+j5tg`>oWl&UmMTnV?;wA&Wj4t>e zFX5}u8JqgA#UD!lgf)-DSsI-j!fJ!=aTKf1eI2URBL)M}Q=S_}fJ_0@ z^Qo`?j$Xs8=;u?SL_HA54E;1Q@goP}Ra1ZwaeEr8%7#s^pX?TCqp`C9Y50henenB} zE-ae?{3L!t#i1X{%!KPQMs-zi(t;C{}qXmy%q^=IIcnODAlWLE$#G$Cfd z^Kc^TP^);{?bA|$onk@XCxNyBxdF(3pyXsY;pRnf*vJ6=YW_iK0Jay0c+u?ki zy`m{EG8?v!aN<}pzqb^-Q50i5qJ-dcbN0U1QQ0$6C$(f-OoSKpCAG{&Kt8W!=rw|m z+hhslW_Urxu_^a#Pos*uX<#o);CJ4679Z@G2K<)!Nte7Wi%}EvREf-nC+O76pC&k% zV}8db<9tmV5NXk}d=X@POcNjnFl?5T;))9=A^$||`1-Lpo}Td!sfx@l`9m^X8eCkk zvH5kFn<~>ZM%+`P!!b`J3D)n-+-R~YL2*x`aT5&Hj|wdoel+m3+f}Z`Uf(Mb3YCPD z?l#@Bif`Lep1+O?drlw_!kL5l3Gs1J^G0Du0gCzk@wR_*vNNnKO#*8%>i{@=MR^CSU?^@=H z@)|k-vc+X>wM)hZHT*E{EI07BxHpNUS4aIY+GZ5$c|u7YPM*^V^RdQ$ACRxfIcIRj z39X2mJVX5&yxPIVH&BkaXbw zyexp_8>$iqcI;i(sTxZ2na@*Yo_A za%PYGou%{o9o6eLyS23%Pn(chSfR7Q3$Lr!{6JB!rtFx1g3uR;42NfGTO>Max9R-Y zH75y2%Jfnbtr^TVmHGN%y^-b#uT~~Zs~RStU@c260$9px9p)vx zk{u9B=iGB8P4w-42863QnN-cZL8Nw0f+6qG-25B*zU@!Fd%EG9T+=O- zgoSK6!ZxXmZ@eCd&T1D=Qp9a-CfvCLw#&;k5qW5oG#&ZmT(H)xYSg_G2alP7MV+Uw zoqrtWJ~FUo$hT({0FgfmmigRd1exfO#rLbIJ zyC9_)j~bZ)Qa0Shx|^~FhCyIcacOB=su1V}a^+6h>X3KT=}c8=IVnDJOtn10w`hc< z{5~}59q|2#+cZS#>Zc`@m%yr|R#}=J{ab)_=&CCO@@cSP*4l}Suu!pEu>eq<>1@zF zZ=>K+nDhcj^d-pB^|ND%$V(39hb~GcK-ks`ocuHfnkxV>ci4!#C~O;rUYsg2y*yMO z97hA@K~`L)Y(F&6{00OqhyG@x-`;nw4}M*Wx08pAjYAwlnC{PqIehADeyJv zD4-;`9H$WyS5Cd&JP7lP=vMN6qJA=un^Q0-aQEdSDi<2)T^fyYLI;RY*e?r&H#Nw&*muhB-{^(slY9HKi*ucW91$(-PXDDf?%VSE+ zVyg8-@vE^xmTt_btt;*XZGbIO7vGR;)-e)<-RR({ z9WYeO5eoYS{nGPf|q}k3kV@P~q7C4o z@p{qzP4pu6L+pxo9|Q`3)@SQ$twd?<9I?(BLf`rigp%RuSxE(g@;n7$d0}9{Eq7(+LVoLaa{et$JXdl4_P-JZG6ez;`EMD>x+E(BQo`jLiz!_FKQS?6tBktqT) ztvB1rcg=ayN{7C7lj-oj^ZeZa(%_V^d^HnPA478yHxfG1*&+);{dA0gLsW70{-%wD zU@`hHzkuoJu)q(ON;#wjEOF_if^wp~m?nG-bL0|&>C080MbK+|(kP#;1&#IDPdB)u z4e8e33 zM?6OI%@sG3sIvZiE98877^j~&oN`{pw76P;JbEGsjKu0H@&>U7*K7=%u`%j(;}OdD zOnph;pHDuebiX7JgXtA`wGy#;k*90K%4%~zi|VteM=KC7_G{j01we~KKl;h$aZ_1o zIPkv_PcT3WrU&;WO9%d-nsz=MI@>wEQOHqqN8O1F}vCIi>@wYVw%K5v1PLe zBE6O@KEOsY zq65-)V$=FJ>Bls^`z+ga78&I|4B&dK#-h1m%MW?k)4#T5e`UDv!&^v%-@IRRJmjZ& z)`bxQQogeQw)6$d+eG&DnL1<-KE}>7IKLP@8w>F?7Vs~QqzoTGAyu<^dVs6;yFUa` zwz}Or_Bw$~_9lgTL}QL^!}R#S{TR8k-j_20(4Ie-=%NF7!WQtIouzk)XE5aBN~$>E zxf+MOh`a}rX+xSr`iut4(YgLWdZ9>8e1f)2CrD+NoV>&>6ERoxua&$_h@C%}yPD=8 z#TDke0t+6gv!hl?Fw))5qwUp5x$Xvqdsmm`hqzyHNi8Q`%!kox9XX~4+Sn;6 z^Jv#O#eN#Cpd*|n_youD>X)VZX>@$$AsssRbPHfER{wf4plpxfVZv5=TImXRWx^8b zEQT0@kU{QIJ65HdLt;pB*PcCbwW$4kU6Id}^Zt9W7JrL2^)uuyT0?5k`n_M~OG+AZ za)?i@H@CNDDU@V8*?a<#Sq$zphE~!)<F<`ti%vK??NgI-C55wM_PDZB&MLh~F2( zb)2``R97Ecj3948LV!^**tQ@hxtfrmFH1hUSQ-Z>(-~sDV@uS?sHm5$BL`~UVs0P5 zs|6F7P!CFq63dWR=^RwsR|gN^b!4j>oa!mRh% z#0s3RF2l7a;TxRXkcKZE>%ySVTe}5q=WW?Sr)2VykJ^4GW&^&5QlYkX%1DTUm(_qm z1S)UjGeiPVeKJp*n%YsMkNU)GMIuqS*@0nz?sJX61-PZWaT*SB0FF$AqhQA%kzRT79Y1CC2KwNYa|BNK=!_3Z4zm^D(l)*^Y*|-6)UCY(U+mq zPm^u6-h;y1*?VfX`t!z$cz*E2>D}8_MytEKUv1H!cTof~(R;jcTMO5qH0v1OzoVbV z2ILGeTfdjt9*{jGTa_yyiGAt4}1{p|0*IstEGl%*>qjRXD< Drp7gl diff --git a/core/src/main/res/drawable/appupdater_ic_google_play.xml b/core/src/main/res/drawable/appupdater_ic_google_play.xml new file mode 100644 index 00000000..75073ebb --- /dev/null +++ b/core/src/main/res/drawable/appupdater_ic_google_play.xml @@ -0,0 +1,18 @@ + + + + + + From a83cfaf5964f5eec673b3af31902b2e4d3cd8415 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Mon, 15 Apr 2024 20:18:09 +0200 Subject: [PATCH 046/117] Fixed lenovo app center icon in the preview --- .../pouyaheydari/androidappupdater/utils/ComposePreviewData.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/utils/ComposePreviewData.kt b/app/src/main/java/com/pouyaheydari/androidappupdater/utils/ComposePreviewData.kt index 753128f4..f8ede9af 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/utils/ComposePreviewData.kt +++ b/app/src/main/java/com/pouyaheydari/androidappupdater/utils/ComposePreviewData.kt @@ -82,7 +82,7 @@ internal fun storeList(context: Context) = listOf( StoreListItem( StoreFactory.getLenovoAppCenterStore(SAMPLE_PACKAGE_NAME), context.getString(R.string.lenovo_app_center), - icon = coreR.drawable.appupdater_ic_zte_app_center, + icon = coreR.drawable.appupdater_ic_lenovo_app_center, ), StoreListItem( StoreFactory.getFdroidStore(FDROID_SAMPLE_PACKAGE_NAME), From 0047b44fb41b101b2c51c89a05ea1715105c8e42 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Mon, 15 Apr 2024 20:18:34 +0200 Subject: [PATCH 047/117] Replaced Huawei app gallery png image with svg --- .../appupdater_ic_app_gallery.png | Bin 4472 -> 0 bytes .../drawable/appupdater_ic_app_gallery.xml | 40 ++++++++++++++++++ .../drawable/appupdater_ic_google_play.xml | 24 +++++------ .../main/res/drawable/appupdater_ic_myket.xml | 26 ++++++++---- 4 files changed, 70 insertions(+), 20 deletions(-) delete mode 100644 core/src/main/res/drawable-nodpi/appupdater_ic_app_gallery.png create mode 100644 core/src/main/res/drawable/appupdater_ic_app_gallery.xml diff --git a/core/src/main/res/drawable-nodpi/appupdater_ic_app_gallery.png b/core/src/main/res/drawable-nodpi/appupdater_ic_app_gallery.png deleted file mode 100644 index f64a462feb30e106859bb8c2fbd748b5eda4b8fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4472 zcmd^Di8BBQp20qRmfnFRA0=pjr>~EbkEeI!jeZ|fKE4Bd4)!jf-GBc! z!FC%qFeb{CTU*C_{ol^)?53^#CJ4rHci-FF+aCYIt*qQ*FnHIlZVwD{3W}&eW2y#V z`$G@6wT=ElnC0IBd!#{u#5VUnOVhg%YfWStfX!gi; z2!erdU?wJS;oMfuz%(#y3yY`e=rNO1nP%p67Yx(Ln4NWR%?!kPn9IyBW`e+Uh&{u> zh2i7J@$q35m#)Jcxt>I(o&DbSHWLVBT3Bv6V|j1hZn?O!33y&=D$UxK;fm!xso4TU zSVT`62(ocPhV>|q9T(5Q;91sIbO&b|49@ZP;y%t}pm7{5hTGUg)ic~YtI2@Cwk}?z zTG>)^*?6@*LjprYN_j!tWqkTnYsH}E(-EUYbf0g z$s)LISlY62SehMz=S5^}23=iMq@pv7bTs)4AC$RB2UTN7*LEd(6-)>*ux&>(668z7` zeiLH9$7XLr;Jd9)X)xsO`uZ-F%0OXQI4sxq3JZzc{qtwl+;-K}dVjqagzi1$Iscm!>rgFOp2`e z)2!kh6)rge-XO}#^I(RWPgUeW$X}!yapW`dxp%Z z@W@^#W{tSM)r^8wPd>@~6lQ>vz5FriW9AJsu%q#reb*b@{0(U!vNu?i;{LinQ|5i{ z?+8dnlKafe<)XDYq|G&|14DAEj@&bBha-gcwK$AUSAsz7_Wgy(WYdB@P`O#yKnZHC5?+P%i-cGM2(!CpD{_8$@=gy|r>(E;H zmT7-o?=ROa$RZUU-N>0^J-^v@1)kr6gM)MZ0IWHoZPwM5vmD$%KFZ8nGaKZ$_OQ^< z*;(+HIK|=faaRwLx5o4!Qk`C^!~SK|~P zC+yb#%#B73uC|GyFkmZ!a~)_PdR6{*G=F zE}7Yb;#%^8ar0GRjDFAo5OLXv{LRiBE<6^S7v_+*s!0r)cK1!#SRD+Be^#;fjL~*p zY1Yil9v!%BdW3ef38pPG_2P_gpyK8)HR-Vtr-wE@W7#HzGj<1#tj*-!{r3{^RpuD} z=}Bn&O>yYgW)8>rUE`~+>vFx*Ezoz_EqdLjf!bpWfysYK&pu$k%W%I^t|wnxxcjOH zh<(tL6EuOZ{9YcWv_f?7`+f>>^LW6#R)XajHV6NpGT*N~y-@?Z!T)&n-K!^KvBIiF z^LI_!4X}^APPRW0w3% z=d~+^4kiW3rouPhSl5{6tBMF)CJCxd_&-l;mY-D2bTbe;E;^Fmg^)Vk5=JDxyP)hM zRUfX}&+U91j?EODM&JRlj^A+72j6c7wX)7rA|`l@k;JNX1))}_7P}`?__@o(OUC>s z4}AKr!;(+S1sAfN}y}?9*Xmp433tiu!~h@zO=z72lMB zurNK1h@-&a#>R~mbqc*_I!lhT3Q0Ww6FPcbdKs+NRx@bUWDIfrvon30S1byw{Vr49 z`t@dVa`Hc%PvemdIIJ{&IJ#AzzVQ8ZxVdS_IJeNgz5lCz;R|x$a1SaF-nMgiS|Q>T z`m)Y2)61K8w5i|<&#`q!3Jq_=4z~X%iU#x+!tXTfKBN5TdjA+!J>W8)jyxzBcPk(9 zcpyi(dYZaX@mE&Rq48_6;m28>!_`hl8RK2fp9F4UsZWA(Tr^{X%vP4v9||YmGIV-0 zUwY~Ol>`?m_;cy+?MsWzX_8AoATR-2^^q!&f=|KJ39QW26>gbpzE}pg8TE-tpC@fXHc(?g%Bews@^A<%FS&uA44OvjWij5NU#XDN& zlnN@;O}9Zaggn^dG1j0%vI7l9@fPo-8gHAQ0tP83Jfmg5!= z+_l)UE_=ENNJ0#@QGgTH^7wnO!{4GL^=i*)rL>_sy7d}PC||8xXwh(9LOUuaZ=5|@ zAmnH;C!(-jj67594@%NWJNjBw*&T&G7i63O)-#hIRgwdUWT(v``lP61F z+TB&9)StW9mXn*`SU)h7Qa?=Y`&^DZx>SsEL{%5f9Z3(aJEp%m{yFCwSbP&^6BtaG zRHYCiP$;!_CCvdNa<}gE!>R`pp(aLm+ynvmQ{571luRqmp-Woi7GDH#Rs2ky6&c~! zq{adJ7{-=BinEq^?>XH!!*s08f3<2pOeV*H_9p2YV9Gx z`LJ&j-1wvZCVUxb5Vun<9K2;Pcm`2|A(IBnDojm^0F>bNkkrQW^6L`Oc_wK!k{PPT zL0kQinkT=Ncwaj{nQly9SXdxrrhB)c&|+|ZQpWStfH5_ibpY&iHvBB?5H>n8<1>igvvQA*)UblDa73Q*X?@bpoD%M)Czd}@XLfx8D2K-G2-uJUm?3NwdMw-!G{ix zPU?M6tVX|s>nsj8m?nZq38&!x()a^&$XE3FHY0y?`yXYxqP`;YNV9Jw{hIjUzB{97 zA9=~?z-1|D%rcEu;!unKjS$$zMCUDYWQuLbbkX?*41|Ekj#XSYJ&v# z@a^Vj?`L}S1fCDkcu{mZePKy=iAX6}-dy_|Djtme6tAiZz7Fhva2 zU{*tPh86)iInZpMcYJ|AdJ`ipbQWb ztD&Zv4Coxb(y$xkH|{uHuc0yxq(kg9)u-zl+Kwj=-g@)?Ud}CT#n=vX#@K<|D(I53 znZ6FyO!4-zf{p9`HWs=wn*AL(wrqh_wka^Z8X>Zt|zM4iDrNlYVqiH7%72XY&Rr0uyIR{{ox!8kUKq z%>2xB2_&JRsx}YQnj@9%onhlMkS%M~FCBDoL2}ZdtMvr5B4y&z_yw0Y{r{9}7y_xP z>XYUAgA>1+=OD#p3EqpdNYG1Q;?d#n{_S;@I_yK031k6iR9~?|ar$IEjOl;4E+^0G z&`Qv<&PbZ(g=WVUrEZN!z_OEJ35<(-0y=}051loV_k1g|9~dVB@+tt^+KP&$Apdcv z3kOnEz8xMEP>pUHG&RERTvk4xt4ZlYKY#wbFH#_c>Lq zo4QYrL(c`4*HRx05p$>hiv*11$5mC_C5jx=27*u9X~Dr7I_dCVF#e3kf8J0UB9$}L zj|&OKRX8OC^{B+6H>2*RMMv+9~q=tX<1(&D6J``>DboD6R@s^%sw? zD)cW`Q6tajT+|v42;8;pM>k+AAkJ_#zs#p{5~5mX%6<+f!CK>^ZWo^@{H}RcF8yJ1 z6I=I}SN;c!V@-1JQ?j2-KlK^Z`iP2*XxmXhFATSDigo%cw=|#n-+dWoULw4>he-qA z68M8#*;hQVWvn+=tKp7vxi@`#9)hE+GCeM+$9p!758@CKlTBm*+cQhgI&$ z!sfLOQ|u|bBIr)}gOXFm#pOzZ8@(ud6*Vz5FtPJjvIcG)@bha$bwuk+fp&SjjSo%> z@r?_7C1l}uQf=bMPO}JKtN9M23Q##uu4%|5zI0v0nw)fj)EAZm{qb5NUU5b!+CIFy zlh7lkJ=-JIwp%H!`-Q(dMrbUnMvMqzj)6F9yd08?dNYYPzw+i%xO?@^#?E8i@e51V z8@l*7ImK3K?Ki7B4~N%ZOJ10-kQ~*lW&KXxk(7SUDrL#vnwxK}u4%U5^@h8vZd?tG zQ^>x7U(~q|FyHj;ts%TMDY+EU@!HUfkX>33Z1il`aozdo-qsw_z7COm_m)^Ao!g5n zD!AAzd5!St)!Pokn3cs|Bs|kh_@C_ZkHt5e)uZ2|o0dzWUH7FWb}TloAbNC+d7Foc z8U^Z^&U2z|rA~f@Y}^X&Hl8(LO_%Q76Tn0Z7;44%%@rfsFP=mL?;O+)8+F_JRbXJJ vZhh@*%uBPW%St+DR?`6?K|`x^B079JTI`Y5k#lnUuM|Eg2w~G?MNIrZRoO^F diff --git a/core/src/main/res/drawable/appupdater_ic_app_gallery.xml b/core/src/main/res/drawable/appupdater_ic_app_gallery.xml new file mode 100644 index 00000000..5e51abbf --- /dev/null +++ b/core/src/main/res/drawable/appupdater_ic_app_gallery.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + diff --git a/core/src/main/res/drawable/appupdater_ic_google_play.xml b/core/src/main/res/drawable/appupdater_ic_google_play.xml index 75073ebb..514c93fd 100644 --- a/core/src/main/res/drawable/appupdater_ic_google_play.xml +++ b/core/src/main/res/drawable/appupdater_ic_google_play.xml @@ -3,16 +3,16 @@ android:height="31.99dp" android:viewportWidth="28.99" android:viewportHeight="31.99"> - - - - + + + + diff --git a/core/src/main/res/drawable/appupdater_ic_myket.xml b/core/src/main/res/drawable/appupdater_ic_myket.xml index 70a5f016..fc80084c 100644 --- a/core/src/main/res/drawable/appupdater_ic_myket.xml +++ b/core/src/main/res/drawable/appupdater_ic_myket.xml @@ -1,9 +1,19 @@ - - - - - - - - + + + + + + + + From b20265788c94d90152b5be5081967f87f60fda86 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Mon, 15 Apr 2024 20:22:19 +0200 Subject: [PATCH 048/117] Replaced aptoide png image with svg --- .../drawable-nodpi/appupdater_ic_aptoide.png | Bin 20452 -> 0 bytes .../main/res/drawable/appupdater_ic_aptoide.xml | 15 +++++++++++++++ 2 files changed, 15 insertions(+) delete mode 100644 core/src/main/res/drawable-nodpi/appupdater_ic_aptoide.png create mode 100644 core/src/main/res/drawable/appupdater_ic_aptoide.xml diff --git a/core/src/main/res/drawable-nodpi/appupdater_ic_aptoide.png b/core/src/main/res/drawable-nodpi/appupdater_ic_aptoide.png deleted file mode 100644 index 3ffd645630c7fce017ce1de1709e6cf741fb3b08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20452 zcmY(p19WD=(l#2~$;7s8ClgF;O_GUi+twS~*2Fg6*tTt(ch330`~CO!UcIWi_ES%F z?Ov;QukMael$S(=!-WF@0YQ}dC8qpOX8xzbK!JdOf|;)3{%e3bDNBliR8Qfb{%ZuA zXiAyN$$`-R(_ug$LD4|K{{#8=fPmtHK>k+;0g(p9`(Irdl=^=#U?3o279bG+gZceW z{-+rKtN*VD8=7IlT{XcG4=~8q51g!lpEhi8VWP|@y&@!P?i+^ld z7OI-gnsTzdMs_xg2F7-VCXDVj_W$t$;dkf#r`nh}8xXtOSlc@Bx(ks07s2~a|Bso8 zl=#08XDb0xO*uv4pLUKW#GH)GjLf8haKyyK{Eo(^yvkw{|Kt9zB|vKK>}=1=#N_7Y z#^}bzXy<6g#KObF!^F(W#LCL>55eH%Ve4$*&S2|A_J2tJUmh_NCnHA-duIzfTjKxl z8W`HSI17-H{wL7?mjBaFXA9H+8_Cw`f71GwAk%-|FtIQ)GyO03KUe<$Sa}s3ElmDJ z{tv$(3;%zS|3BOR#NlW9Pw@XwXZ}y7|F!;0RS=G!>3=_)ARNx0U1$&xVGt=X5mk54 zOCMN&UGe0nwr88J>uiAlVSj5B(SAx%FtYII3-aFZdg{D=)+vO*aOr)x9(pC`;GJq} za^i5n2uz8HD~!lUD1@l!+@{oZO~>}v)n|{&^OBFtcE|POIR|V}f^SQTN~wG{uZv|3 zDXvMO$v#_V%9|IskDF!5tp%A$f<>B`g>Z2(fh|xron~^`{@7E1uN&TA`WYZiR$z;J z0~LsnfFBGIOv-|2kLYIOe8Wxiu+dB%VGiKqI~2WoqB|yb8Ha%=k;)3x^F%uCc#mA& zK6b|xr^9NCx5y{8=M~ec#r5F~QiLa0Mc~l$O{w^{ia9&1&%DGd`+`2FA*50J;2`3I z2-yu#m4-!Culk!|X{!U>u?ttx@#s?V-6WTNRj3KkCm%mTZ}s}B;Wck1HtXjPJXCdq zzo?j{2MiXXz+f_9b6wL5E!P-eV|**q$z`yQ9x~yZhQ2i>OY%kNDDKYB&534|c#s*v z1W`=d&}VG=VtmaydS101n~x>YfElRU52XW4E>b2jVB}Qt2|y)Y7&7h;H0lEg+}`8@-RnrMqvr7RODn!oM0#&kGs#24^=Rimc-z zQs|D*2RrE9mTF?zmFNKw`HYz}q|KuKEn$w~SM?@Augv`?< z2k%HjM%9c;WBP%D2=#PDd8*tl+=cP3YGr9Pu(wcF{gx1g#RxM9R&1L95xs97G(~QV zO{eTBF;>~P%%m(-U495~f4g(rqj+Zg)3#LZg;ZaiiA7Lt^?=JIu_1VaHA0Pt^Um^J z#4S=ufp@iqeIOf=ARb{UC}eUXc9CYyKXD#Z}RJP_^R*>?+?jc`DGwNQ}-j?pVFa4i^wOlkEW8Nq$zB+ zKXHrIZXpdvbkoWw!Aun*JNB@Pn<)ki4|KR>@I{}ItCPG&sz%tm(aqF+kIEGmV9Cr) za??telS~zP00AU{-vkc~4oZXh636REDB7;Vg9`7QxOvt3@c1liR_>WbH9K!w`)q>Ws6-=Z39~FqNc-&{bDumAVCH!oG^%Mo=wOT zN8x^L#!Q(cn2yfv2#M{5O#U*XvK%|cqMS?x7jb>b@gHIP%acq`x!Z3`Ed4FV0Pzya zGyF4M*Ug35rWa4PCf_G;V+j$&@s=v3!C_a0>?T+aG^kGFnvDZ)=Ea|zT=c|jrfN7( zcdWnBaSA}buCLd>&mi;O9K7OcN-m{`f^i+o0@gSc_?~(emv)De@pP%;Co(VjV>snifZd8AnC6{*~dnEtP{!1sxa87{}8?8DF(S8P%nItZLI!0Oc8IFfOv)ERDxbPp5ppA=#bs$C0!gxcC z2=(GjwvSBUPGuA|(JjX5u41*%>gfY0Ox9I|WY=#R`e4 zDg~n|>@J*P&bp!IlpKoor|ekD9yYYg9)gG_{qq>uA5jLOf(?t}I{5ON{2ZUsV}v$8 zBt`Jgcej2Nbn|3Q=m-9FZK;qqsOega*N#>fgdr~GA|>8C!L$}F;a4hfHED0F-$t#6 z-VMKnQ8cHuyVnSsZX=MVI(3+#>q!PnV zym9buD`x`)&?06+5!L-_3knL{`_nQ*txEd(Mlms&l4N#o8>8blBHKxmP~*wN-xWJEWaQ)G$5cFqAeEDp1-{sp7?>kwq$8P^EakFC zXQN9)Z_Q+Ep>j;`a9=`b!h7sO$sbtBSos~K25U=#{l!R>qTzSWawh{X1fkr%ADZkBW2&?uS= zjueZHLFq9HmUL1lhdld%9F#SD8Luh|v_chmp27_vWNmF6y{g)D8m|$18)QiiE*i;I zPw-eYVrWkX-J-7OR9BoOMCV;M$g(>yLffw?n(J@PYIn|=olj^*^>7-wLKPdweJWZT z@zfQf`*K9}g`jP9Gx;S$J-iyX0vK)V2F0Ti6G(FbkgF$5EOGvy4oKfDKZEaZn_}nK&7-ogGL`k5GKvH2-NUggYWv%Ej$;x=K^M7IeCZU90{@P-w|z zcK9=fJ=wQb@N6Schb;=>rtKB6H;A12X|S7R#mjGPh2-2ffZ0(rs9Warq|wA^>Ct{l z)+majI_83z*nS(&L_XU(_@K^XTQ2G=Y1>l`f~usxskufSq+UBXG9~S z9{Xg2FOs03pv?dMS=s#r(K!V8R_1MJ;nj0MnoC>W6pg~=)6NW5J*tbEn$#v3wSo`( z5AIoj1h0WQUqR@p3>V>3i98ck26B7Eg45|3Mq)M$FyYxari}{z%q{Lz!&Wt25>Cg4 zS4Nsp;~Y#|N~*FVS@EANIyEbi6dd|nOX0FZ!A^c`>+kp42 zf$c|rjus6&IXn0}o`ZSZ3J?m{P0bglM4su31$oo?KywReNGIQgU+Yvv7Ov z@dMZM4ZKV_w|I=Oj>Qm|;s z?1mm2kMO2mwnBXBj7+*9RtPt{ZTZR)6<>-}%MQL`xcqBxP+soL4=4*WQ@vDgszU^0KSZa~>4lh3o(Q3#Gw zvr0v(E2y11S|@iK@cb#E4h1;S-{IMHId>Dd1VSawGHj|xMP?SVzV#QUY)Y>mTVXT6+aDsC6*bs8$+#9?}nIvG^NuGK^gZ>^JEIL4i$ zd=x!yBcGLcWyin|g4ZAzoc=PeBp~STl0}0Jg#XMKn3G34@3zRw>J2MSrbDT~{F@@f z9260(dCv}F3jPaTUrOnN#2*@4iJscvuxK#W{@P+N^lss0$*WmeHG-+Ip#kIOVeiYdqqG6=U+I!@) z$Vb%Oe!Y+;AOsr@_7wuZQ@VgbFr_Ix_b9)q-+8R=jCUHlI9D^mz|+v&CiQ?7o?quK zRi_AGT>`*^p~Aj@5QqgBYz(@A!Vr{!Hm`?0RLz#vl#94Yz}XT0Z;042nDu}B!XQix zwBAb5iN7F$T9t4^W;ex_fr5T+8?EiPSBP|wBH|wiW88l%;hwEZ4bjg0R9t=PvGpZ4 zpK++*lA<6HbU`_vQucb`DtBR$nTAU9bVptr$Tl-hx{K#bUaz$DSDx4kLjhJL9?L98!hsz9 z@AJa$U?<^UMV@&rs&ENo5m^;)tj=rssO=?O8Apr_R4r-{*Cu@JGNvvg+fX93<5Q(o zyPI1_o5LAhot@LTiQoFhGUQqP+ki7md~W|k7ba`9bV}!A{@-fxl5~16KQN7hdS2l3 z_BC}084LMb2e{2{ehjIpwT;g<7~a0_hVxs{^g+GuZJ3@E;gub|X_S3z`%0N^SMCr& zX?X>(ke!Rn+o*m6V=#E{&rbx5U_D_dBN#p}1rCw*8~?2>QiEg zM-Czp^W$Y7d$|TAE|`WUW28$T+L4?=ntG5ZtA{50cn!YzHT71-2f2QjYPt?&Cz65u z+Tal~SMFi1+u=MyS+WcU32B(`u|i<#nj2p$jADI6cJ{ZllEZ4rFQQ8@!iM_MK{z)n zU6FL8N%Wswv|5gJ#GThU)B1nh1%`ffc4rt|>8C}(Lstd-p6HUSZGOjvLN1G2>K!!1 zB?AqQ4_<4w68*cqrvm%b&!z{TF36rxl{#&i<=mSh-*!4fn#W;mHp1fuh_pn+1;U~?o`0FBgdg&wcQK&x%}7L-9-ccET@pEZ%7r`TR^d)Th#WbtrDf$T zPO?)|=LKH?&w(`P-ViTtY~4;Mz({8Kmr$4kzd5p>{jD+xqTCt;rR>zGD#cM>cb-_y z-{N*Y2Dn7Kzr|l2nCQtw5ovIXIx)gY>E`+MPFMMJiM43lvPKAbzL@k{@GNE_eDER{ zEvViScCD;=Tot3d(MHpeXnIn)9Kig33{(_ zD?-X|P%7oa#4_BLN~;W0c`edf)hwf_ud9@bv=Hg_kDEgkNGpd1 zxjFRBU1ik2Bs5T$; z_Zh}mzVtdNC{81%Bw`LAxZ}7wnCKd^L=Q|<8%Jgu4|5~@4kAhQTjqOa;{JO}|0|s6 zY^!3Dvk)HX&VwLAX-qT#>L+zJkv*KCtHqmnc-jx zjFH^;lnRyGvmk|AJa=>=?7)?d_0S-GNp@t6zAE-`tF<>Jw)x&&di!-ly+lb=lIYg% zD8VBEQGdach@?^T;Fgcc{vv39w`7GL~b0gBJNkR>Yu{&!_FmhHDbpF0qf%-0$$UqRWb_KbG4(9Qy?NOoru+)@6>A5DqGJ7$=czy(U|hwrz(*Gd7>eRF>|!`QX;8&pdUr!dNaH6q1sf=k9hBo?L-H5z_DE@d&<7+#fhn|=W{0)m7SCsJJ5 z%C7+wzXc3hi0L}I6wMO&WaW@?f8OHslEn67JZ8XXy0d}zglOtWJ7h$u_H2fs7~MxT zut&h4R)qRhRPR{2I%4(o*j^dzWA}siJ}D6ijW1%wPT^Np9E3JZEBfS>Gd>$lSFN#% zEs%%xu+;=`6Ox5x^|Dw}Lg>)IfAGN9bb+&l&4EgdRWq z30?HU%%ncnLUqHClJ#Y4i+tQHPyL-SNf8}qM?xU&Uo`~6alOk#F?`Aje5~;O5Jz6TO4dYWJ7rEY0t}zdb{9z_;s(nfCIP}RO1VxJ;-Tz zm*KDu847j$kov;>iO3co%g~L3JU{PabJYG~+kUglsF%g-==__rTZBShA`b87im$~N z9nP4OQ>Db{wy37AIm=Y8vgEBodCNK=J6SWhFGAItzVY|Z5_yaU-M{^e!Gm8)6u&%a zYLPk{%WhHzU~$`^U{Ipv^%cZw=h1E2FMz#tMN@$j z4F34d{>)BuqTRxn~c)G{mS}+uivyvyyK5=UymT9VBN$uQQ)5 z_hk$PHNJu}L}Jm(?Q$r5RR_!Rr$g=P3>RBv)nU+U;cobC1*hdIao+#XLLHXQT^ z4oFQ)AQN8S4i-z6H>WzP`z3nM*5QO9dp=$rL zhmFtdSd)7~pVB?j9KrH*HL_9}VIn?<@BH6^-ELN9Hkiv;bQ4e97!bxVf7a(ygS>Mj zgN5IZo0Hi{V1xbZa_=Ro88YRoahZlmJ4y`z+EGlSC76kIt!nAnBhl zyb&@pk&~4OFJomt*I ze;#nBUp5Pga)5uG6k`iM5Iri(20Id==>iDM9sQ6IdaOTYDZ4SCpJ(Fj$N;Py9Bq+d zL6NLLL)_G?(9EQFTP28Ek@AWamN@k`{5-JnSP=_S23d9%U60)#ty0~@__`R=;7$+8ed8?RT z7yM3JS)0Si$txr*mvKL1q9%w4fE#T()_Fs=^uLC4(oyg%<<;CTEcWRZU)vz?b!@I$ zJ*!W!$KTOZ6`8zdS!cb@m9B*+O8t%Y{x~?4$>LLk|5hTic_;ulG_7k_P|cgEX;r^Y z5ouf7dBN}4#x|?WD=N-=cqeIAZ|U9C@T`%> zZGe;Qt7!36`&<~>wqK_0__$}SI(`~t3Rqp?3b2ENrEmJ<>O-zu_d*0DzbvYvb(3REZ^FU33`qVHy4CBf`oV7=%%UC5D!ehG0 zpC7VB)M{t<(mXU=+pAor%m=SQ>-{+fF9G3mK60TKCXbX$_-tJs7VNO#KU>2^hBtDu z!j0elFqUWM$;rT2;-GIb!Udm;|9ugT!zIzN+obwVkZ9=;s6b~ka63s0f!t-x#w|ID z+3VXna=vhr$jDF+Q?W+wgxcd9Gf7FAnvdhSixVJjS!Vg*nkQWKlFp!A$9i z_Pt7-wGnRo0zMtysYvY} zHo43lhO78vP+e`5K0@OFL8li}FE;TEZR~T9oypyCser~Rn=u5~xEMpv(RK<6zN%i$~J8?D0=>pib!HVbBjAxO)`>5)$3Rls6rJ-*AG-UQtv6q*l zJ|$7wu7uHv?cCW;e!?uL!)1yxoyzBHc_8}K*LndY6Z3ZI#-t8oR|Q|BR$mn6_|ICX(Z#QDZr)Cq z>=rr9-$2_v9yV-3bl5lR?Aj3ShHK>&Qp6myiQ3^&&4|gScYk>1Tokg32Q40M%ePO1qwt@WxOw|nWXrAN4{ zy!v^{gpmE}Z%06y7A!l8p)D1B-1g1IZ&yW*PVrHgk~*Mu23EATRjRGE(QbWI!`@zv z(xI7pVZ1v5Mr-gEo0^k8xSGy~K*iVHr+RBx{d2Ur*VyQSC^I)+w9}g{jLx!A37sgk zQ4nA!mBK=<=y54o_IR9gc>RTPBJa13QU2>EN;`iH1TJ#J_rDYJc#*y~?tHGHP>tPJ z(Aa1eL~E&R@%t20@)&y~>dw-FGl0;tG1=|oarpsoc^5Z&GHUeZzfX=cYQFmc~ zD4#S*HHKZ`LmgQtssZo#Nc#p(P7deK{@cqk{R3GUAVKhW{Lzy8BP^{rfjvEg9*JjB zWqyMA2C;mNZ-D!+n|EY=t#dio81w#10>%>&yowljwvd+GzKjQi0n+@=fOfKu%l+^@ zl1MPgaNi9<0YQw!AS8`9q=Jb_u|9Swi)jlRf{pq}vaauliYGUwsycoYb_uHNz9@E< z7rnT*65O`NfScb<73&AFsuXPdzLAYYFMDz$!u;GRTDF}#9$;6VQlnfX2~S1?p+&vU zn5AK*%l&qbr4qoSg{sWr-gh(*1bvO4_=Qul%ExKk8`q5s2!b#17*3d@sM$3LC2*b* z*$bosu$V5+iX+|eUsOPdl@X(50~^Uh!TV-zYAq?;W6K_G&Icd==F2rZ-#VE~68Sv5 zNMRi(se%1Tn6t#}&Eb$p$fAB3%p$Si=B7DAbJba=1O#c6=>lM+zYDsFjrAXo1Lj1i z3LM5qQu%K0tvg&V3nC-o`k0aMiB9XwC5PIt+F=h6RX+1DNzFRSN0ry)84GV!g`DQ( zP0fk676{Hu9;)4D=u5Iw>Iw^gGXL%B%0?3Uu+LyI8k)HQfU$3X8azBJ-^EC>gakCi z0NGZObF4a z;+Spu94%g2NFNx{V|d*+n(s9F75!N>;BZcS@uZx+Kdsb@;A)nOvjg?}g#?LFr{-LAnIe^A&zHUt%}rzP<>Q<{G&+p!lGhI#Tqhq*mJK@@x~h85Lg&qi-kg3R`*BXc85 zfBR_x&{4RW4pVVk088<~?%6XqHfOn4C02PI3jnN)Dgz8w^I)X&>zyM5;r#S3e(RXqw(_8sm)Ed=Gz?Ryc6b zba?Im4aC4v6Ol9@ra0S3J^w;x#2{x86`*QICw3h^#oa}eN^sn=d-`BP0>ow)jjDPO2aZReTlvX#ZS(fsnS82_ ztnAw8@yC$HZbAM!IgEGKgfA`*&PQZ+D~0}QMEi)}0u;Nz6?1(s++ovFrF0ID7I}^i z1RFme=S8{WDG&;nIbtW>0{r?G7vgPiI?S?QFh(JkO1-}OKjI^f%%{HiFmEfVMK$1w zVR~=gEnHdYDU{=0=(2Cz?2V2U4zW1*GJI8el4*N~T5L<6td8_e;M}&_!6%Ox zpCl0-=3G4bcYAp;ho`UEEasTFDltsNA##+7m9i zpXJZmU-$K~&zZ0;8C&b@nc>}v9nB?k2P*Xo;(9uctNx_K8s}nCK^ycOzo;`wiefO?mzju0^Z$BN@ zBtd)9m-lGP%_+e}DudkYGISFICR)-@u0-?YeE;7Sl5*1}lv?{D)KDm5T05~fCvDK3 zNrSbF;sYkw*G%4yx^E`n3u*#$|B24hzp+aCc?E;&C3)=KQoMJHHtEN3PliV;`9R(q zbi9y3BeT9NCp;SgURR1& zy@%uox!;S++ZP*NMUzupX3VNp=-1UmbPa-QnX(j*LbvW4bTOR?L%p%|R?M-yhH%NL z5cW#N%4_)C0K@>9xwytS?{LD{cEfCQVx6{HlTn$Xo#R6W0gu2^_!_rMcA)dnCt>Qg zL$?7x&nT#yUI?DnyNt5-_9f4*Kh0vRPLx%sG{HIrY=zM9RA|#jr>~Qdr%2mp7I!Vg z7zYd6foT?AH#XLB5&W?q=b%@N`5O0rWgmx4}aA_f-3y2s-f>qiln zUmF7;A0Q-D8wHk;Gq7lF5zFbHoX49A~6 zR{%xXth5d~eF&e$-o!A=F7{!h{x5|$feX=7P&ek~-aK_HPYi;5zx{N z4{nbo5tO|+L7T zI#hv13v8Od>v!IoCjnrSAmL4=t<+eui83p%+!nrQxpK`16FH4TnW*^}^%2W9^a}<2 zBp0Y7Z*mzfLr1_BE(O4&f>AUQ5|-W~l22UfA3!sG{ao%42405Cs?BJenEjGX3_ti> zu1rx|OfT={@;|t{%lk8A7EXNC`i7Gl5*Y6tMv05s>6TZxjy6EBMN&aCOt6*juWt@w z*!%466q<(eHU6h8MHlbtPi-Ufej+sk1{&k2Y{YwqS6^PY7+9+7-2;s+B_yI`Ip{4&O2n1+*RNqbwA{Z8a{^h{;b|$^dB%H*Fy^8h zDZ4#yF9UZ8Uk9jV!o%QD4UtDW#?F*)zK0a8wJDXD?&>r4p9VlkkccBIeeJ&Mmfdew ziM#2-yB_yjpujZ@@q3sRgn}D`-eu03l0m3ZixiIh!rneJo5nr_UXA;rYwRD&R!;^C z%=R32r!o7A-?wcm$Zfgc?>x13_WC*tYdQLmmCBa=+d3O-xlTrY4Sg*Sg#V7YpL;Z!Lw+C&`A?Ih*)_R}+lDCEJL73OQM zvj&0L*}XJ`Ncuuok^6=mSAzGmF)+55Lsba4*XY-x(~aOKu7z&xc)Dfk-fm!SnM@cf zx+;6?RUB22*1ks7zmL$F1XjFPG$0oCOuoEhWWr_Q1fApZ8T1&SqAd4zuklr4&5%qj zEVjK>mXRa_48p27(YMPfd<6!&Obq;^_1t%ax@Y|L#Qe$aYtn3R)P`_F1(?TnMCifj zNB3%MxK~)42OWUR^MInFp2x$+cqm^~e+YUvs4-D8+uCEJx7K%LUEi<$;{~y6A~K>a z9c-yP<{VxW1H2sl6~iA;m}+7}0GZ4^rk z@O03P;IbCX`%LJtiC+w|=iS9Sw-Ne#V9cJpj6m>rmZq2h&#YV=)F5?)F(r3u&JF&- z)>eeuaY)l2+4rc%u!a&tiTJu<5PVfS;{jRxO;bdR2&#aXn&Q$S;| zjz;FZr7BFUCE!aR63JmDe&@W0Aj&Gel3hmDvaD;i@`Qimi(u7~`Ztj)tiRFT_G7s5 z+|VD;{yN}z{BHQtt&_vMCW>j^F=>QW;TAR8$a}_oGHYQo63>oEIK0y zZb#H(4x{~KIHTd!Nbby7##dmhJ+2H`> zM;eaOmKk(oP8tl3jjX**B+FV6*3?7mc2O#z)Lnz#n;vNTEGPsJBN3r9jGbO_k?s5I zGJ|eGE&`w1GLPDz6=wD>H6|_AH|HEcj8g3)V#te8VKWzu!;sR3L+pm(r3LS6h$W)# zs)m-dxybTu{5AxJ1N4Pz+|boqKaW!W-M_cyAzoyX7y9jUvx~|}Z}1ZmC0PWReJ{|$ z;0bwtp^)ztJFYx1;=8bLbyMFcv}A7In^Oo|JCk2qx||H%f0>(c&v7-3s4>G#!p}hl*I94L9*}f zRkOeXMM{N7Mj=m&9=Ba*6ig=?CPFEP>$$p?!JSrk8KvC%;U9sCBST96F?mqHoCTAN zTq2suP)Yk(1!pEu+^Dzm1Sm&l{2N%Pq_x!SuN7kDVR|rujvUyX>1E6Md_&$A{KoS!Fog`t~8R2f=G4Ha}(U@wM+j^@w-k z$GB8as&y#6F@{;|C5WQ@IWI(Q3x4cY_ni4m2JIc66yG0JE_u~$_%xjc`iBYLlcj_^ zU^g3`dFAL0n4zo(2?e%PBF_~4{<(#Wf3pue?kqmz_Ijl-$rH3~$7CvKt7wo29(Y3# zrO=CXbIl7#hz7_AX7L;d}AADg2dAlvjV>BSAr>7c;w&If9_Ez*6-$nm+_f1Rq%bLuQQ@^@xCI4 zo6?NdEop@gVUGOM^At?=wVbc~Rxr`B`km*MYSO-}SzdAF?@!&B zka-N?D0H`xBYhISry9LElscxV3+1~4Mlikh5sgMpPU9HZRSh63_z;f?z)rI6gOEEq2ouI$g2U|u1EF?vWeu8#UbE=P zO>;ZWx^Qq5*Z5R>4z90(^5*lOyd490Hk|#)bdwt};&gAd2pHfY2)8TxC2$qtC8k;A zw#Weq0$QNa3F69QOXJ3UI(0N4z%~mV=EY;2Gc?~alVk0m-c;0Sl$7D19mF@JE&%*U z>CsP!(trOvC-3AZQJ^w($z9^igyC^R(hS(iQ#-M#C`eGDJ63wOo#JS{SJ?-dLNBr| zbRS-nhKF8VV~`ww+px-YC&_P44;{04sahzox^ZgSg^1qVV!1GolBG z8_}HGl68_op!s|la>#`KvX7wq)b>r9?V)hPU`N9vcxJuPOR3b(cN*m%flR-demFgg z;!^a?(QPjubQ3^~%VcQ6Y1-Z<#4wA%WV^FTNzoE*@qe|a{g^j*^_m<4g5FoS_i~+I zh3b4pHKa$^b{sP39LYQ7E#BY^yUY|F7XxIK4and{pH)t2hzi%V;uKS0 zVz|0#qS3~?ixCPiMajpDXmzbv6_HkBq}4d^s`(rd5_dtXD4v_^FCLGc_@pIkC%|k^BxDn|h&> zm^L4aIz5R^g2>PD7aPG%eVz%Hr<``lP4*{31TDG7n2kr7!eTlDohdr);zQyCnZ~vb znK6K4h^+;sArj^S3Js`1TkH#4znaSKlUsALwbrmK4WaTUN@HeAP)L&Hw!(1U4Rm3A zZ!09IbKrqTd6H279211crYuz&9bE}Ijo7a)j)echOAR)ND`=LHe=|x|QfWp3Vz4H& zt`0cP-Xx>^yRO1p{+e5L@me_*Ei6dC*j&gPEM_1@@+fFXv#44u`CgIz&8k&*sw`a82Sf6_$G z<5Dl!dE62+vd$6U3j_kK1t*EAC;jYNRPuWqIl*s@B%Pl6b13?FW&K8M?1ZWS4zu=W z&ftR-99KkrUp5+vsV7L#r*Wic6G~Xp_kx4jGjdOrHE&i@1r2bu`+e zgcUr@(+w(zY~hUA4YdhwDtgZs`|Fn@dOAT(_-NkTJz?Hl;*!7Z!Ya$zi5EI|YfZ$s zJ3U)-^a1afmICzw)^V)#uag`JxDS^i-&`&0_w{WGvBWXchJIaQF>+gxMe-1v>)nMhUzUTS*eT zMKgNQ!~3GOsw9)1ggb$_1exG8}>&Z*M$_t1m$V*NTS2RA4qoM z8c~fCJx!rCQ?1IVf`Nvy)-J`-U$cBc3S?C*SR3iY1;J`EV;AADnJS7yQu-TU`{uIp z^Nnv_b%JNsjUqO{IyGXe!2;z=$u~0?z)6A;754`W$*D&A&05FRI4?s4EBqbMM<=elR1gb481nYKrX45ttbm5gO#}jM6I@0H4Tn==bi3+$K#K zH0m&Ki&95%6AS`&ebX+2OyIG(aucZ(N>&?KTA&*2;L`fhGHoc`B>w`6(OS)_a{7m^ zqoReh{@UmJczj3AI0CUaY4kUs$Cvasu#EaLnGL`Q97jl2EQ8)*cm&oj_;6*FFCN7; zvZ?wtSH!kLr)8Kff?o4+k_*vO$41DkdGLy%fkJooTj57S*edGUwOX~gjmptVp~TJ= z{-g5U)}+N9&CMxCQ`s^bL`Lp3nsQTMu?Wb3pWgRH>4z?2FcHmy@>F9q2 zRau@fn%zkSpx$|)X<%S7F|7w!rwcK>PN&m)+DAy2)wnjeRY6rau&tPQY?Rd1B^pd8 z3+^0QgdH1Kyd-;B`F91ZahDQFnFOUqd%hzde#QcAb*)*kselCxNi^#G;t91I&;Aq?@%yjsxpoiQ8%wjcEN1~3~A7(O5HNt(}m6`j@;t{Y2xJi{2( zCBt5hW7G*DvYheJW^WIt1r5_r&q4kX-hou!Q~v9f0HO`yy5XLmZ+*l1-SyDEGnfeM zf1nz$=-06IT_ed~>HE)Q_Za^zkw4#|&^i)U{tU!!L{MZRd~mPya*%;ehEo1OE_vGE zm1IXGp+}@JB^2MyAv{BVRwlf^J?0M4yW7L@`(S+UHx-5C7T;-oOMR&b%7jg1Q<)ZN1xfWK=s}Kqjg3)F|D9KM zAK!`BQ`wG`krD#Y{+d0U!6Pj0syT*`MzLomOa!omwlF&IYLY-Lzw6Va zA9NJ*jLh)Pn8Ae0=Ar!=oC7(4IUW{{Jl+U2Lg>qMrV_i)-uC9KH=ZG!Qg!4>#C2&l z7Bp^^5Hc_jN&b@`>;im#^a916_+d&@P81izxEQ_0;{J8uk6=tGJY=&mx?) z-Ck_uEdVCArX+_~!vFvch)G02RCoX4cG|I2qt5SLfy#twglhD~cnV_=bohtHGRy|!-lFXkrp7j|qn692Q_IInDfT=@m8``u)ybpsy;F;2*vU2)7@mBI zp;C9GV$ZUllq0rFlOt^HjaKLA#Ye+0Y;TXH(1~MBw-+|0G7DZ`TiXRNsav*)qJR7v zb$=1s?ibf$I>nw*-$UBY(PFU(b>97L+HtZ*-FJQtBgzJx?wX5<*q(htz+7BMXC7M3 z-xiCf-;C{kfy1O6sc_sWa~VjL93;@1s}6YOgas29;+7h`32gfIo&kbIvZ5U9>R{Ii zwQ5K^YcxKT65Ear(RM1o_z7IsaEgV91y3G)adBgm918x(y633pmJf*9tJQqKY9eK4 zU()JIHp?^1=>k<9He9jbx#}cOOmA<#uHLtCApDOHu73AOCIeuO97(crG#fWYYnrT0 zmAiNKJrR$mumr)|d%aVUi1zv~7ibC#{Qg?3NE}6x|NRDaeLbd(GqKXBimCfB7=EbahkMI|VT(GEUPfuVwBuW`V92Nc;eNNhsF027=8)#uY_u-C>}PxA z_}eMM-w9G`k2L~9y+bo=?tY5=hku^RFZw!0f;jW3G=Vl2&kt)cp50IPc2U^f3lfmfXH)CP|MjGX84byqtc&WI?m#CP&aXuVPNkE7MXHwrubF-R5oKFC96%Aup^~{C(Ds`*vw8Wb^e} zl?y5Q=WkNvHy;)|QGADAO1^1_5+7nV`+6y{bu-1D{27|!mr0*;JZX(sr(`Xb#QYwg zlJ{i!KFgUL!dWTd_CEhV2L`BvqQ7MTDK|O5@F-a2%qC2;HIZ@OIrVE!KVimFf6$-8 z>J@kXGDczOzT1puvLkGEo-!>hG#W1x`z5-rh#Wr7yz3E)Mip)$Iyk%64u2}HgijgO#f)`iuq~dzY|8%(Hv5!66b^5Ah(73sa;ZE-@xXaG3`EKQG^1y)Qh3)x_)KB@sUH-rRXw54#r&cXI zV$Os#=0W(`A{YAirDk)n7fq_-PW9uM(ExAmbg?nNLy4OK%JR%|X5g}HHe9jbxnklG z)AmAkQX7-q{`Pph`QIMyKDh~fd;ASry$bf(B>CL&V|!(F$tBx%hRv5=-{pI6Pld>w zkKl`f@t0{-I#H)!EwmjtEd;Sx!5cx+V-^*(BM;`QF&4DMKxII`WGHDBopn}|Cu1IE z^#%232TXcc5Bk$595vPFhkoNb0~yhN&F0o@sk>+ujJ z4Xe0pxMIOoS}iP@m~6wY4&JL~z7oM%79BJ2DLU?gKXkq@*a%disPO1P1!TJvxckqk zJ0F(?KG4&jNF9CTRR7e*a!TMnFg%xKM*(@(f6JYr8~zf8gP?h3*dAR$u*sGmo2E>Y zC_QWdNi#cDI~p7!LyT*>2iEO z2;7ccDsLuw%~GFF!>Pf=%OCDoI}|}<3e}SLpg7k{CUD=mH4A*Y|5bjJqqHPo9=~w1 zR)MFMQ`ki=mzgY=`jVc3 zWTLz*6g+zVM5?I>;yw+ovUX%O$NPmXBWz%gBX{5xKLH`8PnchlcezsFQ6e5*HqTYo zdq8Ep0LZZ1iRX#y9q|F$67MCSrYEXGdN3R_zj@)q9bcENTP9-hHYZEPN6A3SgdaG+ zZeGgJUdB^^B{(yfOeKxLp)>1g*7Pb0;zr*j-#U)}mc~<)e4jR>Qo_JW#R>;_!|V~- z&akwd&LW_gETRR?wO$4&l!~ z9Faf#PXwb<#xS739|yA_vEZ;~ir}vw4^Z_%s0NHA{8A8AKAWjSuux5{d($)=(e#DD zQ)sU!);E7@rnK)~{76R&XQv5MTumr9wvV>Sb2ILU96HR-EcYt za*ahS0<<`KE?ZkcJBixhTc`BLTlp2xfT*!U)Y+ z#$O0!D1hZ6{9)w8`|rdbBa{Njg@gaL=H$W>={ds2VHSWzyyX_Ziic$taJJR53(UZY z%rIBsRGG_tBFoLyObLXQoox6xIPxkk(20W~+{{IjDT*W^Nc`msrs2nL4Kw9jK^Z5% z&<;DN%>5FZO_~p^AU?~<-(1hX+*PzTE&@x0C6^0umA^Gkgh>9 zp<{(Vri}$OiUUb-YzM$b0OIvG?L{M%e*NMHp-Tp9hhVZ*SD9WsQ?`!#Dty{1BALY!u4D;2r+>u?MY@6&x1^3l*D; zK%j6?Vvq-LT9hIe7>dhsGAs*~%dn=f4N9Hig(h-ANe9b>fM)ED0eO%bODVGzLJ!*T z$6v-LDgnUx`6jMNm^H#Ah}jOWRzSQ3Y;Qs6HskuWH?a$1+w#@zZ4P$D!mUR4+qjyo zl1y7$F&PRe3h*AVBCGqJ;eO!U4Uj5({}k^Igl z;*erBE)}bSFz{a`3cdmYT#i?bOQ9pNU6(KVCB9e$Up^j*VuyhMu&5wSeu6n+a07*qoM6N<$f|1<>jQ{`u diff --git a/core/src/main/res/drawable/appupdater_ic_aptoide.xml b/core/src/main/res/drawable/appupdater_ic_aptoide.xml new file mode 100644 index 00000000..f02857dd --- /dev/null +++ b/core/src/main/res/drawable/appupdater_ic_aptoide.xml @@ -0,0 +1,15 @@ + + + + + + + From d5b89fe4ff5f483d157f1993c8a15c71e82bc959 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Mon, 15 Apr 2024 20:22:40 +0200 Subject: [PATCH 049/117] Changed ImageView size to 64dp fixed size --- appupdater/src/main/res/layout/download_stores_item.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appupdater/src/main/res/layout/download_stores_item.xml b/appupdater/src/main/res/layout/download_stores_item.xml index d505ec5d..ed6c8530 100644 --- a/appupdater/src/main/res/layout/download_stores_item.xml +++ b/appupdater/src/main/res/layout/download_stores_item.xml @@ -11,8 +11,8 @@ Date: Tue, 16 Apr 2024 10:31:39 +0200 Subject: [PATCH 050/117] Added Ui tests for SquareStoreItemComponent --- .../SquareStoreItemComponentTest.kt | 66 +++++++++++++++++++ .../ui/components/SquareStoreItemComponent.kt | 5 +- 2 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponentTest.kt diff --git a/compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponentTest.kt b/compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponentTest.kt new file mode 100644 index 00000000..af76ab59 --- /dev/null +++ b/compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponentTest.kt @@ -0,0 +1,66 @@ +package com.pouyaheydari.appupdater.compose.ui.components + +import android.Manifest +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.assertTextEquals +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.onRoot +import androidx.compose.ui.test.performClick +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.mockito.Mockito +import org.mockito.kotlin.verify +import com.pouyaheydari.appupdater.core.R as coreR + +class SquareStoreItemComponentTest { + @get:Rule + val composeTestRule = createComposeRule() + + @Before + fun setUp() { + val instrumentation = InstrumentationRegistry.getInstrumentation() + val packageName = instrumentation.context.packageName + val permission = Manifest.permission.POST_NOTIFICATIONS + instrumentation.uiAutomation.grantRuntimePermission(packageName, permission) + } + + @Test + fun test_whenComponentIsCalled_thenCorrectTextIsBeingDisplayed() { + val storeTitle = "Title" + + composeTestRule.setContent { + SquareStoreItemComponent(title = storeTitle) + } + + composeTestRule.onNodeWithText(storeTitle) + .assertIsDisplayed() + .assertTextEquals(storeTitle) + } + + @Test + fun test_whenComponentIsCalled_thenCorrectIconIsBeingDisplayed() { + val storeIcon = coreR.drawable.appupdater_ic_google_play + + composeTestRule.setContent { + SquareStoreItemComponent(icon = storeIcon) + } + + composeTestRule.onNodeWithTag(storeIcon.toString(), useUnmergedTree = true).assertIsDisplayed() + } + + @Test + fun test_whenComponentIsCalled_andUserClickOnText_thenOnClickListenerIsCalled() { + val clickListener: () -> Unit = Mockito.mock() + + composeTestRule.setContent { + SquareStoreItemComponent(onClickListener = clickListener) + } + composeTestRule.onRoot().performClick() + + verify(clickListener).invoke() + } +} diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt index 7eadbe98..02aa70ee 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt @@ -11,6 +11,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment.Companion.CenterHorizontally import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.PreviewFontScale @@ -31,7 +32,9 @@ internal fun SquareStoreItemComponent( horizontalAlignment = CenterHorizontally, ) { Image( - modifier = Modifier.size(64.dp), + modifier = Modifier + .size(64.dp) + .testTag(icon.toString()), painter = painterResource(id = icon), contentDescription = null, ) From d24fd691b0d6c8df1d264698d733e4e48c74b44a Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Tue, 16 Apr 2024 10:40:28 +0200 Subject: [PATCH 051/117] Added assertTextEqual to the test --- .../compose/ui/components/DividerComponentTest.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponentTest.kt b/compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponentTest.kt index fcc13cfb..dc9702fa 100644 --- a/compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponentTest.kt +++ b/compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponentTest.kt @@ -3,6 +3,7 @@ package com.pouyaheydari.appupdater.compose.ui.components import android.Manifest import android.content.Context import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.assertTextEquals import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithText import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation @@ -24,15 +25,15 @@ internal class DividerComponentTest { } @Test - fun test_orTextIsDisplayed() { + fun test_whenComponentIsCalled_thenCorrectTextIsDisplayed() { val context: Context = getInstrumentation().targetContext composeTestRule.setContent { DividerComponent() } - composeTestRule - .onNodeWithText(context.resources.getString(coreR.string.appupdater_or)) + composeTestRule.onNodeWithText(context.resources.getString(coreR.string.appupdater_or)) .assertIsDisplayed() + .assertTextEquals(context.resources.getString(coreR.string.appupdater_or)) } } From 52750874b53b31f17e751f3706bb7f5161a17550 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Tue, 16 Apr 2024 10:53:35 +0200 Subject: [PATCH 052/117] Added @PreviewLightDark to previews --- .../compose/ui/components/DialogHeaderComponent.kt | 2 ++ .../compose/ui/components/DirectDownloadLinkComponent.kt | 2 ++ .../appupdater/compose/ui/components/DividerComponent.kt | 2 ++ .../compose/ui/components/SquareStoreItemComponent.kt | 2 ++ .../ui/components/UpdateInProgressDialogComponent.kt | 8 +++----- 5 files changed, 11 insertions(+), 5 deletions(-) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DialogHeaderComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DialogHeaderComponent.kt index db03613d..5a25779e 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DialogHeaderComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DialogHeaderComponent.kt @@ -17,6 +17,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.PreviewFontScale +import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewScreenSizes import androidx.compose.ui.unit.dp import com.pouyaheydari.appupdater.compose.ui.models.DialogHeaderModel @@ -65,6 +66,7 @@ internal fun DialogHeaderComponent( } } +@PreviewLightDark @PreviewFontScale @PreviewScreenSizes @Composable diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponent.kt index a6b927ba..ade9b76e 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponent.kt @@ -7,6 +7,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.PreviewFontScale +import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewScreenSizes import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme import com.pouyaheydari.appupdater.compose.ui.theme.Blue @@ -26,6 +27,7 @@ internal fun DirectDownloadLinkComponent( ) } +@PreviewLightDark @PreviewFontScale @PreviewScreenSizes @Composable diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt index e6691f18..d57a2b85 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt @@ -11,6 +11,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewFontScale +import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewScreenSizes import androidx.compose.ui.unit.dp import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme @@ -43,6 +44,7 @@ internal fun DividerComponent(modifier: Modifier = Modifier) { } } +@PreviewLightDark @PreviewFontScale @PreviewScreenSizes @Composable diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt index 02aa70ee..f325e732 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt @@ -15,6 +15,7 @@ import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.PreviewFontScale +import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewScreenSizes import androidx.compose.ui.unit.dp import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme @@ -50,6 +51,7 @@ internal fun SquareStoreItemComponent( } } +@PreviewLightDark @PreviewFontScale @PreviewScreenSizes @Composable diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt index 5a4236fb..6bd730a3 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt @@ -14,6 +14,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewFontScale +import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewScreenSizes import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog @@ -48,17 +49,14 @@ internal fun UpdateInProgressDialogComponent(modifier: Modifier = Modifier, isUp style = MaterialTheme.typography.bodyLarge, modifier = Modifier.padding(all = 8.dp), ) - LinearProgressIndicator( - modifier = Modifier - .fillMaxWidth() - .padding(all = 8.dp), - ) + LinearProgressIndicator(modifier = Modifier.fillMaxWidth().padding(all = 8.dp)) } } } } } +@PreviewLightDark @PreviewFontScale @PreviewScreenSizes @Composable From 80e9352036f7d81fad0038612b511d9210d9c0e9 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Tue, 16 Apr 2024 14:40:14 +0200 Subject: [PATCH 053/117] Added roboelectric and moved compose component tests to test package --- compose/build.gradle.kts | 10 +++++++++- .../ui/components/DividerComponentTest.kt | 11 +++-------- .../appupdater/compose/ExampleUnitTest.kt | 16 ---------------- .../DirectDownloadLinkComponentTest.kt | 14 +++----------- .../components/SquareStoreItemComponentTest.kt | 14 +++----------- gradle/libs.versions.toml | 2 ++ 6 files changed, 20 insertions(+), 47 deletions(-) delete mode 100644 compose/src/test/java/com/pouyaheydari/appupdater/compose/ExampleUnitTest.kt rename compose/src/{androidTest => test}/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponentTest.kt (73%) rename compose/src/{androidTest => test}/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponentTest.kt (80%) diff --git a/compose/build.gradle.kts b/compose/build.gradle.kts index 04cfafac..a9faa7f9 100644 --- a/compose/build.gradle.kts +++ b/compose/build.gradle.kts @@ -22,11 +22,15 @@ android { } namespace = "com.pouyaheydari.appupdater.compose" + testOptions { + unitTests { + isIncludeAndroidResources = true + } + } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { jvmTarget = "17" } @@ -60,6 +64,10 @@ dependencies { // testing testImplementation(libs.junit4) + testImplementation(libs.androidx.compose.ui.test.junit) + testImplementation(libs.mockito.kotlin) + testImplementation(libs.roboelectric) + androidTestImplementation(libs.androidx.test.rules) androidTestImplementation(libs.androidx.test.junit) androidTestImplementation(libs.androidx.test.ui.espresso.core) androidTestImplementation(libs.androidx.compose.ui.test.junit) diff --git a/compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponentTest.kt b/compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponentTest.kt index dc9702fa..7fd87b58 100644 --- a/compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponentTest.kt +++ b/compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponentTest.kt @@ -7,7 +7,7 @@ import androidx.compose.ui.test.assertTextEquals import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithText import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation -import org.junit.Before +import androidx.test.rule.GrantPermissionRule import org.junit.Rule import org.junit.Test import com.pouyaheydari.appupdater.core.R as coreR @@ -16,13 +16,8 @@ internal class DividerComponentTest { @get:Rule val composeTestRule = createComposeRule() - @Before - fun setUp() { - val instrumentation = getInstrumentation() - val packageName = instrumentation.context.packageName - val permission = Manifest.permission.POST_NOTIFICATIONS - instrumentation.uiAutomation.grantRuntimePermission(packageName, permission) - } + @get:Rule + val permissionRule: GrantPermissionRule = GrantPermissionRule.grant(Manifest.permission.POST_NOTIFICATIONS) @Test fun test_whenComponentIsCalled_thenCorrectTextIsDisplayed() { diff --git a/compose/src/test/java/com/pouyaheydari/appupdater/compose/ExampleUnitTest.kt b/compose/src/test/java/com/pouyaheydari/appupdater/compose/ExampleUnitTest.kt deleted file mode 100644 index 2cfdc7d6..00000000 --- a/compose/src/test/java/com/pouyaheydari/appupdater/compose/ExampleUnitTest.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.pouyaheydari.appupdater.compose - -import org.junit.Assert.assertEquals -import org.junit.Test - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} diff --git a/compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponentTest.kt b/compose/src/test/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponentTest.kt similarity index 73% rename from compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponentTest.kt rename to compose/src/test/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponentTest.kt index 09193fa4..c10cb985 100644 --- a/compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponentTest.kt +++ b/compose/src/test/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponentTest.kt @@ -1,29 +1,21 @@ package com.pouyaheydari.appupdater.compose.ui.components -import android.Manifest import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick -import androidx.test.platform.app.InstrumentationRegistry -import org.junit.Before import org.junit.Rule import org.junit.Test +import org.junit.runner.RunWith import org.mockito.Mockito.mock import org.mockito.kotlin.verify +import org.robolectric.RobolectricTestRunner +@RunWith(RobolectricTestRunner::class) class DirectDownloadLinkComponentTest { @get:Rule val composeTestRule = createComposeRule() - @Before - fun setUp() { - val instrumentation = InstrumentationRegistry.getInstrumentation() - val packageName = instrumentation.context.packageName - val permission = Manifest.permission.POST_NOTIFICATIONS - instrumentation.uiAutomation.grantRuntimePermission(packageName, permission) - } - @Test fun test_whenComponentIsCalled_thenCorrectTextIsBeingDisplayed() { val title = "Text" diff --git a/compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponentTest.kt b/compose/src/test/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponentTest.kt similarity index 80% rename from compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponentTest.kt rename to compose/src/test/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponentTest.kt index af76ab59..41635df7 100644 --- a/compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponentTest.kt +++ b/compose/src/test/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponentTest.kt @@ -1,6 +1,5 @@ package com.pouyaheydari.appupdater.compose.ui.components -import android.Manifest import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertTextEquals import androidx.compose.ui.test.junit4.createComposeRule @@ -8,26 +7,19 @@ import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.onRoot import androidx.compose.ui.test.performClick -import androidx.test.platform.app.InstrumentationRegistry -import org.junit.Before import org.junit.Rule import org.junit.Test +import org.junit.runner.RunWith import org.mockito.Mockito import org.mockito.kotlin.verify +import org.robolectric.RobolectricTestRunner import com.pouyaheydari.appupdater.core.R as coreR +@RunWith(RobolectricTestRunner::class) class SquareStoreItemComponentTest { @get:Rule val composeTestRule = createComposeRule() - @Before - fun setUp() { - val instrumentation = InstrumentationRegistry.getInstrumentation() - val packageName = instrumentation.context.packageName - val permission = Manifest.permission.POST_NOTIFICATIONS - instrumentation.uiAutomation.grantRuntimePermission(packageName, permission) - } - @Test fun test_whenComponentIsCalled_thenCorrectTextIsBeingDisplayed() { val storeTitle = "Title" diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d5bfdd75..4ac066ae 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -21,6 +21,7 @@ androidxComposeBom = "2024.04.00" composeActivity = "1.8.2" mockito = "5.11.0" mockitoKotlin = "5.3.1" +roboelectric = "4.12.1" [libraries] agp = { module = "com.android.tools.build:gradle", version.ref = "agp" } @@ -41,6 +42,7 @@ androidx-compose-activity = { group = "androidx.activity", name = "activity-comp androidx-compose-ui-test-junit = { group = "androidx.compose.ui", name = "ui-test-junit4" } androidx-compose-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } junit4 = { group = "junit", name = "junit", version.ref = "junit4" } +roboelectric = { group = "org.robolectric", name = "robolectric", version.ref = "roboelectric" } mockito = { group = "org.mockito", name = "mockito-core", version.ref = "mockito" } mockito-android = { group = "org.mockito", name = "mockito-android", version.ref = "mockito" } mockito-kotlin = { group = "org.mockito.kotlin", name = "mockito-kotlin", version.ref = "mockitoKotlin" } From aa4ba7252dad027969d5db1ce6b3c890ffb098b7 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Tue, 16 Apr 2024 14:48:18 +0200 Subject: [PATCH 054/117] Made Divider text available to set by other components --- .../ui/components/DividerComponentTest.kt | 34 ------------------- .../components/AppUpdaterDialogComponent.kt | 2 +- .../compose/ui/components/DividerComponent.kt | 8 ++--- .../ui/components/DividerComponentTest.kt | 29 ++++++++++++++++ 4 files changed, 34 insertions(+), 39 deletions(-) delete mode 100644 compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponentTest.kt create mode 100644 compose/src/test/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponentTest.kt diff --git a/compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponentTest.kt b/compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponentTest.kt deleted file mode 100644 index 7fd87b58..00000000 --- a/compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponentTest.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.pouyaheydari.appupdater.compose.ui.components - -import android.Manifest -import android.content.Context -import androidx.compose.ui.test.assertIsDisplayed -import androidx.compose.ui.test.assertTextEquals -import androidx.compose.ui.test.junit4.createComposeRule -import androidx.compose.ui.test.onNodeWithText -import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation -import androidx.test.rule.GrantPermissionRule -import org.junit.Rule -import org.junit.Test -import com.pouyaheydari.appupdater.core.R as coreR - -internal class DividerComponentTest { - @get:Rule - val composeTestRule = createComposeRule() - - @get:Rule - val permissionRule: GrantPermissionRule = GrantPermissionRule.grant(Manifest.permission.POST_NOTIFICATIONS) - - @Test - fun test_whenComponentIsCalled_thenCorrectTextIsDisplayed() { - val context: Context = getInstrumentation().targetContext - - composeTestRule.setContent { - DividerComponent() - } - - composeTestRule.onNodeWithText(context.resources.getString(coreR.string.appupdater_or)) - .assertIsDisplayed() - .assertTextEquals(context.resources.getString(coreR.string.appupdater_or)) - } -} diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt index 9542dd61..100fae6b 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt @@ -70,7 +70,7 @@ private fun DialogContent( } } if (shouldShowDividers) { - item(span = { GridItemSpan(maxLineSpan) }) { DividerComponent() } + item(span = { GridItemSpan(maxLineSpan) }) { DividerComponent(dividerText = stringResource(id = R.string.appupdater_or)) } } storeList.forEach { diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt index d57a2b85..88f7d83c 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt @@ -15,13 +15,13 @@ import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewScreenSizes import androidx.compose.ui.unit.dp import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme -import com.pouyaheydari.appupdater.core.R as coreR +import com.pouyaheydari.appupdater.core.R /** * Shows a divider between direct download links and stores */ @Composable -internal fun DividerComponent(modifier: Modifier = Modifier) { +internal fun DividerComponent(modifier: Modifier = Modifier, dividerText: String = "") { Row( verticalAlignment = Alignment.CenterVertically, modifier = modifier.fillMaxWidth(), @@ -33,7 +33,7 @@ internal fun DividerComponent(modifier: Modifier = Modifier) { .padding(start = 16.dp, end = 8.dp), ) - Text(text = stringResource(id = coreR.string.appupdater_or)) + Text(text = dividerText) HorizontalDivider( color = MaterialTheme.colorScheme.background, @@ -50,6 +50,6 @@ internal fun DividerComponent(modifier: Modifier = Modifier) { @Composable private fun Preview() { AndroidAppUpdaterTheme { - DividerComponent() + DividerComponent(dividerText = stringResource(id = R.string.appupdater_or)) } } diff --git a/compose/src/test/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponentTest.kt b/compose/src/test/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponentTest.kt new file mode 100644 index 00000000..559a1453 --- /dev/null +++ b/compose/src/test/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponentTest.kt @@ -0,0 +1,29 @@ +package com.pouyaheydari.appupdater.compose.ui.components + +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.assertTextEquals +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithText +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner + +@RunWith(RobolectricTestRunner::class) +internal class DividerComponentTest { + @get:Rule + val composeTestRule = createComposeRule() + + @Test + fun test_whenComponentIsCalled_thenCorrectTextIsDisplayed() { + val dividerText = "Text" + + composeTestRule.setContent { + DividerComponent(dividerText = dividerText) + } + + composeTestRule.onNodeWithText(dividerText) + .assertIsDisplayed() + .assertTextEquals(dividerText) + } +} From 8d50425eef0eb834eaa2508fa47ac41526a6908a Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Tue, 16 Apr 2024 14:48:33 +0200 Subject: [PATCH 055/117] Made classes internal --- .../compose/ui/components/DirectDownloadLinkComponentTest.kt | 2 +- .../compose/ui/components/SquareStoreItemComponentTest.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/compose/src/test/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponentTest.kt b/compose/src/test/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponentTest.kt index c10cb985..42a1384a 100644 --- a/compose/src/test/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponentTest.kt +++ b/compose/src/test/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponentTest.kt @@ -12,7 +12,7 @@ import org.mockito.kotlin.verify import org.robolectric.RobolectricTestRunner @RunWith(RobolectricTestRunner::class) -class DirectDownloadLinkComponentTest { +internal class DirectDownloadLinkComponentTest { @get:Rule val composeTestRule = createComposeRule() diff --git a/compose/src/test/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponentTest.kt b/compose/src/test/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponentTest.kt index 41635df7..fe705081 100644 --- a/compose/src/test/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponentTest.kt +++ b/compose/src/test/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponentTest.kt @@ -16,7 +16,7 @@ import org.robolectric.RobolectricTestRunner import com.pouyaheydari.appupdater.core.R as coreR @RunWith(RobolectricTestRunner::class) -class SquareStoreItemComponentTest { +internal class SquareStoreItemComponentTest { @get:Rule val composeTestRule = createComposeRule() From 451e2e8b87f0d39bff6352ec83c6adc977bac450 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Tue, 16 Apr 2024 15:50:24 +0200 Subject: [PATCH 056/117] Converted including android resources into a single line --- compose/build.gradle.kts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/compose/build.gradle.kts b/compose/build.gradle.kts index a9faa7f9..18370270 100644 --- a/compose/build.gradle.kts +++ b/compose/build.gradle.kts @@ -22,11 +22,8 @@ android { } namespace = "com.pouyaheydari.appupdater.compose" - testOptions { - unitTests { - isIncludeAndroidResources = true - } - } + testOptions.unitTests.isIncludeAndroidResources = true + compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 From d33acec966ef6c4d40b338317f8d02eb35225982 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Tue, 16 Apr 2024 15:50:56 +0200 Subject: [PATCH 057/117] Changed running tests on ci to testDebugUnitTest --- .github/workflows/android.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index c1d02dac..666f5296 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -23,4 +23,4 @@ jobs: - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Run tests - run: ./gradlew test + run: ./gradlew testDebugUnitTest From 04bc32cf385b9169ee932e5a6fa863701a0dd264 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Tue, 16 Apr 2024 15:59:42 +0200 Subject: [PATCH 058/117] Made dialog title and description available to be set from higher level components --- .../compose/ui/AndroidAppUpdaterScreen.kt | 6 +++++- .../UpdateInProgressDialogComponent.kt | 17 +++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt index e9b83d5a..00f7a58f 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt @@ -49,7 +49,11 @@ fun AndroidAppUpdater(dialogData: UpdaterDialogData) { ) } - UpdateInProgressDialogComponent(isUpdateInProgress = state.shouldShowUpdateInProgress) + UpdateInProgressDialogComponent( + isUpdateInProgress = state.shouldShowUpdateInProgress, + dialogTitle = stringResource(id = (coreR.string.appupdater_please_wait)), + dialogDescription = stringResource(id = (coreR.string.appupdater_downloading_new_version)), + ) setupErrorCallback(state.errorWhileOpeningStore, dialogData.errorWhileOpeningStoreCallback) { viewModel.handleIntent(DialogScreenIntents.OnErrorCallbackExecuted) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt index 6bd730a3..928f8456 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt @@ -25,7 +25,12 @@ import com.pouyaheydari.appupdater.core.R as coreR * Update in progress dialog is not dismissible by the user. */ @Composable -internal fun UpdateInProgressDialogComponent(modifier: Modifier = Modifier, isUpdateInProgress: Boolean = false) { +internal fun UpdateInProgressDialogComponent( + modifier: Modifier = Modifier, + isUpdateInProgress: Boolean = false, + dialogTitle: String = "", + dialogDescription: String = "", +) { AnimatedVisibility(visible = isUpdateInProgress) { Dialog(onDismissRequest = { /* Do nothing */ }) { Card( @@ -40,12 +45,12 @@ internal fun UpdateInProgressDialogComponent(modifier: Modifier = Modifier, isUp .padding(vertical = 16.dp, horizontal = 8.dp), ) { Text( - text = stringResource(id = (coreR.string.appupdater_please_wait)), + text = dialogTitle, style = MaterialTheme.typography.titleLarge, modifier = Modifier.padding(horizontal = 8.dp), ) Text( - text = stringResource(id = (coreR.string.appupdater_downloading_new_version)), + text = dialogDescription, style = MaterialTheme.typography.bodyLarge, modifier = Modifier.padding(all = 8.dp), ) @@ -62,6 +67,10 @@ internal fun UpdateInProgressDialogComponent(modifier: Modifier = Modifier, isUp @Composable private fun UpdateInProgressDialogPreview() { AndroidAppUpdaterTheme { - UpdateInProgressDialogComponent(isUpdateInProgress = true) + UpdateInProgressDialogComponent( + isUpdateInProgress = true, + dialogTitle = stringResource(id = (coreR.string.appupdater_please_wait)), + dialogDescription = stringResource(id = (coreR.string.appupdater_downloading_new_version)), + ) } } From 71060326ca1fe5cf5999e35bbe92fc034bc8fda8 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Tue, 16 Apr 2024 16:09:59 +0200 Subject: [PATCH 059/117] Added unit tests for UpdateInProgressDialogComponent --- .../UpdateInProgressDialogComponent.kt | 10 ++-- .../UpdateInProgressDialogComponentTest.kt | 50 +++++++++++++++++++ 2 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 compose/src/test/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponentTest.kt diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt index 928f8456..e63d32ce 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt @@ -12,6 +12,7 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewFontScale import androidx.compose.ui.tooling.preview.PreviewLightDark @@ -21,9 +22,8 @@ import androidx.compose.ui.window.Dialog import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme import com.pouyaheydari.appupdater.core.R as coreR -/** - * Update in progress dialog is not dismissible by the user. - */ +internal const val DIALOG_TEST_TAG = "DialogTestTag" + @Composable internal fun UpdateInProgressDialogComponent( modifier: Modifier = Modifier, @@ -34,7 +34,9 @@ internal fun UpdateInProgressDialogComponent( AnimatedVisibility(visible = isUpdateInProgress) { Dialog(onDismissRequest = { /* Do nothing */ }) { Card( - modifier = modifier.fillMaxWidth(), + modifier = modifier + .fillMaxWidth() + .testTag(DIALOG_TEST_TAG), shape = RoundedCornerShape(12.dp), elevation = CardDefaults.cardElevation(8.dp), colors = CardDefaults.cardColors(MaterialTheme.colorScheme.surface), diff --git a/compose/src/test/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponentTest.kt b/compose/src/test/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponentTest.kt new file mode 100644 index 00000000..cd2fc34c --- /dev/null +++ b/compose/src/test/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponentTest.kt @@ -0,0 +1,50 @@ +package com.pouyaheydari.appupdater.compose.ui.components + +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.onNodeWithText +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner + +@RunWith(RobolectricTestRunner::class) +internal class UpdateInProgressDialogComponentTest { + @get:Rule + val composeTestRule = createComposeRule() + + @Test + fun test_whenComponentIsCalled_andTheDialogMustBeVisible_thenCorrectNodesAreBeingShown() { + val dialogTitle = "Title" + val dialogDescription = "Description" + composeTestRule.setContent { + UpdateInProgressDialogComponent( + isUpdateInProgress = true, + dialogTitle = dialogTitle, + dialogDescription = dialogDescription, + ) + } + + composeTestRule.onNodeWithText(dialogTitle).assertIsDisplayed() + composeTestRule.onNodeWithText(dialogDescription).assertIsDisplayed() + composeTestRule.onNodeWithTag(DIALOG_TEST_TAG).assertIsDisplayed() + } + + @Test + fun test_whenComponentIsCalled_andTheDialogMustBeInvisible_thenNoNodesAreShown() { + val dialogTitle = "Title" + val dialogDescription = "Description" + composeTestRule.setContent { + UpdateInProgressDialogComponent( + isUpdateInProgress = false, + dialogTitle = dialogTitle, + dialogDescription = dialogDescription, + ) + } + + composeTestRule.onNodeWithText(dialogTitle).assertDoesNotExist() + composeTestRule.onNodeWithText(dialogDescription).assertDoesNotExist() + composeTestRule.onNodeWithTag(DIALOG_TEST_TAG).assertDoesNotExist() + } +} From b329c7a00d2d9c22fad54a83d8b9fcded0cfe4e3 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Tue, 16 Apr 2024 16:23:26 +0200 Subject: [PATCH 060/117] Added typeface to DialogHeaderComponent and extracted the icon to be set by higher level components --- .../appupdater/compose/ui/components/DialogHeaderComponent.kt | 2 +- .../appupdater/compose/ui/models/DialogHeaderModel.kt | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DialogHeaderComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DialogHeaderComponent.kt index 5a25779e..92c69d81 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DialogHeaderComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DialogHeaderComponent.kt @@ -40,7 +40,7 @@ internal fun DialogHeaderComponent( modifier = Modifier .width(100.dp) .height(100.dp), - painter = painterResource(id = coreR.drawable.appupdater_ic_cloud), + painter = painterResource(id = content.dialogIcon), contentDescription = null, ) Text( diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogHeaderModel.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogHeaderModel.kt index 69fc3fde..42bb9807 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogHeaderModel.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/DialogHeaderModel.kt @@ -1,6 +1,10 @@ package com.pouyaheydari.appupdater.compose.ui.models +import androidx.annotation.DrawableRes +import com.pouyaheydari.appupdater.core.R + internal data class DialogHeaderModel( val dialogTitle: String = "", val dialogDescription: String = "", + @DrawableRes val dialogIcon: Int = R.drawable.appupdater_ic_cloud, ) From afc506b058ee9cc531db4781f5d59e6cc396edaa Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Tue, 16 Apr 2024 16:24:17 +0200 Subject: [PATCH 061/117] Added typeface to components --- .../compose/ui/AndroidAppUpdaterScreen.kt | 1 + .../ui/components/AppUpdaterDialogComponent.kt | 13 ++++++++++--- .../ui/components/DirectDownloadLinkComponent.kt | 4 ++++ .../compose/ui/components/DividerComponent.kt | 10 ++++++++-- .../ui/components/SquareStoreItemComponent.kt | 4 ++++ .../components/UpdateInProgressDialogComponent.kt | 5 +++++ 6 files changed, 32 insertions(+), 5 deletions(-) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt index 00f7a58f..558423e9 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt @@ -53,6 +53,7 @@ fun AndroidAppUpdater(dialogData: UpdaterDialogData) { isUpdateInProgress = state.shouldShowUpdateInProgress, dialogTitle = stringResource(id = (coreR.string.appupdater_please_wait)), dialogDescription = stringResource(id = (coreR.string.appupdater_downloading_new_version)), + typeface = dialogData.typeface, ) setupErrorCallback(state.errorWhileOpeningStore, dialogData.errorWhileOpeningStoreCallback) { diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt index 100fae6b..8cb11773 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt @@ -66,16 +66,23 @@ private fun DialogContent( } directDownloadList.forEach { item(span = { GridItemSpan(maxLineSpan) }) { - DirectDownloadLinkComponent(title = it.title) { onDirectLinkClickListener(it) } + DirectDownloadLinkComponent(title = it.title, typeface = typeface) { onDirectLinkClickListener(it) } } } if (shouldShowDividers) { - item(span = { GridItemSpan(maxLineSpan) }) { DividerComponent(dividerText = stringResource(id = R.string.appupdater_or)) } + item(span = { GridItemSpan(maxLineSpan) }) { + DividerComponent(dividerText = stringResource(id = R.string.appupdater_or), typeface = typeface) + } } storeList.forEach { item(span = { getStoreListGridItemSpan(storeList.size, maxLineSpan) }) { - SquareStoreItemComponent(modifier = Modifier.padding(8.dp), title = it.title, icon = it.icon) { onStoreClickListener(it) } + SquareStoreItemComponent( + modifier = Modifier.padding(8.dp), + title = it.title, + icon = it.icon, + typeface = typeface, + ) { onStoreClickListener(it) } } } } diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponent.kt index ade9b76e..cfd2b856 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DirectDownloadLinkComponent.kt @@ -1,10 +1,12 @@ package com.pouyaheydari.appupdater.compose.ui.components +import android.graphics.Typeface import androidx.compose.foundation.clickable import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.PreviewFontScale import androidx.compose.ui.tooling.preview.PreviewLightDark @@ -16,6 +18,7 @@ import com.pouyaheydari.appupdater.compose.ui.theme.Blue internal fun DirectDownloadLinkComponent( modifier: Modifier = Modifier, title: String = "", + typeface: Typeface? = null, onClickListener: () -> Unit = {}, ) { Text( @@ -24,6 +27,7 @@ internal fun DirectDownloadLinkComponent( textAlign = TextAlign.Center, color = Blue, style = MaterialTheme.typography.bodyLarge, + fontFamily = typeface?.let { FontFamily(it) }, ) } diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt index 88f7d83c..61ed8457 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DividerComponent.kt @@ -1,5 +1,6 @@ package com.pouyaheydari.appupdater.compose.ui.components +import android.graphics.Typeface import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding @@ -10,6 +11,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.tooling.preview.PreviewFontScale import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewScreenSizes @@ -21,7 +23,11 @@ import com.pouyaheydari.appupdater.core.R * Shows a divider between direct download links and stores */ @Composable -internal fun DividerComponent(modifier: Modifier = Modifier, dividerText: String = "") { +internal fun DividerComponent( + modifier: Modifier = Modifier, + dividerText: String = "", + typeface: Typeface? = null, +) { Row( verticalAlignment = Alignment.CenterVertically, modifier = modifier.fillMaxWidth(), @@ -33,7 +39,7 @@ internal fun DividerComponent(modifier: Modifier = Modifier, dividerText: String .padding(start = 16.dp, end = 8.dp), ) - Text(text = dividerText) + Text(text = dividerText, fontFamily = typeface?.let { FontFamily(it) }) HorizontalDivider( color = MaterialTheme.colorScheme.background, diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt index f325e732..38369b1d 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/SquareStoreItemComponent.kt @@ -1,5 +1,6 @@ package com.pouyaheydari.appupdater.compose.ui.components +import android.graphics.Typeface import androidx.annotation.DrawableRes import androidx.compose.foundation.Image import androidx.compose.foundation.clickable @@ -13,6 +14,7 @@ import androidx.compose.ui.Alignment.Companion.CenterHorizontally import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.PreviewFontScale import androidx.compose.ui.tooling.preview.PreviewLightDark @@ -26,6 +28,7 @@ internal fun SquareStoreItemComponent( modifier: Modifier = Modifier, title: String = "", @DrawableRes icon: Int = R.drawable.appupdater_ic_google_play, + typeface: Typeface? = null, onClickListener: () -> Unit = {}, ) { Column( @@ -47,6 +50,7 @@ internal fun SquareStoreItemComponent( overflow = TextOverflow.Ellipsis, style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurface, + fontFamily = typeface?.let { FontFamily(it) }, ) } } diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt index e63d32ce..5192c836 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/UpdateInProgressDialogComponent.kt @@ -1,5 +1,6 @@ package com.pouyaheydari.appupdater.compose.ui.components +import android.graphics.Typeface import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth @@ -14,6 +15,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.tooling.preview.PreviewFontScale import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewScreenSizes @@ -30,6 +32,7 @@ internal fun UpdateInProgressDialogComponent( isUpdateInProgress: Boolean = false, dialogTitle: String = "", dialogDescription: String = "", + typeface: Typeface? = null, ) { AnimatedVisibility(visible = isUpdateInProgress) { Dialog(onDismissRequest = { /* Do nothing */ }) { @@ -50,11 +53,13 @@ internal fun UpdateInProgressDialogComponent( text = dialogTitle, style = MaterialTheme.typography.titleLarge, modifier = Modifier.padding(horizontal = 8.dp), + fontFamily = typeface?.let { FontFamily(it) }, ) Text( text = dialogDescription, style = MaterialTheme.typography.bodyLarge, modifier = Modifier.padding(all = 8.dp), + fontFamily = typeface?.let { FontFamily(it) }, ) LinearProgressIndicator(modifier = Modifier.fillMaxWidth().padding(all = 8.dp)) } From acb491ec2c9a2cfc22a1954b7cdf09773d10d21e Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Tue, 16 Apr 2024 16:39:42 +0200 Subject: [PATCH 062/117] Added unit tests for DialogHeaderComponent --- .../ui/components/DialogHeaderComponent.kt | 4 +- .../components/DialogHeaderComponentTest.kt | 38 +++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 compose/src/test/java/com/pouyaheydari/appupdater/compose/ui/components/DialogHeaderComponentTest.kt diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DialogHeaderComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DialogHeaderComponent.kt index 92c69d81..43df99c9 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DialogHeaderComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/DialogHeaderComponent.kt @@ -12,6 +12,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment.Companion.CenterHorizontally import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontFamily @@ -39,7 +40,8 @@ internal fun DialogHeaderComponent( Image( modifier = Modifier .width(100.dp) - .height(100.dp), + .height(100.dp) + .testTag(content.dialogIcon.toString()), painter = painterResource(id = content.dialogIcon), contentDescription = null, ) diff --git a/compose/src/test/java/com/pouyaheydari/appupdater/compose/ui/components/DialogHeaderComponentTest.kt b/compose/src/test/java/com/pouyaheydari/appupdater/compose/ui/components/DialogHeaderComponentTest.kt new file mode 100644 index 00000000..68144aeb --- /dev/null +++ b/compose/src/test/java/com/pouyaheydari/appupdater/compose/ui/components/DialogHeaderComponentTest.kt @@ -0,0 +1,38 @@ +package com.pouyaheydari.appupdater.compose.ui.components + +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.onNodeWithText +import com.pouyaheydari.appupdater.compose.ui.models.DialogHeaderModel +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import com.pouyaheydari.appupdater.core.R as coreR + +@RunWith(RobolectricTestRunner::class) +internal class DialogHeaderComponentTest { + @get:Rule + val composeTestRule = createComposeRule() + + @Test + fun test_whenComponentIsCalled_thenCorrectUiIsBeingDisplayed() { + val dialogTitle = "Title" + val dialogDescription = "Description" + val dialogIcon = coreR.drawable.appupdater_ic_google_play + composeTestRule.setContent { + DialogHeaderComponent( + content = DialogHeaderModel( + dialogTitle = dialogTitle, + dialogDescription = dialogDescription, + dialogIcon = dialogIcon, + ), + ) + } + + composeTestRule.onNodeWithText(dialogTitle).assertIsDisplayed() + composeTestRule.onNodeWithText(dialogDescription).assertIsDisplayed() + composeTestRule.onNodeWithTag(dialogIcon.toString()).assertIsDisplayed() + } +} From 0b73a179c83b1cebbd2d6d07e1e21310be9d0f38 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Tue, 16 Apr 2024 18:22:18 +0200 Subject: [PATCH 063/117] Added @PreviewLightDark --- .../compose/ui/components/AppUpdaterDialogComponent.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt index 8cb11773..b57b4131 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt @@ -16,6 +16,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewFontScale +import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewScreenSizes import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog @@ -93,6 +94,7 @@ private fun DialogContent( private fun getStoreListGridItemSpan(storeListSize: Int, maxLineSpan: Int) = if (storeListSize > 1) GridItemSpan(1) else GridItemSpan(maxLineSpan) +@PreviewLightDark @PreviewFontScale @PreviewScreenSizes @Composable @@ -113,6 +115,7 @@ private fun Preview() { } } +@PreviewLightDark @PreviewFontScale @PreviewScreenSizes @Composable @@ -133,6 +136,7 @@ private fun PreviewSingleStoreItem() { } } +@PreviewLightDark @PreviewFontScale @PreviewScreenSizes @Composable From 8ee1932117ade6cf4d380a553c152b8f296d7602 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Tue, 16 Apr 2024 18:27:46 +0200 Subject: [PATCH 064/117] Removed throwing exception --- .../androidappupdater/ui/compose/theme/Theme.kt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/theme/Theme.kt b/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/theme/Theme.kt index 46453e95..5b7a2e7e 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/theme/Theme.kt +++ b/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/theme/Theme.kt @@ -33,11 +33,9 @@ internal fun AndroidAppUpdaterTheme( val view = LocalView.current if (!view.isInEditMode) { SideEffect { - val currentWindow = (view.context as? Activity)?.window - ?: throw Exception("Not in an activity - unable to get Window reference") - (view.context as Activity).window.statusBarColor = colorScheme.primary.toArgb() - WindowCompat.getInsetsController(currentWindow, view).isAppearanceLightStatusBars = - darkTheme + val window = (view.context as Activity).window + window.statusBarColor = colorScheme.primary.toArgb() + WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme } } From 2c0ee69b238ff5b707739c7421ef3206172fff38 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Sun, 21 Apr 2024 17:26:50 +0200 Subject: [PATCH 065/117] Upgraded dependencies --- gradle/libs.versions.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4ac066ae..e8313203 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -6,19 +6,19 @@ targetSdkVersion = "34" agp = "8.3.2" kotlin = "1.9.23" appcompat = "1.6.1" -androidXCore = "1.12.0" +androidXCore = "1.13.0" constraintLayout = "2.1.4" junit4 = "4.13.2" androidTestJUnit = "1.1.5" androidTestRules = "1.5.0" androidTestEspresso = "3.5.1" recyclerView = "1.3.2" -composeCompilerExtension = "1.5.11" +composeCompilerExtension = "1.5.12" lifecycle = "2.7.0" coroutines = "1.8.0" fragment = "1.6.2" -androidxComposeBom = "2024.04.00" -composeActivity = "1.8.2" +androidxComposeBom = "2024.04.01" +composeActivity = "1.9.0" mockito = "5.11.0" mockitoKotlin = "5.3.1" roboelectric = "4.12.1" From ba5bda0d74e5f26354e44f317131536ba6734308 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Sun, 21 Apr 2024 17:46:31 +0200 Subject: [PATCH 066/117] Started using version catalog for plugin dependencies --- app/build.gradle.kts | 4 ++-- appupdater/build.gradle.kts | 4 ++-- build.gradle.kts | 13 ++++--------- compose/build.gradle.kts | 4 ++-- core/build.gradle.kts | 4 ++-- directdownload/build.gradle.kts | 4 ++-- gradle/libs.versions.toml | 7 +++++-- store/build.gradle.kts | 4 ++-- 8 files changed, 21 insertions(+), 23 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 1e01f4a6..2b1301de 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,6 +1,6 @@ plugins { - id("com.android.application") - id("kotlin-android") + alias(libs.plugins.androidApplication) + alias(libs.plugins.jetbrainsKotlinAndroid) } android { diff --git a/appupdater/build.gradle.kts b/appupdater/build.gradle.kts index 846731f6..ec4bc71b 100644 --- a/appupdater/build.gradle.kts +++ b/appupdater/build.gradle.kts @@ -1,6 +1,6 @@ plugins { - id("com.android.library") - id("kotlin-android") + alias(libs.plugins.androidLibrary) + alias(libs.plugins.jetbrainsKotlinAndroid) `maven-publish` } android { diff --git a/build.gradle.kts b/build.gradle.kts index 73ea7d11..d83d5c91 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,10 +1,5 @@ -buildscript { - repositories { - google() - mavenCentral() - } - dependencies { - classpath(libs.agp) - classpath(libs.kotlin.gradle.plugin) - } +plugins { + alias(libs.plugins.androidApplication) apply false + alias(libs.plugins.androidLibrary) apply false + alias(libs.plugins.jetbrainsKotlinAndroid) apply false } diff --git a/compose/build.gradle.kts b/compose/build.gradle.kts index 18370270..53452a4e 100644 --- a/compose/build.gradle.kts +++ b/compose/build.gradle.kts @@ -1,6 +1,6 @@ plugins { - id("com.android.library") - id("kotlin-android") + alias(libs.plugins.androidLibrary) + alias(libs.plugins.jetbrainsKotlinAndroid) `maven-publish` } diff --git a/core/build.gradle.kts b/core/build.gradle.kts index ea88ae25..cf464ddd 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -1,6 +1,6 @@ plugins { - id("com.android.library") - id("kotlin-android") + alias(libs.plugins.androidLibrary) + alias(libs.plugins.jetbrainsKotlinAndroid) `maven-publish` } diff --git a/directdownload/build.gradle.kts b/directdownload/build.gradle.kts index fa7f2788..679d2c92 100644 --- a/directdownload/build.gradle.kts +++ b/directdownload/build.gradle.kts @@ -1,6 +1,6 @@ plugins { - id("com.android.library") - id("kotlin-android") + alias(libs.plugins.androidLibrary) + alias(libs.plugins.jetbrainsKotlinAndroid) `maven-publish` } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e8313203..4475bc10 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -24,8 +24,6 @@ mockitoKotlin = "5.3.1" roboelectric = "4.12.1" [libraries] -agp = { module = "com.android.tools.build:gradle", version.ref = "agp" } -kotlin-gradle-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } androidx-constraintLayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintLayout" } androidx-recyclerView = { group = "androidx.recyclerview", name = "recyclerview", version.ref = "recyclerView" } @@ -51,3 +49,8 @@ androidx-test-junit = { group = "androidx.test.ext", name = "junit", version.ref androidx-test-rules = { group = "androidx.test", name = "rules", version.ref = "androidTestRules" } androidx-test-ui-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "androidTestEspresso" } coroutines = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "coroutines" } + +[plugins] +androidApplication = { id = "com.android.application", version.ref = "agp" } +androidLibrary = { id = "com.android.library", version.ref = "agp" } +jetbrainsKotlinAndroid = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } diff --git a/store/build.gradle.kts b/store/build.gradle.kts index 6d6ad1af..68d4c63d 100644 --- a/store/build.gradle.kts +++ b/store/build.gradle.kts @@ -1,6 +1,6 @@ plugins { - id("com.android.library") - id("kotlin-android") + alias(libs.plugins.androidLibrary) + alias(libs.plugins.jetbrainsKotlinAndroid) `maven-publish` } From 6a68753aeba0b2127d60fe0c30e3f3b9d1577b54 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Sun, 21 Apr 2024 18:03:03 +0200 Subject: [PATCH 067/117] Renamed AppUpdaterDialog to AppUpdaterDialogComponent --- .../appupdater/compose/ui/AndroidAppUpdaterScreen.kt | 4 ++-- .../compose/ui/components/AppUpdaterDialogComponent.kt | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt index 558423e9..d1e26f3f 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt @@ -15,7 +15,7 @@ import androidx.lifecycle.viewmodel.compose.viewModel import com.pouyaheydari.androidappupdater.directdownload.utils.getApk import com.pouyaheydari.androidappupdater.store.domain.ShowStoreModel import com.pouyaheydari.androidappupdater.store.domain.showAppInSelectedStore -import com.pouyaheydari.appupdater.compose.ui.components.AppUpdaterDialog +import com.pouyaheydari.appupdater.compose.ui.components.AppUpdaterDialogComponent import com.pouyaheydari.appupdater.compose.ui.components.UpdateInProgressDialogComponent import com.pouyaheydari.appupdater.compose.ui.models.DialogScreenIntents import com.pouyaheydari.appupdater.compose.ui.models.ErrorWhileOpeningStore @@ -41,7 +41,7 @@ fun AndroidAppUpdater(dialogData: UpdaterDialogData) { val activity = LocalContext.current.getActivity() if (state.shouldShowDialog) { - AppUpdaterDialog( + AppUpdaterDialogComponent( dialogContent = state.dialogContent, onStoreClickListener = { viewModel.handleIntent(DialogScreenIntents.OnStoreClicked(it)) }, onDirectLinkClickListener = { viewModel.handleIntent(DialogScreenIntents.OnDirectLinkClicked(it)) }, diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt index b57b4131..aa510dad 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt @@ -30,7 +30,7 @@ import com.pouyaheydari.appupdater.compose.ui.utils.previewStoreListData import com.pouyaheydari.appupdater.core.R @Composable -internal fun AppUpdaterDialog( +internal fun AppUpdaterDialogComponent( dialogContent: UpdaterDialogUIData = UpdaterDialogUIData(), onStoreClickListener: (StoreListItem) -> Unit = {}, onDirectLinkClickListener: (DirectDownloadListItem) -> Unit = {}, @@ -100,7 +100,7 @@ private fun getStoreListGridItemSpan(storeListSize: Int, maxLineSpan: Int) = @Composable private fun Preview() { AndroidAppUpdaterTheme { - AppUpdaterDialog( + AppUpdaterDialogComponent( dialogContent = UpdaterDialogUIData( dialogHeader = DialogHeaderModel( dialogTitle = stringResource(id = R.string.appupdater_app_name), @@ -121,7 +121,7 @@ private fun Preview() { @Composable private fun PreviewSingleStoreItem() { AndroidAppUpdaterTheme { - AppUpdaterDialog( + AppUpdaterDialogComponent( dialogContent = UpdaterDialogUIData( dialogHeader = DialogHeaderModel( dialogTitle = stringResource(id = R.string.appupdater_app_name), @@ -142,7 +142,7 @@ private fun PreviewSingleStoreItem() { @Composable private fun PreviewSingleDirectLinkItem() { AndroidAppUpdaterTheme { - AppUpdaterDialog( + AppUpdaterDialogComponent( dialogContent = UpdaterDialogUIData( dialogHeader = DialogHeaderModel( dialogTitle = stringResource(id = R.string.appupdater_app_name), From 01f7115175ee93975cb5691592284011c0d5ea08 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Sun, 21 Apr 2024 20:35:52 +0200 Subject: [PATCH 068/117] Moved out the divider text to be set by the user explicitly --- .../ui/compose/ComposeSampleActivity.kt | 2 ++ .../data/mapper/UpdaterDialogUIMapper.kt | 26 ++++++++++++------- .../data/mapper/UpdaterViewModelDataMapper.kt | 1 + .../compose/ui/AndroidAppUpdaterScreen.kt | 7 +---- .../compose/ui/AndroidAppUpdaterViewModel.kt | 6 ++++- .../components/AppUpdaterDialogComponent.kt | 10 ++----- .../compose/ui/models/UpdaterDialogData.kt | 1 + .../compose/ui/models/UpdaterDialogUIData.kt | 3 +++ .../compose/ui/models/UpdaterViewModelData.kt | 1 + 9 files changed, 33 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt b/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt index f30386cf..a76e6023 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt +++ b/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt @@ -49,6 +49,7 @@ internal class ComposeSampleActivity : ComponentActivity() { UpdaterDialogData( dialogTitle = stringResource(id = coreR.string.appupdater_app_name), dialogDescription = stringResource(id = R.string.library_description), + dividerText = stringResource(coreR.string.appupdater_or), storeList = storeList(this), directDownloadList = directDownloadList(this), theme = Theme.SYSTEM_DEFAULT, @@ -72,6 +73,7 @@ private fun DefaultPreview() { UpdaterDialogData( dialogTitle = stringResource(id = coreR.string.appupdater_app_name), dialogDescription = stringResource(id = R.string.library_description), + dividerText = stringResource(coreR.string.appupdater_or), storeList = storeList(LocalContext.current), directDownloadList = directDownloadList(LocalContext.current), theme = Theme.DARK, diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/data/mapper/UpdaterDialogUIMapper.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/data/mapper/UpdaterDialogUIMapper.kt index 34515e4c..e3d3aec5 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/data/mapper/UpdaterDialogUIMapper.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/data/mapper/UpdaterDialogUIMapper.kt @@ -7,15 +7,23 @@ import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogUIData import com.pouyaheydari.appupdater.compose.ui.models.UpdaterViewModelData internal object UpdaterDialogUIMapper { - fun map(viewModelData: UpdaterViewModelData): UpdaterDialogUIData = with(viewModelData) { - UpdaterDialogUIData( - dialogHeader = DialogHeaderModel(dialogTitle, dialogDescription), - directDownloadList = viewModelData.directDownloadList, - storeList = viewModelData.storeList, - shouldShowDividers = shouldShowStoresDivider(viewModelData.directDownloadList, viewModelData.storeList), - onDismissRequested = onDismissRequested, - ) - } + fun map( + viewModelData: UpdaterViewModelData, + onStoreClickListener: (StoreListItem) -> Unit, + onDirectLinkClickListener: (DirectDownloadListItem) -> Unit, + ): UpdaterDialogUIData = + with(viewModelData) { + UpdaterDialogUIData( + dialogHeader = DialogHeaderModel(dialogTitle, dialogDescription), + dividerText = dividerText, + directDownloadList = viewModelData.directDownloadList, + storeList = viewModelData.storeList, + shouldShowDividers = shouldShowStoresDivider(viewModelData.directDownloadList, viewModelData.storeList), + onDismissRequested = onDismissRequested, + onStoreClickListener = onStoreClickListener, + onDirectLinkClickListener = onDirectLinkClickListener, + ) + } private fun shouldShowStoresDivider(directDownloadList: List, storeList: List) = directDownloadList.isNotEmpty() && storeList.isNotEmpty() diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/data/mapper/UpdaterViewModelDataMapper.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/data/mapper/UpdaterViewModelDataMapper.kt index f56b6a77..acfbc2b4 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/data/mapper/UpdaterViewModelDataMapper.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/data/mapper/UpdaterViewModelDataMapper.kt @@ -8,6 +8,7 @@ internal object UpdaterViewModelDataMapper { UpdaterViewModelData( dialogTitle = dialogTitle, dialogDescription = dialogDescription, + dividerText = dividerText, storeList = storeList, directDownloadList = directDownloadList, onDismissRequested = onDismissRequested, diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt index d1e26f3f..877e8dca 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt @@ -41,12 +41,7 @@ fun AndroidAppUpdater(dialogData: UpdaterDialogData) { val activity = LocalContext.current.getActivity() if (state.shouldShowDialog) { - AppUpdaterDialogComponent( - dialogContent = state.dialogContent, - onStoreClickListener = { viewModel.handleIntent(DialogScreenIntents.OnStoreClicked(it)) }, - onDirectLinkClickListener = { viewModel.handleIntent(DialogScreenIntents.OnDirectLinkClicked(it)) }, - typeface = dialogData.typeface, - ) + AppUpdaterDialogComponent(dialogContent = state.dialogContent, typeface = dialogData.typeface) } UpdateInProgressDialogComponent( diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt index 4baef2bc..97e74ecc 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterViewModel.kt @@ -33,7 +33,11 @@ internal class AndroidAppUpdaterViewModel( } private fun showUpdaterDialog(viewModelData: UpdaterViewModelData) { - val dialogContent = UpdaterDialogUIMapper.map(viewModelData) + val dialogContent = UpdaterDialogUIMapper.map( + viewModelData, + { handleIntent(DialogScreenIntents.OnStoreClicked(it)) }, + { handleIntent(DialogScreenIntents.OnDirectLinkClicked(it)) }, + ) _uiState.update { it.copy(shouldShowDialog = true, dialogContent = dialogContent) } } diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt index aa510dad..2acbb879 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponent.kt @@ -20,8 +20,6 @@ import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewScreenSizes import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog -import com.pouyaheydari.androidappupdater.directdownload.data.model.DirectDownloadListItem -import com.pouyaheydari.androidappupdater.store.domain.StoreListItem import com.pouyaheydari.appupdater.compose.ui.models.DialogHeaderModel import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogUIData import com.pouyaheydari.appupdater.compose.ui.theme.AndroidAppUpdaterTheme @@ -32,20 +30,16 @@ import com.pouyaheydari.appupdater.core.R @Composable internal fun AppUpdaterDialogComponent( dialogContent: UpdaterDialogUIData = UpdaterDialogUIData(), - onStoreClickListener: (StoreListItem) -> Unit = {}, - onDirectLinkClickListener: (DirectDownloadListItem) -> Unit = {}, typeface: Typeface? = null, ) { Dialog(onDismissRequest = { dialogContent.onDismissRequested() }) { - DialogContent(dialogContent, onStoreClickListener, onDirectLinkClickListener, typeface) + DialogContent(dialogContent, typeface) } } @Composable private fun DialogContent( dialogContent: UpdaterDialogUIData, - onStoreClickListener: (StoreListItem) -> Unit, - onDirectLinkClickListener: (DirectDownloadListItem) -> Unit, typeface: Typeface?, ) { Card( @@ -72,7 +66,7 @@ private fun DialogContent( } if (shouldShowDividers) { item(span = { GridItemSpan(maxLineSpan) }) { - DividerComponent(dividerText = stringResource(id = R.string.appupdater_or), typeface = typeface) + DividerComponent(dividerText = dialogContent.dividerText, typeface = typeface) } } diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogData.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogData.kt index 3cb47b0a..71da1452 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogData.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogData.kt @@ -11,6 +11,7 @@ import com.pouyaheydari.appupdater.core.model.Theme data class UpdaterDialogData( val dialogTitle: String = "", val dialogDescription: String = "", + val dividerText: String = "", val storeList: List = listOf(), val directDownloadList: List = listOf(), val onDismissRequested: () -> Unit = {}, diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogUIData.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogUIData.kt index 5ff75299..ac557064 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogUIData.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterDialogUIData.kt @@ -5,8 +5,11 @@ import com.pouyaheydari.androidappupdater.store.domain.StoreListItem internal data class UpdaterDialogUIData( val dialogHeader: DialogHeaderModel = DialogHeaderModel(), + val dividerText: String = "", val directDownloadList: List = emptyList(), val storeList: List = emptyList(), val shouldShowDividers: Boolean = false, val onDismissRequested: () -> Unit = {}, + val onStoreClickListener: (StoreListItem) -> Unit = {}, + val onDirectLinkClickListener: (DirectDownloadListItem) -> Unit = {}, ) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterViewModelData.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterViewModelData.kt index 86e1ac94..c06e9a32 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterViewModelData.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/models/UpdaterViewModelData.kt @@ -7,6 +7,7 @@ import com.pouyaheydari.appupdater.core.model.Theme internal data class UpdaterViewModelData( val dialogTitle: String = "", val dialogDescription: String = "", + val dividerText: String = "", val storeList: List = listOf(), val directDownloadList: List = listOf(), val onDismissRequested: () -> Unit = {}, From f524849858839f33bc962c42ccb4955cee694127 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Tue, 23 Apr 2024 12:14:15 +0200 Subject: [PATCH 069/117] Added tests for AppUpdaterDialogComponent --- compose/build.gradle.kts | 1 + .../AppUpdaterDialogComponentAndroidTest.kt | 30 ++++ compose/src/debug/AndroidManifest.xml | 10 ++ .../appupdater/compose/ComposeTestActivity.kt | 5 + .../AppUpdaterDialogComponentTest.kt | 130 ++++++++++++++++++ gradle/libs.versions.toml | 2 + 6 files changed, 178 insertions(+) create mode 100644 compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponentAndroidTest.kt create mode 100644 compose/src/debug/AndroidManifest.xml create mode 100644 compose/src/debug/java/com/pouyaheydari/appupdater/compose/ComposeTestActivity.kt create mode 100644 compose/src/test/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponentTest.kt diff --git a/compose/build.gradle.kts b/compose/build.gradle.kts index 53452a4e..21484f12 100644 --- a/compose/build.gradle.kts +++ b/compose/build.gradle.kts @@ -70,6 +70,7 @@ dependencies { androidTestImplementation(libs.androidx.compose.ui.test.junit) androidTestImplementation(libs.mockito.android) androidTestImplementation(libs.mockito.kotlin) + androidTestImplementation(libs.androidx.uiautomator) debugImplementation(libs.androidx.compose.ui.test.manifest) } diff --git a/compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponentAndroidTest.kt b/compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponentAndroidTest.kt new file mode 100644 index 00000000..2e4e8b0d --- /dev/null +++ b/compose/src/androidTest/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponentAndroidTest.kt @@ -0,0 +1,30 @@ +package com.pouyaheydari.appupdater.compose.ui.components + +import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation +import androidx.test.uiautomator.UiDevice +import com.pouyaheydari.appupdater.compose.ComposeTestActivity +import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogUIData +import org.junit.Rule +import org.junit.Test +import org.mockito.kotlin.mock +import org.mockito.kotlin.verify + +internal class AppUpdaterDialogComponentAndroidTest { + @get:Rule + val composeTestRule = createAndroidComposeRule() + + @Test + fun test_wheneverDialogIsDismissed_thenCorrectCallbackIsBeingCalled() { + val onDismissRequest: () -> Unit = mock() + val dialogContent = UpdaterDialogUIData(onDismissRequested = onDismissRequest) + composeTestRule.setContent { + AppUpdaterDialogComponent(dialogContent = dialogContent) + } + + // https://issuetracker.google.com/issues/229759201?pli=1 + UiDevice.getInstance(getInstrumentation()).pressBack() + + verify(onDismissRequest).invoke() + } +} diff --git a/compose/src/debug/AndroidManifest.xml b/compose/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..974e6b70 --- /dev/null +++ b/compose/src/debug/AndroidManifest.xml @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/compose/src/debug/java/com/pouyaheydari/appupdater/compose/ComposeTestActivity.kt b/compose/src/debug/java/com/pouyaheydari/appupdater/compose/ComposeTestActivity.kt new file mode 100644 index 00000000..23de1508 --- /dev/null +++ b/compose/src/debug/java/com/pouyaheydari/appupdater/compose/ComposeTestActivity.kt @@ -0,0 +1,5 @@ +package com.pouyaheydari.appupdater.compose + +import androidx.activity.ComponentActivity + +class ComposeTestActivity : ComponentActivity() diff --git a/compose/src/test/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponentTest.kt b/compose/src/test/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponentTest.kt new file mode 100644 index 00000000..b5f709bf --- /dev/null +++ b/compose/src/test/java/com/pouyaheydari/appupdater/compose/ui/components/AppUpdaterDialogComponentTest.kt @@ -0,0 +1,130 @@ +package com.pouyaheydari.appupdater.compose.ui.components + +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import com.pouyaheydari.androidappupdater.directdownload.data.model.DirectDownloadListItem +import com.pouyaheydari.androidappupdater.store.domain.StoreFactory +import com.pouyaheydari.androidappupdater.store.domain.StoreListItem +import com.pouyaheydari.appupdater.compose.ui.models.DialogHeaderModel +import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogUIData +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.kotlin.mock +import org.mockito.kotlin.verify +import org.robolectric.RobolectricTestRunner +import com.pouyaheydari.appupdater.core.R as coreR + +@RunWith(RobolectricTestRunner::class) +internal class AppUpdaterDialogComponentTest { + @get:Rule + val composeTestRule = createComposeRule() + + @Test + fun `whenever component is called with dialogHeader, then items in the header are shown correctly`() { + val dialogContent = UpdaterDialogUIData( + dialogHeader = DialogHeaderModel( + dialogTitle = "Title", + dialogDescription = "Description", + dialogIcon = coreR.drawable.appupdater_ic_google_play, + ), + ) + + composeTestRule.setContent { + AppUpdaterDialogComponent(dialogContent = dialogContent) + } + + composeTestRule.onNodeWithText(dialogContent.dialogHeader.dialogTitle).assertIsDisplayed() + composeTestRule.onNodeWithText(dialogContent.dialogHeader.dialogDescription).assertIsDisplayed() + composeTestRule.onNodeWithTag(dialogContent.dialogHeader.dialogIcon.toString()).assertIsDisplayed() + } + + @Test + fun `whenever component is called with directDownloadList, then items in direct download are shown correctly`() { + val directDownloadItem = DirectDownloadListItem("DirectDownloadItem", "Url") + val dialogContent = UpdaterDialogUIData( + directDownloadList = listOf(directDownloadItem), + ) + + composeTestRule.setContent { + AppUpdaterDialogComponent(dialogContent = dialogContent) + } + + composeTestRule.onNodeWithText(directDownloadItem.title).assertIsDisplayed() + } + + @Test + fun `whenever component is called with storeList, then items in direct download are shown correctly`() { + val storeItem = StoreListItem( + store = StoreFactory.getSamsungGalaxyStore(""), + title = "Store", + icon = coreR.drawable.appupdater_ic_galaxy_store, + ) + + val dialogContent = UpdaterDialogUIData( + storeList = listOf(storeItem), + ) + + composeTestRule.setContent { + AppUpdaterDialogComponent(dialogContent = dialogContent) + } + + composeTestRule.onNodeWithText(storeItem.title).assertIsDisplayed() + composeTestRule.onNodeWithTag(storeItem.icon.toString(), useUnmergedTree = true).assertIsDisplayed() + } + + @Test + fun `whenever user clicks on store items, then correct callback is being called`() { + val onStoreClickedListener: (StoreListItem) -> Unit = mock() + val storeItem = StoreListItem( + store = StoreFactory.getSamsungGalaxyStore(""), + title = "Store", + icon = coreR.drawable.appupdater_ic_galaxy_store, + ) + val dialogContent = UpdaterDialogUIData( + storeList = listOf(storeItem), + onStoreClickListener = onStoreClickedListener, + ) + composeTestRule.setContent { + AppUpdaterDialogComponent(dialogContent = dialogContent) + } + + composeTestRule.onNodeWithText(storeItem.title).performClick() + + verify(onStoreClickedListener).invoke(storeItem) + } + + @Test + fun `whenever user clicks on direct download items, then correct callback is being called`() { + val onDirectDownloadItemClicked: (DirectDownloadListItem) -> Unit = mock() + val directDownloadItem = DirectDownloadListItem("DirectDownloadItem", "Url") + val dialogContent = UpdaterDialogUIData( + directDownloadList = listOf(directDownloadItem), + onDirectLinkClickListener = onDirectDownloadItemClicked, + ) + composeTestRule.setContent { + AppUpdaterDialogComponent(dialogContent = dialogContent) + } + + composeTestRule.onNodeWithText(directDownloadItem.title).performClick() + + verify(onDirectDownloadItemClicked).invoke(directDownloadItem) + } + + @Test + fun `whenever component is called with divider true, then items in the header are shown correctly`() { + val dividerText = "Or" + val dialogContent = UpdaterDialogUIData( + shouldShowDividers = true, + dividerText = dividerText, + ) + composeTestRule.setContent { + AppUpdaterDialogComponent(dialogContent = dialogContent) + } + + composeTestRule.onNodeWithText(dividerText).assertIsDisplayed() + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4475bc10..7fcba328 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -22,6 +22,7 @@ composeActivity = "1.9.0" mockito = "5.11.0" mockitoKotlin = "5.3.1" roboelectric = "4.12.1" +uiautomator = "2.3.0" [libraries] androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } @@ -49,6 +50,7 @@ androidx-test-junit = { group = "androidx.test.ext", name = "junit", version.ref androidx-test-rules = { group = "androidx.test", name = "rules", version.ref = "androidTestRules" } androidx-test-ui-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "androidTestEspresso" } coroutines = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "coroutines" } +androidx-uiautomator = { group = "androidx.test.uiautomator", name = "uiautomator", version.ref = "uiautomator" } [plugins] androidApplication = { id = "com.android.application", version.ref = "agp" } From f1e6906f9c806fbfafcebf224f27c76a16808275 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Tue, 23 Apr 2024 17:50:20 +0200 Subject: [PATCH 070/117] added viewModel as compose function's argument to be able to inject a mock --- .../compose/ui/AndroidAppUpdaterScreen.kt | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt index 877e8dca..70ea7de3 100644 --- a/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt +++ b/compose/src/main/java/com/pouyaheydari/appupdater/compose/ui/AndroidAppUpdaterScreen.kt @@ -4,12 +4,14 @@ import android.app.Activity import android.content.Context import android.content.ContextWrapper import android.util.Log +import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewFontScale import androidx.compose.ui.tooling.preview.PreviewScreenSizes +import androidx.lifecycle.ViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel import com.pouyaheydari.androidappupdater.directdownload.utils.getApk @@ -28,19 +30,22 @@ import com.pouyaheydari.appupdater.core.utils.ANDROID_APP_UPDATER_DEBUG_TAG import com.pouyaheydari.appupdater.core.R as coreR /** - * Shows the compose dialog - * - * @param dialogData Data to be shown in the dialog + * Use this composable to show the updater dialog. */ @Composable -fun AndroidAppUpdater(dialogData: UpdaterDialogData) { - val viewModel: AndroidAppUpdaterViewModel = viewModel(factory = AndroidAppUpdaterViewModelFactory(dialogData)) +fun AndroidAppUpdater( + dialogData: UpdaterDialogData, + viewModel: ViewModel = viewModel(factory = AndroidAppUpdaterViewModelFactory(dialogData)), +) { + // As we want to keep AndroidAppUpdaterViewModel internal, we need to upcast it at the compose function and then use smart cast here + viewModel as? AndroidAppUpdaterViewModel ?: throw IllegalStateException("ViewModel must be of type AndroidAppUpdaterViewModel") + val state = viewModel.uiState.collectAsStateWithLifecycle().value - AndroidAppUpdaterTheme(darkTheme = isDarkThemeSelected(dialogData.theme)) { + AndroidAppUpdaterTheme(darkTheme = isDarkThemeSelected(dialogData.theme, isSystemInDarkTheme())) { val activity = LocalContext.current.getActivity() - if (state.shouldShowDialog) { + AnimatedVisibility(state.shouldShowDialog) { AppUpdaterDialogComponent(dialogContent = state.dialogContent, typeface = dialogData.typeface) } @@ -69,11 +74,10 @@ fun AndroidAppUpdater(dialogData: UpdaterDialogData) { } } -@Composable -private fun isDarkThemeSelected(theme: Theme): Boolean = when (theme) { +private fun isDarkThemeSelected(theme: Theme, isSystemDefaultInDarkTheme: Boolean): Boolean = when (theme) { Theme.DARK -> true Theme.LIGHT -> false - Theme.SYSTEM_DEFAULT -> isSystemInDarkTheme() + Theme.SYSTEM_DEFAULT -> isSystemDefaultInDarkTheme } private fun setupErrorCallback( From f845fb975d51143c255dc099ed036f1f1e40374d Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Thu, 25 Apr 2024 18:05:59 +0200 Subject: [PATCH 071/117] Started using TYPESAFE_PROJECT_ACCESSORS in gradle files --- app/build.gradle.kts | 4 ++-- appupdater/build.gradle.kts | 4 ++-- compose/build.gradle.kts | 4 ++-- directdownload/build.gradle.kts | 3 ++- settings.gradle.kts | 12 +++++++++++- store/build.gradle.kts | 2 +- 6 files changed, 20 insertions(+), 9 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 2b1301de..848d6186 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -42,8 +42,8 @@ android { dependencies { // library dependency - implementation(project(":appupdater")) - implementation(project(":compose")) + implementation(projects.appupdater) + implementation(projects.compose) // support dependency implementation(libs.androidx.appcompat) diff --git a/appupdater/build.gradle.kts b/appupdater/build.gradle.kts index ec4bc71b..b09d609e 100644 --- a/appupdater/build.gradle.kts +++ b/appupdater/build.gradle.kts @@ -31,8 +31,8 @@ android { dependencies { - api(project(":store")) - api(project(":directdownload")) + api(projects.store) + api(projects.directdownload) // support dependency implementation(libs.androidx.appcompat) diff --git a/compose/build.gradle.kts b/compose/build.gradle.kts index 21484f12..10774ade 100644 --- a/compose/build.gradle.kts +++ b/compose/build.gradle.kts @@ -46,8 +46,8 @@ android { dependencies { - api(project(":store")) - api(project(":directdownload")) + api(projects.store) + api(projects.directdownload) // compose val composeBom = platform(libs.androidx.compose.bom) diff --git a/directdownload/build.gradle.kts b/directdownload/build.gradle.kts index 679d2c92..50c3d4fd 100644 --- a/directdownload/build.gradle.kts +++ b/directdownload/build.gradle.kts @@ -28,7 +28,8 @@ android { } dependencies { - api(project(":core")) + api(projects.core) + implementation(libs.androidx.appcompat) implementation(libs.coroutines) diff --git a/settings.gradle.kts b/settings.gradle.kts index 5a01ac8e..8e343cb5 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -14,4 +14,14 @@ dependencyResolutionManagement { } } -include(":app", ":appupdater", ":core", ":compose", ":store", ":directdownload") +enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") + +include(":app") + +include(":core") + +include(":store") +include(":directdownload") + +include(":compose") +include(":appupdater") diff --git a/store/build.gradle.kts b/store/build.gradle.kts index 68d4c63d..66f74ea6 100644 --- a/store/build.gradle.kts +++ b/store/build.gradle.kts @@ -32,7 +32,7 @@ java { targetCompatibility = JavaVersion.VERSION_17 } dependencies { - api(project(":core")) + api(projects.core) implementation(libs.androidx.core) From 85423e6ae59e0b6cd0b985b773f0244cf98878f5 Mon Sep 17 00:00:00 2001 From: Pouya Heydari Date: Thu, 25 Apr 2024 19:03:04 +0200 Subject: [PATCH 072/117] Changed core module to a pure kotlin library --- .editorconfig | 13 ++--- app/build.gradle.kts | 4 +- .../ExampleInstrumentedTest.kt | 26 ---------- .../demo}/ui/android/MainActivity.kt | 20 ++++---- .../demo}/ui/compose/ComposeSampleActivity.kt | 20 ++++---- .../demo}/ui/compose/theme/Color.kt | 2 +- .../demo}/ui/compose/theme/Theme.kt | 2 +- .../demo}/ui/compose/theme/Type.kt | 2 +- .../demo}/utils/ComposePreviewData.kt | 44 ++++++++--------- .../demo}/utils/Constants.kt | 2 +- .../demo}/utils/DSLPreviewData.kt | 44 ++++++++--------- app/src/main/res/layout/activity_main.xml | 2 +- appupdater/build.gradle.kts | 2 +- .../appupdater/{ => main}/AppUpdaterDialog.kt | 46 +++++++++--------- .../{ => main}/AppUpdaterViewModel.kt | 16 +++--- .../{ => main}/UpdateInProgressDialog.kt | 23 +++++---- .../adapters/DirectRecyclerAdapter.kt | 6 +-- .../adapters/StoresRecyclerAdapter.kt | 18 +++---- .../appupdater/{ => main}/dsl/DSLUtils.kt | 10 ++-- .../{ => main}/mapper/SelectedThemeMapper.kt | 4 +- .../{ => main}/pojo/DialogStates.kt | 4 +- .../{ => main}/pojo/UpdaterDialogData.kt | 6 +-- .../{ => main}/pojo/UpdaterFragmentModel.kt | 6 +-- .../{ => main}/pojo/UserSelectedTheme.kt | 2 +- .../{ => main}/utils/EnumBundleExtension.kt | 2 +- .../{ => main}/utils/ErrorCallbackHolder.kt | 2 +- .../{ => main}/utils/GetDialogWidth.kt | 2 +- .../{ => main}/utils/ParcelableCompatApi.kt | 2 +- .../{ => main}/utils/TypefaceHolder.kt | 3 +- build.gradle.kts | 1 + .../data/mapper/UpdaterDialogUIMapper.kt | 4 +- .../compose/ui/AndroidAppUpdaterScreen.kt | 28 +++++------ .../compose/ui/AndroidAppUpdaterViewModel.kt | 8 +-- .../ui/AndroidAppUpdaterViewModelFactory.kt | 2 +- .../components/AppUpdaterDialogComponent.kt | 14 +++--- .../ui/components/DialogHeaderComponent.kt | 6 +-- .../compose/ui/components/DividerComponent.kt | 4 +- .../ui/components/SquareStoreItemComponent.kt | 6 +-- .../UpdateInProgressDialogComponent.kt | 6 +-- .../compose/ui/models/DialogHeaderModel.kt | 4 +- .../compose/ui/models/DialogScreenIntents.kt | 4 +- .../compose/ui/models/DialogScreenState.kt | 2 +- .../compose/ui/models/UpdaterDialogData.kt | 4 +- .../compose/ui/models/UpdaterDialogUIData.kt | 4 +- .../compose/ui/models/UpdaterViewModelData.kt | 4 +- .../compose/ui/utils/AppUpdaterPreviewData.kt | 40 +++++++-------- .../AppUpdaterDialogComponentTest.kt | 14 +++--- .../components/DialogHeaderComponentTest.kt | 4 +- .../SquareStoreItemComponentTest.kt | 4 +- core/build.gradle.kts | 37 +++----------- directdownload/build.gradle.kts | 2 +- .../data/UpdateInProgressRepositoryImpl.kt | 4 +- .../data/model/DirectDownloadListItem.kt | 2 +- .../domain/GetIsUpdateInProgress.kt | 4 +- .../domain/GetRequestIdInteractor.kt | 4 +- .../domain/SetIsUpdateInProgress.kt | 4 +- .../domain/SetRequestIdInteractor.kt | 4 +- .../domain/UpdateInProgressRepository.kt | 2 +- .../receiver/DownloadFinishedReceiver.kt | 12 ++--- .../directdownload/utils/ContextExtensions.kt | 2 +- .../directdownload/utils/DownloadAPK.kt | 6 +-- .../utils/DownloadAPKPermissionManager.kt | 2 +- .../directdownload/utils/InstallApkUtil.kt | 2 +- .../src/main/res/values/colors.xml | 0 .../src/main/res/values/strings.xml | 0 gradle/libs.versions.toml | 1 + .../store/domain/StoreIntentProviderTest.kt | 1 - .../store/domain/StoreManagerTest.kt | 4 +- .../store/domain/stores/AmazonAppStoreTest.kt | 8 ++- .../store/domain/stores/AptoideTest.kt | 8 ++- .../domain/stores/CafeBazaarStoreTest.kt | 8 ++- .../store/domain/stores/FDroidTest.kt | 8 ++- .../domain/stores/GooglePlayStoreTest.kt | 8 ++- .../domain/stores/HuaweiAppGalleryTest.kt | 8 ++- .../domain/stores/LenovoAppCenterTest.kt | 7 ++- .../store/domain/stores/MiGetAppStoreTest.kt | 7 ++- .../store/domain/stores/MyketStoreTest.kt | 8 ++- .../store/domain/stores/NineAppsTest.kt | 8 ++- .../domain/stores/OneStoreAppMarketTest.kt | 7 ++- .../store/domain/stores/OppoAppMarketTest.kt | 8 ++- .../domain/stores/SamsungGalaxyStoreTest.kt | 7 ++- .../store/domain/stores/TencentStoreTest.kt | 7 ++- .../store/domain/stores/VAppStoreTest.kt | 7 ++- .../store/domain/stores/ZTEAppCenterTest.kt | 7 ++- .../store/domain/ShowStoreModel.kt | 4 +- .../store/domain/StoreFactory.kt | 34 ++++++------- .../store/domain/StoreIntentProvider.kt | 2 +- .../store/domain/StoreListItem.kt | 8 +-- .../store/domain/StoreManager.kt | 2 +- .../store/domain/stores/AmazonAppStore.kt | 4 +- .../store/domain/stores/AppStore.kt | 2 +- .../store/domain/stores/Aptoide.kt | 4 +- .../store/domain/stores/CafeBazaarStore.kt | 4 +- .../store/domain/stores/FDroid.kt | 4 +- .../store/domain/stores/GooglePlayStore.kt | 4 +- .../store/domain/stores/HuaweiAppGallery.kt | 4 +- .../store/domain/stores/LenovoAppCenter.kt | 4 +- .../store/domain/stores/MiGetAppStore.kt | 4 +- .../store/domain/stores/MyketStore.kt | 4 +- .../store/domain/stores/NineApps.kt | 4 +- .../store/domain/stores/OneStoreAppMarket.kt | 4 +- .../store/domain/stores/OppoAppMarket.kt | 4 +- .../store/domain/stores/SamsungGalaxyStore.kt | 4 +- .../store/domain/stores/TencentAppStore.kt | 4 +- .../store/domain/stores/VAppStore.kt | 4 +- .../store/domain/stores/ZTEAppCenter.kt | 4 +- .../appupdater_ic_amazon_app_store.png | Bin .../drawable-nodpi/appupdater_ic_bazar.png | Bin .../drawable-nodpi/appupdater_ic_cloud.png | Bin .../drawable-nodpi/appupdater_ic_fdroid.png | Bin .../appupdater_ic_galaxy_store.png | Bin .../appupdater_ic_get_app_store.png | Bin .../appupdater_ic_lenovo_app_center.png | Bin .../appupdater_ic_nine_apps.png | Bin .../appupdater_ic_one_store.png | Bin .../appupdater_ic_oppo_app_market.png | Bin .../appupdater_ic_tencent_app_store.png | Bin .../appupdater_ic_v_app_store.png | Bin .../appupdater_ic_zte_app_center.png | Bin .../drawable/appupdater_ic_app_gallery.xml | 0 .../res/drawable/appupdater_ic_aptoide.xml | 0 .../drawable/appupdater_ic_google_play.xml | 0 .../main/res/drawable/appupdater_ic_myket.xml | 0 .../store/domain/StoreFactoryTest.kt | 33 ++++++------- 124 files changed, 392 insertions(+), 469 deletions(-) delete mode 100644 app/src/androidTest/java/com/pouyaheydari/androidappupdater/ExampleInstrumentedTest.kt rename app/src/main/java/com/pouyaheydari/{androidappupdater => appupdater/demo}/ui/android/MainActivity.kt (81%) rename app/src/main/java/com/pouyaheydari/{androidappupdater => appupdater/demo}/ui/compose/ComposeSampleActivity.kt (79%) rename app/src/main/java/com/pouyaheydari/{androidappupdater => appupdater/demo}/ui/compose/theme/Color.kt (67%) rename app/src/main/java/com/pouyaheydari/{androidappupdater => appupdater/demo}/ui/compose/theme/Theme.kt (95%) rename app/src/main/java/com/pouyaheydari/{androidappupdater => appupdater/demo}/ui/compose/theme/Type.kt (88%) rename app/src/main/java/com/pouyaheydari/{androidappupdater => appupdater/demo}/utils/ComposePreviewData.kt (66%) rename app/src/main/java/com/pouyaheydari/{androidappupdater => appupdater/demo}/utils/Constants.kt (89%) rename app/src/main/java/com/pouyaheydari/{androidappupdater => appupdater/demo}/utils/DSLPreviewData.kt (71%) rename appupdater/src/main/java/com/pouyaheydari/appupdater/{ => main}/AppUpdaterDialog.kt (85%) rename appupdater/src/main/java/com/pouyaheydari/appupdater/{ => main}/AppUpdaterViewModel.kt (77%) rename appupdater/src/main/java/com/pouyaheydari/appupdater/{ => main}/UpdateInProgressDialog.kt (76%) rename appupdater/src/main/java/com/pouyaheydari/appupdater/{ => main}/adapters/DirectRecyclerAdapter.kt (86%) rename appupdater/src/main/java/com/pouyaheydari/appupdater/{ => main}/adapters/StoresRecyclerAdapter.kt (73%) rename appupdater/src/main/java/com/pouyaheydari/appupdater/{ => main}/dsl/DSLUtils.kt (62%) rename appupdater/src/main/java/com/pouyaheydari/appupdater/{ => main}/mapper/SelectedThemeMapper.kt (89%) rename appupdater/src/main/java/com/pouyaheydari/appupdater/{ => main}/pojo/DialogStates.kt (79%) rename appupdater/src/main/java/com/pouyaheydari/appupdater/{ => main}/pojo/UpdaterDialogData.kt (73%) rename appupdater/src/main/java/com/pouyaheydari/appupdater/{ => main}/pojo/UpdaterFragmentModel.kt (88%) rename appupdater/src/main/java/com/pouyaheydari/appupdater/{ => main}/pojo/UserSelectedTheme.kt (73%) rename appupdater/src/main/java/com/pouyaheydari/appupdater/{ => main}/utils/EnumBundleExtension.kt (87%) rename appupdater/src/main/java/com/pouyaheydari/appupdater/{ => main}/utils/ErrorCallbackHolder.kt (84%) rename appupdater/src/main/java/com/pouyaheydari/appupdater/{ => main}/utils/GetDialogWidth.kt (91%) rename appupdater/src/main/java/com/pouyaheydari/appupdater/{ => main}/utils/ParcelableCompatApi.kt (91%) rename appupdater/src/main/java/com/pouyaheydari/appupdater/{ => main}/utils/TypefaceHolder.kt (83%) rename directdownload/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/directdownload/data/UpdateInProgressRepositoryImpl.kt (85%) rename directdownload/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/directdownload/data/model/DirectDownloadListItem.kt (92%) rename directdownload/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/directdownload/domain/GetIsUpdateInProgress.kt (59%) rename directdownload/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/directdownload/domain/GetRequestIdInteractor.kt (54%) rename directdownload/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/directdownload/domain/SetIsUpdateInProgress.kt (62%) rename directdownload/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/directdownload/domain/SetRequestIdInteractor.kt (58%) rename directdownload/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/directdownload/domain/UpdateInProgressRepository.kt (79%) rename directdownload/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/directdownload/receiver/DownloadFinishedReceiver.kt (80%) rename directdownload/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/directdownload/utils/ContextExtensions.kt (83%) rename directdownload/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/directdownload/utils/DownloadAPK.kt (89%) rename directdownload/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/directdownload/utils/DownloadAPKPermissionManager.kt (97%) rename directdownload/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/directdownload/utils/InstallApkUtil.kt (97%) rename {core => directdownload}/src/main/res/values/colors.xml (100%) rename {core => directdownload}/src/main/res/values/strings.xml (100%) rename store/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/store/domain/ShowStoreModel.kt (52%) rename store/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/store/domain/StoreFactory.kt (50%) rename store/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/store/domain/StoreIntentProvider.kt (92%) rename store/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/store/domain/StoreListItem.kt (83%) rename store/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/store/domain/StoreManager.kt (93%) rename store/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/store/domain/stores/AmazonAppStore.kt (88%) rename store/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/store/domain/stores/AppStore.kt (67%) rename store/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/store/domain/stores/Aptoide.kt (87%) rename store/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/store/domain/stores/CafeBazaarStore.kt (87%) rename store/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/store/domain/stores/FDroid.kt (87%) rename store/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/store/domain/stores/GooglePlayStore.kt (87%) rename store/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/store/domain/stores/HuaweiAppGallery.kt (88%) rename store/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/store/domain/stores/LenovoAppCenter.kt (87%) rename store/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/store/domain/stores/MiGetAppStore.kt (87%) rename store/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/store/domain/stores/MyketStore.kt (87%) rename store/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/store/domain/stores/NineApps.kt (87%) rename store/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/store/domain/stores/OneStoreAppMarket.kt (87%) rename store/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/store/domain/stores/OppoAppMarket.kt (87%) rename store/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/store/domain/stores/SamsungGalaxyStore.kt (87%) rename store/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/store/domain/stores/TencentAppStore.kt (87%) rename store/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/store/domain/stores/VAppStore.kt (86%) rename store/src/main/java/com/pouyaheydari/{androidappupdater => appupdater}/store/domain/stores/ZTEAppCenter.kt (86%) rename {core => store}/src/main/res/drawable-nodpi/appupdater_ic_amazon_app_store.png (100%) rename {core => store}/src/main/res/drawable-nodpi/appupdater_ic_bazar.png (100%) rename {core => store}/src/main/res/drawable-nodpi/appupdater_ic_cloud.png (100%) rename {core => store}/src/main/res/drawable-nodpi/appupdater_ic_fdroid.png (100%) rename {core => store}/src/main/res/drawable-nodpi/appupdater_ic_galaxy_store.png (100%) rename {core => store}/src/main/res/drawable-nodpi/appupdater_ic_get_app_store.png (100%) rename {core => store}/src/main/res/drawable-nodpi/appupdater_ic_lenovo_app_center.png (100%) rename {core => store}/src/main/res/drawable-nodpi/appupdater_ic_nine_apps.png (100%) rename {core => store}/src/main/res/drawable-nodpi/appupdater_ic_one_store.png (100%) rename {core => store}/src/main/res/drawable-nodpi/appupdater_ic_oppo_app_market.png (100%) rename {core => store}/src/main/res/drawable-nodpi/appupdater_ic_tencent_app_store.png (100%) rename {core => store}/src/main/res/drawable-nodpi/appupdater_ic_v_app_store.png (100%) rename {core => store}/src/main/res/drawable-nodpi/appupdater_ic_zte_app_center.png (100%) rename {core => store}/src/main/res/drawable/appupdater_ic_app_gallery.xml (100%) rename {core => store}/src/main/res/drawable/appupdater_ic_aptoide.xml (100%) rename {core => store}/src/main/res/drawable/appupdater_ic_google_play.xml (100%) rename {core => store}/src/main/res/drawable/appupdater_ic_myket.xml (100%) diff --git a/.editorconfig b/.editorconfig index e64b4efe..89b9860f 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,16 +1,17 @@ [*] -charset=utf-8 -end_of_line=lf -insert_final_newline=true -indent_style=space -indent_size=4 +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 4 [*.{kt,kts}] max_line_length = 180 -ktlint_function_naming_ignore_when_annotated_with=Composable +ktlint_function_naming_ignore_when_annotated_with = Composable ktlint_standard_string-template-indent = disabled ktlint_standard_multiline-expression-wrapping = disabled ktlint_standard_blank-line-before-declaration = disabled ktlint_standard_function-signature = disabled ktlint_function_signature_rule_force_multiline_when_parameter_count_greater_or_equal_than = unset ktlint_function_signature_body_expression_wrapping = default +ktlint_standard_backing-property-naming = disabled diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 848d6186..09934ec8 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -6,7 +6,7 @@ plugins { android { compileSdk = libs.versions.compileSdkVersion.get().toInt() defaultConfig { - applicationId = "com.pouyaheydari.androidappupdater" + applicationId = "com.pouyaheydari.appupdater.demo" minSdk = libs.versions.minSdkVersion.get().toInt() targetSdk = libs.versions.targetSdkVersion.get().toInt() versionCode = libs.versions.appVersion.get().toInt() @@ -16,7 +16,7 @@ android { useSupportLibrary = true } } - namespace = "com.pouyaheydari.androidappupdater" + namespace = "com.pouyaheydari.appupdater.demo" compileOptions { sourceCompatibility = JavaVersion.VERSION_17 diff --git a/app/src/androidTest/java/com/pouyaheydari/androidappupdater/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/pouyaheydari/androidappupdater/ExampleInstrumentedTest.kt deleted file mode 100644 index 6da3c7a1..00000000 --- a/app/src/androidTest/java/com/pouyaheydari/androidappupdater/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.pouyaheydari.androidappupdater - -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.platform.app.InstrumentationRegistry -import org.junit.Assert.assertEquals -import org.junit.Test -import org.junit.runner.RunWith - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - - /** - * A dummy test - */ - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().context - assertEquals("ir.heydarii.androidappupdater", appContext.packageName) - } -} diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/android/MainActivity.kt b/app/src/main/java/com/pouyaheydari/appupdater/demo/ui/android/MainActivity.kt similarity index 81% rename from app/src/main/java/com/pouyaheydari/androidappupdater/ui/android/MainActivity.kt rename to app/src/main/java/com/pouyaheydari/appupdater/demo/ui/android/MainActivity.kt index e19ca2ee..c48a250a 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/android/MainActivity.kt +++ b/app/src/main/java/com/pouyaheydari/appupdater/demo/ui/android/MainActivity.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.androidappupdater.ui.android +package com.pouyaheydari.appupdater.demo.ui.android import android.content.Intent import android.graphics.Typeface @@ -6,16 +6,16 @@ import android.os.Bundle import android.widget.Button import android.widget.Toast import androidx.appcompat.app.AppCompatActivity -import com.pouyaheydari.androidappupdater.R -import com.pouyaheydari.androidappupdater.ui.compose.ComposeSampleActivity -import com.pouyaheydari.androidappupdater.utils.directDownloadList -import com.pouyaheydari.androidappupdater.utils.getDSLStoreList -import com.pouyaheydari.androidappupdater.utils.getDslDirectDownloadLink -import com.pouyaheydari.androidappupdater.utils.storeList -import com.pouyaheydari.appupdater.AppUpdaterDialog import com.pouyaheydari.appupdater.core.model.Theme -import com.pouyaheydari.appupdater.dsl.updateDialogBuilder -import com.pouyaheydari.appupdater.pojo.UpdaterDialogData +import com.pouyaheydari.appupdater.demo.R +import com.pouyaheydari.appupdater.demo.ui.compose.ComposeSampleActivity +import com.pouyaheydari.appupdater.demo.utils.directDownloadList +import com.pouyaheydari.appupdater.demo.utils.getDSLStoreList +import com.pouyaheydari.appupdater.demo.utils.getDslDirectDownloadLink +import com.pouyaheydari.appupdater.demo.utils.storeList +import com.pouyaheydari.appupdater.main.AppUpdaterDialog +import com.pouyaheydari.appupdater.main.dsl.updateDialogBuilder +import com.pouyaheydari.appupdater.main.pojo.UpdaterDialogData private const val TAG = "showUpdateDialogTag" private const val FONT_PATH = "fonts/vazir.ttf" diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt b/app/src/main/java/com/pouyaheydari/appupdater/demo/ui/compose/ComposeSampleActivity.kt similarity index 79% rename from app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt rename to app/src/main/java/com/pouyaheydari/appupdater/demo/ui/compose/ComposeSampleActivity.kt index a76e6023..f3babbfb 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/ComposeSampleActivity.kt +++ b/app/src/main/java/com/pouyaheydari/appupdater/demo/ui/compose/ComposeSampleActivity.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.androidappupdater.ui.compose +package com.pouyaheydari.appupdater.demo.ui.compose import android.os.Bundle import android.widget.Toast @@ -18,14 +18,14 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview -import com.pouyaheydari.androidappupdater.R -import com.pouyaheydari.androidappupdater.ui.compose.theme.AndroidAppUpdaterTheme -import com.pouyaheydari.androidappupdater.utils.directDownloadList -import com.pouyaheydari.androidappupdater.utils.storeList import com.pouyaheydari.appupdater.compose.ui.AndroidAppUpdater import com.pouyaheydari.appupdater.compose.ui.models.UpdaterDialogData import com.pouyaheydari.appupdater.core.model.Theme -import com.pouyaheydari.appupdater.core.R as coreR +import com.pouyaheydari.appupdater.demo.R +import com.pouyaheydari.appupdater.demo.ui.compose.theme.AndroidAppUpdaterTheme +import com.pouyaheydari.appupdater.demo.utils.directDownloadList +import com.pouyaheydari.appupdater.demo.utils.storeList +import com.pouyaheydari.appupdater.directdownload.R as directDownloadR /** * To use the library in compose, @@ -47,9 +47,9 @@ internal class ComposeSampleActivity : ComponentActivity() { if (state) { AndroidAppUpdater( UpdaterDialogData( - dialogTitle = stringResource(id = coreR.string.appupdater_app_name), + dialogTitle = stringResource(id = directDownloadR.string.appupdater_app_name), dialogDescription = stringResource(id = R.string.library_description), - dividerText = stringResource(coreR.string.appupdater_or), + dividerText = stringResource(directDownloadR.string.appupdater_or), storeList = storeList(this), directDownloadList = directDownloadList(this), theme = Theme.SYSTEM_DEFAULT, @@ -71,9 +71,9 @@ private fun DefaultPreview() { AndroidAppUpdaterTheme { AndroidAppUpdater( UpdaterDialogData( - dialogTitle = stringResource(id = coreR.string.appupdater_app_name), + dialogTitle = stringResource(id = directDownloadR.string.appupdater_app_name), dialogDescription = stringResource(id = R.string.library_description), - dividerText = stringResource(coreR.string.appupdater_or), + dividerText = stringResource(directDownloadR.string.appupdater_or), storeList = storeList(LocalContext.current), directDownloadList = directDownloadList(LocalContext.current), theme = Theme.DARK, diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/theme/Color.kt b/app/src/main/java/com/pouyaheydari/appupdater/demo/ui/compose/theme/Color.kt similarity index 67% rename from app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/theme/Color.kt rename to app/src/main/java/com/pouyaheydari/appupdater/demo/ui/compose/theme/Color.kt index 7999b575..1f2978f2 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/theme/Color.kt +++ b/app/src/main/java/com/pouyaheydari/appupdater/demo/ui/compose/theme/Color.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.androidappupdater.ui.compose.theme +package com.pouyaheydari.appupdater.demo.ui.compose.theme import androidx.compose.ui.graphics.Color diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/theme/Theme.kt b/app/src/main/java/com/pouyaheydari/appupdater/demo/ui/compose/theme/Theme.kt similarity index 95% rename from app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/theme/Theme.kt rename to app/src/main/java/com/pouyaheydari/appupdater/demo/ui/compose/theme/Theme.kt index 5b7a2e7e..4cdfff5b 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/theme/Theme.kt +++ b/app/src/main/java/com/pouyaheydari/appupdater/demo/ui/compose/theme/Theme.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.androidappupdater.ui.compose.theme +package com.pouyaheydari.appupdater.demo.ui.compose.theme import android.app.Activity import androidx.compose.foundation.isSystemInDarkTheme diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/theme/Type.kt b/app/src/main/java/com/pouyaheydari/appupdater/demo/ui/compose/theme/Type.kt similarity index 88% rename from app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/theme/Type.kt rename to app/src/main/java/com/pouyaheydari/appupdater/demo/ui/compose/theme/Type.kt index 635d35a8..18098586 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/ui/compose/theme/Type.kt +++ b/app/src/main/java/com/pouyaheydari/appupdater/demo/ui/compose/theme/Type.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.androidappupdater.ui.compose.theme +package com.pouyaheydari.appupdater.demo.ui.compose.theme import androidx.compose.material3.Typography import androidx.compose.ui.text.TextStyle diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/utils/ComposePreviewData.kt b/app/src/main/java/com/pouyaheydari/appupdater/demo/utils/ComposePreviewData.kt similarity index 66% rename from app/src/main/java/com/pouyaheydari/androidappupdater/utils/ComposePreviewData.kt rename to app/src/main/java/com/pouyaheydari/appupdater/demo/utils/ComposePreviewData.kt index f8ede9af..52e2a6c2 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/utils/ComposePreviewData.kt +++ b/app/src/main/java/com/pouyaheydari/appupdater/demo/utils/ComposePreviewData.kt @@ -1,11 +1,11 @@ -package com.pouyaheydari.androidappupdater.utils +package com.pouyaheydari.appupdater.demo.utils import android.content.Context -import com.pouyaheydari.androidappupdater.R -import com.pouyaheydari.androidappupdater.directdownload.data.model.DirectDownloadListItem -import com.pouyaheydari.androidappupdater.store.domain.StoreFactory -import com.pouyaheydari.androidappupdater.store.domain.StoreListItem -import com.pouyaheydari.appupdater.core.R as coreR +import com.pouyaheydari.appupdater.demo.R +import com.pouyaheydari.appupdater.directdownload.data.model.DirectDownloadListItem +import com.pouyaheydari.appupdater.store.domain.StoreFactory +import com.pouyaheydari.appupdater.store.domain.StoreListItem +import com.pouyaheydari.appupdater.store.R as storeR internal fun directDownloadList(context: Context) = listOf( DirectDownloadListItem( @@ -22,81 +22,81 @@ internal fun storeList(context: Context) = listOf( StoreListItem( StoreFactory.getGooglePlayStore(SAMPLE_PACKAGE_NAME), context.getString(R.string.play), - icon = coreR.drawable.appupdater_ic_google_play, + icon = storeR.drawable.appupdater_ic_google_play, ), StoreListItem( StoreFactory.getCafeBazaarStore(SAMPLE_PACKAGE_NAME), context.getString(R.string.bazaar), - icon = coreR.drawable.appupdater_ic_bazar, + icon = storeR.drawable.appupdater_ic_bazar, ), StoreListItem( StoreFactory.getMyketStore(SAMPLE_PACKAGE_NAME), context.getString(R.string.myket), - icon = coreR.drawable.appupdater_ic_myket, + icon = storeR.drawable.appupdater_ic_myket, ), StoreListItem( StoreFactory.getHuaweiAppGalleryStore(SAMPLE_PACKAGE_NAME), context.getString(R.string.app_gallery), - icon = coreR.drawable.appupdater_ic_app_gallery, + icon = storeR.drawable.appupdater_ic_app_gallery, ), StoreListItem( StoreFactory.getSamsungGalaxyStore(SAMPLE_PACKAGE_NAME), context.getString(R.string.galaxy_store), - icon = coreR.drawable.appupdater_ic_galaxy_store, + icon = storeR.drawable.appupdater_ic_galaxy_store, ), StoreListItem( StoreFactory.getAmazonAppStore(SAMPLE_PACKAGE_NAME), context.getString(R.string.amazon_store), - icon = coreR.drawable.appupdater_ic_amazon_app_store, + icon = storeR.drawable.appupdater_ic_amazon_app_store, ), StoreListItem( StoreFactory.getAptoideStore(SAMPLE_PACKAGE_NAME), context.getString(R.string.aptoide), - icon = coreR.drawable.appupdater_ic_aptoide, + icon = storeR.drawable.appupdater_ic_aptoide, ), StoreListItem( StoreFactory.getOppoAppMarketStore(SAMPLE_PACKAGE_NAME), context.getString(R.string.oppo_app_market), - icon = coreR.drawable.appupdater_ic_oppo_app_market, + icon = storeR.drawable.appupdater_ic_oppo_app_market, ), StoreListItem( StoreFactory.getVAppStore(SAMPLE_PACKAGE_NAME), context.getString(R.string.v_app_store), - icon = coreR.drawable.appupdater_ic_v_app_store, + icon = storeR.drawable.appupdater_ic_v_app_store, ), StoreListItem( StoreFactory.getNineAppsStore(SAMPLE_PACKAGE_NAME), context.getString(R.string.nine_apps), - icon = coreR.drawable.appupdater_ic_nine_apps, + icon = storeR.drawable.appupdater_ic_nine_apps, ), StoreListItem( StoreFactory.getTencentAppStore(SAMPLE_PACKAGE_NAME), context.getString(R.string.tencent_app_store), - icon = coreR.drawable.appupdater_ic_tencent_app_store, + icon = storeR.drawable.appupdater_ic_tencent_app_store, ), StoreListItem( StoreFactory.getZTEStore(SAMPLE_PACKAGE_NAME), context.getString(R.string.zte_app_store), - icon = coreR.drawable.appupdater_ic_zte_app_center, + icon = storeR.drawable.appupdater_ic_zte_app_center, ), StoreListItem( StoreFactory.getLenovoAppCenterStore(SAMPLE_PACKAGE_NAME), context.getString(R.string.lenovo_app_center), - icon = coreR.drawable.appupdater_ic_lenovo_app_center, + icon = storeR.drawable.appupdater_ic_lenovo_app_center, ), StoreListItem( StoreFactory.getFdroidStore(FDROID_SAMPLE_PACKAGE_NAME), context.getString(R.string.fdroid), - icon = coreR.drawable.appupdater_ic_fdroid, + icon = storeR.drawable.appupdater_ic_fdroid, ), StoreListItem( StoreFactory.getMiStore(GET_APP_SAMPLE_PACKAGE_NAME), context.getString(R.string.mi_get_app), - icon = coreR.drawable.appupdater_ic_get_app_store, + icon = storeR.drawable.appupdater_ic_get_app_store, ), StoreListItem( StoreFactory.getOneStore(ONE_STORE_SAMPLE_PACKAGE_NAME), context.getString(R.string.one_store), - icon = coreR.drawable.appupdater_ic_one_store, + icon = storeR.drawable.appupdater_ic_one_store, ), ) diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/utils/Constants.kt b/app/src/main/java/com/pouyaheydari/appupdater/demo/utils/Constants.kt similarity index 89% rename from app/src/main/java/com/pouyaheydari/androidappupdater/utils/Constants.kt rename to app/src/main/java/com/pouyaheydari/appupdater/demo/utils/Constants.kt index a6b35cf8..950ab8be 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/utils/Constants.kt +++ b/app/src/main/java/com/pouyaheydari/appupdater/demo/utils/Constants.kt @@ -1,4 +1,4 @@ -package com.pouyaheydari.androidappupdater.utils +package com.pouyaheydari.appupdater.demo.utils internal const val APK_URL = "https://cafebazaar.ir/download/bazaar.apk" internal const val WEBSITE_URL = "https://pouyaheydari.com" diff --git a/app/src/main/java/com/pouyaheydari/androidappupdater/utils/DSLPreviewData.kt b/app/src/main/java/com/pouyaheydari/appupdater/demo/utils/DSLPreviewData.kt similarity index 71% rename from app/src/main/java/com/pouyaheydari/androidappupdater/utils/DSLPreviewData.kt rename to app/src/main/java/com/pouyaheydari/appupdater/demo/utils/DSLPreviewData.kt index 1fbadcc6..37c4e967 100644 --- a/app/src/main/java/com/pouyaheydari/androidappupdater/utils/DSLPreviewData.kt +++ b/app/src/main/java/com/pouyaheydari/appupdater/demo/utils/DSLPreviewData.kt @@ -1,11 +1,11 @@ -package com.pouyaheydari.androidappupdater.utils +package com.pouyaheydari.appupdater.demo.utils import android.content.Context -import com.pouyaheydari.androidappupdater.R -import com.pouyaheydari.androidappupdater.store.domain.StoreFactory -import com.pouyaheydari.appupdater.dsl.directDownload -import com.pouyaheydari.appupdater.dsl.store -import com.pouyaheydari.appupdater.core.R as coreR +import com.pouyaheydari.appupdater.demo.R +import com.pouyaheydari.appupdater.main.dsl.directDownload +import com.pouyaheydari.appupdater.main.dsl.store +import com.pouyaheydari.appupdater.store.domain.StoreFactory +import com.pouyaheydari.appupdater.store.R as storeR internal fun getDslDirectDownloadLink(context: Context) = listOf( directDownload { @@ -22,97 +22,97 @@ internal fun getDSLStoreList(context: Context) = listOf( store { store = StoreFactory.getGooglePlayStore(SAMPLE_PACKAGE_NAME) title = context.getString(R.string.play) - icon = coreR.drawable.appupdater_ic_google_play + icon = storeR.drawable.appupdater_ic_google_play url = WEBSITE_URL }, store { store = StoreFactory.getCafeBazaarStore(SAMPLE_PACKAGE_NAME) title = context.getString(R.string.bazaar) - icon = coreR.drawable.appupdater_ic_bazar + icon = storeR.drawable.appupdater_ic_bazar url = WEBSITE_URL }, store { store = StoreFactory.getMyketStore(SAMPLE_PACKAGE_NAME) title = context.getString(R.string.myket) - icon = coreR.drawable.appupdater_ic_myket + icon = storeR.drawable.appupdater_ic_myket url = WEBSITE_URL }, store { store = StoreFactory.getHuaweiAppGalleryStore(SAMPLE_PACKAGE_NAME) title = context.getString(R.string.app_gallery) - icon = coreR.drawable.appupdater_ic_app_gallery + icon = storeR.drawable.appupdater_ic_app_gallery url = WEBSITE_URL }, store { store = StoreFactory.getSamsungGalaxyStore(SAMPLE_PACKAGE_NAME) title = context.getString(R.string.galaxy_store) - icon = coreR.drawable.appupdater_ic_galaxy_store + icon = storeR.drawable.appupdater_ic_galaxy_store url = WEBSITE_URL }, store { store = StoreFactory.getAmazonAppStore(SAMPLE_PACKAGE_NAME) title = context.getString(R.string.amazon_store) - icon = coreR.drawable.appupdater_ic_amazon_app_store + icon = storeR.drawable.appupdater_ic_amazon_app_store url = WEBSITE_URL }, store { store = StoreFactory.getAptoideStore(SAMPLE_PACKAGE_NAME) title = context.getString(R.string.aptoide) - icon = coreR.drawable.appupdater_ic_aptoide + icon = storeR.drawable.appupdater_ic_aptoide url = WEBSITE_URL }, store { store = StoreFactory.getOppoAppMarketStore(SAMPLE_PACKAGE_NAME) title = context.getString(R.string.oppo_app_market) - icon = coreR.drawable.appupdater_ic_oppo_app_market + icon = storeR.drawable.appupdater_ic_oppo_app_market url = WEBSITE_URL }, store { store = StoreFactory.getVAppStore(SAMPLE_PACKAGE_NAME) title = context.getString(R.string.v_app_store) - icon = coreR.drawable.appupdater_ic_v_app_store + icon = storeR.drawable.appupdater_ic_v_app_store url = WEBSITE_URL }, store { store = StoreFactory.getNineAppsStore(SAMPLE_PACKAGE_NAME) title = context.getString(R.string.nine_apps) - icon = coreR.drawable.appupdater_ic_nine_apps + icon = storeR.drawable.appupdater_ic_nine_apps url = WEBSITE_URL }, store { store = StoreFactory.getTencentAppStore(SAMPLE_PACKAGE_NAME) title = context.getString(R.string.tencent_app_store) - icon = coreR.drawable.appupdater_ic_tencent_app_store + icon = storeR.drawable.appupdater_ic_tencent_app_store url = WEBSITE_URL }, store { store = StoreFactory.getZTEStore(SAMPLE_PACKAGE_NAME) title = context.getString(R.string.zte_app_store) - icon = coreR.drawable.appupdater_ic_zte_app_center + icon = storeR.drawable.appupdater_ic_zte_app_center url = WEBSITE_URL }, store { store = StoreFactory.getLenovoAppCenterStore(SAMPLE_PACKAGE_NAME) title = context.getString(R.string.lenovo_app_center) - icon = coreR.drawable.appupdater_ic_lenovo_app_center + icon = storeR.drawable.appupdater_ic_lenovo_app_center url = WEBSITE_URL }, store { store = StoreFactory.getFdroidStore(FDROID_SAMPLE_PACKAGE_NAME) title = context.getString(R.string.fdroid) - icon = coreR.drawable.appupdater_ic_fdroid + icon = storeR.drawable.appupdater_ic_fdroid url = WEBSITE_URL }, store { store = StoreFactory.getMiStore(GET_APP_SAMPLE_PACKAGE_NAME) title = context.getString(R.string.mi_get_app) - icon = coreR.drawable.appupdater_ic_get_app_store + icon = storeR.drawable.appupdater_ic_get_app_store url = WEBSITE_URL }, store { store = StoreFactory.getOneStore(ONE_STORE_SAMPLE_PACKAGE_NAME) title = context.getString(R.string.one_store) - icon = coreR.drawable.appupdater_ic_one_store + icon = storeR.drawable.appupdater_ic_one_store url = WEBSITE_URL }, ) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 562b76c0..8f4d245e 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -5,7 +5,7 @@ style="@style/Theme.AppCompat.DayNight" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context="com.pouyaheydari.androidappupdater.ui.android.MainActivity"> + tools:context="com.pouyaheydari.appupdater.demo.ui.android.MainActivity">