/*
* Copyright (C) 2011 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.cellbroadcastreceiver;
import android.app.AlertDialog;
import android.app.KeyguardManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.WindowManager;
import android.widget.ImageView;
/**
* Custom alert dialog with optional flashing warning icon.
* Alert audio and text-to-speech handled by {@link CellBroadcastAlertAudio}.
*/
public class CellBroadcastAlertDialog extends AlertDialog {
/** Whether to show the flashing warning icon. */
private final boolean mShowWarningIcon;
/** The broadcast delivery time, for marking as read (or 0). */
private final long mDeliveryTime;
/** Length of time for the warning icon to be visible. */
private static final int WARNING_ICON_ON_DURATION_MSEC = 800;
/** Length of time for the warning icon to be off. */
private static final int WARNING_ICON_OFF_DURATION_MSEC = 800;
/** Warning icon state. false = visible, true = off */
private boolean mIconAnimationState;
/** Stop animating icon after {@link #onStop()} is called. */
private boolean mStopAnimation;
/** The warning icon Drawable. */
private Drawable mWarningIcon;
/** The View containing the warning icon. */
private ImageView mWarningIconView;
/** Keyguard lock to show emergency alerts while in the lock screen. */
private KeyguardManager.KeyguardLock mKeyguardLock;
/** Icon animation handler for flashing warning alerts. */
private final Handler mAnimationHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (mIconAnimationState) {
mWarningIconView.setAlpha(255);
if (!mStopAnimation) {
mAnimationHandler.sendEmptyMessageDelayed(0, WARNING_ICON_ON_DURATION_MSEC);
}
} else {
mWarningIconView.setAlpha(0);
if (!mStopAnimation) {
mAnimationHandler.sendEmptyMessageDelayed(0, WARNING_ICON_OFF_DURATION_MSEC);
}
}
mIconAnimationState = !mIconAnimationState;
mWarningIconView.invalidateDrawable(mWarningIcon);
}
};
/**
* Create a new alert dialog for the broadcast notification.
* @param context the local Context
* @param titleId the resource ID of the dialog title
* @param body the message body contents
* @param showWarningIcon true if the flashing warning icon should be shown
* @param deliveryTime the delivery time of the broadcast, for marking as read
*/
public CellBroadcastAlertDialog(Context context, int titleId, CharSequence body,
boolean showWarningIcon, long deliveryTime) {
super(context);
mShowWarningIcon = showWarningIcon;
mDeliveryTime = deliveryTime;
setTitle(titleId);
setMessage(body);
setCancelable(true);
setOnCancelListener(new AlertDialog.OnCancelListener() {
public void onCancel(DialogInterface dialog) {
dialog.dismiss();
}
});
setButton(DialogInterface.BUTTON_NEUTRAL, context.getText(R.string.button_dismiss),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialog.dismiss();
}
});
// Set warning icon for emergency alert
if (mShowWarningIcon) {
mWarningIcon = getContext().getResources().getDrawable(R.drawable.ic_warning_large);
setIcon(mWarningIcon);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
if (mShowWarningIcon) {
// Turn screen on and show above the keyguard for emergency alert
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);
}
super.onCreate(savedInstanceState);
if (mShowWarningIcon) {
KeyguardManager km = (KeyguardManager)
getContext().getSystemService(Context.KEYGUARD_SERVICE);
mKeyguardLock = km.newKeyguardLock("CellBroadcastReceiver");
mWarningIconView = (ImageView) findViewById(com.android.internal.R.id.icon);
}
}
/**
* Start animating warning icon.
*/
@Override
protected void onStart() {
if (mShowWarningIcon) {
// Disable keyguard
mKeyguardLock.disableKeyguard();
// start icon animation
mAnimationHandler.sendEmptyMessageDelayed(0, WARNING_ICON_ON_DURATION_MSEC);
}
}
/**
* Stop animating warning icon and stop the {@link CellBroadcastAlertAudio}
* service if necessary.
*/
@Override
protected void onStop() {
// Stop playing alert sound/vibration/speech (if started)
Context context = getContext();
context.stopService(new Intent(context, CellBroadcastAlertAudio.class));
// Start database service to mark broadcast as read
Intent intent = new Intent(context, CellBroadcastDatabaseService.class);
intent.setAction(CellBroadcastDatabaseService.ACTION_MARK_BROADCAST_READ);
intent.putExtra(CellBroadcastDatabaseService.DATABASE_DELIVERY_TIME_EXTRA, mDeliveryTime);
context.startService(intent);
if (mShowWarningIcon) {
// Reenable keyguard
mKeyguardLock.reenableKeyguard();
// stop animating icon
mStopAnimation = true;
}
}
/**
* Ignore the back button for emergency alerts (user must dismiss with button).
*/
@Override
public void onBackPressed() {
if (!mShowWarningIcon) {
super.onBackPressed();
}
}
}