Refactor[intent]: use ActivityResultLauncher instead of request codes

This commit is contained in:
artdeell 2023-10-01 11:00:04 +03:00
parent 9484d0c52d
commit 27223c885a
7 changed files with 100 additions and 83 deletions

View File

@ -12,8 +12,8 @@ import android.view.View;
import android.widget.ImageButton; import android.widget.ImageButton;
import android.widget.Toast; import android.widget.Toast;
import androidx.activity.result.ActivityResultLauncher;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.core.app.ActivityCompat; import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
@ -25,16 +25,15 @@ import com.kdt.mcgui.ProgressLayout;
import com.kdt.mcgui.mcAccountSpinner; import com.kdt.mcgui.mcAccountSpinner;
import net.kdt.pojavlaunch.contextexecutor.ContextExecutor; import net.kdt.pojavlaunch.contextexecutor.ContextExecutor;
import net.kdt.pojavlaunch.fragments.MainMenuFragment; import net.kdt.pojavlaunch.contracts.OpenDocumentWithExtension;
import net.kdt.pojavlaunch.fragments.MicrosoftLoginFragment;
import net.kdt.pojavlaunch.extra.ExtraConstants; import net.kdt.pojavlaunch.extra.ExtraConstants;
import net.kdt.pojavlaunch.extra.ExtraCore; import net.kdt.pojavlaunch.extra.ExtraCore;
import net.kdt.pojavlaunch.extra.ExtraListener; import net.kdt.pojavlaunch.extra.ExtraListener;
import net.kdt.pojavlaunch.fragments.MainMenuFragment;
import net.kdt.pojavlaunch.fragments.MicrosoftLoginFragment;
import net.kdt.pojavlaunch.fragments.SelectAuthFragment; import net.kdt.pojavlaunch.fragments.SelectAuthFragment;
import net.kdt.pojavlaunch.modloaders.modpacks.ModloaderInstallTracker; import net.kdt.pojavlaunch.modloaders.modpacks.ModloaderInstallTracker;
import net.kdt.pojavlaunch.modloaders.modpacks.imagecache.IconCacheJanitor; import net.kdt.pojavlaunch.modloaders.modpacks.imagecache.IconCacheJanitor;
import net.kdt.pojavlaunch.multirt.MultiRTConfigDialog;
import net.kdt.pojavlaunch.prefs.LauncherPreferences; import net.kdt.pojavlaunch.prefs.LauncherPreferences;
import net.kdt.pojavlaunch.prefs.screens.LauncherPreferenceFragment; import net.kdt.pojavlaunch.prefs.screens.LauncherPreferenceFragment;
import net.kdt.pojavlaunch.progresskeeper.ProgressKeeper; import net.kdt.pojavlaunch.progresskeeper.ProgressKeeper;
@ -47,6 +46,11 @@ import net.kdt.pojavlaunch.value.launcherprofiles.MinecraftProfile;
public class LauncherActivity extends BaseActivity { public class LauncherActivity extends BaseActivity {
public static final String SETTING_FRAGMENT_TAG = "SETTINGS_FRAGMENT"; public static final String SETTING_FRAGMENT_TAG = "SETTINGS_FRAGMENT";
public final ActivityResultLauncher<Object> modInstallerLauncher =
registerForActivityResult(new OpenDocumentWithExtension("jar"), (data)->{
if(data != null) Tools.launchModInstaller(this, data);
});
private final int REQUEST_STORAGE_REQUEST_CODE = 1; private final int REQUEST_STORAGE_REQUEST_CODE = 1;
private final Object mLockStoragePerm = new Object(); private final Object mLockStoragePerm = new Object();
@ -219,19 +223,6 @@ public class LauncherActivity extends BaseActivity {
getSupportFragmentManager().unregisterFragmentLifecycleCallbacks(mFragmentCallbackListener); getSupportFragmentManager().unregisterFragmentLifecycleCallbacks(mFragmentCallbackListener);
} }
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode != RESULT_OK) return;
if(requestCode == Tools.RUN_MOD_INSTALLER && data != null){
Tools.launchModInstaller(this, data);
return;
}
if(requestCode == MultiRTConfigDialog.MULTIRT_PICK_RUNTIME && data != null){
Tools.installRuntimeFromUri(this, data.getData());
}
}
/** Custom implementation to feel more natural when a backstack isn't present */ /** Custom implementation to feel more natural when a backstack isn't present */
@Override @Override
public void onBackPressed() { public void onBackPressed() {

View File

@ -33,7 +33,6 @@ import android.util.DisplayMetrics;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
import android.view.WindowManager; import android.view.WindowManager;
import android.webkit.MimeTypeMap;
import android.widget.EditText; import android.widget.EditText;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
@ -117,7 +116,6 @@ public final class Tools {
public static String OBSOLETE_RESOURCES_PATH; public static String OBSOLETE_RESOURCES_PATH;
public static String CTRLMAP_PATH; public static String CTRLMAP_PATH;
public static String CTRLDEF_FILE; public static String CTRLDEF_FILE;
public static final int RUN_MOD_INSTALLER = 2050;
private static RenderersList sCompatibleRenderers; private static RenderersList sCompatibleRenderers;
@ -928,12 +926,10 @@ public final class Tools {
} }
if(!customJavaArgs){ // Launch the intent to get the jar file if(!customJavaArgs){ // Launch the intent to get the jar file
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); if(!(activity instanceof LauncherActivity))
intent.addCategory(Intent.CATEGORY_OPENABLE); throw new IllegalStateException("Cannot start Mod Installer without LauncherActivity");
String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension("jar"); LauncherActivity launcherActivity = (LauncherActivity)activity;
if(mimeType == null) mimeType = "*/*"; launcherActivity.modInstallerLauncher.launch(null);
intent.setType(mimeType);
activity.startActivityForResult(intent, RUN_MOD_INSTALLER);
return; return;
} }
@ -967,10 +963,9 @@ public final class Tools {
} }
/** Copy the mod file, and launch the mod installer activity */ /** Copy the mod file, and launch the mod installer activity */
public static void launchModInstaller(Activity activity, @NonNull Intent data){ public static void launchModInstaller(Activity activity, @NonNull Uri uri){
final ProgressDialog alertDialog = getWaitingDialog(activity); final ProgressDialog alertDialog = getWaitingDialog(activity);
final Uri uri = data.getData();
alertDialog.setMessage(activity.getString(R.string.multirt_progress_caching)); alertDialog.setMessage(activity.getString(R.string.multirt_progress_caching));
sExecutorService.execute(() -> { sExecutorService.execute(() -> {
try { try {
@ -994,18 +989,18 @@ public final class Tools {
} }
public static void installRuntimeFromUri(Activity activity, Uri uri){ public static void installRuntimeFromUri(Context context, Uri uri){
sExecutorService.execute(() -> { sExecutorService.execute(() -> {
try { try {
String name = getFileName(activity, uri); String name = getFileName(context, uri);
MultiRTUtils.installRuntimeNamed( MultiRTUtils.installRuntimeNamed(
NATIVE_LIB_DIR, NATIVE_LIB_DIR,
activity.getContentResolver().openInputStream(uri), context.getContentResolver().openInputStream(uri),
name); name);
MultiRTUtils.postPrepare(name); MultiRTUtils.postPrepare(name);
} catch (IOException e) { } catch (IOException e) {
Tools.showError(activity, e); Tools.showError(context, e);
} }
}); });
} }

View File

@ -0,0 +1,45 @@
package net.kdt.pojavlaunch.contracts;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.webkit.MimeTypeMap;
import androidx.activity.result.contract.ActivityResultContract;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
// Android's OpenDocument contract is the basicmost crap that doesn't allow
// you to specify practically anything. So i made this instead.
public class OpenDocumentWithExtension extends ActivityResultContract<Object, Uri> {
private final String mimeType;
public OpenDocumentWithExtension(String extension) {
String extensionMimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
if(extensionMimeType == null) extensionMimeType = "*/*";
mimeType = extensionMimeType;
}
@NonNull
@Override
public Intent createIntent(@NonNull Context context, @NonNull Object input) {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType(mimeType);
return intent;
}
@Nullable
@Override
public final SynchronousResult<Uri> getSynchronousResult(@NonNull Context context,
@NonNull Object input) {
return null;
}
@Nullable
@Override
public final Uri parseResult(int resultCode, @Nullable Intent intent) {
if (intent == null || resultCode != Activity.RESULT_OK) return null;
return intent.getData();
}
}

View File

@ -1,22 +1,17 @@
package net.kdt.pojavlaunch.multirt; package net.kdt.pojavlaunch.multirt;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.content.DialogInterface; import android.content.Context;
import android.content.Intent;
import android.view.View;
import android.webkit.MimeTypeMap;
import android.widget.Button; import android.widget.Button;
import androidx.activity.result.ActivityResultLauncher;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import net.kdt.pojavlaunch.R; import net.kdt.pojavlaunch.R;
public class MultiRTConfigDialog { public class MultiRTConfigDialog {
public static final int MULTIRT_PICK_RUNTIME = 2048;
private AlertDialog mDialog; private AlertDialog mDialog;
private RecyclerView mDialogView; private RecyclerView mDialogView;
@ -33,7 +28,7 @@ public class MultiRTConfigDialog {
} }
/** Build the dialog behavior and style */ /** Build the dialog behavior and style */
public void prepare(Activity activity) { public void prepare(Context activity, ActivityResultLauncher<Object> installJvmLauncher) {
mDialogView = new RecyclerView(activity); mDialogView = new RecyclerView(activity);
mDialogView.setLayoutManager(new LinearLayoutManager(activity, LinearLayoutManager.VERTICAL, false)); mDialogView.setLayoutManager(new LinearLayoutManager(activity, LinearLayoutManager.VERTICAL, false));
RTRecyclerViewAdapter adapter = new RTRecyclerViewAdapter(); RTRecyclerViewAdapter adapter = new RTRecyclerViewAdapter();
@ -42,7 +37,7 @@ public class MultiRTConfigDialog {
mDialog = new AlertDialog.Builder(activity) mDialog = new AlertDialog.Builder(activity)
.setTitle(R.string.multirt_config_title) .setTitle(R.string.multirt_config_title)
.setView(mDialogView) .setView(mDialogView)
.setPositiveButton(R.string.multirt_config_add, (dialog, which) -> openRuntimeSelector(activity,MULTIRT_PICK_RUNTIME)) .setPositiveButton(R.string.multirt_config_add, (dialog, which) -> installJvmLauncher.launch(null))
.setNeutralButton(R.string.multirt_delete_runtime, null) .setNeutralButton(R.string.multirt_delete_runtime, null)
.create(); .create();
@ -56,13 +51,4 @@ public class MultiRTConfigDialog {
}); });
}); });
} }
public static void openRuntimeSelector(Activity activity, int code) {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension("xz");
if (mimeType == null) mimeType = "*/*";
intent.setType(mimeType);
activity.startActivityForResult(intent, code);
}
} }

View File

@ -1,32 +0,0 @@
package net.kdt.pojavlaunch.prefs;
import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import androidx.preference.Preference;
import net.kdt.pojavlaunch.multirt.MultiRTConfigDialog;
public class RuntimeManagerPreference extends Preference{
private MultiRTConfigDialog mDialogScreen;
@SuppressWarnings("unused") public RuntimeManagerPreference(Context ctx) {
this(ctx, null);
}
public RuntimeManagerPreference(Context ctx, AttributeSet attrs) {
super(ctx, attrs);
setPersistent(false);
}
@Override
protected void onClick() {
if(mDialogScreen == null){
mDialogScreen = new MultiRTConfigDialog();
mDialogScreen.prepare(((Activity) getContext()));
}
mDialogScreen.show();
}
}

View File

@ -6,13 +6,26 @@ import static net.kdt.pojavlaunch.Tools.getTotalDeviceMemory;
import android.os.Bundle; import android.os.Bundle;
import android.widget.TextView; import android.widget.TextView;
import androidx.activity.result.ActivityResultLauncher;
import androidx.annotation.NonNull;
import androidx.preference.EditTextPreference; import androidx.preference.EditTextPreference;
import androidx.preference.Preference;
import net.kdt.pojavlaunch.R; import net.kdt.pojavlaunch.R;
import net.kdt.pojavlaunch.Tools;
import net.kdt.pojavlaunch.contracts.OpenDocumentWithExtension;
import net.kdt.pojavlaunch.multirt.MultiRTConfigDialog;
import net.kdt.pojavlaunch.prefs.CustomSeekBarPreference; import net.kdt.pojavlaunch.prefs.CustomSeekBarPreference;
import net.kdt.pojavlaunch.prefs.LauncherPreferences; import net.kdt.pojavlaunch.prefs.LauncherPreferences;
public class LauncherPreferenceJavaFragment extends LauncherPreferenceFragment { public class LauncherPreferenceJavaFragment extends LauncherPreferenceFragment {
private MultiRTConfigDialog mDialogScreen;
private Preference mMultiRTPreference;
private final ActivityResultLauncher<Object> mVmInstallLauncher =
registerForActivityResult(new OpenDocumentWithExtension("xz"), (data)->{
if(data != null) Tools.installRuntimeFromUri(getContext(), data);
});
@Override @Override
public void onCreatePreferences(Bundle b, String str) { public void onCreatePreferences(Bundle b, String str) {
int ramAllocation = LauncherPreferences.PREF_RAM_ALLOCATION; int ramAllocation = LauncherPreferences.PREF_RAM_ALLOCATION;
@ -39,5 +52,22 @@ public class LauncherPreferenceJavaFragment extends LauncherPreferenceFragment {
editJVMArgs.setOnBindEditTextListener(TextView::setSingleLine); editJVMArgs.setOnBindEditTextListener(TextView::setSingleLine);
} }
mMultiRTPreference = findPreference("install_jre");
}
@Override
public boolean onPreferenceTreeClick(@NonNull Preference preference) {
if(preference.equals(mMultiRTPreference)) {
openMultiRTDialog();
}
return super.onPreferenceTreeClick(preference);
}
private void openMultiRTDialog() {
if (mDialogScreen == null) {
mDialogScreen = new MultiRTConfigDialog();
mDialogScreen.prepare(getContext(), mVmInstallLauncher);
}
mDialogScreen.show();
} }
} }

View File

@ -5,7 +5,9 @@
<net.kdt.pojavlaunch.prefs.BackButtonPreference/> <net.kdt.pojavlaunch.prefs.BackButtonPreference/>
<PreferenceCategory android:title="Java Tweaks"> <PreferenceCategory android:title="Java Tweaks">
<net.kdt.pojavlaunch.prefs.RuntimeManagerPreference <Preference
android:key="install_jre"
android:persistent="false"
android:summary="@string/multirt_subtitle" android:summary="@string/multirt_subtitle"
android:title="@string/multirt_title"/> android:title="@string/multirt_title"/>