Loading src/com/android/settings/SettingsActivity.java +20 −17 Original line number Diff line number Diff line Loading @@ -255,7 +255,8 @@ public class SettingsActivity extends SettingsBaseActivity // Should happen before any call to getIntent() getMetaData(); final Intent intent = getIntent(); if (launchHomepageForTwoPaneDeepLink(intent)) { if (shouldShowTwoPaneDeepLink(intent)) { launchHomepageForTwoPaneDeepLink(intent); finishAndRemoveTask(); return; } Loading Loading @@ -368,16 +369,13 @@ public class SettingsActivity extends SettingsBaseActivity intent.getBooleanExtra(EXTRA_SHOW_FRAGMENT_AS_SUBSETTING, false); } /** Returns true if the Activity is started by a deep link intent for large screen devices. */ private boolean launchHomepageForTwoPaneDeepLink(Intent intent) { if (!shouldShowTwoPaneDeepLink(intent)) { return false; } /** * Returns the deep link trampoline intent for large screen devices. */ public static Intent getTrampolineIntent(Intent intent, String highlightMenuKey) { final Intent detailIntent = new Intent(intent); // It's a deep link intent, SettingsHomepageActivity will set SplitPairRule and start it. final Intent trampolineIntent = new Intent(ACTION_SETTINGS_EMBED_DEEP_LINK_ACTIVITY); trampolineIntent.replaceExtras(detailIntent); // Relay detail intent data to prevent failure of Intent#ParseUri. Loading @@ -391,22 +389,27 @@ public class SettingsActivity extends SettingsBaseActivity trampolineIntent.putExtra(EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_INTENT_URI, detailIntent.toUri(Intent.URI_INTENT_SCHEME)); if (detailIntent.getBooleanExtra(EXTRA_IS_FROM_SLICE, false)) { trampolineIntent.setClass(this, SliceDeepLinkHomepageActivity.class); trampolineIntent.putExtra(EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_HIGHLIGHT_MENU_KEY, highlightMenuKey); trampolineIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); return trampolineIntent; } private void launchHomepageForTwoPaneDeepLink(Intent intent) { final Intent trampolineIntent; if (intent.getBooleanExtra(EXTRA_IS_FROM_SLICE, false)) { // Get menu key for slice deep link case. final String highlightMenuKey = detailIntent.getStringExtra( final String highlightMenuKey = intent.getStringExtra( EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_HIGHLIGHT_MENU_KEY); if (!TextUtils.isEmpty(highlightMenuKey)) { mHighlightMenuKey = highlightMenuKey; } trampolineIntent = getTrampolineIntent(intent, mHighlightMenuKey); trampolineIntent.setClass(this, SliceDeepLinkHomepageActivity.class); } else { trampolineIntent = getTrampolineIntent(intent, mHighlightMenuKey); } trampolineIntent.putExtra(EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_HIGHLIGHT_MENU_KEY, mHighlightMenuKey); trampolineIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); startActivity(trampolineIntent); return true; } private boolean shouldShowTwoPaneDeepLink(Intent intent) { Loading src/com/android/settings/homepage/SettingsHomepageActivity.java +35 −4 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading @@ -79,10 +81,27 @@ public class SettingsHomepageActivity extends FragmentActivity implements private View mHomepageView; private View mSuggestionView; private CategoryMixin mCategoryMixin; private Set<HomepageLoadedListener> 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; } } /** Loading @@ -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() Loading Loading @@ -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(); Loading src/com/android/settings/homepage/SliceDeepLinkHomepageActivity.java +5 −0 Original line number Diff line number Diff line Loading @@ -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()); Loading src/com/android/settings/homepage/TopLevelSettings.java +12 −2 Original line number Diff line number Diff line Loading @@ -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() Loading @@ -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; } Loading src/com/android/settings/search/SearchFeatureProvider.java +20 −5 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; } Loading @@ -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()) { Loading @@ -103,8 +107,19 @@ public interface SearchFeatureProvider { FeatureFactory.getFactory(context).getMetricsFeatureProvider() .logSettingsTileClick(KEY_HOMEPAGE_SEARCH_BAR, pageId); final Bundle bundle = ActivityOptions.makeSceneTransitionAnimation(activity).toBundle(); 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); } }); } Loading Loading
src/com/android/settings/SettingsActivity.java +20 −17 Original line number Diff line number Diff line Loading @@ -255,7 +255,8 @@ public class SettingsActivity extends SettingsBaseActivity // Should happen before any call to getIntent() getMetaData(); final Intent intent = getIntent(); if (launchHomepageForTwoPaneDeepLink(intent)) { if (shouldShowTwoPaneDeepLink(intent)) { launchHomepageForTwoPaneDeepLink(intent); finishAndRemoveTask(); return; } Loading Loading @@ -368,16 +369,13 @@ public class SettingsActivity extends SettingsBaseActivity intent.getBooleanExtra(EXTRA_SHOW_FRAGMENT_AS_SUBSETTING, false); } /** Returns true if the Activity is started by a deep link intent for large screen devices. */ private boolean launchHomepageForTwoPaneDeepLink(Intent intent) { if (!shouldShowTwoPaneDeepLink(intent)) { return false; } /** * Returns the deep link trampoline intent for large screen devices. */ public static Intent getTrampolineIntent(Intent intent, String highlightMenuKey) { final Intent detailIntent = new Intent(intent); // It's a deep link intent, SettingsHomepageActivity will set SplitPairRule and start it. final Intent trampolineIntent = new Intent(ACTION_SETTINGS_EMBED_DEEP_LINK_ACTIVITY); trampolineIntent.replaceExtras(detailIntent); // Relay detail intent data to prevent failure of Intent#ParseUri. Loading @@ -391,22 +389,27 @@ public class SettingsActivity extends SettingsBaseActivity trampolineIntent.putExtra(EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_INTENT_URI, detailIntent.toUri(Intent.URI_INTENT_SCHEME)); if (detailIntent.getBooleanExtra(EXTRA_IS_FROM_SLICE, false)) { trampolineIntent.setClass(this, SliceDeepLinkHomepageActivity.class); trampolineIntent.putExtra(EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_HIGHLIGHT_MENU_KEY, highlightMenuKey); trampolineIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); return trampolineIntent; } private void launchHomepageForTwoPaneDeepLink(Intent intent) { final Intent trampolineIntent; if (intent.getBooleanExtra(EXTRA_IS_FROM_SLICE, false)) { // Get menu key for slice deep link case. final String highlightMenuKey = detailIntent.getStringExtra( final String highlightMenuKey = intent.getStringExtra( EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_HIGHLIGHT_MENU_KEY); if (!TextUtils.isEmpty(highlightMenuKey)) { mHighlightMenuKey = highlightMenuKey; } trampolineIntent = getTrampolineIntent(intent, mHighlightMenuKey); trampolineIntent.setClass(this, SliceDeepLinkHomepageActivity.class); } else { trampolineIntent = getTrampolineIntent(intent, mHighlightMenuKey); } trampolineIntent.putExtra(EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_HIGHLIGHT_MENU_KEY, mHighlightMenuKey); trampolineIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); startActivity(trampolineIntent); return true; } private boolean shouldShowTwoPaneDeepLink(Intent intent) { Loading
src/com/android/settings/homepage/SettingsHomepageActivity.java +35 −4 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading @@ -79,10 +81,27 @@ public class SettingsHomepageActivity extends FragmentActivity implements private View mHomepageView; private View mSuggestionView; private CategoryMixin mCategoryMixin; private Set<HomepageLoadedListener> 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; } } /** Loading @@ -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() Loading Loading @@ -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(); Loading
src/com/android/settings/homepage/SliceDeepLinkHomepageActivity.java +5 −0 Original line number Diff line number Diff line Loading @@ -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()); Loading
src/com/android/settings/homepage/TopLevelSettings.java +12 −2 Original line number Diff line number Diff line Loading @@ -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() Loading @@ -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; } Loading
src/com/android/settings/search/SearchFeatureProvider.java +20 −5 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; } Loading @@ -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()) { Loading @@ -103,8 +107,19 @@ public interface SearchFeatureProvider { FeatureFactory.getFactory(context).getMetricsFeatureProvider() .logSettingsTileClick(KEY_HOMEPAGE_SEARCH_BAR, pageId); final Bundle bundle = ActivityOptions.makeSceneTransitionAnimation(activity).toBundle(); 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); } }); } Loading