From c67a0d853bcac574b721f9ddd7dddf78907b3d00 Mon Sep 17 00:00:00 2001 From: Malcolm Chen Date: Tue, 14 Apr 2020 11:26:23 -0700 Subject: [PATCH 1/7] Add check of canConnectTo5GInDsds to show NrDisabledInDsdsFooter Bug: 152786064 Test: build and manual Change-Id: I6194592d9a7bf4d4b7993fc344d7392bf5c296aa --- .../NrDisabledInDsdsFooterPreferenceController.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/network/telephony/NrDisabledInDsdsFooterPreferenceController.java b/src/com/android/settings/network/telephony/NrDisabledInDsdsFooterPreferenceController.java index e0247885908..ca944daff46 100644 --- a/src/com/android/settings/network/telephony/NrDisabledInDsdsFooterPreferenceController.java +++ b/src/com/android/settings/network/telephony/NrDisabledInDsdsFooterPreferenceController.java @@ -52,13 +52,18 @@ public class NrDisabledInDsdsFooterPreferenceController extends BasePreferenceCo final TelephonyManager teleManager = ((TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE)) .createForSubscriptionId(mSubId); + final SubscriptionManager subManager = ((SubscriptionManager) + mContext.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE)); + final int[] activeSubIdList = subManager.getActiveSubscriptionIdList(); + final int activeSubCount = activeSubIdList == null ? 0 : activeSubIdList.length; // Show the footer only when DSDS is enabled, and mobile data is enabled on this SIM, and // 5G is supported on this device. - if (!teleManager.isDataEnabled() || teleManager.getActiveModemCount() < 2 - || !is5GSupportedByRadio(teleManager)) { + if (teleManager.isDataEnabled() && activeSubCount >= 2 && is5GSupportedByRadio(teleManager) + && !teleManager.canConnectTo5GInDsdsMode()) { + return AVAILABLE; + } else { return CONDITIONALLY_UNAVAILABLE; } - return AVAILABLE; } private boolean is5GSupportedByRadio(TelephonyManager tm) { From 6436895d0be0de94461d527f3082dd98cda5cb63 Mon Sep 17 00:00:00 2001 From: Edgar Wang Date: Mon, 13 Apr 2020 20:14:59 +0800 Subject: [PATCH 2/7] Make ActionDisabledByAdminDialog can adopt selected font Bug: 148071683 Test: Robotest & manual Change-Id: I1123308a5e157a6df84ca277ef9bb720670f1803 --- res/layout/admin_support_details_dialog.xml | 4 ++-- res/values/styles.xml | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/res/layout/admin_support_details_dialog.xml b/res/layout/admin_support_details_dialog.xml index 66eaf0de62b..2e126cc9d33 100644 --- a/res/layout/admin_support_details_dialog.xml +++ b/res/layout/admin_support_details_dialog.xml @@ -34,7 +34,7 @@ android:layout_height="wrap_content" android:paddingStart="@dimen/admin_details_dialog_padding" android:text="@string/disabled_by_policy_title" - android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Title" /> + android:textAppearance="@style/TextAppearance.HeadLineFontFamily"/> sans-serif start + + + + From cecc69512d42ace84ea2de802e7c394c01beb24f Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Fri, 17 Apr 2020 16:08:26 -0400 Subject: [PATCH 3/7] Update conversation bubble settings Test: atest Fixes: 153471239 Change-Id: If53571b17236e5f49a1750acc9816287f5de2b1a --- res/values/strings.xml | 6 +- .../conversation_notification_settings.xml | 24 +++++-- .../BubbleCategoryPreferenceController.java | 68 +++++++++++++++++++ .../app/BubbleLinkPreferenceController.java | 68 +++++++++++++++++++ .../app/ConversationNotificationSettings.java | 2 + 5 files changed, 160 insertions(+), 8 deletions(-) create mode 100644 src/com/android/settings/notification/app/BubbleCategoryPreferenceController.java create mode 100644 src/com/android/settings/notification/app/BubbleLinkPreferenceController.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 341ac9075bc..e7bc9c4deef 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -8137,8 +8137,12 @@ Some notifications and other content can appear as bubbles on the screen. To open a bubble, tap it. To dismiss it, drag it down the screen. Bubbles + + All Bubble settings + + Bubble this conversation - New messages will appear on screen + Show floating icon on top of apps Allow %1$s to show some notifications as bubbles diff --git a/res/xml/conversation_notification_settings.xml b/res/xml/conversation_notification_settings.xml index be1c980a05c..c034eb5d6d8 100644 --- a/res/xml/conversation_notification_settings.xml +++ b/res/xml/conversation_notification_settings.xml @@ -32,13 +32,23 @@ settings:allowDividerAbove="true" settings:allowDividerBelow="true"/> - - + + + + + + + (mControllers); } } From a66cf69f1f0e722384dd79e049a6653e9168c434 Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Thu, 26 Sep 2019 16:50:43 +0800 Subject: [PATCH 4/7] [DataUsage] UX enhancement Some of the field didn't take eu languages into consideration. Enhance it through changing the: 1. Format of display 2. Parser after user input 3. IME support for comma in eu language Bug: 141536928 Test: Manual input and check for results Test: make RunSettingsRoboTests -j ROBOTEST_FILTER=BillingCycleSettingsTest Change-Id: Ia7afc88c9043e924f205f966c4091248261b0aee --- .../datausage/BillingCycleSettings.java | 60 ++++++++++++------- 1 file changed, 38 insertions(+), 22 deletions(-) diff --git a/src/com/android/settings/datausage/BillingCycleSettings.java b/src/com/android/settings/datausage/BillingCycleSettings.java index 5efd175207b..8c433a061a6 100644 --- a/src/com/android/settings/datausage/BillingCycleSettings.java +++ b/src/com/android/settings/datausage/BillingCycleSettings.java @@ -25,9 +25,11 @@ import android.content.res.Resources; import android.net.NetworkPolicy; import android.net.NetworkTemplate; import android.os.Bundle; +import android.text.method.NumberKeyListener; import android.util.Log; import android.view.LayoutInflater; import android.view.View; +import android.view.inputmethod.EditorInfo; import android.widget.EditText; import android.widget.NumberPicker; import android.widget.Spinner; @@ -45,6 +47,8 @@ import com.android.settingslib.NetworkPolicyEditor; import com.android.settingslib.net.DataUsageController; import com.android.settingslib.search.SearchIndexable; +import java.text.NumberFormat; +import java.text.ParseException; import java.util.TimeZone; @SearchIndexable @@ -279,30 +283,35 @@ public class BillingCycleSettings extends DataUsageBaseFragment implements final DataUsageEditController target = (DataUsageEditController) getTargetFragment(); final NetworkPolicyEditor editor = target.getNetworkPolicyEditor(); + bytesPicker.setKeyListener(new NumberKeyListener() { + protected char[] getAcceptedChars() { + return new char [] {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + ',', '.'}; + } + public int getInputType() { + return EditorInfo.TYPE_CLASS_NUMBER | EditorInfo.TYPE_NUMBER_FLAG_DECIMAL; + } + }); + final NetworkTemplate template = getArguments().getParcelable(EXTRA_TEMPLATE); final boolean isLimit = getArguments().getBoolean(EXTRA_LIMIT); final long bytes = isLimit ? editor.getPolicyLimitBytes(template) : editor.getPolicyWarningBytes(template); final long limitDisabled = isLimit ? LIMIT_DISABLED : WARNING_DISABLED; - if (bytes > 1.5f * GIB_IN_BYTES) { - final String bytesText = formatText(bytes / (float) GIB_IN_BYTES); - bytesPicker.setText(bytesText); - bytesPicker.setSelection(0, bytesText.length()); + final boolean unitInGigaBytes = (bytes > 1.5f * GIB_IN_BYTES); + final String bytesText = formatText(bytes, + unitInGigaBytes ? GIB_IN_BYTES : MIB_IN_BYTES); + bytesPicker.setText(bytesText); + bytesPicker.setSelection(0, bytesText.length()); - type.setSelection(1); - } else { - final String bytesText = formatText(bytes / (float) MIB_IN_BYTES); - bytesPicker.setText(bytesText); - bytesPicker.setSelection(0, bytesText.length()); - - type.setSelection(0); - } + type.setSelection(unitInGigaBytes ? 1 : 0); } - private String formatText(float v) { - v = Math.round(v * 100) / 100f; - return String.valueOf(v); + private String formatText(double v, double unitInBytes) { + final NumberFormat formatter = NumberFormat.getNumberInstance(); + formatter.setMaximumFractionDigits(2); + return formatter.format((double) (v / unitInBytes)); } @Override @@ -315,15 +324,22 @@ public class BillingCycleSettings extends DataUsageBaseFragment implements final NetworkTemplate template = getArguments().getParcelable(EXTRA_TEMPLATE); final boolean isLimit = getArguments().getBoolean(EXTRA_LIMIT); - EditText bytesField = (EditText) mView.findViewById(R.id.bytes); - Spinner spinner = (Spinner) mView.findViewById(R.id.size_spinner); + final EditText bytesField = (EditText) mView.findViewById(R.id.bytes); + final Spinner spinner = (Spinner) mView.findViewById(R.id.size_spinner); - String bytesString = bytesField.getText().toString(); - if (bytesString.isEmpty() || bytesString.equals(".")) { - bytesString = "0"; + final String bytesString = bytesField.getText().toString(); + + final NumberFormat formatter = NumberFormat.getNumberInstance(); + Number number = null; + try { + number = formatter.parse(bytesString); + } catch (ParseException ex) { + } + long bytes = 0L; + if (number != null) { + bytes = (long) (number.floatValue() + * (spinner.getSelectedItemPosition() == 0 ? MIB_IN_BYTES : GIB_IN_BYTES)); } - final long bytes = (long) (Float.valueOf(bytesString) - * (spinner.getSelectedItemPosition() == 0 ? MIB_IN_BYTES : GIB_IN_BYTES)); // to fix the overflow problem final long correctedBytes = Math.min(MAX_DATA_LIMIT_BYTES, bytes); From 71dd32ded0fe513a0edb9a8caccdd2041833f698 Mon Sep 17 00:00:00 2001 From: Tim Peng Date: Mon, 20 Apr 2020 14:53:48 +0800 Subject: [PATCH 5/7] Hide volume slider in Output Switcher when volume adjustment is restricted -Check UserManager.DISALLOW_ADJUST_VOLUME -Hide slider when unsupported Bug: 153922342 Test: 1.Open CTS-V app > Device Owner Tests 2.install CtsEmptyDeviceOwner.apk -"adb install -r -t CtsEmptyDeviceOwner.apk" 3.enter the command "adb shell dpm set-device-owner com.android.cts.emptydeviceowner/.EmptyDeviceAdmin" 4.push Check device owner button 5.open Policy transparency test and go to Disallow adjust volume > Enable the switch > Open settings. Change-Id: Iac2793ead6d93d4eaada19c4eec33885d4b97138 --- .../media/MediaDeviceUpdateWorker.java | 14 +++++++++ .../settings/media/MediaOutputGroupSlice.java | 7 +++-- .../settings/media/MediaOutputSlice.java | 29 ++++++++++++++++--- 3 files changed, 44 insertions(+), 6 deletions(-) diff --git a/src/com/android/settings/media/MediaDeviceUpdateWorker.java b/src/com/android/settings/media/MediaDeviceUpdateWorker.java index b800c179859..c7682577063 100644 --- a/src/com/android/settings/media/MediaDeviceUpdateWorker.java +++ b/src/com/android/settings/media/MediaDeviceUpdateWorker.java @@ -26,11 +26,14 @@ import android.content.Intent; import android.content.IntentFilter; import android.media.AudioManager; import android.net.Uri; +import android.os.UserHandle; +import android.os.UserManager; import android.text.TextUtils; import androidx.annotation.VisibleForTesting; import com.android.settings.slices.SliceBackgroundWorker; +import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.Utils; import com.android.settingslib.media.LocalMediaManager; import com.android.settingslib.media.MediaDevice; @@ -214,6 +217,17 @@ public class MediaDeviceUpdateWorker extends SliceBackgroundWorker return mPackageName; } + boolean hasAdjustVolumeUserRestriction() { + if (RestrictedLockUtilsInternal.checkIfRestrictionEnforced( + mContext, UserManager.DISALLOW_ADJUST_VOLUME, UserHandle.myUserId()) != null) { + return true; + } + final UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE); + return um.hasBaseUserRestriction(UserManager.DISALLOW_ADJUST_VOLUME, + UserHandle.of(UserHandle.myUserId())); + + } + private class DevicesChangedBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { diff --git a/src/com/android/settings/media/MediaOutputGroupSlice.java b/src/com/android/settings/media/MediaOutputGroupSlice.java index d60ae225e9e..402eb6bb7cf 100644 --- a/src/com/android/settings/media/MediaOutputGroupSlice.java +++ b/src/com/android/settings/media/MediaOutputGroupSlice.java @@ -95,7 +95,8 @@ public class MediaOutputGroupSlice implements CustomSliceable { GROUP_DEVICES.hashCode() + ACTION_MEDIA_SESSION_OPERATION, ACTION_MEDIA_SESSION_OPERATION), IconCompat.createWithBitmap(emptyBitmap), ListBuilder.ICON_IMAGE, ""); - if (maxVolume > 0) { // Add InputRange row + if (maxVolume > 0 && !getWorker().hasAdjustVolumeUserRestriction()) { + // Add InputRange row listBuilder.addInputRange(new ListBuilder.InputRangeBuilder() .setTitleItem(titleIcon, ListBuilder.ICON_IMAGE) .addEndItem(endItemAction) @@ -119,6 +120,7 @@ public class MediaOutputGroupSlice implements CustomSliceable { } private void addRow(ListBuilder listBuilder, List mediaDevices, boolean selected) { + final boolean adjustVolumeUserRestriction = getWorker().hasAdjustVolumeUserRestriction(); for (MediaDevice device : mediaDevices) { final int maxVolume = device.getMaxVolume(); final IconCompat titleIcon = Utils.createIconWithDrawable(device.getIcon()); @@ -133,7 +135,8 @@ public class MediaOutputGroupSlice implements CustomSliceable { IconCompat.createWithResource(mContext, R.drawable.ic_check_box_anim), "", selected); - if (maxVolume > 0) { // Add InputRange row + if (maxVolume > 0 && !adjustVolumeUserRestriction) { + // Add InputRange row final ListBuilder.InputRangeBuilder builder = new ListBuilder.InputRangeBuilder() .setTitleItem(titleIcon, ListBuilder.ICON_IMAGE) .setTitle(title) diff --git a/src/com/android/settings/media/MediaOutputSlice.java b/src/com/android/settings/media/MediaOutputSlice.java index 27960e123ea..df9538b5773 100644 --- a/src/com/android/settings/media/MediaOutputSlice.java +++ b/src/com/android/settings/media/MediaOutputSlice.java @@ -96,7 +96,11 @@ public class MediaOutputSlice implements CustomSliceable { if (worker.getSelectedMediaDevice().size() > 1) { // Insert group item to the first when it is available - listBuilder.addInputRange(getGroupRow()); + if (worker.getSessionVolumeMax() > 0 && !worker.hasAdjustVolumeUserRestriction()) { + listBuilder.addInputRange(getGroupSliderRow()); + } else { + listBuilder.addRow(getGroupRow()); + } // Add all other devices for (MediaDevice device : devices) { addRow(device, null /* connectedDevice */, listBuilder); @@ -150,7 +154,7 @@ public class MediaOutputSlice implements CustomSliceable { return builder; } - private ListBuilder.InputRangeBuilder getGroupRow() { + private ListBuilder.InputRangeBuilder getGroupSliderRow() { final IconCompat icon = IconCompat.createWithResource(mContext, R.drawable.ic_speaker_group_black_24dp); final CharSequence sessionName = getWorker().getSessionName(); @@ -172,6 +176,24 @@ public class MediaOutputSlice implements CustomSliceable { return builder; } + private ListBuilder.RowBuilder getGroupRow() { + final IconCompat icon = IconCompat.createWithResource(mContext, + R.drawable.ic_speaker_group_black_24dp); + final CharSequence sessionName = getWorker().getSessionName(); + final CharSequence title = TextUtils.isEmpty(sessionName) + ? mContext.getString(R.string.media_output_group) : sessionName; + final PendingIntent broadcastAction = + getBroadcastIntent(mContext, MEDIA_GROUP_DEVICE, MEDIA_GROUP_DEVICE.hashCode()); + final SliceAction primarySliceAction = SliceAction.createDeeplink(broadcastAction, icon, + ListBuilder.ICON_IMAGE, title); + final ListBuilder.RowBuilder builder = new ListBuilder.RowBuilder() + .setTitleItem(icon, ListBuilder.ICON_IMAGE) + .setTitle(title) + .setPrimaryAction(primarySliceAction) + .addEndItem(getEndItemSliceAction()); + return builder; + } + private void addRow(MediaDevice device, MediaDevice connectedDevice, ListBuilder listBuilder) { if (connectedDevice != null && TextUtils.equals(device.getId(), connectedDevice.getId())) { final String title = device.getName(); @@ -182,7 +204,7 @@ public class MediaOutputSlice implements CustomSliceable { final SliceAction primarySliceAction = SliceAction.createDeeplink(broadcastAction, icon, ListBuilder.ICON_IMAGE, title); - if (device.getMaxVolume() > 0) { + if (device.getMaxVolume() > 0 && !getWorker().hasAdjustVolumeUserRestriction()) { final ListBuilder.InputRangeBuilder builder = new ListBuilder.InputRangeBuilder() .setTitleItem(icon, ListBuilder.ICON_IMAGE) .setTitle(title) @@ -368,6 +390,5 @@ public class MediaOutputSlice implements CustomSliceable { return getWorker() != null && !com.android.settingslib.Utils.isAudioModeOngoingCall(mContext) && getWorker().getMediaDevices().size() > 0; - } } From 1be2666d11fe25c21c7429acdb089f1fcd0fea3c Mon Sep 17 00:00:00 2001 From: jasonwshsu Date: Fri, 17 Apr 2020 02:02:05 +0800 Subject: [PATCH 6/7] Remove unused attribute 'EXTRA_SUMMARY_RES' * Magnification already use EXTRA_HTML_DESCRIPTION to replace it. Bug: 154092127 Test: manual test Change-Id: I5385907eb0911894159a80444493bf233bb43e1a --- .../settings/accessibility/AccessibilitySettings.java | 1 - .../accessibility/ToggleFeaturePreferenceFragment.java | 5 +---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java index 3b3c2c544c4..17750df75e6 100644 --- a/src/com/android/settings/accessibility/AccessibilitySettings.java +++ b/src/com/android/settings/accessibility/AccessibilitySettings.java @@ -105,7 +105,6 @@ public class AccessibilitySettings extends DashboardFragment { static final String EXTRA_TITLE_RES = "title_res"; static final String EXTRA_RESOLVE_INFO = "resolve_info"; static final String EXTRA_SUMMARY = "summary"; - static final String EXTRA_SUMMARY_RES = "summary_res"; static final String EXTRA_SETTINGS_TITLE = "settings_title"; static final String EXTRA_COMPONENT_NAME = "component_name"; static final String EXTRA_SETTINGS_COMPONENT_NAME = "settings_component_name"; diff --git a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java index 0c83ef3de4f..20ef7bc0e0f 100644 --- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java @@ -363,10 +363,7 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference } // Summary. - if (arguments.containsKey(AccessibilitySettings.EXTRA_SUMMARY_RES)) { - final int summary = arguments.getInt(AccessibilitySettings.EXTRA_SUMMARY_RES); - createFooterPreference(getText(summary)); - } else if (arguments.containsKey(AccessibilitySettings.EXTRA_SUMMARY)) { + if (arguments.containsKey(AccessibilitySettings.EXTRA_SUMMARY)) { final CharSequence summary = arguments.getCharSequence( AccessibilitySettings.EXTRA_SUMMARY); createFooterPreference(summary); From 6c8451a89fe8aea5d6cec27926cef63d74159b68 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Mon, 20 Apr 2020 09:33:47 -0400 Subject: [PATCH 7/7] Set explicit back target for history Test: manual Fixes: 153554906 Change-Id: Ic3198afae878e3cfbfbfa7e72b1c71a6f4e74a2e --- AndroidManifest.xml | 4 +++- .../history/NotificationHistoryActivity.java | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index d31fb3070d9..212290d81a6 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1200,7 +1200,8 @@ + android:label="@string/notification_history_title" + android:taskAffinity="com.android.settings.notification"> @@ -2530,6 +2531,7 @@ diff --git a/src/com/android/settings/notification/history/NotificationHistoryActivity.java b/src/com/android/settings/notification/history/NotificationHistoryActivity.java index 144d102e651..a5993e4a773 100644 --- a/src/com/android/settings/notification/history/NotificationHistoryActivity.java +++ b/src/com/android/settings/notification/history/NotificationHistoryActivity.java @@ -23,6 +23,7 @@ import android.app.ActivityManager; import android.app.INotificationManager; import android.content.ComponentName; import android.content.Context; +import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; import android.os.RemoteException; @@ -191,6 +192,20 @@ public class NotificationHistoryActivity extends Activity { super.onDestroy(); } + @Override + public void onBackPressed() { + handleBackPressed(); + } + + private void handleBackPressed() { + if (getFragmentManager().getBackStackEntryCount() > 1) { + super.onBackPressed(); + } else { + startActivity(new Intent(Settings.ACTION_NOTIFICATION_SETTINGS)); + finish(); + } + } + private void bindSwitch() { if (mSwitchBar != null) { mSwitchBar.setSwitchBarText(R.string.notification_history_toggle,