[Large screen] Fix searched Subsettings back navigation bug
Settings app registers SubSettings SplitPairRule with clearTop true, it will finish Settings app if users click back button on a SubSettings page. This change registers SubSettings SplitPairRule with clearTop true when users click a SubSettings item in Settings home menu. And this change registers SubSettings SplitPairRule with clearTop false when users click a SubSettings item in search result. Bug: 204501750 Test: manual 1. Settings -> Search settings -> search a SubSettings item (e.g., Battery) 2. Click the searched item. 3. Click back button. Change-Id: I6e1862de528e971137ae7087de608bbdd79096b2
This commit is contained in:
@@ -63,13 +63,6 @@ public class ActivityEmbeddingRulesController {
|
|||||||
|
|
||||||
// Set a placeholder for home page.
|
// Set a placeholder for home page.
|
||||||
registerHomepagePlaceholderRule();
|
registerHomepagePlaceholderRule();
|
||||||
// Set subsettings rule.
|
|
||||||
registerTwoPanePairRule(mContext,
|
|
||||||
getComponentName(Settings.class),
|
|
||||||
getComponentName(SubSettings.class),
|
|
||||||
null /* secondaryIntentAction */,
|
|
||||||
true /* finishPrimaryWithSecondary */,
|
|
||||||
true /* finishSecondaryWithPrimary */);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Register a SplitPairRule for 2-pane. */
|
/** Register a SplitPairRule for 2-pane. */
|
||||||
@@ -78,7 +71,8 @@ public class ActivityEmbeddingRulesController {
|
|||||||
ComponentName secondaryComponent,
|
ComponentName secondaryComponent,
|
||||||
String secondaryIntentAction,
|
String secondaryIntentAction,
|
||||||
boolean finishPrimaryWithSecondary,
|
boolean finishPrimaryWithSecondary,
|
||||||
boolean finishSecondaryWithPrimary) {
|
boolean finishSecondaryWithPrimary,
|
||||||
|
boolean clearTop) {
|
||||||
final Set<SplitPairFilter> filters = new HashSet<>();
|
final Set<SplitPairFilter> filters = new HashSet<>();
|
||||||
filters.add(new SplitPairFilter(primaryComponent, secondaryComponent,
|
filters.add(new SplitPairFilter(primaryComponent, secondaryComponent,
|
||||||
secondaryIntentAction));
|
secondaryIntentAction));
|
||||||
@@ -86,13 +80,28 @@ public class ActivityEmbeddingRulesController {
|
|||||||
SplitController.getInstance().registerRule(new SplitPairRule(filters,
|
SplitController.getInstance().registerRule(new SplitPairRule(filters,
|
||||||
finishPrimaryWithSecondary,
|
finishPrimaryWithSecondary,
|
||||||
finishSecondaryWithPrimary,
|
finishSecondaryWithPrimary,
|
||||||
true /* clearTop */,
|
clearTop,
|
||||||
ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthPx(context),
|
ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthPx(context),
|
||||||
ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthPx(context),
|
ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthPx(context),
|
||||||
ActivityEmbeddingUtils.SPLIT_RATIO,
|
ActivityEmbeddingUtils.SPLIT_RATIO,
|
||||||
LayoutDirection.LOCALE));
|
LayoutDirection.LOCALE));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Register a SplitPairRule for SubSettings if the device supports 2-pane. */
|
||||||
|
public static void registerSubSettingsPairRuleIfNeeded(Context context, boolean clearTop) {
|
||||||
|
if (!ActivityEmbeddingUtils.isEmbeddingActivityEnabled(context)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
registerTwoPanePairRule(context,
|
||||||
|
getComponentName(context, Settings.class),
|
||||||
|
getComponentName(context, SubSettings.class),
|
||||||
|
null /* secondaryIntentAction */,
|
||||||
|
true /* finishPrimaryWithSecondary */,
|
||||||
|
true /* finishSecondaryWithPrimary */,
|
||||||
|
clearTop);
|
||||||
|
}
|
||||||
|
|
||||||
private void registerHomepagePlaceholderRule() {
|
private void registerHomepagePlaceholderRule() {
|
||||||
final Set<ActivityFilter> activityFilters = new HashSet<>();
|
final Set<ActivityFilter> activityFilters = new HashSet<>();
|
||||||
addActivityFilter(activityFilters, SettingsHomepageActivity.class);
|
addActivityFilter(activityFilters, SettingsHomepageActivity.class);
|
||||||
@@ -131,6 +140,12 @@ public class ActivityEmbeddingRulesController {
|
|||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
private ComponentName getComponentName(Class<? extends Activity> activityClass) {
|
private ComponentName getComponentName(Class<? extends Activity> activityClass) {
|
||||||
return new ComponentName(mContext.getPackageName(), activityClass.getName());
|
return getComponentName(mContext, activityClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
private static ComponentName getComponentName(Context context,
|
||||||
|
Class<? extends Activity> activityClass) {
|
||||||
|
return new ComponentName(context.getPackageName(), activityClass.getName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -180,7 +180,10 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
|
|||||||
com.android.settings.Settings.class.getName()),
|
com.android.settings.Settings.class.getName()),
|
||||||
new ComponentName(tile.getPackageName(),
|
new ComponentName(tile.getPackageName(),
|
||||||
tile.getComponentName()),
|
tile.getComponentName()),
|
||||||
null, true, true);
|
null /* secondaryIntentAction */,
|
||||||
|
true /* finishPrimaryWithSecondary */,
|
||||||
|
true /* finishSecondaryWithPrimary */,
|
||||||
|
true /* clearTop */);
|
||||||
|
|
||||||
// Highlight preference ui.
|
// Highlight preference ui.
|
||||||
final TopLevelSettings topLevelSettings = (TopLevelSettings) fragment;
|
final TopLevelSettings topLevelSettings = (TopLevelSettings) fragment;
|
||||||
|
@@ -239,13 +239,15 @@ public class SettingsHomepageActivity extends FragmentActivity implements
|
|||||||
targetComponentName,
|
targetComponentName,
|
||||||
targetIntent.getAction(),
|
targetIntent.getAction(),
|
||||||
true /* finishPrimaryWithSecondary */,
|
true /* finishPrimaryWithSecondary */,
|
||||||
true /* finishSecondaryWithPrimary */);
|
true /* finishSecondaryWithPrimary */,
|
||||||
|
true /* clearTop*/);
|
||||||
ActivityEmbeddingRulesController.registerTwoPanePairRule(this,
|
ActivityEmbeddingRulesController.registerTwoPanePairRule(this,
|
||||||
new ComponentName(Settings.class.getPackageName(), Settings.class.getName()),
|
new ComponentName(Settings.class.getPackageName(), Settings.class.getName()),
|
||||||
targetComponentName,
|
targetComponentName,
|
||||||
targetIntent.getAction(),
|
targetIntent.getAction(),
|
||||||
true /* finishPrimaryWithSecondary */,
|
true /* finishPrimaryWithSecondary */,
|
||||||
true /* finishSecondaryWithPrimary */);
|
true /* finishSecondaryWithPrimary */,
|
||||||
|
true /* clearTop*/);
|
||||||
startActivity(targetIntent);
|
startActivity(targetIntent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -36,6 +36,7 @@ import androidx.recyclerview.widget.RecyclerView;
|
|||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.SettingsActivity;
|
import com.android.settings.SettingsActivity;
|
||||||
import com.android.settings.Utils;
|
import com.android.settings.Utils;
|
||||||
|
import com.android.settings.activityembedding.ActivityEmbeddingRulesController;
|
||||||
import com.android.settings.activityembedding.ActivityEmbeddingUtils;
|
import com.android.settings.activityembedding.ActivityEmbeddingUtils;
|
||||||
import com.android.settings.core.SubSettingLauncher;
|
import com.android.settings.core.SubSettingLauncher;
|
||||||
import com.android.settings.dashboard.DashboardFragment;
|
import com.android.settings.dashboard.DashboardFragment;
|
||||||
@@ -98,6 +99,10 @@ public class TopLevelSettings extends DashboardFragment implements
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onPreferenceTreeClick(Preference preference) {
|
public boolean onPreferenceTreeClick(Preference preference) {
|
||||||
|
// Register SplitPairRule for SubSettings.
|
||||||
|
ActivityEmbeddingRulesController.registerSubSettingsPairRuleIfNeeded(getContext(),
|
||||||
|
true /* clearTop*/);
|
||||||
|
|
||||||
setHighlightPreferenceKey(preference.getKey());
|
setHighlightPreferenceKey(preference.getKey());
|
||||||
return super.onPreferenceTreeClick(preference);
|
return super.onPreferenceTreeClick(preference);
|
||||||
}
|
}
|
||||||
|
@@ -25,6 +25,7 @@ import android.os.Bundle;
|
|||||||
|
|
||||||
import com.android.settings.SettingsActivity;
|
import com.android.settings.SettingsActivity;
|
||||||
import com.android.settings.SubSettings;
|
import com.android.settings.SubSettings;
|
||||||
|
import com.android.settings.activityembedding.ActivityEmbeddingRulesController;
|
||||||
import com.android.settings.overlay.FeatureFactory;
|
import com.android.settings.overlay.FeatureFactory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -53,6 +54,11 @@ public class SearchResultTrampoline extends Activity {
|
|||||||
args.putInt(EXTRA_SHOW_FRAGMENT_TAB, tab);
|
args.putInt(EXTRA_SHOW_FRAGMENT_TAB, tab);
|
||||||
intent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, args);
|
intent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, args);
|
||||||
|
|
||||||
|
// Register SplirPairRule for SubSettings, set clearTop false to prevent unexpected back
|
||||||
|
// navigation behavior.
|
||||||
|
ActivityEmbeddingRulesController.registerSubSettingsPairRuleIfNeeded(this /* context */,
|
||||||
|
false /* clearTop*/);
|
||||||
|
|
||||||
// Reroute request to SubSetting.
|
// Reroute request to SubSetting.
|
||||||
intent.setClass(this /* context */, SubSettings.class)
|
intent.setClass(this /* context */, SubSettings.class)
|
||||||
.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
|
.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
|
||||||
|
Reference in New Issue
Block a user