control media playback

This commit is contained in:
jens 2022-01-24 20:13:35 +01:00
parent 0c5b4d3874
commit 88f4d65b19
7 changed files with 186 additions and 113 deletions

View File

@ -41,6 +41,7 @@ public class Action
setDataConnection, setDataConnection,
speakText, speakText,
playMusic, playMusic,
controlMediaPlayback,
setScreenBrightness, setScreenBrightness,
playSound, playSound,
vibrate, vibrate,
@ -104,6 +105,8 @@ public class Action
return context.getResources().getString(R.string.actionSpeakText); return context.getResources().getString(R.string.actionSpeakText);
case playMusic: case playMusic:
return context.getResources().getString(R.string.actionPlayMusic); return context.getResources().getString(R.string.actionPlayMusic);
case controlMediaPlayback:
return context.getResources().getString(R.string.actionMediaControl);
case playSound: case playSound:
return context.getResources().getString(R.string.playSound); return context.getResources().getString(R.string.playSound);
case sendTextMessage: case sendTextMessage:
@ -160,7 +163,6 @@ public class Action
{ {
StringBuilder returnString = new StringBuilder(); StringBuilder returnString = new StringBuilder();
try try
{ {
switch (getAction()) switch (getAction())
@ -225,6 +227,9 @@ public class Action
case playMusic: case playMusic:
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.actionPlayMusic)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.actionPlayMusic));
break; break;
case controlMediaPlayback:
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.actionMediaControl));
break;
case sendTextMessage: case sendTextMessage:
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.sendTextMessage)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.sendTextMessage));
break; 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]); 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) else if (parameter2 != null && parameter2.length() > 0)
returnString.append(": " + parameter2.replace(Action.actionParameter2Split, "; ")); returnString.append(": " + parameter2.replace(Action.actionParameter2Split, "; "));
} }

View File

@ -1452,23 +1452,7 @@ public class Actions
playMusicIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); playMusicIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(playMusicIntent); 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; return true;
// }
// else
// {
// if(playMusicIntent != null)
// {
// context.stopService(playMusicIntent);
// }
// }
// return false;
} }
catch (ActivityNotFoundException e) 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() private String getTransactionCode()
{ {
try try

View File

@ -65,14 +65,11 @@ public class ActivityManageRule extends Activity
static ProgressDialog progressDialog = null; static ProgressDialog progressDialog = null;
static Trigger_Enum triggerType; static Trigger_Enum triggerType;
static boolean triggerParameter;
static PointOfInterest triggerPoi; static PointOfInterest triggerPoi;
static String triggerProcess; static String triggerProcess;
static int triggerBattery; static int triggerBattery;
static double triggerSpeed; static double triggerSpeed;
static double triggerNoise; static double triggerNoise;
static TimeFrame triggerTimeFrame;
static String triggerWifiName;
static Rule ruleToEdit; static Rule ruleToEdit;
static boolean newRule; static boolean newRule;
@ -604,7 +601,9 @@ public class ActivityManageRule extends Activity
return; return;
} }
else if(triggerType == Trigger_Enum.process_started_stopped) else if(triggerType == Trigger_Enum.process_started_stopped)
{
booleanChoices = new String[]{getResources().getString(R.string.started), getResources().getString(R.string.stopped)}; booleanChoices = new String[]{getResources().getString(R.string.started), getResources().getString(R.string.stopped)};
}
else if(triggerType == Trigger_Enum.notification) else if(triggerType == Trigger_Enum.notification)
{ {
newTrigger.setTriggerType(Trigger_Enum.notification); newTrigger.setTriggerType(Trigger_Enum.notification);
@ -700,6 +699,9 @@ public class ActivityManageRule extends Activity
} }
else else
getTriggerParameterDialog(context, booleanChoices).show(); 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)); items.add(new Item(typesLong[i].toString(), R.drawable.talking));
else if(types[i].toString().equals(Action_Enum.playMusic.toString())) else if(types[i].toString().equals(Action_Enum.playMusic.toString()))
items.add(new Item(typesLong[i].toString(), R.drawable.tune)); 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())) else if(types[i].toString().equals(Action_Enum.setScreenBrightness.toString()))
items.add(new Item(typesLong[i].toString(), R.drawable.brightness)); items.add(new Item(typesLong[i].toString(), R.drawable.brightness));
else if(types[i].toString().equals(Action_Enum.playSound.toString())) else if(types[i].toString().equals(Action_Enum.playSound.toString()))
@ -1778,6 +1782,11 @@ public class ActivityManageRule extends Activity
ruleToEdit.getActionSet().add(newAction); ruleToEdit.getActionSet().add(newAction);
refreshActionList(); 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())) else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.vibrate.toString()))
{ {
newAction.setAction(Action_Enum.vibrate); newAction.setAction(Action_Enum.vibrate);
@ -2019,8 +2028,29 @@ public class ActivityManageRule extends Activity
AlertDialog alertDialog = alertDialogBuilder.create(); AlertDialog alertDialog = alertDialogBuilder.create();
return alertDialog; 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() protected void refreshTriggerList()
{ {
Miscellaneous.logEvent("i", "ListView", "Attempting to update TriggerListView", 4); Miscellaneous.logEvent("i", "ListView", "Attempting to update TriggerListView", 4);

View File

@ -358,9 +358,10 @@ public class ActivityPermissions extends Activity
for (Rule rule : Rule.getRuleCollection()) for (Rule rule : Rule.getRuleCollection())
{ {
for (String singlePermission : getPermissionsForRule(rule)) for (String singlePermission : getPermissionsForRule(rule))
{
if (!havePermission(singlePermission, workingContext)) if (!havePermission(singlePermission, workingContext))
{ {
if( if (
singlePermission.equalsIgnoreCase(Manifest.permission.ACCESS_BACKGROUND_LOCATION) singlePermission.equalsIgnoreCase(Manifest.permission.ACCESS_BACKGROUND_LOCATION)
|| ||
@ -372,14 +373,15 @@ public class ActivityPermissions extends Activity
if (!Miscellaneous.googleToBlameForLocation(true)) if (!Miscellaneous.googleToBlameForLocation(true))
addToArrayListUnique(singlePermission, requiredPermissions); 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); addToArrayListUnique(singlePermission, requiredPermissions);
} }
else else
addToArrayListUnique(singlePermission, requiredPermissions); addToArrayListUnique(singlePermission, requiredPermissions);
} }
}
} }
} }
@ -527,6 +529,9 @@ public class ActivityPermissions extends Activity
break; break;
case playMusic: case playMusic:
break; break;
case controlMediaPlayback:
addToArrayListUnique(Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE, requiredPermissions);
break;
case sendTextMessage: case sendTextMessage:
addToArrayListUnique(Manifest.permission.SEND_SMS, requiredPermissions); addToArrayListUnique(Manifest.permission.SEND_SMS, requiredPermissions);
getPermissionsForVariablesInUse(action.getParameter2(), requiredPermissions); getPermissionsForVariablesInUse(action.getParameter2(), requiredPermissions);

View File

@ -37,6 +37,60 @@ import java.util.Date;
public class Trigger 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; Rule parentRule = null;
Calendar lastTimeNotApplied = null; Calendar lastTimeNotApplied = null;
@ -974,8 +1028,6 @@ public class Trigger
calSet.set(Calendar.SECOND, 0); calSet.set(Calendar.SECOND, 0);
calSet.set(Calendar.MILLISECOND, 0); calSet.set(Calendar.MILLISECOND, 0);
// if(this.applies(null))
// {
// If the starting time is a day ahead remove 1 day. // If the starting time is a day ahead remove 1 day.
if(calSet.getTimeInMillis() > now.getTimeInMillis()) if(calSet.getTimeInMillis() > now.getTimeInMillis())
calSet.add(Calendar.DAY_OF_MONTH, -1); calSet.add(Calendar.DAY_OF_MONTH, -1);
@ -986,15 +1038,7 @@ public class Trigger
Calendar calSchedule = Calendar.getInstance(); Calendar calSchedule = Calendar.getInstance();
calSchedule.setTimeInMillis(nextScheduleTimestamp * 1000); 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; return calSchedule;
// }
// }
} }
else else
Miscellaneous.logEvent("i", "Trigger", "Trigger " + trigger.toString() + " is not executed repeatedly.", 5); Miscellaneous.logEvent("i", "Trigger", "Trigger " + trigger.toString() + " is not executed repeatedly.", 5);
@ -1027,75 +1071,14 @@ public class Trigger
return false; return false;
} }
/* boolean triggerParameter; //if true->started event, if false->stopped
* Can be several things: String triggerParameter2;
* -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;
public static final String triggerParameter2Split = "tp2split"; public static final String triggerParameter2Split = "tp2split";
private Trigger_Enum triggerType = null; Trigger_Enum triggerType = null;
private PointOfInterest pointOfInterest = null; PointOfInterest pointOfInterest = null;
private TimeFrame timeFrame; TimeFrame timeFrame;
public static String triggerPhoneCallStateRinging = "ringing"; public static String triggerPhoneCallStateRinging = "ringing";
public static String triggerPhoneCallStateStarted = "started"; public static String triggerPhoneCallStateStarted = "started";
@ -1105,17 +1088,17 @@ public class Trigger
public static String triggerPhoneCallDirectionAny = "any"; public static String triggerPhoneCallDirectionAny = "any";
public static String triggerPhoneCallNumberAny = "any"; public static String triggerPhoneCallNumberAny = "any";
private double speed; //km/h double speed; //km/h
private long noiseLevelDb; long noiseLevelDb;
private String processName = null; String processName = null;
private int batteryLevel; int batteryLevel;
private int phoneDirection = 0; // 0=any, 1=incoming, 2=outgoing int phoneDirection = 0; // 0=any, 1=incoming, 2=outgoing
private String phoneNumber = null; String phoneNumber = null;
private String nfcTagId = null; String nfcTagId = null;
private String bluetoothEvent = null; String bluetoothEvent = null;
private String bluetoothDeviceAddress = null; String bluetoothDeviceAddress = null;
private int activityDetectionType = -1; int activityDetectionType = -1;
private int headphoneType = -1; int headphoneType = -1;
public int getHeadphoneType() public int getHeadphoneType()
{ {

View File

@ -1160,12 +1160,17 @@ public class XmlFileInterface
newAction.setAction(Action_Enum.disableScreenRotation); newAction.setAction(Action_Enum.disableScreenRotation);
else if(actionNameString.equals("disableScreenRotation")) else if(actionNameString.equals("disableScreenRotation"))
newAction.setAction(Action_Enum.disableScreenRotation); newAction.setAction(Action_Enum.disableScreenRotation);
else if(actionNameString.equals("playMusic"))
{
newAction.setAction(Action_Enum.controlMediaPlayback);
newAction.setParameter2("1");
}
else if(actionNameString.equals("wakeupDevice")) else if(actionNameString.equals("wakeupDevice"))
{ {
newAction.setAction(Action_Enum.turnScreenOnOrOff); newAction.setAction(Action_Enum.turnScreenOnOrOff);
newAction.setParameter1(true); newAction.setParameter1(true);
} }
// *** deprecated // *** :deprecated
else else
newAction.setAction(Action_Enum.valueOf(actionNameString)); newAction.setAction(Action_Enum.valueOf(actionNameString));

View File

@ -774,4 +774,12 @@
<string name="unlocked">unlocked</string> <string name="unlocked">unlocked</string>
<string name="selectDesiredState">Select desired state</string> <string name="selectDesiredState">Select desired state</string>
<string name="screenState">Screen 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> </resources>