From 3210396de961f9d8fcb1abca81ec41c03836ffda Mon Sep 17 00:00:00 2001 From: Ben Lin Date: Wed, 5 Sep 2018 00:57:41 -0700 Subject: [PATCH 1/8] Check for Data Usage intent before populating "Data Usage" summary. On some devices, data usage is not available; thus, it is possible that ACTION_DATA_USAGE_SETTINGS has no matching activity. If no matching activity is found, we should not populate "data usage" in the summary field. Bug: 111398942 Test: Manual check. I see that data usage is no longer visible on devices without Data Usage activity. Test: make RunSettingsRoboTests Change-Id: I838206b76497c6550ef4826ad19e605cd32906ee --- .../network/NetworkDashboardFragment.java | 18 ++++++++-- .../network/NetworkDashboardFragmentTest.java | 34 +++++++++++++++++-- 2 files changed, 47 insertions(+), 5 deletions(-) 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/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"); + } + + } From 13d2551156f5dc50e9b35b04a18f6b45f13a0ab6 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Tue, 11 Sep 2018 14:52:46 -0700 Subject: [PATCH 2/8] Fix a crash when launching app detail for bad package name Change-Id: I3bfb5f8e003b810c09d295bc89f4a59af186a121 Fixes: 78779901 Test: robotests --- .../appinfo/AppInfoDashboardFragment.java | 10 ++++++++-- .../appinfo/AppInfoDashboardFragmentTest.java | 14 ++++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java index f41c991a98c..2024c2ab885 100755 --- a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java +++ b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java @@ -205,16 +205,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/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java index ce8ef15f9cc..79d8a6d0fa3 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); From a87e4cb2274df47d9813d3fc2341171043b52c9f Mon Sep 17 00:00:00 2001 From: Sunny Shao Date: Wed, 29 Aug 2018 17:53:59 +0800 Subject: [PATCH 3/8] Implemented the CardContentLoader - Implemented the CardContentLoader - Refactored the CardLoader and increased the code readable - Added try-with-resource - Removed all custom card codes - Modified ContextualCardManager to add CardContentLoaderCallbacks Bug: 112521307 Test: robotest Change-Id: Ieb9cdeaacdfb8fdae9747c60395206d15af034c1 --- .../settings/homepage/CardContentLoader.java | 54 +++++++++++------- .../settings/homepage/CardDatabaseHelper.java | 9 +++ .../settings/homepage/ContextualCard.java | 32 ++++++++++- .../homepage/ContextualCardManager.java | 56 ++++++++++++++++++- .../homepage/PersonalSettingsFragment.java | 2 +- 5 files changed, 127 insertions(+), 26 deletions(-) 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 From 85c82c5681d441eef5a8c133e20140dcf7bfca9a Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 12 Sep 2018 12:07:42 -0700 Subject: [PATCH 4/8] Import translations. DO NOT MERGE Auto-generated-cl: translation import Bug: 64712476 Change-Id: I6f84ca21470e0f9224b2c038b25757f70ff25c8a --- res/values-b+sr+Latn/strings.xml | 2 +- res/values-es-rUS/strings.xml | 2 +- res/values-fr/strings.xml | 20 ++++++++++---------- res/values-hi/strings.xml | 2 +- res/values-ko/strings.xml | 6 +++--- res/values-sr/strings.xml | 2 +- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index 3fee572e713..3629a33de04 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -3537,7 +3537,7 @@ "Kategorije: nizak prioritet" "Kategorije: isključeno" "Kategorije: menja režim „Ne uznemiravaj“" - "Napredna" + "Napredno" "Konfigurišite aplikacije" "Nepoznata aplikacija" "Dozvole za aplikacije" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 743cef4a2ad..9a1da1777a4 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -3527,7 +3527,7 @@ "Apps con acceso de uso" "Preferencias de uso de la aplicación" "Tiempo que se usó la app" - "El acceso a los datos de uso permite que una aplicación realice un seguimiento de qué otras aplicaciones usas y de la frecuencia con que las usas, además de conocer tu proveedor, configuración de idioma y otros detalles." + "El acceso a los datos de uso permite que una aplicación controle qué otras aplicaciones utilizas y con qué frecuencia, así como el operador, la configuración de idioma y otros detalles." "Memoria" "Detalles de la memoria" "Siempre en ejecución (%s)" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 37ada79c39d..bd235ed5a2c 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -114,7 +114,7 @@ "Votre appareil va se déconnecter de \"%1$s\"." "Déconnecter" "Vous n\'êtes pas autorisé à modifier les paramètres Bluetooth." - "Associer nouvel app." + "Associer un appareil" "Lorsque le Bluetooth est activé, votre %1$s est visible par les appareils à proximité." "Adresse Bluetooth du téléphone : %1$s" "Adresse Bluetooth de la tablette : %1$s" @@ -1372,20 +1372,20 @@ "Ne retirez pas la mémoire de stockage \"^1\" pendant le déplacement. \n\nL\'application \"^2\" ne sera pas disponible jusqu\'à la fin de l\'opération." "Annuler le déplacement" "Ce ^1 ne semble pas rapide. \n\nVous pouvez continuer, mais les applis déplacées vers cet emplacement risquent de se bloquer et les transferts de données pourront prendre du temps. \n\nVeuillez utiliser un ^1 plus rapide pour de meilleures performances." - "Comment utiliserez-vous ^1 ?" + "Comment utiliserez-vous ce support (^1) ?" "Utiliser en stockage tabl. supp." - "Pour applis/fichiers/contenus multimédias sur cette tabl. uniq." + "Pour les applis, fichiers, contenus multimédias sur cette tablette uniquement" "Stockage sur la tablette" - "Utiliser en stockage tél. supp." - "Pour applis/fichiers/contenus multimédias sur ce tél. uniquement" + "Stockage supplémentaire sur le téléphone" + "Pour les applis, fichiers, contenus multimédias sur ce téléphone uniquement" "Stockage sur le téléphone" "Ou" - "Utiliser comme mémoire externe" - "Pour transférer fichiers/contenus multimédias entre appareils" - "Périphérique de stockage externe" + "Stockage externe" + "Pour transférer des fichiers et contenus multimédias entre des appareils" + "Stockage externe" "Configurer plus tard" - "Formater le périphérique ^1 ?" - "Le périphérique ^1 doit être formaté pour stocker des applications, des fichiers et des contenus multimédias. \n\nNotez que le formatage effacera le contenu actuel de \"^2\". Pour éviter toute perte de contenu, sauvegardez-le sur un autre périphérique ^3 ou sur un autre appareil." + "Formater le support (^1) ?" + "Le support (^1) doit être formaté pour stocker des applications, des fichiers et des contenus multimédias. \n\nNotez que le formatage effacera le contenu actuel du support (^2). Pour éviter toute perte de contenu, sauvegardez-le sur un autre support (^3) ou sur un autre appareil." "Formater ^1" "Déplacer le contenu vers ^1 ?" "Vous pouvez déplacer des fichiers, des contenus multimédias et certains applications vers le périphérique ^1. \n\nCette opération permet de libérer jusqu\'à ^2 sur votre tablette et dure environ ^3." diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 5fa02baa0c1..26c5c115b57 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -968,7 +968,7 @@ "वाई-फ़ाई कॉलिंग" "वाई-फ़ाई के ज़रिए कॉल करने की सुविधा चालू करें" "वाई-फ़ाई कॉलिंग चालू करके कॉल करने का एक और विकल्प पाएं" - "कॉल को प्राथमिकता" + "कॉल करने का प्राथमिक तरीका" "वाई-फ़ाई कॉलिंग मोड" "रोमिंग की प्राथमिकताएं" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 1994311aafc..038995dc390 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -2814,9 +2814,9 @@ "새 사용자 추가 중..." "사용자 삭제" "홈 화면에서 삭제" - "손님" - "손님 삭제" - "손님을 삭제하시겠습니까?" + "게스트" + "게스트 삭제" + "게스트를 삭제하시겠습니까?" "이 세션에 있는 모든 앱과 데이터가 삭제됩니다." "삭제" "통화 기능 사용" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 0b1d6241f99..70c8c0d37fc 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -3537,7 +3537,7 @@ "Категорије: низак приоритет" "Категорије: искључено" "Категорије: мења режим „Не узнемиравај“" - "Напредна" + "Напредно" "Конфигуришите апликације" "Непозната апликација" "Дозволе за апликације" From c085694cc2aac45c3a41214aa9ba0ebb813b13be Mon Sep 17 00:00:00 2001 From: Jin Dong Date: Fri, 24 Aug 2018 16:24:53 +0800 Subject: [PATCH 5/8] Changes on Settings UI for a better user experience Oem can change the left padding and right padding of main text in below screens by overlay the relative dimens: - "Network settings reset" - "Factory data reset" - "Screen pinning" Bug: 113607004 Test: manual Change-Id: Ief1afd6ee05b9723874866a06f1748d9d9987333 --- res/layout/master_clear.xml | 4 ++-- res/layout/reset_network.xml | 4 ++-- res/layout/screen_pinning_instructions.xml | 4 ++-- res/values-sw600dp-land/dimens.xml | 4 ++++ res/values-sw600dp/dimens.xml | 4 ++++ res/values-xlarge/dimens.xml | 4 ++++ res/values/dimens.xml | 10 ++++++++++ 7 files changed, 28 insertions(+), 6 deletions(-) diff --git a/res/layout/master_clear.xml b/res/layout/master_clear.xml index c1e224f4210..add1a85b27e 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 f6b4ad8a59b..683c15a5071 100755 --- a/res/values-sw600dp-land/dimens.xml +++ b/res/values-sw600dp-land/dimens.xml @@ -31,4 +31,8 @@ 20dp 24dp + + + 128dp + 128dp diff --git a/res/values-sw600dp/dimens.xml b/res/values-sw600dp/dimens.xml index 8e47a620047..593e6d3d3c9 100755 --- a/res/values-sw600dp/dimens.xml +++ b/res/values-sw600dp/dimens.xml @@ -72,4 +72,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 e0b8c48d47f..2c52c3ac4d1 100755 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -308,6 +308,16 @@ 66dp 100dp + + 72dp + 12dp + 72dp + 12dp + + + 64dp + 64dp + 10dp 5dp From 73d7773eb20a4d370f7d91badcd0a1db9069ffc3 Mon Sep 17 00:00:00 2001 From: Doris Ling Date: Wed, 12 Sep 2018 12:33:46 -0700 Subject: [PATCH 6/8] Fix visibility of AddUser when toggling multiuser. - when enabling multi user, also need to update the visibility of the Add user preference, but need to check the add user capability as well. Change-Id: Ia243901c7537bdb39ca3a39aed559b003f803e4d Fixes: 115397726 Test: make RunSettingsRoboTests --- .../android/settings/users/UserSettings.java | 3 ++- .../settings/users/UserSettingsTest.java | 27 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) 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/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); + + } + } From 94b26f12ad841559a8fa83e93b67ef32793c1717 Mon Sep 17 00:00:00 2001 From: jackqdyulei Date: Wed, 12 Sep 2018 12:58:04 -0700 Subject: [PATCH 7/8] Remove battery app list feature flag It is not used anymore Bug: 115542275 Test: Build Change-Id: I931d081a13d5d4b698c785205d356182fec3e02d --- src/com/android/settings/core/FeatureFlags.java | 1 - 1 file changed, 1 deletion(-) 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"; From 409a5f8c98bfe776fa0b6125083a5804984dd481 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Wed, 12 Sep 2018 13:08:15 -0700 Subject: [PATCH 8/8] Clean up: delete unused methods Test: rebuild Change-Id: I144ebbdaf137ee091af949a9e38f68d02941f705 --- .../android/settings/SettingsPreferenceFragment.java | 4 ---- .../connecteddevice/usb/UsbDetailsFragment.java | 10 ---------- 2 files changed, 14 deletions(-) diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java index 70b96c4414b..af88c2d7820 100644 --- a/src/com/android/settings/SettingsPreferenceFragment.java +++ b/src/com/android/settings/SettingsPreferenceFragment.java @@ -540,10 +540,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/connecteddevice/usb/UsbDetailsFragment.java b/src/com/android/settings/connecteddevice/usb/UsbDetailsFragment.java index b54847700ce..1217a34d648 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; @@ -68,15 +67,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);