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