From a7083d4faf3b24e45041460d22b25f446c3ee40f Mon Sep 17 00:00:00 2001 From: Yogesh Choudhary Paliyal Date: Sun, 23 Apr 2023 15:06:11 +0530 Subject: [PATCH] Redux improvements (#463) * Redux improvements * redux improvements * Drop files from .gitignore * removed unused files --- .app/Src/ana/Res/değerler-tr/strings.xml | 83 -------- .gitignore | 2 + .idea/.gitignore | 3 - .idea/codeStyles/Project.xml | 124 ------------ .idea/codeStyles/codeStyleConfig.xml | 5 - .idea/compiler.xml | 6 - .idea/gradle.xml | 21 -- .idea/jarRepositories.xml | 40 ---- .idea/misc.xml | 43 ---- .idea/vcs.xml | 6 - app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 4 - .../keypass/ui/detail/DetailActivity.kt | 98 +++------- .../keypass/ui/detail/DetailViewModel.kt | 11 +- .../keypass/ui/home/HomeFragment.kt | 8 +- .../ui/nav/DashboardComposeActivity.kt | 133 +++++++------ .../keypass/ui/nav/NavigationModel.kt | 13 +- .../yogeshpaliyal/keypass/ui/redux/Action.kt | 19 +- .../keypass/ui/redux/KeyPassRedux.kt | 77 ++++---- .../yogeshpaliyal/keypass/ui/redux/Routes.kt | 19 +- .../yogeshpaliyal/keypass/ui/redux/State.kt | 19 +- .../color_navigation_drawer_menu_item.xml | 5 - app/src/main/res/drawable/asl_add_save.xml | 37 ---- app/src/main/res/drawable/avd_add_to_save.xml | 126 ------------ app/src/main/res/drawable/avd_save_to_add.xml | 127 ------------ .../res/drawable/ic_baseline_settings_24.xml | 10 - app/src/main/res/drawable/ic_round_add_24.xml | 10 - .../main/res/drawable/ic_round_menu_24.xml | 10 - .../drawable/ic_twotone_content_copy_24.xml | 15 -- .../main/res/drawable/ic_twotone_folder.xml | 14 -- app/src/main/res/drawable/nav_divider_top.xml | 6 - app/src/main/res/menu/bottom_app_bar.xml | 5 - .../res/menu/bottom_app_bar_settings_menu.xml | 8 - app/src/main/res/values/dimens.xml | 3 - app/src/main/res/values/elevation.xml | 2 - app/src/main/res/values/font_certs.xml | 17 +- app/src/main/res/values/layout.xml | 2 - app/src/main/res/values/motion.xml | 2 - gradlew.bat | 184 +++++++++--------- 39 files changed, 270 insertions(+), 1048 deletions(-) delete mode 100644 .app/Src/ana/Res/değerler-tr/strings.xml delete mode 100644 .idea/.gitignore delete mode 100644 .idea/codeStyles/Project.xml delete mode 100644 .idea/codeStyles/codeStyleConfig.xml delete mode 100644 .idea/compiler.xml delete mode 100644 .idea/gradle.xml delete mode 100644 .idea/jarRepositories.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/vcs.xml delete mode 100644 app/src/main/res/color/color_navigation_drawer_menu_item.xml delete mode 100644 app/src/main/res/drawable/asl_add_save.xml delete mode 100644 app/src/main/res/drawable/avd_add_to_save.xml delete mode 100644 app/src/main/res/drawable/avd_save_to_add.xml delete mode 100644 app/src/main/res/drawable/ic_baseline_settings_24.xml delete mode 100644 app/src/main/res/drawable/ic_round_add_24.xml delete mode 100644 app/src/main/res/drawable/ic_round_menu_24.xml delete mode 100644 app/src/main/res/drawable/ic_twotone_content_copy_24.xml delete mode 100644 app/src/main/res/drawable/ic_twotone_folder.xml delete mode 100644 app/src/main/res/drawable/nav_divider_top.xml delete mode 100644 app/src/main/res/menu/bottom_app_bar.xml delete mode 100644 app/src/main/res/menu/bottom_app_bar_settings_menu.xml diff --git a/.app/Src/ana/Res/değerler-tr/strings.xml b/.app/Src/ana/Res/değerler-tr/strings.xml deleted file mode 100644 index f52b0a23..00000000 --- a/.app/Src/ana/Res/değerler-tr/strings.xml +++ /dev/null @@ -1,83 +0,0 @@ - - - - Şifre oluştur - Ev - Sil - - - Şifre oluştur - - Yedekleme Geri Yüklendi - Geçersiz Anahtar - - Yedekleme tamamlandı - - - Kimlik Yedeklemeleri - Kimlik Bilgilerini harici depolama birimine yedekleyin - Kimlik Bilgilerini Geri Yükle - Yedeklemenizi geri yükleyin - Geribildirim yolla - Teknik sorunları bildirin veya yeni özellikler önerin - Paylaş - Uygulamayı başkalarıyla paylaşın - Şifre uzunluğu - Şifre - BÜYÜK HARFLER - küçük harfler - Semboller - Sayılar - Panoya kopyalandı - KeyPass\'e girmek için oturum açın - Kimlik doğrulama başarısız oldu - - Son yedekleme : %s - Yakında gelecek - Emin misin? - Bu girişi gerçekten silmek istiyor musunuz, geri yüklenemez - İptal et - KeyPass\'a geri bildirim - KeyPass\'i Paylaş - Hesap eklenmedi, lütfen aşağıdaki düğmeden ekleyin - Yedeklemeleri Kapat - Yedek parolayı doğrulayın - Yedek parolanızı test edin ve eşleştiğini doğrulayın - Yedekleme Klasörü - Yedekle - Yedeklemeleri Aç - Yedeklemeler bir parola ile şifrelenir ve cihazınızda depolanır - Evet - Yedek Oluştur - Uyarı - Bu Anahtar Sözcüğü Kopyala bu, bu yedeği kurtarmak için kullanılacaktır, bu KeyPass tarafından tekrar sağlanmayacaktır, kopyaladınız mı veya yazdınız mı? - Yardım - Güvenlik - Ara - Hesap adı - Kullanıcı adı/E-posta/Telefon - Etiketler virgülle ayrılmış (isteğe bağlı) - Web sitesi url\'si (isteğe bağlı) - Notlar (isteğe bağlı) - Otomatik yedekleme - Devre dışı - Etkinleştirilmiş - Otomatik Yedekleme Dosyasını Geçersiz Kılma - Tarayıcı - Lütfen gizli anahtarı girin - Lütfen hesap adını girin - TOTP ekle - Tarama Parolası - Kaydetmek - Özel Anahtar Kelime - Anahtar Sözcük Oluştur - Lütfen anahtar sözcük girin - Lütfen geçerli bir anahtar sözcük girin - Anahtar Sözcüğü Ayarla - Lütfen yedekleme dosyanız için bir anahtar kelime oluşturun, bu, yedekleme dosyasını geri yüklemek için kullanılacaktır. anahtar sözcük 16 karakterden oluşmalıdır - Anahtar Sözcük Girin - Eski haline getir - Lütfen yedeklediğinizde aldığınız anahtar kelimeyi girin - Yedeklemeler için kendi anahtar kelimenizi mi oluşturmak istiyorsunuz yoksa yeni bir anahtar mı oluşturmak istiyorsunuz? - - diff --git a/.gitignore b/.gitignore index a3b613ff..7da344ff 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ *.iml .gradle +.app +.idea/ /local.properties /.idea /.idea/libraries diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 26d33521..00000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml deleted file mode 100644 index a88fc36d..00000000 --- a/.idea/codeStyles/Project.xml +++ /dev/null @@ -1,124 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml deleted file mode 100644 index 79ee123c..00000000 --- a/.idea/codeStyles/codeStyleConfig.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index b589d56e..00000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml deleted file mode 100644 index b08d648d..00000000 --- a/.idea/gradle.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml deleted file mode 100644 index 5aab48e5..00000000 --- a/.idea/jarRepositories.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 9a9a72ac..00000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7f..00000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 55d1b386..920c2254 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -153,6 +153,7 @@ dependencies { implementation("androidx.hilt:hilt-work:1.0.0") // When using Kotlin. kapt("androidx.hilt:hilt-compiler:1.0.0") + implementation("androidx.hilt:hilt-navigation-compose:1.0.0") // zxing library diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ec639344..334553dd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -52,10 +52,6 @@ android:name=".ui.nav.DashboardComposeActivity" android:exported="false" android:windowSoftInputMode="adjustPan" /> - () - - private val accountId by lazy { - intent?.extras?.getLong(ARG_ACCOUNT_ID) ?: -1 - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContent { - Detail(accountId, mViewModel) - } - - mViewModel.loadAccount(accountId) - } -} - -@Preview() @Composable -fun Detail( +fun AccountDetailPage( id: Long?, - viewModel: DetailViewModel = androidx.lifecycle.viewmodel.compose.viewModel() + viewModel: DetailViewModel = hiltViewModel() ) { + val dispatchAction = rememberDispatcher() + // task value state val (accountModel, setAccountModel) = remember { mutableStateOf( @@ -108,15 +71,14 @@ fun Detail( } // Set initial object - LaunchedEffect(key1 = viewModel.accountModel) { - viewModel.accountModel.value?.apply { - setAccountModel(this.copy()) + LaunchedEffect(key1 = id) { + viewModel.loadAccount(id) { + setAccountModel(it.copy()) } } - val activity = (LocalContext.current as? Activity) val goBack: () -> Unit = { - activity?.onBackPressed() + dispatchAction(GoBackAction) } val launcher = rememberLauncherForActivityResult(QRScanner()) { @@ -125,29 +87,27 @@ fun Detail( } } - KeyPassTheme { - Scaffold( - bottomBar = { - BottomBar( - accountModel, - backPressed = goBack, - onDeleteAccount = { - viewModel.deleteAccount(accountModel, goBack) - } - ) { - viewModel.insertOrUpdate(accountModel, goBack) + Scaffold( + bottomBar = { + BottomBar( + accountModel, + backPressed = goBack, + onDeleteAccount = { + viewModel.deleteAccount(accountModel, goBack) } + ) { + viewModel.insertOrUpdate(accountModel, goBack) } - ) { paddingValues -> - Surface(modifier = Modifier.padding(paddingValues)) { - Fields( - accountModel = accountModel, - updateAccountModel = { newAccountModel -> - setAccountModel(newAccountModel) - } - ) { - launcher.launch(null) + } + ) { paddingValues -> + Surface(modifier = Modifier.padding(paddingValues)) { + Fields( + accountModel = accountModel, + updateAccountModel = { newAccountModel -> + setAccountModel(newAccountModel) } + ) { + launcher.launch(null) } } } diff --git a/app/src/main/java/com/yogeshpaliyal/keypass/ui/detail/DetailViewModel.kt b/app/src/main/java/com/yogeshpaliyal/keypass/ui/detail/DetailViewModel.kt index 675d7276..0860459b 100644 --- a/app/src/main/java/com/yogeshpaliyal/keypass/ui/detail/DetailViewModel.kt +++ b/app/src/main/java/com/yogeshpaliyal/keypass/ui/detail/DetailViewModel.kt @@ -6,7 +6,6 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import com.yogeshpaliyal.common.data.AccountModel -import com.yogeshpaliyal.common.worker.executeAutoBackup import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -21,18 +20,16 @@ import javax.inject.Inject */ @HiltViewModel class DetailViewModel @Inject constructor( - val app: Application, + app: Application, val appDb: com.yogeshpaliyal.common.AppDatabase ) : AndroidViewModel(app) { private val _accountModel by lazy { MutableLiveData() } val accountModel: LiveData = _accountModel - fun loadAccount(accountId: Long?) { + fun loadAccount(accountId: Long?, getAccount: (AccountModel) -> Unit) { viewModelScope.launch(Dispatchers.IO) { - _accountModel.postValue( - appDb.getDao().getAccount(accountId) ?: AccountModel() - ) + getAccount(appDb.getDao().getAccount(accountId) ?: AccountModel()) } } @@ -62,7 +59,7 @@ class DetailViewModel @Inject constructor( private fun autoBackup() { viewModelScope.launch { - app.executeAutoBackup() + // application.executeAutoBackup() } } } diff --git a/app/src/main/java/com/yogeshpaliyal/keypass/ui/home/HomeFragment.kt b/app/src/main/java/com/yogeshpaliyal/keypass/ui/home/HomeFragment.kt index 424566cf..c300e986 100644 --- a/app/src/main/java/com/yogeshpaliyal/keypass/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/yogeshpaliyal/keypass/ui/home/HomeFragment.kt @@ -45,8 +45,10 @@ import androidx.lifecycle.viewmodel.compose.viewModel import com.yogeshpaliyal.common.constants.AccountType import com.yogeshpaliyal.common.data.AccountModel import com.yogeshpaliyal.keypass.R +import com.yogeshpaliyal.keypass.ui.redux.AccountDetailState import com.yogeshpaliyal.keypass.ui.redux.CopyToClipboard -import com.yogeshpaliyal.keypass.ui.redux.ScreeNavigationAction +import com.yogeshpaliyal.keypass.ui.redux.IntentNavigation +import com.yogeshpaliyal.keypass.ui.redux.NavigationAction import com.yogeshpaliyal.keypass.ui.style.KeyPassTheme import kotlinx.coroutines.delay import org.reduxkotlin.compose.rememberDispatcher @@ -112,9 +114,9 @@ fun AccountsList(accounts: List? = null) { account, onClick = { if (it.type == AccountType.TOTP) { - dispatch(ScreeNavigationAction.AddTOTP(it.uniqueId)) + dispatch(IntentNavigation.AddTOTP(it.uniqueId)) } else { - dispatch(ScreeNavigationAction.AddAccount(it.id)) + dispatch(NavigationAction(AccountDetailState(it.id))) } } ) diff --git a/app/src/main/java/com/yogeshpaliyal/keypass/ui/nav/DashboardComposeActivity.kt b/app/src/main/java/com/yogeshpaliyal/keypass/ui/nav/DashboardComposeActivity.kt index 8f38677d..1d44dbc3 100644 --- a/app/src/main/java/com/yogeshpaliyal/keypass/ui/nav/DashboardComposeActivity.kt +++ b/app/src/main/java/com/yogeshpaliyal/keypass/ui/nav/DashboardComposeActivity.kt @@ -2,8 +2,8 @@ package com.yogeshpaliyal.keypass.ui.nav import android.os.Bundle import android.view.WindowManager +import androidx.activity.compose.BackHandler import androidx.activity.compose.setContent -import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource @@ -46,24 +46,21 @@ import androidx.compose.ui.unit.TextUnit import androidx.compose.ui.unit.TextUnitType import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidViewBinding -import androidx.navigation.NavController -import androidx.navigation.NavType -import androidx.navigation.compose.NavHost -import androidx.navigation.compose.composable -import androidx.navigation.compose.rememberNavController -import androidx.navigation.navArgument import com.yogeshpaliyal.keypass.databinding.LayoutMySettingsFragmentBinding -import com.yogeshpaliyal.keypass.ui.detail.DetailActivity -import com.yogeshpaliyal.keypass.ui.home.DashboardViewModel +import com.yogeshpaliyal.keypass.ui.detail.AccountDetailPage import com.yogeshpaliyal.keypass.ui.home.Homepage -import com.yogeshpaliyal.keypass.ui.redux.Action +import com.yogeshpaliyal.keypass.ui.redux.AccountDetailState import com.yogeshpaliyal.keypass.ui.redux.BottomSheetAction +import com.yogeshpaliyal.keypass.ui.redux.BottomSheetState +import com.yogeshpaliyal.keypass.ui.redux.GoBackAction +import com.yogeshpaliyal.keypass.ui.redux.HomeState import com.yogeshpaliyal.keypass.ui.redux.KeyPassRedux import com.yogeshpaliyal.keypass.ui.redux.KeyPassState -import com.yogeshpaliyal.keypass.ui.redux.ScreeNavigationAction -import com.yogeshpaliyal.keypass.ui.redux.ScreenRoutes +import com.yogeshpaliyal.keypass.ui.redux.NavigationAction +import com.yogeshpaliyal.keypass.ui.redux.ScreenState +import com.yogeshpaliyal.keypass.ui.redux.SettingsState +import com.yogeshpaliyal.keypass.ui.redux.TotpDetailState import com.yogeshpaliyal.keypass.ui.redux.UpdateContextAction -import com.yogeshpaliyal.keypass.ui.redux.UpdateNavControllerAction import com.yogeshpaliyal.keypass.ui.style.KeyPassTheme import dagger.hilt.android.AndroidEntryPoint import org.reduxkotlin.compose.StoreProvider @@ -74,8 +71,6 @@ import java.util.Locale @AndroidEntryPoint class DashboardComposeActivity : AppCompatActivity() { - private val mViewModel by viewModels() - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) window.setFlags( @@ -84,8 +79,8 @@ class DashboardComposeActivity : AppCompatActivity() { ) setContent { KeyPassTheme { - StoreProvider(store = KeyPassRedux.store) { - Dashboard(viewModel = mViewModel) + StoreProvider(store = KeyPassRedux.createStore()) { + Dashboard() } } } @@ -93,59 +88,59 @@ class DashboardComposeActivity : AppCompatActivity() { } @Composable -fun Dashboard(viewModel: DashboardViewModel = androidx.lifecycle.viewmodel.compose.viewModel()) { - val appState by selectState { this } +fun Dashboard() { + val systemBackPress by selectState { this.systemBackPress } - val navController = rememberNavController() val context = LocalContext.current val dispatch = rememberDispatcher() - DisposableEffect(KeyPassRedux, navController, context) { + BackHandler(!systemBackPress) { + dispatch(GoBackAction) + } + + if (systemBackPress) { + (context as? AppCompatActivity)?.onBackPressed() + } + + DisposableEffect(KeyPassRedux, context) { dispatch(UpdateContextAction(context)) - dispatch(UpdateNavControllerAction(navController)) onDispose { dispatch(UpdateContextAction(null)) - dispatch(UpdateNavControllerAction(null)) } } Scaffold(bottomBar = { - KeyPassBottomBar(navController) { - dispatch(it) - } + KeyPassBottomBar() }) { paddingValues -> Surface(modifier = Modifier.padding(paddingValues)) { - NavHost( - navController = navController, - startDestination = ScreenRoutes.HOME - ) { - composable( - ScreenRoutes.HOME, - arguments = listOf( - navArgument("tag") { - type = NavType.StringType - nullable = true - defaultValue = "" - } - ) - ) { backStackEntry -> - val type = backStackEntry.arguments?.getString("tag") - Homepage(viewModel, type) - } - composable(ScreenRoutes.SETTINGS) { - MySettings() - } - } + CurrentPage() - if (appState.bottomSheet.isBottomSheetOpen) { - OptionBottomBar({ - dispatch(it) - if (it !is BottomSheetAction) { - dispatch(BottomSheetAction.HomeNavigationMenu(false)) - } - }) - } + OptionBottomBar() + } + } +} + +@Composable +fun CurrentPage() { + val currentScreen by selectState { this.currentScreen } + + val dispatch = rememberDispatcher() + + when (currentScreen) { + is HomeState -> { + Homepage(selectedTag = (currentScreen as HomeState).type) + } + + is SettingsState -> { + MySettings() + } + + is AccountDetailState -> { + AccountDetailPage(id = (currentScreen as AccountDetailState).accountId) + } + + is TotpDetailState -> { } } } @@ -158,9 +153,16 @@ fun MySettings() { @Composable fun OptionBottomBar( - dispatchAction: (Action) -> Unit, viewModel: BottomNavViewModel = androidx.lifecycle.viewmodel.compose.viewModel() ) { + val bottomSheetState by selectState { this.bottomSheet } + + if (!bottomSheetState.isBottomSheetOpen) { + return + } + + val dispatchAction = rememberDispatcher() + val navigationItems by viewModel.navigationList.observeAsState() ModalBottomSheet(onDismissRequest = { dispatchAction(BottomSheetAction.HomeNavigationMenu(false)) @@ -179,13 +181,15 @@ fun OptionBottomBar( is NavigationModelItem.NavTagItem -> { NavMenuFolder(folder = it) { - dispatchAction(ScreeNavigationAction.Home(it.tag)) + dispatchAction(NavigationAction(HomeState(it.tag))) + dispatchAction(BottomSheetAction.HomeNavigationMenu(false)) } } is NavigationModelItem.NavMenuItem -> { NavItem(it) { dispatchAction(it.action) + dispatchAction(BottomSheetAction.HomeNavigationMenu(false)) } } } @@ -251,12 +255,19 @@ fun NavItemSection(divider: NavigationModelItem.NavDivider) { } @Composable -fun KeyPassBottomBar(navController: NavController, onActionItemClick: (Action) -> Unit) { +fun KeyPassBottomBar() { + val showMainBottomAppBar by selectState { this.currentScreen.showMainBottomAppBar } + val dispatchAction = rememberDispatcher() + + if (!showMainBottomAppBar) { + return + } + val context = LocalContext.current BottomAppBar(actions = { IconButton(onClick = { - onActionItemClick(BottomSheetAction.HomeNavigationMenu(true)) + dispatchAction(BottomSheetAction.HomeNavigationMenu(true)) }) { Icon( painter = rememberVectorPainter(image = Icons.Rounded.Menu), @@ -266,7 +277,7 @@ fun KeyPassBottomBar(navController: NavController, onActionItemClick: (Action) - } IconButton(onClick = { - onActionItemClick(ScreeNavigationAction.Settings()) + dispatchAction(NavigationAction(SettingsState)) }) { Icon( painter = rememberVectorPainter(image = Icons.Rounded.Settings), @@ -276,7 +287,7 @@ fun KeyPassBottomBar(navController: NavController, onActionItemClick: (Action) - } }, floatingActionButton = { FloatingActionButton(onClick = { - DetailActivity.start(context) + dispatchAction(NavigationAction(AccountDetailState())) }) { Icon( painter = rememberVectorPainter(image = Icons.Rounded.Add), diff --git a/app/src/main/java/com/yogeshpaliyal/keypass/ui/nav/NavigationModel.kt b/app/src/main/java/com/yogeshpaliyal/keypass/ui/nav/NavigationModel.kt index 38c4319c..e915aee0 100644 --- a/app/src/main/java/com/yogeshpaliyal/keypass/ui/nav/NavigationModel.kt +++ b/app/src/main/java/com/yogeshpaliyal/keypass/ui/nav/NavigationModel.kt @@ -1,11 +1,10 @@ package com.yogeshpaliyal.keypass.ui.nav import com.yogeshpaliyal.keypass.R -import com.yogeshpaliyal.keypass.ui.redux.ScreeNavigationAction +import com.yogeshpaliyal.keypass.ui.redux.HomeState +import com.yogeshpaliyal.keypass.ui.redux.IntentNavigation +import com.yogeshpaliyal.keypass.ui.redux.NavigationAction -/** - * A class which maintains and generates a navigation list to be displayed by [NavigationAdapter]. - */ object NavigationModel { const val HOME = 0 @@ -18,21 +17,21 @@ object NavigationModel { icon = R.drawable.ic_twotone_home_24, titleRes = R.string.home, checked = false, - action = ScreeNavigationAction.Home() + action = NavigationAction(HomeState()) ), NavigationModelItem.NavMenuItem( id = GENERATE_PASSWORD, icon = R.drawable.ic_twotone_vpn_key_24, titleRes = R.string.generate_password, checked = false, - action = ScreeNavigationAction.GeneratePassword + action = IntentNavigation.GeneratePassword ), NavigationModelItem.NavMenuItem( id = ADD_TOPT, icon = R.drawable.ic_twotone_totp, titleRes = R.string.add_totp, checked = false, - action = ScreeNavigationAction.AddTOTP() + action = IntentNavigation.AddTOTP() ) ) } diff --git a/app/src/main/java/com/yogeshpaliyal/keypass/ui/redux/Action.kt b/app/src/main/java/com/yogeshpaliyal/keypass/ui/redux/Action.kt index af5525f6..73c681d6 100644 --- a/app/src/main/java/com/yogeshpaliyal/keypass/ui/redux/Action.kt +++ b/app/src/main/java/com/yogeshpaliyal/keypass/ui/redux/Action.kt @@ -3,26 +3,19 @@ package com.yogeshpaliyal.keypass.ui.redux import android.content.Context import android.os.Bundle import androidx.annotation.StringRes -import androidx.navigation.NavController sealed interface Action class UpdateContextAction(val context: Context?) : Action -class UpdateNavControllerAction(val navController: NavController?) : Action -sealed class ScreeNavigationAction(val route: String, val globalArgs: Bundle? = null) : Action { - data class Home(val tag: String? = null) : ScreeNavigationAction(ScreenRoutes.HOME.replace("{tag}", tag ?: "")) - data class Settings(val args: Bundle? = null) : - ScreeNavigationAction(ScreenRoutes.SETTINGS, args) +object GoBackAction : Action - data class AddAccount(val accountId: Long? = null) : - ScreeNavigationAction(ScreenRoutes.ADD_ACCOUNT) +data class NavigationAction(val state: ScreenState) : Action +data class StateUpdateAction(val state: ScreenState) : Action - data class AddTOTP(val accountId: String? = null) : - ScreeNavigationAction(ScreenRoutes.ADD_TOTP) - - object GeneratePassword : - ScreeNavigationAction(ScreenRoutes.GENERATE_PASSWORD) +sealed interface IntentNavigation : Action { + object GeneratePassword : IntentNavigation + data class AddTOTP(val accountId: String? = null) : IntentNavigation } data class ToastAction(@StringRes val text: Int) : Action diff --git a/app/src/main/java/com/yogeshpaliyal/keypass/ui/redux/KeyPassRedux.kt b/app/src/main/java/com/yogeshpaliyal/keypass/ui/redux/KeyPassRedux.kt index d730d7dd..71e0e330 100644 --- a/app/src/main/java/com/yogeshpaliyal/keypass/ui/redux/KeyPassRedux.kt +++ b/app/src/main/java/com/yogeshpaliyal/keypass/ui/redux/KeyPassRedux.kt @@ -5,11 +5,8 @@ import android.content.ClipboardManager import android.content.Intent import android.widget.Toast import androidx.core.content.ContextCompat -import androidx.navigation.NavController -import androidx.navigation.NavOptionsBuilder import com.yogeshpaliyal.keypass.R import com.yogeshpaliyal.keypass.ui.addTOTP.AddTOTPActivity -import com.yogeshpaliyal.keypass.ui.detail.DetailActivity import com.yogeshpaliyal.keypass.ui.generate.GeneratePasswordActivity import org.reduxkotlin.Reducer import org.reduxkotlin.applyMiddleware @@ -18,23 +15,39 @@ import org.reduxkotlin.middleware object KeyPassRedux { - private fun NavController.navigateIfNotInSameRoute( - route: String, - builder: (NavOptionsBuilder.() -> Unit)? = null - ) { - if (this.currentDestination?.route != route) { - if (builder != null) { - this.navigate(route, builder) - } else { - this.navigate(route) - } - } + private val arrPages by lazy { + mutableListOf() } private val reducer: Reducer = { state, action -> when (action) { - is ScreeNavigationAction -> { - state.copy(currentScreen = ScreenState(action.route, action.globalArgs)) + is NavigationAction -> { + // TODO handle backstack + arrPages.add(state.currentScreen) + state.copy(currentScreen = action.state) + } + + is StateUpdateAction -> { + state.copy(currentScreen = action.state) + } + + is CopyToClipboard -> { + state.context?.let { + val clipboard = ContextCompat.getSystemService( + it, + ClipboardManager::class.java + ) + val clip = ClipData.newPlainText("KeyPass", action.password) + clipboard?.setPrimaryClip(clip) + + Toast.makeText( + it, + R.string.copied_to_clipboard, + Toast.LENGTH_SHORT + ) + .show() + } + state } is CopyToClipboard -> { @@ -60,8 +73,13 @@ object KeyPassRedux { state.copy(context = action.context) } - is UpdateNavControllerAction -> { - state.copy(navController = action.navController) + is GoBackAction -> { + val lastItem = arrPages.removeLastOrNull() + if (lastItem != null) { + state.copy(currentScreen = lastItem) + } else { + state.copy(systemBackPress = true) + } } is BottomSheetAction -> { @@ -78,35 +96,22 @@ object KeyPassRedux { } } - val navigationMiddleware = middleware { store, next, action -> + private val intentNavigationMiddleware = middleware { store, next, action -> val state = store.state when (action) { - is ScreeNavigationAction.GeneratePassword -> { + is IntentNavigation.GeneratePassword -> { val intent = Intent(state.context, GeneratePasswordActivity::class.java) state.context?.startActivity(intent) } - is ScreeNavigationAction.AddTOTP -> { + is IntentNavigation.AddTOTP -> { AddTOTPActivity.start(state.context, action.accountId) } - - is ScreeNavigationAction.AddAccount -> { - DetailActivity.start(state.context, action.accountId) - } - - is ScreeNavigationAction.Home -> { - state.navController?.navigateIfNotInSameRoute(action.route) { - launchSingleTop = true - } - } - - is ScreeNavigationAction.Settings -> { - state.navController?.navigateIfNotInSameRoute(action.route) - } } next(action) } - val store = createStore(reducer, generateDefaultState(), applyMiddleware(navigationMiddleware)) + fun createStore() = + createStore(reducer, generateDefaultState(), applyMiddleware(intentNavigationMiddleware)) } diff --git a/app/src/main/java/com/yogeshpaliyal/keypass/ui/redux/Routes.kt b/app/src/main/java/com/yogeshpaliyal/keypass/ui/redux/Routes.kt index d2485758..e0a2460a 100644 --- a/app/src/main/java/com/yogeshpaliyal/keypass/ui/redux/Routes.kt +++ b/app/src/main/java/com/yogeshpaliyal/keypass/ui/redux/Routes.kt @@ -1,30 +1,13 @@ package com.yogeshpaliyal.keypass.ui.redux -import androidx.navigation.NamedNavArgument -import androidx.navigation.NavType -import androidx.navigation.navArgument - object ScreenRoutes { const val HOME = "home?tag={tag}" const val SETTINGS = "/settings" - const val ADD_ACCOUNT = "/addAccount" + const val ADD_ACCOUNT = "addAccount?accountId={accountId}" const val GENERATE_PASSWORD = "/generatePassword" const val ADD_TOTP = "/addTOTP" } -object Home { - fun getArguments(): List { - return listOf( - navArgument("tag") { - type = NavType.StringType - }, - navArgument("query") { - type = NavType.StringType - } - ) - } -} - object BottomSheetRoutes { const val HOME_NAV_MENU = "/home/navMenu" } diff --git a/app/src/main/java/com/yogeshpaliyal/keypass/ui/redux/State.kt b/app/src/main/java/com/yogeshpaliyal/keypass/ui/redux/State.kt index d88dc728..23618b1f 100644 --- a/app/src/main/java/com/yogeshpaliyal/keypass/ui/redux/State.kt +++ b/app/src/main/java/com/yogeshpaliyal/keypass/ui/redux/State.kt @@ -2,19 +2,20 @@ package com.yogeshpaliyal.keypass.ui.redux import android.content.Context import android.os.Bundle -import androidx.navigation.NavController data class KeyPassState( val context: Context? = null, - val navController: NavController? = null, val currentScreen: ScreenState, - val bottomSheet: BottomSheetState + val bottomSheet: BottomSheetState, + val systemBackPress: Boolean = false ) -data class ScreenState( - val path: String, - val args: Bundle? = null -) +sealed class ScreenState(val showMainBottomAppBar: Boolean = false) + +data class HomeState(val type: String? = null) : ScreenState(true) +data class AccountDetailState(val accountId: Long? = null) : ScreenState() +data class TotpDetailState(val accountId: String? = null) : ScreenState() +object SettingsState : ScreenState(true) data class BottomSheetState( val path: String, @@ -23,7 +24,7 @@ data class BottomSheetState( ) fun generateDefaultState(): KeyPassState { - val screenState = ScreenState(ScreenRoutes.HOME) + val currentPage = HomeState() val bottomSheet = BottomSheetState(BottomSheetRoutes.HOME_NAV_MENU, isBottomSheetOpen = false) - return KeyPassState(currentScreen = screenState, bottomSheet = bottomSheet) + return KeyPassState(currentScreen = currentPage, bottomSheet = bottomSheet) } diff --git a/app/src/main/res/color/color_navigation_drawer_menu_item.xml b/app/src/main/res/color/color_navigation_drawer_menu_item.xml deleted file mode 100644 index c714257d..00000000 --- a/app/src/main/res/color/color_navigation_drawer_menu_item.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/asl_add_save.xml b/app/src/main/res/drawable/asl_add_save.xml deleted file mode 100644 index 7fa37cb0..00000000 --- a/app/src/main/res/drawable/asl_add_save.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/avd_add_to_save.xml b/app/src/main/res/drawable/avd_add_to_save.xml deleted file mode 100644 index 7a51b491..00000000 --- a/app/src/main/res/drawable/avd_add_to_save.xml +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/avd_save_to_add.xml b/app/src/main/res/drawable/avd_save_to_add.xml deleted file mode 100644 index 56320f6c..00000000 --- a/app/src/main/res/drawable/avd_save_to_add.xml +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_baseline_settings_24.xml b/app/src/main/res/drawable/ic_baseline_settings_24.xml deleted file mode 100644 index 41a82ede..00000000 --- a/app/src/main/res/drawable/ic_baseline_settings_24.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_round_add_24.xml b/app/src/main/res/drawable/ic_round_add_24.xml deleted file mode 100644 index 24877ee9..00000000 --- a/app/src/main/res/drawable/ic_round_add_24.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_round_menu_24.xml b/app/src/main/res/drawable/ic_round_menu_24.xml deleted file mode 100644 index ff67e556..00000000 --- a/app/src/main/res/drawable/ic_round_menu_24.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_twotone_content_copy_24.xml b/app/src/main/res/drawable/ic_twotone_content_copy_24.xml deleted file mode 100644 index 86652df4..00000000 --- a/app/src/main/res/drawable/ic_twotone_content_copy_24.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/ic_twotone_folder.xml b/app/src/main/res/drawable/ic_twotone_folder.xml deleted file mode 100644 index b56127e2..00000000 --- a/app/src/main/res/drawable/ic_twotone_folder.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/nav_divider_top.xml b/app/src/main/res/drawable/nav_divider_top.xml deleted file mode 100644 index 2ece804c..00000000 --- a/app/src/main/res/drawable/nav_divider_top.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/app/src/main/res/menu/bottom_app_bar.xml b/app/src/main/res/menu/bottom_app_bar.xml deleted file mode 100644 index 5ae8e2f3..00000000 --- a/app/src/main/res/menu/bottom_app_bar.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_app_bar_settings_menu.xml b/app/src/main/res/menu/bottom_app_bar_settings_menu.xml deleted file mode 100644 index 3d4e4f9e..00000000 --- a/app/src/main/res/menu/bottom_app_bar_settings_menu.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 1b1859e6..26994459 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -16,11 +16,8 @@ 56dp - 32dp - 8dp - 56dp diff --git a/app/src/main/res/values/elevation.xml b/app/src/main/res/values/elevation.xml index 8dc7e990..3495a41e 100644 --- a/app/src/main/res/values/elevation.xml +++ b/app/src/main/res/values/elevation.xml @@ -14,6 +14,4 @@ --> - 0dp - 16dp \ No newline at end of file diff --git a/app/src/main/res/values/font_certs.xml b/app/src/main/res/values/font_certs.xml index d2226ac0..3ea04e70 100644 --- a/app/src/main/res/values/font_certs.xml +++ b/app/src/main/res/values/font_certs.xml @@ -1,17 +1,2 @@ - - - @array/com_google_android_gms_fonts_certs_dev - @array/com_google_android_gms_fonts_certs_prod - - - - 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 - - - + diff --git a/app/src/main/res/values/layout.xml b/app/src/main/res/values/layout.xml index 8eee8a55..3408fb69 100644 --- a/app/src/main/res/values/layout.xml +++ b/app/src/main/res/values/layout.xml @@ -18,8 +18,6 @@ - 2dp - 4dp 8dp diff --git a/app/src/main/res/values/motion.xml b/app/src/main/res/values/motion.xml index 29d608a1..37ef77a2 100644 --- a/app/src/main/res/values/motion.xml +++ b/app/src/main/res/values/motion.xml @@ -3,6 +3,4 @@ - 300 - \ No newline at end of file diff --git a/gradlew.bat b/gradlew.bat index 6689b85b..93e3f59f 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,92 +1,92 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega