switch from deprecated startActivityForResult to registerForActivityResult

This commit is contained in:
Helium314 2023-11-02 21:02:11 +01:00
parent a69656a446
commit 230d5fcb03
3 changed files with 43 additions and 36 deletions

View file

@ -11,7 +11,7 @@ import android.content.SharedPreferences
import android.net.Uri import android.net.Uri
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.util.Log import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.preference.Preference import androidx.preference.Preference
import org.dslul.openboard.inputmethod.dictionarypack.DictionaryPackConstants import org.dslul.openboard.inputmethod.dictionarypack.DictionaryPackConstants
@ -19,7 +19,6 @@ import org.dslul.openboard.inputmethod.keyboard.KeyboardLayoutSet
import org.dslul.openboard.inputmethod.latin.AudioAndHapticFeedbackManager import org.dslul.openboard.inputmethod.latin.AudioAndHapticFeedbackManager
import org.dslul.openboard.inputmethod.latin.BuildConfig import org.dslul.openboard.inputmethod.latin.BuildConfig
import org.dslul.openboard.inputmethod.latin.R import org.dslul.openboard.inputmethod.latin.R
import org.dslul.openboard.inputmethod.latin.RichInputMethodManager
import org.dslul.openboard.inputmethod.latin.SystemBroadcastReceiver import org.dslul.openboard.inputmethod.latin.SystemBroadcastReceiver
import org.dslul.openboard.inputmethod.latin.common.FileUtils import org.dslul.openboard.inputmethod.latin.common.FileUtils
import org.dslul.openboard.inputmethod.latin.define.JniLibName import org.dslul.openboard.inputmethod.latin.define.JniLibName
@ -55,6 +54,24 @@ class AdvancedSettingsFragment : SubScreenFragment() {
// possibly some obfuscation thing that occurred after upgrading to gradle 8? // possibly some obfuscation thing that occurred after upgrading to gradle 8?
) } ) }
private val libraryFilePicker = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (it.resultCode != Activity.RESULT_OK) return@registerForActivityResult
val uri = it.data?.data ?: return@registerForActivityResult
copyLibrary(uri)
}
private val backupFilePicker = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (it.resultCode != Activity.RESULT_OK) return@registerForActivityResult
val uri = it.data?.data ?: return@registerForActivityResult
backup(uri)
}
private val restoreFilePicker = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (it.resultCode != Activity.RESULT_OK) return@registerForActivityResult
val uri = it.data?.data ?: return@registerForActivityResult
restore(uri)
}
override fun onCreate(icicle: Bundle?) { override fun onCreate(icicle: Bundle?) {
super.onCreate(icicle) super.onCreate(icicle)
addPreferencesFromResource(R.xml.prefs_screen_advanced) addPreferencesFromResource(R.xml.prefs_screen_advanced)
@ -87,7 +104,7 @@ class AdvancedSettingsFragment : SubScreenFragment() {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT) val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
.addCategory(Intent.CATEGORY_OPENABLE) .addCategory(Intent.CATEGORY_OPENABLE)
.setType("application/octet-stream") .setType("application/octet-stream")
startActivityForResult(intent, REQUEST_CODE_GESTURE_LIBRARY) libraryFilePicker.launch(intent)
} }
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
libfile = File(requireContext().filesDir.absolutePath + File.separator + JniLibName.JNI_LIB_IMPORT_FILE_NAME) libfile = File(requireContext().filesDir.absolutePath + File.separator + JniLibName.JNI_LIB_IMPORT_FILE_NAME)
@ -101,16 +118,6 @@ class AdvancedSettingsFragment : SubScreenFragment() {
return true return true
} }
override fun onActivityResult(requestCode: Int, resultCode: Int, result: Intent?) {
val uri = result?.data
if (resultCode != Activity.RESULT_OK || uri == null) return
when (requestCode) {
REQUEST_CODE_GESTURE_LIBRARY -> copyLibrary(uri)
REQUEST_CODE_BACKUP -> backup(uri)
REQUEST_CODE_RESTORE -> restore(uri)
}
}
private fun copyLibrary(uri: Uri) { private fun copyLibrary(uri: Uri) {
if (libfile == null) return if (libfile == null) return
try { try {
@ -135,14 +142,14 @@ class AdvancedSettingsFragment : SubScreenFragment() {
.replace(" ", "_") + "_backup.zip" .replace(" ", "_") + "_backup.zip"
) )
.setType("application/zip") .setType("application/zip")
startActivityForResult(intent, REQUEST_CODE_BACKUP) backupFilePicker.launch(intent)
} }
.setPositiveButton(android.R.string.cancel, null) .setPositiveButton(android.R.string.cancel, null)
.setNeutralButton(R.string.button_restore) { _, _ -> .setNeutralButton(R.string.button_restore) { _, _ ->
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT) val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
.addCategory(Intent.CATEGORY_OPENABLE) .addCategory(Intent.CATEGORY_OPENABLE)
.setType("application/zip") .setType("application/zip")
startActivityForResult(intent, REQUEST_CODE_RESTORE) restoreFilePicker.launch(intent)
} }
.show() .show()
return true return true
@ -232,7 +239,3 @@ class AdvancedSettingsFragment : SubScreenFragment() {
} }
} }
} }
private const val REQUEST_CODE_GESTURE_LIBRARY = 570289
private const val REQUEST_CODE_BACKUP = 98665973
private const val REQUEST_CODE_RESTORE = 98665974

View file

@ -12,6 +12,7 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.inputmethod.InputMethodSubtype import android.view.inputmethod.InputMethodSubtype
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.SwitchCompat import androidx.appcompat.widget.SwitchCompat
import androidx.core.content.edit import androidx.core.content.edit
@ -35,6 +36,12 @@ class LanguageSettingsFragment : Fragment(R.layout.language_settings) {
private lateinit var systemOnlySwitch: SwitchCompat private lateinit var systemOnlySwitch: SwitchCompat
private val dictionaryLocales by lazy { getDictionaryLocales(requireContext()).mapTo(HashSet()) { it.languageConsideringZZ() } } private val dictionaryLocales by lazy { getDictionaryLocales(requireContext()).mapTo(HashSet()) { it.languageConsideringZZ() } }
private val dictionaryFilePicker = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (it.resultCode != Activity.RESULT_OK) return@registerForActivityResult
val uri = it.data?.data ?: return@registerForActivityResult
listener?.onNewDictionary(uri)
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
sharedPreferences = DeviceProtectedUtils.getSharedPreferences(requireContext()) sharedPreferences = DeviceProtectedUtils.getSharedPreferences(requireContext())
@ -185,12 +192,7 @@ class LanguageSettingsFragment : Fragment(R.layout.language_settings) {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT) val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
.addCategory(Intent.CATEGORY_OPENABLE) .addCategory(Intent.CATEGORY_OPENABLE)
.setType("application/octet-stream") .setType("application/octet-stream")
startActivityForResult(intent, DICTIONARY_REQUEST_CODE) dictionaryFilePicker.launch(intent)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
if (resultCode == Activity.RESULT_OK && requestCode == DICTIONARY_REQUEST_CODE)
listener?.onNewDictionary(resultData?.data)
} }
} }
@ -216,5 +218,4 @@ private fun Locale.languageConsideringZZ(): String {
language language
} }
private const val DICTIONARY_REQUEST_CODE = 96834
const val USER_DICTIONARY_SUFFIX = "user.dict" const val USER_DICTIONARY_SUFFIX = "user.dict"

View file

@ -17,6 +17,8 @@ import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.inputmethod.InputMethodSubtype; import android.view.inputmethod.InputMethodSubtype;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.ActionBar;
@ -51,7 +53,6 @@ public final class SettingsFragment extends PreferenceFragmentCompat {
private static final int MENU_ABOUT = Menu.FIRST; private static final int MENU_ABOUT = Menu.FIRST;
// The second menu item id and order. // The second menu item id and order.
private static final int MENU_HELP_AND_FEEDBACK = Menu.FIRST + 1; private static final int MENU_HELP_AND_FEEDBACK = Menu.FIRST + 1;
private static final int CRASH_REPORT_REQUEST_CODE = 985287532;
// for storing crash report files, so onActivityResult can actually use them // for storing crash report files, so onActivityResult can actually use them
private final ArrayList<File> crashReportFiles = new ArrayList<>(); private final ArrayList<File> crashReportFiles = new ArrayList<>();
@ -166,7 +167,7 @@ public final class SettingsFragment extends PreferenceFragmentCompat {
intent.addCategory(Intent.CATEGORY_OPENABLE); intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.putExtra(Intent.EXTRA_TITLE, "crash_reports.zip"); intent.putExtra(Intent.EXTRA_TITLE, "crash_reports.zip");
intent.setType("application/zip"); intent.setType("application/zip");
startActivityForResult(intent, CRASH_REPORT_REQUEST_CODE); crashReportFilePicker.launch(intent);
}) })
.setNeutralButton("delete", (dialogInterface, i) -> { .setNeutralButton("delete", (dialogInterface, i) -> {
for (File file : crashReportFiles) { for (File file : crashReportFiles) {
@ -177,17 +178,19 @@ public final class SettingsFragment extends PreferenceFragmentCompat {
.show(); .show();
} }
@Override final ActivityResultLauncher<Intent> crashReportFilePicker = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), (intent) -> {
public void onActivityResult(int requestCode, int resultCode, Intent data) { if (intent.getResultCode() != Activity.RESULT_OK || intent.getData() == null) return;
super.onActivityResult(requestCode, resultCode, data); final Uri uri = intent.getData().getData();
if (resultCode != Activity.RESULT_OK || data == null) return; if (uri != null)
if (requestCode != CRASH_REPORT_REQUEST_CODE) return; saveCrashReport(uri);
if (crashReportFiles.isEmpty()) return; });
final Uri uri = data.getData();
if (uri == null) return; private void saveCrashReport(final Uri uri) {
if (uri == null || crashReportFiles.isEmpty()) return;
final OutputStream os; final OutputStream os;
try { try {
os = requireContext().getContentResolver().openOutputStream(uri); os = requireContext().getContentResolver().openOutputStream(uri);
if (os == null) return;
final BufferedOutputStream bos = new BufferedOutputStream(os); final BufferedOutputStream bos = new BufferedOutputStream(os);
final ZipOutputStream z = new ZipOutputStream(bos); final ZipOutputStream z = new ZipOutputStream(bos);
for (File file : crashReportFiles) { for (File file : crashReportFiles) {