diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 8a69e04ff4b..bb72e950d51 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -233,7 +233,8 @@
+ android:launchMode="singleTask"
+ android:configChanges="orientation|screenSize|keyboardHidden">
@@ -1945,8 +1946,13 @@
android:screenOrientation="portrait"/>
+ android:exported="true"
+ android:screenOrientation="portrait">
+
+
+
+
+
- startActivityForResult(HelpUtils.getHelpIntent(context,
- context.getString(R.string.help_url_app_usage_settings),
- /*backupContext=*/ ""), /*requestCode=*/ 0));
- mFooterPreference.setLearnMoreContentDescription(
- context.getString(R.string.manager_battery_usage_link_a11y));
+ final Intent helpIntent = HelpUtils.getHelpIntent(context, context.getString(
+ R.string.help_url_app_usage_settings), /*backupContext=*/ "");
+ if (helpIntent != null) {
+ mFooterPreference.setLearnMoreAction(v ->
+ startActivityForResult(helpIntent, /*requestCode=*/ 0));
+ mFooterPreference.setLearnMoreContentDescription(
+ context.getString(R.string.manager_battery_usage_link_a11y));
+ }
}
@Override
@@ -459,32 +459,42 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements
updatePreferenceState(mUnrestrictedPreference, selectedKey);
updatePreferenceState(mOptimizePreference, selectedKey);
updatePreferenceState(mRestrictedPreference, selectedKey);
-
- // Logs metric.
- int metricCategory = 0;
- if (selectedKey.equals(mUnrestrictedPreference.getKey())) {
- metricCategory = SettingsEnums.ACTION_APP_BATTERY_USAGE_UNRESTRICTED;
- } else if (selectedKey.equals(mOptimizePreference.getKey())) {
- metricCategory = SettingsEnums.ACTION_APP_BATTERY_USAGE_OPTIMIZED;
- } else if (selectedKey.equals(mRestrictedPreference.getKey())) {
- metricCategory = SettingsEnums.ACTION_APP_BATTERY_USAGE_RESTRICTED;
- }
- if (metricCategory != 0) {
- FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider()
- .action(
- getContext(),
- metricCategory,
- new Pair(ConvertUtils.METRIC_KEY_PACKAGE,
- mBatteryOptimizeUtils.getPackageName()),
- new Pair(ConvertUtils.METRIC_KEY_BATTERY_USAGE,
- getArguments().getString(EXTRA_POWER_USAGE_PERCENT)));
- }
}
private void updatePreferenceState(RadioButtonPreference preference, String selectedKey) {
preference.setChecked(selectedKey.equals(preference.getKey()));
}
+ private void logMetricCategory(int selectedKey) {
+ if (selectedKey == mOptimizationMode) {
+ return;
+ }
+
+ int metricCategory = 0;
+ switch (selectedKey) {
+ case BatteryOptimizeUtils.MODE_UNRESTRICTED:
+ metricCategory = SettingsEnums.ACTION_APP_BATTERY_USAGE_UNRESTRICTED;
+ break;
+ case BatteryOptimizeUtils.MODE_OPTIMIZED:
+ metricCategory = SettingsEnums.ACTION_APP_BATTERY_USAGE_OPTIMIZED;
+ break;
+ case BatteryOptimizeUtils.MODE_RESTRICTED:
+ metricCategory = SettingsEnums.ACTION_APP_BATTERY_USAGE_RESTRICTED;
+ break;
+ }
+
+ if (metricCategory != 0) {
+ FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider()
+ .action(
+ getContext(),
+ metricCategory,
+ new Pair(ConvertUtils.METRIC_KEY_PACKAGE,
+ mBatteryOptimizeUtils.getPackageName()),
+ new Pair(ConvertUtils.METRIC_KEY_BATTERY_USAGE,
+ getArguments().getString(EXTRA_POWER_USAGE_PERCENT)));
+ }
+ }
+
private void onCreateForTriState(String packageName) {
mUnrestrictedPreference = findPreference(KEY_PREF_UNRESTRICTED);
mOptimizePreference = findPreference(KEY_PREF_OPTIMIZED);
@@ -496,7 +506,6 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements
mBatteryOptimizeUtils = new BatteryOptimizeUtils(
getContext(), getArguments().getInt(EXTRA_UID), packageName);
- mOptimizationMode = mBatteryOptimizeUtils.getAppOptimizationMode();
}
private int getSelectedPreference() {
diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java
index 2bbc11e2b95..ae8c61e3b30 100644
--- a/src/com/android/settings/homepage/SettingsHomepageActivity.java
+++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java
@@ -27,6 +27,7 @@ import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
+import android.util.ArraySet;
import android.util.FeatureFlagUtils;
import android.util.Log;
import android.view.View;
@@ -54,6 +55,7 @@ import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin;
import java.net.URISyntaxException;
+import java.util.Set;
/** Settings homepage activity */
public class SettingsHomepageActivity extends FragmentActivity implements
@@ -79,10 +81,27 @@ public class SettingsHomepageActivity extends FragmentActivity implements
private View mHomepageView;
private View mSuggestionView;
private CategoryMixin mCategoryMixin;
+ private Set mLoadedListeners;
- @Override
- public CategoryMixin getCategoryMixin() {
- return mCategoryMixin;
+ /** A listener receiving homepage loaded events. */
+ public interface HomepageLoadedListener {
+ /** Called when the homepage is loaded. */
+ void onHomepageLoaded();
+ }
+
+ /**
+ * Try to register a {@link HomepageLoadedListener}. If homepage is already loaded, the
+ * listener will not be notified.
+ *
+ * @return Whether the listener should be registered.
+ */
+ public boolean registerHomepageLoadedListenerIfNeeded(HomepageLoadedListener listener) {
+ if (mHomepageView == null) {
+ return false;
+ } else {
+ mLoadedListeners.add(listener);
+ return true;
+ }
}
/**
@@ -97,17 +116,25 @@ public class SettingsHomepageActivity extends FragmentActivity implements
mSuggestionView.setVisibility(showSuggestion ? View.VISIBLE : View.GONE);
mHomepageView.setVisibility(View.VISIBLE);
mHomepageView = null;
+ mLoadedListeners.forEach(listener -> listener.onHomepageLoaded());
+ mLoadedListeners.clear();
+ }
+
+ @Override
+ public CategoryMixin getCategoryMixin() {
+ return mCategoryMixin;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- ((SettingsApplication) getApplication()).setHomeActivity(this);
+ setHomeActivity();
setContentView(R.layout.settings_homepage_container);
final View appBar = findViewById(R.id.app_bar_container);
appBar.setMinimumHeight(getSearchBoxHeight());
initHomepageContainer();
+ mLoadedListeners = new ArraySet<>();
final Toolbar toolbar = findViewById(R.id.search_action_bar);
FeatureFactory.getFactory(this).getSearchFeatureProvider()
@@ -158,6 +185,10 @@ public class SettingsHomepageActivity extends FragmentActivity implements
launchDeepLinkIntentToRight();
}
+ protected void setHomeActivity() {
+ ((SettingsApplication) getApplication()).setHomeActivity(this);
+ }
+
private void showSuggestionFragment() {
final Class extends Fragment> fragment = FeatureFactory.getFactory(this)
.getSuggestionFeatureProvider(this).getContextualSuggestionFragment();
diff --git a/src/com/android/settings/homepage/SliceDeepLinkHomepageActivity.java b/src/com/android/settings/homepage/SliceDeepLinkHomepageActivity.java
index 2f836127e21..61e946d3bd8 100644
--- a/src/com/android/settings/homepage/SliceDeepLinkHomepageActivity.java
+++ b/src/com/android/settings/homepage/SliceDeepLinkHomepageActivity.java
@@ -20,6 +20,11 @@ import android.content.ComponentName;
/** Activity for Slices to launch Settings deep link page */
public class SliceDeepLinkHomepageActivity extends SettingsHomepageActivity {
+ @Override
+ protected void setHomeActivity() {
+ // do not overwrite homepage activity in SettingsApplication
+ }
+
@Override
protected ComponentName getDeepLinkComponent() {
return new ComponentName(getApplicationContext(), getClass());
diff --git a/src/com/android/settings/homepage/TopLevelSettings.java b/src/com/android/settings/homepage/TopLevelSettings.java
index d3bfa02ae27..e9c7ef89668 100644
--- a/src/com/android/settings/homepage/TopLevelSettings.java
+++ b/src/com/android/settings/homepage/TopLevelSettings.java
@@ -101,7 +101,7 @@ public class TopLevelSettings extends DashboardFragment implements
public boolean onPreferenceTreeClick(Preference preference) {
// Register SplitPairRule for SubSettings.
ActivityEmbeddingRulesController.registerSubSettingsPairRuleIfNeeded(getContext(),
- true /* clearTop*/);
+ true /* clearTop */);
setHighlightPreferenceKey(preference.getKey());
return super.onPreferenceTreeClick(preference);
@@ -184,6 +184,15 @@ public class TopLevelSettings extends DashboardFragment implements
}
}
+ /** Disable highlight on the menu entry */
+ public void disableMenuHighlight() {
+ if (mTopLevelAdapter == null) {
+ return;
+ }
+ mHighlightedPreferenceKey = null;
+ mTopLevelAdapter.highlightPreference(mHighlightedPreferenceKey, /* scrollNeeded= */ false);
+ }
+
@Override
protected boolean shouldForceRoundedIcon() {
return getContext().getResources()
@@ -202,7 +211,8 @@ public class TopLevelSettings extends DashboardFragment implements
Log.d(TAG, "onCreateAdapter, pref key: " + mHighlightedPreferenceKey);
mTopLevelAdapter = new HighlightableTopLevelPreferenceAdapter(
- getActivity(), preferenceScreen, getListView(), mHighlightedPreferenceKey);
+ (SettingsHomepageActivity) getActivity(), preferenceScreen, getListView(),
+ mHighlightedPreferenceKey);
return mTopLevelAdapter;
}
diff --git a/src/com/android/settings/network/telephony/TelephonyTogglePreferenceController.java b/src/com/android/settings/network/telephony/TelephonyTogglePreferenceController.java
index 46f279db260..e3609cb214b 100644
--- a/src/com/android/settings/network/telephony/TelephonyTogglePreferenceController.java
+++ b/src/com/android/settings/network/telephony/TelephonyTogglePreferenceController.java
@@ -68,7 +68,7 @@ public abstract class TelephonyTogglePreferenceController extends TogglePreferen
@Override
public int getSliceHighlightMenuRes() {
// not needed since it's not sliceable
- return 0;
+ return NO_RES;
}
/**
diff --git a/src/com/android/settings/notification/BubbleNotificationPreferenceController.java b/src/com/android/settings/notification/BubbleNotificationPreferenceController.java
index 9e3566498b0..eeb9924f50e 100644
--- a/src/com/android/settings/notification/BubbleNotificationPreferenceController.java
+++ b/src/com/android/settings/notification/BubbleNotificationPreferenceController.java
@@ -91,7 +91,7 @@ public class BubbleNotificationPreferenceController extends
@Override
public int getSliceHighlightMenuRes() {
// not needed since it's not sliceable
- return 0;
+ return NO_RES;
}
@Override
diff --git a/src/com/android/settings/search/SearchFeatureProvider.java b/src/com/android/settings/search/SearchFeatureProvider.java
index 05fd2aea4de..9b081e18925 100644
--- a/src/com/android/settings/search/SearchFeatureProvider.java
+++ b/src/com/android/settings/search/SearchFeatureProvider.java
@@ -19,7 +19,6 @@ package com.android.settings.search;
import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO;
import android.annotation.NonNull;
-import android.app.Activity;
import android.app.ActivityOptions;
import android.content.ComponentName;
import android.content.Context;
@@ -30,8 +29,12 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.Toolbar;
+import androidx.fragment.app.FragmentActivity;
+
import com.android.settings.R;
import com.android.settings.Utils;
+import com.android.settings.activityembedding.ActivityEmbeddingUtils;
+import com.android.settings.homepage.TopLevelSettings;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.search.SearchIndexableResources;
@@ -66,7 +69,7 @@ public interface SearchFeatureProvider {
/**
* Initializes the search toolbar.
*/
- default void initSearchToolbar(Activity activity, Toolbar toolbar, int pageId) {
+ default void initSearchToolbar(FragmentActivity activity, Toolbar toolbar, int pageId) {
if (activity == null || toolbar == null) {
return;
}
@@ -91,7 +94,8 @@ public interface SearchFeatureProvider {
toolbar.setOnClickListener(tb -> {
final Context context = activity.getApplicationContext();
- final Intent intent = buildSearchIntent(context, pageId);
+ final Intent intent = buildSearchIntent(context, pageId)
+ .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
if (activity.getPackageManager().queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY).isEmpty()) {
@@ -103,8 +107,19 @@ public interface SearchFeatureProvider {
FeatureFactory.getFactory(context).getMetricsFeatureProvider()
.logSettingsTileClick(KEY_HOMEPAGE_SEARCH_BAR, pageId);
- final Bundle bundle = ActivityOptions.makeSceneTransitionAnimation(activity).toBundle();
- activity.startActivity(intent, bundle);
+
+ if (ActivityEmbeddingUtils.isEmbeddingActivityEnabled(context)) {
+ final TopLevelSettings fragment = (TopLevelSettings) activity
+ .getSupportFragmentManager().findFragmentById(R.id.main_content);
+ if (fragment != null) {
+ fragment.disableMenuHighlight();
+ }
+ activity.startActivity(intent);
+ } else {
+ final Bundle bundle = ActivityOptions.makeSceneTransitionAnimation(activity)
+ .toBundle();
+ activity.startActivity(intent, bundle);
+ }
});
}
diff --git a/src/com/android/settings/search/SearchResultTrampoline.java b/src/com/android/settings/search/SearchResultTrampoline.java
index 3414efeda72..d20a2ea860d 100644
--- a/src/com/android/settings/search/SearchResultTrampoline.java
+++ b/src/com/android/settings/search/SearchResultTrampoline.java
@@ -20,52 +20,102 @@ import static com.android.settings.SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENT
import static com.android.settings.SettingsActivity.EXTRA_SHOW_FRAGMENT_TAB;
import android.app.Activity;
+import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.util.Log;
import com.android.settings.SettingsActivity;
import com.android.settings.SubSettings;
import com.android.settings.activityembedding.ActivityEmbeddingRulesController;
+import com.android.settings.activityembedding.ActivityEmbeddingUtils;
import com.android.settings.overlay.FeatureFactory;
+import java.net.URISyntaxException;
+
/**
* A trampoline activity that launches setting result page.
*/
public class SearchResultTrampoline extends Activity {
+ private static final String TAG = "SearchResultTrampoline";
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ final ComponentName callingActivity = getCallingActivity();
// First make sure caller has privilege to launch a search result page.
FeatureFactory.getFactory(this)
.getSearchFeatureProvider()
- .verifyLaunchSearchResultPageCaller(this, getCallingActivity());
+ .verifyLaunchSearchResultPageCaller(this, callingActivity);
// Didn't crash, proceed and launch the result as a subsetting.
- final Intent intent = getIntent();
+ Intent intent = getIntent();
+ final String highlightMenuKey = intent.getStringExtra(
+ Settings.EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_HIGHLIGHT_MENU_KEY);
- // Hack to take EXTRA_FRAGMENT_ARG_KEY from intent and set into
- // EXTRA_SHOW_FRAGMENT_ARGUMENTS. This is necessary because intent could be from external
- // caller and args may not persisted.
- final String settingKey = intent.getStringExtra(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY);
- final int tab = intent.getIntExtra(EXTRA_SHOW_FRAGMENT_TAB, 0);
- final Bundle args = new Bundle();
- args.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, settingKey);
- args.putInt(EXTRA_SHOW_FRAGMENT_TAB, tab);
- intent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, args);
+ final String fragment = intent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT);
+ if (!TextUtils.isEmpty(fragment)) {
+ // Hack to take EXTRA_FRAGMENT_ARG_KEY from intent and set into
+ // EXTRA_SHOW_FRAGMENT_ARGUMENTS. This is necessary because intent could be from
+ // external caller and args may not persisted.
+ final String settingKey = intent.getStringExtra(
+ SettingsActivity.EXTRA_FRAGMENT_ARG_KEY);
+ final int tab = intent.getIntExtra(EXTRA_SHOW_FRAGMENT_TAB, 0);
+ final Bundle args = new Bundle();
+ args.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, settingKey);
+ args.putInt(EXTRA_SHOW_FRAGMENT_TAB, tab);
+ 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.
+ intent.setClass(this /* context */, SubSettings.class);
+ } else {
+ // Direct link case
+ final String intentUriString = intent.getStringExtra(
+ Settings.EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_INTENT_URI);
+ if (TextUtils.isEmpty(intentUriString)) {
+ Log.e(TAG, "No EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_INTENT_URI for deep link");
+ finish();
+ return;
+ }
- // Reroute request to SubSetting.
- intent.setClass(this /* context */, SubSettings.class)
- .addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
- startActivity(intent);
+ try {
+ intent = Intent.parseUri(intentUriString, Intent.URI_INTENT_SCHEME);
+ } catch (URISyntaxException e) {
+ Log.e(TAG, "Failed to parse deep link intent: " + e);
+ finish();
+ return;
+ }
+ }
+
+ intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
+
+ if (!ActivityEmbeddingUtils.isEmbeddingActivityEnabled(this)) {
+ startActivity(intent);
+ } else if (isFromSettingsIntelligence(callingActivity)) {
+ // Register SplitPairRule for SubSettings, set clearTop false to prevent unexpected back
+ // navigation behavior.
+ ActivityEmbeddingRulesController.registerSubSettingsPairRuleIfNeeded(this,
+ false /* clearTop */);
+ // TODO: pass menu key to homepage
+ intent.setFlags(intent.getFlags() & ~Intent.FLAG_ACTIVITY_NEW_TASK);
+ startActivity(intent);
+ } else {
+ // Two-pane case
+ intent.setFlags(intent.getFlags() & ~Intent.FLAG_ACTIVITY_NEW_TASK);
+ startActivity(SettingsActivity.getTrampolineIntent(intent, highlightMenuKey));
+ }
// Done.
finish();
}
+ private boolean isFromSettingsIntelligence(ComponentName callingActivity) {
+ return callingActivity != null && TextUtils.equals(
+ callingActivity.getPackageName(),
+ FeatureFactory.getFactory(this).getSearchFeatureProvider()
+ .getSettingsIntelligencePkgName(this));
+ }
}
diff --git a/src/com/android/settings/search/SettingsSearchIndexablesProvider.java b/src/com/android/settings/search/SettingsSearchIndexablesProvider.java
index feb9510bff9..d6635a197c2 100644
--- a/src/com/android/settings/search/SettingsSearchIndexablesProvider.java
+++ b/src/com/android/settings/search/SettingsSearchIndexablesProvider.java
@@ -365,7 +365,6 @@ public class SettingsSearchIndexablesProvider extends SearchIndexablesProvider {
// The classname and intent information comes from the PreIndexData
// This will be more clear when provider conversion is done at PreIndex time.
raw.className = bundle.getTargetClass().getName();
-
}
rawList.addAll(providerRaws);
}
diff --git a/src/com/android/settings/slices/Sliceable.java b/src/com/android/settings/slices/Sliceable.java
index 31555df0022..406cb3aeb73 100644
--- a/src/com/android/settings/slices/Sliceable.java
+++ b/src/com/android/settings/slices/Sliceable.java
@@ -25,6 +25,7 @@ import android.content.IntentFilter;
import android.net.Uri;
import android.widget.Toast;
+import androidx.annotation.StringRes;
import androidx.slice.Slice;
import com.android.settings.R;
@@ -135,10 +136,16 @@ public interface Sliceable {
}
/**
- * @return a resource ID that indicates which menu entry should be highlighted in multi-pane
- * mode.
+ * Used to mark a {@link Sliceable} that has no highlight menu string resource.
*/
- default int getSliceHighlightMenuRes() {
- return 0;
+ int NO_RES = 0;
+
+ /**
+ * @return a string resource declared in res/values/menu_keys.xml that indicates which menu
+ * entry should be highlighted in two-pane mode, or {@link #NO_RES} representing highlighting is
+ * not applicable.
+ */
+ @StringRes default int getSliceHighlightMenuRes() {
+ return NO_RES;
}
}
diff --git a/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java b/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java
index 19a91f65d16..bf92bbdf679 100644
--- a/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java
+++ b/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java
@@ -16,7 +16,6 @@
package com.android.settings.widget;
-import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
@@ -34,6 +33,7 @@ import androidx.recyclerview.widget.RecyclerView;
import com.android.settings.Utils;
import com.android.settings.activityembedding.ActivityEmbeddingUtils;
+import com.android.settings.homepage.SettingsHomepageActivity;
/**
* Adapter for highlighting top level preferences
@@ -54,7 +54,7 @@ public class HighlightableTopLevelPreferenceAdapter extends PreferenceGroupAdapt
final int mIconColorHighlight;
private final Context mContext;
- private final Activity mActivity;
+ private final SettingsHomepageActivity mHomepageActivity;
private final RecyclerView mRecyclerView;
private final int mNormalBackgroundRes;
private String mHighlightKey;
@@ -63,13 +63,13 @@ public class HighlightableTopLevelPreferenceAdapter extends PreferenceGroupAdapt
private boolean mHighlightNeeded;
private boolean mScrolled;
- public HighlightableTopLevelPreferenceAdapter(Activity activity,
+ public HighlightableTopLevelPreferenceAdapter(SettingsHomepageActivity homepageActivity,
PreferenceGroup preferenceGroup, RecyclerView recyclerView, String key) {
super(preferenceGroup);
mRecyclerView = recyclerView;
mHighlightKey = key;
mContext = preferenceGroup.getContext();
- mActivity = activity;
+ mHomepageActivity = homepageActivity;
final TypedValue outValue = new TypedValue();
mContext.getTheme().resolveAttribute(android.R.attr.selectableItemBackground,
outValue, true /* resolveRefs */);
@@ -115,7 +115,7 @@ public class HighlightableTopLevelPreferenceAdapter extends PreferenceGroupAdapt
* A function can highlight a specific setting in recycler view.
*/
public void requestHighlight() {
- if (mRecyclerView == null || TextUtils.isEmpty(mHighlightKey)) {
+ if (mRecyclerView == null) {
return;
}
@@ -194,6 +194,11 @@ public class HighlightableTopLevelPreferenceAdapter extends PreferenceGroupAdapt
return;
}
+ if (mHomepageActivity.registerHomepageLoadedListenerIfNeeded(
+ () -> scrollToPositionIfNeeded(position))) {
+ return;
+ }
+
// Only when the recyclerView is loaded, it can be scrolled
final View view = mRecyclerView.getChildAt(position);
if (view == null) {
@@ -236,6 +241,6 @@ public class HighlightableTopLevelPreferenceAdapter extends PreferenceGroupAdapt
}
private boolean isHighlightNeeded() {
- return ActivityEmbeddingUtils.isTwoPaneResolution(mActivity);
+ return ActivityEmbeddingUtils.isTwoPaneResolution(mHomepageActivity);
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
index 3501726bc1a..db002cb047f 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
@@ -792,14 +792,39 @@ public class AdvancedPowerUsageDetailTest {
assertThat(mOptimizePreference.isChecked()).isTrue();
assertThat(mRestrictedPreference.isChecked()).isFalse();
assertThat(mUnrestrictedPreference.isChecked()).isFalse();
+ }
+
+ @Test
+ public void testOnPause_optimizationModeChanged_logPreference() {
+ final int mode = BatteryOptimizeUtils.MODE_RESTRICTED;
+ mFragment.mOptimizationMode = mode;
+ when(mBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn(mode);
+ mOptimizePreference.setKey(KEY_PREF_OPTIMIZED);
+
+ mFragment.onRadioButtonClicked(mOptimizePreference);
+ mFragment.onPause();
+
verify(mMetricsFeatureProvider)
- .action(
- mContext,
- SettingsEnums.ACTION_APP_BATTERY_USAGE_OPTIMIZED,
- (Pair[]) new Pair[] {
- new Pair(ConvertUtils.METRIC_KEY_PACKAGE, null),
- new Pair(ConvertUtils.METRIC_KEY_BATTERY_USAGE, "app label")
- });
+ .action(
+ mContext,
+ SettingsEnums.ACTION_APP_BATTERY_USAGE_OPTIMIZED,
+ (Pair[]) new Pair[] {
+ new Pair(ConvertUtils.METRIC_KEY_PACKAGE, null),
+ new Pair(ConvertUtils.METRIC_KEY_BATTERY_USAGE, "app label")
+ });
+ }
+
+ @Test
+ public void testOnPause_optimizationModeIsNotChanged_notInvokeLogging() {
+ final int mode = BatteryOptimizeUtils.MODE_OPTIMIZED;
+ mFragment.mOptimizationMode = mode;
+ when(mBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn(mode);
+ mOptimizePreference.setKey(KEY_PREF_OPTIMIZED);
+
+ mFragment.onRadioButtonClicked(mOptimizePreference);
+ mFragment.onPause();
+
+ verifyZeroInteractions(mMetricsFeatureProvider);
}
@Test
@@ -831,7 +856,7 @@ public class AdvancedPowerUsageDetailTest {
.thenReturn(BatteryOptimizeUtils.MODE_UNRESTRICTED);
mFragment.mEnableTriState = false;
- mFragment.notifyBackupManager();
+ mFragment.onPause();
verifyZeroInteractions(mBackupManager);
}
diff --git a/tests/robotests/src/com/android/settings/search/SearchFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/search/SearchFeatureProviderImplTest.java
index 444a8137889..5de57b6c95e 100644
--- a/tests/robotests/src/com/android/settings/search/SearchFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/search/SearchFeatureProviderImplTest.java
@@ -19,7 +19,6 @@ package com.android.settings.search;
import static com.google.common.truth.Truth.assertThat;
-import android.app.Activity;
import android.app.settings.SettingsEnums;
import android.content.ComponentName;
import android.content.Intent;
@@ -29,6 +28,8 @@ import android.net.Uri;
import android.provider.Settings;
import android.widget.Toolbar;
+import androidx.fragment.app.FragmentActivity;
+
import com.android.settings.R;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.shadow.ShadowUtils;
@@ -46,13 +47,13 @@ import org.robolectric.shadows.ShadowPackageManager;
public class SearchFeatureProviderImplTest {
private SearchFeatureProviderImpl mProvider;
- private Activity mActivity;
+ private FragmentActivity mActivity;
private ShadowPackageManager mPackageManager;
@Before
public void setUp() {
FakeFeatureFactory.setupForTest();
- mActivity = Robolectric.setupActivity(Activity.class);
+ mActivity = Robolectric.setupActivity(FragmentActivity.class);
mProvider = new SearchFeatureProviderImpl();
mPackageManager = Shadows.shadowOf(mActivity.getPackageManager());
Settings.Global.putInt(mActivity.getContentResolver(),
diff --git a/tests/unit/src/com/android/settings/network/ProviderModelSliceHelperTest.java b/tests/unit/src/com/android/settings/network/ProviderModelSliceHelperTest.java
index df6a38b20a1..8687e5ada64 100644
--- a/tests/unit/src/com/android/settings/network/ProviderModelSliceHelperTest.java
+++ b/tests/unit/src/com/android/settings/network/ProviderModelSliceHelperTest.java
@@ -305,7 +305,7 @@ public class ProviderModelSliceHelperTest {
@Override
public int getSliceHighlightMenuRes() {
- return 0;
+ return NO_RES;
}
}
diff --git a/tests/unit/src/com/android/settings/slices/SpecialCaseSliceManagerTest.java b/tests/unit/src/com/android/settings/slices/SpecialCaseSliceManagerTest.java
index 490b7bd62c6..38347e91ca1 100644
--- a/tests/unit/src/com/android/settings/slices/SpecialCaseSliceManagerTest.java
+++ b/tests/unit/src/com/android/settings/slices/SpecialCaseSliceManagerTest.java
@@ -146,7 +146,7 @@ public class SpecialCaseSliceManagerTest {
@Override
public int getSliceHighlightMenuRes() {
- return 0;
+ return NO_RES;
}
}
}