summaryrefslogtreecommitdiff
path: root/src/com/android/cellbroadcastreceiver/CellBroadcastAlertFullScreen.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/cellbroadcastreceiver/CellBroadcastAlertFullScreen.java')
-rw-r--r--src/com/android/cellbroadcastreceiver/CellBroadcastAlertFullScreen.java205
1 files changed, 205 insertions, 0 deletions
diff --git a/src/com/android/cellbroadcastreceiver/CellBroadcastAlertFullScreen.java b/src/com/android/cellbroadcastreceiver/CellBroadcastAlertFullScreen.java
new file mode 100644
index 000000000..ea6c5fcb7
--- /dev/null
+++ b/src/com/android/cellbroadcastreceiver/CellBroadcastAlertFullScreen.java
@@ -0,0 +1,205 @@
+/*
+ * Copyright (C) 2012 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.Activity;
+import android.app.NotificationManager;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+/**
+ * Full-screen emergency alert with flashing warning icon.
+ * Alert audio and text-to-speech handled by {@link CellBroadcastAlertAudio}.
+ * Keyguard handling based on {@code AlarmAlertFullScreen} class from DeskClock app.
+ */
+public class CellBroadcastAlertFullScreen extends Activity {
+
+ /**
+ * Intent extra for full screen alert launched from dialog subclass as a result of the
+ * screen turning off.
+ */
+ static final String SCREEN_OFF = "screen_off";
+
+ /** Whether to show the flashing warning icon. */
+ private boolean mIsEmergencyAlert;
+
+ /** The cell broadcast message to display. */
+ CellBroadcastMessage mMessage;
+
+ /** 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;
+
+ /** 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);
+ }
+ };
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ final Window win = getWindow();
+
+ // We use a custom title, so remove the standard dialog title bar
+ win.requestFeature(Window.FEATURE_NO_TITLE);
+
+ // Full screen alerts display above the keyguard and when device is locked.
+ win.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN
+ | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
+ | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
+
+ // Turn on the screen unless we're being launched from the dialog subclass as a result of
+ // the screen turning off.
+ if (!getIntent().getBooleanExtra(SCREEN_OFF, false)) {
+ win.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
+ | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+ }
+
+ // Save message for passing from dialog to fullscreen activity, and for marking read.
+ mMessage = getIntent().getParcelableExtra(
+ CellBroadcastMessage.SMS_CB_MESSAGE_EXTRA);
+
+ updateLayout(mMessage);
+ }
+
+ protected int getLayoutResId() {
+ return R.layout.cell_broadcast_alert_fullscreen;
+ }
+
+ private void updateLayout(CellBroadcastMessage message) {
+ LayoutInflater inflater = LayoutInflater.from(this);
+
+ setContentView(inflater.inflate(getLayoutResId(), null));
+
+ /* Initialize dialog text from alert message. */
+ int titleId = message.getDialogTitleResource();
+ setTitle(titleId);
+ ((TextView) findViewById(R.id.alertTitle)).setText(titleId);
+ ((TextView) findViewById(R.id.message)).setText(message.getFormattedMessageBody(this));
+
+ /* dismiss button: close notification */
+ findViewById(R.id.dismissButton).setOnClickListener(
+ new Button.OnClickListener() {
+ public void onClick(View v) {
+ dismiss();
+ }
+ });
+
+ mIsEmergencyAlert = message.isPublicAlertMessage() || CellBroadcastConfigService
+ .isOperatorDefinedEmergencyId(message.getServiceCategory());
+
+ if (mIsEmergencyAlert) {
+ mWarningIcon = getResources().getDrawable(R.drawable.ic_warning_large);
+ mWarningIconView = (ImageView) findViewById(R.id.icon);
+ if (mWarningIconView != null) {
+ mWarningIconView.setImageDrawable(mWarningIcon);
+ }
+
+ // Dismiss the notification that brought us here
+ ((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE))
+ .cancel((int) message.getDeliveryTime());
+ }
+ }
+
+ /**
+ * Start animating warning icon.
+ */
+ @Override
+ protected void onStart() {
+ super.onStart();
+ if (mIsEmergencyAlert) {
+ // start icon animation
+ mAnimationHandler.sendEmptyMessageDelayed(0, WARNING_ICON_ON_DURATION_MSEC);
+ }
+ }
+
+ /**
+ * Stop animating warning icon and stop the {@link CellBroadcastAlertAudio}
+ * service if necessary.
+ */
+ void dismiss() {
+ // Stop playing alert sound/vibration/speech (if started)
+ stopService(new Intent(this, CellBroadcastAlertAudio.class));
+
+ // Start database service to mark broadcast as read
+ Intent intent = new Intent(this, CellBroadcastDatabaseService.class);
+ intent.setAction(CellBroadcastDatabaseService.ACTION_MARK_BROADCAST_READ);
+ // Select by delivery time because we don't know the database row ID.
+ intent.putExtra(CellBroadcastDatabaseService.DATABASE_DELIVERY_TIME_EXTRA,
+ mMessage.getDeliveryTime());
+ startService(intent);
+
+ if (mIsEmergencyAlert) {
+ // stop animating emergency alert icon
+ mStopAnimation = true;
+ } else {
+ // decrement unread non-emergency alert count
+ CellBroadcastReceiverApp.decrementUnreadAlertCount();
+ }
+ finish();
+ }
+
+ /**
+ * Ignore the back button for emergency alerts (overridden by alert dialog so that the dialog
+ * is dismissed).
+ */
+ @Override
+ public void onBackPressed() {
+ // ignored
+ }
+}