<string name="delete_alarm_confirm">"Toto upozornění bude odstraněno."</string>
<string name="show_clock">"Zobrazit hodiny"</string>
<string name="hide_clock">"Skrýt hodiny"</string>
+ <!-- no translation found for label (162189613902857319) -->
+ <skip />
+ <!-- no translation found for default_label (5590025289805630372) -->
+ <skip />
<string name="set_alarm">"Nastavit upozornění"</string>
<string name="enable">"Zapnout upozornění"</string>
<string name="alarm_vibrate">"Vibrace"</string>
<string name="delete_alarm_confirm">"Dieser Alarm wird gelöscht."</string>
<string name="show_clock">"Uhr anzeigen"</string>
<string name="hide_clock">"Uhr ausblenden"</string>
+ <!-- no translation found for label (162189613902857319) -->
+ <skip />
+ <!-- no translation found for default_label (5590025289805630372) -->
+ <skip />
<string name="set_alarm">"Wecker einstellen"</string>
<string name="enable">"Wecker aktivieren"</string>
<string name="alarm_vibrate">"Vibrieren"</string>
<string name="delete_alarm_confirm">"Esta alarma se eliminará."</string>
<string name="show_clock">"Mostrar reloj"</string>
<string name="hide_clock">"Ocultar reloj"</string>
+ <!-- no translation found for label (162189613902857319) -->
+ <skip />
+ <!-- no translation found for default_label (5590025289805630372) -->
+ <skip />
<string name="set_alarm">"Establecer alarma"</string>
<string name="enable">"Activar alarma"</string>
<string name="alarm_vibrate">"Vibración"</string>
<string name="delete_alarm_confirm">"Cette alarme va être supprimée."</string>
<string name="show_clock">"Afficher l\'horloge"</string>
<string name="hide_clock">"Masquer l\'horloge"</string>
+ <!-- no translation found for label (162189613902857319) -->
+ <skip />
+ <!-- no translation found for default_label (5590025289805630372) -->
+ <skip />
<string name="set_alarm">"Régler l\'alarme"</string>
<string name="enable">"Activer l\'alarme"</string>
<string name="alarm_vibrate">"Vibreur"</string>
<string name="delete_alarm_confirm">"Questa sveglia verrà eliminata."</string>
<string name="show_clock">"Mostra orologio"</string>
<string name="hide_clock">"Nascondi orologio"</string>
+ <!-- no translation found for label (162189613902857319) -->
+ <skip />
+ <!-- no translation found for default_label (5590025289805630372) -->
+ <skip />
<string name="set_alarm">"Imposta allarme"</string>
<string name="enable">"Attiva allarme"</string>
<string name="alarm_vibrate">"Vibrazione"</string>
<string name="delete_alarm_confirm">"このアラームを削除します。"</string>
<string name="show_clock">"時計を表示"</string>
<string name="hide_clock">"時計を隠す"</string>
+ <!-- no translation found for label (162189613902857319) -->
+ <skip />
+ <!-- no translation found for default_label (5590025289805630372) -->
+ <skip />
<string name="set_alarm">"アラームの設定"</string>
<string name="enable">"アラームをONにする"</string>
<string name="alarm_vibrate">"バイブレーション"</string>
<string name="delete_alarm_confirm">"알람이 삭제됩니다."</string>
<string name="show_clock">"시계 표시"</string>
<string name="hide_clock">"시계 숨기기"</string>
+ <!-- no translation found for label (162189613902857319) -->
+ <skip />
+ <!-- no translation found for default_label (5590025289805630372) -->
+ <skip />
<string name="set_alarm">"알람 설정"</string>
<string name="enable">"알람 켜기"</string>
<string name="alarm_vibrate">"진동"</string>
<string name="delete_alarm_confirm">"Denne alarmen vil bli slettet."</string>
<string name="show_clock">"Vis klokke"</string>
<string name="hide_clock">"Fjern klokke"</string>
+ <!-- no translation found for label (162189613902857319) -->
+ <skip />
+ <!-- no translation found for default_label (5590025289805630372) -->
+ <skip />
<string name="set_alarm">"Sett alarm"</string>
<string name="enable">"Slå på alarm"</string>
<string name="alarm_vibrate">"Vibrer"</string>
<string name="delete_alarm_confirm">"Dit alarm wordt verwijderd."</string>
<string name="show_clock">"Klok weergeven"</string>
<string name="hide_clock">"Klok verbergen"</string>
+ <!-- no translation found for label (162189613902857319) -->
+ <skip />
+ <!-- no translation found for default_label (5590025289805630372) -->
+ <skip />
<string name="set_alarm">"Alarm instellen"</string>
<string name="enable">"Alarm inschakelen"</string>
<string name="alarm_vibrate">"Trillen"</string>
<string name="delete_alarm_confirm">"Ten zegar zostanie usunięty."</string>
<string name="show_clock">"Pokaż zegar"</string>
<string name="hide_clock">"Ukryj zegar"</string>
+ <!-- no translation found for label (162189613902857319) -->
+ <skip />
+ <!-- no translation found for default_label (5590025289805630372) -->
+ <skip />
<string name="set_alarm">"Ustaw alarm"</string>
<string name="enable">"Włącz alarm"</string>
<string name="alarm_vibrate">"Wibracje"</string>
<string name="delete_alarm_confirm">"Сигнал будет удален."</string>
<string name="show_clock">"Показать часы"</string>
<string name="hide_clock">"Скрыть часы"</string>
+ <!-- no translation found for label (162189613902857319) -->
+ <skip />
+ <!-- no translation found for default_label (5590025289805630372) -->
+ <skip />
<string name="set_alarm">"Установить будильник"</string>
<string name="enable">"Включить будильник"</string>
<string name="alarm_vibrate">"Вибрация"</string>
<string name="delete_alarm_confirm">"将会删除此警报。"</string>
<string name="show_clock">"显示时钟"</string>
<string name="hide_clock">"隐藏时钟"</string>
+ <!-- no translation found for label (162189613902857319) -->
+ <skip />
+ <!-- no translation found for default_label (5590025289805630372) -->
+ <skip />
<string name="set_alarm">"设置闹钟"</string>
<string name="enable">"开启闹钟"</string>
<string name="alarm_vibrate">"振动"</string>
<string name="delete_alarm_confirm">"將刪除此鬧鐘。"</string>
<string name="show_clock">"顯示時鐘"</string>
<string name="hide_clock">"隱藏時鐘"</string>
+ <!-- no translation found for label (162189613902857319) -->
+ <skip />
+ <!-- no translation found for default_label (5590025289805630372) -->
+ <skip />
<string name="set_alarm">"設定鬧鐘"</string>
<string name="enable">"開啟鬧鐘"</string>
<string name="alarm_vibrate">"震動"</string>
private static final int KILLED = 3;
private KeyguardManager mKeyguardManager;
- private KeyguardManager.KeyguardLock mKeyguardLock = null;
+ private KeyguardManager.KeyguardLock mKeyguardLock;
private Button mSnoozeButton;
private int mState = UNKNOWN;
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
+ // Maintain a lock during the playback of the alarm. This lock may have
+ // already been acquired in AlarmReceiver. If the process was killed,
+ // the global wake lock is gone. Acquire again just to be sure.
+ AlarmAlertWakeLock.acquire(this);
+
/* FIXME Intentionally verbose: always log this until we've
fully debugged the app failing to start up */
Log.v("AlarmAlert.onCreate()");
- mKlaxon = AlarmKlaxon.getInstance();
-
// Popup alert over black screen
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.width = ViewGroup.LayoutParams.WRAP_CONTENT;
Intent i = getIntent();
mAlarmId = i.getIntExtra(Alarms.ID, -1);
+ mKlaxon = new AlarmKlaxon();
+ mKlaxon.postPlay(this, mAlarmId);
+
/* Set the title from the passed in label */
setTitleFromIntent(i);
disableKeyguard();
mAlarmId = intent.getIntExtra(Alarms.ID, -1);
+ // Play the new alarm sound.
+ mKlaxon.postPlay(this, mAlarmId);
+
setTitleFromIntent(intent);
/* unset silenced message */
private static PowerManager.WakeLock sWakeLock;
static void acquire(Context context) {
+ Log.v("Acquiring wake lock");
if (sWakeLock != null) {
sWakeLock.release();
}
- PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+ PowerManager pm =
+ (PowerManager) context.getSystemService(Context.POWER_SERVICE);
sWakeLock = pm.newWakeLock(
PowerManager.FULL_WAKE_LOCK |
}
static void release() {
- if (Log.LOGV) Log.v("AlarmAlertWakeLock release");
+ Log.v("Releasing wake lock");
if (sWakeLock != null) {
sWakeLock.release();
sWakeLock = null;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
+import android.os.Message;
import android.os.Vibrator;
import android.telephony.TelephonyManager;
/** Play alarm up to 10 minutes before silencing */
final static int ALARM_TIMEOUT_SECONDS = 10 * 60;
- private static long[] sVibratePattern = new long[] { 500, 500 };
-
- private static AlarmKlaxon sInstance;
+ private static final long[] sVibratePattern = new long[] { 500, 500 };
private int mAlarmId;
private String mAlert;
private Alarms.DaysOfWeek mDaysOfWeek;
private boolean mVibrate;
-
private boolean mPlaying = false;
-
private Vibrator mVibrator;
private MediaPlayer mMediaPlayer;
-
- private Handler mTimeout;
private KillerCallback mKillerCallback;
+ // Internal messages
+ private static final int KILLER = 1000;
+ private static final int PLAY = 1001;
+ private Handler mHandler = new Handler() {
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case KILLER:
+ if (Log.LOGV) {
+ Log.v("*********** Alarm killer triggered ***********");
+ }
+ if (mKillerCallback != null) {
+ mKillerCallback.onKilled();
+ }
+ break;
+ case PLAY:
+ play((Context) msg.obj, msg.arg1);
+ break;
+ }
+ }
+ };
- static synchronized AlarmKlaxon getInstance() {
- if (sInstance == null) sInstance = new AlarmKlaxon();
- return sInstance;
- }
-
- private AlarmKlaxon() {
+ AlarmKlaxon() {
mVibrator = new Vibrator();
}
mVibrate = vibrate;
}
- // Volume suggested by media team for in-call alarms.
+ public void postPlay(final Context context, final int alarmId) {
+ mHandler.sendMessage(mHandler.obtainMessage(PLAY, alarmId, 0, context));
+ }
+
+ // Volume suggested by media team for in-call alarms.
private static final float IN_CALL_VOLUME = 0.125f;
- synchronized void play(Context context, int alarmId) {
+ private void play(Context context, int alarmId) {
ContentResolver contentResolver = context.getContentResolver();
if (mPlaying) stop(context, false);
* Stops alarm audio and disables alarm if it not snoozed and not
* repeating
*/
- synchronized void stop(Context context, boolean snoozed) {
+ public void stop(Context context, boolean snoozed) {
if (Log.LOGV) Log.v("AlarmKlaxon.stop() " + mAlarmId);
if (mPlaying) {
mPlaying = false;
* This callback called when alarm killer times out unattended
* alarm
*/
- void setKillerCallback(KillerCallback killerCallback) {
+ public void setKillerCallback(KillerCallback killerCallback) {
mKillerCallback = killerCallback;
}
* popped, so the user will know that the alarm tripped.
*/
private void enableKiller() {
- mTimeout = new Handler();
- mTimeout.postDelayed(new Runnable() {
- public void run() {
- if (Log.LOGV) Log.v("*********** Alarm killer triggered *************");
- if (mKillerCallback != null) mKillerCallback.onKilled();
- }
- }, 1000 * ALARM_TIMEOUT_SECONDS);
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(KILLER),
+ 1000 * ALARM_TIMEOUT_SECONDS);
}
private void disableKiller() {
- if (mTimeout != null) {
- mTimeout.removeCallbacksAndMessages(null);
- mTimeout = null;
- }
+ mHandler.removeMessages(KILLER);
}
return;
}
- /* wake device */
+ /* Wake the device and stay awake until the AlarmAlert intent is
+ * handled. */
AlarmAlertWakeLock.acquire(context);
- /* start audio/vibe */
- AlarmKlaxon klaxon = AlarmKlaxon.getInstance();
- klaxon.play(context, id);
-
/* Close dialogs and window shade */
Intent i = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
context.sendBroadcast(i);