167 lines
7.3 KiB
Java
167 lines
7.3 KiB
Java
package info.nightscout.androidaps.complications;
|
|
|
|
import android.app.PendingIntent;
|
|
import android.content.BroadcastReceiver;
|
|
import android.content.ComponentName;
|
|
import android.content.Context;
|
|
import android.content.Intent;
|
|
import android.os.Bundle;
|
|
import android.support.wearable.complications.ProviderUpdateRequester;
|
|
import android.util.Log;
|
|
import android.widget.Toast;
|
|
|
|
import androidx.annotation.StringRes;
|
|
|
|
import info.nightscout.androidaps.R;
|
|
import info.nightscout.androidaps.Aaps;
|
|
import info.nightscout.androidaps.interaction.actions.BolusActivity;
|
|
import info.nightscout.androidaps.interaction.actions.ECarbActivity;
|
|
import info.nightscout.androidaps.interaction.actions.WizardActivity;
|
|
import info.nightscout.androidaps.interaction.menus.MainMenuActivity;
|
|
import info.nightscout.androidaps.interaction.menus.StatusMenuActivity;
|
|
import info.nightscout.androidaps.interaction.utils.Constants;
|
|
import info.nightscout.androidaps.interaction.utils.DisplayFormat;
|
|
import info.nightscout.androidaps.interaction.utils.WearUtil;
|
|
|
|
/*
|
|
* Created by dlvoy on 2019-11-12
|
|
*/
|
|
public class ComplicationTapBroadcastReceiver extends BroadcastReceiver {
|
|
|
|
private static final String TAG = ComplicationTapBroadcastReceiver.class.getSimpleName();
|
|
|
|
private static final String EXTRA_PROVIDER_COMPONENT =
|
|
"info.nightscout.androidaps.complications.action.PROVIDER_COMPONENT";
|
|
private static final String EXTRA_COMPLICATION_ID =
|
|
"info.nightscout.androidaps.complications.action.COMPLICATION_ID";
|
|
private static final String EXTRA_COMPLICATION_ACTION =
|
|
"info.nightscout.androidaps.complications.action.COMPLICATION_ACTION";
|
|
private static final String EXTRA_COMPLICATION_SINCE =
|
|
"info.nightscout.androidaps.complications.action.COMPLICATION_SINCE";
|
|
|
|
@Override
|
|
public void onReceive(Context context, Intent intent) {
|
|
Bundle extras = intent.getExtras();
|
|
ComponentName provider = extras.getParcelable(EXTRA_PROVIDER_COMPONENT);
|
|
int complicationId = extras.getInt(EXTRA_COMPLICATION_ID);
|
|
String complicationAction = extras.getString(EXTRA_COMPLICATION_ACTION, ComplicationAction.MENU.toString());
|
|
|
|
ComplicationAction action = ComplicationAction.MENU;
|
|
try {
|
|
action = ComplicationAction.valueOf(ComplicationAction.class, complicationAction);
|
|
} catch (IllegalArgumentException | NullPointerException ex) {
|
|
// but how?
|
|
Log.e(TAG, "Cannot interpret complication action: "+complicationAction);
|
|
}
|
|
|
|
action = remapActionWithUserPreferences(action);
|
|
|
|
// Request an update for the complication that has just been tapped.
|
|
ProviderUpdateRequester requester = new ProviderUpdateRequester(context, provider);
|
|
requester.requestUpdate(complicationId);
|
|
|
|
Intent intentOpen = null;
|
|
|
|
switch (action) {
|
|
case NONE:
|
|
// do nothing
|
|
return;
|
|
case WIZARD:
|
|
intentOpen = new Intent(Aaps.getAppContext(), WizardActivity.class);
|
|
break;
|
|
case BOLUS:
|
|
intentOpen = new Intent(Aaps.getAppContext(), BolusActivity.class);
|
|
break;
|
|
case ECARB:
|
|
intentOpen = new Intent(Aaps.getAppContext(), ECarbActivity.class);
|
|
break;
|
|
case STATUS:
|
|
intentOpen = new Intent(Aaps.getAppContext(), StatusMenuActivity.class);
|
|
break;
|
|
case WARNING_OLD:
|
|
case WARNING_SYNC:
|
|
long oneAndHalfMinuteAgo = WearUtil.timestamp() - (Constants.MINUTE_IN_MS+Constants.SECOND_IN_MS * 30);
|
|
long since = extras.getLong(EXTRA_COMPLICATION_SINCE, oneAndHalfMinuteAgo);
|
|
@StringRes int labelId = (action == ComplicationAction.WARNING_SYNC) ?
|
|
R.string.msg_warning_sync : R.string.msg_warning_old;
|
|
String msg = String.format(context.getString(labelId), DisplayFormat.shortTimeSince(since));
|
|
Toast.makeText(Aaps.getAppContext(), msg, Toast.LENGTH_LONG).show();
|
|
break;
|
|
case MENU:
|
|
default:
|
|
intentOpen = new Intent(Aaps.getAppContext(), MainMenuActivity.class);
|
|
}
|
|
|
|
if (intentOpen != null) {
|
|
// Perform intent - open dialog
|
|
intentOpen.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
|
Aaps.getAppContext().startActivity(intentOpen);
|
|
}
|
|
}
|
|
|
|
private ComplicationAction remapActionWithUserPreferences(ComplicationAction originalAction) {
|
|
final String userPrefAction = Aaps.getComplicationTapAction();
|
|
switch (originalAction) {
|
|
case WARNING_OLD:
|
|
case WARNING_SYNC:
|
|
// warnings cannot be reconfigured by user
|
|
return originalAction;
|
|
default:
|
|
switch (userPrefAction) {
|
|
case "menu":
|
|
return ComplicationAction.MENU;
|
|
case "wizard":
|
|
return ComplicationAction.WIZARD;
|
|
case "bolus":
|
|
return ComplicationAction.BOLUS;
|
|
case "ecarb":
|
|
return ComplicationAction.ECARB;
|
|
case "status":
|
|
return ComplicationAction.STATUS;
|
|
case "none":
|
|
return ComplicationAction.NONE;
|
|
case "default":
|
|
default:
|
|
return originalAction;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Returns a pending intent, suitable for use as a tap intent, that causes a complication to be
|
|
* toggled and updated.
|
|
*/
|
|
static PendingIntent getTapActionIntent(
|
|
Context context, ComponentName provider, int complicationId, ComplicationAction action) {
|
|
Intent intent = new Intent(context, ComplicationTapBroadcastReceiver.class);
|
|
intent.putExtra(EXTRA_PROVIDER_COMPONENT, provider);
|
|
intent.putExtra(EXTRA_COMPLICATION_ID, complicationId);
|
|
intent.putExtra(EXTRA_COMPLICATION_ACTION, action.toString());
|
|
|
|
|
|
// Pass complicationId as the requestCode to ensure that different complications get
|
|
// different intents.
|
|
return PendingIntent.getBroadcast(
|
|
context, complicationId, intent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
|
|
}
|
|
|
|
/**
|
|
* Returns a pending intent, suitable for use as a tap intent, that causes a complication to be
|
|
* toggled and updated.
|
|
*/
|
|
static PendingIntent getTapWarningSinceIntent(
|
|
Context context, ComponentName provider, int complicationId, ComplicationAction action, long since) {
|
|
Intent intent = new Intent(context, ComplicationTapBroadcastReceiver.class);
|
|
intent.putExtra(EXTRA_PROVIDER_COMPONENT, provider);
|
|
intent.putExtra(EXTRA_COMPLICATION_ID, complicationId);
|
|
intent.putExtra(EXTRA_COMPLICATION_ACTION, action.toString());
|
|
intent.putExtra(EXTRA_COMPLICATION_SINCE, since);
|
|
|
|
|
|
// Pass complicationId as the requestCode to ensure that different complications get
|
|
// different intents.
|
|
return PendingIntent.getBroadcast(
|
|
context, complicationId, intent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);
|
|
}
|
|
|
|
}
|