diff options
8 files changed, 250 insertions, 44 deletions
diff --git a/packages/SystemUI/res/layout/qs_detail.xml b/packages/SystemUI/res/layout/qs_detail.xml index bed8f1be54fe..858f48737544 100644 --- a/packages/SystemUI/res/layout/qs_detail.xml +++ b/packages/SystemUI/res/layout/qs_detail.xml @@ -50,30 +50,6 @@ android:layout_height="0dp" android:layout_weight="1" /> - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:paddingEnd="8dp" - android:gravity="end"> - - <TextView - android:id="@android:id/button2" - style="@style/QSBorderlessButton" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginEnd="8dp" - android:minWidth="132dp" - android:textAppearance="@style/TextAppearance.QS.DetailButton" - android:focusable="true" /> - - <TextView - android:id="@android:id/button1" - style="@style/QSBorderlessButton" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:minWidth="88dp" - android:textAppearance="@style/TextAppearance.QS.DetailButton" - android:focusable="true"/> + <include layout="@layout/qs_detail_buttons" /> - </LinearLayout> </com.android.systemui.qs.QSDetail> diff --git a/packages/SystemUI/res/layout/qs_detail_buttons.xml b/packages/SystemUI/res/layout/qs_detail_buttons.xml new file mode 100644 index 000000000000..03ed62b3e600 --- /dev/null +++ b/packages/SystemUI/res/layout/qs_detail_buttons.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2016 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. +--> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingEnd="8dp" + android:gravity="end"> + + <TextView + android:id="@android:id/button2" + style="@style/QSBorderlessButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginEnd="8dp" + android:minWidth="132dp" + android:textAppearance="@style/TextAppearance.QS.DetailButton" + android:focusable="true" /> + + <TextView + android:id="@android:id/button1" + style="@style/QSBorderlessButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:minWidth="88dp" + android:textAppearance="@style/TextAppearance.QS.DetailButton" + android:focusable="true"/> + +</LinearLayout> diff --git a/packages/SystemUI/res/layout/tuner_zen_mode_panel.xml b/packages/SystemUI/res/layout/tuner_zen_mode_panel.xml new file mode 100644 index 000000000000..efe63d74b97e --- /dev/null +++ b/packages/SystemUI/res/layout/tuner_zen_mode_panel.xml @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2016 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. +--> +<!-- extends LinearLayout --> +<com.android.systemui.tuner.TunerZenModePanel + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/tuner_zen_mode_panel" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:clipChildren="false" + android:visibility="gone" + android:orientation="vertical" > + + <View + android:id="@+id/zen_embedded_divider" + android:layout_width="match_parent" + android:layout_height="1dp" + android:layout_marginBottom="12dp" + android:layout_marginTop="8dp" + android:background="@color/qs_tile_divider" /> + + <include + android:layout_width="match_parent" + android:layout_height="48dp" + android:layout_marginStart="16dp" + android:id="@+id/tuner_zen_switch" + layout="@layout/qs_detail_header" /> + + <include layout="@layout/zen_mode_panel" /> + + <include + android:id="@+id/tuner_zen_buttons" + layout="@layout/qs_detail_buttons" /> + +</com.android.systemui.tuner.TunerZenModePanel> diff --git a/packages/SystemUI/res/layout/volume_dialog.xml b/packages/SystemUI/res/layout/volume_dialog.xml index 34796cd8d53c..e4effd487896 100644 --- a/packages/SystemUI/res/layout/volume_dialog.xml +++ b/packages/SystemUI/res/layout/volume_dialog.xml @@ -46,7 +46,7 @@ <include layout="@layout/volume_zen_footer" /> <!-- Only shown from Tuner setting --> - <include layout="@layout/zen_mode_panel" /> + <include layout="@layout/tuner_zen_mode_panel" /> </LinearLayout> </RelativeLayout> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index fa5b1a9ffa92..6135dc624906 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -810,12 +810,6 @@ <!-- Interruption level: Alarms only. Optimized for narrow two-line display. [CHAR LIMIT=40] --> <string name="interruption_level_alarms_twoline">Alarms\nonly</string> - <!-- Interruption level: All interruptions. [CHAR LIMIT=40] --> - <string name="interruption_level_all">All</string> - - <!-- Interruption level: All interruptions. Optimized for narrow two-line display. [CHAR LIMIT=40] --> - <string name="interruption_level_all_twoline">All\n</string> - <!-- Indication on the keyguard that is shown when the device is charging. [CHAR LIMIT=40]--> <string name="keyguard_indication_charging_time">Charging (<xliff:g id="charging_time_left" example="4 hours and 2 minutes">%s</xliff:g> until full)</string> diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerZenModePanel.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerZenModePanel.java new file mode 100644 index 000000000000..cc0ffb0e2653 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerZenModePanel.java @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2016 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. + */ + +package com.android.systemui.tuner; + +import android.annotation.Nullable; +import android.content.Context; +import android.content.Intent; +import android.provider.Settings; +import android.provider.Settings.Global; +import android.util.AttributeSet; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.Checkable; +import android.widget.LinearLayout; +import android.widget.TextView; +import com.android.systemui.Prefs; +import com.android.systemui.R; +import com.android.systemui.statusbar.policy.ZenModeController; +import com.android.systemui.volume.ZenModePanel; +import com.android.systemui.volume.ZenModePanel.Callback; + +public class TunerZenModePanel extends LinearLayout implements OnClickListener { + private static final String TAG = "TunerZenModePanel"; + + private Callback mCallback; + private ZenModePanel mZenModePanel; + private View mHeaderSwitch; + private int mZenMode; + private ZenModeController mController; + private View mButtons; + private View mMoreSettings; + private View mDone; + private OnClickListener mDoneListener; + private boolean mEditing; + + public TunerZenModePanel(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public void init(ZenModeController zenModeController) { + mController = zenModeController; + mHeaderSwitch = findViewById(R.id.tuner_zen_switch); + mHeaderSwitch.setVisibility(View.VISIBLE); + mHeaderSwitch.setOnClickListener(this); + mHeaderSwitch.findViewById(com.android.internal.R.id.up).setVisibility(View.GONE); + ((TextView) mHeaderSwitch.findViewById(android.R.id.title)).setText( + R.string.quick_settings_dnd_label); + mZenModePanel = (ZenModePanel) findViewById(R.id.zen_mode_panel); + mZenModePanel.init(zenModeController); + mButtons = findViewById(R.id.tuner_zen_buttons); + mMoreSettings = mButtons.findViewById(android.R.id.button2); + mMoreSettings.setOnClickListener(this); + ((TextView) mMoreSettings).setText(R.string.quick_settings_more_settings); + mDone = mButtons.findViewById(android.R.id.button1); + mDone.setOnClickListener(this); + ((TextView) mDone).setText(R.string.quick_settings_done); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + mEditing = false; + } + + public void setCallback(Callback zenPanelCallback) { + mCallback = zenPanelCallback; + mZenModePanel.setCallback(zenPanelCallback); + } + + @Override + public void onClick(View v) { + if (v == mHeaderSwitch) { + mEditing = true; + if (mZenMode == Global.ZEN_MODE_OFF) { + mZenMode = Prefs.getInt(mContext, Prefs.Key.DND_FAVORITE_ZEN, + Global.ZEN_MODE_ALARMS); + mController.setZen(mZenMode, null, TAG); + postUpdatePanel(); + } else { + mZenMode = Global.ZEN_MODE_OFF; + mController.setZen(Global.ZEN_MODE_OFF, null, TAG); + postUpdatePanel(); + } + } else if (v == mMoreSettings) { + Intent intent = new Intent(Settings.ACTION_ZEN_MODE_SETTINGS); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + getContext().startActivity(intent); + } else if (v == mDone) { + mEditing = false; + setVisibility(View.GONE); + mDoneListener.onClick(v); + } + } + + public boolean isEditing() { + return mEditing; + } + + public void setZenState(int zenMode) { + mZenMode = zenMode; + postUpdatePanel(); + } + + private void postUpdatePanel() { + // The complicated structure from reusing the same ZenPanel has resulted in some + // unstableness/flickering from callbacks coming in quickly. To solve this just + // post the UI updates a little bit. + removeCallbacks(mUpdate); + postDelayed(mUpdate, 40); + } + + public void setDoneListener(OnClickListener onClickListener) { + mDoneListener = onClickListener; + } + + private void updatePanel() { + boolean zenOn = mZenMode != Global.ZEN_MODE_OFF; + ((Checkable) mHeaderSwitch.findViewById(android.R.id.toggle)).setChecked(zenOn); + mZenModePanel.setVisibility(zenOn ? View.VISIBLE : View.GONE); + mButtons.setVisibility(zenOn ? View.VISIBLE : View.GONE); + } + + private final Runnable mUpdate = new Runnable() { + @Override + public void run() { + updatePanel(); + } + }; +} diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java index 6aae9bd39a74..1810c1cd315d 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java @@ -67,6 +67,7 @@ import android.widget.TextView; import com.android.systemui.R; import com.android.systemui.statusbar.policy.ZenModeController; import com.android.systemui.tuner.TunerService; +import com.android.systemui.tuner.TunerZenModePanel; import com.android.systemui.volume.VolumeDialogController.State; import com.android.systemui.volume.VolumeDialogController.StreamState; @@ -133,7 +134,7 @@ public class VolumeDialog implements TunerService.Tunable { private int mLastActiveStream; private boolean mShowFullZen; - private final ZenModePanel mZenPanel; + private final TunerZenModePanel mZenPanel; public VolumeDialog(Context context, int windowType, VolumeDialogController controller, ZenModeController zenModeController, Callback callback) { @@ -225,8 +226,7 @@ public class VolumeDialog implements TunerService.Tunable { mExpandButtonAnimationDuration = res.getInteger(R.integer.volume_expand_animation_duration); mZenFooter = (ZenFooter) mDialog.findViewById(R.id.volume_zen_footer); mZenFooter.init(zenModeController); - mZenPanel = (ZenModePanel) mDialog.findViewById(R.id.zen_mode_panel); - mZenPanel.addNoneButton(); + mZenPanel = (TunerZenModePanel) mDialog.findViewById(R.id.tuner_zen_mode_panel); mZenPanel.init(zenModeController); mZenPanel.setCallback(mZenPanelCallback); @@ -671,7 +671,7 @@ public class VolumeDialog implements TunerService.Tunable { final boolean wasVisible = mZenFooter.getVisibility() == View.VISIBLE; final boolean visible = mState.zenMode != Global.ZEN_MODE_OFF && (mAudioManager.isStreamAffectedByRingerMode(mActiveStream) || mExpanded) - && !mShowFullZen; + && !mZenPanel.isEditing(); if (wasVisible != visible && !visible) { prepareForCollapse(); } @@ -679,12 +679,21 @@ public class VolumeDialog implements TunerService.Tunable { mZenFooter.update(); final boolean fullWasVisible = mZenPanel.getVisibility() == View.VISIBLE; - final boolean fullVisible = mShowFullZen && (mState.zenMode != Global.ZEN_MODE_OFF - || mExpanded); + final boolean fullVisible = mShowFullZen && !visible; if (fullWasVisible != fullVisible && !fullVisible) { prepareForCollapse(); } Util.setVisOrGone(mZenPanel, fullVisible); + if (fullVisible) { + mZenPanel.setZenState(mState.zenMode); + mZenPanel.setDoneListener(new OnClickListener() { + @Override + public void onClick(View v) { + prepareForCollapse(); + mHandler.sendEmptyMessage(H.UPDATE_FOOTER); + } + }); + } } private void updateVolumeRowH(VolumeRow row) { @@ -978,6 +987,7 @@ public class VolumeDialog implements TunerService.Tunable { private static final int RESCHEDULE_TIMEOUT = 6; private static final int STATE_CHANGED = 7; private static final int UPDATE_BOTTOM_MARGIN = 8; + private static final int UPDATE_FOOTER = 9; public H() { super(Looper.getMainLooper()); @@ -994,6 +1004,7 @@ public class VolumeDialog implements TunerService.Tunable { case RESCHEDULE_TIMEOUT: rescheduleTimeoutH(); break; case STATE_CHANGED: onStateChangedH(mState); break; case UPDATE_BOTTOM_MARGIN: updateDialogBottomMarginH(); break; + case UPDATE_FOOTER: updateFooterH(); break; } } } diff --git a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java index 5ca24f7586a5..6976c0b1d312 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java +++ b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java @@ -190,12 +190,6 @@ public class ZenModePanel extends LinearLayout { mZenAlarmWarning = (TextView) findViewById(R.id.zen_alarm_warning); } - public void addNoneButton() { - mZenButtons.addButton(R.string.interruption_level_all_twoline, - R.string.interruption_level_all, - Global.ZEN_MODE_OFF); - } - @Override protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); |