Fix ClassCastException when users starts A11y vision settings from out of setup flow

Root cause: Launch A11y vision settings from out of setup flow would not apply setup wizard theme (SettingsPreferenceTheme_SetupWizard). This throws ClassCastException when converting the layout to support auto-switching two-panel pattern.
Solution: Only converting the layout if launched in setup flow.

Bug: 269267419
Test: Manual testing by `adb shell am start -n com.android.settings/com.android.settings.accessibility.AccessibilitySettingsForSetupWizardActivity` for out of setup flow cases & 'adb shell am start -a android.intent.action.MAIN -n com.google.android.setupwizard/.SetupWizardTestActivity' for setup flow.

Change-Id: I16871b2fa800dd1de539b7b4b96c32ce7b2cd5c9
This commit is contained in:
menghanli
2023-03-01 16:20:58 +08:00
parent 408a4045f1
commit fdc9a1b896
6 changed files with 110 additions and 81 deletions

View File

@@ -87,25 +87,31 @@ public class AccessibilitySettingsForSetupWizard extends DashboardFragment
public void onViewCreated(View view, Bundle savedInstanceState) { public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
final GlifPreferenceLayout layout = (GlifPreferenceLayout) view; if (view instanceof GlifPreferenceLayout) {
final String title = getContext().getString(R.string.vision_settings_title); final GlifPreferenceLayout layout = (GlifPreferenceLayout) view;
final String description = getContext().getString(R.string.vision_settings_description); final String title = getContext().getString(R.string.vision_settings_title);
final Drawable icon = getContext().getDrawable(R.drawable.ic_accessibility_visibility); final String description = getContext().getString(R.string.vision_settings_description);
AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(getContext(), layout, title, final Drawable icon = getContext().getDrawable(R.drawable.ic_accessibility_visibility);
description, icon); AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(getContext(), layout, title,
description, icon);
final FooterBarMixin mixin = layout.getMixin(FooterBarMixin.class); final FooterBarMixin mixin = layout.getMixin(FooterBarMixin.class);
AccessibilitySetupWizardUtils.setPrimaryButton(getContext(), mixin, R.string.done, () -> { AccessibilitySetupWizardUtils.setPrimaryButton(getContext(), mixin, R.string.done,
setResult(RESULT_CANCELED); () -> {
finish(); setResult(RESULT_CANCELED);
}); finish();
});
}
} }
@Override @Override
public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent, public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,
Bundle savedInstanceState) { Bundle savedInstanceState) {
final GlifPreferenceLayout layout = (GlifPreferenceLayout) parent; if (parent instanceof GlifPreferenceLayout) {
return layout.onCreateRecyclerView(inflater, parent, savedInstanceState); final GlifPreferenceLayout layout = (GlifPreferenceLayout) parent;
return layout.onCreateRecyclerView(inflater, parent, savedInstanceState);
}
return super.onCreateRecyclerView(inflater, parent, savedInstanceState);
} }
@Override @Override

View File

@@ -20,7 +20,6 @@ import android.os.Bundle;
import android.view.Menu; import android.view.Menu;
import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityEvent;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat; import androidx.preference.PreferenceFragmentCompat;
@@ -33,16 +32,13 @@ import com.android.settings.support.actionbar.HelpResourceProvider;
import com.android.settingslib.core.instrumentation.Instrumentable; import com.android.settingslib.core.instrumentation.Instrumentable;
import com.android.settingslib.transition.SettingsTransitionHelper; import com.android.settingslib.transition.SettingsTransitionHelper;
import com.google.android.setupcompat.util.WizardManagerHelper;
import com.google.android.setupdesign.util.ThemeHelper; import com.google.android.setupdesign.util.ThemeHelper;
public class AccessibilitySettingsForSetupWizardActivity extends SettingsActivity { public class AccessibilitySettingsForSetupWizardActivity extends SettingsActivity {
private static final String SAVE_KEY_TITLE = "activity_title"; private static final String SAVE_KEY_TITLE = "activity_title";
@VisibleForTesting
static final String CLASS_NAME_FONT_SIZE_SETTINGS_FOR_SUW =
"com.android.settings.FontSizeSettingsForSetupWizardActivity";
@Override @Override
protected void onSaveInstanceState(Bundle savedState) { protected void onSaveInstanceState(Bundle savedState) {
savedState.putCharSequence(SAVE_KEY_TITLE, getTitle()); savedState.putCharSequence(SAVE_KEY_TITLE, getTitle());
@@ -101,8 +97,11 @@ public class AccessibilitySettingsForSetupWizardActivity extends SettingsActivit
} }
private void applyTheme() { private void applyTheme() {
setTheme(SetupWizardUtils.getTheme(this, getIntent())); final boolean isAnySetupWizard = WizardManagerHelper.isAnySetupWizard(getIntent());
setTheme(R.style.SettingsPreferenceTheme_SetupWizard); if (isAnySetupWizard) {
ThemeHelper.trySetDynamicColor(this); setTheme(SetupWizardUtils.getTheme(this, getIntent()));
setTheme(R.style.SettingsPreferenceTheme_SetupWizard);
ThemeHelper.trySetDynamicColor(this);
}
} }
} }

View File

@@ -45,30 +45,36 @@ public class TextReadingPreferenceFragmentForSetupWizard extends TextReadingPref
public void onViewCreated(View view, Bundle savedInstanceState) { public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
final GlifPreferenceLayout layout = (GlifPreferenceLayout) view; if (view instanceof GlifPreferenceLayout) {
final String title = getContext().getString( final GlifPreferenceLayout layout = (GlifPreferenceLayout) view;
R.string.accessibility_text_reading_options_title); final String title = getContext().getString(
final Drawable icon = getContext().getDrawable(R.drawable.ic_accessibility_visibility); R.string.accessibility_text_reading_options_title);
icon.setTintList(Utils.getColorAttr(getContext(), android.R.attr.colorPrimary)); final Drawable icon = getContext().getDrawable(R.drawable.ic_accessibility_visibility);
AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(getContext(), layout, title, icon.setTintList(Utils.getColorAttr(getContext(), android.R.attr.colorPrimary));
/* description= */ null, icon); AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(getContext(), layout, title,
/* description= */ null, icon);
final FooterBarMixin mixin = layout.getMixin(FooterBarMixin.class); final FooterBarMixin mixin = layout.getMixin(FooterBarMixin.class);
AccessibilitySetupWizardUtils.setPrimaryButton(getContext(), mixin, R.string.done, () -> { AccessibilitySetupWizardUtils.setPrimaryButton(getContext(), mixin, R.string.done,
setResult(RESULT_CANCELED); () -> {
finish(); setResult(RESULT_CANCELED);
}); finish();
AccessibilitySetupWizardUtils.setSecondaryButton(getContext(), mixin, });
R.string.accessibility_text_reading_reset_button_title, AccessibilitySetupWizardUtils.setSecondaryButton(getContext(), mixin,
() -> showDialog(DIALOG_RESET_SETTINGS) R.string.accessibility_text_reading_reset_button_title,
); () -> showDialog(DIALOG_RESET_SETTINGS)
);
}
} }
@Override @Override
public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent, public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,
Bundle savedInstanceState) { Bundle savedInstanceState) {
final GlifPreferenceLayout layout = (GlifPreferenceLayout) parent; if (parent instanceof GlifPreferenceLayout) {
return layout.onCreateRecyclerView(inflater, parent, savedInstanceState); final GlifPreferenceLayout layout = (GlifPreferenceLayout) parent;
return layout.onCreateRecyclerView(inflater, parent, savedInstanceState);
}
return super.onCreateRecyclerView(inflater, parent, savedInstanceState);
} }
@Override @Override

View File

@@ -39,20 +39,23 @@ public class ToggleScreenMagnificationPreferenceFragmentForSetupWizard
public void onViewCreated(View view, Bundle savedInstanceState) { public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
final GlifPreferenceLayout layout = (GlifPreferenceLayout) view; if (view instanceof GlifPreferenceLayout) {
final String title = getContext().getString( final GlifPreferenceLayout layout = (GlifPreferenceLayout) view;
R.string.accessibility_screen_magnification_title); final String title = getContext().getString(
final String description = getContext().getString( R.string.accessibility_screen_magnification_title);
R.string.accessibility_screen_magnification_intro_text); final String description = getContext().getString(
final Drawable icon = getContext().getDrawable(R.drawable.ic_accessibility_visibility); R.string.accessibility_screen_magnification_intro_text);
AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(getContext(), layout, title, final Drawable icon = getContext().getDrawable(R.drawable.ic_accessibility_visibility);
description, icon); AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(getContext(), layout, title,
description, icon);
final FooterBarMixin mixin = layout.getMixin(FooterBarMixin.class); final FooterBarMixin mixin = layout.getMixin(FooterBarMixin.class);
AccessibilitySetupWizardUtils.setPrimaryButton(getContext(), mixin, R.string.done, () -> { AccessibilitySetupWizardUtils.setPrimaryButton(getContext(), mixin, R.string.done,
setResult(RESULT_CANCELED); () -> {
finish(); setResult(RESULT_CANCELED);
}); finish();
});
}
hidePreferenceSettingComponents(); hidePreferenceSettingComponents();
} }
@@ -78,8 +81,11 @@ public class ToggleScreenMagnificationPreferenceFragmentForSetupWizard
@Override @Override
public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent, public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,
Bundle savedInstanceState) { Bundle savedInstanceState) {
final GlifPreferenceLayout layout = (GlifPreferenceLayout) parent; if (parent instanceof GlifPreferenceLayout) {
return layout.onCreateRecyclerView(inflater, parent, savedInstanceState); final GlifPreferenceLayout layout = (GlifPreferenceLayout) parent;
return layout.onCreateRecyclerView(inflater, parent, savedInstanceState);
}
return super.onCreateRecyclerView(inflater, parent, savedInstanceState);
} }
@Override @Override

View File

@@ -41,18 +41,21 @@ public class ToggleScreenReaderPreferenceFragmentForSetupWizard
public void onViewCreated(View view, Bundle savedInstanceState) { public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
final GlifPreferenceLayout layout = (GlifPreferenceLayout) view; if (view instanceof GlifPreferenceLayout) {
final String title = getArguments().getString(AccessibilitySettings.EXTRA_TITLE); final GlifPreferenceLayout layout = (GlifPreferenceLayout) view;
final String description = getContext().getString(R.string.talkback_summary); final String title = getArguments().getString(AccessibilitySettings.EXTRA_TITLE);
final Drawable icon = getContext().getDrawable(R.drawable.ic_accessibility_visibility); final String description = getContext().getString(R.string.talkback_summary);
AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(getContext(), layout, title, final Drawable icon = getContext().getDrawable(R.drawable.ic_accessibility_visibility);
description, icon); AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(getContext(), layout, title,
description, icon);
final FooterBarMixin mixin = layout.getMixin(FooterBarMixin.class); final FooterBarMixin mixin = layout.getMixin(FooterBarMixin.class);
AccessibilitySetupWizardUtils.setPrimaryButton(getContext(), mixin, R.string.done, () -> { AccessibilitySetupWizardUtils.setPrimaryButton(getContext(), mixin, R.string.done,
setResult(RESULT_CANCELED); () -> {
finish(); setResult(RESULT_CANCELED);
}); finish();
});
}
mToggleSwitchWasInitiallyChecked = mToggleServiceSwitchPreference.isChecked(); mToggleSwitchWasInitiallyChecked = mToggleServiceSwitchPreference.isChecked();
if (mTopIntroPreference != null) { if (mTopIntroPreference != null) {
@@ -63,8 +66,11 @@ public class ToggleScreenReaderPreferenceFragmentForSetupWizard
@Override @Override
public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent, public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,
Bundle savedInstanceState) { Bundle savedInstanceState) {
final GlifPreferenceLayout layout = (GlifPreferenceLayout) parent; if (parent instanceof GlifPreferenceLayout) {
return layout.onCreateRecyclerView(inflater, parent, savedInstanceState); final GlifPreferenceLayout layout = (GlifPreferenceLayout) parent;
return layout.onCreateRecyclerView(inflater, parent, savedInstanceState);
}
return super.onCreateRecyclerView(inflater, parent, savedInstanceState);
} }
@Override @Override

View File

@@ -41,18 +41,21 @@ public class ToggleSelectToSpeakPreferenceFragmentForSetupWizard
public void onViewCreated(View view, Bundle savedInstanceState) { public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
final GlifPreferenceLayout layout = (GlifPreferenceLayout) view; if (view instanceof GlifPreferenceLayout) {
final String title = getArguments().getString(AccessibilitySettings.EXTRA_TITLE); final GlifPreferenceLayout layout = (GlifPreferenceLayout) view;
final String description = getContext().getString(R.string.select_to_speak_summary); final String title = getArguments().getString(AccessibilitySettings.EXTRA_TITLE);
final Drawable icon = getContext().getDrawable(R.drawable.ic_accessibility_visibility); final String description = getContext().getString(R.string.select_to_speak_summary);
AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(getContext(), layout, title, final Drawable icon = getContext().getDrawable(R.drawable.ic_accessibility_visibility);
description, icon); AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(getContext(), layout, title,
description, icon);
final FooterBarMixin mixin = layout.getMixin(FooterBarMixin.class); final FooterBarMixin mixin = layout.getMixin(FooterBarMixin.class);
AccessibilitySetupWizardUtils.setPrimaryButton(getContext(), mixin, R.string.done, () -> { AccessibilitySetupWizardUtils.setPrimaryButton(getContext(), mixin, R.string.done,
setResult(RESULT_CANCELED); () -> {
finish(); setResult(RESULT_CANCELED);
}); finish();
});
}
mToggleSwitchWasInitiallyChecked = mToggleServiceSwitchPreference.isChecked(); mToggleSwitchWasInitiallyChecked = mToggleServiceSwitchPreference.isChecked();
if (mTopIntroPreference != null) { if (mTopIntroPreference != null) {
@@ -63,8 +66,11 @@ public class ToggleSelectToSpeakPreferenceFragmentForSetupWizard
@Override @Override
public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent, public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,
Bundle savedInstanceState) { Bundle savedInstanceState) {
final GlifPreferenceLayout layout = (GlifPreferenceLayout) parent; if (parent instanceof GlifPreferenceLayout) {
return layout.onCreateRecyclerView(inflater, parent, savedInstanceState); final GlifPreferenceLayout layout = (GlifPreferenceLayout) parent;
return layout.onCreateRecyclerView(inflater, parent, savedInstanceState);
}
return super.onCreateRecyclerView(inflater, parent, savedInstanceState);
} }
@Override @Override