/* * Copyright (C) 2012 Louis Fazen * * 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.alphabetbloc.accessadmin.activities; import android.app.Activity; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.media.AudioManager; import android.media.MediaPlayer; import android.os.Bundle; import android.preference.PreferenceManager; import android.provider.Settings; import android.util.Log; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.view.Window; import android.view.WindowManager; import android.widget.RelativeLayout; import android.widget.TextView; import com.alphabetbloc.accessadmin.R; import com.alphabetbloc.accessadmin.data.Constants; import com.alphabetbloc.accessadmin.data.Policy; import com.alphabetbloc.accessadmin.receivers.AirplaneOffReceiver; public class MessageHoldActivity extends Activity implements OnTouchListener { private static final String TAG = MessageHoldActivity.class.getSimpleName(); // View type public static final String STOP_HOLD = "stop_hold"; public static final String MESSAGE = "message"; public static final String SUBMESSAGE = "submessage"; public static final String ADDITIONAL_INFO = "additional_info"; public static int sHoldType = 0; public static String sMessage = ""; public static String sSubMessage = ""; public static String sAdditionalInfo = ""; public static boolean sPermanentHold = false; // Alarm private boolean mSoundAlarm = false; private MediaPlayer mPlayer; private boolean mVolumeUp = false; // Network and life cycle public static boolean sMessageHoldActive = false; private boolean mNetworkOnMode = false; private AirplaneOffReceiver mNetworkOnReceiver; // Options Menu private static final int DEVICE_ADMIN = 1; private static final int ADMIN_OPTIONS = 0; private static final int RETURN_PERM_HOLD = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); // start, stop, or change the message of the activity boolean stopHold = getIntent().getBooleanExtra(STOP_HOLD, false); if (stopHold) { unregisterAirplaneOffReceiver(); sPermanentHold = false; finish(); } else { refreshView(); } } private void refreshView() { // create the correct view sHoldType = getIntent().getIntExtra(Constants.HOLD_TYPE, 0); switch (sHoldType) { case Constants.SIM_ERROR: case Constants.DEVICE_LOCKED: sPermanentHold = true; mSoundAlarm = true; setContentView(R.layout.hold_alarm); break; case Constants.ADMIN_MESSAGE: default: sPermanentHold = false; mSoundAlarm = false; setContentView(R.layout.admin_message); break; } // Set the text content // Message sMessage = getIntent().getStringExtra(MESSAGE); TextView message = (TextView) findViewById(R.id.message); if (sMessage != null) message.setText(sMessage); // Sub-Message sSubMessage = getIntent().getStringExtra(SUBMESSAGE); TextView submessage = (TextView) findViewById(R.id.submessage); if (sSubMessage != null) submessage.setText(sSubMessage); // Additional Info sAdditionalInfo = getIntent().getStringExtra(ADDITIONAL_INFO); RelativeLayout additionalInfo = (RelativeLayout) findViewById(R.id.additional_info); TextView additionalMessage = (TextView) findViewById(R.id.additional_message); if (sAdditionalInfo != null) { additionalInfo.setVisibility(View.VISIBLE); additionalMessage.setText(sAdditionalInfo); } else if (additionalInfo != null) { additionalInfo.setVisibility(View.GONE); } } private void startAlarm() { if (mPlayer == null) { setVolumeControlStream(AudioManager.STREAM_MUSIC); AudioManager aM = (AudioManager) getSystemService(AUDIO_SERVICE); aM.setStreamVolume(AudioManager.STREAM_MUSIC, aM.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0); mPlayer = MediaPlayer.create(getApplicationContext(), R.raw.alarm); mPlayer.setLooping(true); } if (mPlayer.isPlaying()) return; else mPlayer.start(); } @Override protected void onResume() { super.onResume(); if (Constants.DEBUG) Log.v(TAG, "OnResume Called"); } @Override protected void onPause() { super.onPause(); if (Constants.DEBUG) Log.v(TAG, "OnPause Called"); } @Override protected void onStart() { super.onStart(); if (Constants.DEBUG) Log.v(TAG, "OnStart Called"); sMessageHoldActive = true; registerAirplaneOffReceiver(); if (mSoundAlarm) startAlarm(); } @Override protected void onStop() { super.onDestroy(); sMessageHoldActive = false; unregisterAirplaneOffReceiver(); if (sPermanentHold) { Intent i = new Intent(getApplicationContext(), MessageHoldActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); i.putExtra(Constants.HOLD_TYPE, sHoldType); i.putExtra(MessageHoldActivity.MESSAGE, sMessage); i.putExtra(MessageHoldActivity.SUBMESSAGE, sSubMessage); i.putExtra(MessageHoldActivity.ADDITIONAL_INFO, sAdditionalInfo); getApplicationContext().startActivity(i); } stopAlarm(); } private void stopAlarm() { if (mPlayer != null) { if (mPlayer.isPlaying()) { try { mPlayer.stop(); } catch (Exception e) { Log.e(TAG, "MediaPlayer already stopped."); } } mPlayer.release(); mPlayer = null; } } private void registerAirplaneOffReceiver() { if (mNetworkOnMode) return; mNetworkOnMode = true; mNetworkOnReceiver = new AirplaneOffReceiver(); IntentFilter airplaneFilter = new IntentFilter(Constants.AIRPLANE_MODE); registerReceiver(mNetworkOnReceiver, airplaneFilter); if (Constants.DEBUG) Log.v(TAG, "registering airplane receiver"); boolean enabled = Settings.System.getInt(getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) == 1; if (enabled) { Settings.System.putInt(getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0); Intent i = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); i.putExtra("state", 0); sendBroadcast(i); } } private void unregisterAirplaneOffReceiver() { if (mNetworkOnMode) { mNetworkOnMode = false; unregisterReceiver(mNetworkOnReceiver); Log.v(TAG, "unregistering airplane receiver"); } } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.add(0, DEVICE_ADMIN, 0, getString(R.string.device_admin)).setIcon(android.R.drawable.ic_menu_preferences); return true; } @Override public boolean onPrepareOptionsMenu(Menu menu) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); boolean showMenu = prefs.getBoolean(Constants.SHOW_MENU, false); Policy policy = new Policy(this); if (!policy.isAdminActive() || !showMenu || !mVolumeUp) return false; return super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case DEVICE_ADMIN: Intent i = new Intent(getApplicationContext(), AdminLoginActivity.class); if (sPermanentHold) { sPermanentHold = false; startActivityForResult(i, RETURN_PERM_HOLD); } else startActivityForResult(i, ADMIN_OPTIONS); return true; default: return super.onOptionsItemSelected(item); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RETURN_PERM_HOLD) sPermanentHold = true; } // Consume all UI events except Menu, Exit and Pwd Btns @Override public void onAttachedToWindow() { super.onAttachedToWindow(); this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); } @Override public boolean onTouch(View v, MotionEvent event) { // NB: Override this in all child activities return false; } @Override public void onBackPressed() { return; } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MENU) { event.startTracking(); return true; } if (keyCode == KeyEvent.KEYCODE_HOME || keyCode == KeyEvent.KEYCODE_SEARCH || keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) { return true; } if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) mVolumeUp = true; return false; } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MENU) { openOptionsMenu(); return true; } if (keyCode == KeyEvent.KEYCODE_HOME || keyCode == KeyEvent.KEYCODE_SEARCH || keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) { return true; } if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) mVolumeUp = false; return false; } @Override public boolean dispatchKeyEvent(KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN || event.getAction() == KeyEvent.ACTION_UP) { if (event.getKeyCode() == KeyEvent.KEYCODE_HOME || event.getKeyCode() == KeyEvent.KEYCODE_SEARCH || event.getKeyCode() == KeyEvent.KEYCODE_BACK || event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN) { return true; } } return super.dispatchKeyEvent(event); } @Override public boolean dispatchTrackballEvent(MotionEvent ev) { return true; } @Override public boolean onKeyLongPress(int keyCode, KeyEvent event) { return true; } @Override public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) { return true; } @Override public boolean onTouchEvent(MotionEvent event) { return true; } @Override public boolean onTrackballEvent(MotionEvent event) { return true; } }