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.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

View file

@ -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"

View file

@ -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<File> 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<Intent> 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) {