15fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project/* 25fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 35fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * 45fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 55fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * you may not use this file except in compliance with the License. 65fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * You may obtain a copy of the License at 75fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * 85fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 95fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * 105fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 115fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 125fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * See the License for the specific language governing permissions and 145fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * limitations under the License. 155fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project */ 165fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project 17fa954248b41b567dfa2ddd7bd063d3936a51758eDaniel Sandlerpackage com.android.deskclock; 185fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project 19aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport android.app.KeyguardManager; 20d776e51cec79901a0d656bba7b1f3780cceac57dPatrick Scottimport android.content.BroadcastReceiver; 21aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport android.content.Context; 225fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.content.Intent; 23d776e51cec79901a0d656bba7b1f3780cceac57dPatrick Scottimport android.content.IntentFilter; 245fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.os.Bundle; 25aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport android.os.Handler; 26aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottimport android.os.Message; 27ba26bd379fa2840e699f8826465322fa6286160fJohn Spurlockimport android.view.View; 285fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project 295fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project/** 30aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott * Full screen alarm alert: pops visible indicator and plays alarm tone. This 31aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott * activity shows the alert as a dialog. 325fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project */ 33aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scottpublic class AlarmAlert extends AlarmAlertFullScreen { 3489811e14c23c7fe6f88a21d13429613b756bce3fPatrick Scott 35aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // If we try to check the keyguard more than 5 times, just launch the full 36aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // screen activity. 37aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott private int mKeyguardRetryCount; 38aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott private final int MAX_KEYGUARD_CHECKS = 5; 39d776e51cec79901a0d656bba7b1f3780cceac57dPatrick Scott 40aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott private final Handler mHandler = new Handler() { 41d776e51cec79901a0d656bba7b1f3780cceac57dPatrick Scott @Override 42aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott public void handleMessage(Message msg) { 43aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott handleScreenOff((KeyguardManager) msg.obj); 44d776e51cec79901a0d656bba7b1f3780cceac57dPatrick Scott } 45d776e51cec79901a0d656bba7b1f3780cceac57dPatrick Scott }; 465fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project 47aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott private final BroadcastReceiver mScreenOffReceiver = 48aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott new BroadcastReceiver() { 49aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott @Override 50aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott public void onReceive(Context context, Intent intent) { 51aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott KeyguardManager km = 52aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott (KeyguardManager) context.getSystemService( 53aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott Context.KEYGUARD_SERVICE); 54aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott handleScreenOff(km); 55aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 56aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott }; 57aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott 585fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project @Override 595fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project protected void onCreate(Bundle icicle) { 605fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project super.onCreate(icicle); 615fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project 62ba26bd379fa2840e699f8826465322fa6286160fJohn Spurlock /* Disable custom title, this will already be shown as a dialog */ 6363211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson // findViewById(R.id.topPanel).setVisibility(View.GONE); 64ba26bd379fa2840e699f8826465322fa6286160fJohn Spurlock 65aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // Listen for the screen turning off so that when the screen comes back 66aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // on, the user does not need to unlock the phone to dismiss the alarm. 67aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott registerReceiver(mScreenOffReceiver, 68aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott new IntentFilter(Intent.ACTION_SCREEN_OFF)); 695fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project } 705fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project 7129dbeab977ead46e10efce114e1f21a55d556100Dianne Hackborn @Override 72d776e51cec79901a0d656bba7b1f3780cceac57dPatrick Scott public void onDestroy() { 73d776e51cec79901a0d656bba7b1f3780cceac57dPatrick Scott super.onDestroy(); 74aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott unregisterReceiver(mScreenOffReceiver); 75aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // Remove any of the keyguard messages just in case 76aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott mHandler.removeMessages(0); 775fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project } 785fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project 795fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project @Override 80aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott public void onBackPressed() { 81aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott finish(); 82aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 8389811e14c23c7fe6f88a21d13429613b756bce3fPatrick Scott 84706506639cb0da2c0db06ef88f2d2c9d75b084ccDaniel Sandler @Override 85706506639cb0da2c0db06ef88f2d2c9d75b084ccDaniel Sandler protected int getLayoutResId() { 86706506639cb0da2c0db06ef88f2d2c9d75b084ccDaniel Sandler return R.layout.alarm_alert; 87706506639cb0da2c0db06ef88f2d2c9d75b084ccDaniel Sandler } 8863211efa1565b5dc171938740ba183302d0e46f3Isaac Katzenelson 89aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott private boolean checkRetryCount() { 90aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott if (mKeyguardRetryCount++ >= MAX_KEYGUARD_CHECKS) { 91aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott Log.e("Tried to read keyguard status too many times, bailing..."); 92aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott return false; 93aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 94aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott return true; 95aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 9689811e14c23c7fe6f88a21d13429613b756bce3fPatrick Scott 97aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott private void handleScreenOff(final KeyguardManager km) { 98aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott if (!km.inKeyguardRestrictedInputMode() && checkRetryCount()) { 99aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott if (checkRetryCount()) { 100aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott mHandler.sendMessageDelayed(mHandler.obtainMessage(0, km), 500); 101aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } 102aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott } else { 103aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott // Launch the full screen activity but do not turn the screen on. 104aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott Intent i = new Intent(this, AlarmAlertFullScreen.class); 105aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott i.putExtra(Alarms.ALARM_INTENT_EXTRA, mAlarm); 106aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott i.putExtra(SCREEN_OFF, true); 107aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott startActivity(i); 108aa67778949c2506c7e66f37b1baeef4fc2f1ab27Patrick Scott finish(); 1095fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project } 1105fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project } 1115fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project} 112