forked from jens/Automation
		
	control media playback
This commit is contained in:
		| @@ -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> | ||||
		Reference in New Issue
	
	Block a user