From fca42c79a867b87b11de7249140ccff4d34d7f3d Mon Sep 17 00:00:00 2001 From: tom5079 Date: Fri, 25 Sep 2020 15:39:07 +0900 Subject: [PATCH] Updated startActivityForResult to launchers --- .../java/xyz/quaver/pupil/ui/BaseActivity.kt | 23 ++-- .../java/xyz/quaver/pupil/ui/MainActivity.kt | 38 +++--- .../xyz/quaver/pupil/ui/SettingsActivity.kt | 29 ---- .../dialog/DownloadLocationDialogFragment.kt | 127 +++++++++--------- .../pupil/ui/fragment/SettingsFragment.kt | 33 ++--- app/src/main/res/values/ids.xml | 7 - 6 files changed, 104 insertions(+), 153 deletions(-) diff --git a/app/src/main/java/xyz/quaver/pupil/ui/BaseActivity.kt b/app/src/main/java/xyz/quaver/pupil/ui/BaseActivity.kt index 5963073c..96d8b3b3 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/BaseActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/BaseActivity.kt @@ -23,6 +23,7 @@ import android.content.Intent import android.os.Bundle import android.os.PersistableBundle import android.view.WindowManager +import androidx.activity.result.contract.ActivityResultContracts import androidx.annotation.CallSuper import androidx.appcompat.app.AppCompatActivity import xyz.quaver.pupil.R @@ -34,6 +35,13 @@ open class BaseActivity : AppCompatActivity() { private var locked: Boolean = true + private val lockLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + if (it.resultCode == Activity.RESULT_OK) + locked = false + else + finish() + } + @CallSuper override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) { super.onCreate(savedInstanceState, persistentState) @@ -53,20 +61,7 @@ open class BaseActivity : AppCompatActivity() { window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE) if (locked) - startActivityForResult(Intent(this, LockActivity::class.java), R.id.request_lock.normalizeID()) - } - - @CallSuper - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - when(requestCode) { - R.id.request_lock.normalizeID() -> { - if (resultCode == Activity.RESULT_OK) - locked = false - else - finish() - } - else -> super.onActivityResult(requestCode, resultCode, data) - } + lockLauncher.launch(Intent(this, LockActivity::class.java)) } } \ No newline at end of file diff --git a/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt b/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt index 207d040e..32f34979 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt @@ -23,7 +23,10 @@ import android.content.Intent import android.net.Uri import android.os.Bundle import android.text.InputType -import android.view.* +import android.view.KeyEvent +import android.view.MenuItem +import android.view.MotionEvent +import android.view.View import android.widget.* import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatDelegate @@ -50,9 +53,12 @@ import xyz.quaver.pupil.services.DownloadService import xyz.quaver.pupil.types.* import xyz.quaver.pupil.ui.dialog.DownloadLocationDialogFragment import xyz.quaver.pupil.ui.dialog.GalleryDialog -import xyz.quaver.pupil.util.* +import xyz.quaver.pupil.util.ItemClickSupport +import xyz.quaver.pupil.util.Preferences +import xyz.quaver.pupil.util.checkUpdate import xyz.quaver.pupil.util.downloader.Cache import xyz.quaver.pupil.util.downloader.DownloadManager +import xyz.quaver.pupil.util.restore import kotlin.math.abs import kotlin.math.ceil import kotlin.math.min @@ -95,7 +101,6 @@ class MainActivity : private var loadingJob: Job? = null private var currentPage = 0 - override fun onCreate(savedInstanceState: Bundle?) { AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) super.onCreate(savedInstanceState) @@ -137,6 +142,17 @@ class MainActivity : } } + override fun onResume() { + super.onResume() + + runOnUiThread { + cancelFetch() + clearGalleries() + fetchGalleries(query, sortMode) + loadBlocks() + } + } + override fun onDestroy() { super.onDestroy() @@ -180,20 +196,6 @@ class MainActivity : } } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - when(requestCode) { - R.id.request_settings.normalizeID() -> { - runOnUiThread { - cancelFetch() - clearGalleries() - fetchGalleries(query, sortMode) - loadBlocks() - } - } - else -> super.onActivityResult(requestCode, resultCode, data) - } - } - private fun initView() { var prevP1 = 0 main_appbar_layout.addOnOffsetChangedListener( @@ -716,7 +718,7 @@ class MainActivity : fun onActionMenuItemSelected(item: MenuItem?) { when(item?.itemId) { - R.id.main_menu_settings -> startActivityForResult(Intent(this@MainActivity, SettingsActivity::class.java), R.id.request_settings.normalizeID()) + R.id.main_menu_settings -> startActivity(Intent(this@MainActivity, SettingsActivity::class.java)) R.id.main_menu_thin -> { val thin = !item.isChecked diff --git a/app/src/main/java/xyz/quaver/pupil/ui/SettingsActivity.kt b/app/src/main/java/xyz/quaver/pupil/ui/SettingsActivity.kt index 7e797ac5..38685e4f 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/SettingsActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/SettingsActivity.kt @@ -18,24 +18,10 @@ package xyz.quaver.pupil.ui -import android.annotation.SuppressLint -import android.app.Activity -import android.content.Intent -import android.content.pm.PackageManager import android.os.Bundle import android.view.MenuItem -import android.view.WindowManager -import androidx.appcompat.app.AppCompatActivity -import com.google.android.material.snackbar.Snackbar -import kotlinx.serialization.decodeFromString -import kotlinx.serialization.json.Json import xyz.quaver.pupil.R -import xyz.quaver.pupil.favorites -import xyz.quaver.pupil.ui.fragment.LockSettingsFragment import xyz.quaver.pupil.ui.fragment.SettingsFragment -import xyz.quaver.pupil.util.Preferences -import xyz.quaver.pupil.util.normalizeID -import java.nio.charset.Charset class SettingsActivity : BaseActivity() { @@ -56,19 +42,4 @@ class SettingsActivity : BaseActivity() { return true } - - @SuppressLint("InlinedApi") - override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { - when (requestCode) { - R.id.request_write_permission_and_saf.normalizeID() -> { - if (grantResults.firstOrNull() == PackageManager.PERMISSION_GRANTED) { - val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).apply { - putExtra("android.content.extra.SHOW_ADVANCED", true) - } - - startActivityForResult(intent, R.id.request_download_folder.normalizeID()) - } - } - } - } } \ No newline at end of file diff --git a/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadLocationDialogFragment.kt b/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadLocationDialogFragment.kt index 042854e2..0b4b1904 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadLocationDialogFragment.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadLocationDialogFragment.kt @@ -26,11 +26,13 @@ import android.os.Build import android.os.Bundle import android.view.View import android.widget.LinearLayout +import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AlertDialog import androidx.core.content.ContextCompat import androidx.core.net.toUri import androidx.fragment.app.DialogFragment import com.google.android.material.snackbar.Snackbar +import kotlinx.android.synthetic.main.dialog_download_folder_name.view.* import kotlinx.android.synthetic.main.item_download_folder.view.* import net.rdrei.android.dirchooser.DirectoryChooserActivity import net.rdrei.android.dirchooser.DirectoryChooserConfig @@ -40,12 +42,70 @@ import xyz.quaver.pupil.util.Preferences import xyz.quaver.pupil.util.byteToString import xyz.quaver.pupil.util.downloader.DownloadManager import xyz.quaver.pupil.util.migrate -import xyz.quaver.pupil.util.normalizeID import java.io.File class DownloadLocationDialogFragment : DialogFragment() { private val entries = mutableMapOf() + private val requestDownloadFolderLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + if (it.resultCode == Activity.RESULT_OK) { + val activity = activity ?: return@registerForActivityResult + val context = context ?: return@registerForActivityResult + val dialog = dialog ?: return@registerForActivityResult + + it.data?.data?.also { uri -> + val takeFlags: Int = + activity.intent.flags and + (Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION) + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) + context.contentResolver.takePersistableUriPermission(uri, takeFlags) + + if (kotlin.runCatching { FileX(context, uri).canWrite() }.getOrDefault(false)) { + entries[null]?.message?.text = uri.toString() + Preferences["download_folder"] = uri.toString() + } else { + Snackbar.make( + dialog.window!!.decorView.rootView, + R.string.settings_download_folder_not_writable, + Snackbar.LENGTH_LONG + ).show() + + val downloadFolder = DownloadManager.getInstance(context).downloadFolder.canonicalPath + val key = entries.keys.firstOrNull { it?.canonicalPath == downloadFolder } + entries[key]!!.button.isChecked = true + if (key == null) entries[key]!!.location_available.text = downloadFolder + } + } + } + } + + private val requestDownloadFolderOldLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + val context = context ?: return@registerForActivityResult + val dialog = dialog ?: return@registerForActivityResult + + if (it.resultCode == DirectoryChooserActivity.RESULT_CODE_DIR_SELECTED) { + val directory = it.data?.getStringExtra(DirectoryChooserActivity.RESULT_SELECTED_DIR)!! + + if (!File(directory).canWrite()) { + Snackbar.make( + dialog.window!!.decorView.rootView, + R.string.settings_download_folder_not_writable, + Snackbar.LENGTH_LONG + ).show() + + val downloadFolder = DownloadManager.getInstance(context).downloadFolder.canonicalPath + val key = entries.keys.firstOrNull { it?.canonicalPath == downloadFolder } + entries[key]!!.button.isChecked = true + if (key == null) entries[key]!!.location_available.text = downloadFolder + } + else { + entries[null]?.location_available?.text = directory + Preferences["download_folder"] = File(directory).toURI().toString() + } + } + } + @SuppressLint("InflateParams") private fun build() : View? { val context = context ?: return null @@ -90,7 +150,7 @@ class DownloadLocationDialogFragment : DialogFragment() { putExtra("android.content.extra.SHOW_ADVANCED", true) } - startActivityForResult(intent, R.id.request_download_folder.normalizeID()) + requestDownloadFolderLauncher.launch(intent) } else { // Can't use SAF on old Androids! val config = DirectoryChooserConfig.builder() .newDirectoryName("Pupil") @@ -101,7 +161,7 @@ class DownloadLocationDialogFragment : DialogFragment() { putExtra(DirectoryChooserActivity.EXTRA_CONFIG, config) } - startActivityForResult(intent, R.id.request_download_folder_old.normalizeID()) + requestDownloadFolderOldLauncher.launch(intent) } } entries[null] = this @@ -132,65 +192,4 @@ class DownloadLocationDialogFragment : DialogFragment() { return builder.create() } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - when (requestCode) { - R.id.request_download_folder.normalizeID() -> { - if (resultCode == Activity.RESULT_OK) { - val activity = activity ?: return - val context = context ?: return - val dialog = dialog ?: return - - data?.data?.also { uri -> - val takeFlags: Int = - activity.intent.flags and - (Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION) - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) - context.contentResolver.takePersistableUriPermission(uri, takeFlags) - - if (kotlin.runCatching { FileX(context, uri).canWrite() }.getOrDefault(false)) - Preferences["download_folder"] = uri.toString() - else { - Snackbar.make( - dialog.window!!.decorView.rootView, - R.string.settings_download_folder_not_writable, - Snackbar.LENGTH_LONG - ).show() - - val downloadFolder = DownloadManager.getInstance(context).downloadFolder.canonicalPath - val key = entries.keys.firstOrNull { it?.canonicalPath == downloadFolder } - entries[key]!!.button.isChecked = true - if (key == null) entries[key]!!.location_available.text = downloadFolder - } - } - } - } - R.id.request_download_folder_old.normalizeID() -> { - val context = context ?: return - val dialog = dialog ?: return - - if (resultCode == DirectoryChooserActivity.RESULT_CODE_DIR_SELECTED) { - val directory = data?.getStringExtra(DirectoryChooserActivity.RESULT_SELECTED_DIR)!! - - if (!File(directory).canWrite()) { - Snackbar.make( - dialog.window!!.decorView.rootView, - R.string.settings_download_folder_not_writable, - Snackbar.LENGTH_LONG - ).show() - - val downloadFolder = DownloadManager.getInstance(context).downloadFolder.canonicalPath - val key = entries.keys.firstOrNull { it?.canonicalPath == downloadFolder } - entries[key]!!.button.isChecked = true - if (key == null) entries[key]!!.location_available.text = downloadFolder - } - else - Preferences["download_folder"] = File(directory).toURI().toString() - } - } - else -> super.onActivityResult(requestCode, resultCode, data) - } - } - } \ No newline at end of file diff --git a/app/src/main/java/xyz/quaver/pupil/ui/fragment/SettingsFragment.kt b/app/src/main/java/xyz/quaver/pupil/ui/fragment/SettingsFragment.kt index 3514ff42..8345dc45 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/fragment/SettingsFragment.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/fragment/SettingsFragment.kt @@ -22,25 +22,21 @@ import android.app.Activity import android.content.* import android.os.Bundle import android.widget.Toast +import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatDelegate import androidx.preference.Preference import androidx.preference.PreferenceCategory import androidx.preference.PreferenceFragmentCompat import androidx.preference.SwitchPreferenceCompat import com.google.android.gms.oss.licenses.OssLicensesMenuActivity -import com.google.android.material.snackbar.Snackbar -import kotlinx.serialization.decodeFromString -import kotlinx.serialization.json.Json import xyz.quaver.io.FileX import xyz.quaver.io.util.getChild import xyz.quaver.pupil.R -import xyz.quaver.pupil.favorites import xyz.quaver.pupil.ui.LockActivity import xyz.quaver.pupil.ui.SettingsActivity import xyz.quaver.pupil.ui.dialog.* import xyz.quaver.pupil.util.* import xyz.quaver.pupil.util.downloader.DownloadManager -import java.nio.charset.Charset class SettingsFragment : PreferenceFragmentCompat(), @@ -48,6 +44,16 @@ class SettingsFragment : Preference.OnPreferenceChangeListener, SharedPreferences.OnSharedPreferenceChangeListener { + private val lockLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + if (it.resultCode == Activity.RESULT_OK) { + parentFragmentManager + .beginTransaction() + .replace(R.id.settings, LockSettingsFragment()) + .addToBackStack("Lock") + .commitAllowingStateLoss() + } + } + override fun onResume() { super.onResume() @@ -89,7 +95,7 @@ class SettingsFragment : val intent = Intent(requireContext(), LockActivity::class.java).apply { putExtra("force", true) } - startActivityForResult(intent, R.id.request_lock.normalizeID()) + lockLauncher.launch(intent) } "mirrors" -> { MirrorDialog(requireContext()) @@ -267,19 +273,4 @@ class SettingsFragment : } } } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - when(requestCode) { - R.id.request_lock.normalizeID() -> { - if (resultCode == Activity.RESULT_OK) { - parentFragmentManager - .beginTransaction() - .replace(R.id.settings, LockSettingsFragment()) - .addToBackStack("Lock") - .commitAllowingStateLoss() - } - } - else -> super.onActivityResult(requestCode, resultCode, data) - } - } } \ No newline at end of file diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml index 820c1b4d..83022f36 100644 --- a/app/src/main/res/values/ids.xml +++ b/app/src/main/res/values/ids.xml @@ -1,13 +1,6 @@ - - - - - - -