blob: 08c13f06e36acbc2a37804fdc12340030ee879c2 [file] [log] [blame]
/*
* Copyright (C) 2009 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.alarmclock;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.LayoutInflater;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.Toast;
import android.widget.TextView;
import java.util.Calendar;
/**
* Alarm Clock alarm alert: pops visible indicator and plays alarm
* tone. This activity is the full screen version which shows over the lock
* screen with the wallpaper as the background.
*/
public class AlarmAlertFullScreen extends Activity {
// These defaults must match the values in res/xml/settings.xml
private static final String DEFAULT_SNOOZE = "10";
private static final String DEFAULT_VOLUME_BEHAVIOR = "2";
protected static final String SCREEN_OFF = "screen_off";
protected Alarm mAlarm;
private int mVolumeBehavior;
// Receives the ALARM_KILLED action from the AlarmKlaxon.
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Alarm alarm = intent.getParcelableExtra(Alarms.ALARM_INTENT_EXTRA);
if (alarm != null && mAlarm.id == alarm.id) {
dismiss(true);
}
}
};
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
mAlarm = getIntent().getParcelableExtra(Alarms.ALARM_INTENT_EXTRA);
// Get the volume/camera button behavior setting
final String vol =
PreferenceManager.getDefaultSharedPreferences(this)
.getString(SettingsActivity.KEY_VOLUME_BEHAVIOR,
DEFAULT_VOLUME_BEHAVIOR);
mVolumeBehavior = Integer.parseInt(vol);
requestWindowFeature(android.view.Window.FEATURE_NO_TITLE);
final Window win = getWindow();
win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
// Turn on the screen unless we are being launched from the AlarmAlert
// subclass.
if (!getIntent().getBooleanExtra(SCREEN_OFF, false)) {
win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
}
updateLayout();
// Register to get the alarm killed intent.
registerReceiver(mReceiver, new IntentFilter(Alarms.ALARM_KILLED));
}
private void setTitle() {
String label = mAlarm.getLabelOrDefault(this);
TextView title = (TextView) findViewById(R.id.alertTitle);
title.setText(label);
}
private void updateLayout() {
LayoutInflater inflater = LayoutInflater.from(this);
setContentView(inflater.inflate(R.layout.alarm_alert, null));
/* set clock face */
SharedPreferences settings =
getSharedPreferences(AlarmClock.PREFERENCES, 0);
int face = settings.getInt(AlarmClock.PREF_CLOCK_FACE, 0);
if (face < 0 || face >= AlarmClock.CLOCKS.length) {
face = 0;
}
ViewGroup clockView = (ViewGroup) findViewById(R.id.clockView);
inflater.inflate(AlarmClock.CLOCKS[face], clockView);
View clockLayout = findViewById(R.id.clock);
if (clockLayout instanceof DigitalClock) {
((DigitalClock) clockLayout).setAnimate();
}
/* snooze behavior: pop a snooze confirmation view, kick alarm
manager. */
Button snooze = (Button) findViewById(R.id.snooze);
snooze.requestFocus();
snooze.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
snooze();
}
});
/* dismiss button: close notification */
findViewById(R.id.dismiss).setOnClickListener(
new Button.OnClickListener() {
public void onClick(View v) {
dismiss(false);
}
});
/* Set the title from the passed in alarm */
setTitle();
}
// Attempt to snooze this alert.
private void snooze() {
final String snooze =
PreferenceManager.getDefaultSharedPreferences(this)
.getString(SettingsActivity.KEY_ALARM_SNOOZE, DEFAULT_SNOOZE);
int snoozeMinutes = Integer.parseInt(snooze);
final long snoozeTime = System.currentTimeMillis()
+ (1000 * 60 * snoozeMinutes);
Alarms.saveSnoozeAlert(AlarmAlertFullScreen.this, mAlarm.id,
snoozeTime);
// Get the display time for the snooze and update the notification.
final Calendar c = Calendar.getInstance();
c.setTimeInMillis(snoozeTime);
// Append (snoozed) to the label.
String label = mAlarm.getLabelOrDefault(this);
label = getString(R.string.alarm_notify_snooze_label, label);
// Notify the user that the alarm has been snoozed.
Intent cancelSnooze = new Intent(this, AlarmReceiver.class);
cancelSnooze.setAction(Alarms.CANCEL_SNOOZE);
cancelSnooze.putExtra(Alarms.ALARM_ID, mAlarm.id);
PendingIntent broadcast =
PendingIntent.getBroadcast(this, mAlarm.id, cancelSnooze, 0);
NotificationManager nm = getNotificationManager();
Notification n = new Notification(R.drawable.stat_notify_alarm,
label, 0);
n.setLatestEventInfo(this, label,
getString(R.string.alarm_notify_snooze_text,
Alarms.formatTime(this, c)), broadcast);
n.deleteIntent = broadcast;
n.flags |= Notification.FLAG_AUTO_CANCEL;
nm.notify(mAlarm.id, n);
String displayTime = getString(R.string.alarm_alert_snooze_set,
snoozeMinutes);
// Intentionally log the snooze time for debugging.
Log.v(displayTime);
// Display the snooze minutes in a toast.
Toast.makeText(AlarmAlertFullScreen.this, displayTime,
Toast.LENGTH_LONG).show();
stopService(new Intent(Alarms.ALARM_ALERT_ACTION));
finish();
}
private NotificationManager getNotificationManager() {
return (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
}
// Dismiss the alarm.
private void dismiss(boolean killed) {
// The service told us that the alarm has been killed, do not modify
// the notification or stop the service.
if (!killed) {
// Cancel the notification and stop playing the alarm
NotificationManager nm = getNotificationManager();
nm.cancel(mAlarm.id);
stopService(new Intent(Alarms.ALARM_ALERT_ACTION));
}
finish();
}
/**
* this is called when a second alarm is triggered while a
* previous alert window is still active.
*/
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (Log.LOGV) Log.v("AlarmAlert.OnNewIntent()");
mAlarm = intent.getParcelableExtra(Alarms.ALARM_INTENT_EXTRA);
setTitle();
}
@Override
protected void onStop() {
super.onStop();
if (!isFinishing()) {
// Don't hang around.
finish();
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (Log.LOGV) Log.v("AlarmAlert.onDestroy()");
// No longer care about the alarm being killed.
unregisterReceiver(mReceiver);
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
// Do this on key down to handle a few of the system keys.
boolean up = event.getAction() == KeyEvent.ACTION_UP;
switch (event.getKeyCode()) {
// Volume keys and camera keys dismiss the alarm
case KeyEvent.KEYCODE_VOLUME_UP:
case KeyEvent.KEYCODE_VOLUME_DOWN:
case KeyEvent.KEYCODE_CAMERA:
case KeyEvent.KEYCODE_FOCUS:
if (up) {
switch (mVolumeBehavior) {
case 1:
snooze();
break;
case 2:
dismiss(false);
break;
default:
break;
}
}
return true;
default:
break;
}
return super.dispatchKeyEvent(event);
}
@Override
public void onBackPressed() {
// Don't allow back to dismiss. This method is overriden by AlarmAlert
// so that the dialog is dismissed.
return;
}
}