package cri.sanity;
import android.app.Activity;
import android.app.Notification;
import android.app.PendingIntent;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.DialogInterface.OnDismissListener;
import android.media.AudioManager;
import android.os.Bundle;
import android.text.format.DateFormat;
import cri.sanity.util.*;
public class ModeActivity extends Activity implements OnDismissListener
{
public static final int NID_SILENT = 55;
public static final int NID_FLIGHT = 77;
private static final String PREFIX_TIME = "priv_mode_time_";
private static final String EXTRA_FORCE = "force";
private static boolean started = false;
private static boolean running = false;
private String action, msg, title, forceMethod;
private int nid;
public static final void start(String action, boolean force) {
started = true;
Intent i = new Intent(A.app(), ModeActivity.class);
i.setAction(action);
i.putExtra(EXTRA_FORCE, force);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
A.app().startActivity(i);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(running || !init()) {
if(!running) startActivity(new Intent(A.app(), MainActivity.class));
finish();
return;
}
running = true;
final String keyTime = PREFIX_TIME + action;
final int time = A.geti(keyTime);
final int hour = (time >> 8) & 0xff;
final int mins = (time ) & 0xff;
Alert.time(
msg,
new Alert.Timed(hour, mins) {
@Override
public void on() {
if(forceMethod != null) try { ModeActivity.class.getMethod(forceMethod).invoke(null); } catch(Exception e) {}
A.putc(keyTime, hour<<8 | mins);
final long delay = hour*(3600l*1000l) + mins*(60l*1000l);
Alarmer.exec(action, delay);
final long time = A.time();
final String msg = String.format(A.s(R.string.msg_mode_scheduled), DateFormat.format("kk:mm", time+delay));
A.toast(msg);
notification(msg, time);
}
},
this
).setOnDismissListener(this);
}
@Override
public void onDestroy() {
super.onDestroy();
running = false;
}
private boolean init() {
if(!started) return false;
started = false;
final Intent i = getIntent();
if(i == null) return false;
action = i.getAction();
return checkAction(i.getBooleanExtra(EXTRA_FORCE, false));
}
private boolean checkAction(boolean force) {
if(Alarmer.ACT_SILENTLIMIT.equals(action)) {
if(!force && A.audioMan().getRingerMode()==AudioManager.RINGER_MODE_NORMAL) return false;
forceMethod = force? "forceSilent" : null;
title = A.s(R.string.silent_shortcut);
msg = A.s(R.string.ask_silent_limit);
nid = NID_SILENT;
}
else if(Alarmer.ACT_FLIGHTOFF.equals(action)) {
if(!force && !Dev.isFlightModeOn()) return false;
forceMethod = force? "forceFlight" : null;
title = A.s(R.string.airplane_shortcut);
msg = A.s(R.string.ask_airplane_limit);
nid = NID_FLIGHT;
}
else return false;
return true;
}
private void notification(String msg, long time) {
final Context ctx = A.app();
Notification n = new Notification(R.drawable.ic_timeout_bar, msg, time);
n.flags = Notification.FLAG_ONGOING_EVENT | Notification.FLAG_NO_CLEAR;
n.setLatestEventInfo(ctx, A.name()+" - "+title, msg, PendingIntent.getService(ctx, 0, new Intent(), 0));
A.notifMan().notify(nid, n);
}
public static void forceSilent() {
if(A.audioMan().getRingerMode() != AudioManager.RINGER_MODE_NORMAL) return;
ModeReceiver.skip = true;
A.audioMan().setRingerMode(AudioManager.RINGER_MODE_SILENT);
}
public static void forceFlight() {
if(Dev.isFlightModeOn()) return;
ModeReceiver.skip = true;
Dev.enableFlightMode(true);
}
@Override
public void onDismiss(DialogInterface dlg) { finish(); }
}