diff --git a/app/src/main/java/com/jens/automation2/ActivityManageRule.java b/app/src/main/java/com/jens/automation2/ActivityManageRule.java index 954e620..82c2131 100644 --- a/app/src/main/java/com/jens/automation2/ActivityManageRule.java +++ b/app/src/main/java/com/jens/automation2/ActivityManageRule.java @@ -525,6 +525,8 @@ public class ActivityManageRule extends Activity items.add(new Item(typesLong[i].toString(), R.drawable.smartphone)); else if(types[i].toString().equals(Trigger_Enum.profileActive.toString())) items.add(new Item(typesLong[i].toString(), R.drawable.sound)); + else if(types[i].toString().equals(Trigger_Enum.musicPlaying.toString())) + items.add(new Item(typesLong[i].toString(), R.drawable.sound)); else if(types[i].toString().equals(Trigger_Enum.screenState.toString())) items.add(new Item(typesLong[i].toString(), R.drawable.smartphone)); else @@ -587,7 +589,7 @@ public class ActivityManageRule extends Activity startActivityForResult(timeFrameEditor, requestCodeTriggerTimeframeAdd); return; } - else if(triggerType == Trigger_Enum.charging) + else if(triggerType == Trigger_Enum.charging || triggerType == Trigger_Enum.musicPlaying) booleanChoices = new String[]{getResources().getString(R.string.started), getResources().getString(R.string.stopped)}; else if(triggerType == Trigger_Enum.usb_host_connection) booleanChoices = new String[]{getResources().getString(R.string.connected), getResources().getString(R.string.disconnected)}; @@ -718,7 +720,7 @@ public class ActivityManageRule extends Activity private AlertDialog getTriggerParameterDialog(final Context myContext, final String[] choices) { AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context); - alertDialogBuilder.setTitle(getResources().getString(R.string.selectTypeOfTrigger)); + alertDialogBuilder.setTitle(getResources().getString(R.string.selectParameters)); alertDialogBuilder.setItems(choices, new DialogInterface.OnClickListener() { @Override diff --git a/app/src/main/java/com/jens/automation2/ReceiverCoordinator.java b/app/src/main/java/com/jens/automation2/ReceiverCoordinator.java index 5613da2..ef1333f 100644 --- a/app/src/main/java/com/jens/automation2/ReceiverCoordinator.java +++ b/app/src/main/java/com/jens/automation2/ReceiverCoordinator.java @@ -12,6 +12,7 @@ import com.jens.automation2.receivers.BluetoothReceiver; import com.jens.automation2.receivers.ConnectivityReceiver; import com.jens.automation2.receivers.DeviceOrientationListener; import com.jens.automation2.receivers.HeadphoneJackListener; +import com.jens.automation2.receivers.MediaPlayerListener; import com.jens.automation2.receivers.NoiseListener; import com.jens.automation2.receivers.PhoneStatusListener; import com.jens.automation2.receivers.ProcessListener; @@ -55,6 +56,7 @@ public class ReceiverCoordinator //NotificationListener.class, PhoneStatusListener.class, ProcessListener.class, + MediaPlayerListener.class, ScreenStateReceiver.class, TimeZoneListener.class }; @@ -186,6 +188,9 @@ public class ReceiverCoordinator if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.headsetPlugged)) HeadphoneJackListener.getInstance().startListener(AutomationService.getInstance()); + if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.musicPlaying)) + MediaPlayerListener.getInstance().startListener(AutomationService.getInstance()); + if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.screenState)) ScreenStateReceiver.startScreenStateReceiver(AutomationService.getInstance()); } @@ -202,6 +207,7 @@ public class ReceiverCoordinator DateTimeListener.stopAlarmListener(AutomationService.getInstance()); NoiseListener.stopNoiseListener(); ProcessListener.stopProcessListener(AutomationService.getInstance()); + MediaPlayerListener.getInstance().stopListener(AutomationService.getInstance()); DeviceOrientationListener.getInstance().stopListener(AutomationService.getInstance()); try @@ -283,6 +289,17 @@ public class ReceiverCoordinator ScreenStateReceiver.stopScreenStateReceiver(); } + if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.musicPlaying)) + { + Miscellaneous.logEvent("i", "LocationProvider", "Starting MediaPlayerListener because used in a new/changed rule.", 4); + MediaPlayerListener.getInstance().startListener(AutomationService.getInstance()); + } + else + { + Miscellaneous.logEvent("i", "LocationProvider", "Shutting down MediaPlayerListener because not used in any rule.", 4); + MediaPlayerListener.getInstance().stopListener(AutomationService.getInstance()); + } + if(!BuildConfig.FLAVOR.equalsIgnoreCase("fdroidFlavor")) { if (Rule.isAnyRuleUsing(Trigger.Trigger_Enum.activityDetection)) diff --git a/app/src/main/java/com/jens/automation2/Settings.java b/app/src/main/java/com/jens/automation2/Settings.java index 691bfa8..55d50e3 100644 --- a/app/src/main/java/com/jens/automation2/Settings.java +++ b/app/src/main/java/com/jens/automation2/Settings.java @@ -66,6 +66,7 @@ public class Settings implements SharedPreferences public static boolean executeRulesAndProfilesWithSingleClick; public static boolean displayNewsOnMainScreen; public static boolean automaticUpdateCheck; + public static long musicCheckFrequency = 5; public static boolean lockSoundChanges; public static boolean noticeAndroid9MicrophoneShown; diff --git a/app/src/main/java/com/jens/automation2/Trigger.java b/app/src/main/java/com/jens/automation2/Trigger.java index cf06603..1f38a1c 100644 --- a/app/src/main/java/com/jens/automation2/Trigger.java +++ b/app/src/main/java/com/jens/automation2/Trigger.java @@ -17,6 +17,7 @@ import com.jens.automation2.receivers.BluetoothReceiver; import com.jens.automation2.receivers.ConnectivityReceiver; import com.jens.automation2.receivers.DeviceOrientationListener; import com.jens.automation2.receivers.HeadphoneJackListener; +import com.jens.automation2.receivers.MediaPlayerListener; import com.jens.automation2.receivers.NfcReceiver; import com.jens.automation2.receivers.NoiseListener; import com.jens.automation2.receivers.NotificationListener; @@ -38,7 +39,7 @@ 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 + pointOfInterest, timeFrame, charging, batteryLevel, usb_host_connection, speed, noiseLevel, wifiConnection, process_started_stopped, airplaneMode, roaming, nfcTag, activityDetection, bluetoothConnection, headsetPlugged, notification, deviceOrientation, profileActive, screenState, musicPlaying, phoneCall; //phoneCall always needs to be at the very end because of Google's shitty so called privacy public String getFullName(Context context) { @@ -82,13 +83,14 @@ public class Trigger return context.getResources().getString(R.string.deviceOrientation); case profileActive: return context.getResources().getString(R.string.profile); + case musicPlaying: + return context.getResources().getString(R.string.musicPlaying); case screenState: return context.getResources().getString(R.string.screenState); default: return "Unknown"; } } - }; Rule parentRule = null; @@ -180,6 +182,10 @@ public class Trigger if(!checkProfileActive()) result = false; break; + case musicPlaying: + if(!checkMusicPlaying()) + result = false; + break; case screenState: if(!checkScreenState()) result = false; @@ -332,6 +338,11 @@ public class Trigger return true; } + boolean checkMusicPlaying() + { + return triggerParameter == MediaPlayerListener.isAudioPlaying(Miscellaneous.getAnyContext()); + } + boolean checkProfileActive() { String demandedProfileName = getTriggerParameter2().split(Trigger.triggerParameter2Split)[0]; @@ -1513,6 +1524,12 @@ public class Trigger else returnString.append(String.format(Miscellaneous.getAnyContext().getString(R.string.profileNotActive), getTriggerParameter2().split(Trigger.triggerParameter2Split)[0])); break; + case musicPlaying: + if(triggerParameter) + returnString.append(Miscellaneous.getAnyContext().getString(R.string.musicIsPlaying)); + else + returnString.append(Miscellaneous.getAnyContext().getString(R.string.musicIsNotPlaying)); + break; case screenState: String state; switch(triggerParameter2) diff --git a/app/src/main/java/com/jens/automation2/receivers/MediaPlayerListener.java b/app/src/main/java/com/jens/automation2/receivers/MediaPlayerListener.java index df96e24..8682a91 100644 --- a/app/src/main/java/com/jens/automation2/receivers/MediaPlayerListener.java +++ b/app/src/main/java/com/jens/automation2/receivers/MediaPlayerListener.java @@ -1,11 +1,103 @@ package com.jens.automation2.receivers; +import android.content.Context; +import android.media.AudioManager; import android.media.MediaPlayer; -public class MediaPlayerListener +import com.jens.automation2.AutomationService; +import com.jens.automation2.Miscellaneous; +import com.jens.automation2.Rule; +import com.jens.automation2.Settings; +import com.jens.automation2.Trigger; + +import java.util.ArrayList; +import java.util.Set; +import java.util.Timer; +import java.util.TimerTask; + +public class MediaPlayerListener implements AutomationListenerInterface { - void test() + static MediaPlayerListener instance = null; + static AudioManager mAudioManager = null; + static boolean listenerActive = false; + Timer timer = null; + TimerTask task = null; + + public static boolean isAudioPlaying(Context context) { - MediaPlayer.OnInfoListener + if(mAudioManager == null) + mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); + + return mAudioManager.isMusicActive(); } -} + + public static MediaPlayerListener getInstance() + { + if(instance == null) + instance = new MediaPlayerListener(); + + return instance; + } + + @Override + public void startListener(AutomationService automationService) + { + Miscellaneous.logEvent("i", "MediaPlayerListener", "Starting listener.",5); + + if(!listenerActive) + { + if(timer == null) + { + timer = new Timer(); + } + else + { + timer.cancel(); + timer.purge(); + } + + task = new TimerTask() + { + @Override + public void run() + { + ArrayList ruleCandidates = Rule.findRuleCandidates(Trigger.Trigger_Enum.musicPlaying); + for(int i=0; istop Please select an action! Keep in mind that this action may not work with ALL players out there. And even if it does, not every buttons does necessarily work. + Music playing + Select parameters + music is playing + music is not playing \ No newline at end of file