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:
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
|
@@ -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) {
|
||||||
|
@@ -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) {
|
||||||
|
@@ -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) {
|
||||||
|
Reference in New Issue
Block a user