diff --git a/app/src/apkFlavor/java/com/jens/automation2/Rule.java b/app/src/apkFlavor/java/com/jens/automation2/Rule.java index ec07025..d5d9c28 100644 --- a/app/src/apkFlavor/java/com/jens/automation2/Rule.java +++ b/app/src/apkFlavor/java/com/jens/automation2/Rule.java @@ -12,7 +12,6 @@ import android.widget.Toast; import com.google.android.gms.location.DetectedActivity; import com.jens.automation2.receivers.ActivityDetectionReceiver; -import java.sql.Time; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; @@ -834,8 +833,32 @@ public class Rule implements Comparable return ruleCandidates; }*/ + + public static ArrayList findRuleCandidatesByTriggerProfile(Profile profile) + { + ArrayList ruleCandidates = new ArrayList(); + + for(Rule oneRule : ruleCollection) + { + innerloop: + for(Trigger oneTrigger : oneRule.getTriggerSet()) + { + if(oneTrigger.getTriggerType() == Trigger.Trigger_Enum.profileActive) + { + String profileName = oneTrigger.getTriggerParameter2().split(triggerParameter2Split)[0]; + if(profileName.equals(profile.getName())) + { + ruleCandidates.add(oneRule); + break innerloop; //if the profile is found we don't need to search the other triggers in the same rule + } + } + } + } + + return ruleCandidates; + } - public static ArrayList findRuleCandidatesByProfile(Profile profile) + public static ArrayList findRuleCandidatesByActionProfile(Profile profile) { ArrayList ruleCandidates = new ArrayList(); diff --git a/app/src/main/java/com/jens/automation2/ActivityMainProfiles.java b/app/src/main/java/com/jens/automation2/ActivityMainProfiles.java index 02fe32e..d83ffa8 100644 --- a/app/src/main/java/com/jens/automation2/ActivityMainProfiles.java +++ b/app/src/main/java/com/jens/automation2/ActivityMainProfiles.java @@ -184,8 +184,16 @@ public class ActivityMainProfiles extends ActivityGeneric startActivityForResult(manageSpecificProfileIntent, 2000); break; case 2: - if(profile.delete(myAutomationService)) - updateListView(); + Rule user = profile.isInUseByRules(); + if(user == null) + { + if (profile.delete(ActivityMainProfiles.this)) + updateListView(); + else + Toast.makeText(ActivityMainProfiles.this, getResources().getString(R.string.profileCouldNotBeDeleted), Toast.LENGTH_LONG).show(); + } + else + Toast.makeText(ActivityMainProfiles.this, String.format(getResources().getString(R.string.ruleXIsUsingProfileY), user.getName(), profile.getName()), Toast.LENGTH_LONG).show(); break; } } diff --git a/app/src/main/java/com/jens/automation2/ActivityManageRule.java b/app/src/main/java/com/jens/automation2/ActivityManageRule.java index def6c39..83fc39a 100644 --- a/app/src/main/java/com/jens/automation2/ActivityManageRule.java +++ b/app/src/main/java/com/jens/automation2/ActivityManageRule.java @@ -609,10 +609,18 @@ public class ActivityManageRule extends Activity } else if(triggerType == Trigger_Enum.profileActive) { - newTrigger.setTriggerType(Trigger_Enum.profileActive); - Intent profileTriggerEditor = new Intent(myContext, ActivityManageTriggerProfile.class); - startActivityForResult(profileTriggerEditor, requestCodeTriggerProfileAdd); - return; + if(Profile.getProfileCollection().size() > 0) + { + newTrigger.setTriggerType(Trigger_Enum.profileActive); + Intent profileTriggerEditor = new Intent(myContext, ActivityManageTriggerProfile.class); + startActivityForResult(profileTriggerEditor, requestCodeTriggerProfileAdd); + return; + } + else + { + Toast.makeText(context, getResources().getString(R.string.noProfilesCreateOneFirst), Toast.LENGTH_LONG).show(); + return; + } } else if(triggerType == Trigger_Enum.activityDetection) { diff --git a/app/src/main/java/com/jens/automation2/ActivityManageTriggerDeviceOrientation.java b/app/src/main/java/com/jens/automation2/ActivityManageTriggerDeviceOrientation.java index 0f1922f..ef3fb19 100644 --- a/app/src/main/java/com/jens/automation2/ActivityManageTriggerDeviceOrientation.java +++ b/app/src/main/java/com/jens/automation2/ActivityManageTriggerDeviceOrientation.java @@ -43,7 +43,7 @@ public class ActivityManageTriggerDeviceOrientation extends Activity { desiredAzimuth = Float.parseFloat(etDesiredAzimuth.getText().toString()); desiredAzimuthTolerance = Float.parseFloat(etDesiredAzimuthTolerance.getText().toString()); - if (Math.abs(azimuth) <= Math.abs(desiredAzimuth - desiredAzimuthTolerance) || Math.abs(azimuth) <= desiredAzimuth + desiredAzimuthTolerance) + if (desiredAzimuthTolerance == 180 || (desiredAzimuth - desiredAzimuthTolerance <= azimuth && azimuth <= desiredAzimuth + desiredAzimuthTolerance)) { tvAppliesAzimuth.setText(getResources().getString(R.string.yes)); tvAppliesAzimuth.setTextColor(Color.GREEN); @@ -63,7 +63,7 @@ public class ActivityManageTriggerDeviceOrientation extends Activity { desiredPitch = Float.parseFloat(etDesiredPitch.getText().toString()); desiredPitchTolerance = Float.parseFloat(etDesiredPitchTolerance.getText().toString()); - if (Math.abs(pitch) <= Math.abs(desiredPitch - desiredPitchTolerance) || Math.abs(pitch) <= desiredPitch + desiredPitchTolerance) + if (desiredPitchTolerance == 180 || (desiredPitch - desiredPitchTolerance <= pitch && pitch <= desiredPitch + desiredPitchTolerance)) { tvAppliesPitch.setText(getResources().getString(R.string.yes)); tvAppliesPitch.setTextColor(Color.GREEN); @@ -83,7 +83,7 @@ public class ActivityManageTriggerDeviceOrientation extends Activity { desiredRoll = Float.parseFloat(etDesiredRoll.getText().toString()); desiredRollTolerance = Float.parseFloat(etDesiredRollTolerance.getText().toString()); - if (Math.abs(roll) <= Math.abs(desiredRoll - desiredRollTolerance) || Math.abs(roll) <= desiredRoll + desiredRollTolerance) + if (desiredRollTolerance == 180 || (desiredRoll - desiredRollTolerance <= roll && roll <= desiredRoll + desiredRollTolerance)) { tvAppliesRoll.setText(getResources().getString(R.string.yes)); tvAppliesRoll.setTextColor(Color.GREEN); @@ -159,14 +159,16 @@ public class ActivityManageTriggerDeviceOrientation extends Activity @Override public void onClick(View v) { + // Round the values. Too long decimals will destroy the layout + if(!StringUtils.isEmpty(currentAzimuth.getText())) - etDesiredAzimuth.setText(currentAzimuth.getText()); + etDesiredAzimuth.setText(String.valueOf(Math.round(Float.parseFloat(currentAzimuth.getText().toString())))); if(!StringUtils.isEmpty(currentPitch.getText())) - etDesiredPitch.setText(currentPitch.getText()); + etDesiredPitch.setText(String.valueOf(Math.round(Float.parseFloat(currentPitch.getText().toString())))); if(!StringUtils.isEmpty(currentRoll.getText())) - etDesiredRoll.setText(currentRoll.getText()); + etDesiredRoll.setText(String.valueOf(Math.round(Float.parseFloat(currentRoll.getText().toString())))); } }); diff --git a/app/src/main/java/com/jens/automation2/Miscellaneous.java b/app/src/main/java/com/jens/automation2/Miscellaneous.java index 5f8c28b..25da177 100644 --- a/app/src/main/java/com/jens/automation2/Miscellaneous.java +++ b/app/src/main/java/com/jens/automation2/Miscellaneous.java @@ -216,7 +216,15 @@ public class Miscellaneous extends Service return null; } - @Override + public static int boolToInt(boolean input) + { + if(input) + return 1; + else + return 0; + } + + @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub diff --git a/app/src/main/java/com/jens/automation2/Profile.java b/app/src/main/java/com/jens/automation2/Profile.java index 99ab5f1..8362403 100644 --- a/app/src/main/java/com/jens/automation2/Profile.java +++ b/app/src/main/java/com/jens/automation2/Profile.java @@ -1,5 +1,6 @@ package com.jens.automation2; +import android.app.NotificationManager; import android.content.ContentValues; import android.content.Context; import android.media.AudioManager; @@ -290,18 +291,12 @@ public class Profile implements Comparable return null; } - - public boolean delete(AutomationService myAutomationService) - { - // TODO Auto-generated method stub - return false; - } private boolean applyRingTone(File ringtoneFile, int ringtoneType, Context context) { Miscellaneous.logEvent("i", "Profile", "Request to set ringtone to " + ringtoneFile.getAbsolutePath(), 3); - if(!ringtoneFile.exists() | !ringtoneFile.canRead()) + if(!ringtoneFile.exists() || !ringtoneFile.canRead()) { String message = "Ringtone file does not exist or cannot read it: " + ringtoneFile.getAbsolutePath(); Miscellaneous.logEvent("i", "Profile", message, 3); @@ -392,7 +387,7 @@ public class Profile implements Comparable } // Check if rules reference this profile - ArrayList rulesThatReferenceMe = Rule.findRuleCandidatesByProfile(this); + ArrayList rulesThatReferenceMe = Rule.findRuleCandidatesByActionProfile(this); if(rulesThatReferenceMe.size() > 0) { for(Rule oneRule : rulesThatReferenceMe) @@ -402,7 +397,7 @@ public class Profile implements Comparable if(oneTrigger.getTriggerType() == Trigger.Trigger_Enum.profileActive) { String[] parts = oneTrigger.getTriggerParameter2().split(Trigger.triggerParameter2Split); - parts[1] = this.name; + parts[0] = this.name; oneTrigger.setTriggerParameter2(Miscellaneous.explode(Trigger.triggerParameter2Split, parts)); // We don't need to save the file. This will happen anyway in PointOfInterest.writePoisToFile() below. @@ -437,19 +432,50 @@ public class Profile implements Comparable return false; } - public boolean delete() - { - for(int i = 0; i< Profile.getProfileCollection().size(); i++) + public Rule isInUseByRules() + { + if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.profileActive)) { - if(Profile.getProfileCollection().get(i).getName().equals(this.getName())) + for (Rule rule : Rule.findRuleCandidatesByTriggerProfile(this)) { - Profile.getProfileCollection().remove(0); - - // write to file - return XmlFileInterface.writeFile(); + return rule; } } - + else if(Rule.isAnyRuleUsing(Action_Enum.changeSoundProfile)) + { + for (Rule rule : Rule.findRuleCandidatesByActionProfile(this)) + { + return rule; + } + } + + return null; + } + + public boolean delete(Context context) + { + if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.profileActive)) + { + for (Rule rule : Rule.findRuleCandidatesByTriggerProfile(this)) + { + Toast.makeText(context, String.format(context.getResources().getString(R.string.ruleXIsUsingProfileY), rule.getName(), this.getName()), Toast.LENGTH_LONG).show(); + return false; + } + } + else if(Rule.isAnyRuleUsing(Action_Enum.changeSoundProfile)) + { + for (Rule rule : Rule.findRuleCandidatesByActionProfile(this)) + { + Toast.makeText(context, String.format(context.getResources().getString(R.string.ruleXIsUsingProfileY), rule.getName(), this.getName()), Toast.LENGTH_LONG).show(); + return false; + } + } + else + { + profileCollection.remove(this); + return XmlFileInterface.writeFile(); + } + return false; } @@ -557,6 +583,104 @@ public class Profile implements Comparable } } + public boolean areMySettingsCurrentlyActive(Context context) + { + Miscellaneous.logEvent("i", "Profile " + this.getName(), "Checking if profile's settings are currently active.", 3); + + try + { + AudioManager am = (AudioManager) Miscellaneous.getAnyContext().getSystemService(Context.AUDIO_SERVICE); + NotificationManager mNotificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); + + if(changeSoundMode) + { + if(am.getRingerMode() != soundMode) + return false; + } + + if(changeDndMode && Build.VERSION.SDK_INT >= 23) + { + if(mNotificationManager.getCurrentInterruptionFilter() != dndMode) + return false; + } + + if(changeVolumeMusicVideoGameMedia) + { + if(am.getStreamVolume(AudioManager.STREAM_MUSIC) != volumeMusic) + return false; + } + + if(changeVolumeNotifications) + { + if(am.getStreamVolume(AudioManager.STREAM_NOTIFICATION) != volumeNotifications) + return false; + } + + if(changeVolumeAlarms) + { + if(am.getStreamVolume(AudioManager.STREAM_ALARM) != volumeAlarms) + return false; + } + +// if(changeIncomingCallsRingtone) +// { +// if (incomingCallsRingtone != null) +// { +// applyRingTone(incomingCallsRingtone, RingtoneManager.TYPE_RINGTONE, context); +// } +// } + + if(changeVibrateWhenRinging) + { + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) + { + int currentSetting = android.provider.Settings.System.getInt(context.getContentResolver(), "vibrate_when_ringing"); + if(currentSetting != Miscellaneous.boolToInt(vibrateWhenRinging)) + return false; + } + else + { + int currentSetting = am.getVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER); + if(currentSetting != Miscellaneous.boolToInt(vibrateWhenRinging)) + return false; + } + } + +// if(changeNotificationRingtone) +// if(notificationRingtone != null) +// applyRingTone(notificationRingtone, RingtoneManager.TYPE_NOTIFICATION, context); + + if(changeScreenLockUnlockSound) + { + int currentSetting = android.provider.Settings.System.getInt(context.getContentResolver(), "lockscreen_sounds_enabled"); + if(currentSetting != Miscellaneous.boolToInt(screenLockUnlockSound)) + return false; + } + + if(changeAudibleSelection) + { + int currentSetting = android.provider.Settings.System.getInt(context.getContentResolver(), android.provider.Settings.System.SOUND_EFFECTS_ENABLED); + if(currentSetting != Miscellaneous.boolToInt(audibleSelection)) + return false; + } + + if(changeHapticFeedback) + { + int currentSetting = android.provider.Settings.System.getInt(context.getContentResolver(), android.provider.Settings.System.HAPTIC_FEEDBACK_ENABLED); + if(currentSetting != Miscellaneous.boolToInt(hapticFeedback)) + return false; + } + } + catch(Exception e) + { + Miscellaneous.logEvent("e", "Profile " + this.getName(), "Error while checking if profile settings are currently active. " + Log.getStackTraceString(e), 1); + } + + Miscellaneous.logEvent("i", "Profile " + this.getName(), "This profile's settings are currently active.", 4); + + return true; + } + @Override public String toString() { diff --git a/app/src/main/java/com/jens/automation2/Trigger.java b/app/src/main/java/com/jens/automation2/Trigger.java index 3251831..9c0ee66 100644 --- a/app/src/main/java/com/jens/automation2/Trigger.java +++ b/app/src/main/java/com/jens/automation2/Trigger.java @@ -279,32 +279,41 @@ public class Trigger boolean checkProfileActive() { - try + String demandedProfileName = getTriggerParameter2().split(Trigger.triggerParameter2Split)[0]; + boolean checkSettings = Boolean.parseBoolean(getTriggerParameter2().split(Trigger.triggerParameter2Split)[1]); + + if(checkSettings) { - String demandedProfileName = getTriggerParameter2().split(Trigger.triggerParameter2Split)[0]; - Profile lastProfile = null; - - if(Profile.profileActivationHistory.size() > 0) - { - lastProfile = Profile.profileActivationHistory.get(Profile.profileActivationHistory.size() - 1); - - if (getTriggerParameter()) - return demandedProfileName.equals(lastProfile.getName()); - else - return !demandedProfileName.equals(lastProfile.getName()); - } - else - return !getTriggerParameter(); + Profile profile = Profile.getByName(demandedProfileName); + return profile.areMySettingsCurrentlyActive(Miscellaneous.getAnyContext()); } - catch(Exception e) + else { - Miscellaneous.logEvent("w", "Trigger", "Error checking profile trigger.", 4); + try + { + Profile lastProfile = null; + + if (Profile.profileActivationHistory.size() > 0) + { + lastProfile = Profile.profileActivationHistory.get(Profile.profileActivationHistory.size() - 1); + + if (getTriggerParameter()) + return demandedProfileName.equals(lastProfile.getName()); + else + return !demandedProfileName.equals(lastProfile.getName()); + } + else + return !getTriggerParameter(); + } + catch (Exception e) + { + Miscellaneous.logEvent("w", "Trigger", "Error checking profile trigger.", 4); + } } return false; } - boolean checkDeviceOrientation() { String deviceOrientationPieces[] = getTriggerParameter2().split(Trigger.triggerParameter2Split); @@ -320,13 +329,7 @@ public class Trigger if(desiredAzimuthTolerance < 180) { - if ( - !( - Math.abs(currentAzimuth) <= Math.abs(desiredAzimuth - desiredAzimuthTolerance) - || - Math.abs(currentAzimuth) <= desiredAzimuth + desiredAzimuthTolerance - ) - ) + if (!(desiredAzimuth - desiredAzimuthTolerance <= currentAzimuth && currentAzimuth <= desiredAzimuth + desiredAzimuthTolerance)) { Miscellaneous.logEvent("i", "DeviceOrientation", "Azimuth outside of tolerance area.", 5); if (getTriggerParameter()) @@ -338,15 +341,7 @@ public class Trigger if(desiredPitchTolerance < 180) { - if ( - !( - ( - Math.abs(currentPitch) <= Math.abs(desiredPitch - desiredPitchTolerance) - || - Math.abs(currentPitch) <= desiredPitch + desiredPitchTolerance - ) - ) - ) + if (!(desiredPitch - desiredPitchTolerance <= currentPitch && currentPitch <= desiredPitch + desiredPitchTolerance)) { Miscellaneous.logEvent("i", "DeviceOrientation", "Pitch outside of tolerance area.", 5); if (getTriggerParameter()) @@ -358,15 +353,7 @@ public class Trigger if(desiredRollTolerance < 180) { - if ( - !( - ( - Math.abs(currentRoll) <= Math.abs(desiredRoll - desiredRollTolerance) - || - Math.abs(currentRoll) <= desiredRoll + desiredRollTolerance - ) - ) - ) + if (!(desiredRoll - desiredRollTolerance <= currentRoll && currentRoll <= desiredRoll + desiredRollTolerance)) { Miscellaneous.logEvent("i", "DeviceOrientation", "Roll outside of tolerance area.", 5); if (getTriggerParameter()) diff --git a/app/src/main/res/drawable/arrow_azimuth.png b/app/src/main/res/drawable/arrow_azimuth.png new file mode 100644 index 0000000..371d6e2 Binary files /dev/null and b/app/src/main/res/drawable/arrow_azimuth.png differ diff --git a/app/src/main/res/drawable/arrow_pitch.png b/app/src/main/res/drawable/arrow_pitch.png new file mode 100644 index 0000000..9166632 Binary files /dev/null and b/app/src/main/res/drawable/arrow_pitch.png differ diff --git a/app/src/main/res/drawable/arrow_roll.png b/app/src/main/res/drawable/arrow_roll.png new file mode 100644 index 0000000..98c6ac7 Binary files /dev/null and b/app/src/main/res/drawable/arrow_roll.png differ diff --git a/app/src/main/res/layout/activity_manage_trigger_device_orientation.xml b/app/src/main/res/layout/activity_manage_trigger_device_orientation.xml index b56d979..1ae331f 100644 --- a/app/src/main/res/layout/activity_manage_trigger_device_orientation.xml +++ b/app/src/main/res/layout/activity_manage_trigger_device_orientation.xml @@ -22,7 +22,14 @@ + android:layout_height="wrap_content" + android:gravity="center_vertical" > + + + android:layout_height="wrap_content" + android:gravity="center_vertical" > + + + android:layout_height="wrap_content" + android:gravity="center_vertical" > + + + + + + + +