diff options
11 files changed, 221 insertions, 391 deletions
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 7777334..7062933 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -6098,21 +6098,18 @@ public final class Settings { "lock_screen_show_notifications"; /** - * Defines global zen mode. One of ZEN_MODE_OFF, ZEN_MODE_LIMITED, ZEN_MODE_FULL. + * Defines global zen mode. ZEN_MODE_OFF or ZEN_MODE_ON. * * @hide */ public static final String ZEN_MODE = "zen_mode"; /** @hide */ public static final int ZEN_MODE_OFF = 0; - /** @hide */ public static final int ZEN_MODE_LIMITED = 1; - /** @hide */ public static final int ZEN_MODE_FULL = 2; + /** @hide */ public static final int ZEN_MODE_ON = 1; /** @hide */ public static String zenModeToString(int mode) { if (mode == ZEN_MODE_OFF) return "ZEN_MODE_OFF"; - if (mode == ZEN_MODE_LIMITED) return "ZEN_MODE_LIMITED"; - if (mode == ZEN_MODE_FULL) return "ZEN_MODE_FULL"; - throw new IllegalArgumentException("Invalid zen mode: " + mode); + return "ZEN_MODE_ON"; } /** diff --git a/packages/SystemUI/res/values-land/dimens.xml b/packages/SystemUI/res/values-land/dimens.xml index ab71371..76e7784 100644 --- a/packages/SystemUI/res/values-land/dimens.xml +++ b/packages/SystemUI/res/values-land/dimens.xml @@ -40,4 +40,7 @@ <!-- The fixed height of each tile --> <dimen name="quick_settings_cell_height">100dp</dimen> + + <!-- Width of the zen mode interstitial dialog. --> + <dimen name="zen_mode_dialog_width">384dp</dimen> </resources> diff --git a/packages/SystemUI/res/values-sw600dp/dimens.xml b/packages/SystemUI/res/values-sw600dp/dimens.xml index ad4dcf9..45f6af3 100644 --- a/packages/SystemUI/res/values-sw600dp/dimens.xml +++ b/packages/SystemUI/res/values-sw600dp/dimens.xml @@ -51,4 +51,7 @@ <!-- How far to slide the panel out when you touch it --> <!-- On tablets this is just the close_handle_height --> <dimen name="peek_height">@dimen/close_handle_height</dimen> + + <!-- Width of the zen mode interstitial dialog. --> + <dimen name="zen_mode_dialog_width">384dp</dimen> </resources> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index f4bfd10..e67e8cf 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -232,4 +232,7 @@ <!-- The size of the icon in the recents task view. --> <dimen name="recents_task_view_icon_size">60dp</dimen> + + <!-- Width of the zen mode interstitial dialog. Defaults to MATCH_PARENT. --> + <dimen name="zen_mode_dialog_width">-1px</dimen> </resources> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index 68c8364..117ae81 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -1260,8 +1260,7 @@ public abstract class BaseStatusBar extends SystemUI implements } private boolean shouldIntercept() { - return mZenMode == Settings.Global.ZEN_MODE_LIMITED - || mZenMode == Settings.Global.ZEN_MODE_FULL; + return mZenMode != Settings.Global.ZEN_MODE_OFF; } protected boolean shouldIntercept(Notification n) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 3d5c5a7..650c557 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -352,13 +352,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { super.setZenMode(mode); if (mModeIcon == null) return; if (!isDeviceProvisioned()) return; - final boolean limited = mode == Settings.Global.ZEN_MODE_LIMITED; - final boolean full = mode == Settings.Global.ZEN_MODE_FULL; - mModeIcon.setVisibility(full || limited ? View.VISIBLE : View.GONE); - final int icon = limited ? R.drawable.stat_sys_zen_limited : R.drawable.stat_sys_zen_full; - if (full || limited) { - mModeIcon.setImageResource(icon); - } + mModeIcon.setVisibility(mode != Settings.Global.ZEN_MODE_OFF ? View.VISIBLE : View.GONE); } @Override @@ -481,6 +475,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode { mMoreIcon = mStatusBarView.findViewById(R.id.moreIcon); mNotificationIcons.setOverflowIndicator(mMoreIcon); mModeIcon = (ImageView)mStatusBarView.findViewById(R.id.modeIcon); + mModeIcon.setImageResource(R.drawable.stat_sys_zen_limited); mStatusBarContents = (LinearLayout)mStatusBarView.findViewById(R.id.status_bar_contents); mTickerView = mStatusBarView.findViewById(R.id.ticker); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java index 8170b5a..aed9a71 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java @@ -33,6 +33,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.UserInfo; +import android.content.res.Configuration; import android.content.res.Resources; import android.database.Cursor; import android.graphics.Bitmap; @@ -42,6 +43,7 @@ import android.hardware.display.DisplayManager; import android.media.MediaRouter; import android.net.wifi.WifiManager; import android.os.AsyncTask; +import android.os.Bundle; import android.os.Handler; import android.os.RemoteException; import android.os.UserHandle; @@ -56,11 +58,13 @@ import android.text.TextUtils.TruncateAt; import android.util.Log; import android.util.Pair; import android.view.LayoutInflater; +import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.view.WindowManagerGlobal; +import android.view.WindowManager.LayoutParams; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; @@ -897,7 +901,16 @@ class QuickSettings { d.requestWindowFeature(Window.FEATURE_NO_TITLE); d.setCancelable(true); d.setCanceledOnTouchOutside(true); - final ZenModeView v = new ZenModeView(mContext); + final ZenModeView v = new ZenModeView(mContext) { + @Override + protected void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + WindowManager.LayoutParams lp = d.getWindow().getAttributes(); + lp.width = mContext.getResources() + .getDimensionPixelSize(R.dimen.zen_mode_dialog_width); + d.getWindow().setAttributes(lp); + } + }; v.setAdapter(new ZenModeViewAdapter(mContext) { @Override public void configure() { @@ -914,6 +927,10 @@ class QuickSettings { d.setContentView(v); d.create(); d.getWindow().setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY); + WindowManager.LayoutParams lp = d.getWindow().getAttributes(); + lp.horizontalMargin = 0; + lp.width = mContext.getResources().getDimensionPixelSize(R.dimen.zen_mode_dialog_width); + d.getWindow().setAttributes(lp); d.show(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java index c3c281c..9b25046 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java @@ -608,16 +608,8 @@ class QuickSettingsModel implements BluetoothStateChangeCallback, Settings.Global.ZEN_MODE, Settings.Global.ZEN_MODE_OFF); mZenModeState.enabled = mode != Settings.Global.ZEN_MODE_OFF; mZenModeState.zenMode = mode; - if (mode == Settings.Global.ZEN_MODE_FULL) { - mZenModeState.iconId = R.drawable.stat_sys_zen_full; - mZenModeState.label = ZenModeView.modeToLabel(ZenModeView.Adapter.MODE_FULL); - } else if (mode == Settings.Global.ZEN_MODE_LIMITED) { - mZenModeState.iconId = R.drawable.stat_sys_zen_limited; - mZenModeState.label = ZenModeView.modeToLabel(ZenModeView.Adapter.MODE_LIMITED); - } else { - mZenModeState.iconId = R.drawable.stat_sys_zen_limited; - mZenModeState.label = ZenModeView.modeToLabel(ZenModeView.Adapter.MODE_LIMITED); - } + mZenModeState.label = ZenModeView.MODE_LABEL; + mZenModeState.iconId = R.drawable.stat_sys_zen_limited; mZenModeCallback.refreshView(mZenModeTile, mZenModeState); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ZenModeView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ZenModeView.java index d1c7a41..d1a9d57 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ZenModeView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ZenModeView.java @@ -21,10 +21,10 @@ import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Paint; -import android.graphics.Path; +import android.graphics.PorterDuff.Mode; import android.graphics.Typeface; import android.graphics.drawable.ShapeDrawable; -import android.graphics.drawable.shapes.PathShape; +import android.graphics.drawable.shapes.OvalShape; import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text.TextPaint; @@ -36,13 +36,13 @@ import android.util.TypedValue; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; +import android.widget.CompoundButton; +import android.widget.CompoundButton.OnCheckedChangeListener; +import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; -import android.widget.ListView; import android.widget.RelativeLayout; -import android.widget.Spinner; +import android.widget.Switch; import android.widget.TextView; import android.widget.Toast; @@ -53,28 +53,30 @@ public class ZenModeView extends RelativeLayout { private static final String TAG = ZenModeView.class.getSimpleName(); private static final boolean DEBUG = false; + public static final String MODE_LABEL = "Limited interruptions"; + public static final int BACKGROUND = 0xff282828; + private static final Typeface CONDENSED = Typeface.create("sans-serif-condensed", Typeface.NORMAL); private static final int GRAY = 0xff999999; //TextAppearance.StatusBar.Expanded.Network - private static final int BACKGROUND = 0xff282828; + private static final int DARK_GRAY = 0xff333333; + private static final long DURATION = new ValueAnimator().getDuration(); - private static final long BOUNCE_DURATION = DURATION / 3; + private static final long PAGER_DURATION = DURATION / 2; private static final float BOUNCE_SCALE = 0.8f; - private static final float SETTINGS_ALPHA = 0.6f; - - private static final String FULL_TEXT = - "You won't hear any calls, alarms or timers."; + private static final long CLOSE_DELAY = 600; private final Context mContext; private final Paint mPathPaint; private final ImageView mSettingsButton; - private final ModeSpinner mModeSpinner; - private final TextView mActionButton; + private final TextView mModeText; + private final Switch mModeSwitch; private final View mDivider; private final UntilPager mUntilPager; - private final AlarmWarning mAlarmWarning; + private final ProgressDots mProgressDots; private Adapter mAdapter; + private boolean mInit; public ZenModeView(Context context) { this(context, null); @@ -105,37 +107,45 @@ public class ZenModeView extends RelativeLayout { mSettingsButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - if (mAdapter != null && mAdapter.getMode() == Adapter.MODE_LIMITED) { + if (mAdapter != null) { mAdapter.configure(); } bounce(mSettingsButton, null); } }); - mModeSpinner = new ModeSpinner(mContext); - mModeSpinner.setId(android.R.id.title); + mModeText = new TextView(mContext); + mModeText.setText(MODE_LABEL); + mModeText.setId(android.R.id.title); + mModeText.setTextColor(GRAY); + mModeText.setTypeface(CONDENSED); + mModeText.setAllCaps(true); + mModeText.setGravity(Gravity.CENTER); + mModeText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mModeText.getTextSize() * 1.1f); lp = new LayoutParams(LayoutParams.WRAP_CONTENT, topRowSize); lp.topMargin = p; lp.addRule(CENTER_HORIZONTAL); - addView(mModeSpinner, lp); - - mActionButton = new TextView(mContext); - mActionButton.setTextColor(GRAY); - mActionButton.setTypeface(CONDENSED); - mActionButton.setTextSize(TypedValue.COMPLEX_UNIT_PX, mActionButton.getTextSize() * 1.2f); - mActionButton.setAllCaps(true); - mActionButton.setGravity(Gravity.CENTER); - mActionButton.setPadding(p, 0, p * 2, 0); + addView(mModeText, lp); + + mModeSwitch = new Switch(mContext); + mModeSwitch.setSwitchPadding(0); + mModeSwitch.setSwitchTypeface(CONDENSED); lp = new LayoutParams(LayoutParams.WRAP_CONTENT, topRowSize); lp.topMargin = p; lp.addRule(ALIGN_PARENT_RIGHT); - lp.addRule(ALIGN_BASELINE, mModeSpinner.getId()); - addView(mActionButton, lp); - mActionButton.setOnClickListener(new View.OnClickListener() { + lp.addRule(ALIGN_BASELINE, mModeText.getId()); + addView(mModeSwitch, lp); + mModeSwitch.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override - public void onClick(View v) { - bounce(v, null); - beginOrEnd(); + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + mAdapter.setMode(isChecked); + if (!mInit) return; + postDelayed(new Runnable(){ + @Override + public void run() { + mAdapter.close(); + } + }, CLOSE_DELAY); } }); @@ -143,35 +153,24 @@ public class ZenModeView extends RelativeLayout { mDivider.setId(android.R.id.empty); mDivider.setBackgroundColor(GRAY); lp = new LayoutParams(LayoutParams.MATCH_PARENT, 2); - lp.addRule(BELOW, mModeSpinner.getId()); + lp.addRule(BELOW, mModeText.getId()); lp.topMargin = p; - lp.bottomMargin = p; + lp.bottomMargin = p * 2; addView(mDivider, lp); mUntilPager = new UntilPager(mContext, mPathPaint, iconSize * 3 / 4); mUntilPager.setId(android.R.id.tabhost); - lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); + lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); + lp.leftMargin = lp.rightMargin = iconSize / 2; + lp.addRule(CENTER_HORIZONTAL); lp.addRule(BELOW, mDivider.getId()); addView(mUntilPager, lp); - mAlarmWarning = new AlarmWarning(mContext); + mProgressDots = new ProgressDots(mContext, iconSize / 5); lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); lp.addRule(CENTER_HORIZONTAL); lp.addRule(BELOW, mUntilPager.getId()); - lp.bottomMargin = p; - addView(mAlarmWarning, lp); - } - - private void beginOrEnd() { - if (mAdapter == null) return; - if (mAdapter.getMode() == mAdapter.getCommittedMode()) { - // end - mAdapter.setCommittedMode(Adapter.MODE_OFF); - } else { - // begin - mAdapter.setCommittedMode(mAdapter.getMode()); - } - mAdapter.close(); + addView(mProgressDots, lp); } public void setAdapter(Adapter adapter) { @@ -191,55 +190,15 @@ public class ZenModeView extends RelativeLayout { } private void updateState(boolean animate) { - mModeSpinner.updateState(); mUntilPager.updateState(); - mAlarmWarning.updateState(animate); - final float settingsAlpha = isFull() ? 0 : SETTINGS_ALPHA; - if (settingsAlpha != mSettingsButton.getAlpha()) { - if (animate) { - mSettingsButton.animate().alpha(settingsAlpha).start(); - } else { - mSettingsButton.setAlpha(settingsAlpha); - } - } - final boolean committed = mAdapter != null - && mAdapter.getMode() == mAdapter.getCommittedMode(); - mActionButton.setText(committed ? "End" : "Begin"); - } - - private boolean isFull() { - return mAdapter != null && mAdapter.getMode() == Adapter.MODE_FULL; - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - if (DEBUG) log("onMeasure %s %s", - MeasureSpec.toString(widthMeasureSpec), MeasureSpec.toString(heightMeasureSpec)); - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - if (!isFull()) { - final LayoutParams lp = (LayoutParams) mModeSpinner.getLayoutParams(); - final int mh = vh(mModeSpinner) + vh(mDivider) + vh(mUntilPager) + lp.topMargin; - setMeasuredDimension(getMeasuredWidth(), mh); - } - } - - private int vh(View v) { - LayoutParams lp = (LayoutParams) v.getLayoutParams(); - return v.getMeasuredHeight() + lp.topMargin + lp.bottomMargin; + mModeSwitch.setChecked(mAdapter.getMode()); + mInit = true; } private static void log(String msg, Object... args) { Log.d(TAG, args == null || args.length == 0 ? msg : String.format(msg, args)); } - private static ShapeDrawable sd(Path p, int size, Paint pt) { - final ShapeDrawable sd = new ShapeDrawable(new PathShape(p, size, size)); - sd.getPaint().set(pt); - sd.setIntrinsicHeight(size); - sd.setIntrinsicWidth(size); - return sd; - } - private static void bounce(final View v, final Runnable midBounce) { v.animate().scaleX(BOUNCE_SCALE).scaleY(BOUNCE_SCALE).setDuration(DURATION / 3) .setListener(new AnimatorListenerAdapter() { @@ -257,118 +216,23 @@ public class ZenModeView extends RelativeLayout { }).start(); } - public static String modeToString(int mode) { - if (mode == Adapter.MODE_OFF) return "MODE_OFF"; - if (mode == Adapter.MODE_LIMITED) return "MODE_LIMITED"; - if (mode == Adapter.MODE_FULL) return "MODE_FULL"; - throw new IllegalArgumentException("Invalid mode: " + mode); - } - - public static String modeToLabel(int mode) { - if (mode == Adapter.MODE_LIMITED) return "Limited interruptions"; - if (mode == Adapter.MODE_FULL) return "Zero interruptions"; - throw new UnsupportedOperationException("Unsupported mode: " + mode); - } - - private final class UntilPager extends RelativeLayout { - private final ImageView mPrev; - private final ImageView mNext; - private final TextView mText1; - private final TextView mText2; - - private TextView mText; + private final class UntilView extends FrameLayout { + private static final boolean SUPPORT_LINKS = false; - public UntilPager(Context context, Paint pathPaint, int iconSize) { + private final TextView mText; + public UntilView(Context context) { super(context); - mText1 = new TextView(mContext); - mText1.setTextSize(TypedValue.COMPLEX_UNIT_PX, mText1.getTextSize() * 1.2f); - mText1.setTypeface(CONDENSED); - mText1.setTextColor(GRAY); - mText1.setGravity(Gravity.CENTER); - LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, iconSize); - addView(mText1, lp); - mText = mText1; - - mText2 = new TextView(mContext); - mText2.setTextSize(TypedValue.COMPLEX_UNIT_PX, mText1.getTextSize()); - mText2.setTypeface(CONDENSED); - mText2.setTextColor(GRAY); - mText2.setAlpha(0); - mText2.setGravity(Gravity.CENTER); - addView(mText2, lp); - - lp = new LayoutParams(iconSize, iconSize); - final View v = new View(mContext); - v.setBackgroundColor(BACKGROUND); - addView(v, lp); - mPrev = new ImageView(mContext); - mPrev.setId(android.R.id.button1); - mPrev.setImageDrawable(sd(prevPath(iconSize), iconSize, pathPaint)); - addView(mPrev, lp); - mPrev.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - onNav(v, -1); - } - }); - - lp = new LayoutParams(iconSize, iconSize); - lp.addRule(ALIGN_PARENT_RIGHT); - final View v2 = new View(mContext); - v2.setBackgroundColor(BACKGROUND); - addView(v2, lp); - mNext = new ImageView(mContext); - mNext.setId(android.R.id.button2); - mNext.setImageDrawable(sd(nextPath(iconSize), iconSize, pathPaint)); - addView(mNext, lp); - mNext.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - onNav(v, 1); - } - }); - - updateState(); + mText = new TextView(mContext); + mText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mText.getTextSize() * 1.2f); + mText.setTypeface(CONDENSED); + mText.setTextColor(GRAY); + mText.setGravity(Gravity.CENTER); + addView(mText); } - private void onNav(View v, int d) { - bounce(v, null); - if (mAdapter == null) { - return; - } - if (mAdapter.getExitConditionCount() == 1) { - horBounce(d); - return; - } - final int w = getWidth(); - final float s = Math.signum(d); - final TextView current = mText; - final TextView other = mText == mText1 ? mText2 : mText1; - final ExitCondition ec = mAdapter.getExitCondition(d); - setText(other, ec); - other.setTranslationX(-s * w); - other.animate().translationX(0).alpha(1).setDuration(DURATION).start(); - current.animate().translationX(s * w).alpha(0).setDuration(DURATION).start(); - mText = other; - mAdapter.select(ec); - } - - private void horBounce(int d) { - final int w = getWidth(); - mText.animate() - .setDuration(BOUNCE_DURATION) - .translationX(Math.signum(d) * w / 20) - .setListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - mText.animate().translationX(0).setListener(null).start(); - } - }).start(); - } - - private void setText(final TextView textView, final ExitCondition ec) { + public void setExitCondition(final ExitCondition ec) { SpannableStringBuilder ss = new SpannableStringBuilder(ec.summary); - if (ec.action != null) { + if (SUPPORT_LINKS && ec.action != null) { ss.setSpan(new CustomLinkSpan() { @Override public void onClick() { @@ -376,38 +240,122 @@ public class ZenModeView extends RelativeLayout { Toast.makeText(mContext, ec.action, Toast.LENGTH_SHORT).show(); } }, 0, ss.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); - textView.setMovementMethod(LinkMovementMethod.getInstance()); + mText.setMovementMethod(LinkMovementMethod.getInstance()); } else { - textView.setMovementMethod(null); + mText.setMovementMethod(null); + } + mText.setText(ss); + } + } + + private final class ProgressDots extends LinearLayout { + private final int mDotSize; + public ProgressDots(Context context, int dotSize) { + super(context); + setOrientation(HORIZONTAL); + mDotSize = dotSize; + } + + private void updateState(int current, int count) { + while (getChildCount() < count) { + View dot = new View(mContext); + OvalShape s = new OvalShape(); + ShapeDrawable sd = new ShapeDrawable(s); + + dot.setBackground(sd); + LayoutParams lp = new LayoutParams(mDotSize, mDotSize); + lp.leftMargin = lp.rightMargin = mDotSize / 2; + lp.topMargin = lp.bottomMargin = mDotSize * 2 / 3; + addView(dot, lp); + } + while (getChildCount() > count) { + removeViewAt(getChildCount() - 1); + } + final int N = getChildCount(); + for (int i = 0; i < N; i++) { + final int color = current == i ? GRAY : DARK_GRAY; + ((ShapeDrawable)getChildAt(i).getBackground()).setColorFilter(color, Mode.ADD); + } + } + } + + private final class UntilPager extends RelativeLayout { + private final UntilView[] mViews; + private int mCurrent; + private float mDownX; + + public UntilPager(Context context, Paint pathPaint, int iconSize) { + super(context); + mViews = new UntilView[3]; + for (int i = 0; i < mViews.length; i++) { + UntilView v = new UntilView(mContext); + LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, iconSize); + addView(v, lp); + mViews[i] = v; } - textView.setText(ss); + updateState(); + addOnLayoutChangeListener(new OnLayoutChangeListener() { + @Override + public void onLayoutChange(View v, int left, int top, int right, + int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { + if (left != oldLeft || right != oldRight) { + updateState(); + } + } + }); + setBackgroundColor(DARK_GRAY); } private void updateState() { if (mAdapter == null) { return; } - setText(mText, mAdapter.getExitCondition(0)); + UntilView current = mViews[mCurrent]; + current.setExitCondition(mAdapter.getExitCondition(0)); + UntilView next = mViews[mCurrent + 1 % 3]; + next.setExitCondition(mAdapter.getExitCondition(1)); + UntilView prev = mViews[mCurrent + 2 % 3]; + prev.setExitCondition(mAdapter.getExitCondition(-1)); + position(0, false); + mProgressDots.updateState(mAdapter.getExitConditionIndex(), + mAdapter.getExitConditionCount()); } - private Path prevPath(int size) { - final int hp = size * 3 / 8; - final int vp = size / 4; - final Path p = new Path(); - p.moveTo(size - hp, vp); - p.lineTo(hp, size / 2); - p.lineTo(size - hp, size - vp); - return p; + private void position(float dx, boolean animate) { + int w = getWidth(); + UntilView current = mViews[mCurrent]; + UntilView next = mViews[mCurrent + 1 % 3]; + UntilView prev = mViews[mCurrent + 2 % 3]; + if (animate) { + current.animate().setDuration(PAGER_DURATION).translationX(dx).start(); + next.animate().setDuration(PAGER_DURATION).translationX(w + dx).start(); + prev.animate().setDuration(PAGER_DURATION).translationX(-w + dx).start(); + } else { + current.setTranslationX(dx); + next.setTranslationX(w + dx); + prev.setTranslationX(-w + dx); + } } - private Path nextPath(int size) { - final int hp = size * 3 / 8; - final int vp = size / 4; - Path p = new Path(); - p.moveTo(hp, vp); - p.lineTo(size - hp, size / 2); - p.lineTo(hp, size - vp); - return p; + @Override + public boolean onTouchEvent(MotionEvent event) { + log("onTouchEvent " + MotionEvent.actionToString(event.getAction())); + if (event.getAction() == MotionEvent.ACTION_DOWN) { + mDownX = event.getX(); + } else if (event.getAction() == MotionEvent.ACTION_MOVE) { + float dx = event.getX() - mDownX; + position(dx, false); + } else if (event.getAction() == MotionEvent.ACTION_UP + || event.getAction() == MotionEvent.ACTION_CANCEL) { + float dx = event.getX() - mDownX; + int d = Math.abs(dx) < getWidth() / 3 ? 0 : Math.signum(dx) > 0 ? -1 : 1; + if (d != 0 && mAdapter.getExitConditionCount() > 1) { + mAdapter.select(mAdapter.getExitCondition(d)); + } else { + position(0, true); + } + } + return true; } } @@ -432,21 +380,16 @@ public class ZenModeView extends RelativeLayout { } public interface Adapter { - public static final int MODE_OFF = 0; - public static final int MODE_LIMITED = 1; - public static final int MODE_FULL = 2; - void configure(); void close(); - int getMode(); - void setMode(int mode); - int getCommittedMode(); - void setCommittedMode(int mode); + boolean getMode(); + void setMode(boolean mode); void select(ExitCondition ec); void init(); void setCallbacks(Callbacks callbacks); ExitCondition getExitCondition(int d); int getExitConditionCount(); + int getExitConditionIndex(); public static class ExitCondition { public String summary; @@ -459,110 +402,4 @@ public class ZenModeView extends RelativeLayout { void onChanged(); } } - - private final class ModeSpinner extends Spinner { - public ModeSpinner(final Context context) { - super(context); - setBackgroundResource(R.drawable.spinner_default_holo_dark_am_no_underline); - final ArrayAdapter<Integer> adapter = new ArrayAdapter<Integer>(mContext, 0) { - @Override - public View getView(int position, View convertView, ViewGroup parent) { - if (DEBUG) log("getView %s parent=%s", position, parent); - return getDropDownView(position, convertView, parent); - } - - @Override - public View getDropDownView(final int position, View convertView, ViewGroup parent) { - if (DEBUG) log("getDropDownView %s cv=%s parent=%s", - position, convertView, parent); - final TextView tv = convertView != null ? (TextView) convertView - : new TextView(context); - final int mode = getItem(position); - tv.setText(modeToLabel(mode)); - final boolean inDropdown = parent instanceof ListView; - if (convertView == null) { - if (DEBUG) log(" setting up view"); - tv.setTextColor(GRAY); - tv.setTypeface(CONDENSED); - tv.setAllCaps(true); - tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, tv.getTextSize() * 1.2f); - final int p = (int) tv.getTextSize() / 2; - if (inDropdown) { - tv.setPadding(p, p, 0, p); - } else { - tv.setGravity(Gravity.CENTER_HORIZONTAL); - tv.setPadding(p, 0, 0, 0); - } - } - tv.setOnTouchListener(new OnTouchListener(){ - @Override - public boolean onTouch(View v, MotionEvent event) { - if (DEBUG) log("onTouch %s %s inDropdown=%s", tv.getText(), - MotionEvent.actionToString(event.getAction()), inDropdown); - if (inDropdown && mAdapter != null) { - mAdapter.setMode(mode); - } - return false; - } - }); - return tv; - } - }; - adapter.add(Adapter.MODE_LIMITED); - adapter.add(Adapter.MODE_FULL); - setAdapter(adapter); - } - - public void updateState() { - int mode = mAdapter != null ? mAdapter.getMode() : Adapter.MODE_LIMITED; - if (mode == Adapter.MODE_OFF) { - mode = Adapter.MODE_LIMITED; - } - if (DEBUG) log("setSelectedMode " + mode); - for (int i = 0; i < getAdapter().getCount(); i++) { - if (getAdapter().getItem(i).equals(mode)) { - if (DEBUG) log(" setting selection = " + i); - setSelection(i, true); - onDetachedFromWindow(); - } - } - } - } - - private final class AlarmWarning extends LinearLayout { - public AlarmWarning(Context context) { - super(context); - setOrientation(HORIZONTAL); - - final TextView tv = new TextView(mContext); - tv.setTextColor(GRAY); - tv.setGravity(Gravity.TOP); - tv.setTypeface(CONDENSED); - tv.setText(FULL_TEXT); - addView(tv); - - final ImageView icon = new ImageView(mContext); - icon.setAlpha(.75f); - int size = (int)tv.getTextSize(); - icon.setImageResource(android.R.drawable.ic_dialog_alert); - LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(size, size); - final int p = size / 4; - lp.bottomMargin = lp.topMargin = lp.rightMargin = lp.leftMargin = p; - addView(icon, 0, lp); - setPadding(p, 0, p, p); - } - - public void updateState(boolean animate) { - final float alpha = isFull() ? 1 : 0; - if (alpha == getAlpha()) { - return; - } - if (animate) { - animate().alpha(alpha).start(); - } else { - setAlpha(alpha); - requestLayout(); - } - } - } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ZenModeViewAdapter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ZenModeViewAdapter.java index d2067a4..c97ba8d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ZenModeViewAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ZenModeViewAdapter.java @@ -39,8 +39,7 @@ public abstract class ZenModeViewAdapter implements ZenModeView.Adapter { private Callbacks mCallbacks; private int mExitIndex; - private int mMode; - private int mCommittedMode; + private boolean mMode; public ZenModeViewAdapter(Context context) { mContext = context; @@ -51,27 +50,15 @@ public abstract class ZenModeViewAdapter implements ZenModeView.Adapter { } @Override - public int getMode() { + public boolean getMode() { return mMode; } @Override - public void setMode(int mode) { + public void setMode(boolean mode) { if (mode == mMode) return; mMode = mode; - dispatchChanged(); - } - - @Override - public int getCommittedMode() { - return mCommittedMode; - } - - @Override - public void setCommittedMode(int mode) { - final int v = mode == MODE_LIMITED ? Settings.Global.ZEN_MODE_LIMITED - : mode == MODE_FULL ? Settings.Global.ZEN_MODE_FULL - : Settings.Global.ZEN_MODE_OFF; + final int v = mMode ? Settings.Global.ZEN_MODE_ON : Settings.Global.ZEN_MODE_OFF; AsyncTask.execute(new Runnable() { @Override public void run() { @@ -79,6 +66,7 @@ public abstract class ZenModeViewAdapter implements ZenModeView.Adapter { Settings.Global.ZEN_MODE, v); } }); + dispatchChanged(); } @Override @@ -87,11 +75,6 @@ public abstract class ZenModeViewAdapter implements ZenModeView.Adapter { mExitIndex = 0; dispatchChanged(); } - final int mode = mCommittedMode == MODE_FULL ? MODE_FULL : MODE_LIMITED; - if (mode != mMode) { - mMode = mode; - dispatchChanged(); - } } private void dispatchChanged() { @@ -122,6 +105,11 @@ public abstract class ZenModeViewAdapter implements ZenModeView.Adapter { } @Override + public int getExitConditionIndex() { + return mExitIndex; + } + + @Override public void select(ExitCondition ec) { final int i = mExits.indexOf(ec); if (i == -1 || i == mExitIndex) { @@ -171,15 +159,13 @@ public abstract class ZenModeViewAdapter implements ZenModeView.Adapter { } private void loadSettings() { - mCommittedMode = getModeFromSetting(); + mMode = getModeFromSetting(); } - private int getModeFromSetting() { + private boolean getModeFromSetting() { final int v = Settings.Global.getInt(mResolver, Settings.Global.ZEN_MODE, Settings.Global.ZEN_MODE_OFF); - if (v == Settings.Global.ZEN_MODE_LIMITED) return MODE_LIMITED; - if (v == Settings.Global.ZEN_MODE_FULL) return MODE_FULL; - return MODE_OFF; + return v != Settings.Global.ZEN_MODE_OFF; } } } diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 00813c5..3bc7f4f 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -2558,7 +2558,7 @@ public class NotificationManagerService extends SystemService { exceptionPackages); // alarm restrictions - final boolean muteAlarms = mZenMode == Settings.Global.ZEN_MODE_FULL; + final boolean muteAlarms = false; // TODO until we save user config mAppOps.setRestriction(AppOpsManager.OP_VIBRATE, AudioManager.STREAM_ALARM, muteAlarms ? AppOpsManager.MODE_IGNORED : AppOpsManager.MODE_ALLOWED, exceptionPackages); @@ -2595,10 +2595,8 @@ public class NotificationManagerService extends SystemService { } private boolean shouldIntercept(String pkg, Notification n) { - if (mZenMode == Settings.Global.ZEN_MODE_LIMITED) { + if (mZenMode != Settings.Global.ZEN_MODE_OFF) { return !isAlarm(pkg, n); - } else if (mZenMode == Settings.Global.ZEN_MODE_FULL) { - return true; } return false; } |
