From c0742e745da55452a412b4bb7bd28c5ecf3a8cb2 Mon Sep 17 00:00:00 2001 From: Oli Lan Date: Wed, 27 Jul 2022 17:17:51 +0000 Subject: [PATCH 1/5] Revert "Prevent exfiltration of system files via user image settings." This reverts commit 8950a9002402de6e1218bab3da52868a51104a95. Reason for revert: regression if multiple crop system crop handlers are present Change-Id: Ib83dbb2f1109d26b7e85192379291bffef187e77 Merged-In: I15e15ad88b768a5b679de32c5429d921d850a3cb --- .../users/EditUserPhotoController.java | 42 ++++++------------- 1 file changed, 13 insertions(+), 29 deletions(-) diff --git a/src/com/android/settings/users/EditUserPhotoController.java b/src/com/android/settings/users/EditUserPhotoController.java index 71f4e788184..f62a2d5970f 100644 --- a/src/com/android/settings/users/EditUserPhotoController.java +++ b/src/com/android/settings/users/EditUserPhotoController.java @@ -21,7 +21,6 @@ import android.content.ClipData; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; -import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.database.Cursor; import android.graphics.Bitmap; @@ -78,7 +77,6 @@ public class EditUserPhotoController { private static final int REQUEST_CODE_TAKE_PHOTO = 1002; private static final int REQUEST_CODE_CROP_PHOTO = 1003; - private static final String PRE_CROP_PICTURE_FILE_NAME = "PreCropEditUserPhoto.jpg"; private static final String CROP_PICTURE_FILE_NAME = "CropEditUserPhoto.jpg"; private static final String TAKE_PICTURE_FILE_NAME = "TakeEditUserPhoto2.jpg"; private static final String NEW_USER_PHOTO_FILE_NAME = "NewUserPhoto.png"; @@ -89,7 +87,6 @@ public class EditUserPhotoController { private final Fragment mFragment; private final ImageView mImageView; - private final Uri mPreCropPictureUri; private final Uri mCropPictureUri; private final Uri mTakePictureUri; @@ -101,8 +98,6 @@ public class EditUserPhotoController { mContext = view.getContext(); mFragment = fragment; mImageView = view; - - mPreCropPictureUri = createTempImageUri(mContext, PRE_CROP_PICTURE_FILE_NAME, !waiting); mCropPictureUri = createTempImageUri(mContext, CROP_PICTURE_FILE_NAME, !waiting); mTakePictureUri = createTempImageUri(mContext, TAKE_PICTURE_FILE_NAME, !waiting); mPhotoSize = getPhotoSize(mContext); @@ -137,7 +132,7 @@ public class EditUserPhotoController { case REQUEST_CODE_TAKE_PHOTO: case REQUEST_CODE_CHOOSE_PHOTO: if (mTakePictureUri.equals(pictureUri)) { - cropPhoto(pictureUri); + cropPhoto(); } else { copyAndCropPhoto(pictureUri); } @@ -246,7 +241,7 @@ public class EditUserPhotoController { protected Void doInBackground(Void... params) { final ContentResolver cr = mContext.getContentResolver(); try (InputStream in = cr.openInputStream(pictureUri); - OutputStream out = cr.openOutputStream(mPreCropPictureUri)) { + OutputStream out = cr.openOutputStream(mTakePictureUri)) { Streams.copy(in, out); } catch (IOException e) { Log.w(TAG, "Failed to copy photo", e); @@ -257,38 +252,27 @@ public class EditUserPhotoController { @Override protected void onPostExecute(Void result) { if (!mFragment.isAdded()) return; - cropPhoto(mPreCropPictureUri); + cropPhoto(); } }.execute(); } - private void cropPhoto(final Uri pictureUri) { + private void cropPhoto() { // TODO: Use a public intent, when there is one. Intent intent = new Intent("com.android.camera.action.CROP"); - intent.setDataAndType(pictureUri, "image/*"); + intent.setDataAndType(mTakePictureUri, "image/*"); appendOutputExtra(intent, mCropPictureUri); appendCropExtras(intent); - try { - StrictMode.disableDeathOnFileUriExposure(); - if (startSystemActivityForResult(intent, REQUEST_CODE_CROP_PHOTO)) { - return; + if (intent.resolveActivity(mContext.getPackageManager()) != null) { + try { + StrictMode.disableDeathOnFileUriExposure(); + mFragment.startActivityForResult(intent, REQUEST_CODE_CROP_PHOTO); + } finally { + StrictMode.enableDeathOnFileUriExposure(); } - } finally { - StrictMode.enableDeathOnFileUriExposure(); + } else { + onPhotoCropped(mTakePictureUri, false); } - onPhotoCropped(mTakePictureUri, false); - } - - private boolean startSystemActivityForResult(Intent intent, int code) { - ActivityInfo info = intent.resolveActivityInfo(mContext.getPackageManager(), - PackageManager.MATCH_SYSTEM_ONLY); - if (info == null) { - Log.w(TAG, "No system package activity could be found for code " + code); - return false; - } - intent.setPackage(info.packageName); - mFragment.startActivityForResult(intent, code); - return true; } private void appendOutputExtra(Intent intent, Uri pictureUri) { From 33710fd9e2893d2b7650f40006348319960a8318 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Wed, 10 Aug 2022 17:40:20 +0000 Subject: [PATCH 2/5] Revert^2 "Improve App notification loading" c5f1cb11e0c895e1b62f8f3a0074cf30cfc7c4a8 Change-Id: I5a6d39e0a5f2b7bd30bcc12e207b8bb23857c6d8 --- .../AppBubbleListPreferenceController.java | 14 +-- .../AddToHomeScreenPreferenceController.java | 10 +- .../app/AllowSoundPreferenceController.java | 13 ++- ...nnelsBypassingDndPreferenceController.java | 6 +- ...pConversationListPreferenceController.java | 22 +++-- .../app/AppLinkPreferenceController.java | 10 +- .../app/BadgePreferenceController.java | 22 +++-- .../app/BlockPreferenceController.java | 10 +- .../BubbleCategoryPreferenceController.java | 10 +- .../app/BubbleLinkPreferenceController.java | 10 +- .../app/BubblePreferenceController.java | 19 ++-- .../BubbleSummaryPreferenceController.java | 21 +++-- .../app/ChannelListPreferenceController.java | 47 +++++----- ...onversationDemotePreferenceController.java | 15 +-- ...onversationHeaderPreferenceController.java | 6 +- ...versationPriorityPreferenceController.java | 12 +-- ...nversationPromotePreferenceController.java | 15 +-- .../DeletedChannelsPreferenceController.java | 15 +-- .../app/DescriptionPreferenceController.java | 16 ++-- .../app/DndPreferenceController.java | 10 +- .../app/HeaderPreferenceController.java | 6 +- .../HighImportancePreferenceController.java | 16 ++-- .../app/ImportancePreferenceController.java | 12 +-- ...dConversationInfoPreferenceController.java | 14 +-- ...validConversationPreferenceController.java | 14 +-- .../app/LightsPreferenceController.java | 18 ++-- .../MinImportancePreferenceController.java | 14 +-- .../app/NotificationPreferenceController.java | 33 ++++--- .../app/NotificationSettings.java | 94 +++++++++---------- .../NotificationsOffPreferenceController.java | 14 ++- .../app/SoundPreferenceController.java | 15 +-- .../app/VibrationPreferenceController.java | 19 ++-- .../app/VisibilityPreferenceController.java | 16 ++-- .../NotificationPreferenceControllerTest.java | 2 +- 34 files changed, 318 insertions(+), 272 deletions(-) diff --git a/src/com/android/settings/notification/AppBubbleListPreferenceController.java b/src/com/android/settings/notification/AppBubbleListPreferenceController.java index bf7fcc03756..6ebb376b5c1 100644 --- a/src/com/android/settings/notification/AppBubbleListPreferenceController.java +++ b/src/com/android/settings/notification/AppBubbleListPreferenceController.java @@ -51,7 +51,7 @@ public class AppBubbleListPreferenceController extends AppConversationListPrefer private static final String KEY = "bubble_conversations"; public AppBubbleListPreferenceController(Context context, NotificationBackend backend) { - super(context, backend); + super(context, backend, KEY); } @Override @@ -80,25 +80,25 @@ public class AppBubbleListPreferenceController extends AppConversationListPrefer } @Override - public boolean isAvailable() { + public int getAvailabilityStatus() { // copy rather than inherit super's isAvailable because apps can link to this page // as part of onboarding, before they send a valid conversation notification if (mAppRow == null) { - return false; + return CONDITIONALLY_UNAVAILABLE; } if (mAppRow.banned) { - return false; + return CONDITIONALLY_UNAVAILABLE; } if (mChannel != null) { if (mBackend.onlyHasDefaultChannel(mAppRow.pkg, mAppRow.uid) || NotificationChannel.DEFAULT_CHANNEL_ID.equals(mChannel.getId())) { - return false; + return CONDITIONALLY_UNAVAILABLE; } } if (mAppRow.bubblePreference == BUBBLE_PREFERENCE_NONE) { - return false; + return CONDITIONALLY_UNAVAILABLE; } - return true; + return AVAILABLE; } @VisibleForTesting diff --git a/src/com/android/settings/notification/app/AddToHomeScreenPreferenceController.java b/src/com/android/settings/notification/app/AddToHomeScreenPreferenceController.java index e5afd9d3db0..12b807534f9 100644 --- a/src/com/android/settings/notification/app/AddToHomeScreenPreferenceController.java +++ b/src/com/android/settings/notification/app/AddToHomeScreenPreferenceController.java @@ -32,7 +32,7 @@ public class AddToHomeScreenPreferenceController extends NotificationPreferenceC private static final String KEY = "add_to_home"; public AddToHomeScreenPreferenceController(Context context, NotificationBackend backend) { - super(context, backend); + super(context, backend, KEY); } @Override @@ -41,11 +41,11 @@ public class AddToHomeScreenPreferenceController extends NotificationPreferenceC } @Override - public boolean isAvailable() { - if (!super.isAvailable()) { - return false; + public int getAvailabilityStatus() { + if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { + return CONDITIONALLY_UNAVAILABLE; } - return mConversationInfo != null; + return mConversationInfo != null ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; } @Override diff --git a/src/com/android/settings/notification/app/AllowSoundPreferenceController.java b/src/com/android/settings/notification/app/AllowSoundPreferenceController.java index 0664c544bec..99d08734c96 100644 --- a/src/com/android/settings/notification/app/AllowSoundPreferenceController.java +++ b/src/com/android/settings/notification/app/AllowSoundPreferenceController.java @@ -40,7 +40,7 @@ public class AllowSoundPreferenceController extends NotificationPreferenceContro public AllowSoundPreferenceController(Context context, NotificationSettings.DependentFieldListener dependentFieldListener, NotificationBackend backend) { - super(context, backend); + super(context, backend, KEY_IMPORTANCE); mDependentFieldListener = dependentFieldListener; } @@ -50,11 +50,14 @@ public class AllowSoundPreferenceController extends NotificationPreferenceContro } @Override - public boolean isAvailable() { - if (!super.isAvailable()) { - return false; + public int getAvailabilityStatus() { + if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { + return CONDITIONALLY_UNAVAILABLE; } - return mChannel != null && NotificationChannel.DEFAULT_CHANNEL_ID.equals(mChannel.getId()); + if (mChannel != null && NotificationChannel.DEFAULT_CHANNEL_ID.equals(mChannel.getId())) { + return AVAILABLE; + } + return CONDITIONALLY_UNAVAILABLE; } diff --git a/src/com/android/settings/notification/app/AppChannelsBypassingDndPreferenceController.java b/src/com/android/settings/notification/app/AppChannelsBypassingDndPreferenceController.java index 92cd911843a..6c2c0c3cf77 100644 --- a/src/com/android/settings/notification/app/AppChannelsBypassingDndPreferenceController.java +++ b/src/com/android/settings/notification/app/AppChannelsBypassingDndPreferenceController.java @@ -64,7 +64,7 @@ public class AppChannelsBypassingDndPreferenceController extends NotificationPre public AppChannelsBypassingDndPreferenceController( Context context, NotificationBackend backend) { - super(context, backend); + super(context, backend, KEY); } @Override @@ -110,8 +110,8 @@ public class AppChannelsBypassingDndPreferenceController extends NotificationPre } @Override - public boolean isAvailable() { - return mAppRow != null; + public int getAvailabilityStatus() { + return mAppRow != null ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; } @Override diff --git a/src/com/android/settings/notification/app/AppConversationListPreferenceController.java b/src/com/android/settings/notification/app/AppConversationListPreferenceController.java index dd44a13f7c8..e7b23788968 100644 --- a/src/com/android/settings/notification/app/AppConversationListPreferenceController.java +++ b/src/com/android/settings/notification/app/AppConversationListPreferenceController.java @@ -49,7 +49,12 @@ public class AppConversationListPreferenceController extends NotificationPrefere protected PreferenceCategory mPreference; public AppConversationListPreferenceController(Context context, NotificationBackend backend) { - super(context, backend); + this(context, backend, KEY); + } + + public AppConversationListPreferenceController(Context context, NotificationBackend backend, + String key) { + super(context, backend, key); } @Override @@ -58,21 +63,24 @@ public class AppConversationListPreferenceController extends NotificationPrefere } @Override - public boolean isAvailable() { + public int getAvailabilityStatus() { if (mAppRow == null) { - return false; + return CONDITIONALLY_UNAVAILABLE; } if (mAppRow.banned) { - return false; + return CONDITIONALLY_UNAVAILABLE; } if (mChannel != null) { if (mBackend.onlyHasDefaultChannel(mAppRow.pkg, mAppRow.uid) || NotificationChannel.DEFAULT_CHANNEL_ID.equals(mChannel.getId())) { - return false; + return CONDITIONALLY_UNAVAILABLE; } } - return mBackend.hasSentValidMsg(mAppRow.pkg, mAppRow.uid) || mBackend.isInInvalidMsgState( - mAppRow.pkg, mAppRow.uid); + if (mBackend.hasSentValidMsg(mAppRow.pkg, mAppRow.uid) || mBackend.isInInvalidMsgState( + mAppRow.pkg, mAppRow.uid)) { + return AVAILABLE; + } + return CONDITIONALLY_UNAVAILABLE; } @Override diff --git a/src/com/android/settings/notification/app/AppLinkPreferenceController.java b/src/com/android/settings/notification/app/AppLinkPreferenceController.java index 043ae698f54..ecf9670cba9 100644 --- a/src/com/android/settings/notification/app/AppLinkPreferenceController.java +++ b/src/com/android/settings/notification/app/AppLinkPreferenceController.java @@ -32,7 +32,7 @@ public class AppLinkPreferenceController extends NotificationPreferenceControlle private static final String KEY_APP_LINK = "app_link"; public AppLinkPreferenceController(Context context) { - super(context, null); + super(context, null, KEY_APP_LINK); } @Override @@ -41,11 +41,11 @@ public class AppLinkPreferenceController extends NotificationPreferenceControlle } @Override - public boolean isAvailable() { - if (!super.isAvailable()) { - return false; + public int getAvailabilityStatus() { + if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { + return CONDITIONALLY_UNAVAILABLE; } - return mAppRow.settingsIntent != null; + return mAppRow.settingsIntent != null ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; } @Override diff --git a/src/com/android/settings/notification/app/BadgePreferenceController.java b/src/com/android/settings/notification/app/BadgePreferenceController.java index 108fa1d7a07..f94dfb513ae 100644 --- a/src/com/android/settings/notification/app/BadgePreferenceController.java +++ b/src/com/android/settings/notification/app/BadgePreferenceController.java @@ -38,7 +38,7 @@ public class BadgePreferenceController extends NotificationPreferenceController public BadgePreferenceController(Context context, NotificationBackend backend) { - super(context, backend); + super(context, backend, KEY_BADGE); } @Override @@ -47,25 +47,29 @@ public class BadgePreferenceController extends NotificationPreferenceController } @Override - public boolean isAvailable() { - if (!super.isAvailable()) { - return false; + public int getAvailabilityStatus() { + if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { + return CONDITIONALLY_UNAVAILABLE; } if (mAppRow == null && mChannel == null) { - return false; + return CONDITIONALLY_UNAVAILABLE; } if (Settings.Secure.getInt(mContext.getContentResolver(), NOTIFICATION_BADGING, SYSTEM_WIDE_ON) == SYSTEM_WIDE_OFF) { - return false; + return CONDITIONALLY_UNAVAILABLE; } if (mChannel != null) { if (isDefaultChannel()) { - return true; + return AVAILABLE; } else { - return mAppRow == null ? false : mAppRow.showBadge; + return mAppRow == null + ? CONDITIONALLY_UNAVAILABLE + : mAppRow.showBadge + ? AVAILABLE + : CONDITIONALLY_UNAVAILABLE; } } - return true; + return AVAILABLE; } @Override diff --git a/src/com/android/settings/notification/app/BlockPreferenceController.java b/src/com/android/settings/notification/app/BlockPreferenceController.java index f4e213298a7..ea3eaeb3353 100644 --- a/src/com/android/settings/notification/app/BlockPreferenceController.java +++ b/src/com/android/settings/notification/app/BlockPreferenceController.java @@ -42,7 +42,7 @@ public class BlockPreferenceController extends NotificationPreferenceController public BlockPreferenceController(Context context, NotificationSettings.DependentFieldListener dependentFieldListener, NotificationBackend backend) { - super(context, backend); + super(context, backend, KEY_BLOCK); mDependentFieldListener = dependentFieldListener; } @@ -52,14 +52,14 @@ public class BlockPreferenceController extends NotificationPreferenceController } @Override - public boolean isAvailable() { + public int getAvailabilityStatus() { if (mAppRow == null) { - return false; + return CONDITIONALLY_UNAVAILABLE; } if (mPreferenceFilter != null && !isIncludedInFilter()) { - return false; + return CONDITIONALLY_UNAVAILABLE; } - return true; + return AVAILABLE; } @Override diff --git a/src/com/android/settings/notification/app/BubbleCategoryPreferenceController.java b/src/com/android/settings/notification/app/BubbleCategoryPreferenceController.java index ad3a10cf381..da67afeeb33 100644 --- a/src/com/android/settings/notification/app/BubbleCategoryPreferenceController.java +++ b/src/com/android/settings/notification/app/BubbleCategoryPreferenceController.java @@ -32,15 +32,15 @@ public class BubbleCategoryPreferenceController extends NotificationPreferenceCo static final int ON = 1; public BubbleCategoryPreferenceController(Context context) { - super(context, null); + super(context, null, KEY); } @Override - public boolean isAvailable() { - if (!super.isAvailable()) { - return false; + public int getAvailabilityStatus() { + if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { + return CONDITIONALLY_UNAVAILABLE; } - return areBubblesEnabled(); + return areBubblesEnabled() ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; } @Override diff --git a/src/com/android/settings/notification/app/BubbleLinkPreferenceController.java b/src/com/android/settings/notification/app/BubbleLinkPreferenceController.java index 0b9529b10b5..ed1c9b53079 100644 --- a/src/com/android/settings/notification/app/BubbleLinkPreferenceController.java +++ b/src/com/android/settings/notification/app/BubbleLinkPreferenceController.java @@ -32,15 +32,15 @@ public class BubbleLinkPreferenceController extends NotificationPreferenceContro static final int ON = 1; public BubbleLinkPreferenceController(Context context) { - super(context, null); + super(context, null, KEY); } @Override - public boolean isAvailable() { - if (!super.isAvailable()) { - return false; + public int getAvailabilityStatus() { + if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { + return CONDITIONALLY_UNAVAILABLE; } - return areBubblesEnabled(); + return areBubblesEnabled() ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; } @Override diff --git a/src/com/android/settings/notification/app/BubblePreferenceController.java b/src/com/android/settings/notification/app/BubblePreferenceController.java index 351b4635bb6..516a45e482d 100644 --- a/src/com/android/settings/notification/app/BubblePreferenceController.java +++ b/src/com/android/settings/notification/app/BubblePreferenceController.java @@ -56,7 +56,7 @@ public class BubblePreferenceController extends NotificationPreferenceController public BubblePreferenceController(Context context, @Nullable FragmentManager fragmentManager, NotificationBackend backend, boolean isAppPage, @Nullable NotificationSettings.DependentFieldListener listener) { - super(context, backend); + super(context, backend, KEY); mFragmentManager = fragmentManager; mIsAppPage = isAppPage; mListener = listener; @@ -68,21 +68,24 @@ public class BubblePreferenceController extends NotificationPreferenceController } @Override - public boolean isAvailable() { - if (!super.isAvailable()) { - return false; + public int getAvailabilityStatus() { + if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { + return CONDITIONALLY_UNAVAILABLE; } if (!mIsAppPage && !isEnabled()) { - return false; + return CONDITIONALLY_UNAVAILABLE; } if (mChannel != null) { if (isDefaultChannel()) { - return true; + return AVAILABLE; } else { - return mAppRow != null && mAppRow.bubblePreference != BUBBLE_PREFERENCE_NONE; + if (mAppRow != null && mAppRow.bubblePreference != BUBBLE_PREFERENCE_NONE) { + return AVAILABLE; + } + return CONDITIONALLY_UNAVAILABLE; } } - return true; + return AVAILABLE; } @Override diff --git a/src/com/android/settings/notification/app/BubbleSummaryPreferenceController.java b/src/com/android/settings/notification/app/BubbleSummaryPreferenceController.java index 51370b16bef..abbe89e6fa8 100644 --- a/src/com/android/settings/notification/app/BubbleSummaryPreferenceController.java +++ b/src/com/android/settings/notification/app/BubbleSummaryPreferenceController.java @@ -42,28 +42,31 @@ public class BubbleSummaryPreferenceController extends NotificationPreferenceCon static final int ON = 1; public BubbleSummaryPreferenceController(Context context, NotificationBackend backend) { - super(context, backend); + super(context, backend, KEY); } @Override - public boolean isAvailable() { - if (!super.isAvailable()) { - return false; + public int getAvailabilityStatus() { + if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { + return CONDITIONALLY_UNAVAILABLE; } if (mAppRow == null) { - return false; + return CONDITIONALLY_UNAVAILABLE; } if (mChannel != null) { if (!isGloballyEnabled()) { - return false; + return CONDITIONALLY_UNAVAILABLE; } if (isDefaultChannel()) { - return true; + return AVAILABLE; } else { - return mAppRow != null; + return mAppRow != null ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; } } - return isGloballyEnabled() && mBackend.hasSentValidBubble(mAppRow.pkg, mAppRow.uid); + if (isGloballyEnabled() && mBackend.hasSentValidBubble(mAppRow.pkg, mAppRow.uid)) { + return AVAILABLE; + } + return CONDITIONALLY_UNAVAILABLE; } @Override diff --git a/src/com/android/settings/notification/app/ChannelListPreferenceController.java b/src/com/android/settings/notification/app/ChannelListPreferenceController.java index 8db3b21f4be..8d079114a9e 100644 --- a/src/com/android/settings/notification/app/ChannelListPreferenceController.java +++ b/src/com/android/settings/notification/app/ChannelListPreferenceController.java @@ -28,6 +28,7 @@ import android.os.AsyncTask; import android.os.Bundle; import android.provider.Settings; import android.text.TextUtils; +import android.util.Slog; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -39,16 +40,19 @@ import androidx.preference.SwitchPreference; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.applications.AppInfoBase; +import com.android.settings.core.BasePreferenceController; import com.android.settings.core.SubSettingLauncher; import com.android.settings.notification.NotificationBackend; import com.android.settingslib.PrimarySwitchPreference; import com.android.settingslib.RestrictedSwitchPreference; +import com.android.settingslib.utils.ThreadUtils; import java.util.ArrayList; import java.util.Collections; import java.util.List; -public class ChannelListPreferenceController extends NotificationPreferenceController { +public class ChannelListPreferenceController extends NotificationPreferenceController + implements BasePreferenceController.UiBlocker { private static final String KEY = "channels"; private static final String KEY_GENERAL_CATEGORY = "categories"; @@ -59,7 +63,7 @@ public class ChannelListPreferenceController extends NotificationPreferenceContr private PreferenceCategory mPreference; public ChannelListPreferenceController(Context context, NotificationBackend backend) { - super(context, backend); + super(context, backend, KEY); } @Override @@ -68,20 +72,20 @@ public class ChannelListPreferenceController extends NotificationPreferenceContr } @Override - public boolean isAvailable() { + public int getAvailabilityStatus() { if (mAppRow == null) { - return false; + return CONDITIONALLY_UNAVAILABLE; } if (mAppRow.banned) { - return false; + return CONDITIONALLY_UNAVAILABLE; } if (mChannel != null) { if (mBackend.onlyHasDefaultChannel(mAppRow.pkg, mAppRow.uid) || NotificationChannel.DEFAULT_CHANNEL_ID.equals(mChannel.getId())) { - return false; + return CONDITIONALLY_UNAVAILABLE; } } - return true; + return AVAILABLE; } @Override @@ -91,24 +95,17 @@ public class ChannelListPreferenceController extends NotificationPreferenceContr @Override public void updateState(Preference preference) { - mPreference = (PreferenceCategory) preference; - // Load channel settings - new AsyncTask() { - @Override - protected Void doInBackground(Void... unused) { + mPreference = (PreferenceCategory) preference; + // Load channel settings + ThreadUtils.postOnBackgroundThread(() -> { mChannelGroupList = mBackend.getGroups(mAppRow.pkg, mAppRow.uid).getList(); Collections.sort(mChannelGroupList, CHANNEL_GROUP_COMPARATOR); - return null; - } - - @Override - protected void onPostExecute(Void unused) { - if (mContext == null) { - return; - } + ThreadUtils.getUiThreadHandler().getLooper().prepare(); updateFullList(mPreference, mChannelGroupList); - } - }.execute(); + ThreadUtils.postOnMainThread(() -> { + showPreferences(); + }); + }); } /** @@ -144,6 +141,12 @@ public class ChannelListPreferenceController extends NotificationPreferenceContr } } + private void showPreferences() { + if (mUiBlockListener != null) { + mUiBlockListener.onBlockerWorkFinished(this); + } + } + /** * Looks for the category for the given group's key at the expected index, if that doesn't * match, it checks all groups, and if it can't find that group anywhere, it creates it. diff --git a/src/com/android/settings/notification/app/ConversationDemotePreferenceController.java b/src/com/android/settings/notification/app/ConversationDemotePreferenceController.java index 02f639c3157..ba7ca358b8b 100644 --- a/src/com/android/settings/notification/app/ConversationDemotePreferenceController.java +++ b/src/com/android/settings/notification/app/ConversationDemotePreferenceController.java @@ -37,7 +37,7 @@ public class ConversationDemotePreferenceController extends NotificationPreferen public ConversationDemotePreferenceController(Context context, SettingsPreferenceFragment hostFragment, NotificationBackend backend) { - super(context, backend); + super(context, backend, KEY); mHostFragment = hostFragment; } @@ -47,14 +47,17 @@ public class ConversationDemotePreferenceController extends NotificationPreferen } @Override - public boolean isAvailable() { - if (!super.isAvailable()) { - return false; + public int getAvailabilityStatus() { + if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { + return CONDITIONALLY_UNAVAILABLE; } if (mAppRow == null || mChannel == null) { - return false; + return CONDITIONALLY_UNAVAILABLE; } - return !TextUtils.isEmpty(mChannel.getConversationId()) && !mChannel.isDemoted(); + if (!TextUtils.isEmpty(mChannel.getConversationId()) && !mChannel.isDemoted()) { + return AVAILABLE; + } + return CONDITIONALLY_UNAVAILABLE; } @Override diff --git a/src/com/android/settings/notification/app/ConversationHeaderPreferenceController.java b/src/com/android/settings/notification/app/ConversationHeaderPreferenceController.java index f99a56aabda..56de88b324a 100644 --- a/src/com/android/settings/notification/app/ConversationHeaderPreferenceController.java +++ b/src/com/android/settings/notification/app/ConversationHeaderPreferenceController.java @@ -45,7 +45,7 @@ public class ConversationHeaderPreferenceController extends NotificationPreferen private boolean mStarted = false; public ConversationHeaderPreferenceController(Context context, DashboardFragment fragment) { - super(context, null); + super(context, null, PREF_KEY_APP_HEADER); mFragment = fragment; } @@ -55,8 +55,8 @@ public class ConversationHeaderPreferenceController extends NotificationPreferen } @Override - public boolean isAvailable() { - return mAppRow != null; + public int getAvailabilityStatus() { + return mAppRow != null ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; } @Override diff --git a/src/com/android/settings/notification/app/ConversationPriorityPreferenceController.java b/src/com/android/settings/notification/app/ConversationPriorityPreferenceController.java index ae169282484..46bc3c0c840 100644 --- a/src/com/android/settings/notification/app/ConversationPriorityPreferenceController.java +++ b/src/com/android/settings/notification/app/ConversationPriorityPreferenceController.java @@ -34,7 +34,7 @@ public class ConversationPriorityPreferenceController extends NotificationPrefer public ConversationPriorityPreferenceController(Context context, NotificationBackend backend, NotificationSettings.DependentFieldListener listener) { - super(context, backend); + super(context, backend, KEY); mDependentFieldListener = listener; } @@ -44,14 +44,14 @@ public class ConversationPriorityPreferenceController extends NotificationPrefer } @Override - public boolean isAvailable() { - if (!super.isAvailable()) { - return false; + public int getAvailabilityStatus() { + if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { + return CONDITIONALLY_UNAVAILABLE; } if (mAppRow == null || mChannel == null) { - return false; + return CONDITIONALLY_UNAVAILABLE; } - return true; + return AVAILABLE; } @Override diff --git a/src/com/android/settings/notification/app/ConversationPromotePreferenceController.java b/src/com/android/settings/notification/app/ConversationPromotePreferenceController.java index 24c3d2ff6a1..a5ef569d620 100644 --- a/src/com/android/settings/notification/app/ConversationPromotePreferenceController.java +++ b/src/com/android/settings/notification/app/ConversationPromotePreferenceController.java @@ -37,7 +37,7 @@ public class ConversationPromotePreferenceController extends NotificationPrefere public ConversationPromotePreferenceController(Context context, SettingsPreferenceFragment hostFragment, NotificationBackend backend) { - super(context, backend); + super(context, backend, KEY); mHostFragment = hostFragment; } @@ -47,14 +47,17 @@ public class ConversationPromotePreferenceController extends NotificationPrefere } @Override - public boolean isAvailable() { - if (!super.isAvailable()) { - return false; + public int getAvailabilityStatus() { + if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { + return CONDITIONALLY_UNAVAILABLE; } if (mAppRow == null || mChannel == null) { - return false; + return CONDITIONALLY_UNAVAILABLE; } - return !TextUtils.isEmpty(mChannel.getConversationId()) && mChannel.isDemoted(); + if (!TextUtils.isEmpty(mChannel.getConversationId()) && mChannel.isDemoted()) { + return AVAILABLE; + } + return CONDITIONALLY_UNAVAILABLE; } @Override diff --git a/src/com/android/settings/notification/app/DeletedChannelsPreferenceController.java b/src/com/android/settings/notification/app/DeletedChannelsPreferenceController.java index 77a692f1488..cd160df1fd4 100644 --- a/src/com/android/settings/notification/app/DeletedChannelsPreferenceController.java +++ b/src/com/android/settings/notification/app/DeletedChannelsPreferenceController.java @@ -30,7 +30,7 @@ public class DeletedChannelsPreferenceController extends NotificationPreferenceC private static final String KEY_DELETED = "deleted"; public DeletedChannelsPreferenceController(Context context, NotificationBackend backend) { - super(context, backend); + super(context, backend, KEY_DELETED); } @Override @@ -39,16 +39,19 @@ public class DeletedChannelsPreferenceController extends NotificationPreferenceC } @Override - public boolean isAvailable() { - if (!super.isAvailable()) { - return false; + public int getAvailabilityStatus() { + if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { + return CONDITIONALLY_UNAVAILABLE; } // only visible on app screen if (mChannel != null || hasValidGroup()) { - return false; + return CONDITIONALLY_UNAVAILABLE; } - return mBackend.getDeletedChannelCount(mAppRow.pkg, mAppRow.uid) > 0; + if (mBackend.getDeletedChannelCount(mAppRow.pkg, mAppRow.uid) > 0) { + return AVAILABLE; + } + return CONDITIONALLY_UNAVAILABLE; } @Override diff --git a/src/com/android/settings/notification/app/DescriptionPreferenceController.java b/src/com/android/settings/notification/app/DescriptionPreferenceController.java index 0a5bb2f9260..413a876cec9 100644 --- a/src/com/android/settings/notification/app/DescriptionPreferenceController.java +++ b/src/com/android/settings/notification/app/DescriptionPreferenceController.java @@ -29,7 +29,7 @@ public class DescriptionPreferenceController extends NotificationPreferenceContr private static final String KEY_DESC = "desc"; public DescriptionPreferenceController(Context context) { - super(context, null); + super(context, null, KEY_DESC); } @Override @@ -38,20 +38,20 @@ public class DescriptionPreferenceController extends NotificationPreferenceContr } @Override - public boolean isAvailable() { - if (!super.isAvailable()) { - return false; + public int getAvailabilityStatus() { + if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { + return CONDITIONALLY_UNAVAILABLE; } if (mChannel == null && !hasValidGroup()) { - return false; + return CONDITIONALLY_UNAVAILABLE; } if (mChannel != null && !TextUtils.isEmpty(mChannel.getDescription())) { - return true; + return AVAILABLE; } if (hasValidGroup() && !TextUtils.isEmpty(mChannelGroup.getDescription())) { - return true; + return AVAILABLE; } - return false; + return CONDITIONALLY_UNAVAILABLE; } @Override diff --git a/src/com/android/settings/notification/app/DndPreferenceController.java b/src/com/android/settings/notification/app/DndPreferenceController.java index b65928aa915..811eeb4ec79 100644 --- a/src/com/android/settings/notification/app/DndPreferenceController.java +++ b/src/com/android/settings/notification/app/DndPreferenceController.java @@ -31,7 +31,7 @@ public class DndPreferenceController extends NotificationPreferenceController private static final String KEY_BYPASS_DND = "bypass_dnd"; public DndPreferenceController(Context context, NotificationBackend backend) { - super(context, backend); + super(context, backend, KEY_BYPASS_DND); } @Override @@ -40,11 +40,11 @@ public class DndPreferenceController extends NotificationPreferenceController } @Override - public boolean isAvailable() { - if (!super.isAvailable() || mChannel == null) { - return false; + public int getAvailabilityStatus() { + if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE || mChannel == null) { + return CONDITIONALLY_UNAVAILABLE; } - return true; + return AVAILABLE; } @Override diff --git a/src/com/android/settings/notification/app/HeaderPreferenceController.java b/src/com/android/settings/notification/app/HeaderPreferenceController.java index 7379d55395b..c4b0e598dff 100644 --- a/src/com/android/settings/notification/app/HeaderPreferenceController.java +++ b/src/com/android/settings/notification/app/HeaderPreferenceController.java @@ -45,7 +45,7 @@ public class HeaderPreferenceController extends NotificationPreferenceController private boolean mStarted = false; public HeaderPreferenceController(Context context, DashboardFragment fragment) { - super(context, null); + super(context, null, PREF_KEY_APP_HEADER); mFragment = fragment; } @@ -55,8 +55,8 @@ public class HeaderPreferenceController extends NotificationPreferenceController } @Override - public boolean isAvailable() { - return mAppRow != null; + public int getAvailabilityStatus() { + return mAppRow != null ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; } @Override diff --git a/src/com/android/settings/notification/app/HighImportancePreferenceController.java b/src/com/android/settings/notification/app/HighImportancePreferenceController.java index d60668b9abe..98dc8a760e2 100644 --- a/src/com/android/settings/notification/app/HighImportancePreferenceController.java +++ b/src/com/android/settings/notification/app/HighImportancePreferenceController.java @@ -37,7 +37,7 @@ public class HighImportancePreferenceController extends NotificationPreferenceCo public HighImportancePreferenceController(Context context, NotificationSettings.DependentFieldListener dependentFieldListener, NotificationBackend backend) { - super(context, backend); + super(context, backend, KEY_IMPORTANCE); mDependentFieldListener = dependentFieldListener; } @@ -47,17 +47,19 @@ public class HighImportancePreferenceController extends NotificationPreferenceCo } @Override - public boolean isAvailable() { - if (!super.isAvailable()) { - return false; + public int getAvailabilityStatus() { + if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { + return CONDITIONALLY_UNAVAILABLE; } if (mChannel == null) { - return false; + return CONDITIONALLY_UNAVAILABLE; } if (isDefaultChannel()) { - return false; + return CONDITIONALLY_UNAVAILABLE; } - return mChannel.getImportance() >= IMPORTANCE_DEFAULT; + return mChannel.getImportance() >= IMPORTANCE_DEFAULT + ? AVAILABLE + : CONDITIONALLY_UNAVAILABLE; } @Override diff --git a/src/com/android/settings/notification/app/ImportancePreferenceController.java b/src/com/android/settings/notification/app/ImportancePreferenceController.java index 3c32ca4b0bc..31ddac39373 100644 --- a/src/com/android/settings/notification/app/ImportancePreferenceController.java +++ b/src/com/android/settings/notification/app/ImportancePreferenceController.java @@ -38,7 +38,7 @@ public class ImportancePreferenceController extends NotificationPreferenceContro public ImportancePreferenceController(Context context, NotificationSettings.DependentFieldListener dependentFieldListener, NotificationBackend backend) { - super(context, backend); + super(context, backend, KEY_IMPORTANCE); mDependentFieldListener = dependentFieldListener; } @@ -48,14 +48,14 @@ public class ImportancePreferenceController extends NotificationPreferenceContro } @Override - public boolean isAvailable() { - if (!super.isAvailable()) { - return false; + public int getAvailabilityStatus() { + if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { + return CONDITIONALLY_UNAVAILABLE; } if (mChannel == null) { - return false; + return CONDITIONALLY_UNAVAILABLE; } - return !isDefaultChannel(); + return !isDefaultChannel() ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; } @Override diff --git a/src/com/android/settings/notification/app/InvalidConversationInfoPreferenceController.java b/src/com/android/settings/notification/app/InvalidConversationInfoPreferenceController.java index b937e80e0d6..bb2c58b728b 100644 --- a/src/com/android/settings/notification/app/InvalidConversationInfoPreferenceController.java +++ b/src/com/android/settings/notification/app/InvalidConversationInfoPreferenceController.java @@ -31,7 +31,7 @@ public class InvalidConversationInfoPreferenceController extends NotificationPre public InvalidConversationInfoPreferenceController(Context context, NotificationBackend backend) { - super(context, backend); + super(context, backend, KEY); } @Override @@ -40,17 +40,19 @@ public class InvalidConversationInfoPreferenceController extends NotificationPre } @Override - public boolean isAvailable() { + public int getAvailabilityStatus() { if (mAppRow == null) { - return false; + return CONDITIONALLY_UNAVAILABLE; } if (mAppRow.banned) { - return false; + return CONDITIONALLY_UNAVAILABLE; } if (mPreferenceFilter != null && !isIncludedInFilter()) { - return false; + return CONDITIONALLY_UNAVAILABLE; } - return mBackend.isInInvalidMsgState(mAppRow.pkg, mAppRow.uid); + return mBackend.isInInvalidMsgState(mAppRow.pkg, mAppRow.uid) + ? AVAILABLE + : CONDITIONALLY_UNAVAILABLE; } @Override diff --git a/src/com/android/settings/notification/app/InvalidConversationPreferenceController.java b/src/com/android/settings/notification/app/InvalidConversationPreferenceController.java index 5c502dccbe0..219ccbcea85 100644 --- a/src/com/android/settings/notification/app/InvalidConversationPreferenceController.java +++ b/src/com/android/settings/notification/app/InvalidConversationPreferenceController.java @@ -31,7 +31,7 @@ public class InvalidConversationPreferenceController extends NotificationPrefere private static final String KEY = "invalid_conversation_switch"; public InvalidConversationPreferenceController(Context context, NotificationBackend backend) { - super(context, backend); + super(context, backend, KEY); } @Override @@ -40,17 +40,19 @@ public class InvalidConversationPreferenceController extends NotificationPrefere } @Override - public boolean isAvailable() { + public int getAvailabilityStatus() { if (mAppRow == null) { - return false; + return CONDITIONALLY_UNAVAILABLE; } if (mAppRow.banned) { - return false; + return CONDITIONALLY_UNAVAILABLE; } if (mPreferenceFilter != null && !isIncludedInFilter()) { - return false; + return CONDITIONALLY_UNAVAILABLE; } - return mBackend.isInInvalidMsgState(mAppRow.pkg, mAppRow.uid); + return mBackend.isInInvalidMsgState(mAppRow.pkg, mAppRow.uid) + ? AVAILABLE + : CONDITIONALLY_UNAVAILABLE; } @Override diff --git a/src/com/android/settings/notification/app/LightsPreferenceController.java b/src/com/android/settings/notification/app/LightsPreferenceController.java index d096922e348..f7f92442c9b 100644 --- a/src/com/android/settings/notification/app/LightsPreferenceController.java +++ b/src/com/android/settings/notification/app/LightsPreferenceController.java @@ -33,7 +33,7 @@ public class LightsPreferenceController extends NotificationPreferenceController private static final String KEY_LIGHTS = "lights"; public LightsPreferenceController(Context context, NotificationBackend backend) { - super(context, backend); + super(context, backend, KEY_LIGHTS); } @Override @@ -42,16 +42,18 @@ public class LightsPreferenceController extends NotificationPreferenceController } @Override - public boolean isAvailable() { - if (!super.isAvailable()) { - return false; + public int getAvailabilityStatus() { + if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { + return CONDITIONALLY_UNAVAILABLE; } if (mChannel == null) { - return false; + return CONDITIONALLY_UNAVAILABLE; } - return checkCanBeVisible(NotificationManager.IMPORTANCE_DEFAULT) - && canPulseLight() - && !isDefaultChannel(); + if (checkCanBeVisible(NotificationManager.IMPORTANCE_DEFAULT) && canPulseLight() + && !isDefaultChannel()) { + return AVAILABLE; + } + return CONDITIONALLY_UNAVAILABLE; } @Override diff --git a/src/com/android/settings/notification/app/MinImportancePreferenceController.java b/src/com/android/settings/notification/app/MinImportancePreferenceController.java index f8257636615..b2c0862b8f8 100644 --- a/src/com/android/settings/notification/app/MinImportancePreferenceController.java +++ b/src/com/android/settings/notification/app/MinImportancePreferenceController.java @@ -37,7 +37,7 @@ public class MinImportancePreferenceController extends NotificationPreferenceCon public MinImportancePreferenceController(Context context, NotificationSettings.DependentFieldListener dependentFieldListener, NotificationBackend backend) { - super(context, backend); + super(context, backend, KEY_IMPORTANCE); mDependentFieldListener = dependentFieldListener; } @@ -47,17 +47,17 @@ public class MinImportancePreferenceController extends NotificationPreferenceCon } @Override - public boolean isAvailable() { - if (!super.isAvailable()) { - return false; + public int getAvailabilityStatus() { + if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { + return CONDITIONALLY_UNAVAILABLE; } if (mChannel == null) { - return false; + return CONDITIONALLY_UNAVAILABLE; } if (isDefaultChannel()) { - return false; + return CONDITIONALLY_UNAVAILABLE; } - return mChannel.getImportance() <= IMPORTANCE_LOW; + return mChannel.getImportance() <= IMPORTANCE_LOW ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; } @Override diff --git a/src/com/android/settings/notification/app/NotificationPreferenceController.java b/src/com/android/settings/notification/app/NotificationPreferenceController.java index fb19d9d6b4c..271a83d76f8 100644 --- a/src/com/android/settings/notification/app/NotificationPreferenceController.java +++ b/src/com/android/settings/notification/app/NotificationPreferenceController.java @@ -17,26 +17,24 @@ package com.android.settings.notification.app; import static android.app.NotificationManager.IMPORTANCE_NONE; -import static android.os.UserHandle.USER_SYSTEM; import android.annotation.Nullable; import android.app.NotificationChannel; import android.app.NotificationChannelGroup; import android.app.NotificationManager; import android.content.Context; -import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ShortcutInfo; import android.graphics.drawable.Drawable; import android.os.UserManager; -import android.provider.Settings; import android.util.Log; +import android.util.Slog; import androidx.preference.Preference; +import com.android.settings.core.BasePreferenceController; import com.android.settings.notification.NotificationBackend; import com.android.settingslib.RestrictedLockUtils; -import com.android.settingslib.core.AbstractPreferenceController; import java.util.Comparator; import java.util.List; @@ -46,7 +44,7 @@ import java.util.Objects; * Parent class for preferences appearing on notification setting pages at the app, * notification channel group, or notification channel level. */ -public abstract class NotificationPreferenceController extends AbstractPreferenceController { +public abstract class NotificationPreferenceController extends BasePreferenceController { private static final String TAG = "ChannelPrefContr"; @Nullable protected NotificationChannel mChannel; @@ -71,8 +69,11 @@ public abstract class NotificationPreferenceController extends AbstractPreferenc boolean overrideCanBlockValue; boolean overrideCanConfigureValue; - public NotificationPreferenceController(Context context, NotificationBackend backend) { - super(context); + boolean mLoadedChannelState; + + public NotificationPreferenceController(Context context, NotificationBackend backend, + String key) { + super(context, key); mContext = context; mNm = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); mBackend = backend; @@ -81,28 +82,30 @@ public abstract class NotificationPreferenceController extends AbstractPreferenc } /** - * Returns true if field's parent object is not blocked. + * Returns available if field's parent object is not blocked. */ @Override - public boolean isAvailable() { + public int getAvailabilityStatus() { if (mAppRow == null) { - return false; + return CONDITIONALLY_UNAVAILABLE; } if (mAppRow.banned) { - return false; + return CONDITIONALLY_UNAVAILABLE; } if (mChannelGroup != null) { if (mChannelGroup.isBlocked()) { - return false; + return CONDITIONALLY_UNAVAILABLE; } } if (mChannel != null) { if (mPreferenceFilter != null && !isIncludedInFilter()) { - return false; + return CONDITIONALLY_UNAVAILABLE; + } + if(mChannel.getImportance() == IMPORTANCE_NONE) { + return CONDITIONALLY_UNAVAILABLE; } - return mChannel.getImportance() != IMPORTANCE_NONE; } - return true; + return AVAILABLE; } protected void onResume(NotificationBackend.AppRow appRow, diff --git a/src/com/android/settings/notification/app/NotificationSettings.java b/src/com/android/settings/notification/app/NotificationSettings.java index 192a0ee9fc7..5750167c271 100644 --- a/src/com/android/settings/notification/app/NotificationSettings.java +++ b/src/com/android/settings/notification/app/NotificationSettings.java @@ -41,6 +41,7 @@ import android.os.UserHandle; import android.provider.Settings; import android.text.TextUtils; import android.util.Log; +import android.util.Slog; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; @@ -129,15 +130,52 @@ abstract public class NotificationSettings extends DashboardFragment { } } + mUserId = UserHandle.getUserId(mUid); mPkgInfo = findPackageInfo(mPkg, mUid); + } + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + if (mIntent == null && mArgs == null) { + toastAndFinish("no intent"); + return; + } + + if (mUid < 0 || TextUtils.isEmpty(mPkg) || mPkgInfo == null) { + toastAndFinish("Missing package or uid or packageinfo"); + return; + } + + startListeningToPackageRemove(); + } + + @Override + public void onDestroy() { + stopListeningToPackageRemove(); + super.onDestroy(); + } + + @Override + public void onResume() { + super.onResume(); + if (mUid < 0 || TextUtils.isEmpty(mPkg) || mPkgInfo == null) { + toastAndFinish("Missing package or uid or packageinfo"); + return; + } + mPkgInfo = findPackageInfo(mPkg, mUid); if (mPkgInfo != null) { - mUserId = UserHandle.getUserId(mUid); mSuspendedAppsAdmin = RestrictedLockUtilsInternal.checkIfApplicationIsSuspended( mContext, mPkg, mUserId); - loadChannel(); loadAppRow(); + if (mAppRow == null) { + toastAndFinish("Can't load package"); + return; + } + loadChannel(); + loadConversation(); loadChannelGroup(); loadPreferencesFilter(); collectConfigActivities(); @@ -157,55 +195,6 @@ abstract public class NotificationSettings extends DashboardFragment { } } - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - if (mIntent == null && mArgs == null) { - Log.w(TAG, "No intent"); - toastAndFinish(); - return; - } - - if (mUid < 0 || TextUtils.isEmpty(mPkg) || mPkgInfo == null) { - Log.w(TAG, "Missing package or uid or packageinfo"); - toastAndFinish(); - return; - } - - startListeningToPackageRemove(); - } - - @Override - public void onDestroy() { - stopListeningToPackageRemove(); - super.onDestroy(); - } - - @Override - public void onResume() { - super.onResume(); - if (mUid < 0 || TextUtils.isEmpty(mPkg) || mPkgInfo == null || mAppRow == null) { - Log.w(TAG, "Missing package or uid or packageinfo"); - finish(); - return; - } - // Reload app, channel, etc onResume in case they've changed. A little wasteful if we've - // just done onAttach but better than making every preference controller reload all - // the data - loadAppRow(); - if (mAppRow == null) { - Log.w(TAG, "Can't load package"); - finish(); - return; - } - loadChannel(); - loadConversation(); - loadChannelGroup(); - loadPreferencesFilter(); - collectConfigActivities(); - } - protected void animatePanel() { if (mPreferenceFilter != null) { mLayoutView = getActivity().findViewById(R.id.main_content); @@ -307,7 +296,8 @@ abstract public class NotificationSettings extends DashboardFragment { } } - protected void toastAndFinish() { + protected void toastAndFinish(String msg) { + Log.w(TAG, msg); Toast.makeText(mContext, R.string.app_not_found_dlg_text, Toast.LENGTH_SHORT).show(); getActivity().finish(); } diff --git a/src/com/android/settings/notification/app/NotificationsOffPreferenceController.java b/src/com/android/settings/notification/app/NotificationsOffPreferenceController.java index 0c7cd2361e2..46625c3101a 100644 --- a/src/com/android/settings/notification/app/NotificationsOffPreferenceController.java +++ b/src/com/android/settings/notification/app/NotificationsOffPreferenceController.java @@ -30,7 +30,7 @@ public class NotificationsOffPreferenceController extends NotificationPreference private static final String KEY_BLOCKED_DESC = "block_desc"; public NotificationsOffPreferenceController(Context context) { - super(context, null); + super(context, null, KEY_BLOCKED_DESC); } @Override @@ -39,16 +39,20 @@ public class NotificationsOffPreferenceController extends NotificationPreference } @Override - public boolean isAvailable() { + public int getAvailabilityStatus() { if (mAppRow == null) { - return false; + return CONDITIONALLY_UNAVAILABLE; } if (mPreferenceFilter != null && !isIncludedInFilter()) { - return false; + return CONDITIONALLY_UNAVAILABLE; } // Available only when other controllers are unavailable - this UI replaces the UI that // would give more detailed notification controls. - return !super.isAvailable(); + if (super.getAvailabilityStatus() == AVAILABLE) { + return CONDITIONALLY_UNAVAILABLE; + } else { + return AVAILABLE; + } } @Override diff --git a/src/com/android/settings/notification/app/SoundPreferenceController.java b/src/com/android/settings/notification/app/SoundPreferenceController.java index b23b4fc86cb..335b44226ce 100644 --- a/src/com/android/settings/notification/app/SoundPreferenceController.java +++ b/src/com/android/settings/notification/app/SoundPreferenceController.java @@ -47,7 +47,7 @@ public class SoundPreferenceController extends NotificationPreferenceController public SoundPreferenceController(Context context, SettingsPreferenceFragment hostFragment, NotificationSettings.DependentFieldListener dependentFieldListener, NotificationBackend backend) { - super(context, backend); + super(context, backend, KEY_SOUND); mFragment = hostFragment; mListener = dependentFieldListener; } @@ -58,14 +58,17 @@ public class SoundPreferenceController extends NotificationPreferenceController } @Override - public boolean isAvailable() { - if (!super.isAvailable()) { - return false; + public int getAvailabilityStatus() { + if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { + return CONDITIONALLY_UNAVAILABLE; } if (mChannel == null) { - return false; + return CONDITIONALLY_UNAVAILABLE; } - return checkCanBeVisible(NotificationManager.IMPORTANCE_DEFAULT) && !isDefaultChannel(); + if (checkCanBeVisible(NotificationManager.IMPORTANCE_DEFAULT) && !isDefaultChannel()) { + return AVAILABLE; + } + return CONDITIONALLY_UNAVAILABLE; } @Override diff --git a/src/com/android/settings/notification/app/VibrationPreferenceController.java b/src/com/android/settings/notification/app/VibrationPreferenceController.java index 34d1a543b56..f91999f074d 100644 --- a/src/com/android/settings/notification/app/VibrationPreferenceController.java +++ b/src/com/android/settings/notification/app/VibrationPreferenceController.java @@ -34,7 +34,7 @@ public class VibrationPreferenceController extends NotificationPreferenceControl private final Vibrator mVibrator; public VibrationPreferenceController(Context context, NotificationBackend backend) { - super(context, backend); + super(context, backend, KEY_VIBRATE); mVibrator = context.getSystemService(Vibrator.class); } @@ -44,14 +44,15 @@ public class VibrationPreferenceController extends NotificationPreferenceControl } @Override - public boolean isAvailable() { - if (!super.isAvailable() || mChannel == null) { - return false; - } - return checkCanBeVisible(NotificationManager.IMPORTANCE_DEFAULT) - && !isDefaultChannel() - && mVibrator != null - && mVibrator.hasVibrator(); + public int getAvailabilityStatus() { + if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE || mChannel == null) { + return CONDITIONALLY_UNAVAILABLE; + } + if (checkCanBeVisible(NotificationManager.IMPORTANCE_DEFAULT) && !isDefaultChannel() + && mVibrator != null && mVibrator.hasVibrator()) { + return AVAILABLE; + } + return CONDITIONALLY_UNAVAILABLE; } @Override diff --git a/src/com/android/settings/notification/app/VisibilityPreferenceController.java b/src/com/android/settings/notification/app/VisibilityPreferenceController.java index a2a1d76b71c..3f33267a749 100644 --- a/src/com/android/settings/notification/app/VisibilityPreferenceController.java +++ b/src/com/android/settings/notification/app/VisibilityPreferenceController.java @@ -48,7 +48,7 @@ public class VisibilityPreferenceController extends NotificationPreferenceContro public VisibilityPreferenceController(Context context, LockPatternUtils utils, NotificationBackend backend) { - super(context, backend); + super(context, backend, KEY_VISIBILITY_OVERRIDE); mLockPatternUtils = utils; } @@ -58,14 +58,18 @@ public class VisibilityPreferenceController extends NotificationPreferenceContro } @Override - public boolean isAvailable() { - if (!super.isAvailable()) { - return false; + public int getAvailabilityStatus() { + if (super.getAvailabilityStatus() == CONDITIONALLY_UNAVAILABLE) { + return CONDITIONALLY_UNAVAILABLE; } if (mChannel == null || mAppRow.banned) { - return false; + return CONDITIONALLY_UNAVAILABLE; } - return checkCanBeVisible(NotificationManager.IMPORTANCE_LOW) && isLockScreenSecure(); + if (checkCanBeVisible(NotificationManager.IMPORTANCE_LOW) && isLockScreenSecure()) { + return AVAILABLE; + } + + return CONDITIONALLY_UNAVAILABLE; } @Override diff --git a/tests/robotests/src/com/android/settings/notification/app/NotificationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/app/NotificationPreferenceControllerTest.java index b2f1673f317..bf529e67568 100644 --- a/tests/robotests/src/com/android/settings/notification/app/NotificationPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/app/NotificationPreferenceControllerTest.java @@ -426,7 +426,7 @@ public class NotificationPreferenceControllerTest { private final class TestPreferenceController extends NotificationPreferenceController { private TestPreferenceController(Context context, NotificationBackend backend) { - super(context, backend); + super(context, backend, "key"); } @Override From 56e5b3da9613f648fb4d9a982d2281d5bd0d3fc1 Mon Sep 17 00:00:00 2001 From: Michael Mikhail Date: Fri, 29 Jul 2022 22:18:10 +0000 Subject: [PATCH 3/5] Add media on lock screen setting Add a new setting that controls whether media on lock screen is enabled, disregarding the notifications status. The new setting is available under media and privacy settings. Bug: 229915240 Test: atest MediaControlsLockScreenPreferenceControllerTest Change-Id: I054f36efd635dc0535551d3058f9faf92196349d --- res/values/strings.xml | 4 + res/xml/media_controls_settings.xml | 6 ++ res/xml/privacy_advanced_settings.xml | 8 ++ res/xml/privacy_dashboard_settings.xml | 8 ++ ...ontrolsLockScreenPreferenceController.java | 58 ++++++++++++ ...olsLockScreenPreferenceControllerTest.java | 89 +++++++++++++++++++ 6 files changed, 173 insertions(+) create mode 100644 src/com/android/settings/sound/MediaControlsLockScreenPreferenceController.java create mode 100644 tests/unit/src/com/android/settings/sound/MediaControlsLockScreenPreferenceControllerTest.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 9f8df7b6467..552ee72a722 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -13608,6 +13608,10 @@ Pin media player To quickly resume playback, media player stays open in Quick Settings + + Show media on lock screen + + To quickly resume playback, media player stays open on lock screen Show media recommendations diff --git a/res/xml/media_controls_settings.xml b/res/xml/media_controls_settings.xml index 0318097ef3a..822639ac190 100644 --- a/res/xml/media_controls_settings.xml +++ b/res/xml/media_controls_settings.xml @@ -27,6 +27,12 @@ app:keywords="@string/keywords_media_controls" app:controller="com.android.settings.sound.MediaControlsPreferenceController" /> + + + + + + + + Date: Tue, 9 Aug 2022 20:23:33 +0800 Subject: [PATCH 4/5] Update Settings charging string - Update charging protected string Bug: 236798712 Test: make and verify strings Change-Id: I86e063191b42e98d8836a6dbe3b32ff3ce3bb8d0 --- res/values/strings.xml | 4 ++-- .../src/com/android/settings/fuelgauge/BatteryInfoTest.java | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 406c4a27c0d..25d3b29cfab 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -6278,9 +6278,9 @@ See apps with highest usage - Charging temporarily limited + Charging is paused - To preserve your battery. Learn more. + Protecting battery to extend battery lifespan\nTap to learn more %1$s diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java index 591c4e6b7f9..c5c47d27203 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java @@ -249,6 +249,8 @@ public class BatteryInfoTest { @Test public void testGetBatteryInfo_chargingWithOverheated_updateChargeLabel() { + final String expectedString = + mContext.getString(R.string.battery_tip_limited_temporarily_title); doReturn(TEST_CHARGE_TIME_REMAINING) .when(mBatteryUsageStats) .getChargeTimeRemainingMs(); @@ -260,7 +262,7 @@ public class BatteryInfoTest { false /* shortString */); assertThat(info.isOverheated).isTrue(); - assertThat(info.chargeLabel).isEqualTo("50% - Charging temporarily limited"); + assertThat(info.chargeLabel.toString()).contains(expectedString); } // Make our battery stats return a sequence of battery events. From efdedcdc159c0207bf075240aa74245ea5575fb4 Mon Sep 17 00:00:00 2001 From: sayakiitg Date: Wed, 12 Jan 2022 10:45:33 +0000 Subject: [PATCH 5/5] Revamp SD card UX Improve the SD card setup flow so that each formatting option is provided in a separate screen with clear description and illustration.Also make sure that guest users do not have any access to formatting options. Test: Manual testing on Pixel Device Screenshot1: https://screenshot.googleplex.com/WJwyxFkBtbSfZmN.png Screenshot2: https://screenshot.googleplex.com/3oBcrrgRsKTxNPC.png Bug: 201252175 Change-Id: I77df55c40fd99cabcfc6128084be035bb5b19531 Change-Id: I757abc6076fcc8f467d8faed9f090bcdd5774ff3 (cherry picked from commit 9b432d54a68abf49702db1d6dc2823307f0750ff) Merged-In: I757abc6076fcc8f467d8faed9f090bcdd5774ff3 --- AndroidManifest.xml | 32 ++-- res/drawable/ic_storage_wizard_external.xml | 146 ++++++++++-------- res/drawable/ic_storage_wizard_internal.xml | 99 ++++++------ res/drawable/ic_storage_wizard_ready.xml | 40 +++++ res/drawable/ic_swap_horiz.xml | 2 +- res/drawable/ic_test_tick.xml | 26 ++++ res/layout/storage_internal_format.xml | 38 ++--- res/layout/storage_wizard_generic.xml | 64 +++++--- res/layout/storage_wizard_init.xml | 140 +++-------------- res/layout/storage_wizard_init_external.xml | 35 +++++ res/layout/storage_wizard_init_internal.xml | 35 +++++ res/layout/storage_wizard_progress.xml | 80 +++++----- res/menu/storage_volume.xml | 4 +- res/values/dimens.xml | 2 + res/values/strings.xml | 81 +++++----- .../deviceinfo/PublicVolumeSettings.java | 67 ++++---- .../deviceinfo/StorageWizardBase.java | 53 ++++--- .../StorageWizardFormatConfirm.java | 16 +- .../deviceinfo/StorageWizardInit.java | 138 ++++++++++++----- .../deviceinfo/StorageWizardReady.java | 5 +- .../VolumeOptionMenuController.java | 35 +++-- .../VolumeOptionMenuControllerTest.java | 9 +- 22 files changed, 658 insertions(+), 489 deletions(-) create mode 100644 res/drawable/ic_storage_wizard_ready.xml create mode 100644 res/drawable/ic_test_tick.xml create mode 100644 res/layout/storage_wizard_init_external.xml create mode 100644 res/layout/storage_wizard_init_internal.xml diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 7c44a8ffded..e280b8394f9 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2475,33 +2475,41 @@ + android:theme="@style/GlifTheme.Light" + android:exported="false" + android:configChanges="keyboardHidden|orientation|screenSize"/> + android:theme="@style/GlifTheme.Light" + android:exported="false" + android:configChanges="keyboardHidden|orientation|screenSize"/> + android:theme="@style/GlifTheme.Light" + android:exported="false" + android:configChanges="keyboardHidden|orientation|screenSize"/> + android:theme="@style/GlifTheme.Light" + android:exported="false" + android:configChanges="keyboardHidden|orientation|screenSize"/> diff --git a/res/drawable/ic_storage_wizard_external.xml b/res/drawable/ic_storage_wizard_external.xml index 99e2698633d..c6fefa1e99d 100644 --- a/res/drawable/ic_storage_wizard_external.xml +++ b/res/drawable/ic_storage_wizard_external.xml @@ -1,3 +1,4 @@ + + android:width="360dp" + android:height="262dp" + android:viewportWidth="360" + android:viewportHeight="262"> + + android:fillColor="@android:color/transparent" + android:pathData="M335.709 262H24.2913C10.9223 262 0 250.821 0 237.11V24.89C0 11.1787 10.9223 0 24.2913 0H335.796C349.078 0 360 11.1787 360 24.89V237.285C360 250.821 349.078 262 335.709 262Z" /> + android:fillColor="@android:color/transparent" + android:pathData="M153.786 66.0239H319.806C322.777 66.0239 325.223 68.4693 325.311 71.4386V183.575H148.282V71.4386C148.282 68.4693 150.728 66.0239 153.786 66.0239Z" + android:strokeWidth="5" + android:strokeColor="#E8EAED"/> + android:fillColor="#BDC1C6" + android:pathData="M182.272 180.605H171.961V183.4H182.272V180.605Z" /> + android:fillColor="#BDC1C6" + android:pathData="M195.204 180.605H184.893V183.4H195.204V180.605Z" /> - + android:pathData="M78.8155 104.538V100.521C78.8155 99.9967 78.3786 99.5601 77.8544 99.5601V78.6001C77.8544 75.8054 75.5825 73.6221 72.8738 73.6221H26.8252C24.0291 73.6221 21.8447 75.8054 21.8447 78.6001V174.492C21.8447 177.287 24.1165 179.47 26.8252 179.47H72.7864C75.5825 179.47 77.767 177.199 77.767 174.492V125.585C78.2913 125.585 78.7282 125.149 78.7282 124.625V114.581C78.7282 114.057 78.2913 113.621 77.767 113.621V105.586C78.3786 105.499 78.8155 105.062 78.8155 104.538ZM76.8058 174.492C76.8058 176.675 74.9709 178.509 72.7864 178.509H26.8252C24.6408 178.509 22.8058 176.675 22.8058 174.492V78.6001C22.8058 76.4167 24.5534 74.5827 26.8252 74.5827H72.7864C74.9709 74.5827 76.8058 76.3294 76.8058 78.6001V174.492Z" /> + android:fillColor="#81C995" + android:pathData="M35.2136 102.18H47.534V89.8658H35.2136V102.18ZM35.2136 103.926C34.2524 103.926 33.466 103.14 33.466 102.18V89.8658C33.466 88.9051 34.2524 88.1191 35.2136 88.1191H47.534C47.9709 88.1191 48.4077 88.2938 48.7573 88.6431C49.1068 88.9925 49.2815 89.4291 49.2815 89.8658V102.18C49.2815 103.14 48.4951 103.926 47.534 103.926H35.2136ZM36.0874 100.433H46.5728L43.2524 96.0665L40.6311 99.5598L38.6213 96.9398L36.0874 100.433ZM35.2136 89.8658V102.18V89.8658Z" /> + + + + + + + + + + android:pathData="M134.65 182.09H338.854V184.186C338.854 185.758 337.631 186.981 336.058 186.981H137.447C135.874 186.981 134.65 185.758 134.65 184.186V182.09Z" /> + android:fillColor="#81C995" + android:pathData="M177.204 129.69H193.456V113.446H177.204V129.69ZM177.204 132.048C175.893 132.048 174.845 131 174.845 129.69V113.446C174.845 112.136 175.893 111.088 177.204 111.088H193.456C194.767 111.088 195.816 112.136 195.816 113.446V129.69C195.816 131 194.767 132.048 193.456 132.048H177.204ZM178.34 127.332H192.32L187.951 121.481L184.456 126.109L181.835 122.616L178.34 127.332ZM177.204 113.359V129.69V113.359Z" /> + + + + + + + + + + android:pathData="M107.126 114.669H109.66V112.136H107.126V114.669ZM117.087 114.669H119.621V112.136H117.087V114.669ZM107.126 109.691H109.66V104.713H107.126V109.691ZM112.107 114.669H114.641V109.691H112.107V114.669ZM112.107 107.158H114.641V104.626H112.107V107.158ZM117.087 109.691H119.621V104.713H117.087V109.691ZM105.903 118.424C105.204 118.424 104.592 118.162 104.155 117.726C103.718 117.289 103.456 116.678 103.456 115.979V101.045L110.971 93.5342H120.932C121.631 93.5342 122.243 93.7962 122.68 94.2328C123.204 94.7568 123.379 95.2808 123.379 95.9795V115.892C123.379 116.59 123.116 117.202 122.68 117.638C122.155 118.162 121.631 118.337 120.932 118.337L105.903 118.424ZM105.903 115.892H120.845V95.9795H111.932L105.903 102.006V115.892ZM105.903 115.892V102.006L111.932 95.9795H120.845V115.892H105.903Z" /> + android:pathData="M96.7281 150.388L101.447 145.672L98.8252 143.052L89.7379 152.222L98.8252 161.305L101.447 158.772L96.7281 154.056H137.01V150.388H96.7281Z" /> - + android:fillColor="?android:attr/colorAccent" + android:pathData="M130.019 137.026L125.301 141.742L127.922 144.362L137.01 135.192L127.922 126.109L125.301 128.642L130.019 133.358H89.7379V137.026H130.019Z" /> + + \ No newline at end of file diff --git a/res/drawable/ic_storage_wizard_internal.xml b/res/drawable/ic_storage_wizard_internal.xml index 41768f7727d..70bafa944ce 100644 --- a/res/drawable/ic_storage_wizard_internal.xml +++ b/res/drawable/ic_storage_wizard_internal.xml @@ -1,3 +1,4 @@ + + android:width="360dp" + android:height="262dp" + android:viewportWidth="360" + android:viewportHeight="262"> + + android:fillColor="@android:color/transparent" + android:pathData="M335.691 262H24.3087C10.9485 262 0 250.795 0 237.127V24.9075C0 11.2049 10.9485 0 24.3087 0H335.787C349.051 0 360 11.2049 360 24.8725V237.224C360 250.795 349.051 262 335.691 262Z" /> + + + + + + + + + + + - - - - - - - - + android:pathData="M164.604 152.545H170.764V146.432H164.604V152.545ZM189.236 152.545H195.396V146.432H189.236V152.545ZM164.604 140.231H170.764V127.926H164.604V140.231ZM176.924 152.545H183.041V140.231H176.924V152.545ZM176.924 134.074H183.041V127.961H176.924V134.074ZM189.236 140.187H195.396V127.926H189.236V140.187ZM161.528 161.733C159.896 161.728 158.332 161.078 157.177 159.924C156.023 158.77 155.373 157.207 155.368 155.576V118.695L173.883 100.224H198.516C200.14 100.228 201.698 100.872 202.851 102.017C204.004 103.161 204.66 104.713 204.676 106.337V155.576C204.671 157.207 204.021 158.77 202.866 159.924C201.712 161.078 200.148 161.728 198.516 161.733H161.528ZM161.528 155.576H198.472V106.381H176.505L161.528 121.306V155.619V155.576ZM161.528 155.576V121.306L176.505 106.381H198.516V155.619H161.528V155.576Z" /> + \ No newline at end of file diff --git a/res/drawable/ic_storage_wizard_ready.xml b/res/drawable/ic_storage_wizard_ready.xml new file mode 100644 index 00000000000..c09c9ec5310 --- /dev/null +++ b/res/drawable/ic_storage_wizard_ready.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/res/drawable/ic_swap_horiz.xml b/res/drawable/ic_swap_horiz.xml index a38833becab..c41c9a34381 100644 --- a/res/drawable/ic_swap_horiz.xml +++ b/res/drawable/ic_swap_horiz.xml @@ -20,5 +20,5 @@ android:viewportHeight="24.0"> + android:fillColor="?android:attr/textColorPrimary"/> diff --git a/res/drawable/ic_test_tick.xml b/res/drawable/ic_test_tick.xml new file mode 100644 index 00000000000..9585806e985 --- /dev/null +++ b/res/drawable/ic_test_tick.xml @@ -0,0 +1,26 @@ + + + + + + \ No newline at end of file diff --git a/res/layout/storage_internal_format.xml b/res/layout/storage_internal_format.xml index 0b49d7e1660..f8224c4b6a4 100644 --- a/res/layout/storage_internal_format.xml +++ b/res/layout/storage_internal_format.xml @@ -14,16 +14,16 @@ limitations under the License. --> - + android:layout_height="wrap_content" + android:fillViewport="true"> - + android:layout_height="wrap_content" + android:orientation="vertical"> - - -