control media playback
This commit is contained in:
parent
0c5b4d3874
commit
88f4d65b19
@ -41,6 +41,7 @@ public class Action
|
||||
setDataConnection,
|
||||
speakText,
|
||||
playMusic,
|
||||
controlMediaPlayback,
|
||||
setScreenBrightness,
|
||||
playSound,
|
||||
vibrate,
|
||||
@ -104,6 +105,8 @@ public class Action
|
||||
return context.getResources().getString(R.string.actionSpeakText);
|
||||
case playMusic:
|
||||
return context.getResources().getString(R.string.actionPlayMusic);
|
||||
case controlMediaPlayback:
|
||||
return context.getResources().getString(R.string.actionMediaControl);
|
||||
case playSound:
|
||||
return context.getResources().getString(R.string.playSound);
|
||||
case sendTextMessage:
|
||||
@ -160,7 +163,6 @@ public class Action
|
||||
{
|
||||
StringBuilder returnString = new StringBuilder();
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
switch (getAction())
|
||||
@ -225,6 +227,9 @@ public class Action
|
||||
case playMusic:
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.actionPlayMusic));
|
||||
break;
|
||||
case controlMediaPlayback:
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.actionMediaControl));
|
||||
break;
|
||||
case sendTextMessage:
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.sendTextMessage));
|
||||
break;
|
||||
@ -311,6 +316,27 @@ public class Action
|
||||
returnString.append(", " + Miscellaneous.getAnyContext().getResources().getString(R.string.ifString) + " " + Miscellaneous.getAnyContext().getResources().getString(R.string.text) + " " + Trigger.getMatchString(parts[3]) + " " + parts[4]);
|
||||
|
||||
}
|
||||
else if(this.getAction().equals(Action_Enum.controlMediaPlayback))
|
||||
{
|
||||
switch (this.getParameter2())
|
||||
{
|
||||
case "0":
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.playPause));
|
||||
break;
|
||||
case "1":
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.play));
|
||||
break;
|
||||
case "2":
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.pause));
|
||||
break;
|
||||
case "3":
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.previous));
|
||||
break;
|
||||
case "4":
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.next));
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (parameter2 != null && parameter2.length() > 0)
|
||||
returnString.append(": " + parameter2.replace(Action.actionParameter2Split, "; "));
|
||||
}
|
||||
|
@ -1452,23 +1452,7 @@ public class Actions
|
||||
playMusicIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
context.startActivity(playMusicIntent);
|
||||
|
||||
// playMusicIntent = new Intent();
|
||||
// playMusicIntent.setAction(android.content.Intent.ACTION_VIEW);
|
||||
// File file = new File(YOUR_SONG_URI);
|
||||
// playMusicIntent.setDataAndType(Uri.fromFile(file), "audio/*");
|
||||
// context.startActivity(playMusicIntent);
|
||||
|
||||
return true;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// if(playMusicIntent != null)
|
||||
// {
|
||||
// context.stopService(playMusicIntent);
|
||||
// }
|
||||
// }
|
||||
|
||||
// return false;
|
||||
}
|
||||
catch (ActivityNotFoundException e)
|
||||
{
|
||||
@ -1484,6 +1468,38 @@ public class Actions
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean controlMediaPlayback(Context context, int command)
|
||||
{
|
||||
AudioManager mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
|
||||
|
||||
if (mAudioManager.isMusicActive()) {
|
||||
|
||||
Intent.CATEGORY_APP_MUSIC
|
||||
Intent i = new Intent("com.android.music.musicservicecommand");
|
||||
|
||||
i.putExtra("command", "pause");
|
||||
|
||||
switch(command)
|
||||
{
|
||||
public static final String SERVICECMD = "com.android.music.musicservicecommand";
|
||||
public static final String CMDNAME = "command";
|
||||
|
||||
public static final String CMDSTOP = "stop";
|
||||
public static final String CMDPAUSE = "pause";
|
||||
public static final String CMDPREVIOUS = "previous";
|
||||
public static final String CMDNEXT = "next";
|
||||
|
||||
case 0:
|
||||
i.putExtra("command", "togglepause");
|
||||
break;
|
||||
case 2:
|
||||
i.putExtra("command", "pause");
|
||||
break;
|
||||
}
|
||||
context.this.sendBroadcast(i);
|
||||
}
|
||||
}
|
||||
|
||||
private String getTransactionCode()
|
||||
{
|
||||
try
|
||||
|
@ -65,14 +65,11 @@ public class ActivityManageRule extends Activity
|
||||
static ProgressDialog progressDialog = null;
|
||||
|
||||
static Trigger_Enum triggerType;
|
||||
static boolean triggerParameter;
|
||||
static PointOfInterest triggerPoi;
|
||||
static String triggerProcess;
|
||||
static int triggerBattery;
|
||||
static double triggerSpeed;
|
||||
static double triggerNoise;
|
||||
static TimeFrame triggerTimeFrame;
|
||||
static String triggerWifiName;
|
||||
|
||||
static Rule ruleToEdit;
|
||||
static boolean newRule;
|
||||
@ -604,7 +601,9 @@ public class ActivityManageRule extends Activity
|
||||
return;
|
||||
}
|
||||
else if(triggerType == Trigger_Enum.process_started_stopped)
|
||||
{
|
||||
booleanChoices = new String[]{getResources().getString(R.string.started), getResources().getString(R.string.stopped)};
|
||||
}
|
||||
else if(triggerType == Trigger_Enum.notification)
|
||||
{
|
||||
newTrigger.setTriggerType(Trigger_Enum.notification);
|
||||
@ -700,6 +699,9 @@ public class ActivityManageRule extends Activity
|
||||
}
|
||||
else
|
||||
getTriggerParameterDialog(context, booleanChoices).show();
|
||||
|
||||
if(triggerType.equals(Trigger_Enum.process_started_stopped))
|
||||
Miscellaneous.messageBox(getResources().getString(R.string.info), String.format(getResources().getString(R.string.featureCeasedToWorkLastWorkingAndroidVersion), "7"), ActivityManageRule.this).show();
|
||||
}
|
||||
});
|
||||
|
||||
@ -1612,6 +1614,8 @@ public class ActivityManageRule extends Activity
|
||||
items.add(new Item(typesLong[i].toString(), R.drawable.talking));
|
||||
else if(types[i].toString().equals(Action_Enum.playMusic.toString()))
|
||||
items.add(new Item(typesLong[i].toString(), R.drawable.tune));
|
||||
else if(types[i].toString().equals(Action_Enum.controlMediaPlayback.toString()))
|
||||
items.add(new Item(typesLong[i].toString(), R.drawable.tune));
|
||||
else if(types[i].toString().equals(Action_Enum.setScreenBrightness.toString()))
|
||||
items.add(new Item(typesLong[i].toString(), R.drawable.brightness));
|
||||
else if(types[i].toString().equals(Action_Enum.playSound.toString()))
|
||||
@ -1778,6 +1782,11 @@ public class ActivityManageRule extends Activity
|
||||
ruleToEdit.getActionSet().add(newAction);
|
||||
refreshActionList();
|
||||
}
|
||||
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.controlMediaPlayback.toString()))
|
||||
{
|
||||
newAction.setAction(Action_Enum.controlMediaPlayback);
|
||||
getActionControlMediaPlayback(ActivityManageRule.this).show();
|
||||
}
|
||||
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.vibrate.toString()))
|
||||
{
|
||||
newAction.setAction(Action_Enum.vibrate);
|
||||
@ -2019,8 +2028,29 @@ public class ActivityManageRule extends Activity
|
||||
AlertDialog alertDialog = alertDialogBuilder.create();
|
||||
|
||||
return alertDialog;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private AlertDialog getActionControlMediaPlayback(final Context myContext)
|
||||
{
|
||||
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
|
||||
alertDialogBuilder.setTitle(myContext.getResources().getString(R.string.selectCommand));
|
||||
final String choices[] = { myContext.getString(R.string.playPause), myContext.getString(R.string.play), myContext.getString(R.string.pause), myContext.getString(R.string.previous), myContext.getString(R.string.next) };
|
||||
alertDialogBuilder.setItems(choices, new DialogInterface.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which)
|
||||
{
|
||||
newAction.setParameter2(String.valueOf(which));
|
||||
|
||||
ruleToEdit.getActionSet().add(newAction);
|
||||
refreshActionList();
|
||||
}
|
||||
});
|
||||
AlertDialog alertDialog = alertDialogBuilder.create();
|
||||
|
||||
return alertDialog;
|
||||
}
|
||||
|
||||
protected void refreshTriggerList()
|
||||
{
|
||||
Miscellaneous.logEvent("i", "ListView", "Attempting to update TriggerListView", 4);
|
||||
|
@ -358,9 +358,10 @@ public class ActivityPermissions extends Activity
|
||||
for (Rule rule : Rule.getRuleCollection())
|
||||
{
|
||||
for (String singlePermission : getPermissionsForRule(rule))
|
||||
{
|
||||
if (!havePermission(singlePermission, workingContext))
|
||||
{
|
||||
if(
|
||||
if (
|
||||
|
||||
singlePermission.equalsIgnoreCase(Manifest.permission.ACCESS_BACKGROUND_LOCATION)
|
||||
||
|
||||
@ -372,14 +373,15 @@ public class ActivityPermissions extends Activity
|
||||
if (!Miscellaneous.googleToBlameForLocation(true))
|
||||
addToArrayListUnique(singlePermission, requiredPermissions);
|
||||
}
|
||||
else if(singlePermission.equalsIgnoreCase(Manifest.permission.ACTIVITY_RECOGNITION) || singlePermission.equalsIgnoreCase(permissionNameGoogleActivityDetection))
|
||||
else if (singlePermission.equalsIgnoreCase(Manifest.permission.ACTIVITY_RECOGNITION) || singlePermission.equalsIgnoreCase(permissionNameGoogleActivityDetection))
|
||||
{
|
||||
if(!BuildConfig.FLAVOR.equalsIgnoreCase("fdroidFlavor"))
|
||||
if (!BuildConfig.FLAVOR.equalsIgnoreCase("fdroidFlavor"))
|
||||
addToArrayListUnique(singlePermission, requiredPermissions);
|
||||
}
|
||||
else
|
||||
addToArrayListUnique(singlePermission, requiredPermissions);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -527,6 +529,9 @@ public class ActivityPermissions extends Activity
|
||||
break;
|
||||
case playMusic:
|
||||
break;
|
||||
case controlMediaPlayback:
|
||||
addToArrayListUnique(Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE, requiredPermissions);
|
||||
break;
|
||||
case sendTextMessage:
|
||||
addToArrayListUnique(Manifest.permission.SEND_SMS, requiredPermissions);
|
||||
getPermissionsForVariablesInUse(action.getParameter2(), requiredPermissions);
|
||||
|
@ -37,6 +37,60 @@ import java.util.Date;
|
||||
|
||||
public class Trigger
|
||||
{
|
||||
public enum Trigger_Enum {
|
||||
pointOfInterest, timeFrame, charging, batteryLevel, usb_host_connection, speed, noiseLevel, wifiConnection, process_started_stopped, airplaneMode, roaming, nfcTag, activityDetection, bluetoothConnection, headsetPlugged, notification, deviceOrientation, profileActive, screenState, phoneCall; //phoneCall always needs to be at the very end because of Google's shitty so called privacy
|
||||
|
||||
public String getFullName(Context context)
|
||||
{
|
||||
switch(this)
|
||||
{
|
||||
case pointOfInterest:
|
||||
return context.getResources().getString(R.string.triggerPointOfInterest);
|
||||
case timeFrame:
|
||||
return context.getResources().getString(R.string.triggerTimeFrame);
|
||||
case charging:
|
||||
return context.getResources().getString(R.string.triggerCharging);
|
||||
case batteryLevel:
|
||||
return context.getResources().getString(R.string.batteryLevel);
|
||||
case usb_host_connection:
|
||||
return context.getResources().getString(R.string.triggerUsb_host_connection);
|
||||
case speed:
|
||||
return context.getResources().getString(R.string.triggerSpeed);
|
||||
case noiseLevel:
|
||||
return context.getResources().getString(R.string.triggerNoiseLevel);
|
||||
case wifiConnection:
|
||||
return context.getResources().getString(R.string.wifiConnection);
|
||||
case process_started_stopped:
|
||||
return context.getResources().getString(R.string.anotherAppIsRunning);
|
||||
case airplaneMode:
|
||||
return context.getResources().getString(R.string.airplaneMode);
|
||||
case roaming:
|
||||
return context.getResources().getString(R.string.roaming);
|
||||
case phoneCall:
|
||||
return context.getResources().getString(R.string.phoneCall);
|
||||
case nfcTag:
|
||||
return context.getResources().getString(R.string.nfcTag);
|
||||
case activityDetection:
|
||||
return context.getResources().getString(R.string.activityDetection);
|
||||
case bluetoothConnection:
|
||||
return context.getResources().getString(R.string.bluetoothConnection);
|
||||
case headsetPlugged:
|
||||
return context.getResources().getString(R.string.triggerHeadsetPlugged);
|
||||
case notification:
|
||||
return context.getResources().getString(R.string.notification);
|
||||
case deviceOrientation:
|
||||
return context.getResources().getString(R.string.deviceOrientation);
|
||||
case profileActive:
|
||||
return context.getResources().getString(R.string.profile);
|
||||
case screenState:
|
||||
return context.getResources().getString(R.string.screenState);
|
||||
default:
|
||||
return "Unknown";
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
Rule parentRule = null;
|
||||
Calendar lastTimeNotApplied = null;
|
||||
|
||||
@ -974,8 +1028,6 @@ public class Trigger
|
||||
calSet.set(Calendar.SECOND, 0);
|
||||
calSet.set(Calendar.MILLISECOND, 0);
|
||||
|
||||
// if(this.applies(null))
|
||||
// {
|
||||
// If the starting time is a day ahead remove 1 day.
|
||||
if(calSet.getTimeInMillis() > now.getTimeInMillis())
|
||||
calSet.add(Calendar.DAY_OF_MONTH, -1);
|
||||
@ -986,15 +1038,7 @@ public class Trigger
|
||||
Calendar calSchedule = Calendar.getInstance();
|
||||
calSchedule.setTimeInMillis(nextScheduleTimestamp * 1000);
|
||||
|
||||
/*
|
||||
* Das war mal aktiviert. Allerdings: Die ganze Funktion liefert zurück, wenn die Regel NOCH nicht
|
||||
* zutrifft, aber wir z.B. gleich den zeitlichen Bereich betreten.
|
||||
*/
|
||||
// if(trigger.checkDateTime(calSchedule.getTime(), false))
|
||||
// {
|
||||
return calSchedule;
|
||||
// }
|
||||
// }
|
||||
}
|
||||
else
|
||||
Miscellaneous.logEvent("i", "Trigger", "Trigger " + trigger.toString() + " is not executed repeatedly.", 5);
|
||||
@ -1027,75 +1071,14 @@ public class Trigger
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Can be several things:
|
||||
* -PointOfInterest
|
||||
* -TimeFrame
|
||||
* -Event (like charging, cable plugged, etc.)
|
||||
*/
|
||||
|
||||
public enum Trigger_Enum {
|
||||
pointOfInterest, timeFrame, charging, batteryLevel, usb_host_connection, speed, noiseLevel, wifiConnection, process_started_stopped, airplaneMode, roaming, nfcTag, activityDetection, bluetoothConnection, headsetPlugged, notification, deviceOrientation, profileActive, screenState, phoneCall; //phoneCall always needs to be at the very end because of Google's shitty so called privacy
|
||||
|
||||
public String getFullName(Context context)
|
||||
{
|
||||
switch(this)
|
||||
{
|
||||
case pointOfInterest:
|
||||
return context.getResources().getString(R.string.triggerPointOfInterest);
|
||||
case timeFrame:
|
||||
return context.getResources().getString(R.string.triggerTimeFrame);
|
||||
case charging:
|
||||
return context.getResources().getString(R.string.triggerCharging);
|
||||
case batteryLevel:
|
||||
return context.getResources().getString(R.string.batteryLevel);
|
||||
case usb_host_connection:
|
||||
return context.getResources().getString(R.string.triggerUsb_host_connection);
|
||||
case speed:
|
||||
return context.getResources().getString(R.string.triggerSpeed);
|
||||
case noiseLevel:
|
||||
return context.getResources().getString(R.string.triggerNoiseLevel);
|
||||
case wifiConnection:
|
||||
return context.getResources().getString(R.string.wifiConnection);
|
||||
case process_started_stopped:
|
||||
return context.getResources().getString(R.string.anotherAppIsRunning);
|
||||
case airplaneMode:
|
||||
return context.getResources().getString(R.string.airplaneMode);
|
||||
case roaming:
|
||||
return context.getResources().getString(R.string.roaming);
|
||||
case phoneCall:
|
||||
return context.getResources().getString(R.string.phoneCall);
|
||||
case nfcTag:
|
||||
return context.getResources().getString(R.string.nfcTag);
|
||||
case activityDetection:
|
||||
return context.getResources().getString(R.string.activityDetection);
|
||||
case bluetoothConnection:
|
||||
return context.getResources().getString(R.string.bluetoothConnection);
|
||||
case headsetPlugged:
|
||||
return context.getResources().getString(R.string.triggerHeadsetPlugged);
|
||||
case notification:
|
||||
return context.getResources().getString(R.string.notification);
|
||||
case deviceOrientation:
|
||||
return context.getResources().getString(R.string.deviceOrientation);
|
||||
case profileActive:
|
||||
return context.getResources().getString(R.string.profile);
|
||||
case screenState:
|
||||
return context.getResources().getString(R.string.screenState);
|
||||
default:
|
||||
return "Unknown";
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
private boolean triggerParameter; //if true->started event, if false->stopped
|
||||
private String triggerParameter2;
|
||||
boolean triggerParameter; //if true->started event, if false->stopped
|
||||
String triggerParameter2;
|
||||
|
||||
public static final String triggerParameter2Split = "tp2split";
|
||||
|
||||
private Trigger_Enum triggerType = null;
|
||||
private PointOfInterest pointOfInterest = null;
|
||||
private TimeFrame timeFrame;
|
||||
Trigger_Enum triggerType = null;
|
||||
PointOfInterest pointOfInterest = null;
|
||||
TimeFrame timeFrame;
|
||||
|
||||
public static String triggerPhoneCallStateRinging = "ringing";
|
||||
public static String triggerPhoneCallStateStarted = "started";
|
||||
@ -1105,17 +1088,17 @@ public class Trigger
|
||||
public static String triggerPhoneCallDirectionAny = "any";
|
||||
public static String triggerPhoneCallNumberAny = "any";
|
||||
|
||||
private double speed; //km/h
|
||||
private long noiseLevelDb;
|
||||
private String processName = null;
|
||||
private int batteryLevel;
|
||||
private int phoneDirection = 0; // 0=any, 1=incoming, 2=outgoing
|
||||
private String phoneNumber = null;
|
||||
private String nfcTagId = null;
|
||||
private String bluetoothEvent = null;
|
||||
private String bluetoothDeviceAddress = null;
|
||||
private int activityDetectionType = -1;
|
||||
private int headphoneType = -1;
|
||||
double speed; //km/h
|
||||
long noiseLevelDb;
|
||||
String processName = null;
|
||||
int batteryLevel;
|
||||
int phoneDirection = 0; // 0=any, 1=incoming, 2=outgoing
|
||||
String phoneNumber = null;
|
||||
String nfcTagId = null;
|
||||
String bluetoothEvent = null;
|
||||
String bluetoothDeviceAddress = null;
|
||||
int activityDetectionType = -1;
|
||||
int headphoneType = -1;
|
||||
|
||||
public int getHeadphoneType()
|
||||
{
|
||||
|
@ -1160,12 +1160,17 @@ public class XmlFileInterface
|
||||
newAction.setAction(Action_Enum.disableScreenRotation);
|
||||
else if(actionNameString.equals("disableScreenRotation"))
|
||||
newAction.setAction(Action_Enum.disableScreenRotation);
|
||||
else if(actionNameString.equals("playMusic"))
|
||||
{
|
||||
newAction.setAction(Action_Enum.controlMediaPlayback);
|
||||
newAction.setParameter2("1");
|
||||
}
|
||||
else if(actionNameString.equals("wakeupDevice"))
|
||||
{
|
||||
newAction.setAction(Action_Enum.turnScreenOnOrOff);
|
||||
newAction.setParameter1(true);
|
||||
}
|
||||
// *** deprecated
|
||||
// *** :deprecated
|
||||
|
||||
else
|
||||
newAction.setAction(Action_Enum.valueOf(actionNameString));
|
||||
|
@ -774,4 +774,12 @@
|
||||
<string name="unlocked">unlocked</string>
|
||||
<string name="selectDesiredState">Select desired state</string>
|
||||
<string name="screenState">Screen state</string>
|
||||
<string name="featureCeasedToWorkLastWorkingAndroidVersion">Because of Google\'s infinite wisdom, the last Android version this feature is known to work on is %1$s. You can configure it, but it probably will not have any effect.</string>
|
||||
<string name="actionMediaControl">Control media playback</string>
|
||||
<string name="selectCommand">Select command</string>
|
||||
<string name="playPause">toggle play/pause</string>
|
||||
<string name="play">play</string>
|
||||
<string name="pause">pause</string>
|
||||
<string name="previous">previous</string>
|
||||
<string name="next">next</string>
|
||||
</resources>
|
Loading…
Reference in New Issue
Block a user