Volume header changes

- Show always
- Update locale immediately

Bug: 31847162
Bug: 33277887
Test: manual
Change-Id: I89c5cbddf08df3a9eba20f2fb3b76eec69926777
This commit is contained in:
Julia Reynolds
2016-12-14 15:02:38 -05:00
parent 1548d5c43b
commit 03c548f292
7 changed files with 105 additions and 122 deletions

View File

@@ -1121,19 +1121,18 @@
<!-- Toast shown when user unlocks screen and managed profile activity is in the foreground -->
<string name="managed_profile_foreground_toast">You\'re using your work profile</string>
<string-array name="volume_stream_titles">
<item>Call</item> <!-- STREAM_VOICE_CALL -->
<item>System</item> <!-- STREAM_SYSTEM -->
<item>Ring</item> <!-- STREAM_RING -->
<item>Media</item> <!-- STREAM_MUSIC -->
<item>Alarm</item> <!-- STREAM_ALARM -->
<item></item> <!-- STREAM_NOTIFICATION -->
<item>Bluetooth</item> <!-- STREAM_BLUETOOTH_SCO -->
<item></item> <!-- STREAM_SYSTEM_ENFORCED -->
<item></item> <!-- STREAM_DTMF -->
<item></item> <!-- STREAM_TTS -->
<item>Accessibility</item> <!-- STREAM_ACCESSIBILITY -->
</string-array>
<!-- volume stream names. All nouns. -->
<string name="stream_voice_call">Call</string> <!-- STREAM_VOICE_CALL -->
<string name="stream_system">System</string> <!-- STREAM_SYSTEM -->
<string name="stream_ring">Ring</string> <!-- STREAM_RING -->
<string name="stream_music">Media</string> <!-- STREAM_MUSIC -->
<string name="stream_alarm">Alarm</string> <!-- STREAM_ALARM -->
<string name="stream_notification">Notification</string> <!-- STREAM_NOTIFICATION -->
<string name="stream_bluetooth_sco">Bluetooth</string> <!-- STREAM_BLUETOOTH_SCO -->
<string name="stream_system_enforced">System enforced</string> <!-- STREAM_SYSTEM_ENFORCED -->
<string name="stream_dtmf">Dual multi tone frequency</string> <!-- STREAM_DTMF -->
<string name="stream_tts">Text to speech</string> <!-- STREAM_TTS -->
<string name="stream_accessibility">Accessibility</string> <!-- STREAM_ACCESSIBILITY -->
<string name="volume_stream_muted" translatable="false">%s silent</string>
<string name="volume_stream_vibrate" translatable="false">%s vibrate</string>

View File

@@ -25,19 +25,23 @@ import android.view.View.OnAttachStateChangeListener;
import android.widget.TextView;
/**
* Capture initial sp values for registered textviews, and update properly when configuration
* changes.
* Class for updating textviews on configuration change.
*/
public class SpTexts {
public class ConfigurableTexts {
private final Context mContext;
private final ArrayMap<TextView, Integer> mTexts = new ArrayMap<>();
private final ArrayMap<TextView, Integer> mTextLabels = new ArrayMap<>();
public SpTexts(Context context) {
public ConfigurableTexts(Context context) {
mContext = context;
}
public int add(final TextView text) {
return add(text, -1);
}
public int add(final TextView text, final int labelResId) {
if (text == null) return 0;
final Resources res = mContext.getResources();
final float fontScale = res.getConfiguration().fontScale;
@@ -55,6 +59,7 @@ public class SpTexts {
setTextSizeH(text, sp);
}
});
mTextLabels.put(text, labelResId);
return sp;
}
@@ -67,12 +72,25 @@ public class SpTexts {
text.setTextSize(TypedValue.COMPLEX_UNIT_SP, sp);
}
private void setTextLabelH(TextView text, int labelResId) {
try {
if (labelResId >= 0) {
Util.setText(text, mContext.getString(labelResId));
}
} catch (Resources.NotFoundException e) {
// oh well.
}
}
private final Runnable mUpdateAll = new Runnable() {
@Override
public void run() {
for (int i = 0; i < mTexts.size(); i++) {
setTextSizeH(mTexts.keyAt(i), mTexts.valueAt(i));
}
for (int i = 0; i < mTextLabels.size(); i++) {
setTextLabelH(mTextLabels.keyAt(i), mTextLabels.valueAt(i));
}
}
};
}

View File

@@ -36,7 +36,7 @@ public class SegmentedButtons extends LinearLayout {
private final Context mContext;
protected final LayoutInflater mInflater;
private final SpTexts mSpTexts;
private final ConfigurableTexts mConfigurableTexts;
private Callback mCallback;
protected Object mSelectedValue;
@@ -46,7 +46,7 @@ public class SegmentedButtons extends LinearLayout {
mContext = context;
mInflater = LayoutInflater.from(mContext);
setOrientation(HORIZONTAL);
mSpTexts = new SpTexts(mContext);
mConfigurableTexts = new ConfigurableTexts(mContext);
}
public void setCallback(Callback callback) {
@@ -97,15 +97,11 @@ public class SegmentedButtons extends LinearLayout {
fireInteraction();
}
});
mSpTexts.add(b);
mConfigurableTexts.add(b, labelResId);
}
public void updateLocale() {
for (int i = 0; i < getChildCount(); i++) {
final Button b = (Button) getChildAt(i);
final int labelResId = (Integer) b.getTag(LABEL_RES_KEY);
b.setText(labelResId);
}
public void update() {
mConfigurableTexts.update();
}
private void fireOnSelected(boolean fromClick) {

View File

@@ -46,6 +46,7 @@ import android.transition.Transition;
import android.transition.TransitionManager;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.Slog;
import android.util.SparseBooleanArray;
import android.view.Gravity;
import android.view.MotionEvent;
@@ -109,7 +110,7 @@ public class VolumeDialog implements TunerService.Tunable {
private ViewGroup mDialogContentView;
private ImageButton mExpandButton;
private final List<VolumeRow> mRows = new ArrayList<>();
private SpTexts mSpTexts;
private ConfigurableTexts mConfigurableTexts;
private final SparseBooleanArray mDynamic = new SparseBooleanArray();
private final KeyguardManager mKeyguard;
private final AudioManager mAudioManager;
@@ -128,7 +129,6 @@ public class VolumeDialog implements TunerService.Tunable {
private boolean mExpanded;
private int mActiveStream;
private boolean mShowHeaders = VolumePrefs.DEFAULT_SHOW_HEADERS;
private boolean mAutomute = VolumePrefs.DEFAULT_ENABLE_AUTOMUTE;
private boolean mSilentMode = VolumePrefs.DEFAULT_ENABLE_SILENT_MODE;
private State mState;
@@ -173,7 +173,7 @@ public class VolumeDialog implements TunerService.Tunable {
private void initDialog() {
mDialog = new CustomDialog(mContext);
mSpTexts = new SpTexts(mContext);
mConfigurableTexts = new ConfigurableTexts(mContext);
mHovering = false;
mShowing = false;
mWindow = mDialog.getWindow();
@@ -294,12 +294,6 @@ public class VolumeDialog implements TunerService.Tunable {
mHandler.obtainMessage(H.SET_STREAM_IMPORTANT, stream, important ? 1 : 0).sendToTarget();
}
public void setShowHeaders(boolean showHeaders) {
if (showHeaders == mShowHeaders) return;
mShowHeaders = showHeaders;
mHandler.sendEmptyMessage(H.RECHECK_ALL);
}
public void setAutomute(boolean automute) {
if (mAutomute == automute) return;
mAutomute = automute;
@@ -357,7 +351,6 @@ public class VolumeDialog implements TunerService.Tunable {
writer.println(mExpandButtonAnimationRunning);
writer.print(" mActiveStream: "); writer.println(mActiveStream);
writer.print(" mDynamic: "); writer.println(mDynamic);
writer.print(" mShowHeaders: "); writer.println(mShowHeaders);
writer.print(" mAutomute: "); writer.println(mAutomute);
writer.print(" mSilentMode: "); writer.println(mSilentMode);
writer.print(" mCollapseTime: "); writer.println(mCollapseTime);
@@ -385,11 +378,9 @@ public class VolumeDialog implements TunerService.Tunable {
row.view.setTag(row);
row.header = (TextView) row.view.findViewById(R.id.volume_row_header);
row.header.setId(20 * row.stream);
mSpTexts.add(row.header);
row.slider = (SeekBar) row.view.findViewById(R.id.volume_row_slider);
row.slider.setOnSeekBarChangeListener(new VolumeSeekBarChangeListener(row));
row.anim = null;
row.cachedShowHeaders = VolumePrefs.DEFAULT_SHOW_HEADERS;
// forward events above the slider into the slider
row.view.setOnTouchListener(new OnTouchListener() {
@@ -617,8 +608,8 @@ public class VolumeDialog implements TunerService.Tunable {
final boolean isActive = row == activeRow;
final boolean shouldBeVisible = shouldBeVisibleH(row, isActive);
Util.setVisOrGone(row.view, shouldBeVisible);
Util.setVisOrGone(row.header, shouldBeVisible);
if (row.view.isShown()) {
updateVolumeRowHeaderVisibleH(row);
updateVolumeRowSliderTintH(row, isActive);
}
}
@@ -731,11 +722,9 @@ public class VolumeDialog implements TunerService.Tunable {
row.slider.setMax(max);
}
// update header visible
updateVolumeRowHeaderVisibleH(row);
// update header text
Util.setText(row.header, ss.name);
Util.setText(row.header, getStreamLabelH(ss));
mConfigurableTexts.add(row.header, ss.name);
// update icon
final boolean iconEnabled = (mAutomute || ss.muteSupported) && !zenMuted;
@@ -768,31 +757,31 @@ public class VolumeDialog implements TunerService.Tunable {
if (isRingVibrate) {
row.icon.setContentDescription(mContext.getString(
R.string.volume_stream_content_description_unmute,
ss.name));
getStreamLabelH(ss)));
} else {
if (mController.hasVibrator()) {
row.icon.setContentDescription(mContext.getString(
R.string.volume_stream_content_description_vibrate,
ss.name));
getStreamLabelH(ss)));
} else {
row.icon.setContentDescription(mContext.getString(
R.string.volume_stream_content_description_mute,
ss.name));
getStreamLabelH(ss)));
}
}
} else {
if (ss.muted || mAutomute && ss.level == 0) {
row.icon.setContentDescription(mContext.getString(
R.string.volume_stream_content_description_unmute,
ss.name));
getStreamLabelH(ss)));
} else {
row.icon.setContentDescription(mContext.getString(
R.string.volume_stream_content_description_mute,
ss.name));
getStreamLabelH(ss)));
}
}
} else {
row.icon.setContentDescription(ss.name);
row.icon.setContentDescription(getStreamLabelH(ss));
}
// update slider
@@ -802,15 +791,6 @@ public class VolumeDialog implements TunerService.Tunable {
updateVolumeRowSliderH(row, enableSlider, vlevel);
}
private void updateVolumeRowHeaderVisibleH(VolumeRow row) {
final boolean dynamic = row.ss != null && row.ss.dynamic;
final boolean showHeaders = mExpanded && (mShowHeaders || dynamic);
if (row.cachedShowHeaders != showHeaders) {
row.cachedShowHeaders = showHeaders;
Util.setVisOrGone(row.header, showHeaders);
}
}
private void updateVolumeRowSliderTintH(VolumeRow row, boolean isActive) {
if (isActive && mExpanded) {
row.slider.requestFocus();
@@ -920,6 +900,18 @@ public class VolumeDialog implements TunerService.Tunable {
rescheduleTimeoutH();
}
private String getStreamLabelH(StreamState ss) {
if (ss.remoteLabel != null) {
return ss.remoteLabel;
}
try {
return mContext.getString(ss.name);
} catch (Resources.NotFoundException e) {
Slog.e(TAG, "Can't find translation for stream " + ss);
return "";
}
}
private AutoTransition getTransistion() {
AutoTransition transition = new AutoTransition();
transition.setDuration(mExpandButtonAnimationDuration);
@@ -995,7 +987,7 @@ public class VolumeDialog implements TunerService.Tunable {
mDensity = density;
}
updateWindowWidthH();
mSpTexts.update();
mConfigurableTexts.update();
mZenFooter.onConfigurationChanged();
}
@@ -1125,7 +1117,7 @@ public class VolumeDialog implements TunerService.Tunable {
if (mShowing) {
event.getText().add(mContext.getString(
R.string.volume_dialog_accessibility_shown_message,
getActiveRow().ss.name));
getStreamLabelH(getActiveRow().ss)));
return true;
}
}
@@ -1253,7 +1245,6 @@ public class VolumeDialog implements TunerService.Tunable {
private int cachedIconRes;
private ColorStateList cachedSliderTint;
private int iconState; // from Events
private boolean cachedShowHeaders = VolumePrefs.DEFAULT_SHOW_HEADERS;
private ObjectAnimator anim; // slider progress animation for non-touch-related updates
private int animTargetProgress;
private int lastAudibleLevel = 1;

View File

@@ -16,6 +16,7 @@
package com.android.systemui.volume;
import android.annotation.IntegerRes;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
@@ -41,6 +42,7 @@ import android.os.RemoteException;
import android.os.Vibrator;
import android.provider.Settings;
import android.service.notification.Condition;
import android.util.ArrayMap;
import android.util.Log;
import android.util.SparseArray;
@@ -67,19 +69,20 @@ public class VolumeDialogController {
private static final int DYNAMIC_STREAM_START_INDEX = 100;
private static final int VIBRATE_HINT_DURATION = 50;
private static final int[] STREAMS = {
AudioSystem.STREAM_ALARM,
AudioSystem.STREAM_BLUETOOTH_SCO,
AudioSystem.STREAM_DTMF,
AudioSystem.STREAM_MUSIC,
AudioSystem.STREAM_NOTIFICATION,
AudioSystem.STREAM_RING,
AudioSystem.STREAM_SYSTEM,
AudioSystem.STREAM_SYSTEM_ENFORCED,
AudioSystem.STREAM_TTS,
AudioSystem.STREAM_VOICE_CALL,
AudioSystem.STREAM_ACCESSIBILITY,
};
private static final ArrayMap<Integer, Integer> STREAMS = new ArrayMap<>();
static {
STREAMS.put(AudioSystem.STREAM_ALARM, R.string.stream_alarm);
STREAMS.put(AudioSystem.STREAM_BLUETOOTH_SCO, R.string.stream_bluetooth_sco);
STREAMS.put(AudioSystem.STREAM_DTMF, R.string.stream_dtmf);
STREAMS.put(AudioSystem.STREAM_MUSIC, R.string.stream_music);
STREAMS.put(AudioSystem.STREAM_NOTIFICATION, R.string.stream_notification);
STREAMS.put(AudioSystem.STREAM_RING, R.string.stream_ring);
STREAMS.put(AudioSystem.STREAM_SYSTEM, R.string.stream_system);
STREAMS.put(AudioSystem.STREAM_SYSTEM_ENFORCED, R.string.stream_system_enforced);
STREAMS.put(AudioSystem.STREAM_TTS, R.string.stream_tts);
STREAMS.put(AudioSystem.STREAM_VOICE_CALL, R.string.stream_voice_call);
STREAMS.put(AudioSystem.STREAM_ACCESSIBILITY, R.string.stream_accessibility);
}
private final HandlerThread mWorkerThread;
private final W mWorker;
@@ -92,7 +95,6 @@ public class VolumeDialogController {
private final MediaSessions mMediaSessions;
private final C mCallbacks = new C();
private final State mState = new State();
private final String[] mStreamTitles;
private final MediaSessionsCallbacks mMediaSessionsCallbacksW = new MediaSessionsCallbacks();
private final Vibrator mVibrator;
private final boolean mHasVibrator;
@@ -120,26 +122,6 @@ public class VolumeDialogController {
mObserver = new SettingObserver(mWorker);
mObserver.init();
mReceiver.init();
final String[] titles =
mContext.getResources().getStringArray(R.array.volume_stream_titles);
if (STREAMS.length == titles.length) {
mStreamTitles = titles;
} else if (STREAMS.length > titles.length) {
Log.e(TAG, String.format("Missing stream titles (found %d, expected %d): "
+ " invalid resources for volume_stream_titles",
titles.length, STREAMS.length));
mStreamTitles = new String[STREAMS.length];
System.arraycopy(titles, 0, mStreamTitles, 0, titles.length);
for (int i = titles.length ; i < STREAMS.length ; i++) {
mStreamTitles[i] = "";
}
} else { // STREAMS.length < titles.length
Log.e(TAG, String.format("Too many stream titles (found %d, expected %d): "
+ " invalid resources for volume_stream_titles",
titles.length, STREAMS.length));
mStreamTitles = new String[STREAMS.length];
System.arraycopy(titles, 0, mStreamTitles, 0, STREAMS.length);
}
mVibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
mHasVibrator = mVibrator != null && mVibrator.hasVibrator();
}
@@ -385,14 +367,14 @@ public class VolumeDialogController {
}
private void onGetStateW() {
for (int stream : STREAMS) {
for (int stream : STREAMS.keySet()) {
updateStreamLevelW(stream, getAudioManagerStreamVolume(stream));
streamStateW(stream).levelMin = getAudioManagerStreamMinVolume(stream);
streamStateW(stream).levelMax = getAudioManagerStreamMaxVolume(stream);
updateStreamMuteW(stream, mAudio.isStreamMute(stream));
final StreamState ss = streamStateW(stream);
ss.muteSupported = mAudio.isStreamAffectedByMute(stream);
ss.name = mStreamTitles[stream];
ss.name = STREAMS.get(stream);
checkRoutedToBluetoothW(stream);
}
updateRingerModeExternalW(mAudio.getRingerMode());
@@ -912,8 +894,9 @@ public class VolumeDialogController {
ss.level = pi.getCurrentVolume();
changed = true;
}
if (!Objects.equals(ss.name, name)) {
ss.name = name;
if (!Objects.equals(ss.remoteLabel, name)) {
ss.name = -1;
ss.remoteLabel = name;
changed = true;
}
if (changed) {
@@ -975,7 +958,8 @@ public class VolumeDialogController {
public int levelMax;
public boolean muted;
public boolean muteSupported;
public String name;
public @IntegerRes int name;
public String remoteLabel;
public boolean routedToBluetooth;
public StreamState copy() {
@@ -987,6 +971,7 @@ public class VolumeDialogController {
rt.muted = muted;
rt.muteSupported = muteSupported;
rt.name = name;
rt.remoteLabel = remoteLabel;
rt.routedToBluetooth = routedToBluetooth;
return rt;
}

View File

@@ -38,7 +38,7 @@ public class ZenFooter extends LinearLayout {
private static final String TAG = Util.logTag(ZenFooter.class);
private final Context mContext;
private final SpTexts mSpTexts;
private final ConfigurableTexts mConfigurableTexts;
private ImageView mIcon;
private TextView mSummaryLine1;
@@ -51,7 +51,7 @@ public class ZenFooter extends LinearLayout {
public ZenFooter(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
mSpTexts = new SpTexts(mContext);
mConfigurableTexts = new ConfigurableTexts(mContext);
final LayoutTransition layoutTransition = new LayoutTransition();
layoutTransition.setDuration(new ValueAnimator().getDuration() / 2);
setLayoutTransition(layoutTransition);
@@ -64,9 +64,9 @@ public class ZenFooter extends LinearLayout {
mSummaryLine1 = (TextView) findViewById(R.id.volume_zen_summary_line_1);
mSummaryLine2 = (TextView) findViewById(R.id.volume_zen_summary_line_2);
mEndNowButton = (TextView) findViewById(R.id.volume_zen_end_now);
mSpTexts.add(mSummaryLine1);
mSpTexts.add(mSummaryLine2);
mSpTexts.add(mEndNowButton);
mConfigurableTexts.add(mSummaryLine1);
mConfigurableTexts.add(mSummaryLine2);
mConfigurableTexts.add(mEndNowButton, R.string.volume_zen_end_now);
}
public void init(final ZenModeController controller) {
@@ -130,8 +130,7 @@ public class ZenFooter extends LinearLayout {
}
public void onConfigurationChanged() {
Util.setText(mEndNowButton, mContext.getString(R.string.volume_zen_end_now));
mSpTexts.update();
mConfigurableTexts.update();
}
private final ZenModeController.Callback mZenCallback = new ZenModeController.Callback() {

View File

@@ -92,7 +92,7 @@ public class ZenModePanel extends LinearLayout {
private final ZenPrefs mPrefs;
private final TransitionHelper mTransitionHelper = new TransitionHelper();
private final Uri mForeverId;
private final SpTexts mSpTexts;
private final ConfigurableTexts mConfigurableTexts;
private String mTag = TAG + "/" + Integer.toHexString(System.identityHashCode(this));
@@ -131,7 +131,7 @@ public class ZenModePanel extends LinearLayout {
mPrefs = new ZenPrefs();
mInflater = LayoutInflater.from(mContext.getApplicationContext());
mForeverId = Condition.newId(mContext).appendPath("forever").build();
mSpTexts = new SpTexts(mContext);
mConfigurableTexts = new ConfigurableTexts(mContext);
mVoiceCapable = Util.isVoiceCapable(mContext);
mZenModeConditionLayoutId = R.layout.zen_mode_condition;
mZenModeButtonLayoutId = R.layout.zen_mode_button;
@@ -175,7 +175,6 @@ public class ZenModePanel extends LinearLayout {
createZenButtons();
mZenIntroduction = findViewById(R.id.zen_introduction);
mZenIntroductionMessage = (TextView) findViewById(R.id.zen_introduction_message);
mSpTexts.add(mZenIntroductionMessage);
mZenIntroductionConfirm = findViewById(R.id.zen_introduction_confirm);
mZenIntroductionConfirm.setOnClickListener(new OnClickListener() {
@Override
@@ -193,7 +192,7 @@ public class ZenModePanel extends LinearLayout {
}
}
});
mSpTexts.add(mZenIntroductionCustomize);
mConfigurableTexts.add(mZenIntroductionCustomize, R.string.zen_priority_customize_button);
mZenConditions = (LinearLayout) findViewById(R.id.zen_conditions);
mZenAlarmWarning = (TextView) findViewById(R.id.zen_alarm_warning);
@@ -204,11 +203,9 @@ public class ZenModePanel extends LinearLayout {
@Override
protected void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mConfigurableTexts.update();
if (mZenButtons != null) {
mZenButtons.updateLocale();
}
if (mZenIntroductionCustomize != null) {
mZenIntroductionCustomize.setText(R.string.zen_priority_customize_button);
mZenButtons.update();
}
}
@@ -341,10 +338,6 @@ public class ZenModePanel extends LinearLayout {
hideAllConditions();
}
public void updateLocale() {
mZenButtons.updateLocale();
}
private void setExitCondition(Condition exitCondition) {
if (Objects.equals(mExitCondition, exitCondition)) return;
mExitCondition = exitCondition;
@@ -439,9 +432,11 @@ public class ZenModePanel extends LinearLayout {
mZenButtons.setVisibility(mHidden ? GONE : VISIBLE);
mZenIntroduction.setVisibility(introduction ? VISIBLE : GONE);
if (introduction) {
mZenIntroductionMessage.setText(zenImportant ? R.string.zen_priority_introduction
mConfigurableTexts.add(mZenIntroductionMessage, zenImportant
? R.string.zen_priority_introduction
: mVoiceCapable ? R.string.zen_silence_introduction_voice
: R.string.zen_silence_introduction);
mConfigurableTexts.update();
mZenIntroductionCustomize.setVisibility(zenImportant ? VISIBLE : GONE);
}
final String warning = computeAlarmWarningText(zenNone);
@@ -655,11 +650,11 @@ public class ZenModePanel extends LinearLayout {
}
if (tag.line1 == null) {
tag.line1 = (TextView) row.findViewById(android.R.id.text1);
mSpTexts.add(tag.line1);
mConfigurableTexts.add(tag.line1);
}
if (tag.line2 == null) {
tag.line2 = (TextView) row.findViewById(android.R.id.text2);
mSpTexts.add(tag.line2);
mConfigurableTexts.add(tag.line2);
}
final String line1 = !TextUtils.isEmpty(condition.line1) ? condition.line1
: condition.summary;