1f47699dd4704917713004099b5e3609be48653c4Patrick Scott/* 2f47699dd4704917713004099b5e3609be48653c4Patrick Scott * Copyright (C) 2009 The Android Open Source Project 3f47699dd4704917713004099b5e3609be48653c4Patrick Scott * 4f47699dd4704917713004099b5e3609be48653c4Patrick Scott * Licensed under the Apache License, Version 2.0 (the "License"); 5f47699dd4704917713004099b5e3609be48653c4Patrick Scott * you may not use this file except in compliance with the License. 6f47699dd4704917713004099b5e3609be48653c4Patrick Scott * You may obtain a copy of the License at 7f47699dd4704917713004099b5e3609be48653c4Patrick Scott * 8f47699dd4704917713004099b5e3609be48653c4Patrick Scott * http://www.apache.org/licenses/LICENSE-2.0 9f47699dd4704917713004099b5e3609be48653c4Patrick Scott * 10f47699dd4704917713004099b5e3609be48653c4Patrick Scott * Unless required by applicable law or agreed to in writing, software 11f47699dd4704917713004099b5e3609be48653c4Patrick Scott * distributed under the License is distributed on an "AS IS" BASIS, 12f47699dd4704917713004099b5e3609be48653c4Patrick Scott * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f47699dd4704917713004099b5e3609be48653c4Patrick Scott * See the License for the specific language governing permissions and 14f47699dd4704917713004099b5e3609be48653c4Patrick Scott * limitations under the License. 15f47699dd4704917713004099b5e3609be48653c4Patrick Scott */ 16f47699dd4704917713004099b5e3609be48653c4Patrick Scott 17fa954248b41b567dfa2ddd7bd063d3936a51758eDaniel Sandlerpackage com.android.deskclock; 18f47699dd4704917713004099b5e3609be48653c4Patrick Scott 19aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport android.app.Activity; 20aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport android.app.Notification; 21aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport android.app.NotificationManager; 22aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport android.app.PendingIntent; 23aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport android.content.BroadcastReceiver; 241d5208e88385c9fc2ef7f7fa34a236832a192a5dDmitri Plotnikovimport android.content.Context; 25aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport android.content.Intent; 26aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport android.content.IntentFilter; 2735f68aa92e49331272104a7a5c72046b2c82496dIsaac Katzenelsonimport android.content.pm.ActivityInfo; 28c4861cb16c93248e03bfe30b06d728318a990227Isaac Katzenelsonimport android.content.res.Configuration; 2929dbeab977ead46e10efce114e1f21a55d556100Dianne Hackbornimport android.os.Bundle; 303012eefc84559507168982a7fc53dff667582b00Chiao Chengimport android.os.Handler; 313012eefc84559507168982a7fc53dff667582b00Chiao Chengimport android.os.Message; 32aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport android.preference.PreferenceManager; 33aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport android.view.KeyEvent; 34aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport android.view.LayoutInflater; 351d5208e88385c9fc2ef7f7fa34a236832a192a5dDmitri Plotnikovimport android.view.View; 36aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport android.view.Window; 3729dbeab977ead46e10efce114e1f21a55d556100Dianne Hackbornimport android.view.WindowManager; 38706506639cb0da2c0db06ef88f2d2c9d75b084ccDaniel Sandlerimport android.widget.TextView; 39aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport android.widget.Toast; 40aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 413012eefc84559507168982a7fc53dff667582b00Chiao Chengimport com.android.deskclock.widget.multiwaveview.GlowPadView; 423012eefc84559507168982a7fc53dff667582b00Chiao Cheng 43aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport java.util.Calendar; 44f47699dd4704917713004099b5e3609be48653c4Patrick Scott 45f47699dd4704917713004099b5e3609be48653c4Patrick Scott/** 46aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott * Alarm Clock alarm alert: pops visible indicator and plays alarm 47aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott * tone. This activity is the full screen version which shows over the lock 48aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott * screen with the wallpaper as the background. 49f47699dd4704917713004099b5e3609be48653c4Patrick Scott */ 503012eefc84559507168982a7fc53dff667582b00Chiao Chengpublic class AlarmAlertFullScreen extends Activity implements GlowPadView.OnTriggerListener { 51aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 52ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson private final boolean LOG = true; 53aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // These defaults must match the values in res/xml/settings.xml 54aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott private static final String DEFAULT_SNOOZE = "10"; 55aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott private static final String DEFAULT_VOLUME_BEHAVIOR = "2"; 56aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott protected static final String SCREEN_OFF = "screen_off"; 57aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 58aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott protected Alarm mAlarm; 59aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott private int mVolumeBehavior; 60706506639cb0da2c0db06ef88f2d2c9d75b084ccDaniel Sandler boolean mFullscreenStyle; 613012eefc84559507168982a7fc53dff667582b00Chiao Cheng private GlowPadView mGlowPadView; 6235f68aa92e49331272104a7a5c72046b2c82496dIsaac Katzenelson private boolean mIsDocked = false; 633012eefc84559507168982a7fc53dff667582b00Chiao Cheng 643012eefc84559507168982a7fc53dff667582b00Chiao Cheng // Parameters for the GlowPadView "ping" animation; see triggerPing(). 653012eefc84559507168982a7fc53dff667582b00Chiao Cheng private static final int PING_MESSAGE_WHAT = 101; 663012eefc84559507168982a7fc53dff667582b00Chiao Cheng private static final boolean ENABLE_PING_AUTO_REPEAT = true; 673012eefc84559507168982a7fc53dff667582b00Chiao Cheng private static final long PING_AUTO_REPEAT_DELAY_MSEC = 1200; 683012eefc84559507168982a7fc53dff667582b00Chiao Cheng 693012eefc84559507168982a7fc53dff667582b00Chiao Cheng private boolean mPingEnabled = true; 7030f1f6a8177e5742f4e8b67eb54b87d4f8bd2938Chiao Cheng 71a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram // Receives the ALARM_KILLED action from the AlarmKlaxon, 72a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram // and also ALARM_SNOOZE_ACTION / ALARM_DISMISS_ACTION from other applications 7363211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 74aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott @Override 75aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott public void onReceive(Context context, Intent intent) { 76a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram String action = intent.getAction(); 77ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson if (LOG) { 78ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson Log.v("AlarmAlertFullScreen - onReceive " + action); 79ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson } 80a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram if (action.equals(Alarms.ALARM_SNOOZE_ACTION)) { 81a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram snooze(); 82a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram } else if (action.equals(Alarms.ALARM_DISMISS_ACTION)) { 83a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram dismiss(false); 84a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram } else { 85a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram Alarm alarm = intent.getParcelableExtra(Alarms.ALARM_INTENT_EXTRA); 86a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram if (alarm != null && mAlarm.id == alarm.id) { 87a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram dismiss(true); 88a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram } 89aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 90aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 91aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott }; 92aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 933012eefc84559507168982a7fc53dff667582b00Chiao Cheng private final Handler mPingHandler = new Handler() { 943012eefc84559507168982a7fc53dff667582b00Chiao Cheng @Override 953012eefc84559507168982a7fc53dff667582b00Chiao Cheng public void handleMessage(Message msg) { 963012eefc84559507168982a7fc53dff667582b00Chiao Cheng switch (msg.what) { 973012eefc84559507168982a7fc53dff667582b00Chiao Cheng case PING_MESSAGE_WHAT: 983012eefc84559507168982a7fc53dff667582b00Chiao Cheng triggerPing(); 993012eefc84559507168982a7fc53dff667582b00Chiao Cheng break; 1003012eefc84559507168982a7fc53dff667582b00Chiao Cheng } 1013012eefc84559507168982a7fc53dff667582b00Chiao Cheng } 1023012eefc84559507168982a7fc53dff667582b00Chiao Cheng }; 1033012eefc84559507168982a7fc53dff667582b00Chiao Cheng 104f47699dd4704917713004099b5e3609be48653c4Patrick Scott @Override 10529dbeab977ead46e10efce114e1f21a55d556100Dianne Hackborn protected void onCreate(Bundle icicle) { 10629dbeab977ead46e10efce114e1f21a55d556100Dianne Hackborn super.onCreate(icicle); 107aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 108aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott mAlarm = getIntent().getParcelableExtra(Alarms.ALARM_INTENT_EXTRA); 109aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 110ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson if (LOG) { 111ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson Log.v("AlarmAlertFullScreen - onCreate"); 112ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson if (mAlarm != null) { 113ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson Log.v("AlarmAlertFullScreen - Alarm Id " + mAlarm.toString()); 114ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson } 115ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson } 116ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson 117aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // Get the volume/camera button behavior setting 118aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott final String vol = 119aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott PreferenceManager.getDefaultSharedPreferences(this) 120aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott .getString(SettingsActivity.KEY_VOLUME_BEHAVIOR, 121aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott DEFAULT_VOLUME_BEHAVIOR); 122aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott mVolumeBehavior = Integer.parseInt(vol); 123aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 124aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott final Window win = getWindow(); 125aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 126aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 127aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // Turn on the screen unless we are being launched from the AlarmAlert 128706506639cb0da2c0db06ef88f2d2c9d75b084ccDaniel Sandler // subclass as a result of the screen turning off. 129aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott if (!getIntent().getBooleanExtra(SCREEN_OFF, false)) { 130aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 131abc34112bd18bc0fc068ffa30ca07ae161bc9f0aMike Lockwood | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 132abc34112bd18bc0fc068ffa30ca07ae161bc9f0aMike Lockwood | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON); 133aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 134aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 135aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott updateLayout(); 136aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 13735f68aa92e49331272104a7a5c72046b2c82496dIsaac Katzenelson // Check the docking status , if the device is docked , do not limit rotation 13835f68aa92e49331272104a7a5c72046b2c82496dIsaac Katzenelson IntentFilter ifilter = new IntentFilter(Intent.ACTION_DOCK_EVENT); 13935f68aa92e49331272104a7a5c72046b2c82496dIsaac Katzenelson Intent dockStatus = registerReceiver(null, ifilter); 14035f68aa92e49331272104a7a5c72046b2c82496dIsaac Katzenelson if (dockStatus != null) { 14135f68aa92e49331272104a7a5c72046b2c82496dIsaac Katzenelson mIsDocked = dockStatus.getIntExtra(Intent.EXTRA_DOCK_STATE, -1) 14235f68aa92e49331272104a7a5c72046b2c82496dIsaac Katzenelson != Intent.EXTRA_DOCK_STATE_UNDOCKED; 14335f68aa92e49331272104a7a5c72046b2c82496dIsaac Katzenelson } 14435f68aa92e49331272104a7a5c72046b2c82496dIsaac Katzenelson 145a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram // Register to get the alarm killed/snooze/dismiss intent. 146a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram IntentFilter filter = new IntentFilter(Alarms.ALARM_KILLED); 147a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram filter.addAction(Alarms.ALARM_SNOOZE_ACTION); 148a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram filter.addAction(Alarms.ALARM_DISMISS_ACTION); 149a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram registerReceiver(mReceiver, filter); 150aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 151aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 152aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott private void setTitle() { 153706506639cb0da2c0db06ef88f2d2c9d75b084ccDaniel Sandler final String titleText = mAlarm.getLabelOrDefault(this); 154ba26bd379fa2840e699f8826465322fa6286160fJohn Spurlock 155ba26bd379fa2840e699f8826465322fa6286160fJohn Spurlock TextView tv = (TextView) findViewById(R.id.alertTitle); 156ba26bd379fa2840e699f8826465322fa6286160fJohn Spurlock tv.setText(titleText); 157ba26bd379fa2840e699f8826465322fa6286160fJohn Spurlock 158706506639cb0da2c0db06ef88f2d2c9d75b084ccDaniel Sandler setTitle(titleText); 159aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 160aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 161706506639cb0da2c0db06ef88f2d2c9d75b084ccDaniel Sandler protected int getLayoutResId() { 16230f1f6a8177e5742f4e8b67eb54b87d4f8bd2938Chiao Cheng return R.layout.alarm_alert; 163706506639cb0da2c0db06ef88f2d2c9d75b084ccDaniel Sandler } 16463211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson 165aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott private void updateLayout() { 166ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson if (LOG) { 167ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson Log.v("AlarmAlertFullScreen - updateLayout"); 168ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson } 169ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson 170f3d6fa186ddf8a7bb8000b8b9a8700a42121e522Chiao Cheng final LayoutInflater inflater = LayoutInflater.from(this); 171f3d6fa186ddf8a7bb8000b8b9a8700a42121e522Chiao Cheng final View view = inflater.inflate(getLayoutResId(), null); 172f3d6fa186ddf8a7bb8000b8b9a8700a42121e522Chiao Cheng view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE); 173f3d6fa186ddf8a7bb8000b8b9a8700a42121e522Chiao Cheng setContentView(view); 174aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 1752b99424fe59984b9efabae3920fb42e77e653786Sam Blitzstein /* Set the title from the passed in alarm */ 1762b99424fe59984b9efabae3920fb42e77e653786Sam Blitzstein setTitle(); 1773012eefc84559507168982a7fc53dff667582b00Chiao Cheng 1783012eefc84559507168982a7fc53dff667582b00Chiao Cheng mGlowPadView = (GlowPadView) findViewById(R.id.glow_pad_view); 1793012eefc84559507168982a7fc53dff667582b00Chiao Cheng mGlowPadView.setOnTriggerListener(this); 1803012eefc84559507168982a7fc53dff667582b00Chiao Cheng triggerPing(); 1813012eefc84559507168982a7fc53dff667582b00Chiao Cheng } 1823012eefc84559507168982a7fc53dff667582b00Chiao Cheng 1833012eefc84559507168982a7fc53dff667582b00Chiao Cheng private void triggerPing() { 1843012eefc84559507168982a7fc53dff667582b00Chiao Cheng if (mPingEnabled) { 1853012eefc84559507168982a7fc53dff667582b00Chiao Cheng mGlowPadView.ping(); 1863012eefc84559507168982a7fc53dff667582b00Chiao Cheng 1873012eefc84559507168982a7fc53dff667582b00Chiao Cheng if (ENABLE_PING_AUTO_REPEAT) { 1883012eefc84559507168982a7fc53dff667582b00Chiao Cheng mPingHandler.sendEmptyMessageDelayed(PING_MESSAGE_WHAT, PING_AUTO_REPEAT_DELAY_MSEC); 1893012eefc84559507168982a7fc53dff667582b00Chiao Cheng } 1903012eefc84559507168982a7fc53dff667582b00Chiao Cheng } 191aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 192aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 193aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // Attempt to snooze this alert. 194aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott private void snooze() { 195ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson if (LOG) { 196ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson Log.v("AlarmAlertFullScreen - snooze"); 197ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson } 198ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson 199aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott final String snooze = 200aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott PreferenceManager.getDefaultSharedPreferences(this) 201aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott .getString(SettingsActivity.KEY_ALARM_SNOOZE, DEFAULT_SNOOZE); 202aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott int snoozeMinutes = Integer.parseInt(snooze); 203aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 204aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott final long snoozeTime = System.currentTimeMillis() 205aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott + (1000 * 60 * snoozeMinutes); 206aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott Alarms.saveSnoozeAlert(AlarmAlertFullScreen.this, mAlarm.id, 207aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott snoozeTime); 208aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 209aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // Get the display time for the snooze and update the notification. 210aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott final Calendar c = Calendar.getInstance(); 211aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott c.setTimeInMillis(snoozeTime); 2128978640131006269f4668d0abfb3d8e7bd20a9e1Sam Blitzstein String snoozeTimeStr = Alarms.formatTime(this, c); 213aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott String label = mAlarm.getLabelOrDefault(this); 214aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 215aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // Notify the user that the alarm has been snoozed. 2168978640131006269f4668d0abfb3d8e7bd20a9e1Sam Blitzstein Intent dismissIntent = new Intent(this, AlarmReceiver.class); 2178978640131006269f4668d0abfb3d8e7bd20a9e1Sam Blitzstein dismissIntent.setAction(Alarms.CANCEL_SNOOZE); 2188978640131006269f4668d0abfb3d8e7bd20a9e1Sam Blitzstein dismissIntent.putExtra(Alarms.ALARM_INTENT_EXTRA, mAlarm); 2198978640131006269f4668d0abfb3d8e7bd20a9e1Sam Blitzstein 2208978640131006269f4668d0abfb3d8e7bd20a9e1Sam Blitzstein Intent openAlarm = new Intent(this, DeskClock.class); 2218978640131006269f4668d0abfb3d8e7bd20a9e1Sam Blitzstein openAlarm.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 2228978640131006269f4668d0abfb3d8e7bd20a9e1Sam Blitzstein openAlarm.putExtra(Alarms.ALARM_INTENT_EXTRA, mAlarm); 2238978640131006269f4668d0abfb3d8e7bd20a9e1Sam Blitzstein openAlarm.putExtra(DeskClock.SELECT_TAB_INTENT_EXTRA, DeskClock.CLOCK_TAB_INDEX); 2248978640131006269f4668d0abfb3d8e7bd20a9e1Sam Blitzstein 225aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott NotificationManager nm = getNotificationManager(); 2268978640131006269f4668d0abfb3d8e7bd20a9e1Sam Blitzstein Notification notif = new Notification.Builder(getApplicationContext()) 2278978640131006269f4668d0abfb3d8e7bd20a9e1Sam Blitzstein .setContentTitle(label) 2288978640131006269f4668d0abfb3d8e7bd20a9e1Sam Blitzstein .setContentText(getResources().getString(R.string.alarm_alert_snooze_until, snoozeTimeStr)) 2298978640131006269f4668d0abfb3d8e7bd20a9e1Sam Blitzstein .setSmallIcon(R.drawable.stat_notify_alarm) 2308978640131006269f4668d0abfb3d8e7bd20a9e1Sam Blitzstein .setOngoing(true) 2318978640131006269f4668d0abfb3d8e7bd20a9e1Sam Blitzstein .setAutoCancel(false) 2328978640131006269f4668d0abfb3d8e7bd20a9e1Sam Blitzstein .setPriority(Notification.PRIORITY_MAX) 2338978640131006269f4668d0abfb3d8e7bd20a9e1Sam Blitzstein .setWhen(0) 234c4861cb16c93248e03bfe30b06d728318a990227Isaac Katzenelson .addAction(android.R.drawable.ic_menu_close_clear_cancel, 235c4861cb16c93248e03bfe30b06d728318a990227Isaac Katzenelson getResources().getString(R.string.alarm_alert_dismiss_text), 2368978640131006269f4668d0abfb3d8e7bd20a9e1Sam Blitzstein PendingIntent.getBroadcast(this, mAlarm.id, dismissIntent, 0)) 2378978640131006269f4668d0abfb3d8e7bd20a9e1Sam Blitzstein .build(); 2388978640131006269f4668d0abfb3d8e7bd20a9e1Sam Blitzstein notif.contentIntent = PendingIntent.getActivity(this, mAlarm.id, openAlarm, 0); 2398978640131006269f4668d0abfb3d8e7bd20a9e1Sam Blitzstein nm.notify(mAlarm.id, notif); 240aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 241aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott String displayTime = getString(R.string.alarm_alert_snooze_set, 242aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott snoozeMinutes); 243aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // Intentionally log the snooze time for debugging. 244aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott Log.v(displayTime); 245aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 246aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // Display the snooze minutes in a toast. 247aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott Toast.makeText(AlarmAlertFullScreen.this, displayTime, 248aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott Toast.LENGTH_LONG).show(); 249aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott stopService(new Intent(Alarms.ALARM_ALERT_ACTION)); 250aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott finish(); 251aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 252aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 253aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott private NotificationManager getNotificationManager() { 254aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott return (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 255aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 256aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 257aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // Dismiss the alarm. 258aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott private void dismiss(boolean killed) { 259ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson if (LOG) { 260ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson Log.v("AlarmAlertFullScreen - dismiss"); 261ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson } 262ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson 263a3aba0c93c31e89045cca669418e85acfb4e22fbDavid Ingram Log.i(killed ? "Alarm killed" : "Alarm dismissed by user"); 264aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // The service told us that the alarm has been killed, do not modify 265aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // the notification or stop the service. 266aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott if (!killed) { 267aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // Cancel the notification and stop playing the alarm 268aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott NotificationManager nm = getNotificationManager(); 269aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott nm.cancel(mAlarm.id); 270aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott stopService(new Intent(Alarms.ALARM_ALERT_ACTION)); 271aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 272aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott finish(); 273aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 274aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 275aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott /** 276aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott * this is called when a second alarm is triggered while a 277aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott * previous alert window is still active. 278aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott */ 279aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott @Override 280aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott protected void onNewIntent(Intent intent) { 281aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott super.onNewIntent(intent); 282aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 283ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson if (LOG) Log.v("AlarmAlert.OnNewIntent()"); 284aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 285aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott mAlarm = intent.getParcelableExtra(Alarms.ALARM_INTENT_EXTRA); 286aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 287aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott setTitle(); 288aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 289aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 290aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott @Override 291c4861cb16c93248e03bfe30b06d728318a990227Isaac Katzenelson public void onConfigurationChanged(Configuration newConfig) { 292ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson if (LOG) { 293ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson Log.v("AlarmAlertFullScreen - onConfigChanged"); 294ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson } 295c4861cb16c93248e03bfe30b06d728318a990227Isaac Katzenelson updateLayout(); 296c4861cb16c93248e03bfe30b06d728318a990227Isaac Katzenelson super.onConfigurationChanged(newConfig); 297c4861cb16c93248e03bfe30b06d728318a990227Isaac Katzenelson } 298c4861cb16c93248e03bfe30b06d728318a990227Isaac Katzenelson 299c4861cb16c93248e03bfe30b06d728318a990227Isaac Katzenelson @Override 30022924b6afee333e16fb62a19f1ac044c87c528b5Patrick Scott protected void onResume() { 30122924b6afee333e16fb62a19f1ac044c87c528b5Patrick Scott super.onResume(); 302ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson if (LOG) { 303ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson Log.v("AlarmAlertFullScreen - onResume"); 304ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson } 30522924b6afee333e16fb62a19f1ac044c87c528b5Patrick Scott // If the alarm was deleted at some point, disable snooze. 30622924b6afee333e16fb62a19f1ac044c87c528b5Patrick Scott if (Alarms.getAlarm(getContentResolver(), mAlarm.id) == null) { 3073012eefc84559507168982a7fc53dff667582b00Chiao Cheng mGlowPadView.setTargetResources(R.array.dismiss_drawables); 3083012eefc84559507168982a7fc53dff667582b00Chiao Cheng mGlowPadView.setTargetDescriptionsResourceId(R.array.dismiss_descriptions); 3093012eefc84559507168982a7fc53dff667582b00Chiao Cheng mGlowPadView.setDirectionDescriptionsResourceId(R.array.dismiss_direction_descriptions); 31022924b6afee333e16fb62a19f1ac044c87c528b5Patrick Scott } 31135f68aa92e49331272104a7a5c72046b2c82496dIsaac Katzenelson // The activity is locked to the default orientation as a default set in the manifest 31235f68aa92e49331272104a7a5c72046b2c82496dIsaac Katzenelson // Override this settings if the device is docked or config set it differently 31335f68aa92e49331272104a7a5c72046b2c82496dIsaac Katzenelson if (getResources().getBoolean(R.bool.config_rotateAlarmAlert) || mIsDocked) { 31435f68aa92e49331272104a7a5c72046b2c82496dIsaac Katzenelson setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 31535f68aa92e49331272104a7a5c72046b2c82496dIsaac Katzenelson } 31622924b6afee333e16fb62a19f1ac044c87c528b5Patrick Scott } 31722924b6afee333e16fb62a19f1ac044c87c528b5Patrick Scott 31822924b6afee333e16fb62a19f1ac044c87c528b5Patrick Scott @Override 319aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott public void onDestroy() { 320aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott super.onDestroy(); 3219e33fe399ce41766dc0a2d6e8f3e2fef0d30f6c1Robyn Coultas if (LOG) Log.v("AlarmAlertFullScreen.onDestroy()"); 322aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // No longer care about the alarm being killed. 323aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott unregisterReceiver(mReceiver); 324aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 325aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 326aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott @Override 327aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott public boolean dispatchKeyEvent(KeyEvent event) { 328aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // Do this on key down to handle a few of the system keys. 329aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott boolean up = event.getAction() == KeyEvent.ACTION_UP; 330ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson if (LOG) { 331ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson Log.v("AlarmAlertFullScreen - dispatchKeyEvent " + event.getKeyCode()); 332ae45ac13dc2d3c9c1fa53ebda3b0e6890fe24f78Isaac Katzenelson } 333aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott switch (event.getKeyCode()) { 334aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // Volume keys and camera keys dismiss the alarm 335360468b9110ceba95099404265b8ee6e582391d9Chiao Cheng case KeyEvent.KEYCODE_POWER: 336aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott case KeyEvent.KEYCODE_VOLUME_UP: 337aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott case KeyEvent.KEYCODE_VOLUME_DOWN: 338ab34252e7a7f8c39b402425a4e0941aeb039d12fJeff Brown case KeyEvent.KEYCODE_VOLUME_MUTE: 339aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott case KeyEvent.KEYCODE_CAMERA: 340aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott case KeyEvent.KEYCODE_FOCUS: 341aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott if (up) { 342aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott switch (mVolumeBehavior) { 343aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott case 1: 344aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott snooze(); 345aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott break; 346aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 347aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott case 2: 348aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott dismiss(false); 349aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott break; 350aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 351aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott default: 352aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott break; 353aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 354aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 355aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott return true; 356aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott default: 357aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott break; 358aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 359aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott return super.dispatchKeyEvent(event); 360aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 361aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 3628dac45cc62008a66d21107b00aa39faabdc1b6f2Robyn Coultas @Override 3638dac45cc62008a66d21107b00aa39faabdc1b6f2Robyn Coultas public void onBackPressed() { 3648dac45cc62008a66d21107b00aa39faabdc1b6f2Robyn Coultas // Don't allow back to dismiss. This method is overriden by AlarmAlert 3658dac45cc62008a66d21107b00aa39faabdc1b6f2Robyn Coultas // so that the dialog is dismissed. 3668dac45cc62008a66d21107b00aa39faabdc1b6f2Robyn Coultas if (LOG) { 3678dac45cc62008a66d21107b00aa39faabdc1b6f2Robyn Coultas Log.v("AlarmAlertFullScreen - onBackPressed"); 3688dac45cc62008a66d21107b00aa39faabdc1b6f2Robyn Coultas } 3698dac45cc62008a66d21107b00aa39faabdc1b6f2Robyn Coultas return; 3708dac45cc62008a66d21107b00aa39faabdc1b6f2Robyn Coultas } 3718dac45cc62008a66d21107b00aa39faabdc1b6f2Robyn Coultas 3723012eefc84559507168982a7fc53dff667582b00Chiao Cheng 3733012eefc84559507168982a7fc53dff667582b00Chiao Cheng @Override 3743012eefc84559507168982a7fc53dff667582b00Chiao Cheng public void onGrabbed(View v, int handle) { 3753012eefc84559507168982a7fc53dff667582b00Chiao Cheng mPingEnabled = false; 3763012eefc84559507168982a7fc53dff667582b00Chiao Cheng } 3773012eefc84559507168982a7fc53dff667582b00Chiao Cheng 3783012eefc84559507168982a7fc53dff667582b00Chiao Cheng @Override 3793012eefc84559507168982a7fc53dff667582b00Chiao Cheng public void onReleased(View v, int handle) { 3803012eefc84559507168982a7fc53dff667582b00Chiao Cheng mPingEnabled = true; 3813012eefc84559507168982a7fc53dff667582b00Chiao Cheng triggerPing(); 3823012eefc84559507168982a7fc53dff667582b00Chiao Cheng } 3833012eefc84559507168982a7fc53dff667582b00Chiao Cheng 3843012eefc84559507168982a7fc53dff667582b00Chiao Cheng @Override 3853012eefc84559507168982a7fc53dff667582b00Chiao Cheng public void onTrigger(View v, int target) { 3863012eefc84559507168982a7fc53dff667582b00Chiao Cheng final int resId = mGlowPadView.getResourceIdForTarget(target); 3873012eefc84559507168982a7fc53dff667582b00Chiao Cheng switch (resId) { 3883012eefc84559507168982a7fc53dff667582b00Chiao Cheng case R.drawable.ic_alarm_alert_snooze: 3893012eefc84559507168982a7fc53dff667582b00Chiao Cheng snooze(); 3903012eefc84559507168982a7fc53dff667582b00Chiao Cheng break; 3913012eefc84559507168982a7fc53dff667582b00Chiao Cheng 3923012eefc84559507168982a7fc53dff667582b00Chiao Cheng case R.drawable.ic_alarm_alert_dismiss: 3933012eefc84559507168982a7fc53dff667582b00Chiao Cheng dismiss(false); 3943012eefc84559507168982a7fc53dff667582b00Chiao Cheng break; 3953012eefc84559507168982a7fc53dff667582b00Chiao Cheng default: 3963012eefc84559507168982a7fc53dff667582b00Chiao Cheng // Code should never reach here. 3973012eefc84559507168982a7fc53dff667582b00Chiao Cheng Log.e("Trigger detected on unhandled resource. Skipping."); 3983012eefc84559507168982a7fc53dff667582b00Chiao Cheng } 3993012eefc84559507168982a7fc53dff667582b00Chiao Cheng } 4003012eefc84559507168982a7fc53dff667582b00Chiao Cheng 4013012eefc84559507168982a7fc53dff667582b00Chiao Cheng @Override 4023012eefc84559507168982a7fc53dff667582b00Chiao Cheng public void onGrabbedStateChange(View v, int handle) { 4033012eefc84559507168982a7fc53dff667582b00Chiao Cheng } 4043012eefc84559507168982a7fc53dff667582b00Chiao Cheng 4053012eefc84559507168982a7fc53dff667582b00Chiao Cheng @Override 4063012eefc84559507168982a7fc53dff667582b00Chiao Cheng public void onFinishFinalAnimation() { 4073012eefc84559507168982a7fc53dff667582b00Chiao Cheng } 408f47699dd4704917713004099b5e3609be48653c4Patrick Scott} 409