package org.primftpd.remotecontrol;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Bundle;
import org.primftpd.PrefsBean;
import org.primftpd.prefs.LoadPrefsUtil;
import org.primftpd.util.ServersRunningBean;
import org.primftpd.util.ServicesStartStopUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TaskerReceiver extends BroadcastReceiver {
protected static Logger logger = LoggerFactory.getLogger(TaskerReceiver.class);
// see
// https://github.com/twofortyfouram/android-plugin-api-for-locale/blob/master/pluginApiLib/src/main/java/com/twofortyfouram/locale/api/Intent.java
private static final String ACTION_FIRE_SETTING = "com.twofortyfouram.locale.intent.action.FIRE_SETTING";
private static final String ACTION_QUERY_CONDITION = "com.twofortyfouram.locale.intent.action.QUERY_CONDITION";
private static final String ACTION_REQUEST_QUERY = "com.twofortyfouram.locale.intent.action.REQUEST_QUERY";
private static final String EXTRA_BUNDLE = "com.twofortyfouram.locale.intent.extra.BUNDLE";
private static final String EXTRA_STRING_BLURB = "com.twofortyfouram.locale.intent.extra.BLURB";
private static final String EXTRA_STRING_ACTIVITY_CLASS_NAME = "com.twofortyfouram.locale.intent.extra.ACTIVITY_CLASS_NAME";
private static final int RESULT_CONDITION_SATISFIED = 16;
private static final int RESULT_CONDITION_UNSATISFIED = 17;
@Override
public void onReceive(Context context, Intent intent) {
// note: can be tested with:
// adb shell
// am broadcast -a com.twofortyfouram.locale.intent.action.FIRE_SETTING --es com.twofortyfouram.locale.intent.extra.BLURB "start server(s)"
String blurb = null;
if (intent.getExtras() != null) {
blurb = intent.getExtras().getString(EXTRA_STRING_BLURB);
}
logger.debug("onReceive() action: '{}', blurb: '{}'", intent.getAction(), blurb);
if (ACTION_FIRE_SETTING.equals(intent.getAction())) {
TaskerAction action = TaskerAction.byBlurb(blurb);
if (action != null) {
ServersRunningBean runningBean = ServicesStartStopUtil.checkServicesRunning(context);
boolean running = runningBean.atLeastOneRunning();
switch (action) {
case START:
if (!running) {
startServer(context);
}
break;
case STOP:
if (running) {
stopServer(context);
}
break;
case TOGGLE:
if (running) {
stopServer(context);
} else {
startServer(context);
}
break;
}
}
} else if (ACTION_QUERY_CONDITION.equals(intent.getAction())) {
TaskerCondition condition = TaskerCondition.byBlurb(blurb);
if (condition != null) {
ServersRunningBean runningBean = ServicesStartStopUtil.checkServicesRunning(context);
boolean running = runningBean.atLeastOneRunning();
switch (condition) {
case IS_SERVER_RUNNING:
int conditionResult = running ? RESULT_CONDITION_SATISFIED : RESULT_CONDITION_UNSATISFIED;
logger.debug("got query condition with blurb: {}, setting result: {}",
blurb, Boolean.valueOf(running));
setResultCode(conditionResult);
break;
}
}
}
}
private void startServer(Context context) {
SharedPreferences prefs = LoadPrefsUtil.getPrefs(context);
PrefsBean prefsBean = LoadPrefsUtil.loadPrefs(logger, prefs);
ServicesStartStopUtil.startServers(context, prefsBean, null);
}
private void stopServer(Context context) {
ServicesStartStopUtil.stopServers(context);
}
private static final String PACKAGE_NAME = TaskerReceiver.class.getPackage().getName();
private static final String BUNDLE_EXTRA_INT_VERSION_CODE = PACKAGE_NAME + ".extra.INT_VERSION_CODE";
public static Intent buildResultIntent(final Context context, String blurb) {
final Intent resultIntent = new Intent();
final Bundle resultBundle = generateBundle(context);
resultIntent.putExtra(EXTRA_BUNDLE, resultBundle);
resultIntent.putExtra(EXTRA_STRING_BLURB, blurb);
return resultIntent;
}
private static Bundle generateBundle(final Context context) {
final Bundle result = new Bundle();
result.putInt(BUNDLE_EXTRA_INT_VERSION_CODE, getVersionCode(context));
return result;
}
private static int getVersionCode(final Context context) {
try {
return context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionCode;
} catch (PackageManager.NameNotFoundException e) {
logger.error("", e);
return 0;
}
}
public static void sendRequestQueryCondition(Context context) {
final Intent intent = new Intent(ACTION_REQUEST_QUERY);
intent.putExtra(EXTRA_STRING_ACTIVITY_CLASS_NAME, TaskerEditConditionActivity.class.getName());
logger.debug("sending tasker RequestQueryCondition");
context.sendBroadcast(intent);
}
}