Rework activity launching and result handling

* Rename or eliminate methods that could be easily confused for AOSP
  methods due to the reuse of AOSP names.
* Separate out the handling of results for subactivites and for the
  next action (intent), each using its own activity launcher and
  callback.
* Add a StartDecoratedActivityForResult contract to ease the launching
  of activities without the caller needing to add SUW-related extras.

Change-Id: Iffaba4c51b2c90c42b8b243874a62cdea9e0c793
This commit is contained in:
Tommy Webb
2024-07-24 21:26:36 +00:00
parent 635998c42d
commit 5948809bb4
5 changed files with 49 additions and 17 deletions

View File

@@ -8,12 +8,15 @@ package org.lineageos.setupwizard;
import static android.view.View.INVISIBLE; import static android.view.View.INVISIBLE;
import static androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult;
import static com.google.android.setupcompat.util.ResultCodes.RESULT_SKIP; import static com.google.android.setupcompat.util.ResultCodes.RESULT_SKIP;
import static org.lineageos.setupwizard.SetupWizardApp.LOGV; import static org.lineageos.setupwizard.SetupWizardApp.LOGV;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
@@ -26,7 +29,7 @@ import android.widget.Button;
import androidx.activity.OnBackPressedCallback; import androidx.activity.OnBackPressedCallback;
import androidx.activity.result.ActivityResult; import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts; import androidx.activity.result.contract.ActivityResultContract;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import com.android.settingslib.Utils; import com.android.settingslib.Utils;
@@ -47,9 +50,10 @@ public abstract class BaseSetupWizardActivity extends AppCompatActivity implemen
private NavigationLayout mNavigationBar; private NavigationLayout mNavigationBar;
private final ActivityResultLauncher<Intent> activityResultLauncher = registerForActivityResult( private final ActivityResultLauncher<Intent> mNextIntentResultLauncher =
new ActivityResultContracts.StartActivityForResult(), registerForActivityResult(
BaseSetupWizardActivity.this::onActivityResult); new StartDecoratedActivityForResult(),
BaseSetupWizardActivity.this::onNextIntentResult);
@Override @Override
protected void onCreate(@Nullable Bundle savedInstanceState) { protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -252,7 +256,7 @@ public abstract class BaseSetupWizardActivity extends AppCompatActivity implemen
} }
setResult(resultCode, data); setResult(resultCode, data);
Intent intent = WizardManagerHelper.getNextIntent(getIntent(), resultCode, data); Intent intent = WizardManagerHelper.getNextIntent(getIntent(), resultCode, data);
startActivityForResult(intent); mNextIntentResultLauncher.launch(intent);
} }
/** Adorn the Intent with Setup Wizard-related extras. */ /** Adorn the Intent with Setup Wizard-related extras. */
@@ -268,15 +272,11 @@ public abstract class BaseSetupWizardActivity extends AppCompatActivity implemen
super.startActivity(decorateIntent(intent)); super.startActivity(decorateIntent(intent));
} }
protected final void startActivityForResult(@NonNull Intent intent) { protected void onNextIntentResult(@NonNull ActivityResult activityResult) {
activityResultLauncher.launch(decorateIntent(intent));
}
protected void onActivityResult(ActivityResult activityResult) {
int resultCode = activityResult.getResultCode(); int resultCode = activityResult.getResultCode();
Intent data = activityResult.getData(); Intent data = activityResult.getData();
if (LOGV) { if (LOGV) {
StringBuilder append = new StringBuilder().append("onActivityResult(") StringBuilder append = new StringBuilder().append("onNextIntentResult(")
.append(resultCode).append(", "); .append(resultCode).append(", ");
Bundle extras = null; Bundle extras = null;
if (data != null) { if (data != null) {
@@ -340,4 +340,21 @@ public abstract class BaseSetupWizardActivity extends AppCompatActivity implemen
TransitionHelper.applyBackwardTransition(BaseSetupWizardActivity.this, TransitionHelper.applyBackwardTransition(BaseSetupWizardActivity.this,
DEFAULT_TRANSITION, true); DEFAULT_TRANSITION, true);
} }
protected final class StartDecoratedActivityForResult
extends ActivityResultContract<Intent, ActivityResult> {
private final StartActivityForResult mWrappedContract = new StartActivityForResult();
@NonNull
@Override
public Intent createIntent(@NonNull Context context, @NonNull Intent intent) {
return decorateIntent(mWrappedContract.createIntent(context, intent));
}
@Override
public ActivityResult parseResult(int resultCode, @Nullable Intent result) {
return mWrappedContract.parseResult(resultCode, result);
}
}
} }

View File

@@ -43,7 +43,7 @@ public class BluetoothSetupActivity extends SubBaseActivity {
} }
@Override @Override
protected void onActivityResult(ActivityResult activityResult) { protected void onSubactivityResult(ActivityResult activityResult) {
Intent data = activityResult.getData(); Intent data = activityResult.getData();
if (mIsSubactivityNotFound) { if (mIsSubactivityNotFound) {
finishAction(RESULT_ACTIVITY_NOT_FOUND); finishAction(RESULT_ACTIVITY_NOT_FOUND);

View File

@@ -27,7 +27,7 @@ public class SimMissingActivity extends SubBaseActivity {
} }
@Override @Override
protected void onActivityResult(ActivityResult activityResult) { protected void onSubactivityResult(ActivityResult activityResult) {
int resultCode = activityResult.getResultCode(); int resultCode = activityResult.getResultCode();
Intent data = activityResult.getData(); Intent data = activityResult.getData();
if (resultCode != RESULT_CANCELED) { if (resultCode != RESULT_CANCELED) {

View File

@@ -18,6 +18,7 @@ import android.os.Bundle;
import android.util.Log; import android.util.Log;
import androidx.activity.result.ActivityResult; import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultLauncher;
public abstract class SubBaseActivity extends BaseSetupWizardActivity { public abstract class SubBaseActivity extends BaseSetupWizardActivity {
@@ -27,6 +28,11 @@ public abstract class SubBaseActivity extends BaseSetupWizardActivity {
protected abstract void onStartSubactivity(); protected abstract void onStartSubactivity();
private final ActivityResultLauncher<Intent> mSubactivityResultLauncher =
registerForActivityResult(
new StartDecoratedActivityForResult(),
SubBaseActivity.this::onSubactivityResult);
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
if (LOGV) { if (LOGV) {
@@ -61,7 +67,7 @@ public abstract class SubBaseActivity extends BaseSetupWizardActivity {
subactivityIntent.putExtra(EXTRA_WIZARD_BUNDLE, wizardBundle); subactivityIntent.putExtra(EXTRA_WIZARD_BUNDLE, wizardBundle);
} }
try { try {
startActivityForResult(subactivityIntent); mSubactivityResultLauncher.launch(subactivityIntent);
} catch (ActivityNotFoundException e) { } catch (ActivityNotFoundException e) {
Log.w(TAG, "activity not found; start next screen and finish; intent=" + intent); Log.w(TAG, "activity not found; start next screen and finish; intent=" + intent);
mIsSubactivityNotFound = true; mIsSubactivityNotFound = true;
@@ -70,8 +76,17 @@ public abstract class SubBaseActivity extends BaseSetupWizardActivity {
} }
@Override @Override
protected void onActivityResult(ActivityResult activityResult) { protected void onNextIntentResult(@NonNull ActivityResult activityResult) {
super.onActivityResult(activityResult); super.onNextIntentResult(activityResult);
int resultCode = activityResult.getResultCode();
Intent data = activityResult.getData();
if (resultCode == RESULT_CANCELED && data != null
&& data.getBooleanExtra("onBackPressed", false)) {
onStartSubactivity();
}
}
protected void onSubactivityResult(@NonNull ActivityResult activityResult) {
int resultCode = activityResult.getResultCode(); int resultCode = activityResult.getResultCode();
Intent data = activityResult.getData(); Intent data = activityResult.getData();
if (resultCode != RESULT_CANCELED) { if (resultCode != RESULT_CANCELED) {

View File

@@ -28,7 +28,7 @@ public class RestoreIntroActivity extends SubBaseActivity {
} }
@Override @Override
protected void onActivityResult(ActivityResult activityResult) { protected void onSubactivityResult(ActivityResult activityResult) {
int resultCode = activityResult.getResultCode(); int resultCode = activityResult.getResultCode();
Intent data = activityResult.getData(); Intent data = activityResult.getData();
if (resultCode != RESULT_CANCELED) { if (resultCode != RESULT_CANCELED) {