diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/AdvancedSettingsFragment.kt b/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/AdvancedSettingsFragment.kt index 590287da3..abd14f66f 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/AdvancedSettingsFragment.kt +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/AdvancedSettingsFragment.kt @@ -11,7 +11,7 @@ import android.content.SharedPreferences import android.net.Uri import android.os.Build import android.os.Bundle -import android.util.Log +import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AlertDialog import androidx.preference.Preference 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.BuildConfig 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.common.FileUtils 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? ) } + 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?) { super.onCreate(icicle) addPreferencesFromResource(R.xml.prefs_screen_advanced) @@ -87,7 +104,7 @@ class AdvancedSettingsFragment : SubScreenFragment() { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT) .addCategory(Intent.CATEGORY_OPENABLE) .setType("application/octet-stream") - startActivityForResult(intent, REQUEST_CODE_GESTURE_LIBRARY) + libraryFilePicker.launch(intent) } .setNegativeButton(android.R.string.cancel, null) libfile = File(requireContext().filesDir.absolutePath + File.separator + JniLibName.JNI_LIB_IMPORT_FILE_NAME) @@ -101,16 +118,6 @@ class AdvancedSettingsFragment : SubScreenFragment() { 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) { if (libfile == null) return try { @@ -135,14 +142,14 @@ class AdvancedSettingsFragment : SubScreenFragment() { .replace(" ", "_") + "_backup.zip" ) .setType("application/zip") - startActivityForResult(intent, REQUEST_CODE_BACKUP) + backupFilePicker.launch(intent) } .setPositiveButton(android.R.string.cancel, null) .setNeutralButton(R.string.button_restore) { _, _ -> val intent = Intent(Intent.ACTION_OPEN_DOCUMENT) .addCategory(Intent.CATEGORY_OPENABLE) .setType("application/zip") - startActivityForResult(intent, REQUEST_CODE_RESTORE) + restoreFilePicker.launch(intent) } .show() 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 diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/LanguageSettingsFragment.kt b/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/LanguageSettingsFragment.kt index b5839541c..fe6944634 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/LanguageSettingsFragment.kt +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/LanguageSettingsFragment.kt @@ -12,6 +12,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.inputmethod.InputMethodSubtype +import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.SwitchCompat import androidx.core.content.edit @@ -35,6 +36,12 @@ class LanguageSettingsFragment : Fragment(R.layout.language_settings) { private lateinit var systemOnlySwitch: SwitchCompat 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?) { super.onCreate(savedInstanceState) sharedPreferences = DeviceProtectedUtils.getSharedPreferences(requireContext()) @@ -185,12 +192,7 @@ class LanguageSettingsFragment : Fragment(R.layout.language_settings) { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT) .addCategory(Intent.CATEGORY_OPENABLE) .setType("application/octet-stream") - startActivityForResult(intent, DICTIONARY_REQUEST_CODE) - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { - if (resultCode == Activity.RESULT_OK && requestCode == DICTIONARY_REQUEST_CODE) - listener?.onNewDictionary(resultData?.data) + dictionaryFilePicker.launch(intent) } } @@ -216,5 +218,4 @@ private fun Locale.languageConsideringZZ(): String { language } -private const val DICTIONARY_REQUEST_CODE = 96834 const val USER_DICTIONARY_SUFFIX = "user.dict" diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/SettingsFragment.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/SettingsFragment.java index d33af1b21..e1ba701dc 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/SettingsFragment.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/settings/SettingsFragment.java @@ -17,6 +17,8 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.inputmethod.InputMethodSubtype; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; @@ -51,7 +53,6 @@ public final class SettingsFragment extends PreferenceFragmentCompat { private static final int MENU_ABOUT = Menu.FIRST; // The second menu item id and order. 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 private final ArrayList crashReportFiles = new ArrayList<>(); @@ -166,7 +167,7 @@ public final class SettingsFragment extends PreferenceFragmentCompat { intent.addCategory(Intent.CATEGORY_OPENABLE); intent.putExtra(Intent.EXTRA_TITLE, "crash_reports.zip"); intent.setType("application/zip"); - startActivityForResult(intent, CRASH_REPORT_REQUEST_CODE); + crashReportFilePicker.launch(intent); }) .setNeutralButton("delete", (dialogInterface, i) -> { for (File file : crashReportFiles) { @@ -177,17 +178,19 @@ public final class SettingsFragment extends PreferenceFragmentCompat { .show(); } - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (resultCode != Activity.RESULT_OK || data == null) return; - if (requestCode != CRASH_REPORT_REQUEST_CODE) return; - if (crashReportFiles.isEmpty()) return; - final Uri uri = data.getData(); - if (uri == null) return; + final ActivityResultLauncher crashReportFilePicker = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), (intent) -> { + if (intent.getResultCode() != Activity.RESULT_OK || intent.getData() == null) return; + final Uri uri = intent.getData().getData(); + if (uri != null) + saveCrashReport(uri); + }); + + private void saveCrashReport(final Uri uri) { + if (uri == null || crashReportFiles.isEmpty()) return; final OutputStream os; try { os = requireContext().getContentResolver().openOutputStream(uri); + if (os == null) return; final BufferedOutputStream bos = new BufferedOutputStream(os); final ZipOutputStream z = new ZipOutputStream(bos); for (File file : crashReportFiles) {