Merge "Change volume ringer icon based on device config" into tm-qpr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
296c636fce
26
packages/SystemUI/res/drawable/ic_ring_volume.xml
Normal file
26
packages/SystemUI/res/drawable/ic_ring_volume.xml
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<!--
|
||||||
|
Copyright (C) 2022 The Android Open Source Project
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
-->
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24"
|
||||||
|
android:tint="?android:attr/colorControlNormal">
|
||||||
|
<path
|
||||||
|
android:pathData="M11,7V2H13V7ZM17.6,9.85 L16.2,8.4 19.75,4.85 21.15,6.3ZM6.4,9.85 L2.85,6.3 4.25,4.85 7.8,8.4ZM12,12Q14.95,12 17.812,13.188Q20.675,14.375 22.9,16.75Q23.2,17.05 23.2,17.45Q23.2,17.85 22.9,18.15L20.6,20.4Q20.325,20.675 19.963,20.7Q19.6,20.725 19.3,20.5L16.4,18.3Q16.2,18.15 16.1,17.95Q16,17.75 16,17.5V14.65Q15.05,14.35 14.05,14.175Q13.05,14 12,14Q10.95,14 9.95,14.175Q8.95,14.35 8,14.65V17.5Q8,17.75 7.9,17.95Q7.8,18.15 7.6,18.3L4.7,20.5Q4.4,20.725 4.038,20.7Q3.675,20.675 3.4,20.4L1.1,18.15Q0.8,17.85 0.8,17.45Q0.8,17.05 1.1,16.75Q3.3,14.375 6.175,13.188Q9.05,12 12,12ZM6,15.35Q5.275,15.725 4.6,16.212Q3.925,16.7 3.2,17.3L4.2,18.3L6,16.9ZM18,15.4V16.9L19.8,18.3L20.8,17.35Q20.075,16.7 19.4,16.225Q18.725,15.75 18,15.4ZM6,15.35Q6,15.35 6,15.35Q6,15.35 6,15.35ZM18,15.4Q18,15.4 18,15.4Q18,15.4 18,15.4Z"
|
||||||
|
android:fillColor="?android:attr/colorPrimary"/>
|
||||||
|
|
||||||
|
</vector>
|
||||||
34
packages/SystemUI/res/drawable/ic_ring_volume_off.xml
Normal file
34
packages/SystemUI/res/drawable/ic_ring_volume_off.xml
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
<!--
|
||||||
|
Copyright (C) 2022 The Android Open Source Project
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
-->
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24"
|
||||||
|
android:tint="?android:attr/colorControlNormal">
|
||||||
|
<path
|
||||||
|
android:pathData="M0.8,4.2l8.1,8.1c-2.2,0.5 -5.2,1.6 -7.8,4.4c-0.4,0.4 -0.4,1 0,1.4l2.3,2.3c0.3,0.3 0.9,0.4 1.3,0.1l2.9,-2.2C7.8,18.1 8,17.8 8,17.5v-2.9c0.9,-0.3 1.7,-0.5 2.7,-0.6l8.5,8.5l1.4,-1.4L2.2,2.8L0.8,4.2z"
|
||||||
|
android:fillColor="?android:attr/colorPrimary"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M11,2h2v5h-2z"
|
||||||
|
android:fillColor="?android:attr/colorPrimary"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M21.2,6.3l-1.4,-1.4l-3.6,3.6l1.4,1.4C17.6,9.8 21,6.3 21.2,6.3z"
|
||||||
|
android:fillColor="?android:attr/colorPrimary"/>
|
||||||
|
<path
|
||||||
|
android:pathData="M22.9,16.7c-2.8,-3 -6.2,-4.1 -8.4,-4.5l7.2,7.2l1.3,-1.3C23.3,17.7 23.3,17.1 22.9,16.7z"
|
||||||
|
android:fillColor="?android:attr/colorPrimary"/>
|
||||||
|
</vector>
|
||||||
25
packages/SystemUI/res/drawable/ic_speaker_mute.xml
Normal file
25
packages/SystemUI/res/drawable/ic_speaker_mute.xml
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<!--
|
||||||
|
~ Copyright (C) 2022 The Android Open Source Project
|
||||||
|
~
|
||||||
|
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
~ you may not use this file except in compliance with the License.
|
||||||
|
~ You may obtain a copy of the License at
|
||||||
|
~
|
||||||
|
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
~
|
||||||
|
~ Unless required by applicable law or agreed to in writing, software
|
||||||
|
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
~ See the License for the specific language governing permissions and
|
||||||
|
~ limitations under the License.
|
||||||
|
-->
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24"
|
||||||
|
android:tint="?android:attr/textColorPrimary"
|
||||||
|
android:autoMirrored="true">
|
||||||
|
<path android:fillColor="#FFFFFFFF"
|
||||||
|
android:pathData="M19.8,22.6 L16.775,19.575Q16.15,19.975 15.45,20.263Q14.75,20.55 14,20.725V18.675Q14.35,18.55 14.688,18.425Q15.025,18.3 15.325,18.125L12,14.8V20L7,15H3V9H6.2L1.4,4.2L2.8,2.8L21.2,21.2ZM19.6,16.8 L18.15,15.35Q18.575,14.575 18.788,13.725Q19,12.875 19,11.975Q19,9.625 17.625,7.775Q16.25,5.925 14,5.275V3.225Q17.1,3.925 19.05,6.362Q21,8.8 21,11.975Q21,13.3 20.638,14.525Q20.275,15.75 19.6,16.8ZM16.25,13.45 L14,11.2V7.95Q15.175,8.5 15.838,9.6Q16.5,10.7 16.5,12Q16.5,12.375 16.438,12.738Q16.375,13.1 16.25,13.45ZM12,9.2 L9.4,6.6 12,4ZM10,15.15V12.8L8.2,11H5V13H7.85ZM9.1,11.9Z"/>
|
||||||
|
</vector>
|
||||||
25
packages/SystemUI/res/drawable/ic_speaker_on.xml
Normal file
25
packages/SystemUI/res/drawable/ic_speaker_on.xml
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<!--
|
||||||
|
~ Copyright (C) 2022 The Android Open Source Project
|
||||||
|
~
|
||||||
|
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
~ you may not use this file except in compliance with the License.
|
||||||
|
~ You may obtain a copy of the License at
|
||||||
|
~
|
||||||
|
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
~
|
||||||
|
~ Unless required by applicable law or agreed to in writing, software
|
||||||
|
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
~ See the License for the specific language governing permissions and
|
||||||
|
~ limitations under the License.
|
||||||
|
-->
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24"
|
||||||
|
android:tint="?android:attr/textColorPrimary"
|
||||||
|
android:autoMirrored="true">
|
||||||
|
<path android:fillColor="#FFFFFFFF"
|
||||||
|
android:pathData="M14,20.725V18.675Q16.25,18.025 17.625,16.175Q19,14.325 19,11.975Q19,9.625 17.625,7.775Q16.25,5.925 14,5.275V3.225Q17.1,3.925 19.05,6.362Q21,8.8 21,11.975Q21,15.15 19.05,17.587Q17.1,20.025 14,20.725ZM3,15V9H7L12,4V20L7,15ZM14,16V7.95Q15.175,8.5 15.838,9.6Q16.5,10.7 16.5,12Q16.5,13.275 15.838,14.362Q15.175,15.45 14,16ZM10,8.85 L7.85,11H5V13H7.85L10,15.15ZM7.5,12Z"/>
|
||||||
|
</vector>
|
||||||
@@ -72,6 +72,7 @@ import android.os.Message;
|
|||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.os.Trace;
|
import android.os.Trace;
|
||||||
import android.os.VibrationEffect;
|
import android.os.VibrationEffect;
|
||||||
|
import android.provider.DeviceConfig;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.provider.Settings.Global;
|
import android.provider.Settings.Global;
|
||||||
import android.text.InputFilter;
|
import android.text.InputFilter;
|
||||||
@@ -108,6 +109,8 @@ import android.widget.Toast;
|
|||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
|
import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
|
||||||
import com.android.internal.graphics.drawable.BackgroundBlurDrawable;
|
import com.android.internal.graphics.drawable.BackgroundBlurDrawable;
|
||||||
import com.android.internal.jank.InteractionJankMonitor;
|
import com.android.internal.jank.InteractionJankMonitor;
|
||||||
import com.android.internal.view.RotationPolicy;
|
import com.android.internal.view.RotationPolicy;
|
||||||
@@ -125,11 +128,15 @@ import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
|
|||||||
import com.android.systemui.statusbar.policy.ConfigurationController;
|
import com.android.systemui.statusbar.policy.ConfigurationController;
|
||||||
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
|
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
|
||||||
import com.android.systemui.util.AlphaTintDrawableWrapper;
|
import com.android.systemui.util.AlphaTintDrawableWrapper;
|
||||||
|
import com.android.systemui.util.DeviceConfigProxy;
|
||||||
import com.android.systemui.util.RoundedCornerProgressDrawable;
|
import com.android.systemui.util.RoundedCornerProgressDrawable;
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.Executor;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -186,6 +193,9 @@ public class VolumeDialogImpl implements VolumeDialog,
|
|||||||
private ViewGroup mDialogRowsView;
|
private ViewGroup mDialogRowsView;
|
||||||
private ViewGroup mRinger;
|
private ViewGroup mRinger;
|
||||||
|
|
||||||
|
private DeviceConfigProxy mDeviceConfigProxy;
|
||||||
|
private Executor mExecutor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Container for the top part of the dialog, which contains the ringer, the ringer drawer, the
|
* Container for the top part of the dialog, which contains the ringer, the ringer drawer, the
|
||||||
* volume rows, and the ellipsis button. This does not include the live caption button.
|
* volume rows, and the ellipsis button. This does not include the live caption button.
|
||||||
@@ -274,6 +284,13 @@ public class VolumeDialogImpl implements VolumeDialog,
|
|||||||
private BackgroundBlurDrawable mDialogRowsViewBackground;
|
private BackgroundBlurDrawable mDialogRowsViewBackground;
|
||||||
private final InteractionJankMonitor mInteractionJankMonitor;
|
private final InteractionJankMonitor mInteractionJankMonitor;
|
||||||
|
|
||||||
|
private boolean mSeparateNotification;
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
int mVolumeRingerIconDrawableId;
|
||||||
|
@VisibleForTesting
|
||||||
|
int mVolumeRingerMuteIconDrawableId;
|
||||||
|
|
||||||
public VolumeDialogImpl(
|
public VolumeDialogImpl(
|
||||||
Context context,
|
Context context,
|
||||||
VolumeDialogController volumeDialogController,
|
VolumeDialogController volumeDialogController,
|
||||||
@@ -283,7 +300,9 @@ public class VolumeDialogImpl implements VolumeDialog,
|
|||||||
MediaOutputDialogFactory mediaOutputDialogFactory,
|
MediaOutputDialogFactory mediaOutputDialogFactory,
|
||||||
VolumePanelFactory volumePanelFactory,
|
VolumePanelFactory volumePanelFactory,
|
||||||
ActivityStarter activityStarter,
|
ActivityStarter activityStarter,
|
||||||
InteractionJankMonitor interactionJankMonitor) {
|
InteractionJankMonitor interactionJankMonitor,
|
||||||
|
DeviceConfigProxy deviceConfigProxy,
|
||||||
|
Executor executor) {
|
||||||
mContext =
|
mContext =
|
||||||
new ContextThemeWrapper(context, R.style.volume_dialog_theme);
|
new ContextThemeWrapper(context, R.style.volume_dialog_theme);
|
||||||
mController = volumeDialogController;
|
mController = volumeDialogController;
|
||||||
@@ -323,6 +342,50 @@ public class VolumeDialogImpl implements VolumeDialog,
|
|||||||
}
|
}
|
||||||
|
|
||||||
initDimens();
|
initDimens();
|
||||||
|
|
||||||
|
mDeviceConfigProxy = deviceConfigProxy;
|
||||||
|
mExecutor = executor;
|
||||||
|
mSeparateNotification = mDeviceConfigProxy.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI,
|
||||||
|
SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, false);
|
||||||
|
updateRingerModeIconSet();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If ringer and notification are the same stream (T and earlier), use notification-like bell
|
||||||
|
* icon set.
|
||||||
|
* If ringer and notification are separated, then use generic speaker icons.
|
||||||
|
*/
|
||||||
|
private void updateRingerModeIconSet() {
|
||||||
|
if (mSeparateNotification) {
|
||||||
|
mVolumeRingerIconDrawableId = R.drawable.ic_speaker_on;
|
||||||
|
mVolumeRingerMuteIconDrawableId = R.drawable.ic_speaker_mute;
|
||||||
|
} else {
|
||||||
|
mVolumeRingerIconDrawableId = R.drawable.ic_volume_ringer;
|
||||||
|
mVolumeRingerMuteIconDrawableId = R.drawable.ic_volume_ringer_mute;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mRingerDrawerMuteIcon != null) {
|
||||||
|
mRingerDrawerMuteIcon.setImageResource(mVolumeRingerMuteIconDrawableId);
|
||||||
|
}
|
||||||
|
if (mRingerDrawerNormalIcon != null) {
|
||||||
|
mRingerDrawerNormalIcon.setImageResource(mVolumeRingerIconDrawableId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Change icon for ring stream (not ringer mode icon)
|
||||||
|
*/
|
||||||
|
private void updateRingRowIcon() {
|
||||||
|
Optional<VolumeRow> volumeRow = mRows.stream().filter(row -> row.stream == STREAM_RING)
|
||||||
|
.findFirst();
|
||||||
|
if (volumeRow.isPresent()) {
|
||||||
|
VolumeRow volRow = volumeRow.get();
|
||||||
|
volRow.iconRes = mSeparateNotification ? R.drawable.ic_ring_volume
|
||||||
|
: R.drawable.ic_volume_ringer;
|
||||||
|
volRow.iconMuteRes = mSeparateNotification ? R.drawable.ic_ring_volume_off
|
||||||
|
: R.drawable.ic_volume_ringer_mute;
|
||||||
|
volRow.setIcon(volRow.iconRes, mContext.getTheme());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -339,6 +402,9 @@ public class VolumeDialogImpl implements VolumeDialog,
|
|||||||
mController.getState();
|
mController.getState();
|
||||||
|
|
||||||
mConfigurationController.addCallback(this);
|
mConfigurationController.addCallback(this);
|
||||||
|
|
||||||
|
mDeviceConfigProxy.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_SYSTEMUI,
|
||||||
|
mExecutor, this::onDeviceConfigChange);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -346,6 +412,24 @@ public class VolumeDialogImpl implements VolumeDialog,
|
|||||||
mController.removeCallback(mControllerCallbackH);
|
mController.removeCallback(mControllerCallbackH);
|
||||||
mHandler.removeCallbacksAndMessages(null);
|
mHandler.removeCallbacksAndMessages(null);
|
||||||
mConfigurationController.removeCallback(this);
|
mConfigurationController.removeCallback(this);
|
||||||
|
mDeviceConfigProxy.removeOnPropertiesChangedListener(this::onDeviceConfigChange);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update ringer mode icon based on the config
|
||||||
|
*/
|
||||||
|
private void onDeviceConfigChange(DeviceConfig.Properties properties) {
|
||||||
|
Set<String> changeSet = properties.getKeyset();
|
||||||
|
if (changeSet.contains(SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION)) {
|
||||||
|
boolean newVal = properties.getBoolean(
|
||||||
|
SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, false);
|
||||||
|
if (newVal != mSeparateNotification) {
|
||||||
|
mSeparateNotification = newVal;
|
||||||
|
updateRingerModeIconSet();
|
||||||
|
updateRingRowIcon();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -552,6 +636,9 @@ public class VolumeDialogImpl implements VolumeDialog,
|
|||||||
mRingerDrawerNormalIcon = mDialog.findViewById(R.id.volume_drawer_normal_icon);
|
mRingerDrawerNormalIcon = mDialog.findViewById(R.id.volume_drawer_normal_icon);
|
||||||
mRingerDrawerNewSelectionBg = mDialog.findViewById(R.id.volume_drawer_selection_background);
|
mRingerDrawerNewSelectionBg = mDialog.findViewById(R.id.volume_drawer_selection_background);
|
||||||
|
|
||||||
|
mRingerDrawerMuteIcon.setImageResource(mVolumeRingerMuteIconDrawableId);
|
||||||
|
mRingerDrawerNormalIcon.setImageResource(mVolumeRingerIconDrawableId);
|
||||||
|
|
||||||
setupRingerDrawer();
|
setupRingerDrawer();
|
||||||
|
|
||||||
mODICaptionsView = mDialog.findViewById(R.id.odi_captions);
|
mODICaptionsView = mDialog.findViewById(R.id.odi_captions);
|
||||||
@@ -575,8 +662,14 @@ public class VolumeDialogImpl implements VolumeDialog,
|
|||||||
addRow(AudioManager.STREAM_MUSIC,
|
addRow(AudioManager.STREAM_MUSIC,
|
||||||
R.drawable.ic_volume_media, R.drawable.ic_volume_media_mute, true, true);
|
R.drawable.ic_volume_media, R.drawable.ic_volume_media_mute, true, true);
|
||||||
if (!AudioSystem.isSingleVolume(mContext)) {
|
if (!AudioSystem.isSingleVolume(mContext)) {
|
||||||
addRow(AudioManager.STREAM_RING,
|
if (mSeparateNotification) {
|
||||||
R.drawable.ic_volume_ringer, R.drawable.ic_volume_ringer_mute, true, false);
|
addRow(AudioManager.STREAM_RING, R.drawable.ic_ring_volume,
|
||||||
|
R.drawable.ic_ring_volume_off, true, false);
|
||||||
|
} else {
|
||||||
|
addRow(AudioManager.STREAM_RING, R.drawable.ic_volume_ringer,
|
||||||
|
R.drawable.ic_volume_ringer, true, false);
|
||||||
|
}
|
||||||
|
|
||||||
addRow(STREAM_ALARM,
|
addRow(STREAM_ALARM,
|
||||||
R.drawable.ic_alarm, R.drawable.ic_volume_alarm_mute, true, false);
|
R.drawable.ic_alarm, R.drawable.ic_volume_alarm_mute, true, false);
|
||||||
addRow(AudioManager.STREAM_VOICE_CALL,
|
addRow(AudioManager.STREAM_VOICE_CALL,
|
||||||
@@ -1532,8 +1625,8 @@ public class VolumeDialogImpl implements VolumeDialog,
|
|||||||
mRingerIcon.setTag(Events.ICON_STATE_VIBRATE);
|
mRingerIcon.setTag(Events.ICON_STATE_VIBRATE);
|
||||||
break;
|
break;
|
||||||
case AudioManager.RINGER_MODE_SILENT:
|
case AudioManager.RINGER_MODE_SILENT:
|
||||||
mRingerIcon.setImageResource(R.drawable.ic_volume_ringer_mute);
|
mRingerIcon.setImageResource(mVolumeRingerMuteIconDrawableId);
|
||||||
mSelectedRingerIcon.setImageResource(R.drawable.ic_volume_ringer_mute);
|
mSelectedRingerIcon.setImageResource(mVolumeRingerMuteIconDrawableId);
|
||||||
mRingerIcon.setTag(Events.ICON_STATE_MUTE);
|
mRingerIcon.setTag(Events.ICON_STATE_MUTE);
|
||||||
addAccessibilityDescription(mRingerIcon, RINGER_MODE_SILENT,
|
addAccessibilityDescription(mRingerIcon, RINGER_MODE_SILENT,
|
||||||
mContext.getString(R.string.volume_ringer_hint_unmute));
|
mContext.getString(R.string.volume_ringer_hint_unmute));
|
||||||
@@ -1542,14 +1635,14 @@ public class VolumeDialogImpl implements VolumeDialog,
|
|||||||
default:
|
default:
|
||||||
boolean muted = (mAutomute && ss.level == 0) || ss.muted;
|
boolean muted = (mAutomute && ss.level == 0) || ss.muted;
|
||||||
if (!isZenMuted && muted) {
|
if (!isZenMuted && muted) {
|
||||||
mRingerIcon.setImageResource(R.drawable.ic_volume_ringer_mute);
|
mRingerIcon.setImageResource(mVolumeRingerMuteIconDrawableId);
|
||||||
mSelectedRingerIcon.setImageResource(R.drawable.ic_volume_ringer_mute);
|
mSelectedRingerIcon.setImageResource(mVolumeRingerMuteIconDrawableId);
|
||||||
addAccessibilityDescription(mRingerIcon, RINGER_MODE_NORMAL,
|
addAccessibilityDescription(mRingerIcon, RINGER_MODE_NORMAL,
|
||||||
mContext.getString(R.string.volume_ringer_hint_unmute));
|
mContext.getString(R.string.volume_ringer_hint_unmute));
|
||||||
mRingerIcon.setTag(Events.ICON_STATE_MUTE);
|
mRingerIcon.setTag(Events.ICON_STATE_MUTE);
|
||||||
} else {
|
} else {
|
||||||
mRingerIcon.setImageResource(R.drawable.ic_volume_ringer);
|
mRingerIcon.setImageResource(mVolumeRingerIconDrawableId);
|
||||||
mSelectedRingerIcon.setImageResource(R.drawable.ic_volume_ringer);
|
mSelectedRingerIcon.setImageResource(mVolumeRingerIconDrawableId);
|
||||||
if (mController.hasVibrator()) {
|
if (mController.hasVibrator()) {
|
||||||
addAccessibilityDescription(mRingerIcon, RINGER_MODE_NORMAL,
|
addAccessibilityDescription(mRingerIcon, RINGER_MODE_NORMAL,
|
||||||
mContext.getString(R.string.volume_ringer_hint_vibrate));
|
mContext.getString(R.string.volume_ringer_hint_vibrate));
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import android.content.Context;
|
|||||||
import android.media.AudioManager;
|
import android.media.AudioManager;
|
||||||
|
|
||||||
import com.android.internal.jank.InteractionJankMonitor;
|
import com.android.internal.jank.InteractionJankMonitor;
|
||||||
|
import com.android.systemui.dagger.qualifiers.Main;
|
||||||
import com.android.systemui.media.dialog.MediaOutputDialogFactory;
|
import com.android.systemui.media.dialog.MediaOutputDialogFactory;
|
||||||
import com.android.systemui.plugins.ActivityStarter;
|
import com.android.systemui.plugins.ActivityStarter;
|
||||||
import com.android.systemui.plugins.VolumeDialog;
|
import com.android.systemui.plugins.VolumeDialog;
|
||||||
@@ -27,11 +28,14 @@ import com.android.systemui.plugins.VolumeDialogController;
|
|||||||
import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
|
import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
|
||||||
import com.android.systemui.statusbar.policy.ConfigurationController;
|
import com.android.systemui.statusbar.policy.ConfigurationController;
|
||||||
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
|
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
|
||||||
|
import com.android.systemui.util.DeviceConfigProxy;
|
||||||
import com.android.systemui.volume.VolumeComponent;
|
import com.android.systemui.volume.VolumeComponent;
|
||||||
import com.android.systemui.volume.VolumeDialogComponent;
|
import com.android.systemui.volume.VolumeDialogComponent;
|
||||||
import com.android.systemui.volume.VolumeDialogImpl;
|
import com.android.systemui.volume.VolumeDialogImpl;
|
||||||
import com.android.systemui.volume.VolumePanelFactory;
|
import com.android.systemui.volume.VolumePanelFactory;
|
||||||
|
|
||||||
|
import java.util.concurrent.Executor;
|
||||||
|
|
||||||
import dagger.Binds;
|
import dagger.Binds;
|
||||||
import dagger.Module;
|
import dagger.Module;
|
||||||
import dagger.Provides;
|
import dagger.Provides;
|
||||||
@@ -55,7 +59,9 @@ public interface VolumeModule {
|
|||||||
MediaOutputDialogFactory mediaOutputDialogFactory,
|
MediaOutputDialogFactory mediaOutputDialogFactory,
|
||||||
VolumePanelFactory volumePanelFactory,
|
VolumePanelFactory volumePanelFactory,
|
||||||
ActivityStarter activityStarter,
|
ActivityStarter activityStarter,
|
||||||
InteractionJankMonitor interactionJankMonitor) {
|
InteractionJankMonitor interactionJankMonitor,
|
||||||
|
DeviceConfigProxy deviceConfigProxy,
|
||||||
|
@Main Executor executor) {
|
||||||
VolumeDialogImpl impl = new VolumeDialogImpl(
|
VolumeDialogImpl impl = new VolumeDialogImpl(
|
||||||
context,
|
context,
|
||||||
volumeDialogController,
|
volumeDialogController,
|
||||||
@@ -65,7 +71,9 @@ public interface VolumeModule {
|
|||||||
mediaOutputDialogFactory,
|
mediaOutputDialogFactory,
|
||||||
volumePanelFactory,
|
volumePanelFactory,
|
||||||
activityStarter,
|
activityStarter,
|
||||||
interactionJankMonitor);
|
interactionJankMonitor,
|
||||||
|
deviceConfigProxy,
|
||||||
|
executor);
|
||||||
impl.setStreamImportant(AudioManager.STREAM_SYSTEM, false);
|
impl.setStreamImportant(AudioManager.STREAM_SYSTEM, false);
|
||||||
impl.setAutomute(true);
|
impl.setAutomute(true);
|
||||||
impl.setSilentMode(false);
|
impl.setSilentMode(false);
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ package com.android.systemui.volume;
|
|||||||
|
|
||||||
import static com.android.systemui.volume.VolumeDialogControllerImpl.STREAMS;
|
import static com.android.systemui.volume.VolumeDialogControllerImpl.STREAMS;
|
||||||
|
|
||||||
|
import static junit.framework.Assert.assertEquals;
|
||||||
import static junit.framework.Assert.assertTrue;
|
import static junit.framework.Assert.assertTrue;
|
||||||
|
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
@@ -28,6 +29,7 @@ import static org.mockito.Mockito.verify;
|
|||||||
import android.app.KeyguardManager;
|
import android.app.KeyguardManager;
|
||||||
import android.media.AudioManager;
|
import android.media.AudioManager;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
|
import android.provider.DeviceConfig;
|
||||||
import android.testing.AndroidTestingRunner;
|
import android.testing.AndroidTestingRunner;
|
||||||
import android.testing.TestableLooper;
|
import android.testing.TestableLooper;
|
||||||
import android.view.InputDevice;
|
import android.view.InputDevice;
|
||||||
@@ -38,6 +40,7 @@ import android.view.accessibility.AccessibilityManager;
|
|||||||
|
|
||||||
import androidx.test.filters.SmallTest;
|
import androidx.test.filters.SmallTest;
|
||||||
|
|
||||||
|
import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
|
||||||
import com.android.internal.jank.InteractionJankMonitor;
|
import com.android.internal.jank.InteractionJankMonitor;
|
||||||
import com.android.systemui.Prefs;
|
import com.android.systemui.Prefs;
|
||||||
import com.android.systemui.R;
|
import com.android.systemui.R;
|
||||||
@@ -49,6 +52,9 @@ import com.android.systemui.plugins.VolumeDialogController.State;
|
|||||||
import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
|
import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
|
||||||
import com.android.systemui.statusbar.policy.ConfigurationController;
|
import com.android.systemui.statusbar.policy.ConfigurationController;
|
||||||
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
|
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
|
||||||
|
import com.android.systemui.util.DeviceConfigProxyFake;
|
||||||
|
import com.android.systemui.util.concurrency.FakeExecutor;
|
||||||
|
import com.android.systemui.util.time.FakeSystemClock;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@@ -71,6 +77,8 @@ public class VolumeDialogImplTest extends SysuiTestCase {
|
|||||||
View mDrawerVibrate;
|
View mDrawerVibrate;
|
||||||
View mDrawerMute;
|
View mDrawerMute;
|
||||||
View mDrawerNormal;
|
View mDrawerNormal;
|
||||||
|
private DeviceConfigProxyFake mDeviceConfigProxy;
|
||||||
|
private FakeExecutor mExecutor;
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
VolumeDialogController mVolumeDialogController;
|
VolumeDialogController mVolumeDialogController;
|
||||||
@@ -97,6 +105,9 @@ public class VolumeDialogImplTest extends SysuiTestCase {
|
|||||||
|
|
||||||
getContext().addMockSystemService(KeyguardManager.class, mKeyguard);
|
getContext().addMockSystemService(KeyguardManager.class, mKeyguard);
|
||||||
|
|
||||||
|
mDeviceConfigProxy = new DeviceConfigProxyFake();
|
||||||
|
mExecutor = new FakeExecutor(new FakeSystemClock());
|
||||||
|
|
||||||
mDialog = new VolumeDialogImpl(
|
mDialog = new VolumeDialogImpl(
|
||||||
getContext(),
|
getContext(),
|
||||||
mVolumeDialogController,
|
mVolumeDialogController,
|
||||||
@@ -106,7 +117,9 @@ public class VolumeDialogImplTest extends SysuiTestCase {
|
|||||||
mMediaOutputDialogFactory,
|
mMediaOutputDialogFactory,
|
||||||
mVolumePanelFactory,
|
mVolumePanelFactory,
|
||||||
mActivityStarter,
|
mActivityStarter,
|
||||||
mInteractionJankMonitor);
|
mInteractionJankMonitor,
|
||||||
|
mDeviceConfigProxy,
|
||||||
|
mExecutor);
|
||||||
mDialog.init(0, null);
|
mDialog.init(0, null);
|
||||||
State state = createShellState();
|
State state = createShellState();
|
||||||
mDialog.onStateChangedH(state);
|
mDialog.onStateChangedH(state);
|
||||||
@@ -123,6 +136,9 @@ public class VolumeDialogImplTest extends SysuiTestCase {
|
|||||||
VolumePrefs.SHOW_RINGER_TOAST_COUNT + 1);
|
VolumePrefs.SHOW_RINGER_TOAST_COUNT + 1);
|
||||||
|
|
||||||
Prefs.putBoolean(mContext, Prefs.Key.HAS_SEEN_ODI_CAPTIONS_TOOLTIP, false);
|
Prefs.putBoolean(mContext, Prefs.Key.HAS_SEEN_ODI_CAPTIONS_TOOLTIP, false);
|
||||||
|
|
||||||
|
mDeviceConfigProxy.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
|
||||||
|
SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "false", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private State createShellState() {
|
private State createShellState() {
|
||||||
@@ -292,6 +308,35 @@ public class VolumeDialogImplTest extends SysuiTestCase {
|
|||||||
AudioManager.RINGER_MODE_NORMAL, false);
|
AudioManager.RINGER_MODE_NORMAL, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ideally we would look at the ringer ImageView and check its assigned drawable id, but that
|
||||||
|
* API does not exist. So we do the next best thing; we check the cached icon id.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void notificationVolumeSeparated_theRingerIconChanges() {
|
||||||
|
mDeviceConfigProxy.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
|
||||||
|
SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "true", false);
|
||||||
|
|
||||||
|
mExecutor.runAllReady(); // for the config change to take effect
|
||||||
|
|
||||||
|
// assert icon is new based on res id
|
||||||
|
assertEquals(mDialog.mVolumeRingerIconDrawableId,
|
||||||
|
R.drawable.ic_speaker_on);
|
||||||
|
assertEquals(mDialog.mVolumeRingerMuteIconDrawableId,
|
||||||
|
R.drawable.ic_speaker_mute);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void notificationVolumeNotSeparated_theRingerIconRemainsTheSame() {
|
||||||
|
mDeviceConfigProxy.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
|
||||||
|
SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "false", false);
|
||||||
|
|
||||||
|
mExecutor.runAllReady();
|
||||||
|
|
||||||
|
assertEquals(mDialog.mVolumeRingerIconDrawableId, R.drawable.ic_volume_ringer);
|
||||||
|
assertEquals(mDialog.mVolumeRingerMuteIconDrawableId, R.drawable.ic_volume_ringer_mute);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@Test
|
@Test
|
||||||
public void testContentDescriptions() {
|
public void testContentDescriptions() {
|
||||||
|
|||||||
Reference in New Issue
Block a user