From 2c4f22e4979c21c9f9693a8404bc1d34e4469d72 Mon Sep 17 00:00:00 2001 From: Galiev Bulat Date: Sat, 6 Apr 2024 21:57:38 +0300 Subject: [PATCH 1/2] created remember the last used folder option --- .../amrdeveloper/linkhub/data/DataPackage.kt | 3 ++ .../data/parser/JsonImportExportFileParser.kt | 3 +- .../linkhub/ui/folder/FolderFragment.kt | 11 +++++- .../ui/importexport/ImportExportFragment.kt | 7 ++++ .../ui/importexport/ImportExportViewModel.kt | 5 +++ .../linkhub/ui/link/LinkFragment.kt | 38 +++++++++++++++---- .../linkhub/ui/setting/SettingFragment.kt | 8 ++++ .../linkhub/util/UiPreferences.kt | 30 +++++++++++++++ app/src/main/res/layout/fragment_setting.xml | 19 ++++++++++ app/src/main/res/values/strings.xml | 1 + 10 files changed, 114 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/amrdeveloper/linkhub/data/DataPackage.kt b/app/src/main/java/com/amrdeveloper/linkhub/data/DataPackage.kt index eb90ab8..a413fa8 100644 --- a/app/src/main/java/com/amrdeveloper/linkhub/data/DataPackage.kt +++ b/app/src/main/java/com/amrdeveloper/linkhub/data/DataPackage.kt @@ -16,6 +16,9 @@ data class DataPackage ( @SerializedName("autoSaving") val enableAutoSaving : Boolean?, + @SerializedName("defaultFolderMode") + val defaultFolderMode : Boolean?, + @SerializedName("theme") val theme : Theme? ) \ No newline at end of file diff --git a/app/src/main/java/com/amrdeveloper/linkhub/data/parser/JsonImportExportFileParser.kt b/app/src/main/java/com/amrdeveloper/linkhub/data/parser/JsonImportExportFileParser.kt index 2fca7ce..a8e55a7 100644 --- a/app/src/main/java/com/amrdeveloper/linkhub/data/parser/JsonImportExportFileParser.kt +++ b/app/src/main/java/com/amrdeveloper/linkhub/data/parser/JsonImportExportFileParser.kt @@ -43,8 +43,9 @@ class JsonImportExportFileParser: ImportExportFileParser { val links = linksResult.getOrDefault(listOf()) val showClickCounter = uiPreferences.isClickCounterEnabled() val autoSaving = uiPreferences.isAutoSavingEnabled() + val defaultFolder = uiPreferences.isDefaultFolderEnabled() val lastTheme = uiPreferences.getThemeType() - val dataPackage = DataPackage(folders, links, showClickCounter, autoSaving, lastTheme) + val dataPackage = DataPackage(folders, links, showClickCounter, autoSaving, defaultFolder, lastTheme) return Result.success(Gson().toJson(dataPackage)) } else { return Result.failure(Throwable()); diff --git a/app/src/main/java/com/amrdeveloper/linkhub/ui/folder/FolderFragment.kt b/app/src/main/java/com/amrdeveloper/linkhub/ui/folder/FolderFragment.kt index 58105fc..22bbe1d 100644 --- a/app/src/main/java/com/amrdeveloper/linkhub/ui/folder/FolderFragment.kt +++ b/app/src/main/java/com/amrdeveloper/linkhub/ui/folder/FolderFragment.kt @@ -2,7 +2,12 @@ package com.amrdeveloper.linkhub.ui.folder import android.content.Context import android.os.Bundle -import android.view.* +import android.view.LayoutInflater +import android.view.Menu +import android.view.MenuInflater +import android.view.MenuItem +import android.view.View +import android.view.ViewGroup import androidx.activity.OnBackPressedCallback import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels @@ -16,7 +21,6 @@ import com.amrdeveloper.linkhub.util.UiPreferences import com.amrdeveloper.linkhub.util.showError import com.amrdeveloper.linkhub.util.showSnackBar import dagger.hilt.android.AndroidEntryPoint -import timber.log.Timber import javax.inject.Inject @AndroidEntryPoint @@ -143,6 +147,9 @@ class FolderFragment : Fragment() { } private fun deleteFolder() { + if(uiPreferences.isDefaultFolderEnabled() && + uiPreferences.getDefaultFolderId() == currentFolder.id) + uiPreferences.deleteDefaultFolder() folderViewModel.deleteFolder(currentFolder.id) } diff --git a/app/src/main/java/com/amrdeveloper/linkhub/ui/importexport/ImportExportFragment.kt b/app/src/main/java/com/amrdeveloper/linkhub/ui/importexport/ImportExportFragment.kt index c632e5e..9135f14 100644 --- a/app/src/main/java/com/amrdeveloper/linkhub/ui/importexport/ImportExportFragment.kt +++ b/app/src/main/java/com/amrdeveloper/linkhub/ui/importexport/ImportExportFragment.kt @@ -18,10 +18,12 @@ import androidx.fragment.app.viewModels import com.amrdeveloper.linkhub.R import com.amrdeveloper.linkhub.data.ImportExportFileType import com.amrdeveloper.linkhub.databinding.FragmentImportExportBinding +import com.amrdeveloper.linkhub.util.UiPreferences import com.amrdeveloper.linkhub.util.getFileName import com.amrdeveloper.linkhub.util.getFileText import com.amrdeveloper.linkhub.util.showSnackBar import dagger.hilt.android.AndroidEntryPoint +import javax.inject.Inject @AndroidEntryPoint class ImportExportFragment : Fragment() { @@ -32,6 +34,9 @@ class ImportExportFragment : Fragment() { private val importExportViewModel by viewModels() + @Inject + lateinit var uiPreferences: UiPreferences + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -49,6 +54,8 @@ class ImportExportFragment : Fragment() { launchFileTypePickerDialog(requireContext()) { fileType -> importExportFileType = fileType importDataFile(fileType) + if(uiPreferences.isDefaultFolderEnabled()) + uiPreferences.deleteDefaultFolder() } } diff --git a/app/src/main/java/com/amrdeveloper/linkhub/ui/importexport/ImportExportViewModel.kt b/app/src/main/java/com/amrdeveloper/linkhub/ui/importexport/ImportExportViewModel.kt index 823f528..da6578b 100644 --- a/app/src/main/java/com/amrdeveloper/linkhub/ui/importexport/ImportExportViewModel.kt +++ b/app/src/main/java/com/amrdeveloper/linkhub/ui/importexport/ImportExportViewModel.kt @@ -46,6 +46,11 @@ class ImportExportViewModel @Inject constructor ( uiPreferences.setEnableAutoSave( it.enableAutoSaving ?: lastAutoSavingEnabled ) + // Import use last folder mode + val defaultFolder = uiPreferences.isDefaultFolderEnabled() + uiPreferences.setEnableDefaultFolderEnabled( + it.defaultFolderMode ?: defaultFolder + ) // Import theme flag if it available val lastThemeOption = uiPreferences.getThemeType() uiPreferences.setThemeType(it.theme ?: lastThemeOption) diff --git a/app/src/main/java/com/amrdeveloper/linkhub/ui/link/LinkFragment.kt b/app/src/main/java/com/amrdeveloper/linkhub/ui/link/LinkFragment.kt index 02fa293..23c169f 100644 --- a/app/src/main/java/com/amrdeveloper/linkhub/ui/link/LinkFragment.kt +++ b/app/src/main/java/com/amrdeveloper/linkhub/ui/link/LinkFragment.kt @@ -2,7 +2,12 @@ package com.amrdeveloper.linkhub.ui.link import android.content.Context import android.os.Bundle -import android.view.* +import android.view.LayoutInflater +import android.view.Menu +import android.view.MenuInflater +import android.view.MenuItem +import android.view.View +import android.view.ViewGroup import android.webkit.URLUtil import androidx.activity.OnBackPressedCallback import androidx.fragment.app.Fragment @@ -22,7 +27,6 @@ import com.amrdeveloper.linkhub.util.UiPreferences import com.amrdeveloper.linkhub.util.showError import com.amrdeveloper.linkhub.util.showSnackBar import dagger.hilt.android.AndroidEntryPoint -import timber.log.Timber import java.text.DateFormat import javax.inject.Inject @@ -52,7 +56,7 @@ class LinkFragment : Fragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { _binding = FragmentLinkBinding.inflate(inflater, container, false) - + handleDefaultFolder() handleIntentSharedLink() handleLinkArgument() setupObservers() @@ -63,6 +67,15 @@ class LinkFragment : Fragment() { return binding.root } + private fun handleDefaultFolder(){ + if (uiPreferences.isDefaultFolderEnabled()){ + val defFolderId = uiPreferences.getDefaultFolderId() + if (defFolderId!=-1){ + linkViewModel.getFolderWithId(defFolderId) + } + } + } + private fun handleIntentSharedLink() { val sharedLink = arguments?.getString("shared_link") ?: return @@ -93,6 +106,13 @@ class LinkFragment : Fragment() { } } + private fun setActiveFolderToFolderList(folders: Iterable, id: Int){ + val folder = folders.find { it.id == currentLink.folderId } + folder?.let { + binding.folderNameMenu.setText(it.name, false) + } + } + private fun setupObservers() { linkViewModel.currentFolderLiveData.observe(viewLifecycleOwner) { binding.folderNameMenu.setText(it.name, false) @@ -117,11 +137,10 @@ class LinkFragment : Fragment() { findNavController().currentBackStackEntry?.savedStateHandle?.remove( CREATED_FOLDER_NAME_KEY ) - } else if (::currentLink.isInitialized) { - val folder = folders.find { it.id == currentLink.folderId } - folder?.let { - binding.folderNameMenu.setText(it.name, false) - } + } else if (::currentLink.isInitialized ) { + setActiveFolderToFolderList(folders, currentLink.folderId) + } else if (uiPreferences.isDefaultFolderEnabled() && uiPreferences.getDefaultFolderId()!=-1){ + setActiveFolderToFolderList(folders, uiPreferences.getDefaultFolderId()) } } @@ -150,6 +169,9 @@ class LinkFragment : Fragment() { FOLDER_NONE_ID } else -> { + if(uiPreferences.isDefaultFolderEnabled()) { + uiPreferences.setDefaultFolderId(folder.id) + } folder.id } } diff --git a/app/src/main/java/com/amrdeveloper/linkhub/ui/setting/SettingFragment.kt b/app/src/main/java/com/amrdeveloper/linkhub/ui/setting/SettingFragment.kt index 82abc01..2815878 100644 --- a/app/src/main/java/com/amrdeveloper/linkhub/ui/setting/SettingFragment.kt +++ b/app/src/main/java/com/amrdeveloper/linkhub/ui/setting/SettingFragment.kt @@ -55,6 +55,9 @@ class SettingFragment : Fragment() { // Setup Auto saving binding.autoSavingSwitch.isChecked = uiPreferences.isAutoSavingEnabled() + + // Setup Auto saving + binding.defaultFolderSwitch.isChecked = uiPreferences.isDefaultFolderEnabled() } override fun onPause() { @@ -119,6 +122,11 @@ class SettingFragment : Fragment() { uiPreferences.setEnableAutoSave(isChecked) } } + binding.defaultFolderSwitch.setOnCheckedChangeListener { _, isChecked -> + if (isViewPassedResumedState) { + uiPreferences.setEnableDefaultFolderEnabled(isChecked) + } + } } override fun onDestroyView() { diff --git a/app/src/main/java/com/amrdeveloper/linkhub/util/UiPreferences.kt b/app/src/main/java/com/amrdeveloper/linkhub/util/UiPreferences.kt index c9266db..4dfa323 100644 --- a/app/src/main/java/com/amrdeveloper/linkhub/util/UiPreferences.kt +++ b/app/src/main/java/com/amrdeveloper/linkhub/util/UiPreferences.kt @@ -7,6 +7,8 @@ private const val UI_PREFERENCE_NAME = "linkhub_settings" private const val UI_THEME_KEY = "theme" private const val UI_COUNTER_KEY = "counter" private const val UI_AUTO_SAVE_KEY = "auto_save" +private const val UI_DEFAULT_FOLDER_KEY = "default_folder_mode" +private const val DEFAULT_FOLDER_NAME = "default_folder_name" private const val PASSWORD_ENABLE_KEY = "password_enable" private const val PASSWORD_TEXT_KEY = "password_text" @@ -30,6 +32,24 @@ class UiPreferences(private val context: Context) { editor.apply() } + fun setEnableDefaultFolderEnabled(enable : Boolean) { + val editor = context.getSharedPreferences(UI_PREFERENCE_NAME, Context.MODE_PRIVATE).edit() + editor.putBoolean(UI_DEFAULT_FOLDER_KEY, enable) + editor.apply() + } + + fun setDefaultFolderId(folderId : Int) { + val editor = context.getSharedPreferences(UI_PREFERENCE_NAME, Context.MODE_PRIVATE).edit() + editor.putInt(DEFAULT_FOLDER_NAME, folderId) + editor.apply() + } + + fun deleteDefaultFolder() { + val editor = context.getSharedPreferences(UI_PREFERENCE_NAME, Context.MODE_PRIVATE).edit() + editor.putInt(DEFAULT_FOLDER_NAME, -1) + editor.apply() + } + fun getThemeType() : Theme { val preferences = context.getSharedPreferences(UI_PREFERENCE_NAME, Context.MODE_PRIVATE) val themeName = preferences.getString(UI_THEME_KEY, Theme.WHITE.name) @@ -58,6 +78,16 @@ class UiPreferences(private val context: Context) { return preferences.getBoolean(UI_AUTO_SAVE_KEY, true) } + fun isDefaultFolderEnabled() : Boolean { + val preferences = context.getSharedPreferences(UI_PREFERENCE_NAME, Context.MODE_PRIVATE) + return preferences.getBoolean(UI_DEFAULT_FOLDER_KEY, false) + } + + fun getDefaultFolderId() : Int { + val preferences = context.getSharedPreferences(UI_PREFERENCE_NAME, Context.MODE_PRIVATE) + return preferences.getInt(DEFAULT_FOLDER_NAME, -1) + } + fun isPasswordEnabled() : Boolean { val preferences = context.getSharedPreferences(UI_PREFERENCE_NAME, Context.MODE_PRIVATE) return preferences.getBoolean(PASSWORD_ENABLE_KEY, false) diff --git a/app/src/main/res/layout/fragment_setting.xml b/app/src/main/res/layout/fragment_setting.xml index ca9baee..b8058be 100644 --- a/app/src/main/res/layout/fragment_setting.xml +++ b/app/src/main/res/layout/fragment_setting.xml @@ -85,6 +85,25 @@ android:layout_height="0.2dp" android:background="@android:color/darker_gray" /> + + + + Choose a file type Password Enable password + Remember the last used folder as default one Add Link From c42142ad5d0a1b977b65dd6ea6312b25b6110dfb Mon Sep 17 00:00:00 2001 From: Galiev Bulat Date: Tue, 9 Apr 2024 13:53:25 +0300 Subject: [PATCH 2/2] fixed string resources for default folder option --- .../java/com/amrdeveloper/linkhub/ui/setting/SettingFragment.kt | 2 +- app/src/main/res/values-ar/strings.xml | 1 + app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-vn/strings.xml | 1 + app/src/main/res/values-zh-rCN/strings.xml | 1 + app/src/main/res/values/strings.xml | 2 +- 6 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/amrdeveloper/linkhub/ui/setting/SettingFragment.kt b/app/src/main/java/com/amrdeveloper/linkhub/ui/setting/SettingFragment.kt index 2815878..7a4b829 100644 --- a/app/src/main/java/com/amrdeveloper/linkhub/ui/setting/SettingFragment.kt +++ b/app/src/main/java/com/amrdeveloper/linkhub/ui/setting/SettingFragment.kt @@ -56,7 +56,7 @@ class SettingFragment : Fragment() { // Setup Auto saving binding.autoSavingSwitch.isChecked = uiPreferences.isAutoSavingEnabled() - // Setup Auto saving + // Setup default folder binding.defaultFolderSwitch.isChecked = uiPreferences.isDefaultFolderEnabled() } diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index c0a18de..776fb47 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -31,6 +31,7 @@ أستيراد أو تصدير الرقم السري تفعيل الرقم السري + تذكر المجلد الأخير إضافه رابط diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 4b269d1..e714284 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -31,6 +31,7 @@ Import und Export Passwort Passwort aktivieren + Merken Sie sich den letzten Ordner Link hinzufügen diff --git a/app/src/main/res/values-vn/strings.xml b/app/src/main/res/values-vn/strings.xml index fa8d73d..08a3c0d 100644 --- a/app/src/main/res/values-vn/strings.xml +++ b/app/src/main/res/values-vn/strings.xml @@ -30,6 +30,7 @@ Nhập và xuất Mật khẩu Bật mật khẩu + Nhớ thư mục cuối cùng Thêm liên kết diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 34b49d1..676a964 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -30,6 +30,7 @@ 导入和导出 密码 启用密码 + 记住最后一个文件夹 添加链接 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e61c5e0..1332492 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -31,7 +31,7 @@ Choose a file type Password Enable password - Remember the last used folder as default one + Remember the last folder Add Link