diff --git a/res/layout/master_clear.xml b/res/layout/master_clear.xml index 9f899613844..921347e655e 100644 --- a/res/layout/master_clear.xml +++ b/res/layout/master_clear.xml @@ -23,8 +23,8 @@ android:id="@+id/master_clear_scrollview" android:layout_width="match_parent" android:layout_height="0dip" - android:layout_marginStart="@dimen/preference_no_icon_padding_start" - android:layout_marginEnd="12dp" + android:layout_marginStart="@dimen/reset_master_clear_margin_start" + android:layout_marginEnd="@dimen/reset_master_clear_margin_end" android:layout_marginTop="12dp" android:layout_weight="1"> diff --git a/res/layout/screen_pinning_instructions.xml b/res/layout/screen_pinning_instructions.xml index 80fec3ce70c..fea5ed8fe0a 100644 --- a/res/layout/screen_pinning_instructions.xml +++ b/res/layout/screen_pinning_instructions.xml @@ -31,8 +31,8 @@ android:paddingTop="@dimen/screen_pinning_textview_padding" android:text="@string/screen_pinning_description" android:textAppearance="@style/TextAppearance.Medium" - android:paddingStart="@dimen/screen_margin_sides" - android:paddingEnd="@dimen/screen_margin_sides" + android:paddingStart="@dimen/screen_pinning_padding_start" + android:paddingEnd="@dimen/screen_pinning_padding_end" /> diff --git a/res/values-sw600dp-land/dimens.xml b/res/values-sw600dp-land/dimens.xml index d5ea762074a..afdcd0e1090 100755 --- a/res/values-sw600dp-land/dimens.xml +++ b/res/values-sw600dp-land/dimens.xml @@ -29,4 +29,8 @@ 20dp 24dp + + + 128dp + 128dp diff --git a/res/values-sw600dp/dimens.xml b/res/values-sw600dp/dimens.xml index 273225e80f3..241471ccf09 100755 --- a/res/values-sw600dp/dimens.xml +++ b/res/values-sw600dp/dimens.xml @@ -62,4 +62,8 @@ 48dp 0dp 64dp + + + 40dp + 40dp diff --git a/res/values-xlarge/dimens.xml b/res/values-xlarge/dimens.xml index b6b4591f8b1..df9d56f5d8e 100755 --- a/res/values-xlarge/dimens.xml +++ b/res/values-xlarge/dimens.xml @@ -18,4 +18,8 @@ 128dip 154dip 96dip + + + 128dp + 128dp diff --git a/res/values/dimens.xml b/res/values/dimens.xml index be57bf77527..16d9f9668d9 100755 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -297,6 +297,16 @@ 66dp 100dp + + 72dp + 12dp + 72dp + 12dp + + + 64dp + 64dp + 10dp 5dp diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java index 4197e2ff3fe..87a35116ca0 100644 --- a/src/com/android/settings/SettingsPreferenceFragment.java +++ b/src/com/android/settings/SettingsPreferenceFragment.java @@ -541,10 +541,6 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF private DialogInterface.OnCancelListener mOnCancelListener; private DialogInterface.OnDismissListener mOnDismissListener; - public SettingsDialogFragment() { - /* do nothing */ - } - public SettingsDialogFragment(DialogCreatable fragment, int dialogId) { super(fragment, dialogId); if (!(fragment instanceof Fragment)) { diff --git a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java index 0696b5ee822..7b9cc796ab0 100755 --- a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java +++ b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java @@ -185,16 +185,22 @@ public class AppInfoDashboardFragment extends DashboardFragment mDpm = (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE); mUserManager = (UserManager) activity.getSystemService(Context.USER_SERVICE); mPm = activity.getPackageManager(); - if (!ensurePackageInfoAvailable(activity)) { return; } - startListeningToPackageRemove(); setHasOptionsMenu(true); } + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + if (!ensurePackageInfoAvailable(getActivity())) { + return; + } + super.onCreatePreferences(savedInstanceState, rootKey); + } + @Override public void onDestroy() { stopListeningToPackageRemove(); diff --git a/src/com/android/settings/connecteddevice/usb/UsbDetailsFragment.java b/src/com/android/settings/connecteddevice/usb/UsbDetailsFragment.java index 4b717e05596..936a4c00de6 100644 --- a/src/com/android/settings/connecteddevice/usb/UsbDetailsFragment.java +++ b/src/com/android/settings/connecteddevice/usb/UsbDetailsFragment.java @@ -17,7 +17,6 @@ package com.android.settings.connecteddevice.usb; import android.content.Context; -import android.os.Bundle; import android.provider.SearchIndexableResource; import androidx.annotation.VisibleForTesting; @@ -70,15 +69,6 @@ public class UsbDetailsFragment extends DashboardFragment { return R.xml.usb_details_fragment; } - @Override - public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { - super.onCreatePreferences(savedInstanceState, rootKey); - } - - public boolean isConnected() { - return mUsbReceiver.isConnected(); - } - @Override protected List createPreferenceControllers(Context context) { mUsbBackend = new UsbBackend(context); diff --git a/src/com/android/settings/core/FeatureFlags.java b/src/com/android/settings/core/FeatureFlags.java index 08b4e82e9ca..1062811cfa5 100644 --- a/src/com/android/settings/core/FeatureFlags.java +++ b/src/com/android/settings/core/FeatureFlags.java @@ -20,7 +20,6 @@ package com.android.settings.core; * This class keeps track of all feature flags in Settings. */ public class FeatureFlags { - public static final String BATTERY_DISPLAY_APP_LIST = "settings_battery_display_app_list"; public static final String BLUETOOTH_WHILE_DRIVING = "settings_bluetooth_while_driving"; public static final String AUDIO_SWITCHER_SETTINGS = "settings_audio_switcher"; public static final String DYNAMIC_HOMEPAGE = "settings_dynamic_homepage"; diff --git a/src/com/android/settings/homepage/CardContentLoader.java b/src/com/android/settings/homepage/CardContentLoader.java index 47ba59afe8e..2a2ebad6f58 100644 --- a/src/com/android/settings/homepage/CardContentLoader.java +++ b/src/com/android/settings/homepage/CardContentLoader.java @@ -17,46 +17,58 @@ package com.android.settings.homepage; import android.content.Context; +import android.database.Cursor; import androidx.annotation.Nullable; import com.android.settingslib.utils.AsyncLoaderCompat; +import java.util.ArrayList; import java.util.List; -//TODO(b/112521307): Implement this to make it work with the card database. -public class CardContentLoader { +public class CardContentLoader extends AsyncLoaderCompat> { + static final int CARD_CONTENT_LOADER_ID = 1; - private static final String TAG = "CardContentLoader"; - - private CardContentLoaderListener mListener; + private Context mContext; public interface CardContentLoaderListener { void onFinishCardLoading(List contextualCards); } - public CardContentLoader() { + CardContentLoader(Context context) { + super(context); + mContext = context.getApplicationContext(); } - void setListener(CardContentLoaderListener listener) { - mListener = listener; + @Override + protected void onDiscardResult(List result) { + } - private static class CardLoader extends AsyncLoaderCompat> { - - public CardLoader(Context context) { - super(context); + @Nullable + @Override + public List loadInBackground() { + List result; + try (Cursor cursor = CardDatabaseHelper.getInstance(mContext).getAllContextualCards()) { + if (cursor.getCount() == 0) { + //TODO(b/113372471): Load Default static cards and return 3 static cards + return new ArrayList<>(); + } + result = buildContextualCardList(cursor); } + return result; + } - @Override - protected void onDiscardResult(List result) { - - } - - @Nullable - @Override - public List loadInBackground() { - return null; + private List buildContextualCardList(Cursor cursor) { + final List result = new ArrayList<>(); + for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { + final ContextualCard card = new ContextualCard(cursor); + if (card.isCustomCard()) { + //TODO(b/114688391): Load and generate custom card,then add into list + } else { + result.add(card); + } } + return result; } } diff --git a/src/com/android/settings/homepage/CardDatabaseHelper.java b/src/com/android/settings/homepage/CardDatabaseHelper.java index 382b71f7919..f0a347187ae 100644 --- a/src/com/android/settings/homepage/CardDatabaseHelper.java +++ b/src/com/android/settings/homepage/CardDatabaseHelper.java @@ -17,6 +17,7 @@ package com.android.settings.homepage; import android.content.Context; +import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; @@ -190,4 +191,12 @@ public class CardDatabaseHelper extends SQLiteOpenHelper { } return sCardDatabaseHelper; } + + Cursor getAllContextualCards() { + final SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.query(CARD_TABLE, null /* columns */, null /* selection */, + null /* selectionArgs */, null /* groupBy */, null /* having */, + null /* orderBy */); + return cursor; + } } diff --git a/src/com/android/settings/homepage/ContextualCard.java b/src/com/android/settings/homepage/ContextualCard.java index f5083d80e6c..174a4372078 100644 --- a/src/com/android/settings/homepage/ContextualCard.java +++ b/src/com/android/settings/homepage/ContextualCard.java @@ -17,6 +17,7 @@ package com.android.settings.homepage; import android.annotation.IntDef; +import android.database.Cursor; import android.graphics.drawable.Drawable; import android.net.Uri; import android.text.TextUtils; @@ -58,8 +59,8 @@ public class ContextualCard { private final int mIconResId; private final int mCardAction; private final long mExpireTimeMS; - private final Drawable mIconDrawable; private final boolean mIsHalfWidth; + private final Drawable mIconDrawable; String getName() { return mName; @@ -137,6 +138,10 @@ public class ContextualCard { return mIsHalfWidth; } + boolean isCustomCard() { + return TextUtils.isEmpty(mSliceUri); + } + public ContextualCard(Builder builder) { mName = builder.mName; mCardType = builder.mCardType; @@ -158,6 +163,31 @@ public class ContextualCard { mIsHalfWidth = builder.mIsHalfWidth; } + ContextualCard(Cursor c) { + mName = c.getString(c.getColumnIndex(CardDatabaseHelper.CardColumns.NAME)); + mCardType = c.getInt(c.getColumnIndex(CardDatabaseHelper.CardColumns.TYPE)); + mRankingScore = c.getDouble(c.getColumnIndex(CardDatabaseHelper.CardColumns.SCORE)); + mSliceUri = c.getString(c.getColumnIndex(CardDatabaseHelper.CardColumns.SLICE_URI)); + mCategory = c.getInt(c.getColumnIndex(CardDatabaseHelper.CardColumns.CATEGORY)); + mLocalizedToLocale = c.getString( + c.getColumnIndex(CardDatabaseHelper.CardColumns.LOCALIZED_TO_LOCALE)); + mPackageName = c.getString(c.getColumnIndex(CardDatabaseHelper.CardColumns.PACKAGE_NAME)); + mAppVersion = c.getString(c.getColumnIndex(CardDatabaseHelper.CardColumns.APP_VERSION)); + mTitleResName = c.getString( + c.getColumnIndex(CardDatabaseHelper.CardColumns.TITLE_RES_NAME)); + mTitleText = c.getString(c.getColumnIndex(CardDatabaseHelper.CardColumns.TITLE_TEXT)); + mSummaryResName = c.getString( + c.getColumnIndex(CardDatabaseHelper.CardColumns.SUMMARY_RES_NAME)); + mSummaryText = c.getString(c.getColumnIndex(CardDatabaseHelper.CardColumns.SUMMARY_TEXT)); + mIconResName = c.getString(c.getColumnIndex(CardDatabaseHelper.CardColumns.ICON_RES_NAME)); + mIconResId = c.getInt(c.getColumnIndex(CardDatabaseHelper.CardColumns.ICON_RES_ID)); + mCardAction = c.getInt(c.getColumnIndex(CardDatabaseHelper.CardColumns.CARD_ACTION)); + mExpireTimeMS = c.getLong(c.getColumnIndex(CardDatabaseHelper.CardColumns.EXPIRE_TIME_MS)); + mIsHalfWidth = (c.getInt( + c.getColumnIndex(CardDatabaseHelper.CardColumns.SUPPORT_HALF_WIDTH)) == 1); + mIconDrawable = null; + } + @Override public int hashCode() { return mName.hashCode(); diff --git a/src/com/android/settings/homepage/ContextualCardManager.java b/src/com/android/settings/homepage/ContextualCardManager.java index aa2f576ef11..df20a6c2a4a 100644 --- a/src/com/android/settings/homepage/ContextualCardManager.java +++ b/src/com/android/settings/homepage/ContextualCardManager.java @@ -16,9 +16,17 @@ package com.android.settings.homepage; +import static com.android.settings.homepage.CardContentLoader.CARD_CONTENT_LOADER_ID; + import android.content.Context; +import android.os.Bundle; import android.widget.BaseAdapter; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.loader.app.LoaderManager; +import androidx.loader.content.Loader; + import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.LifecycleObserver; @@ -60,9 +68,12 @@ public class ContextualCardManager implements CardContentLoader.CardContentLoade mControllerRendererPool = new ControllerRendererPool(); } - void startCardContentLoading() { - final CardContentLoader cardContentLoader = new CardContentLoader(); - cardContentLoader.setListener(this); + void startCardContentLoading(PersonalSettingsFragment fragment) { + final CardContentLoaderCallbacks cardContentLoaderCallbacks = + new CardContentLoaderCallbacks(mContext); + cardContentLoaderCallbacks.setListener(this); + LoaderManager.getInstance(fragment).initLoader(CARD_CONTENT_LOADER_ID, null /* bundle */, + cardContentLoaderCallbacks); } private void loadCardControllers() { @@ -140,4 +151,43 @@ public class ContextualCardManager implements CardContentLoader.CardContentLoade public ControllerRendererPool getControllerRendererPool() { return mControllerRendererPool; } + + + static class CardContentLoaderCallbacks implements + LoaderManager.LoaderCallbacks> { + + private Context mContext; + private CardContentLoader.CardContentLoaderListener mListener; + + CardContentLoaderCallbacks(Context context) { + mContext = context.getApplicationContext(); + } + + protected void setListener(CardContentLoader.CardContentLoaderListener listener) { + mListener = listener; + } + + @NonNull + @Override + public Loader> onCreateLoader(int id, @Nullable Bundle bundle) { + if (id == CARD_CONTENT_LOADER_ID) { + return new CardContentLoader(mContext); + } else { + throw new IllegalArgumentException("Unknown loader id: " + id); + } + } + + @Override + public void onLoadFinished(@NonNull Loader> loader, + List contextualCards) { + if (mListener != null) { + mListener.onFinishCardLoading(contextualCards); + } + } + + @Override + public void onLoaderReset(@NonNull Loader> loader) { + + } + } } diff --git a/src/com/android/settings/homepage/PersonalSettingsFragment.java b/src/com/android/settings/homepage/PersonalSettingsFragment.java index 2eb9663cfda..da41cd72f68 100644 --- a/src/com/android/settings/homepage/PersonalSettingsFragment.java +++ b/src/com/android/settings/homepage/PersonalSettingsFragment.java @@ -43,7 +43,7 @@ public class PersonalSettingsFragment extends InstrumentedFragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContextualCardManager = new ContextualCardManager(getContext(), getSettingsLifecycle()); - mContextualCardManager.startCardContentLoading(); + mContextualCardManager.startCardContentLoading(this); } @Override diff --git a/src/com/android/settings/network/NetworkDashboardFragment.java b/src/com/android/settings/network/NetworkDashboardFragment.java index a2a24506834..0279cfabc94 100644 --- a/src/com/android/settings/network/NetworkDashboardFragment.java +++ b/src/com/android/settings/network/NetworkDashboardFragment.java @@ -15,12 +15,15 @@ */ package com.android.settings.network; +import static android.provider.Settings.ACTION_DATA_USAGE_SETTINGS; import static com.android.settings.network.MobilePlanPreferenceController .MANAGE_MOBILE_PLAN_DIALOG_ID; import android.app.Activity; import android.app.Dialog; import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; import android.icu.text.ListFormatter; import android.provider.SearchIndexableResource; import android.text.BidiFormatter; @@ -45,6 +48,7 @@ import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.Arrays; +import java.util.function.BooleanSupplier; import java.util.List; @SearchIndexable @@ -158,24 +162,32 @@ public class NetworkDashboardFragment extends DashboardFragment implements private final WifiMasterSwitchPreferenceController mWifiPreferenceController; private final MobileNetworkPreferenceController mMobileNetworkPreferenceController; private final TetherPreferenceController mTetherPreferenceController; + private final BooleanSupplier mHasDataUsageActivity; public SummaryProvider(Context context, SummaryLoader summaryLoader) { this(context, summaryLoader, new WifiMasterSwitchPreferenceController(context, null), new MobileNetworkPreferenceController(context), - new TetherPreferenceController(context, null /* lifecycle */)); + new TetherPreferenceController(context, null /* lifecycle */), + () -> { + final Intent intent = new Intent(ACTION_DATA_USAGE_SETTINGS); + final PackageManager pm = context.getPackageManager(); + return intent.resolveActivity(pm) != null; + }); } @VisibleForTesting(otherwise = VisibleForTesting.NONE) SummaryProvider(Context context, SummaryLoader summaryLoader, WifiMasterSwitchPreferenceController wifiPreferenceController, MobileNetworkPreferenceController mobileNetworkPreferenceController, - TetherPreferenceController tetherPreferenceController) { + TetherPreferenceController tetherPreferenceController, + BooleanSupplier hasDataUsageActivity) { mContext = context; mSummaryLoader = summaryLoader; mWifiPreferenceController = wifiPreferenceController; mMobileNetworkPreferenceController = mobileNetworkPreferenceController; mTetherPreferenceController = tetherPreferenceController; + mHasDataUsageActivity = hasDataUsageActivity; } @@ -198,7 +210,7 @@ public class NetworkDashboardFragment extends DashboardFragment implements if (mMobileNetworkPreferenceController.isAvailable() && !TextUtils.isEmpty(mobileSummary)) { summaries.add(mobileSummary); } - if (!TextUtils.isEmpty(dataUsageSummary)) { + if (!TextUtils.isEmpty(dataUsageSummary) && mHasDataUsageActivity.getAsBoolean()) { summaries.add(dataUsageSummary); } if (mTetherPreferenceController.isAvailable() && !TextUtils.isEmpty(hotspotSummary)) { diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java index 5e961a6d20d..6e3174d8272 100644 --- a/src/com/android/settings/users/UserSettings.java +++ b/src/com/android/settings/users/UserSettings.java @@ -964,9 +964,10 @@ public class UserSettings extends SettingsPreferenceFragment mAddUserWhenLockedPreferenceController.getPreferenceKey()); mAddUserWhenLockedPreferenceController.updateState(addUserOnLockScreen); mMultiUserFooterPreferenceController.updateState(null /* preference */); + mAddUser.setVisible(mUserCaps.mCanAddUser && Utils.isDeviceProvisioned(context) + && mUserCaps.mUserSwitcherEnabled); mUserListCategory.setVisible(mUserCaps.mUserSwitcherEnabled); if (!mUserCaps.mUserSwitcherEnabled) { - mAddUser.setVisible(false); return; } diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java index b6bb9b57969..539e75ff21f 100644 --- a/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java +++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java @@ -170,7 +170,7 @@ public final class AppInfoDashboardFragmentTest { } @Test - public void launchFragment_hasNoPackageInfo_shouldFinish() { + public void ensurePackageInfoAvailable_hasNoPackageInfo_shouldFinish() { ReflectionHelpers.setField(mFragment, "mPackageInfo", null); assertThat(mFragment.ensurePackageInfoAvailable(mActivity)).isFalse(); @@ -178,7 +178,7 @@ public final class AppInfoDashboardFragmentTest { } @Test - public void launchFragment_hasPackageInfo_shouldReturnTrue() { + public void ensurePackageInfoAvailable_hasPackageInfo_shouldReturnTrue() { final PackageInfo packageInfo = mock(PackageInfo.class); ReflectionHelpers.setField(mFragment, "mPackageInfo", packageInfo); @@ -186,6 +186,16 @@ public final class AppInfoDashboardFragmentTest { verify(mActivity, never()).finishAndRemoveTask(); } + @Test + public void createPreference_hasNoPackageInfo_shouldSkip() { + ReflectionHelpers.setField(mFragment, "mPackageInfo", null); + + mFragment.onCreatePreferences(new Bundle(), "root_key"); + + verify(mActivity).finishAndRemoveTask(); + verify(mFragment, never()).getPreferenceScreen(); + } + @Test public void packageSizeChange_isOtherPackage_shouldNotRefreshUi() { ReflectionHelpers.setField(mFragment, "mPackageName", PACKAGE_NAME); diff --git a/tests/robotests/src/com/android/settings/network/NetworkDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/network/NetworkDashboardFragmentTest.java index d6f86f9e19d..469a5372738 100644 --- a/tests/robotests/src/com/android/settings/network/NetworkDashboardFragmentTest.java +++ b/tests/robotests/src/com/android/settings/network/NetworkDashboardFragmentTest.java @@ -79,7 +79,7 @@ public class NetworkDashboardFragmentTest { final SummaryLoader.SummaryProvider provider = new NetworkDashboardFragment.SummaryProvider(mContext, summaryLoader, wifiPreferenceController, mobileNetworkPreferenceController, - tetherPreferenceController); + tetherPreferenceController, () -> true); provider.setListening(false); @@ -107,7 +107,7 @@ public class NetworkDashboardFragmentTest { final SummaryLoader.SummaryProvider provider = new NetworkDashboardFragment.SummaryProvider(mContext, summaryLoader, wifiPreferenceController, mobileNetworkPreferenceController, - tetherPreferenceController); + tetherPreferenceController, () -> true); provider.setListening(false); @@ -121,4 +121,34 @@ public class NetworkDashboardFragmentTest { verify(summaryLoader).setSummary(provider, "Wi\u2011Fi and data usage"); } + + @Test + public void summaryProviderSetListening_noDataUsageActivity_shouldReturnNoDataUsageSummary() { + final WifiMasterSwitchPreferenceController wifiPreferenceController = + mock(WifiMasterSwitchPreferenceController.class); + final MobileNetworkPreferenceController mobileNetworkPreferenceController = + mock(MobileNetworkPreferenceController.class); + final TetherPreferenceController tetherPreferenceController = + mock(TetherPreferenceController.class); + + final SummaryLoader summaryLoader = mock(SummaryLoader.class); + final SummaryLoader.SummaryProvider provider = + new NetworkDashboardFragment.SummaryProvider(mContext, summaryLoader, + wifiPreferenceController, mobileNetworkPreferenceController, + tetherPreferenceController, () -> false); + + provider.setListening(false); + + verifyZeroInteractions(summaryLoader); + + when(wifiPreferenceController.isAvailable()).thenReturn(true); + when(mobileNetworkPreferenceController.isAvailable()).thenReturn(true); + when(tetherPreferenceController.isAvailable()).thenReturn(true); + + provider.setListening(true); + + verify(summaryLoader).setSummary(provider, "Wi\u2011Fi, mobile, and hotspot"); + } + + } diff --git a/tests/robotests/src/com/android/settings/users/UserSettingsTest.java b/tests/robotests/src/com/android/settings/users/UserSettingsTest.java index 413d77154e3..02c279e4b23 100644 --- a/tests/robotests/src/com/android/settings/users/UserSettingsTest.java +++ b/tests/robotests/src/com/android/settings/users/UserSettingsTest.java @@ -212,4 +212,31 @@ public class UserSettingsTest { } + @Test + public void updateUserList_canAddUserAndSwitchUser_shouldShowAddUser() { + Settings.Global.putInt(mContext.getContentResolver(), + Settings.Global.DEVICE_PROVISIONED, 1); + final RestrictedPreference addUser = mock(RestrictedPreference.class); + + mUserCapabilities.mCanAddUser = true; + mUserCapabilities.mDisallowAddUser = false; + 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(); + doReturn("Test summary").when(mFragment).getString(anyInt(), anyInt()); + + mFragment.updateUserList(); + + verify(addUser).setVisible(true); + + } + }