diff options
Diffstat (limited to 'packages')
19 files changed, 267 insertions, 56 deletions
diff --git a/packages/Keyguard/res/drawable-hdpi/ic_alarm_small.png b/packages/Keyguard/res/drawable-hdpi/ic_alarm_small.png Binary files differdeleted file mode 100644 index 3819029..0000000 --- a/packages/Keyguard/res/drawable-hdpi/ic_alarm_small.png +++ /dev/null diff --git a/packages/Keyguard/res/drawable-mdpi/ic_alarm_small.png b/packages/Keyguard/res/drawable-mdpi/ic_alarm_small.png Binary files differdeleted file mode 100644 index 2aeedaf..0000000 --- a/packages/Keyguard/res/drawable-mdpi/ic_alarm_small.png +++ /dev/null diff --git a/packages/Keyguard/res/drawable-sw600dp-hdpi/ic_alarm_small.png b/packages/Keyguard/res/drawable-sw600dp-hdpi/ic_alarm_small.png Binary files differdeleted file mode 100644 index e28b3f6..0000000 --- a/packages/Keyguard/res/drawable-sw600dp-hdpi/ic_alarm_small.png +++ /dev/null diff --git a/packages/Keyguard/res/drawable-sw600dp-mdpi/ic_alarm_small.png b/packages/Keyguard/res/drawable-sw600dp-mdpi/ic_alarm_small.png Binary files differdeleted file mode 100644 index f727d01..0000000 --- a/packages/Keyguard/res/drawable-sw600dp-mdpi/ic_alarm_small.png +++ /dev/null diff --git a/packages/Keyguard/res/drawable-sw600dp-xhdpi/ic_alarm_small.png b/packages/Keyguard/res/drawable-sw600dp-xhdpi/ic_alarm_small.png Binary files differdeleted file mode 100644 index d9c0623..0000000 --- a/packages/Keyguard/res/drawable-sw600dp-xhdpi/ic_alarm_small.png +++ /dev/null diff --git a/packages/Keyguard/res/drawable-sw600dp-xxhdpi/ic_alarm_small.png b/packages/Keyguard/res/drawable-sw600dp-xxhdpi/ic_alarm_small.png Binary files differdeleted file mode 100644 index a36bf1f..0000000 --- a/packages/Keyguard/res/drawable-sw600dp-xxhdpi/ic_alarm_small.png +++ /dev/null diff --git a/packages/Keyguard/res/drawable-xhdpi/ic_alarm_small.png b/packages/Keyguard/res/drawable-xhdpi/ic_alarm_small.png Binary files differdeleted file mode 100644 index 0290bdc..0000000 --- a/packages/Keyguard/res/drawable-xhdpi/ic_alarm_small.png +++ /dev/null diff --git a/packages/Keyguard/res/drawable-xxhdpi/ic_alarm_small.png b/packages/Keyguard/res/drawable-xxhdpi/ic_alarm_small.png Binary files differdeleted file mode 100644 index 66968e8..0000000 --- a/packages/Keyguard/res/drawable-xxhdpi/ic_alarm_small.png +++ /dev/null diff --git a/packages/Keyguard/res/drawable/ic_access_alarms_big.xml b/packages/Keyguard/res/drawable/ic_access_alarms_big.xml new file mode 100644 index 0000000..84ccb7c --- /dev/null +++ b/packages/Keyguard/res/drawable/ic_access_alarms_big.xml @@ -0,0 +1,25 @@ +<!-- +Copyright (C) 2014 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="18dp" + android:height="18dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + + <path + android:fillColor="@color/clock_gray" + android:pathData="M22.0,5.7l-4.6,-3.9l-1.3,1.5l4.6,3.9L22.0,5.7zM7.9,3.4L6.6,1.9L2.0,5.7l1.3,1.5L7.9,3.4zM12.5,8.0L11.0,8.0l0.0,6.0l4.7,2.9l0.8,-1.2l-4.0,-2.4L12.5,8.0zM12.0,4.0c-5.0,0.0 -9.0,4.0 -9.0,9.0c0.0,5.0 4.0,9.0 9.0,9.0s9.0,-4.0 9.0,-9.0C21.0,8.0 17.0,4.0 12.0,4.0zM12.0,20.0c-3.9,0.0 -7.0,-3.1 -7.0,-7.0c0.0,-3.9 3.1,-7.0 7.0,-7.0c3.9,0.0 7.0,3.1 7.0,7.0C19.0,16.9 15.9,20.0 12.0,20.0z"/> +</vector> diff --git a/packages/Keyguard/res/layout/keyguard_status_area.xml b/packages/Keyguard/res/layout/keyguard_status_area.xml index 2730517..7d8977c 100644 --- a/packages/Keyguard/res/layout/keyguard_status_area.xml +++ b/packages/Keyguard/res/layout/keyguard_status_area.xml @@ -35,13 +35,11 @@ <TextView android:id="@+id/alarm_status" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:drawablePadding="2dip" - android:drawableLeft="@drawable/ic_alarm_small" - android:drawableStart="@drawable/ic_alarm_small" + android:drawablePadding="6dp" + android:drawableStart="@drawable/ic_access_alarms_big" android:textColor="@color/clock_gray" style="@style/widget_label" - android:layout_marginLeft="8dip" - android:layout_marginStart="8dip" + android:layout_marginStart="6dp" android:gravity="center" android:visibility="gone" /> diff --git a/packages/Keyguard/res/values/donottranslate.xml b/packages/Keyguard/res/values/donottranslate.xml index 78636db..2f54406 100644 --- a/packages/Keyguard/res/values/donottranslate.xml +++ b/packages/Keyguard/res/values/donottranslate.xml @@ -18,6 +18,9 @@ <!-- Skeleton string format for displaying the date. --> <string name="abbrev_wday_month_day_no_year">EEEEMMMMd</string> + <!-- Skeleton string format for displaying the date when an alarm is set. --> + <string name="abbrev_wday_month_day_no_year_alarm">EEEMMMMd</string> + <!-- Skeleton string format for displaying the time in 12-hour format. --> <string name="clock_12hr_format">hm</string> diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java index 02a441b..ce673d3 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java @@ -71,6 +71,11 @@ public class KeyguardStatusView extends GridLayout { public void onScreenTurnedOff(int why) { setEnableMarquee(false); } + + @Override + public void onUserSwitchComplete(int userId) { + refresh(); + } }; public KeyguardStatusView(Context context) { @@ -110,7 +115,8 @@ public class KeyguardStatusView extends GridLayout { } protected void refresh() { - Patterns.update(mContext); + AlarmClockInfo nextAlarm = mLockPatternUtils.getNextAlarm(); + Patterns.update(mContext, nextAlarm != null); mDateView.setFormat24Hour(Patterns.dateView); mDateView.setFormat12Hour(Patterns.dateView); @@ -118,25 +124,23 @@ public class KeyguardStatusView extends GridLayout { mClockView.setFormat12Hour(Patterns.clockView12); mClockView.setFormat24Hour(Patterns.clockView24); - refreshAlarmStatus(); + refreshAlarmStatus(nextAlarm); } - void refreshAlarmStatus() { - // Update Alarm status - AlarmClockInfo nextAlarm = mLockPatternUtils.getNextAlarm(); + void refreshAlarmStatus(AlarmClockInfo nextAlarm) { if (nextAlarm != null) { - mAlarmStatusView.setText(formatNextAlarm(nextAlarm)); + mAlarmStatusView.setText(formatNextAlarm(mContext, nextAlarm)); mAlarmStatusView.setVisibility(View.VISIBLE); } else { mAlarmStatusView.setVisibility(View.GONE); } } - String formatNextAlarm(AlarmClockInfo info) { + public static String formatNextAlarm(Context context, AlarmClockInfo info) { if (info == null) { return ""; } - String skeleton = DateFormat.is24HourFormat(mContext) ? "EHm" : "Ehma"; + String skeleton = DateFormat.is24HourFormat(context) ? "EHm" : "Ehma"; String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), skeleton); return DateFormat.format(pattern, info.getTriggerTime()).toString(); } @@ -191,10 +195,12 @@ public class KeyguardStatusView extends GridLayout { static String clockView24; static String cacheKey; - static void update(Context context) { + static void update(Context context, boolean hasAlarm) { final Locale locale = Locale.getDefault(); final Resources res = context.getResources(); - final String dateViewSkel = res.getString(R.string.abbrev_wday_month_day_no_year); + final String dateViewSkel = res.getString(hasAlarm + ? R.string.abbrev_wday_month_day_no_year_alarm + : R.string.abbrev_wday_month_day_no_year); final String clockView12Skel = res.getString(R.string.clock_12hr_format); final String clockView24Skel = res.getString(R.string.clock_24hr_format); final String key = locale.toString() + dateViewSkel + clockView12Skel + clockView24Skel; diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java index a5dbbcb..f0f5772 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -17,6 +17,7 @@ package com.android.keyguard; import android.app.ActivityManagerNative; +import android.app.AlarmManager; import android.app.IUserSwitchObserver; import android.app.PendingIntent; import android.app.admin.DevicePolicyManager; @@ -322,7 +323,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { if (Intent.ACTION_TIME_TICK.equals(action) || Intent.ACTION_TIME_CHANGED.equals(action) - || Intent.ACTION_TIMEZONE_CHANGED.equals(action)) { + || Intent.ACTION_TIMEZONE_CHANGED.equals(action) + || AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED.equals(action)) { mHandler.sendEmptyMessage(MSG_TIME_UPDATE); } else if (TelephonyIntents.SPN_STRINGS_UPDATED_ACTION.equals(action)) { mTelephonyPlmn = getTelephonyPlmnFrom(intent); @@ -568,6 +570,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION); filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED); filter.addAction(Intent.ACTION_USER_REMOVED); + filter.addAction(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED); context.registerReceiver(mBroadcastReceiver, filter); final IntentFilter bootCompleteFilter = new IntentFilter(); diff --git a/packages/SystemUI/res/drawable/ic_access_alarms_small.xml b/packages/SystemUI/res/drawable/ic_access_alarms_small.xml new file mode 100644 index 0000000..cf64689 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_access_alarms_small.xml @@ -0,0 +1,25 @@ +<!-- +Copyright (C) 2014 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="16dp" + android:height="16dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + + <path + android:fillColor="#64ffffff" + android:pathData="M22.0,5.7l-4.6,-3.9l-1.3,1.5l4.6,3.9L22.0,5.7zM7.9,3.4L6.6,1.9L2.0,5.7l1.3,1.5L7.9,3.4zM12.5,8.0L11.0,8.0l0.0,6.0l4.7,2.9l0.8,-1.2l-4.0,-2.4L12.5,8.0zM12.0,4.0c-5.0,0.0 -9.0,4.0 -9.0,9.0c0.0,5.0 4.0,9.0 9.0,9.0s9.0,-4.0 9.0,-9.0C21.0,8.0 17.0,4.0 12.0,4.0zM12.0,20.0c-3.9,0.0 -7.0,-3.1 -7.0,-7.0c0.0,-3.9 3.1,-7.0 7.0,-7.0c3.9,0.0 7.0,3.1 7.0,7.0C19.0,16.9 15.9,20.0 12.0,20.0z"/> +</vector> diff --git a/packages/SystemUI/res/layout/status_bar_expanded_header.xml b/packages/SystemUI/res/layout/status_bar_expanded_header.xml index 272904a..5b54eb3 100644 --- a/packages/SystemUI/res/layout/status_bar_expanded_header.xml +++ b/packages/SystemUI/res/layout/status_bar_expanded_header.xml @@ -87,24 +87,15 @@ android:text="@*android:string/emergency_calls_only" android:gravity="center_vertical" /> - <RelativeLayout - android:id="@+id/datetime" + <FrameLayout + android:id="@+id/date_group" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="start" - android:paddingTop="4dp" - android:paddingStart="16dp" - android:paddingEnd="16dp" - android:background="?android:attr/selectableItemBackground" - android:enabled="false" - > - <include layout="@layout/split_clock_view" - android:id="@+id/clock" - /> - + android:layout_alignParentBottom="true"> <com.android.systemui.statusbar.policy.DateView android:id="@+id/date_collapsed" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginStart="16dp" android:singleLine="true" android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Date" android:layout_below="@id/clock" @@ -113,12 +104,40 @@ <com.android.systemui.statusbar.policy.DateView android:id="@+id/date_expanded" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginStart="16dp" android:singleLine="true" android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Date" android:layout_below="@id/clock" systemui:datePattern="eeeeMMMMd" /> - </RelativeLayout> + </FrameLayout> + + <include layout="@layout/split_clock_view" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="16dp" + android:layout_above="@id/date_group" + android:id="@+id/clock" + /> + + <Button android:id="@+id/alarm_status" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentBottom="true" + android:layout_toEndOf="@id/date_group" + android:layout_marginBottom="4dp" + android:drawablePadding="6dp" + android:drawableStart="@drawable/ic_access_alarms_small" + android:textColor="#64ffffff" + android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Date" + android:paddingEnd="6dp" + android:paddingStart="6dp" + android:paddingTop="16dp" + android:paddingBottom="16dp" + android:background="?android:attr/selectableItemBackground" + android:visibility="gone" + /> + <com.android.keyguard.CarrierText android:id="@+id/keyguard_carrier_text" android:layout_width="match_parent" diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index fbd3eb5..f9805ba 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -353,6 +353,9 @@ <!-- The padding bottom of the clock group when QS is expanded. --> <dimen name="clock_expanded_bottom_margin">20dp</dimen> + <!-- The padding bottom of the clock group when QS is collapsed. --> + <dimen name="clock_collapsed_bottom_margin">10dp</dimen> + <!-- The width of the multi user switch on keyguard and collapsed QS header. --> <dimen name="multi_user_switch_width_collapsed">34dp</dimen> 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 0218066..a0b4b4c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -70,7 +70,6 @@ import android.os.Message; import android.os.PowerManager; import android.os.RemoteException; import android.os.SystemClock; -import android.os.Trace; import android.os.UserHandle; import android.provider.Settings; import android.service.notification.NotificationListenerService.RankingMap; @@ -130,6 +129,7 @@ import com.android.systemui.statusbar.SignalClusterView; import com.android.systemui.statusbar.SpeedBumpView; import com.android.systemui.statusbar.StatusBarIconView; import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.policy.NextAlarmController; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback; import com.android.systemui.statusbar.policy.BluetoothControllerImpl; @@ -224,6 +224,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, KeyguardUserSwitcher mKeyguardUserSwitcher; FlashlightController mFlashlightController; UserSwitcherController mUserSwitcherController; + NextAlarmController mNextAlarmController; KeyguardMonitor mKeyguardMonitor; int mNaturalBarHeight = -1; @@ -282,7 +283,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, private long mKeyguardFadingAwayDuration; int mKeyguardMaxNotificationCount; - View mDateTimeView; // carrier/wifi label private TextView mCarrierLabel; @@ -702,12 +702,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, (KeyguardIndicationTextView) mStatusBarWindow.findViewById( R.id.keyguard_indication_text)); - mDateTimeView = mHeader.findViewById(R.id.datetime); - if (mDateTimeView != null) { - mDateTimeView.setOnClickListener(mClockClickListener); - mDateTimeView.setEnabled(true); - } - mTickerEnabled = res.getBoolean(R.bool.enable_ticker); if (mTickerEnabled) { final ViewStub tickerStub = (ViewStub) mStatusBarView.findViewById(R.id.ticker_stub); @@ -784,6 +778,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mFlashlightController = new FlashlightController(mContext); mKeyguardBottomArea.setFlashlightController(mFlashlightController); mUserSwitcherController = new UserSwitcherController(mContext); + mNextAlarmController = new NextAlarmController(mContext); mKeyguardMonitor = new KeyguardMonitor(); mKeyguardUserSwitcher = new KeyguardUserSwitcher(mContext, @@ -815,6 +810,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mUserInfoController.reloadUserInfo(); mHeader.setBatteryController(mBatteryController); + mHeader.setNextAlarmController(mNextAlarmController); PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); mBroadcastReceiver.onReceive(mContext, @@ -2802,6 +2798,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, if (mBatteryController != null) { mBatteryController.dump(fd, pw, args); } + if (mNextAlarmController != null) { + mNextAlarmController.dump(fd, pw, args); + } } private String hunStateToString(Entry entry) { @@ -2858,6 +2857,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, public void startActivityDismissingKeyguard(final Intent intent, boolean onlyProvisioned) { if (onlyProvisioned && !isDeviceProvisioned()) return; + final boolean keyguardShowing = mStatusBarKeyguardViewManager.isShowing(); dismissKeyguardThenExecute(new OnDismissAction() { @Override public boolean onDismiss() { @@ -2868,7 +2868,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); mContext.startActivityAsUser( intent, new UserHandle(UserHandle.USER_CURRENT)); - mWindowManagerService.overridePendingAppTransition(null, 0, 0, null); + if (keyguardShowing) { + mWindowManagerService.overridePendingAppTransition( + null, 0, 0, null); + } } catch (RemoteException e) { } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java index 65359ee..aaef60e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.phone; +import android.app.AlarmClockInfo; +import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.graphics.Outline; @@ -31,18 +33,20 @@ import android.widget.RelativeLayout; import android.widget.Switch; import android.widget.TextView; +import com.android.keyguard.KeyguardStatusView; import com.android.systemui.R; import com.android.systemui.qs.QSPanel; import com.android.systemui.qs.QSTile; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.KeyguardUserSwitcher; +import com.android.systemui.statusbar.policy.NextAlarmController; import com.android.systemui.statusbar.policy.UserInfoController; /** * The view to manage the header area in the expanded status bar. */ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickListener, - BatteryController.BatteryStateChangeCallback { + BatteryController.BatteryStateChangeCallback, NextAlarmController.NextAlarmChangeCallback { private boolean mExpanded; private boolean mListening; @@ -52,7 +56,8 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL private ViewGroup mSystemIconsContainer; private View mSystemIconsSuperContainer; - private View mDateTime; + private View mDateGroup; + private View mClock; private View mTime; private View mAmPm; private View mKeyguardCarrierText; @@ -68,9 +73,12 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL private Switch mQsDetailHeaderSwitch; private View mEmergencyCallsOnly; private TextView mBatteryLevel; + private TextView mAlarmStatus; private boolean mShowEmergencyCallsOnly; private boolean mKeyguardUserSwitcherShowing; + private boolean mAlarmShowing; + private AlarmClockInfo mNextAlarm; private int mCollapsedHeight; private int mExpandedHeight; @@ -84,6 +92,7 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL private int mMultiUserKeyguardMargin; private int mSystemIconsSwitcherHiddenExpandedMargin; private int mClockMarginBottomExpanded; + private int mClockMarginBottomCollapsed; private int mMultiUserSwitchWidthCollapsed; private int mMultiUserSwitchWidthExpanded; private int mBatteryPaddingEnd; @@ -97,6 +106,7 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL private ActivityStarter mActivityStarter; private BatteryController mBatteryController; + private NextAlarmController mNextAlarmController; private QSPanel mQSPanel; private KeyguardUserSwitcher mKeyguardUserSwitcher; @@ -113,7 +123,8 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL mSystemIconsSuperContainer = findViewById(R.id.system_icons_super_container); mSystemIconsContainer = (ViewGroup) findViewById(R.id.system_icons_container); mSystemIconsSuperContainer.setOnClickListener(this); - mDateTime = findViewById(R.id.datetime); + mDateGroup = findViewById(R.id.date_group); + mClock = findViewById(R.id.clock); mTime = findViewById(R.id.time_view); mAmPm = findViewById(R.id.am_pm_view); mKeyguardCarrierText = findViewById(R.id.keyguard_carrier_text); @@ -129,6 +140,8 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL mQsDetailHeaderSwitch = (Switch) mQsDetailHeader.findViewById(android.R.id.toggle); mEmergencyCallsOnly = findViewById(R.id.header_emergency_calls_only); mBatteryLevel = (TextView) findViewById(R.id.battery_level); + mAlarmStatus = (TextView) findViewById(R.id.alarm_status); + mAlarmStatus.setOnClickListener(this); loadDimens(); updateVisibilities(); updateClockScale(); @@ -175,6 +188,8 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL R.dimen.system_icons_switcher_hidden_expanded_margin); mClockMarginBottomExpanded = getResources().getDimensionPixelSize(R.dimen.clock_expanded_bottom_margin); + mClockMarginBottomCollapsed = + getResources().getDimensionPixelSize(R.dimen.clock_collapsed_bottom_margin); mMultiUserSwitchWidthCollapsed = getResources().getDimensionPixelSize(R.dimen.multi_user_switch_width_collapsed); mMultiUserSwitchWidthExpanded = @@ -197,6 +212,10 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL mBatteryController = batteryController; } + public void setNextAlarmController(NextAlarmController nextAlarmController) { + mNextAlarmController = nextAlarmController; + } + public int getCollapsedHeight() { return mKeyguardShowing ? mKeyguardHeight : mCollapsedHeight; } @@ -210,7 +229,7 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL return; } mListening = listening; - updateBatteryListening(); + updateListeners(); } public void setExpanded(boolean expanded, boolean overscrolled) { @@ -282,10 +301,15 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL } else { setBackgroundResource(R.drawable.notification_header_bg); } - mDateTime.setVisibility(onKeyguardAndCollapsed ? View.INVISIBLE : View.VISIBLE); + mDateGroup.setVisibility(onKeyguardAndCollapsed ? View.INVISIBLE : View.VISIBLE); + mClock.setVisibility(onKeyguardAndCollapsed ? View.INVISIBLE : View.VISIBLE); mKeyguardCarrierText.setVisibility(onKeyguardAndCollapsed ? View.VISIBLE : View.GONE); - mDateCollapsed.setVisibility(mExpanded && !mOverscrolled ? View.GONE : View.VISIBLE); - mDateExpanded.setVisibility(mExpanded && !mOverscrolled ? View.VISIBLE : View.GONE); + mDateCollapsed.setVisibility(mExpanded && !mOverscrolled && mAlarmShowing + ? View.VISIBLE : View.GONE); + mDateExpanded.setVisibility(mExpanded && !mOverscrolled && mAlarmShowing + ? View.GONE : View.VISIBLE); + mAlarmStatus.setVisibility(mExpanded && !mOverscrolled && mAlarmShowing + ? View.VISIBLE : View.GONE); mSettingsButton.setVisibility(mExpanded && !mOverscrolled ? View.VISIBLE : View.GONE); mQsDetailHeader.setVisibility(mExpanded ? View.VISIBLE : View.GONE); if (mStatusIcons != null) { @@ -319,11 +343,13 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL mSystemIconsSuperContainer.setLayoutParams(lp); } - private void updateBatteryListening() { + private void updateListeners() { if (mListening) { mBatteryController.addStateChangedCallback(this); + mNextAlarmController.addStateChangedCallback(this); } else { mBatteryController.removeStateChangedCallback(this); + mNextAlarmController.removeStateChangedCallback(this); } } @@ -375,15 +401,26 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL // could not care less } + @Override + public void onNextAlarmChanged(AlarmClockInfo nextAlarm) { + mNextAlarm = nextAlarm; + if (nextAlarm != null) { + mAlarmStatus.setText(KeyguardStatusView.formatNextAlarm(getContext(), nextAlarm)); + } + mAlarmShowing = nextAlarm != null; + updateVisibilities(); + } + + private void updateClickTargets() { setClickable(!mKeyguardShowing || mExpanded); - mDateTime.setClickable(mExpanded); boolean keyguardSwitcherAvailable = mKeyguardUserSwitcher != null && mKeyguardShowing && !mExpanded; mMultiUserSwitch.setClickable(mExpanded || keyguardSwitcherAvailable); mMultiUserSwitch.setKeyguardMode(keyguardSwitcherAvailable); mSystemIconsSuperContainer.setClickable(mExpanded); + mAlarmStatus.setClickable(mNextAlarm != null && mNextAlarm.getShowIntent() != null); } private void updateZTranslation() { @@ -404,14 +441,13 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL } private void updateClockLp() { - int marginBottom = mExpanded && !mOverscrolled ? mClockMarginBottomExpanded : 0; - LayoutParams lp = (LayoutParams) mDateTime.getLayoutParams(); - int rule = mExpanded && !mOverscrolled ? TRUE : 0; - if (marginBottom != lp.bottomMargin - || lp.getRules()[RelativeLayout.ALIGN_PARENT_BOTTOM] != rule) { + int marginBottom = mExpanded && !mOverscrolled + ? mClockMarginBottomExpanded + : mClockMarginBottomCollapsed; + LayoutParams lp = (LayoutParams) mDateGroup.getLayoutParams(); + if (marginBottom != lp.bottomMargin) { lp.bottomMargin = marginBottom; - lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, rule); - mDateTime.setLayoutParams(lp); + mDateGroup.setLayoutParams(lp); } } @@ -499,6 +535,11 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL startSettingsActivity(); } else if (v == mSystemIconsSuperContainer) { startBatteryActivity(); + } else if (v == mAlarmStatus && mNextAlarm != null) { + PendingIntent showIntent = mNextAlarm.getShowIntent(); + if (showIntent != null && showIntent.isActivity()) { + mActivityStarter.startActivity(showIntent.getIntent()); + } } } @@ -613,7 +654,8 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL private void handleShowingDetail(final QSTile.DetailAdapter detail) { final boolean showingDetail = detail != null; - transition(mDateTime, !showingDetail); + transition(mClock, !showingDetail); + transition(mDateGroup, !showingDetail); transition(mQsDetailHeader, showingDetail); if (showingDetail) { mQsDetailHeaderTitle.setText(detail.getTitle()); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NextAlarmController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NextAlarmController.java new file mode 100644 index 0000000..ca71521 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NextAlarmController.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2014 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.statusbar.policy; + +import android.app.AlarmClockInfo; +import android.app.AlarmManager; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.UserHandle; + +import java.io.FileDescriptor; +import java.io.PrintWriter; +import java.util.ArrayList; + +public class NextAlarmController extends BroadcastReceiver { + + private final ArrayList<NextAlarmChangeCallback> mChangeCallbacks = new ArrayList<>(); + + private AlarmManager mAlarmManager; + private AlarmClockInfo mNextAlarm; + + public NextAlarmController(Context context) { + mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_USER_SWITCHED); + filter.addAction(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED); + context.registerReceiver(this, filter); + updateNextAlarm(); + } + + public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + pw.println("NextAlarmController state:"); + pw.print(" mNextAlarm="); pw.println(mNextAlarm); + } + + public void addStateChangedCallback(NextAlarmChangeCallback cb) { + mChangeCallbacks.add(cb); + cb.onNextAlarmChanged(mNextAlarm); + } + + public void removeStateChangedCallback(NextAlarmChangeCallback cb) { + mChangeCallbacks.remove(cb); + } + + public void onReceive(Context context, Intent intent) { + final String action = intent.getAction(); + if (action.equals(Intent.ACTION_USER_SWITCHED) + || action.equals(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED)) { + updateNextAlarm(); + } + } + + private void updateNextAlarm() { + mNextAlarm = mAlarmManager.getNextAlarmClock(UserHandle.USER_CURRENT); + fireNextAlarmChanged(); + } + + private void fireNextAlarmChanged() { + int n = mChangeCallbacks.size(); + for (int i = 0; i < n; i++) { + mChangeCallbacks.get(i).onNextAlarmChanged(mNextAlarm); + } + } + + public interface NextAlarmChangeCallback { + void onNextAlarmChanged(AlarmClockInfo nextAlarm); + } +} |