From 312c61e99e43ebecaeaafad13fc4c1de936923ba Mon Sep 17 00:00:00 2001 From: Gouri Panda Date: Tue, 26 Oct 2021 01:35:49 +0530 Subject: [PATCH 01/13] added api 30 to both coverage and instrumentation test --- .github/workflows/coverage.yml | 2 +- .github/workflows/nightly.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index f9e09cc3c..76262912c 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -15,7 +15,7 @@ jobs: coverageReport: strategy: matrix: - api-level: [21, 21] + api-level: [21, 21, 30] fail-fast: false runs-on: macOS-latest steps: diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 1bea36eb9..5b5d76bce 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -10,7 +10,7 @@ jobs: instrumentation_tests: strategy: matrix: - api-level: [21, 22, 23, 24, 25, 27, 28] + api-level: [21, 22, 23, 24, 25, 27, 28, 30] fail-fast: false runs-on: macOS-latest steps: From da593268a31b1608eba0c96458d44076189eb2fc Mon Sep 17 00:00:00 2001 From: Gouri Panda Date: Thu, 28 Oct 2021 17:10:58 +0530 Subject: [PATCH 02/13] added MANAGE_EXTERNAL_STORAGE permission --- app/detekt_baseline.xml | 2 +- .../library/LocalLibraryFragment.kt | 38 ++++++++++++++++++- core/src/main/AndroidManifest.xml | 2 + .../core/utils/SharedPreferenceUtil.kt | 8 ++++ .../core/utils/dialog/KiwixDialog.kt | 8 ++++ core/src/main/res/values/strings.xml | 2 + 6 files changed, 58 insertions(+), 2 deletions(-) diff --git a/app/detekt_baseline.xml b/app/detekt_baseline.xml index 40e2c3c8a..2c43a15d6 100644 --- a/app/detekt_baseline.xml +++ b/app/detekt_baseline.xml @@ -11,7 +11,7 @@ MagicNumber:ShareFiles.kt$ShareFiles$24 MagicNumber:ZimManageViewModel.kt$ZimManageViewModel$5 MagicNumber:ZimManageViewModel.kt$ZimManageViewModel$500 - MagicNumber:ZimHostFragment.kt$ZimHostFragment$4 + NestedBlockDepth:LocalLibraryFragment.kt$LocalLibraryFragment$checkPermissions NestedBlockDepth:PeerGroupHandshake.kt$PeerGroupHandshake$readHandshakeAndExchangeMetaData NestedBlockDepth:ReceiverHandShake.kt$ReceiverHandShake$exchangeFileTransferMetadata PackageNaming:AvailableSpaceCalculator.kt$package org.kiwix.kiwixmobile.zim_manager.library_view diff --git a/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/LocalLibraryFragment.kt b/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/LocalLibraryFragment.kt index 592471fc5..59790c3ee 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/LocalLibraryFragment.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/LocalLibraryFragment.kt @@ -20,7 +20,9 @@ package org.kiwix.kiwixmobile.nav.destination.library import android.Manifest import android.content.pm.PackageManager +import android.os.Build import android.os.Bundle +import android.os.Environment import android.view.LayoutInflater import android.view.Menu import android.view.MenuInflater @@ -62,6 +64,12 @@ import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.FileSelectActions.Re import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.FileSelectActions.RequestSelect import org.kiwix.kiwixmobile.zim_manager.fileselect_view.FileSelectListState import javax.inject.Inject +import android.content.Intent +import android.net.Uri +import android.provider.Settings +import androidx.annotation.RequiresApi +import org.kiwix.kiwixmobile.core.utils.dialog.DialogShower +import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog private const val WAS_IN_ACTION_MODE = "WAS_IN_ACTION_MODE" @@ -69,6 +77,7 @@ class LocalLibraryFragment : BaseFragment() { @Inject lateinit var viewModelFactory: ViewModelProvider.Factory @Inject lateinit var sharedPreferenceUtil: SharedPreferenceUtil + @Inject lateinit var dialogShower: DialogShower private var actionMode: ActionMode? = null private val disposable = CompositeDisposable() @@ -202,7 +211,25 @@ class LocalLibraryFragment : BaseFragment() { REQUEST_STORAGE_PERMISSION ) } else { - requestFileSystemCheck() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + if (Environment.isExternalStorageManager()) { + // We already have permission!! + requestFileSystemCheck() + } else { + if (sharedPreferenceUtil.manageExternalFilesPermissionDialog) { + // We should only ask for first time, If the users wants to revoke settings + // then they can directly toggle this feature from settings screen + sharedPreferenceUtil.manageExternalFilesPermissionDialog = false + // Show Dialog and Go to settings to give permission + dialogShower.show( + KiwixDialog.ManageExternalFilesPermissionDialog, + ::navigateToSettings + ) + } + } + } else { + requestFileSystemCheck() + } } } @@ -217,4 +244,13 @@ class LocalLibraryFragment : BaseFragment() { private fun navigateToLocalFileTransferFragment() { requireActivity().navigate(R.id.localFileTransferFragment) } + + @RequiresApi(Build.VERSION_CODES.R) + private fun navigateToSettings() { + val intent = Intent().apply { + action = Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION + data = Uri.fromParts("package", requireActivity().packageName, null) + } + startActivity(intent) + } } diff --git a/core/src/main/AndroidManifest.xml b/core/src/main/AndroidManifest.xml index da773d305..f9b3b51b1 100644 --- a/core/src/main/AndroidManifest.xml +++ b/core/src/main/AndroidManifest.xml @@ -8,6 +8,8 @@ + diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.kt index 8c7cc8ea9..19c4d0ac7 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.kt @@ -140,6 +140,13 @@ class SharedPreferenceUtil @Inject constructor(val context: Context) { fun updateNightMode() = nightModes.offer(nightMode) + var manageExternalFilesPermissionDialog: Boolean + get() = sharedPreferences.getBoolean(PREF_MANAGE_EXTERNAL_FILES, true) + set(prefManageExternalFilesPermissionDialog) = + sharedPreferences.edit { + putBoolean(PREF_MANAGE_EXTERNAL_FILES, prefManageExternalFilesPermissionDialog) + } + var hostedBooks: Set get() = sharedPreferences.getStringSet(PREF_HOSTED_BOOKS, null)?.toHashSet() ?: HashSet() set(hostedBooks) { @@ -172,5 +179,6 @@ class SharedPreferenceUtil @Inject constructor(val context: Context) { const val PREF_NIGHT_MODE = "pref_night_mode" private const val TEXT_ZOOM = "true_text_zoom" private const val DEFAULT_ZOOM = 100 + private const val PREF_MANAGE_EXTERNAL_FILES = "pref_manage_external_files" } } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/dialog/KiwixDialog.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/dialog/KiwixDialog.kt index 53ce42151..7bb1139ac 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/dialog/KiwixDialog.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/dialog/KiwixDialog.kt @@ -84,6 +84,14 @@ sealed class KiwixDialog( cancelable = false ) + object ManageExternalFilesPermissionDialog : KiwixDialog( + R.string.all_files_permission_needed, + R.string.all_files_permission_needed_message, + R.string.yes, + R.string.no, + cancelable = false + ) + data class ShowHotspotDetails(override val args: List) : KiwixDialog( R.string.hotspot_turned_on, R.string.hotspot_details_message, diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index af11074bc..ab452dbe4 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -289,6 +289,8 @@ Close Drawer How to update content? To update content (a zim file) you need to download the full latest version of this very same content. You can do that via the download section. + All Files Permission Needed + In order to access all the zim files across device we need to have All Files Permission @string/on @string/off From 449df6f6abc1ea5d07853f37d7c08fd207fb0f67 Mon Sep 17 00:00:00 2001 From: Gouri Panda Date: Thu, 28 Oct 2021 17:48:24 +0530 Subject: [PATCH 03/13] added manage external storage permission in prefrence --- .../core/settings/CorePrefsFragment.java | 36 +++++++++++++++++++ core/src/main/res/values/strings.xml | 4 +++ core/src/main/res/xml/preferences.xml | 11 ++++++ 3 files changed, 51 insertions(+) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/settings/CorePrefsFragment.java b/core/src/main/java/org/kiwix/kiwixmobile/core/settings/CorePrefsFragment.java index badbf0f49..dedce8e1b 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/settings/CorePrefsFragment.java +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/settings/CorePrefsFragment.java @@ -20,11 +20,17 @@ package org.kiwix.kiwixmobile.core.settings; import android.Manifest; import android.annotation.SuppressLint; +import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; +import android.net.Uri; +import android.os.Build; import android.os.Bundle; +import android.os.Environment; +import android.provider.Settings; import android.view.LayoutInflater; import android.webkit.WebView; +import androidx.annotation.RequiresApi; import androidx.core.content.ContextCompat; import androidx.navigation.NavController; import androidx.preference.EditTextPreference; @@ -62,6 +68,8 @@ public abstract class CorePrefsFragment extends PreferenceFragmentCompat impleme public static final String PREF_CLEAR_ALL_HISTORY = "pref_clear_all_history"; public static final String PREF_CLEAR_ALL_NOTES = "pref_clear_all_notes"; public static final String PREF_CREDITS = "pref_credits"; + public static final String PREF_MANAGE_EXTERNAL_STORAGE_PERMISSION = + "pref_manage_external_storage"; private static final int ZOOM_OFFSET = 2; private static final int ZOOM_SCALE = 25; private static final String INTERNAL_TEXT_ZOOM = "text_zoom"; @@ -87,6 +95,7 @@ public abstract class CorePrefsFragment extends PreferenceFragmentCompat impleme setStorage(); setUpSettings(); setupZoom(); + setMangeExternalStoragePermission(); new LanguageUtils(getActivity()).changeFont(getActivity().getLayoutInflater(), sharedPreferenceUtil); } @@ -174,6 +183,23 @@ public abstract class CorePrefsFragment extends PreferenceFragmentCompat impleme versionPref.setSummary(getVersionName() + " Build: " + getVersionCode()); } + private void setMangeExternalStoragePermission() { + Preference permissionPref = findPreference(PREF_MANAGE_EXTERNAL_STORAGE_PERMISSION); + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) { + boolean externalStorageManager = Environment.isExternalStorageManager(); + if (externalStorageManager) { + permissionPref.setSummary(R.string.allowed); + } else { + permissionPref.setSummary(R.string.not_allowed); + } + permissionPref.setOnPreferenceClickListener( + preference -> { + navigateToSettings(); + return true; + }); + } + } + private int getVersionCode() { try { return getActivity().getPackageManager() @@ -282,4 +308,14 @@ public abstract class CorePrefsFragment extends PreferenceFragmentCompat impleme } return Unit.INSTANCE; } + + // TODO: 28/10/21 Refactor the code. We are using it twice. + @RequiresApi(Build.VERSION_CODES.R) + private void navigateToSettings() { + Intent intent = new Intent(); + intent.setAction(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); + Uri uri = Uri.fromParts("package", getActivity().getPackageName(), null); + intent.setData(uri); + startActivity(intent); + } } diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index ab452dbe4..3fe554565 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -68,6 +68,7 @@ Clear history Clear recent searches and tabs history Notes + Permissions All History Cleared Clear bookmarks Clear All History? @@ -255,6 +256,7 @@ Status Clears all notes on all articles Clear all notes + MANAGE_EXTERNAL_STORAGE Change text size with 25\% increments. Pic Vid @@ -291,6 +293,8 @@ To update content (a zim file) you need to download the full latest version of this very same content. You can do that via the download section. All Files Permission Needed In order to access all the zim files across device we need to have All Files Permission + Allowed + Not allowed @string/on @string/off diff --git a/core/src/main/res/xml/preferences.xml b/core/src/main/res/xml/preferences.xml index e8e0c52cb..323f4c9dc 100644 --- a/core/src/main/res/xml/preferences.xml +++ b/core/src/main/res/xml/preferences.xml @@ -95,6 +95,17 @@ android:title="@string/pref_clear_all_notes_title" app:iconSpaceReserved="false" /> + + + + + Date: Thu, 28 Oct 2021 18:44:10 +0530 Subject: [PATCH 04/13] added edge cases for android 30 or lower --- .../kiwix/kiwixmobile/core/settings/CorePrefsFragment.java | 7 +++++++ core/src/main/res/xml/preferences.xml | 1 + 2 files changed, 8 insertions(+) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/settings/CorePrefsFragment.java b/core/src/main/java/org/kiwix/kiwixmobile/core/settings/CorePrefsFragment.java index dedce8e1b..11d52e618 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/settings/CorePrefsFragment.java +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/settings/CorePrefsFragment.java @@ -36,6 +36,7 @@ import androidx.navigation.NavController; import androidx.preference.EditTextPreference; import androidx.preference.ListPreference; import androidx.preference.Preference; +import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceFragmentCompat; import com.google.android.material.snackbar.Snackbar; import eu.mhutti1.utils.storage.StorageDevice; @@ -70,6 +71,7 @@ public abstract class CorePrefsFragment extends PreferenceFragmentCompat impleme public static final String PREF_CREDITS = "pref_credits"; public static final String PREF_MANAGE_EXTERNAL_STORAGE_PERMISSION = "pref_manage_external_storage"; + public static final String PREF_PERMISSION = "pref_permissions"; private static final int ZOOM_OFFSET = 2; private static final int ZOOM_SCALE = 25; private static final String INTERNAL_TEXT_ZOOM = "text_zoom"; @@ -186,6 +188,7 @@ public abstract class CorePrefsFragment extends PreferenceFragmentCompat impleme private void setMangeExternalStoragePermission() { Preference permissionPref = findPreference(PREF_MANAGE_EXTERNAL_STORAGE_PERMISSION); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) { + showPermissionPreference(); boolean externalStorageManager = Environment.isExternalStorageManager(); if (externalStorageManager) { permissionPref.setSummary(R.string.allowed); @@ -199,6 +202,10 @@ public abstract class CorePrefsFragment extends PreferenceFragmentCompat impleme }); } } + private void showPermissionPreference() { + PreferenceCategory preferenceCategory = findPreference(PREF_PERMISSION); + preferenceCategory.setVisible(true); + } private int getVersionCode() { try { diff --git a/core/src/main/res/xml/preferences.xml b/core/src/main/res/xml/preferences.xml index 323f4c9dc..35a06d03a 100644 --- a/core/src/main/res/xml/preferences.xml +++ b/core/src/main/res/xml/preferences.xml @@ -99,6 +99,7 @@ Date: Thu, 28 Oct 2021 19:54:24 +0530 Subject: [PATCH 05/13] pref_manage_external_storage_name_changed --- core/src/main/res/values/strings.xml | 2 +- core/src/main/res/xml/preferences.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 3fe554565..4a7c1289b 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -256,7 +256,7 @@ Status Clears all notes on all articles Clear all notes - MANAGE_EXTERNAL_STORAGE + Allow to read/write ZIM file\'s on SD card Change text size with 25\% increments. Pic Vid diff --git a/core/src/main/res/xml/preferences.xml b/core/src/main/res/xml/preferences.xml index 35a06d03a..081a15b34 100644 --- a/core/src/main/res/xml/preferences.xml +++ b/core/src/main/res/xml/preferences.xml @@ -104,7 +104,7 @@ From d7c99cd3075fd18fc6e7d0622eb1618d6e67a0cc Mon Sep 17 00:00:00 2001 From: "Amir E. Aharoni" Date: Wed, 10 Nov 2021 10:02:31 +0200 Subject: [PATCH 06/13] Rephrase pref_allow_to_read_or_write_zim_files_on_sd_card 1. Remove unnecessary apostrophe. 2. Replace a slash with "and", which is more natural to read. --- core/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 4a7c1289b..4de469255 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -256,7 +256,7 @@ Status Clears all notes on all articles Clear all notes - Allow to read/write ZIM file\'s on SD card + Allow to read and write ZIM files on SD card Change text size with 25\% increments. Pic Vid From dee218b57c962047100832fd0e26bf3c2b9f6bb4 Mon Sep 17 00:00:00 2001 From: Gouri Panda Date: Wed, 10 Nov 2021 16:23:12 +0530 Subject: [PATCH 07/13] #2733 fixed bug --- .../kiwix/kiwixmobile/custom/settings/CustomPrefsFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/custom/src/main/java/org/kiwix/kiwixmobile/custom/settings/CustomPrefsFragment.kt b/custom/src/main/java/org/kiwix/kiwixmobile/custom/settings/CustomPrefsFragment.kt index 2ae639295..77cea63c1 100644 --- a/custom/src/main/java/org/kiwix/kiwixmobile/custom/settings/CustomPrefsFragment.kt +++ b/custom/src/main/java/org/kiwix/kiwixmobile/custom/settings/CustomPrefsFragment.kt @@ -32,7 +32,7 @@ class CustomPrefsFragment : CorePrefsFragment() { } else { preferenceScreen.removePreference(findPreference("pref_language")) } - preferenceScreen.removePreference(findPreference(PREF_WIFI_ONLY)) + preferenceScreen.removePreferenceRecursively(PREF_WIFI_ONLY) } override fun setStorage() { From 6e885f755696104cc5c66eb5c3988c0f0b73d342 Mon Sep 17 00:00:00 2001 From: Gouri Panda Date: Wed, 10 Nov 2021 17:04:07 +0530 Subject: [PATCH 08/13] #2732 refactored all files access permission code to app module and bug fixed in custom app showing unneceesary permission --- app/src/main/AndroidManifest.xml | 2 + .../library/LocalLibraryFragment.kt | 23 ++++------ .../settings/KiwixPrefsFragment.kt | 36 ++++++++++++++++ core/src/main/AndroidManifest.xml | 2 - .../org/kiwix/kiwixmobile/core/Intents.kt | 13 ++++++ .../core/settings/CorePrefsFragment.java | 42 +------------------ 6 files changed, 60 insertions(+), 58 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 53648ce78..a68032508 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,6 +6,8 @@ + diff --git a/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/LocalLibraryFragment.kt b/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/LocalLibraryFragment.kt index 59790c3ee..e97562289 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/LocalLibraryFragment.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/LocalLibraryFragment.kt @@ -33,6 +33,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.view.ActionMode import androidx.appcompat.widget.Toolbar import androidx.core.content.ContextCompat +import androidx.fragment.app.FragmentActivity import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager @@ -51,9 +52,12 @@ import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.navigate import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.viewModel import org.kiwix.kiwixmobile.core.extensions.toast import org.kiwix.kiwixmobile.core.main.CoreMainActivity +import org.kiwix.kiwixmobile.core.navigateToSettings import org.kiwix.kiwixmobile.core.utils.LanguageUtils import org.kiwix.kiwixmobile.core.utils.REQUEST_STORAGE_PERMISSION import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil +import org.kiwix.kiwixmobile.core.utils.dialog.DialogShower +import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.adapter.BookOnDiskDelegate import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.adapter.BooksOnDiskAdapter import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.adapter.BooksOnDiskListItem @@ -64,12 +68,6 @@ import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.FileSelectActions.Re import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.FileSelectActions.RequestSelect import org.kiwix.kiwixmobile.zim_manager.fileselect_view.FileSelectListState import javax.inject.Inject -import android.content.Intent -import android.net.Uri -import android.provider.Settings -import androidx.annotation.RequiresApi -import org.kiwix.kiwixmobile.core.utils.dialog.DialogShower -import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog private const val WAS_IN_ACTION_MODE = "WAS_IN_ACTION_MODE" @@ -223,7 +221,9 @@ class LocalLibraryFragment : BaseFragment() { // Show Dialog and Go to settings to give permission dialogShower.show( KiwixDialog.ManageExternalFilesPermissionDialog, - ::navigateToSettings + { + this.activity?.let(FragmentActivity::navigateToSettings) + } ) } } @@ -244,13 +244,4 @@ class LocalLibraryFragment : BaseFragment() { private fun navigateToLocalFileTransferFragment() { requireActivity().navigate(R.id.localFileTransferFragment) } - - @RequiresApi(Build.VERSION_CODES.R) - private fun navigateToSettings() { - val intent = Intent().apply { - action = Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION - data = Uri.fromParts("package", requireActivity().packageName, null) - } - startActivity(intent) - } } diff --git a/app/src/main/java/org/kiwix/kiwixmobile/settings/KiwixPrefsFragment.kt b/app/src/main/java/org/kiwix/kiwixmobile/settings/KiwixPrefsFragment.kt index 8956f3678..da9b1a760 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/settings/KiwixPrefsFragment.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/settings/KiwixPrefsFragment.kt @@ -18,10 +18,15 @@ package org.kiwix.kiwixmobile.settings +import android.os.Build import android.os.Bundle +import android.os.Environment import androidx.core.content.ContextCompat +import androidx.fragment.app.FragmentActivity import androidx.preference.Preference +import androidx.preference.PreferenceCategory import org.kiwix.kiwixmobile.R +import org.kiwix.kiwixmobile.core.navigateToSettings import org.kiwix.kiwixmobile.core.settings.CorePrefsFragment import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil.Companion.PREF_STORAGE @@ -31,6 +36,7 @@ class KiwixPrefsFragment : CorePrefsFragment() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { super.onCreatePreferences(savedInstanceState, rootKey) setUpLanguageChooser(SharedPreferenceUtil.PREF_LANG) + setMangeExternalStoragePermission() } override fun setStorage() { @@ -43,4 +49,34 @@ class KiwixPrefsFragment : CorePrefsFragment() { private fun internalStorage(): String? = ContextCompat.getExternalFilesDirs(requireContext(), null).firstOrNull()?.path + + private fun setMangeExternalStoragePermission() { + val permissionPref = findPreference(PREF_MANAGE_EXTERNAL_STORAGE_PERMISSION) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + showPermissionPreference() + val externalStorageManager = Environment.isExternalStorageManager() + if (externalStorageManager) { + permissionPref!!.setSummary(org.kiwix.kiwixmobile.core.R.string.allowed) + } else { + permissionPref!!.setSummary(org.kiwix.kiwixmobile.core.R.string.not_allowed) + } + permissionPref.onPreferenceClickListener = + Preference.OnPreferenceClickListener { + activity?.let(FragmentActivity::navigateToSettings) + true + } + } + } + + private fun showPermissionPreference() { + val preferenceCategory = findPreference( + PREF_PERMISSION + ) + preferenceCategory!!.isVisible = true + } + + companion object { + const val PREF_MANAGE_EXTERNAL_STORAGE_PERMISSION = + "pref_manage_external_storage"; + } } diff --git a/core/src/main/AndroidManifest.xml b/core/src/main/AndroidManifest.xml index f9b3b51b1..da773d305 100644 --- a/core/src/main/AndroidManifest.xml +++ b/core/src/main/AndroidManifest.xml @@ -8,8 +8,6 @@ - diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/Intents.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/Intents.kt index ea6f46326..cb4b0829c 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/Intents.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/Intents.kt @@ -20,8 +20,21 @@ package org.kiwix.kiwixmobile.core import android.app.Activity import android.content.Intent +import android.net.Uri +import android.os.Build +import android.provider.Settings +import androidx.annotation.RequiresApi object Intents { @JvmStatic fun internal(clazz: Class): Intent = Intent(clazz.canonicalName).setPackage(CoreApp.instance.packageName) } +@RequiresApi(Build.VERSION_CODES.R) +fun Activity.navigateToSettings() { + val intent = Intent().apply { + action = Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION + data = Uri.fromParts("package", packageName, null) + } + startActivity(intent) +} + diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/settings/CorePrefsFragment.java b/core/src/main/java/org/kiwix/kiwixmobile/core/settings/CorePrefsFragment.java index 11d52e618..5a38303cf 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/settings/CorePrefsFragment.java +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/settings/CorePrefsFragment.java @@ -20,23 +20,16 @@ package org.kiwix.kiwixmobile.core.settings; import android.Manifest; import android.annotation.SuppressLint; -import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; -import android.net.Uri; -import android.os.Build; import android.os.Bundle; -import android.os.Environment; -import android.provider.Settings; import android.view.LayoutInflater; import android.webkit.WebView; -import androidx.annotation.RequiresApi; import androidx.core.content.ContextCompat; import androidx.navigation.NavController; import androidx.preference.EditTextPreference; import androidx.preference.ListPreference; import androidx.preference.Preference; -import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceFragmentCompat; import com.google.android.material.snackbar.Snackbar; import eu.mhutti1.utils.storage.StorageDevice; @@ -69,8 +62,6 @@ public abstract class CorePrefsFragment extends PreferenceFragmentCompat impleme public static final String PREF_CLEAR_ALL_HISTORY = "pref_clear_all_history"; public static final String PREF_CLEAR_ALL_NOTES = "pref_clear_all_notes"; public static final String PREF_CREDITS = "pref_credits"; - public static final String PREF_MANAGE_EXTERNAL_STORAGE_PERMISSION = - "pref_manage_external_storage"; public static final String PREF_PERMISSION = "pref_permissions"; private static final int ZOOM_OFFSET = 2; private static final int ZOOM_SCALE = 25; @@ -97,7 +88,6 @@ public abstract class CorePrefsFragment extends PreferenceFragmentCompat impleme setStorage(); setUpSettings(); setupZoom(); - setMangeExternalStoragePermission(); new LanguageUtils(getActivity()).changeFont(getActivity().getLayoutInflater(), sharedPreferenceUtil); } @@ -185,27 +175,8 @@ public abstract class CorePrefsFragment extends PreferenceFragmentCompat impleme versionPref.setSummary(getVersionName() + " Build: " + getVersionCode()); } - private void setMangeExternalStoragePermission() { - Preference permissionPref = findPreference(PREF_MANAGE_EXTERNAL_STORAGE_PERMISSION); - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) { - showPermissionPreference(); - boolean externalStorageManager = Environment.isExternalStorageManager(); - if (externalStorageManager) { - permissionPref.setSummary(R.string.allowed); - } else { - permissionPref.setSummary(R.string.not_allowed); - } - permissionPref.setOnPreferenceClickListener( - preference -> { - navigateToSettings(); - return true; - }); - } - } - private void showPermissionPreference() { - PreferenceCategory preferenceCategory = findPreference(PREF_PERMISSION); - preferenceCategory.setVisible(true); - } + + private int getVersionCode() { try { @@ -316,13 +287,4 @@ public abstract class CorePrefsFragment extends PreferenceFragmentCompat impleme return Unit.INSTANCE; } - // TODO: 28/10/21 Refactor the code. We are using it twice. - @RequiresApi(Build.VERSION_CODES.R) - private void navigateToSettings() { - Intent intent = new Intent(); - intent.setAction(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); - Uri uri = Uri.fromParts("package", getActivity().getPackageName(), null); - intent.setData(uri); - startActivity(intent); - } } From 506b1243c9a6ff0bd7f9b614bd03705293ef89da Mon Sep 17 00:00:00 2001 From: Gouri Panda Date: Wed, 10 Nov 2021 17:24:14 +0530 Subject: [PATCH 09/13] formated code --- .../java/org/kiwix/kiwixmobile/settings/KiwixPrefsFragment.kt | 2 +- core/src/main/java/org/kiwix/kiwixmobile/core/Intents.kt | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/org/kiwix/kiwixmobile/settings/KiwixPrefsFragment.kt b/app/src/main/java/org/kiwix/kiwixmobile/settings/KiwixPrefsFragment.kt index da9b1a760..948466170 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/settings/KiwixPrefsFragment.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/settings/KiwixPrefsFragment.kt @@ -77,6 +77,6 @@ class KiwixPrefsFragment : CorePrefsFragment() { companion object { const val PREF_MANAGE_EXTERNAL_STORAGE_PERMISSION = - "pref_manage_external_storage"; + "pref_manage_external_storage" } } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/Intents.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/Intents.kt index cb4b0829c..80eda6769 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/Intents.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/Intents.kt @@ -37,4 +37,3 @@ fun Activity.navigateToSettings() { } startActivity(intent) } - From 662fde559c61783b6b787a624453c3edfc4740be Mon Sep 17 00:00:00 2001 From: cdhiraj40 Date: Thu, 18 Nov 2021 12:43:58 +0530 Subject: [PATCH 10/13] kiwix#2717 added addOnScrollListener to hide keyboard in PageFragment.kt and onlineLibraryFragment.kt --- .../library/OnlineLibraryFragment.kt | 9 +++++ .../core/extensions/FragmentExtensions.kt | 6 +++ .../kiwixmobile/core/page/PageFragment.kt | 9 +++++ .../utils/SimpleRecyclerViewScrollListener.kt | 38 +++++++++++++++++++ 4 files changed, 62 insertions(+) create mode 100644 core/src/main/java/org/kiwix/kiwixmobile/core/utils/SimpleRecyclerViewScrollListener.kt diff --git a/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/OnlineLibraryFragment.kt b/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/OnlineLibraryFragment.kt index 76e6408a5..4453b0818 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/OnlineLibraryFragment.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/OnlineLibraryFragment.kt @@ -49,11 +49,13 @@ import org.kiwix.kiwixmobile.core.downloader.Downloader import org.kiwix.kiwixmobile.core.entity.LibraryNetworkEntity import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.navigate import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.viewModel +import org.kiwix.kiwixmobile.core.extensions.closeKeyboard import org.kiwix.kiwixmobile.core.extensions.snack import org.kiwix.kiwixmobile.core.main.CoreMainActivity import org.kiwix.kiwixmobile.core.utils.BookUtils import org.kiwix.kiwixmobile.core.utils.NetworkUtils import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil +import org.kiwix.kiwixmobile.core.utils.SimpleRecyclerViewScrollListener import org.kiwix.kiwixmobile.core.utils.SimpleTextListener import org.kiwix.kiwixmobile.core.utils.dialog.DialogShower import org.kiwix.kiwixmobile.core.utils.dialog.KiwixDialog @@ -141,6 +143,13 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { zimManageViewModel.shouldShowWifiOnlyDialog.value = false } }) + + // hides keyboard when scrolled + libraryList.addOnScrollListener(SimpleRecyclerViewScrollListener { _, newState -> + if (newState == RecyclerView.SCROLL_STATE_DRAGGING) { + libraryList.closeKeyboard() + } + }) } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/extensions/FragmentExtensions.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/extensions/FragmentExtensions.kt index 17919d1ca..eeadaa799 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/extensions/FragmentExtensions.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/extensions/FragmentExtensions.kt @@ -19,6 +19,7 @@ package org.kiwix.kiwixmobile.core.extensions import android.content.Context +import android.view.View import android.view.inputmethod.InputMethodManager import android.widget.Toast import androidx.fragment.app.Fragment @@ -41,4 +42,9 @@ fun Fragment.closeKeyboard() { inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0) } +fun View.closeKeyboard() { + val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + imm.hideSoftInputFromWindow(windowToken, 0) +} + val Fragment.coreMainActivity get() = activity as CoreMainActivity diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/page/PageFragment.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/page/PageFragment.kt index 0b5a8aaee..375029a52 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/page/PageFragment.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/page/PageFragment.kt @@ -42,6 +42,7 @@ import kotlinx.android.synthetic.main.layout_toolbar.toolbar import org.kiwix.kiwixmobile.core.R import org.kiwix.kiwixmobile.core.base.BaseFragment import org.kiwix.kiwixmobile.core.base.FragmentActivityExtensions +import org.kiwix.kiwixmobile.core.extensions.closeKeyboard import org.kiwix.kiwixmobile.core.main.CoreMainActivity import org.kiwix.kiwixmobile.core.page.adapter.OnItemClickListener import org.kiwix.kiwixmobile.core.page.adapter.Page @@ -50,6 +51,7 @@ import org.kiwix.kiwixmobile.core.page.viewmodel.Action import org.kiwix.kiwixmobile.core.page.viewmodel.PageState import org.kiwix.kiwixmobile.core.page.viewmodel.PageViewModel import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil +import org.kiwix.kiwixmobile.core.utils.SimpleRecyclerViewScrollListener import org.kiwix.kiwixmobile.core.utils.SimpleTextListener import javax.inject.Inject @@ -135,6 +137,13 @@ abstract class PageFragment : OnItemClickListener, BaseFragment(), FragmentActiv pageViewModel.actions.offer(Action.UserClickedShowAllToggle(isChecked)) } pageViewModel.state.observe(viewLifecycleOwner, Observer(::render)) + + // hides keyboard when scrolled + recycler_view.addOnScrollListener(SimpleRecyclerViewScrollListener { _, newState -> + if (newState == RecyclerView.SCROLL_STATE_DRAGGING) { + recycler_view.closeKeyboard() + } + }) } override fun onCreateView( diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SimpleRecyclerViewScrollListener.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SimpleRecyclerViewScrollListener.kt new file mode 100644 index 000000000..ddd36b0b2 --- /dev/null +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SimpleRecyclerViewScrollListener.kt @@ -0,0 +1,38 @@ +/* + * Kiwix Android + * Copyright (c) 2021 Kiwix + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package org.kiwix.kiwixmobile.core.utils + +import androidx.recyclerview.widget.RecyclerView + +class SimpleRecyclerViewScrollListener( + private val onLayoutScrollListener: (RecyclerView, Int) -> Unit // here we are calling callback +) : + RecyclerView.OnScrollListener() { + override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { + super.onScrollStateChanged(recyclerView, newState) + onLayoutScrollListener( + recyclerView, + newState + ) // implement the callback by passing recyclerview and newState + super.onScrollStateChanged(recyclerView, newState) + } +} + + + From 0e8b74d8bc0cb751e97c7140dc2eddb02e3c81a5 Mon Sep 17 00:00:00 2001 From: cdhiraj40 Date: Thu, 18 Nov 2021 14:34:45 +0530 Subject: [PATCH 11/13] #2717 removed requireFragmentManager() --- .../nav/destination/library/OnlineLibraryFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/OnlineLibraryFragment.kt b/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/OnlineLibraryFragment.kt index 4453b0818..b1c2cc1b6 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/OnlineLibraryFragment.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/OnlineLibraryFragment.kt @@ -274,5 +274,5 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { .apply { onSelectAction = ::storeDeviceInPreferences } - .show(requireFragmentManager(), getString(R.string.pref_storage)) + .show(parentFragmentManager, getString(R.string.pref_storage)) } From 951a07367858741a1036152c44dbc665c32ef8b8 Mon Sep 17 00:00:00 2001 From: cdhiraj40 Date: Sat, 20 Nov 2021 19:28:17 +0530 Subject: [PATCH 12/13] kiwix#2717 requested changes done --- .../nav/destination/library/OnlineLibraryFragment.kt | 2 +- .../core/utils/SimpleRecyclerViewScrollListener.kt | 8 ++------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/OnlineLibraryFragment.kt b/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/OnlineLibraryFragment.kt index b1c2cc1b6..4453b0818 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/OnlineLibraryFragment.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/nav/destination/library/OnlineLibraryFragment.kt @@ -274,5 +274,5 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { .apply { onSelectAction = ::storeDeviceInPreferences } - .show(parentFragmentManager, getString(R.string.pref_storage)) + .show(requireFragmentManager(), getString(R.string.pref_storage)) } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SimpleRecyclerViewScrollListener.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SimpleRecyclerViewScrollListener.kt index ddd36b0b2..64d5614c9 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SimpleRecyclerViewScrollListener.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/SimpleRecyclerViewScrollListener.kt @@ -21,7 +21,7 @@ package org.kiwix.kiwixmobile.core.utils import androidx.recyclerview.widget.RecyclerView class SimpleRecyclerViewScrollListener( - private val onLayoutScrollListener: (RecyclerView, Int) -> Unit // here we are calling callback + private val onLayoutScrollListener: (RecyclerView, Int) -> Unit ) : RecyclerView.OnScrollListener() { override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { @@ -29,10 +29,6 @@ class SimpleRecyclerViewScrollListener( onLayoutScrollListener( recyclerView, newState - ) // implement the callback by passing recyclerview and newState - super.onScrollStateChanged(recyclerView, newState) + ) } } - - - From 6680c094972a0ff59520ab72fc282326b1216270 Mon Sep 17 00:00:00 2001 From: Aditya Arora <54585121+AdiAr11@users.noreply.github.com> Date: Tue, 23 Nov 2021 11:14:38 +0530 Subject: [PATCH 13/13] #2721 launch screen icon updated (#2724) * #2721 launch screen icon updated * made the required changes * suppressed lint error * testing launch screen for API 23 and lower --- .../res/drawable-night-v24/kiwix_icon.xml | 27 +++++++++++++++++ .../main/res/drawable-night/kiwix_icon.xml | 27 +++++++++++++++++ .../main/res/drawable-night/launch_screen.xml | 7 ++--- app/src/main/res/drawable-v24/kiwix_icon.xml | 29 +++++++++++++++++++ app/src/main/res/drawable/kiwix_icon.xml | 29 +++++++++++++++++++ app/src/main/res/drawable/launch_screen.xml | 7 ++--- 6 files changed, 116 insertions(+), 10 deletions(-) create mode 100644 app/src/main/res/drawable-night-v24/kiwix_icon.xml create mode 100644 app/src/main/res/drawable-night/kiwix_icon.xml create mode 100644 app/src/main/res/drawable-v24/kiwix_icon.xml create mode 100644 app/src/main/res/drawable/kiwix_icon.xml diff --git a/app/src/main/res/drawable-night-v24/kiwix_icon.xml b/app/src/main/res/drawable-night-v24/kiwix_icon.xml new file mode 100644 index 000000000..4f41c3eba --- /dev/null +++ b/app/src/main/res/drawable-night-v24/kiwix_icon.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/app/src/main/res/drawable-night/kiwix_icon.xml b/app/src/main/res/drawable-night/kiwix_icon.xml new file mode 100644 index 000000000..048ced6b3 --- /dev/null +++ b/app/src/main/res/drawable-night/kiwix_icon.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/app/src/main/res/drawable-night/launch_screen.xml b/app/src/main/res/drawable-night/launch_screen.xml index 1d4d00751..1f69c6193 100644 --- a/app/src/main/res/drawable-night/launch_screen.xml +++ b/app/src/main/res/drawable-night/launch_screen.xml @@ -21,9 +21,6 @@ android:opacity="opaque"> - - - + diff --git a/app/src/main/res/drawable-v24/kiwix_icon.xml b/app/src/main/res/drawable-v24/kiwix_icon.xml new file mode 100644 index 000000000..16b1c0e76 --- /dev/null +++ b/app/src/main/res/drawable-v24/kiwix_icon.xml @@ -0,0 +1,29 @@ + + + + + diff --git a/app/src/main/res/drawable/kiwix_icon.xml b/app/src/main/res/drawable/kiwix_icon.xml new file mode 100644 index 000000000..32fbbca20 --- /dev/null +++ b/app/src/main/res/drawable/kiwix_icon.xml @@ -0,0 +1,29 @@ + + + + + diff --git a/app/src/main/res/drawable/launch_screen.xml b/app/src/main/res/drawable/launch_screen.xml index 0752c6b8e..6c38d8aa4 100644 --- a/app/src/main/res/drawable/launch_screen.xml +++ b/app/src/main/res/drawable/launch_screen.xml @@ -21,9 +21,6 @@ android:opacity="opaque"> - - - +