diff --git a/AndroidManifest.xml b/AndroidManifest.xml index aa3364fdfbd..c8d9afff9ef 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -124,7 +124,7 @@ android:value="true" /> - + android:targetActivity=".homepage.SettingsHomepageActivity"> diff --git a/res/values/strings.xml b/res/values/strings.xml index 6af9721c83c..6782804d80a 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -9459,11 +9459,11 @@ System UI demo mode - - Night mode + + Dark mode - Set Night mode + Set Dark mode Quick settings developer tiles diff --git a/res/xml/my_device_info.xml b/res/xml/my_device_info.xml index 957ba81c57e..535f61afa5d 100644 --- a/res/xml/my_device_info.xml +++ b/res/xml/my_device_info.xml @@ -72,10 +72,18 @@ + + + + + - - - - - homepageCards); + void onFinishCardLoading(List contextualCards); } public CardContentLoader() { @@ -42,20 +42,20 @@ public class CardContentLoader { mListener = listener; } - private static class CardLoader extends AsyncLoaderCompat> { + private static class CardLoader extends AsyncLoaderCompat> { public CardLoader(Context context) { super(context); } @Override - protected void onDiscardResult(List result) { + protected void onDiscardResult(List result) { } @Nullable @Override - public List loadInBackground() { + public List loadInBackground() { return null; } } diff --git a/src/com/android/settings/homepage/HomepageCard.java b/src/com/android/settings/homepage/ContextualCard.java similarity index 95% rename from src/com/android/settings/homepage/HomepageCard.java rename to src/com/android/settings/homepage/ContextualCard.java index 1469ff1896d..f5083d80e6c 100644 --- a/src/com/android/settings/homepage/HomepageCard.java +++ b/src/com/android/settings/homepage/ContextualCard.java @@ -25,12 +25,12 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** - * Data class representing a {@link HomepageCard}. + * Data class representing a {@link ContextualCard}. */ -public class HomepageCard { +public class ContextualCard { /** - * Flags indicating the type of the HomepageCard. + * Flags indicating the type of the ContextualCard. */ @IntDef({CardType.INVALID, CardType.SLICE, CardType.SUGGESTION, CardType.CONDITIONAL}) @Retention(RetentionPolicy.SOURCE) @@ -137,7 +137,7 @@ public class HomepageCard { return mIsHalfWidth; } - public HomepageCard(Builder builder) { + public ContextualCard(Builder builder) { mName = builder.mName; mCardType = builder.mCardType; mRankingScore = builder.mRankingScore; @@ -171,10 +171,10 @@ public class HomepageCard { if (this == obj) { return true; } - if (!(obj instanceof HomepageCard)) { + if (!(obj instanceof ContextualCard)) { return false; } - final HomepageCard that = (HomepageCard) obj; + final ContextualCard that = (ContextualCard) obj; return TextUtils.equals(mName, that.mName); } @@ -289,8 +289,8 @@ public class HomepageCard { return this; } - public HomepageCard build() { - return new HomepageCard(this); + public ContextualCard build() { + return new ContextualCard(this); } } } diff --git a/src/com/android/settings/homepage/HomepageCardController.java b/src/com/android/settings/homepage/ContextualCardController.java similarity index 68% rename from src/com/android/settings/homepage/HomepageCardController.java rename to src/com/android/settings/homepage/ContextualCardController.java index a7d89afc504..921d72bda8a 100644 --- a/src/com/android/settings/homepage/HomepageCardController.java +++ b/src/com/android/settings/homepage/ContextualCardController.java @@ -19,22 +19,22 @@ package com.android.settings.homepage; import java.util.List; /** - * Data controller for {@link HomepageCard}. + * Data controller for {@link ContextualCard}. */ -public interface HomepageCardController { +public interface ContextualCardController { - @HomepageCard.CardType + @ContextualCard.CardType int getCardType(); /** - * When data is updated or changed, the new data should be passed to HomepageManager for list + * When data is updated or changed, the new data should be passed to ContextualCardManager for list * updating. */ - void onDataUpdated(List cardList); + void onDataUpdated(List cardList); - void onPrimaryClick(HomepageCard card); + void onPrimaryClick(ContextualCard card); - void onActionClick(HomepageCard card); + void onActionClick(ContextualCard card); - void setHomepageCardUpdateListener(HomepageCardUpdateListener listener); + void setCardUpdateListener(ContextualCardUpdateListener listener); } diff --git a/src/com/android/settings/homepage/HomepageCardLookupTable.java b/src/com/android/settings/homepage/ContextualCardLookupTable.java similarity index 50% rename from src/com/android/settings/homepage/HomepageCardLookupTable.java rename to src/com/android/settings/homepage/ContextualCardLookupTable.java index 8d8e52b183e..e70b700fea2 100644 --- a/src/com/android/settings/homepage/HomepageCardLookupTable.java +++ b/src/com/android/settings/homepage/ContextualCardLookupTable.java @@ -16,43 +16,45 @@ package com.android.settings.homepage; -import com.android.settings.homepage.HomepageCard.CardType; -import com.android.settings.homepage.conditional.ConditionHomepageCardController; -import com.android.settings.homepage.conditional.ConditionHomepageCardRenderer; +import com.android.settings.homepage.ContextualCard.CardType; +import com.android.settings.homepage.conditional.ConditionContextualCardController; +import com.android.settings.homepage.conditional.ConditionContextualCardRenderer; import java.util.Set; import java.util.TreeSet; -public class HomepageCardLookupTable { +public class ContextualCardLookupTable { - static class HomepageMapping implements Comparable { + static class ControllerRendererMapping implements Comparable { @CardType private final int mCardType; - private final Class mControllerClass; - private final Class mRendererClass; + private final Class mControllerClass; + private final Class mRendererClass; - private HomepageMapping(@CardType int cardType, - Class controllerClass, - Class rendererClass) { + private ControllerRendererMapping(@CardType int cardType, + Class controllerClass, + Class rendererClass) { mCardType = cardType; mControllerClass = controllerClass; mRendererClass = rendererClass; } @Override - public int compareTo(HomepageMapping other) { + public int compareTo(ControllerRendererMapping other) { return Integer.compare(this.mCardType, other.mCardType); } } - private static final Set LOOKUP_TABLE = new TreeSet() {{ - add(new HomepageMapping(CardType.CONDITIONAL, ConditionHomepageCardController.class, - ConditionHomepageCardRenderer.class)); - }}; + private static final Set LOOKUP_TABLE = + new TreeSet() {{ + add(new ControllerRendererMapping(CardType.CONDITIONAL, + ConditionContextualCardController.class, + ConditionContextualCardRenderer.class)); + }}; - public static Class getCardControllerClass( + public static Class getCardControllerClass( @CardType int cardType) { - for (HomepageMapping mapping : LOOKUP_TABLE) { + for (ControllerRendererMapping mapping : LOOKUP_TABLE) { if (mapping.mCardType == cardType) { return mapping.mControllerClass; } @@ -61,9 +63,9 @@ public class HomepageCardLookupTable { } //TODO(b/112578070): Implement multi renderer cases. - public static Class getCardRendererClasses( + public static Class getCardRendererClasses( @CardType int cardType) { - for (HomepageMapping mapping : LOOKUP_TABLE) { + for (ControllerRendererMapping mapping : LOOKUP_TABLE) { if (mapping.mCardType == cardType) { return mapping.mRendererClass; } diff --git a/src/com/android/settings/homepage/HomepageManager.java b/src/com/android/settings/homepage/ContextualCardManager.java similarity index 55% rename from src/com/android/settings/homepage/HomepageManager.java rename to src/com/android/settings/homepage/ContextualCardManager.java index 61d7ce7c713..aa2f576ef11 100644 --- a/src/com/android/settings/homepage/HomepageManager.java +++ b/src/com/android/settings/homepage/ContextualCardManager.java @@ -26,37 +26,37 @@ import java.util.ArrayList; import java.util.List; /** - * This is a centralized manager of multiple {@link HomepageCardController}. + * This is a centralized manager of multiple {@link ContextualCardController}. * - * {@link HomepageManager} first loads data from {@link CardContentLoader} and gets back a list of - * {@link HomepageCard}. All subclasses of {@link HomepageCardController} are loaded here, which - * will then trigger the {@link HomepageCardController} to load its data and listen to - * corresponding changes. When every single {@link HomepageCardController} updates its data, the + * {@link ContextualCardManager} first loads data from {@link CardContentLoader} and gets back a + * list of {@link ContextualCard}. All subclasses of {@link ContextualCardController} are loaded + * here, which will then trigger the {@link ContextualCardController} to load its data and listen to + * corresponding changes. When every single {@link ContextualCardController} updates its data, the * data will be passed here, then going through some sorting mechanisms. The - * {@link HomepageCardController} will end up building a list of {@link HomepageCard} for {@link - * HomepageAdapter} and {@link BaseAdapter#notifyDataSetChanged()} will be called to get the page - * refreshed. + * {@link ContextualCardController} will end up building a list of {@link ContextualCard} for + * {@link ContextualCardsAdapter} and {@link BaseAdapter#notifyDataSetChanged()} will be called to + * get the page refreshed. */ -public class HomepageManager implements CardContentLoader.CardContentLoaderListener, - HomepageCardUpdateListener { +public class ContextualCardManager implements CardContentLoader.CardContentLoaderListener, + ContextualCardUpdateListener { - private static final String TAG = "HomepageManager"; + private static final String TAG = "ContextualCardManager"; //The list for Settings Custom Card - @HomepageCard.CardType - private static final int[] SETTINGS_CARDS = {HomepageCard.CardType.CONDITIONAL}; + @ContextualCard.CardType + private static final int[] SETTINGS_CARDS = {ContextualCard.CardType.CONDITIONAL}; private final Context mContext; private final ControllerRendererPool mControllerRendererPool; private final Lifecycle mLifecycle; + private final List mContextualCards; - private List mHomepageCards; - private HomepageCardUpdateListener mListener; + private ContextualCardUpdateListener mListener; - public HomepageManager(Context context, Lifecycle lifecycle) { + public ContextualCardManager(Context context, Lifecycle lifecycle) { mContext = context; mLifecycle = lifecycle; - mHomepageCards = new ArrayList<>(); + mContextualCards = new ArrayList<>(); mControllerRendererPool = new ControllerRendererPool(); } @@ -66,8 +66,8 @@ public class HomepageManager implements CardContentLoader.CardContentLoaderListe } private void loadCardControllers() { - if (mHomepageCards != null) { - for (HomepageCard card : mHomepageCards) { + if (mContextualCards != null) { + for (ContextualCard card : mContextualCards) { setupController(card.getCardType()); } } @@ -79,10 +79,10 @@ public class HomepageManager implements CardContentLoader.CardContentLoaderListe } private void setupController(int cardType) { - final HomepageCardController controller = mControllerRendererPool.getController(mContext, + final ContextualCardController controller = mControllerRendererPool.getController(mContext, cardType); if (controller != null) { - controller.setHomepageCardUpdateListener(this); + controller.setCardUpdateListener(this); if (controller instanceof LifecycleObserver) { if (mLifecycle != null) { mLifecycle.addObserver((LifecycleObserver) controller); @@ -93,35 +93,38 @@ public class HomepageManager implements CardContentLoader.CardContentLoaderListe //TODO(b/111822376): implement sorting mechanism. private void sortCards() { - //take mHomepageCards as the source and do the ranking based on the rule. + //take mContextualCards as the source and do the ranking based on the rule. } @Override - public void onHomepageCardUpdated(int cardType, List updateList) { + public void onContextualCardUpdated(int cardType, List updateList) { //TODO(b/112245748): Should implement a DiffCallback. //Keep the old list for comparison. - final List prevCards = mHomepageCards; + final List prevCards = mContextualCards; //Remove the existing data that matches the certain cardType so as to insert the new data. - for (int i = mHomepageCards.size() - 1; i >= 0; i--) { - if (mHomepageCards.get(i).getCardType() == cardType) { - mHomepageCards.remove(i); + for (int i = mContextualCards.size() - 1; i >= 0; i--) { + if (mContextualCards.get(i).getCardType() == cardType) { + mContextualCards.remove(i); } } //Append the new data - mHomepageCards.addAll(updateList); + mContextualCards.addAll(updateList); sortCards(); if (mListener != null) { - mListener.onHomepageCardUpdated(HomepageCard.CardType.INVALID, mHomepageCards); + mListener.onContextualCardUpdated(ContextualCard.CardType.INVALID, mContextualCards); } } @Override - public void onFinishCardLoading(List homepageCards) { - mHomepageCards = homepageCards; + public void onFinishCardLoading(List contextualCards) { + mContextualCards.clear(); + if (contextualCards != null) { + mContextualCards.addAll(contextualCards); + } //Force card sorting here in case CardControllers of custom view have nothing to update // for the first launch. @@ -130,7 +133,7 @@ public class HomepageManager implements CardContentLoader.CardContentLoaderListe loadCardControllers(); } - void setListener(HomepageCardUpdateListener listener) { + void setListener(ContextualCardUpdateListener listener) { mListener = listener; } diff --git a/src/com/android/settings/homepage/HomepageCardRenderer.java b/src/com/android/settings/homepage/ContextualCardRenderer.java similarity index 76% rename from src/com/android/settings/homepage/HomepageCardRenderer.java rename to src/com/android/settings/homepage/ContextualCardRenderer.java index ffa54e36a69..94fdb438f9e 100644 --- a/src/com/android/settings/homepage/HomepageCardRenderer.java +++ b/src/com/android/settings/homepage/ContextualCardRenderer.java @@ -21,9 +21,9 @@ import android.view.View; import androidx.recyclerview.widget.RecyclerView; /** - * UI renderer for {@link HomepageCard}. + * UI renderer for {@link ContextualCard}. */ -public interface HomepageCardRenderer { +public interface ContextualCardRenderer { /** * The layout type of the controller. @@ -31,16 +31,16 @@ public interface HomepageCardRenderer { int getViewType(); /** - * When {@link HomepageAdapter} calls {@link HomepageAdapter#onCreateViewHolder(ViewGroup, + * When {@link ContextualCardsAdapter} calls {@link ContextualCardsAdapter#onCreateViewHolder(ViewGroup, * int)}, this method will be called to retrieve the corresponding * {@link androidx.recyclerview.widget.RecyclerView.ViewHolder}. */ RecyclerView.ViewHolder createViewHolder(View view); /** - * When {@link HomepageAdapter} calls {@link HomepageAdapter#onBindViewHolder(RecyclerView + * When {@link ContextualCardsAdapter} calls {@link ContextualCardsAdapter#onBindViewHolder(RecyclerView * .ViewHolder, int)}, this method will be called to bind data to the * {@link androidx.recyclerview.widget.RecyclerView.ViewHolder}. */ - void bindView(RecyclerView.ViewHolder holder, HomepageCard card); + void bindView(RecyclerView.ViewHolder holder, ContextualCard card); } \ No newline at end of file diff --git a/src/com/android/settings/homepage/HomepageCardUpdateListener.java b/src/com/android/settings/homepage/ContextualCardUpdateListener.java similarity index 58% rename from src/com/android/settings/homepage/HomepageCardUpdateListener.java rename to src/com/android/settings/homepage/ContextualCardUpdateListener.java index 35bc3a34bf1..d307a8f563b 100644 --- a/src/com/android/settings/homepage/HomepageCardUpdateListener.java +++ b/src/com/android/settings/homepage/ContextualCardUpdateListener.java @@ -19,13 +19,13 @@ package com.android.settings.homepage; import java.util.List; /** - * When {@link HomepageCardController} detects changes, it will notify the listeners registered. In - * our case, {@link HomepageManager} gets noticed. + * When {@link ContextualCardController} detects changes, it will notify the listeners registered. + * In our case, {@link ContextualCardManager} gets noticed. * - * After the list of {@link HomepageCard} gets updated in{@link HomepageManager}, - * {@link HomepageManager} will notify the listeners registered, {@link HomepageAdapter} in this - * case. + * After the list of {@link ContextualCard} gets updated in{@link ContextualCardManager}, + * {@link ContextualCardManager} will notify the listeners registered, {@link + * ContextualCardsAdapter} in this case. */ -public interface HomepageCardUpdateListener { - void onHomepageCardUpdated(int cardType, List updateList); +public interface ContextualCardUpdateListener { + void onContextualCardUpdated(int cardType, List updateList); } \ No newline at end of file diff --git a/src/com/android/settings/homepage/HomepageAdapter.java b/src/com/android/settings/homepage/ContextualCardsAdapter.java similarity index 50% rename from src/com/android/settings/homepage/HomepageAdapter.java rename to src/com/android/settings/homepage/ContextualCardsAdapter.java index 9ff52603dab..e985343cd59 100644 --- a/src/com/android/settings/homepage/HomepageAdapter.java +++ b/src/com/android/settings/homepage/ContextualCardsAdapter.java @@ -21,42 +21,44 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; import java.util.ArrayList; import java.util.List; -public class HomepageAdapter extends RecyclerView.Adapter implements - HomepageCardUpdateListener { +public class ContextualCardsAdapter extends RecyclerView.Adapter implements + ContextualCardUpdateListener { + static final int SPAN_COUNT = 2; - private static final String TAG = "HomepageAdapter"; + private static final String TAG = "ContextualCardsAdapter"; + private static final int HALF_WIDTH = 1; + private static final int FULL_WIDTH = 2; private final Context mContext; private final ControllerRendererPool mControllerRendererPool; + private final List mContextualCards; - private List mHomepageCards; - private RecyclerView mRecyclerView; - - public HomepageAdapter(Context context, HomepageManager manager) { + public ContextualCardsAdapter(Context context, ContextualCardManager manager) { mContext = context; - mHomepageCards = new ArrayList<>(); + mContextualCards = new ArrayList<>(); mControllerRendererPool = manager.getControllerRendererPool(); setHasStableIds(true); } @Override public long getItemId(int position) { - return mHomepageCards.get(position).hashCode(); + return mContextualCards.get(position).hashCode(); } @Override public int getItemViewType(int position) { - return mHomepageCards.get(position).getCardType(); + return mContextualCards.get(position).getCardType(); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int cardType) { - final HomepageCardRenderer renderer = mControllerRendererPool.getRenderer(mContext, + final ContextualCardRenderer renderer = mControllerRendererPool.getRenderer(mContext, cardType); final int viewType = renderer.getViewType(); final View view = LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false); @@ -66,32 +68,47 @@ public class HomepageAdapter extends RecyclerView.Adapter homepageCards) { + public void onContextualCardUpdated(int cardType, List contextualCards) { //TODO(b/112245748): Should implement a DiffCallback so we can use notifyItemChanged() // instead. - if (homepageCards == null) { - mHomepageCards.clear(); + if (contextualCards == null) { + mContextualCards.clear(); } else { - mHomepageCards = homepageCards; + mContextualCards.clear(); + mContextualCards.addAll(contextualCards); } notifyDataSetChanged(); } diff --git a/src/com/android/settings/homepage/ControllerRendererPool.java b/src/com/android/settings/homepage/ControllerRendererPool.java index ebd63d4ff9b..1e4b37c24e5 100644 --- a/src/com/android/settings/homepage/ControllerRendererPool.java +++ b/src/com/android/settings/homepage/ControllerRendererPool.java @@ -21,77 +21,77 @@ import android.util.Log; import androidx.collection.ArraySet; -import com.android.settings.homepage.conditional.ConditionHomepageCardController; -import com.android.settings.homepage.conditional.ConditionHomepageCardRenderer; +import com.android.settings.homepage.conditional.ConditionContextualCardController; +import com.android.settings.homepage.conditional.ConditionContextualCardRenderer; import java.util.Set; /** - * This is a fragment scoped singleton holding a set of {@link HomepageCardController} and - * {@link HomepageCardRenderer}. + * This is a fragment scoped singleton holding a set of {@link ContextualCardController} and + * {@link ContextualCardRenderer}. */ public class ControllerRendererPool { private static final String TAG = "ControllerRendererPool"; - private final Set mControllers; - private final Set mRenderers; + private final Set mControllers; + private final Set mRenderers; public ControllerRendererPool() { mControllers = new ArraySet<>(); mRenderers = new ArraySet<>(); } - public T getController(Context context, - @HomepageCard.CardType int cardType) { - final Class clz = - HomepageCardLookupTable.getCardControllerClass(cardType); - for (HomepageCardController controller : mControllers) { + public T getController(Context context, + @ContextualCard.CardType int cardType) { + final Class clz = + ContextualCardLookupTable.getCardControllerClass(cardType); + for (ContextualCardController controller : mControllers) { if (controller.getClass() == clz) { Log.d(TAG, "Controller is already there."); return (T) controller; } } - final HomepageCardController controller = createCardController(context, clz); + final ContextualCardController controller = createCardController(context, clz); if (controller != null) { mControllers.add(controller); } return (T) controller; } - public Set getControllers() { + public Set getControllers() { return mControllers; } - public HomepageCardRenderer getRenderer(Context context, @HomepageCard.CardType int cardType) { - final Class clz = - HomepageCardLookupTable.getCardRendererClasses(cardType); - for (HomepageCardRenderer renderer : mRenderers) { + public ContextualCardRenderer getRenderer(Context context, @ContextualCard.CardType int cardType) { + final Class clz = + ContextualCardLookupTable.getCardRendererClasses(cardType); + for (ContextualCardRenderer renderer : mRenderers) { if (renderer.getClass() == clz) { Log.d(TAG, "Renderer is already there."); return renderer; } } - final HomepageCardRenderer renderer = createCardRenderer(context, clz); + final ContextualCardRenderer renderer = createCardRenderer(context, clz); if (renderer != null) { mRenderers.add(renderer); } return renderer; } - private HomepageCardController createCardController(Context context, - Class clz) { - if (ConditionHomepageCardController.class == clz) { - return new ConditionHomepageCardController(context); + private ContextualCardController createCardController(Context context, + Class clz) { + if (ConditionContextualCardController.class == clz) { + return new ConditionContextualCardController(context); } return null; } - private HomepageCardRenderer createCardRenderer(Context context, Class clz) { - if (ConditionHomepageCardRenderer.class == clz) { - return new ConditionHomepageCardRenderer(context, this /*controllerRendererPool*/); + private ContextualCardRenderer createCardRenderer(Context context, Class clz) { + if (ConditionContextualCardRenderer.class == clz) { + return new ConditionContextualCardRenderer(context, this /*controllerRendererPool*/); } return null; } diff --git a/src/com/android/settings/homepage/PersonalSettingsFragment.java b/src/com/android/settings/homepage/PersonalSettingsFragment.java index 0637f7fbec4..2eb9663cfda 100644 --- a/src/com/android/settings/homepage/PersonalSettingsFragment.java +++ b/src/com/android/settings/homepage/PersonalSettingsFragment.java @@ -16,12 +16,14 @@ package com.android.settings.homepage; +import static com.android.settings.homepage.ContextualCardsAdapter.SPAN_COUNT; + import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; @@ -33,31 +35,28 @@ public class PersonalSettingsFragment extends InstrumentedFragment { private static final String TAG = "PersonalSettingsFragment"; private RecyclerView mCardsContainer; - //TODO(b/113966426): rename - private HomepageAdapter mHomepageAdapter; - private LinearLayoutManager mLayoutManager; - //TODO(b/113966426): rename - private HomepageManager mHomepageManager; + private GridLayoutManager mLayoutManager; + private ContextualCardsAdapter mContextualCardsAdapter; + private ContextualCardManager mContextualCardManager; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - mHomepageManager = new HomepageManager(getContext(), getSettingsLifecycle()); - mHomepageManager.startCardContentLoading(); + mContextualCardManager = new ContextualCardManager(getContext(), getSettingsLifecycle()); + mContextualCardManager.startCardContentLoading(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - final View rootView = inflater.inflate(R.layout.settings_homepage, - container, false); - mCardsContainer = (RecyclerView) rootView.findViewById(R.id.card_container); - //TODO(b/111822407): May have to swap to GridLayoutManager - mLayoutManager = new LinearLayoutManager(getActivity()); + final View rootView = inflater.inflate(R.layout.settings_homepage, container, false); + mCardsContainer = rootView.findViewById(R.id.card_container); + mLayoutManager = new GridLayoutManager(getActivity(), SPAN_COUNT, + GridLayoutManager.VERTICAL, false /* reverseLayout */); mCardsContainer.setLayoutManager(mLayoutManager); - mHomepageAdapter = new HomepageAdapter(getContext(), mHomepageManager); - mCardsContainer.setAdapter(mHomepageAdapter); - mHomepageManager.setListener(mHomepageAdapter); + mContextualCardsAdapter = new ContextualCardsAdapter(getContext(), mContextualCardManager); + mCardsContainer.setAdapter(mContextualCardsAdapter); + mContextualCardManager.setListener(mContextualCardsAdapter); return rootView; } diff --git a/src/com/android/settings/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java similarity index 77% rename from src/com/android/settings/SettingsHomepageActivity.java rename to src/com/android/settings/homepage/SettingsHomepageActivity.java index de25cf4e27a..35b45a4642a 100644 --- a/src/com/android/settings/SettingsHomepageActivity.java +++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java @@ -14,31 +14,31 @@ * limitations under the License. */ -package com.android.settings; +package com.android.settings.homepage; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.util.FeatureFlagUtils; +import androidx.annotation.VisibleForTesting; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; +import com.android.settings.R; import com.android.settings.core.FeatureFlags; import com.android.settings.core.SettingsBaseActivity; -import com.android.settings.dashboard.DashboardSummary; -import com.android.settings.homepage.PersonalSettingsFragment; import com.android.settings.overlay.FeatureFactory; -import com.android.settings.search.SearchFeatureProvider; import com.google.android.material.bottomnavigation.BottomNavigationView; import com.google.android.material.floatingactionbutton.FloatingActionButton; public class SettingsHomepageActivity extends SettingsBaseActivity { + @VisibleForTesting + static final String PERSONAL_SETTINGS_TAG = "personal_settings"; private static final String ALL_SETTINGS_TAG = "all_settings"; - private static final String PERSONAL_SETTINGS_TAG = "personal_settings"; @Override protected void onCreate(Bundle savedInstanceState) { @@ -58,30 +58,35 @@ public class SettingsHomepageActivity extends SettingsBaseActivity { FeatureFactory.getFactory(this).getSearchFeatureProvider() .initSearchToolbar(this, searchButton); - final BottomNavigationView navigation = (BottomNavigationView) findViewById( - R.id.bottom_nav); + final BottomNavigationView navigation = findViewById(R.id.bottom_nav); navigation.setOnNavigationItemSelectedListener(item -> { switch (item.getItemId()) { case R.id.homepage_personal_settings: - switchFragment(PersonalSettingsFragment.class.getName(), PERSONAL_SETTINGS_TAG, + switchFragment(new PersonalSettingsFragment(), PERSONAL_SETTINGS_TAG, ALL_SETTINGS_TAG); return true; case R.id.homepage_all_settings: - switchFragment(DashboardSummary.class.getName(), ALL_SETTINGS_TAG, + switchFragment(new TopLevelSettings(), ALL_SETTINGS_TAG, PERSONAL_SETTINGS_TAG); return true; } return false; }); + + if (savedInstanceState == null) { + // savedInstanceState is null, this is first load. + // Default to open contextual cards. + switchFragment(new PersonalSettingsFragment(), PERSONAL_SETTINGS_TAG, + ALL_SETTINGS_TAG); + } } public static boolean isDynamicHomepageEnabled(Context context) { return FeatureFlagUtils.isEnabled(context, FeatureFlags.DYNAMIC_HOMEPAGE); } - private void switchFragment(String fragmentName, String showFragmentTag, - String hideFragmentTag) { + private void switchFragment(Fragment fragment, String showFragmentTag, String hideFragmentTag) { final FragmentManager fragmentManager = getSupportFragmentManager(); final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); @@ -92,8 +97,7 @@ public class SettingsHomepageActivity extends SettingsBaseActivity { Fragment showFragment = fragmentManager.findFragmentByTag(showFragmentTag); if (showFragment == null) { - showFragment = Fragment.instantiate(this, fragmentName, null /* args */); - fragmentTransaction.add(R.id.main_content, showFragment, showFragmentTag); + fragmentTransaction.add(R.id.main_content, fragment, showFragmentTag); } else { fragmentTransaction.show(showFragment); } diff --git a/src/com/android/settings/homepage/conditional/ConditionHomepageCardController.java b/src/com/android/settings/homepage/conditional/ConditionContextualCardController.java similarity index 54% rename from src/com/android/settings/homepage/conditional/ConditionHomepageCardController.java rename to src/com/android/settings/homepage/conditional/ConditionContextualCardController.java index bb7af4b7084..6701cfd0196 100644 --- a/src/com/android/settings/homepage/conditional/ConditionHomepageCardController.java +++ b/src/com/android/settings/homepage/conditional/ConditionContextualCardController.java @@ -18,9 +18,9 @@ package com.android.settings.homepage.conditional; import android.content.Context; -import com.android.settings.homepage.HomepageCard; -import com.android.settings.homepage.HomepageCardController; -import com.android.settings.homepage.HomepageCardUpdateListener; +import com.android.settings.homepage.ContextualCard; +import com.android.settings.homepage.ContextualCardController; +import com.android.settings.homepage.ContextualCardUpdateListener; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnStart; import com.android.settingslib.core.lifecycle.events.OnStop; @@ -32,33 +32,33 @@ import java.util.List; * This controller triggers the loading of conditional cards and monitors state changes to * update the homepage. */ -public class ConditionHomepageCardController implements HomepageCardController, ConditionListener, - LifecycleObserver, OnStart, OnStop { +public class ConditionContextualCardController implements ContextualCardController, + ConditionListener, LifecycleObserver, OnStart, OnStop { private final Context mContext; private final ConditionManager mConditionManager; - private HomepageCardUpdateListener mListener; + private ContextualCardUpdateListener mListener; - public ConditionHomepageCardController(Context context) { + public ConditionContextualCardController(Context context) { mContext = context; mConditionManager = new ConditionManager(context.getApplicationContext(), this); mConditionManager.startMonitoringStateChange(); } @Override - public void setHomepageCardUpdateListener(HomepageCardUpdateListener listener) { + public void setCardUpdateListener(ContextualCardUpdateListener listener) { mListener = listener; } @Override public int getCardType() { - return HomepageCard.CardType.CONDITIONAL; + return ContextualCard.CardType.CONDITIONAL; } @Override - public void onDataUpdated(List cardList) { - mListener.onHomepageCardUpdated(getCardType(), cardList); + public void onDataUpdated(List cardList) { + mListener.onContextualCardUpdated(getCardType(), cardList); } @Override @@ -72,34 +72,35 @@ public class ConditionHomepageCardController implements HomepageCardController, } @Override - public void onPrimaryClick(HomepageCard homepageCard) { - final ConditionCard card = (ConditionCard) homepageCard; + public void onPrimaryClick(ContextualCard contextualCard) { + final ConditionalContextualCard card = (ConditionalContextualCard) contextualCard; mConditionManager.onPrimaryClick(mContext, card.getConditionId()); - } @Override - public void onActionClick(HomepageCard homepageCard) { - final ConditionCard card = (ConditionCard) homepageCard; + public void onActionClick(ContextualCard contextualCard) { + final ConditionalContextualCard card = (ConditionalContextualCard) contextualCard; mConditionManager.onActionClick(card.getConditionId()); } @Override public void onConditionsChanged() { - final List conditionCards = new ArrayList<>(); + final List conditionCards = new ArrayList<>(); final List conditionList = mConditionManager.getDisplayableCards(); for (ConditionalCard condition : conditionList) { - final ConditionCard conditionCard = ((ConditionCard.Builder) new ConditionCard.Builder() - .setConditionId(condition.getId()) - .setMetricsConstant(condition.getMetricsConstant()) - .setActionText(condition.getActionText()) - .setName(mContext.getPackageName() + "/" + condition.getTitle().toString()) - .setCardType(HomepageCard.CardType.CONDITIONAL) - .setTitleText(condition.getTitle().toString()) - .setSummaryText(condition.getSummary().toString()) - .setIconDrawable(condition.getIcon())) - .build(); + final ContextualCard conditionCard = + new ConditionalContextualCard.Builder() + .setConditionId(condition.getId()) + .setMetricsConstant(condition.getMetricsConstant()) + .setActionText(condition.getActionText()) + .setName(mContext.getPackageName() + "/" + + condition.getTitle().toString()) + .setCardType(ContextualCard.CardType.CONDITIONAL) + .setTitleText(condition.getTitle().toString()) + .setSummaryText(condition.getSummary().toString()) + .setIconDrawable(condition.getIcon()) + .build(); conditionCards.add(conditionCard); } diff --git a/src/com/android/settings/homepage/conditional/ConditionHomepageCardRenderer.java b/src/com/android/settings/homepage/conditional/ConditionContextualCardRenderer.java similarity index 89% rename from src/com/android/settings/homepage/conditional/ConditionHomepageCardRenderer.java rename to src/com/android/settings/homepage/conditional/ConditionContextualCardRenderer.java index 6aa90ae558c..69988aeabdb 100644 --- a/src/com/android/settings/homepage/conditional/ConditionHomepageCardRenderer.java +++ b/src/com/android/settings/homepage/conditional/ConditionContextualCardRenderer.java @@ -27,21 +27,21 @@ import androidx.recyclerview.widget.RecyclerView; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; +import com.android.settings.homepage.ContextualCard; import com.android.settings.homepage.ControllerRendererPool; -import com.android.settings.homepage.HomepageCard; -import com.android.settings.homepage.HomepageCardRenderer; +import com.android.settings.homepage.ContextualCardRenderer; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; /** - * Card renderer for {@link ConditionCard}. + * Card renderer for {@link ConditionalContextualCard}. */ -public class ConditionHomepageCardRenderer implements HomepageCardRenderer { +public class ConditionContextualCardRenderer implements ContextualCardRenderer { private final Context mContext; private final ControllerRendererPool mControllerRendererPool; - public ConditionHomepageCardRenderer(Context context, + public ConditionContextualCardRenderer(Context context, ControllerRendererPool controllerRendererPool) { mContext = context; mControllerRendererPool = controllerRendererPool; @@ -58,9 +58,9 @@ public class ConditionHomepageCardRenderer implements HomepageCardRenderer { } @Override - public void bindView(RecyclerView.ViewHolder holder, HomepageCard homepageCard) { + public void bindView(RecyclerView.ViewHolder holder, ContextualCard contextualCard) { final ConditionalCardHolder view = (ConditionalCardHolder) holder; - final ConditionCard card = (ConditionCard) homepageCard; + final ConditionalContextualCard card = (ConditionalContextualCard) contextualCard; final MetricsFeatureProvider metricsFeatureProvider = FeatureFactory.getFactory( mContext).getMetricsFeatureProvider(); @@ -71,7 +71,7 @@ public class ConditionHomepageCardRenderer implements HomepageCardRenderer { initializeActionButton(view, card, metricsFeatureProvider); } - private void initializePrimaryClick(ConditionalCardHolder view, ConditionCard card, + private void initializePrimaryClick(ConditionalCardHolder view, ConditionalContextualCard card, MetricsFeatureProvider metricsFeatureProvider) { view.itemView.findViewById(R.id.content).setOnClickListener( v -> { @@ -83,7 +83,7 @@ public class ConditionHomepageCardRenderer implements HomepageCardRenderer { }); } - private void initializeView(ConditionalCardHolder view, ConditionCard card) { + private void initializeView(ConditionalCardHolder view, ConditionalContextualCard card) { view.icon.setImageDrawable(card.getIconDrawable()); view.title.setText(card.getTitleText()); view.summary.setText(card.getSummaryText()); @@ -91,7 +91,7 @@ public class ConditionHomepageCardRenderer implements HomepageCardRenderer { setViewVisibility(view.itemView, R.id.divider, false); } - private void initializeActionButton(ConditionalCardHolder view, ConditionCard card, + private void initializeActionButton(ConditionalCardHolder view, ConditionalContextualCard card, MetricsFeatureProvider metricsFeatureProvider) { final CharSequence action = card.getActionText(); final boolean hasButtons = !TextUtils.isEmpty(action); diff --git a/src/com/android/settings/homepage/conditional/ConditionCard.java b/src/com/android/settings/homepage/conditional/ConditionalContextualCard.java similarity index 81% rename from src/com/android/settings/homepage/conditional/ConditionCard.java rename to src/com/android/settings/homepage/conditional/ConditionalContextualCard.java index 9f445b2afd6..62a4956efcd 100644 --- a/src/com/android/settings/homepage/conditional/ConditionCard.java +++ b/src/com/android/settings/homepage/conditional/ConditionalContextualCard.java @@ -16,21 +16,21 @@ package com.android.settings.homepage.conditional; -import com.android.settings.homepage.HomepageCard; +import com.android.settings.homepage.ContextualCard; /** - * Data class representing a {@link ConditionCard}. + * Data class representing a conditional {@link ContextualCard}. * - * Use this class to store additional attributes on top of {@link HomepageCard} for + * Use this class to store additional attributes on top of {@link ContextualCard} for * {@link ConditionalCard}. */ -public class ConditionCard extends HomepageCard { +public class ConditionalContextualCard extends ContextualCard { private final long mConditionId; private final int mMetricsConstant; private final CharSequence mActionText; - private ConditionCard(Builder builder) { + private ConditionalContextualCard(Builder builder) { super(builder); mConditionId = builder.mConditionId; @@ -50,7 +50,7 @@ public class ConditionCard extends HomepageCard { return mActionText; } - static class Builder extends HomepageCard.Builder { + static class Builder extends ContextualCard.Builder { private long mConditionId; private int mMetricsConstant; @@ -71,8 +71,8 @@ public class ConditionCard extends HomepageCard { return this; } - public ConditionCard build() { - return new ConditionCard(this); + public ConditionalContextualCard build() { + return new ConditionalContextualCard(this); } } } \ No newline at end of file diff --git a/src/com/android/settings/notification/NotificationSettingsBase.java b/src/com/android/settings/notification/NotificationSettingsBase.java index d06b545869f..ed0b1235ef4 100644 --- a/src/com/android/settings/notification/NotificationSettingsBase.java +++ b/src/com/android/settings/notification/NotificationSettingsBase.java @@ -112,19 +112,22 @@ abstract public class NotificationSettingsBase extends DashboardFragment { mPkgInfo = findPackageInfo(mPkg, mUid); - mUserId = UserHandle.getUserId(mUid); - mSuspendedAppsAdmin = RestrictedLockUtilsInternal.checkIfApplicationIsSuspended( - mContext, mPkg, mUserId); + if (mPkgInfo != null) { + mUserId = UserHandle.getUserId(mUid); + mSuspendedAppsAdmin = RestrictedLockUtilsInternal.checkIfApplicationIsSuspended( + mContext, mPkg, mUserId); - loadChannel(); - loadAppRow(); - loadChannelGroup(); - collectConfigActivities(); - getSettingsLifecycle().addObserver(use(HeaderPreferenceController.class)); + loadChannel(); + loadAppRow(); + loadChannelGroup(); + collectConfigActivities(); - for (NotificationPreferenceController controller : mControllers) { - controller.onResume(mAppRow, mChannel, mChannelGroup, mSuspendedAppsAdmin); + getSettingsLifecycle().addObserver(use(HeaderPreferenceController.class)); + + for (NotificationPreferenceController controller : mControllers) { + controller.onResume(mAppRow, mChannel, mChannelGroup, mSuspendedAppsAdmin); + } } } diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java index 181ab9dabd5..5e961a6d20d 100644 --- a/src/com/android/settings/users/UserSettings.java +++ b/src/com/android/settings/users/UserSettings.java @@ -964,9 +964,9 @@ public class UserSettings extends SettingsPreferenceFragment mAddUserWhenLockedPreferenceController.getPreferenceKey()); mAddUserWhenLockedPreferenceController.updateState(addUserOnLockScreen); mMultiUserFooterPreferenceController.updateState(null /* preference */); - mAddUser.setVisible(mUserCaps.mUserSwitcherEnabled); mUserListCategory.setVisible(mUserCaps.mUserSwitcherEnabled); if (!mUserCaps.mUserSwitcherEnabled) { + mAddUser.setVisible(false); return; } diff --git a/src/com/android/settings/utils/ManagedServiceSettings.java b/src/com/android/settings/utils/ManagedServiceSettings.java index 6ee5e8e3ac0..d6deba60fb6 100644 --- a/src/com/android/settings/utils/ManagedServiceSettings.java +++ b/src/com/android/settings/utils/ManagedServiceSettings.java @@ -117,7 +117,7 @@ public abstract class ManagedServiceSettings extends EmptyTextSettings { CharSequence title = null; try { title = mPm.getApplicationInfoAsUser( - service.packageName, 0, getCurrentUser(managedProfileId)).loadLabel(mPm); + service.packageName, 0, UserHandle.myUserId()).loadLabel(mPm); } catch (PackageManager.NameNotFoundException e) { // unlikely, as we are iterating over live services. Log.e(TAG, "can't find package name", e); diff --git a/tests/robotests/res/values/themes.xml b/tests/robotests/res/values/themes.xml index 9a247f6abd8..d3ba69fe292 100644 --- a/tests/robotests/res/values/themes.xml +++ b/tests/robotests/res/values/themes.xml @@ -6,5 +6,14 @@ - diff --git a/tests/robotests/src/com/android/settings/SettingsActivityTest.java b/tests/robotests/src/com/android/settings/SettingsActivityTest.java index 723978f9bb1..409512eb140 100644 --- a/tests/robotests/src/com/android/settings/SettingsActivityTest.java +++ b/tests/robotests/src/com/android/settings/SettingsActivityTest.java @@ -73,10 +73,11 @@ public class SettingsActivityTest { Global.putInt(mContext.getContentResolver(), Global.DEVICE_PROVISIONED, 0); final Intent intent = new Intent(mContext, Settings.class); final SettingsActivity activity = - Robolectric.buildActivity(SettingsActivity.class, intent).create(Bundle.EMPTY).get(); + Robolectric.buildActivity(SettingsActivity.class, intent).create( + Bundle.EMPTY).get(); assertThat(activity.findViewById(R.id.search_bar).getVisibility()) - .isEqualTo(View.INVISIBLE); + .isEqualTo(View.INVISIBLE); } @Test @@ -84,7 +85,8 @@ public class SettingsActivityTest { Global.putInt(mContext.getContentResolver(), Global.DEVICE_PROVISIONED, 1); final Intent intent = new Intent(mContext, Settings.class); final SettingsActivity activity = - Robolectric.buildActivity(SettingsActivity.class, intent).create(Bundle.EMPTY).get(); + Robolectric.buildActivity(SettingsActivity.class, intent).create( + Bundle.EMPTY).get(); assertThat(activity.findViewById(R.id.search_bar).getVisibility()).isEqualTo(View.VISIBLE); } @@ -92,6 +94,7 @@ public class SettingsActivityTest { @Test public void launchSettingFragment_nullExtraShowFragment_shouldNotCrash() { when(mActivity.getSupportFragmentManager()).thenReturn(mFragmentManager); + doReturn(mContext.getContentResolver()).when(mActivity).getContentResolver(); when(mFragmentManager.beginTransaction()).thenReturn(mock(FragmentTransaction.class)); doReturn(RuntimeEnvironment.application.getClassLoader()).when(mActivity).getClassLoader(); diff --git a/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java b/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java new file mode 100644 index 00000000000..4b237a0e0ed --- /dev/null +++ b/tests/robotests/src/com/android/settings/homepage/SettingsHomepageActivityTest.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.homepage; + +import static com.android.settings.homepage.SettingsHomepageActivity.PERSONAL_SETTINGS_TAG; + +import static com.google.common.truth.Truth.assertThat; + +import android.content.Context; +import android.util.FeatureFlagUtils; + +import androidx.fragment.app.Fragment; + +import com.android.settings.core.FeatureFlags; +import com.android.settings.testutils.SettingsRobolectricTestRunner; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.Robolectric; +import org.robolectric.RuntimeEnvironment; + +@RunWith(SettingsRobolectricTestRunner.class) +public class SettingsHomepageActivityTest { + + private Context mContext; + private SettingsHomepageActivity mActivity; + + @Before + public void setUp() { + mContext = RuntimeEnvironment.application; + FeatureFlagUtils.setEnabled(mContext, FeatureFlags.DYNAMIC_HOMEPAGE, true); + } + + @Test + public void launchHomepage_shouldOpenPersonalSettings() { + mActivity = Robolectric.setupActivity(SettingsHomepageActivity.class); + final Fragment fragment = mActivity.getSupportFragmentManager() + .findFragmentByTag(PERSONAL_SETTINGS_TAG); + + assertThat(fragment).isInstanceOf(PersonalSettingsFragment.class); + } +} diff --git a/tests/robotests/src/com/android/settings/homepage/conditional/ConditionHomepageCardControllerTest.java b/tests/robotests/src/com/android/settings/homepage/conditional/ConditionContextualCardControllerTest.java similarity index 91% rename from tests/robotests/src/com/android/settings/homepage/conditional/ConditionHomepageCardControllerTest.java rename to tests/robotests/src/com/android/settings/homepage/conditional/ConditionContextualCardControllerTest.java index 2b8ab00e796..ed45ce7480d 100644 --- a/tests/robotests/src/com/android/settings/homepage/conditional/ConditionHomepageCardControllerTest.java +++ b/tests/robotests/src/com/android/settings/homepage/conditional/ConditionContextualCardControllerTest.java @@ -26,7 +26,7 @@ import android.content.Context; import android.graphics.drawable.Drawable; import com.android.settings.R; -import com.android.settings.homepage.HomepageCardUpdateListener; +import com.android.settings.homepage.ContextualCardUpdateListener; import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.Before; @@ -41,20 +41,20 @@ import java.util.ArrayList; import java.util.List; @RunWith(SettingsRobolectricTestRunner.class) -public class ConditionHomepageCardControllerTest { +public class ConditionContextualCardControllerTest { @Mock private ConditionManager mConditionManager; @Mock - private HomepageCardUpdateListener mListener; + private ContextualCardUpdateListener mListener; private Context mContext; - private ConditionHomepageCardController mController; + private ConditionContextualCardController mController; @Before public void setUp() { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); - mController = spy(new ConditionHomepageCardController(mContext)); + mController = spy(new ConditionContextualCardController(mContext)); ReflectionHelpers.setField(mController, "mConditionManager", mConditionManager); } @@ -78,7 +78,7 @@ public class ConditionHomepageCardControllerTest { final List conditionalCards = new ArrayList<>(); conditionalCards.add(fakeConditionalCard); when(mConditionManager.getDisplayableCards()).thenReturn(conditionalCards); - mController.setHomepageCardUpdateListener(mListener); + mController.setCardUpdateListener(mListener); mController.onConditionsChanged(); diff --git a/tests/robotests/src/com/android/settings/homepage/conditional/ConditionHomepageCardRendererTest.java b/tests/robotests/src/com/android/settings/homepage/conditional/ConditionContextualCardRendererTest.java similarity index 79% rename from tests/robotests/src/com/android/settings/homepage/conditional/ConditionHomepageCardRendererTest.java rename to tests/robotests/src/com/android/settings/homepage/conditional/ConditionContextualCardRendererTest.java index 663931a2eb0..1ee052d20d2 100644 --- a/tests/robotests/src/com/android/settings/homepage/conditional/ConditionHomepageCardRendererTest.java +++ b/tests/robotests/src/com/android/settings/homepage/conditional/ConditionContextualCardRendererTest.java @@ -31,8 +31,8 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.android.settings.R; +import com.android.settings.homepage.ContextualCard; import com.android.settings.homepage.ControllerRendererPool; -import com.android.settings.homepage.HomepageCard; import com.android.settings.testutils.SettingsRobolectricTestRunner; import org.junit.Before; @@ -43,20 +43,20 @@ import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; @RunWith(SettingsRobolectricTestRunner.class) -public class ConditionHomepageCardRendererTest { +public class ConditionContextualCardRendererTest { @Mock private ControllerRendererPool mControllerRendererPool; @Mock - private ConditionHomepageCardController mController; + private ConditionContextualCardController mController; private Context mContext; - private ConditionHomepageCardRenderer mRenderer; + private ConditionContextualCardRenderer mRenderer; @Before public void setUp() { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); - mRenderer = new ConditionHomepageCardRenderer(mContext, mControllerRendererPool); + mRenderer = new ConditionContextualCardRenderer(mContext, mControllerRendererPool); } @Test @@ -68,9 +68,9 @@ public class ConditionHomepageCardRendererTest { final RecyclerView.ViewHolder viewHolder = mRenderer.createViewHolder(view); final View card = view.findViewById(R.id.content); when(mControllerRendererPool.getController(mContext, - HomepageCard.CardType.CONDITIONAL)).thenReturn(mController); + ContextualCard.CardType.CONDITIONAL)).thenReturn(mController); - mRenderer.bindView(viewHolder, getHomepageCard()); + mRenderer.bindView(viewHolder, buildConditionContextualCard()); assertThat(card).isNotNull(); assertThat(card.hasOnClickListeners()).isTrue(); @@ -85,28 +85,27 @@ public class ConditionHomepageCardRendererTest { final RecyclerView.ViewHolder viewHolder = mRenderer.createViewHolder(view); final View card = view.findViewById(R.id.content); when(mControllerRendererPool.getController(mContext, - HomepageCard.CardType.CONDITIONAL)).thenReturn(mController); + ContextualCard.CardType.CONDITIONAL)).thenReturn(mController); - mRenderer.bindView(viewHolder, getHomepageCard()); + mRenderer.bindView(viewHolder, buildConditionContextualCard()); assertThat(card).isNotNull(); card.performClick(); - verify(mController).onPrimaryClick(any(HomepageCard.class)); + verify(mController).onPrimaryClick(any(ContextualCard.class)); } - private HomepageCard getHomepageCard() { - ConditionCard conditionCard = ((ConditionCard.Builder) new ConditionCard.Builder() + private ContextualCard buildConditionContextualCard() { + return new ConditionalContextualCard.Builder() .setConditionId(123) .setMetricsConstant(1) .setActionText("test_action") .setName("test_name") - .setCardType(HomepageCard.CardType.CONDITIONAL) + .setCardType(ContextualCard.CardType.CONDITIONAL) .setTitleText("test_title") .setSummaryText("test_summary") .setIconDrawable(mContext.getDrawable(R.drawable.ic_do_not_disturb_on_24dp)) - .setIsHalfWidth(true)) + .setIsHalfWidth(true) .build(); - return conditionCard; } } diff --git a/tests/robotests/src/com/android/settings/testutils/SettingsRobolectricTestRunner.java b/tests/robotests/src/com/android/settings/testutils/SettingsRobolectricTestRunner.java index ad808fcd8db..1432ab1a78a 100644 --- a/tests/robotests/src/com/android/settings/testutils/SettingsRobolectricTestRunner.java +++ b/tests/robotests/src/com/android/settings/testutils/SettingsRobolectricTestRunner.java @@ -85,6 +85,8 @@ public class SettingsRobolectricTestRunner extends RobolectricTestRunner { Fs.fromURL(new URL("file:frameworks/opt/setupwizard/library/recyclerview/res")), null)); paths.add(new ResourcePath(null, Fs.fromURL(new URL("file:out/soong/.intermediates/prebuilts/sdk/current/androidx/androidx.appcompat_appcompat-nodeps/android_common/aar/res/")), null)); + paths.add(new ResourcePath(null, + Fs.fromURL(new URL("file:out/soong/.intermediates/prebuilts/sdk/current/extras/material-design-x/com.google.android.material_material-nodeps/android_common/aar/res/")), null)); paths.add(new ResourcePath(null, Fs.fromURL(new URL("file:out/soong/.intermediates/prebuilts/sdk/current/androidx/androidx.cardview_cardview-nodeps/android_common/aar/res")), null)); } catch (MalformedURLException e) { diff --git a/tests/robotests/src/com/android/settings/users/UserSettingsTest.java b/tests/robotests/src/com/android/settings/users/UserSettingsTest.java index 41f48c6d01a..413d77154e3 100644 --- a/tests/robotests/src/com/android/settings/users/UserSettingsTest.java +++ b/tests/robotests/src/com/android/settings/users/UserSettingsTest.java @@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.anyInt; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -184,4 +185,31 @@ public class UserSettingsTest { assertThat(addUser.isEnabled()).isFalse(); } + + @Test + public void updateUserList_cannotAddUserButCanSwitchUser_shouldNotShowAddUser() { + Settings.Global.putInt(mContext.getContentResolver(), + Settings.Global.DEVICE_PROVISIONED, 1); + final RestrictedPreference addUser = mock(RestrictedPreference.class); + + mUserCapabilities.mCanAddUser = false; + mUserCapabilities.mDisallowAddUser = true; + mUserCapabilities.mUserSwitcherEnabled = true; + + ReflectionHelpers.setField(mFragment, "mUserManager", mUserManager); + ReflectionHelpers.setField(mFragment, "mUserCaps", mUserCapabilities); + ReflectionHelpers.setField(mFragment, "mDefaultIconDrawable", mDefaultIconDrawable); + ReflectionHelpers.setField(mFragment, "mAddingUser", false); + mFragment.mMePreference = mMePreference; + mFragment.mUserListCategory = mock(PreferenceCategory.class); + mFragment.mAddUser = addUser; + + doReturn(mock(PreferenceScreen.class)).when(mFragment).getPreferenceScreen(); + + mFragment.updateUserList(); + + verify(addUser, never()).setVisible(true); + + } + }