/*
* Copyright (C) 2015 AChep@xda <artemchep@gmail.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
package com.achep.acdisplay.services.switches;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.SystemClock;
import android.support.annotation.NonNull;
import android.util.Log;
import com.achep.acdisplay.services.Switch;
/**
* Prevents {@link com.achep.acdisplay.services.SwitchService} from working
* while an alarm app is alarming.
*
* @author Artem Chepurnoy
*/
public final class AlarmSwitch extends Switch {
private static final String TAG = "AlarmSwitch";
public static final String ALARM_ALERT = "ALARM_ALERT";
public static final String ALARM_DISMISS = "ALARM_DISMISS";
public static final String ALARM_SNOOZE = "ALARM_SNOOZE";
public static final String ALARM_DONE = "ALARM_DONE";
private boolean mActive;
private long mAlarmingTimestamp;
@NonNull
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action.contains(ALARM_ALERT)) {
// Hide the keyguard
mActive = false;
mAlarmingTimestamp = SystemClock.elapsedRealtime();
requestInactive();
} else if (action.contains(ALARM_DISMISS)
|| action.contains(ALARM_SNOOZE)
|| action.contains(ALARM_DONE)) {
// Show the keyguard
mActive = true;
requestActive();
} else if (mActive) {
// Get mad
Log.w(TAG, "Received an unknown intent=" + intent.getAction()
+ " re-enabling the switch.");
// Show the keyguard
mActive = true;
requestActive();
}
}
};
public AlarmSwitch(@NonNull Context context, @NonNull Callback callback) {
super(context, callback);
}
/**
* {@inheritDoc}
*/
@Override
public void onCreate() {
mActive = true;
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Alarms.STANDARD_ALARM_ALERT_ACTION);
intentFilter.addAction(Alarms.STANDARD_ALARM_DISMISS_ACTION);
intentFilter.addAction(Alarms.STANDARD_ALARM_SNOOZE_ACTION);
intentFilter.addAction(Alarms.STANDARD_ALARM_DONE_ACTION);
for (String alarm : Alarms.ALARMS) {
intentFilter.addAction(alarm + "." + ALARM_ALERT);
intentFilter.addAction(alarm + "." + ALARM_DISMISS);
intentFilter.addAction(alarm + "." + ALARM_SNOOZE);
intentFilter.addAction(alarm + "." + ALARM_DONE);
}
intentFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY - 1);
getContext().registerReceiver(mReceiver, intentFilter);
}
/**
* {@inheritDoc}
*/
@Override
public void onDestroy() {
getContext().unregisterReceiver(mReceiver);
}
/**
* {@inheritDoc}
*/
@Override
public boolean isActive() {
// Check how old the alarm intent is. This is needed because
// we can't be sure that alarm app will broadcast any of
// DISMISS, SNOOZE, DONE intents.
final long now = SystemClock.elapsedRealtime();
final boolean timedOut = now - mAlarmingTimestamp > 1000 * 60 * 5;
Log.i(TAG, "Checking if AlarmSwitch is active: "
+ "active=" + mActive + ", "
+ "timed_out=" + timedOut + ", ");
return mActive || timedOut;
}
/**
* @author Artem Chepurnoy
*/
private static class Alarms {
// Modern Android app
public static final String STANDARD_ALARM_PACKAGE = "com.android.deskclock";
public static final String STANDARD_ALARM_ALERT_ACTION =
"com.android.deskclock.ALARM_ALERT";
public static final String STANDARD_ALARM_SNOOZE_ACTION =
"com.android.deskclock.ALARM_SNOOZE";
public static final String STANDARD_ALARM_DISMISS_ACTION =
"com.android.deskclock.ALARM_DISMISS";
public static final String STANDARD_ALARM_DONE_ACTION =
"com.android.deskclock.ALARM_DONE";
// Deprecated Android app
public static final String STANDARD_OLD_ALARM_PACKAGE = "com.android.alarmclock";
//-- MANUFACTURERS --------------------------------------------------------
// Samsung
public static final String SAMSUNG_ALARM_PACKAGE = "com.samsung.sec.android.clockpackage.alarm";
public static final String SAMSUNG_ALARM_PACKAGE_2 = "com.sec.android.app.clockpackage.alarm";
// HTC
public static final String HTC_ALARM_ALERT_PACKAGE = "com.htc.android.worldclock";
public static final String HTC_ONE_ALARM_ALERT_PACKAGE = "com.htc.android";
// Sony
public static final String SONY_ALARM_PACKAGE = "com.sonyericsson.alarm";
// ZTE
public static final String ZTE_ALARM_PACKAGE = "zte.com.cn.alarmclock";
// Motorola
public static final String MOTO_ALARM_PACKAGE = "com.motorola.blur.alarmclock";
// LG
public static final String LG_ALARM_PACKAGE = "com.lge.alarm.alarmclocknew";
//-- THIRD PARTY ----------------------------------------------------------
// Gentle Alarm
public static final String GENTLE_ALARM_PACKAGE = "com.mobitobi.android.gentlealarm";
// Sleep As Android
public static final String SLEEPASDROID_ALARM_PACKAGE = "com.urbandroid.sleep.alarmclock";
// Alarmdroid (1.13.2)
public static final String ALARMDROID_ALARM_PACKAGE = "com.splunchy.android.alarmclock";
// Timely
public static final String TIMELY_ALARM_PACKAGE = "ch.bitspin.timely";
//-- ALL-IN-ONE -----------------------------------------------------------
@NonNull
public static final String ALARMS[] = {
STANDARD_ALARM_PACKAGE,
STANDARD_OLD_ALARM_PACKAGE,
SAMSUNG_ALARM_PACKAGE,
SAMSUNG_ALARM_PACKAGE_2,
HTC_ALARM_ALERT_PACKAGE,
HTC_ONE_ALARM_ALERT_PACKAGE,
SONY_ALARM_PACKAGE,
ZTE_ALARM_PACKAGE,
MOTO_ALARM_PACKAGE,
LG_ALARM_PACKAGE,
GENTLE_ALARM_PACKAGE,
SLEEPASDROID_ALARM_PACKAGE,
ALARMDROID_ALARM_PACKAGE,
TIMELY_ALARM_PACKAGE
};
}
}