From 27bf05a9f0f2098323c0801d5b606dfe76a0b3ba Mon Sep 17 00:00:00 2001 From: MohitMali Date: Wed, 11 May 2022 22:07:50 +0530 Subject: [PATCH 1/8] Fix conflicts --- .../kiwixmobile/core/main/KiwixWebView.kt | 37 +++---------------- .../kiwixmobile/core/utils/files/FileUtils.kt | 37 +++++++++++++++++++ 2 files changed, 43 insertions(+), 31 deletions(-) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/KiwixWebView.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/main/KiwixWebView.kt index 114779636..109969e2d 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/KiwixWebView.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/KiwixWebView.kt @@ -20,8 +20,6 @@ package org.kiwix.kiwixmobile.core.main import android.annotation.SuppressLint import android.app.Activity import android.content.Context -import android.net.Uri -import android.os.Environment import android.os.Handler import android.os.Message import android.util.AttributeSet @@ -40,8 +38,7 @@ import org.kiwix.kiwixmobile.core.extensions.toast import org.kiwix.kiwixmobile.core.reader.ZimReaderContainer import org.kiwix.kiwixmobile.core.utils.LanguageUtils.Companion.getCurrentLocale import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil -import java.io.File -import java.io.IOException +import org.kiwix.kiwixmobile.core.utils.files.FileUtils import javax.inject.Inject private const val INITIAL_SCALE = 100 @@ -147,39 +144,17 @@ open class KiwixWebView @SuppressLint("SetJavaScriptEnabled") constructor( internal class SaveHandler(private val zimReaderContainer: ZimReaderContainer) : Handler() { - private fun getDecodedFileName(url: String?, src: String?): String = - url?.substringAfterLast("/", "") - ?.takeIf { it.contains(".") } - ?: src?.substringAfterLast("/", "") - ?.substringAfterLast("%3A") ?: "" @SuppressWarnings("NestedBlockDepth") override fun handleMessage(msg: Message) { val url = msg.data["url"] as? String val src = msg.data["src"] as? String if (url != null || src != null) { - val fileName = getDecodedFileName(url, src) - var root = - Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) - if (instance.externalMediaDirs.isNotEmpty()) { - root = instance.externalMediaDirs[0] - } - val fileToSave = sequence { - yield(File(root, fileName)) - yieldAll( - generateSequence(1) { it + 1 }.map { - File(root, fileName.replace(".", "_$it.")) - } - ) - }.first { !it.exists() } - val source = Uri.parse(src) - try { - zimReaderContainer.load("$source", emptyMap()).data.use { inputStream -> - fileToSave.outputStream().use { inputStream.copyTo(it) } - } - instance.toast(instance.getString(R.string.save_media_saved, fileToSave.name)) - } catch (e: IOException) { - Log.w("kiwix", "Couldn't save image", e) + val file = FileUtils.downloadFileFromUrl(url, src, zimReaderContainer) + file?.let { + instance.toast(instance.getString(R.string.save_media_saved, it.name)) + } ?: run { + Log.w("kiwix", "Couldn't save image") instance.toast(R.string.save_media_error) } } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/files/FileUtils.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/files/FileUtils.kt index cbf63f836..68250d2b8 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/files/FileUtils.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/files/FileUtils.kt @@ -28,11 +28,13 @@ import android.provider.DocumentsContract import android.util.Log import android.widget.Toast import androidx.documentfile.provider.DocumentFile +import org.kiwix.kiwixmobile.core.CoreApp import org.kiwix.kiwixmobile.core.R import org.kiwix.kiwixmobile.core.downloader.ChunkUtils import org.kiwix.kiwixmobile.core.entity.LibraryNetworkEntity.Book import org.kiwix.kiwixmobile.core.extensions.get import org.kiwix.kiwixmobile.core.extensions.toast +import org.kiwix.kiwixmobile.core.reader.ZimReaderContainer import java.io.BufferedReader import java.io.File import java.io.IOException @@ -288,4 +290,39 @@ object FileUtils { } return null } + + private fun getDecodedFileName(url: String?, src: String?): String = + url?.substringAfterLast("/", "") + ?.takeIf { it.contains(".") } + ?: src?.substringAfterLast("/", "") + ?.substringAfterLast("%3A") ?: "" + + @JvmStatic fun downloadFileFromUrl( + url: String?, + src: String?, + zimReaderContainer: ZimReaderContainer + ): File? { + val fileName = getDecodedFileName(url, src) + var root = + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + if (CoreApp.instance.externalMediaDirs.isNotEmpty()) { + root = CoreApp.instance.externalMediaDirs[0] + } + val fileToSave = sequence { + yield(File(root, fileName)) + yieldAll(generateSequence(1) { it + 1 }.map { + File(root, fileName.replace(".", "_$it.")) + }) + }.first { !it.exists() } + val source = if (url == null) Uri.parse(src) else Uri.parse(url) + return try { + zimReaderContainer.load("$source", emptyMap()).data.use { inputStream -> + fileToSave.outputStream().use { inputStream.copyTo(it) } + } + fileToSave + } catch (e: IOException) { + Log.w("kiwix", "Couldn't save image", e) + null + } + } } From 0dcd8646f6fef4684cad85b4009977443398280f Mon Sep 17 00:00:00 2001 From: MohitMali Date: Thu, 12 May 2022 12:58:08 +0530 Subject: [PATCH 2/8] Resolve conflicts --- .../core/main/CoreWebViewClient.java | 24 +++++++++++++++---- .../kiwixmobile/core/main/KiwixWebView.kt | 6 ++--- .../kiwixmobile/core/utils/files/FileUtils.kt | 2 +- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreWebViewClient.java b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreWebViewClient.java index a2ca2a179..eea181d3a 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreWebViewClient.java +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreWebViewClient.java @@ -20,6 +20,7 @@ package org.kiwix.kiwixmobile.core.main; import android.content.Intent; import android.net.Uri; +import android.os.Build; import android.util.Log; import android.webkit.MimeTypeMap; import android.webkit.WebResourceRequest; @@ -27,9 +28,12 @@ import android.webkit.WebResourceResponse; import android.webkit.WebView; import android.webkit.WebViewClient; import androidx.annotation.Nullable; +import androidx.core.content.FileProvider; +import java.io.File; import java.util.HashMap; import org.kiwix.kiwixmobile.core.CoreApp; import org.kiwix.kiwixmobile.core.reader.ZimReaderContainer; +import org.kiwix.kiwixmobile.core.utils.files.FileUtils; import static org.kiwix.kiwixmobile.core.reader.ZimFileReader.CONTENT_PREFIX; import static org.kiwix.kiwixmobile.core.reader.ZimFileReader.UI_URI; @@ -97,11 +101,21 @@ public class CoreWebViewClient extends WebViewClient { private boolean handleEpubAndPdf(String url) { String extension = MimeTypeMap.getFileExtensionFromUrl(url); if (DOCUMENT_TYPES.containsKey(extension)) { - Intent intent = new Intent(Intent.ACTION_VIEW); - Uri uri = Uri.parse(url); - intent.setDataAndType(uri, DOCUMENT_TYPES.get(extension)); - intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - callback.openExternalUrl(intent); + File savedFile = FileUtils.downloadFileFromUrl(url, null, zimReaderContainer); + if (savedFile != null && savedFile.exists()) { + Uri uri = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N + ? FileProvider.getUriForFile( + CoreApp.getInstance(), + CoreApp.getInstance().getPackageName() + ".fileprovider", savedFile) + : Uri.fromFile(savedFile); + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setDataAndType(uri, DOCUMENT_TYPES.get(extension)); + intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + } + callback.openExternalUrl(intent); + } return true; } return false; diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/KiwixWebView.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/main/KiwixWebView.kt index 109969e2d..b32d91be0 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/KiwixWebView.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/KiwixWebView.kt @@ -150,11 +150,11 @@ open class KiwixWebView @SuppressLint("SetJavaScriptEnabled") constructor( val url = msg.data["url"] as? String val src = msg.data["src"] as? String if (url != null || src != null) { - val file = FileUtils.downloadFileFromUrl(url, src, zimReaderContainer) - file?.let { + val savedFile = FileUtils.downloadFileFromUrl(url, src, zimReaderContainer) + savedFile?.let { instance.toast(instance.getString(R.string.save_media_saved, it.name)) } ?: run { - Log.w("kiwix", "Couldn't save image") + Log.w("kiwix", "Couldn't save file") instance.toast(R.string.save_media_error) } } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/files/FileUtils.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/files/FileUtils.kt index 68250d2b8..b4a35593f 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/files/FileUtils.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/files/FileUtils.kt @@ -321,7 +321,7 @@ object FileUtils { } fileToSave } catch (e: IOException) { - Log.w("kiwix", "Couldn't save image", e) + Log.w("kiwix", "Couldn't save file", e) null } } From fe6ed3f62a01c4aa609cc203b296c007c805ed95 Mon Sep 17 00:00:00 2001 From: MohitMali Date: Fri, 13 May 2022 16:59:45 +0530 Subject: [PATCH 3/8] Changes after review --- .../org/kiwix/kiwixmobile/core/main/CoreWebViewClient.java | 6 ++++-- .../java/org/kiwix/kiwixmobile/core/main/KiwixWebView.kt | 2 -- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreWebViewClient.java b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreWebViewClient.java index eea181d3a..093524ad4 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreWebViewClient.java +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreWebViewClient.java @@ -18,6 +18,7 @@ package org.kiwix.kiwixmobile.core.main; +import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Build; @@ -103,10 +104,11 @@ public class CoreWebViewClient extends WebViewClient { if (DOCUMENT_TYPES.containsKey(extension)) { File savedFile = FileUtils.downloadFileFromUrl(url, null, zimReaderContainer); if (savedFile != null && savedFile.exists()) { + Context context = CoreApp.getInstance(); Uri uri = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N ? FileProvider.getUriForFile( - CoreApp.getInstance(), - CoreApp.getInstance().getPackageName() + ".fileprovider", savedFile) + context, + context.getPackageName() + ".fileprovider", savedFile) : Uri.fromFile(savedFile); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(uri, DOCUMENT_TYPES.get(extension)); diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/KiwixWebView.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/main/KiwixWebView.kt index b32d91be0..ec91990ab 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/KiwixWebView.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/KiwixWebView.kt @@ -23,7 +23,6 @@ import android.content.Context import android.os.Handler import android.os.Message import android.util.AttributeSet -import android.util.Log import android.view.ContextMenu import android.view.View import android.view.ViewGroup @@ -154,7 +153,6 @@ open class KiwixWebView @SuppressLint("SetJavaScriptEnabled") constructor( savedFile?.let { instance.toast(instance.getString(R.string.save_media_saved, it.name)) } ?: run { - Log.w("kiwix", "Couldn't save file") instance.toast(R.string.save_media_error) } } From 0d001d61f2b69c6e690afd2f46d45b32e4600da4 Mon Sep 17 00:00:00 2001 From: Gouri Panda Date: Sat, 14 May 2022 14:48:00 +0530 Subject: [PATCH 4/8] added test cases --- .../kiwixmobile/core/utils/files/FileUtils.kt | 7 +++- .../core/utils/files/FileUtilsTest.kt | 40 +++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/files/FileUtils.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/files/FileUtils.kt index b4a35593f..bf1efefaf 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/files/FileUtils.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/files/FileUtils.kt @@ -291,7 +291,12 @@ object FileUtils { return null } - private fun getDecodedFileName(url: String?, src: String?): String = + /** + * Returns the file name from the url or src. In url it gets the file name from the last '/' and + * if it contains '.'. If the url is null then it'll get the file name from the last '/'. + * If the url and src doesn't exist it returns the empty string. + */ + fun getDecodedFileName(url: String?, src: String?): String = url?.substringAfterLast("/", "") ?.takeIf { it.contains(".") } ?: src?.substringAfterLast("/", "") diff --git a/core/src/test/java/org/kiwix/kiwixmobile/core/utils/files/FileUtilsTest.kt b/core/src/test/java/org/kiwix/kiwixmobile/core/utils/files/FileUtilsTest.kt index 4058b9ee5..298c738c2 100644 --- a/core/src/test/java/org/kiwix/kiwixmobile/core/utils/files/FileUtilsTest.kt +++ b/core/src/test/java/org/kiwix/kiwixmobile/core/utils/files/FileUtilsTest.kt @@ -88,4 +88,44 @@ class FileUtilsTest { every { mockFile.path } returns "$fileName$extension" every { mockFile.exists() } returns fileExists } + + @Test + fun `test decode file name`() { + val fileName = + FileUtils.getDecodedFileName( + url = "https://kiwix.org/contributors/contributors_list.pdf", + src = null + ) + assertThat(fileName).isEqualTo("contributors_list.pdf") + } + + @Test + fun `test file name if extension doesn't exist`() { + val fileName = FileUtils.getDecodedFileName(url = "https://kiwix.org/contributors/", src = null) + assertThat(fileName).isEqualTo("") + } + + @Test + fun `test file name if the url and src doesn't exist`() { + val fileName = FileUtils.getDecodedFileName(url = null, src = null) + assertThat(fileName).isEqualTo("") + } + + @Test + fun `test file name if only file name exist`() { + val fileName = FileUtils.getDecodedFileName(src = "android_tutorials.pdf", url = null) + assertThat(fileName).isEqualTo("") + } + + @Test + fun `test file name if url doesn't exist`() { + val fileName = FileUtils.getDecodedFileName(url = null, src = "/html/images/test.png") + assertThat(fileName).isEqualTo("test.png") + } + + @Test + fun `test file name if url and src's extension doesn't exist`() { + val fileName = FileUtils.getDecodedFileName(url = null, src = "/html/images/") + assertThat(fileName).isEqualTo("") + } } From 6e4134684cc221f6a056d6466c26e6e4e1923add Mon Sep 17 00:00:00 2001 From: MohitMaliFtechiz Date: Mon, 20 Jun 2022 17:29:42 +0530 Subject: [PATCH 5/8] resolve klint failure --- .../kiwix/kiwixmobile/core/utils/files/FileUtils.kt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/files/FileUtils.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/files/FileUtils.kt index bf1efefaf..4a339a89b 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/files/FileUtils.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/files/FileUtils.kt @@ -315,9 +315,13 @@ object FileUtils { } val fileToSave = sequence { yield(File(root, fileName)) - yieldAll(generateSequence(1) { it + 1 }.map { - File(root, fileName.replace(".", "_$it.")) - }) + yieldAll( + generateSequence(1) { it + 1 }.map { + File( + root, fileName.replace(".", "_$it.") + ) + } + ) }.first { !it.exists() } val source = if (url == null) Uri.parse(src) else Uri.parse(url) return try { From 0cec4d898edcf9c40ecda29444cd7ec1f5fae06b Mon Sep 17 00:00:00 2001 From: MohitMaliFtechiz Date: Mon, 13 Jun 2022 18:41:11 +0530 Subject: [PATCH 6/8] playstore compilation flag --- .github/workflows/release.yml | 2 +- app/build.gradle.kts | 9 ++++ app/src/main/AndroidManifest.xml | 3 +- .../kiwixmobile/main/KiwixMainActivity.kt | 2 + .../library/LocalLibraryFragment.kt | 42 ++++++++++--------- .../library/OnlineLibraryFragment.kt | 18 +++++--- .../core/settings/CorePrefsFragment.java | 27 ++++++++---- .../core/utils/SharedPreferenceUtil.kt | 13 +++++- 8 files changed, 79 insertions(+), 37 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 78701ba78..04f8269fb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -61,4 +61,4 @@ jobs: KEY_ALIAS: ${{ secrets.KEY_ALIAS }} KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} KEY_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }} - run: ./gradlew publishReleaseBundle + run: ./gradlew publishPlayStoreBundle diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9b9db8b5a..72702c9af 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -44,6 +44,7 @@ android { resValue("string", "app_search_string", "Search Kiwix") versionCode = generateVersionCode() versionName = generateVersionName() + manifestPlaceholders["permission"] = "android.permission.MANAGE_EXTERNAL_STORAGE" } lintOptions { isCheckDependencies = true @@ -53,14 +54,22 @@ android { getByName("debug") { multiDexKeepProguard = file("multidex-instrumentation-config.pro") buildConfigField("boolean", "KIWIX_ERROR_ACTIVITY", "false") + buildConfigField("boolean", "IS_PLAYSTORE", "false") } getByName("release") { buildConfigField("boolean", "KIWIX_ERROR_ACTIVITY", "true") + buildConfigField("boolean", "IS_PLAYSTORE", "false") if (properties.containsKey("disableSigning")) { signingConfig = null } } + create("playStore") { + initWith(getByName("release")) + matchingFallbacks = listOf("release") + buildConfigField("boolean", "IS_PLAYSTORE", "true") + manifestPlaceholders["permission"] = "android.permission.placeholder" + } } bundle { language { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3bc1f39af..9d8739a8b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,8 +6,7 @@ - + diff --git a/app/src/main/java/org/kiwix/kiwixmobile/main/KiwixMainActivity.kt b/app/src/main/java/org/kiwix/kiwixmobile/main/KiwixMainActivity.kt index 4bf34b77e..e724d14e6 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/main/KiwixMainActivity.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/main/KiwixMainActivity.kt @@ -33,6 +33,7 @@ import kotlinx.android.synthetic.main.activity_kiwix_main.bottom_nav_view import kotlinx.android.synthetic.main.activity_kiwix_main.drawer_nav_view import kotlinx.android.synthetic.main.activity_kiwix_main.navigation_container import kotlinx.android.synthetic.main.activity_kiwix_main.reader_drawer_nav_view +import org.kiwix.kiwixmobile.BuildConfig import org.kiwix.kiwixmobile.R import org.kiwix.kiwixmobile.core.base.FragmentActivityExtensions import org.kiwix.kiwixmobile.core.di.components.CoreComponent @@ -100,6 +101,7 @@ class KiwixMainActivity : CoreMainActivity() { if (sharedPreferenceUtil.showIntro()) { navigate(KiwixReaderFragmentDirections.actionReaderFragmentToIntroFragment()) } + sharedPreferenceUtil.setIsPlayStoreBuildType(BuildConfig.IS_PLAYSTORE) } override fun onSupportActionModeStarted(mode: ActionMode) { 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 ba91a0451..7add89e02 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 @@ -284,26 +284,30 @@ class LocalLibraryFragment : BaseFragment() { REQUEST_STORAGE_PERMISSION ) } else { - 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, - { - this.activity?.let(FragmentActivity::navigateToSettings) - } - ) - } - } - } else { + if (sharedPreferenceUtil.isPlayStoreBuild) { requestFileSystemCheck() + } else { + 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, + { + this.activity?.let(FragmentActivity::navigateToSettings) + } + ) + } + } + } else { + requestFileSystemCheck() + } } } } 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 17fa04cc9..cc4ba3adf 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 @@ -300,16 +300,24 @@ class OnlineLibraryFragment : BaseFragment(), FragmentActivityExtensions { ) sharedPreferenceUtil.putStoragePosition(INTERNAL_SELECT_POSITION) } else { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - val view = LayoutInflater.from(activity).inflate(R.layout.select_folder_dialog, null) - dialogShower.show(SelectFolder { view }, ::selectFolder) + if (sharedPreferenceUtil.isPlayStoreBuild) { + setExternalStoragePath(storageDevice) } else { - sharedPreferenceUtil.putPrefStorage(storageDevice.name) - sharedPreferenceUtil.putStoragePosition(EXTERNAL_SELECT_POSITION) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + val view = LayoutInflater.from(activity).inflate(R.layout.select_folder_dialog, null) + dialogShower.show(SelectFolder { view }, ::selectFolder) + } else { + setExternalStoragePath(storageDevice) + } } } } + private fun setExternalStoragePath(storageDevice: StorageDevice) { + sharedPreferenceUtil.putPrefStorage(storageDevice.name) + sharedPreferenceUtil.putStoragePosition(EXTERNAL_SELECT_POSITION) + } + private fun selectFolder() { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) intent.addFlags( 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 7b7cebb82..e31627df5 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 @@ -292,21 +292,30 @@ public abstract class CorePrefsFragment extends PreferenceFragmentCompat impleme findPreference(PREF_STORAGE).setTitle(getString(R.string.internal_storage)); sharedPreferenceUtil.putStoragePosition(INTERNAL_SELECT_POSITION); } else { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - @SuppressLint("InflateParams") View view = LayoutInflater.from(getActivity()).inflate(R.layout.select_folder_dialog, null); - alertDialogShower.show(new KiwixDialog.SelectFolder(() -> view), () -> { - selectFolder(); - return Unit.INSTANCE; - }); + if (sharedPreferenceUtil.isPlayStoreBuild()) { + setExternalStoragePath(storageDevice); } else { - sharedPreferenceUtil.putPrefStorage(storageDevice.getName()); - findPreference(PREF_STORAGE).setTitle(getString(R.string.external_storage)); - sharedPreferenceUtil.putStoragePosition(EXTERNAL_SELECT_POSITION); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + @SuppressLint("InflateParams") View view = + LayoutInflater.from(getActivity()).inflate(R.layout.select_folder_dialog, null); + alertDialogShower.show(new KiwixDialog.SelectFolder(() -> view), () -> { + selectFolder(); + return Unit.INSTANCE; + }); + } else { + setExternalStoragePath(storageDevice); + } } } return Unit.INSTANCE; } + private void setExternalStoragePath(StorageDevice storageDevice) { + sharedPreferenceUtil.putPrefStorage(storageDevice.getName()); + findPreference(PREF_STORAGE).setTitle(getString(R.string.external_storage)); + sharedPreferenceUtil.putStoragePosition(EXTERNAL_SELECT_POSITION); + } + private void selectFolder() { Intent intent = new Intent(ACTION_OPEN_DOCUMENT_TREE); intent.addFlags( 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 b7d0b67db..2bc9badf9 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 @@ -70,6 +70,9 @@ class SharedPreferenceUtil @Inject constructor(val context: Context) { val prefExternalLinkPopup: Boolean get() = sharedPreferences.getBoolean(PREF_EXTERNAL_LINK_POPUP, true) + val isPlayStoreBuild: Boolean + get() = sharedPreferences.getBoolean(IS_PLAY_STORE_BUILD, false) + val prefLanguage: String get() = sharedPreferences.getString(PREF_LANG, "") ?: Locale.ROOT.toString() @@ -121,6 +124,10 @@ class SharedPreferenceUtil @Inject constructor(val context: Context) { sharedPreferences.edit { putInt(STORAGE_POSITION, pos) } } + fun setIsPlayStoreBuildType(isPlayStoreBuildType: Boolean) { + sharedPreferences.edit { putBoolean(IS_PLAY_STORE_BUILD, isPlayStoreBuildType) } + } + fun putPrefFullScreen(fullScreen: Boolean) = sharedPreferences.edit { putBoolean(PREF_FULLSCREEN, fullScreen) } @@ -174,7 +181,10 @@ class SharedPreferenceUtil @Inject constructor(val context: Context) { } fun getPublicDirectoryPath(path: String): String = - path.substringBefore(context.getString(R.string.android_directory_seperator)) + if (isPlayStoreBuild) + path + else + path.substringBefore(context.getString(R.string.android_directory_seperator)) companion object { // Prefs @@ -197,5 +207,6 @@ class SharedPreferenceUtil @Inject constructor(val context: Context) { 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" + private const val IS_PLAY_STORE_BUILD = "is_play_store_build" } } From f15cdfeb92913d74c86a40d3af37b24d603768d6 Mon Sep 17 00:00:00 2001 From: MohitMaliFtechiz Date: Tue, 14 Jun 2022 17:15:24 +0530 Subject: [PATCH 7/8] hide file picker in playstore build --- .../nav/destination/library/LocalLibraryFragment.kt | 9 +++++++++ .../kiwix/kiwixmobile/core/utils/SharedPreferenceUtil.kt | 6 +++++- 2 files changed, 14 insertions(+), 1 deletion(-) 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 7add89e02..fed3e9f82 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 @@ -150,6 +150,15 @@ class LocalLibraryFragment : BaseFragment() { go_to_downloads_button_no_files.setOnClickListener { offerAction(FileSelectActions.UserClickedDownloadBooksButton) } + hideFilePickerButton() + } + + private fun hideFilePickerButton() { + if (sharedPreferenceUtil.isPlayStoreBuild) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + select_file.visibility = View.GONE + } + } select_file.setOnClickListener { showFileChooser() 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 2bc9badf9..3e4520155 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 @@ -19,6 +19,7 @@ package org.kiwix.kiwixmobile.core.utils import android.content.Context import android.content.SharedPreferences +import android.os.Build import android.preference.PreferenceManager import androidx.appcompat.app.AppCompatDelegate import androidx.core.content.ContextCompat.getExternalFilesDirs @@ -182,7 +183,10 @@ class SharedPreferenceUtil @Inject constructor(val context: Context) { fun getPublicDirectoryPath(path: String): String = if (isPlayStoreBuild) - path + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) + path + else + path.substringBefore(context.getString(R.string.android_directory_seperator)) else path.substringBefore(context.getString(R.string.android_directory_seperator)) From 8edebf3390edabbc872a6a2ef612f3c32b7a9fb1 Mon Sep 17 00:00:00 2001 From: MohitMaliFtechiz Date: Tue, 21 Jun 2022 16:07:35 +0530 Subject: [PATCH 8/8] Fix lint error --- app/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 72702c9af..8e728b7f8 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -66,7 +66,7 @@ android { } create("playStore") { initWith(getByName("release")) - matchingFallbacks = listOf("release") + setMatchingFallbacks("release") buildConfigField("boolean", "IS_PLAYSTORE", "true") manifestPlaceholders["permission"] = "android.permission.placeholder" }