diff --git a/app/src/apkFlavor/java/com/jens/automation2/MyGoogleApiClient.java b/app/src/apkFlavor/java/com/jens/automation2/MyGoogleApiClient.java index 5b5f3e5e..90cbd917 100644 --- a/app/src/apkFlavor/java/com/jens/automation2/MyGoogleApiClient.java +++ b/app/src/apkFlavor/java/com/jens/automation2/MyGoogleApiClient.java @@ -18,7 +18,7 @@ public class MyGoogleApiClient public com.google.android.gms.appindexing.Action getIndexApiAction() { Thing object = new Thing.Builder() - .setName("ActivityMainScreen Page") // TODO: Define a title for the content shown. + .setName("ActivityMainScreen Page") // TODO: Make sure this auto-generated URL is correct. .setUrl(Uri.parse("http://[ENTER-YOUR-URL-HERE]")) .build(); diff --git a/app/src/main/java/com/jens/automation2/Action.java b/app/src/main/java/com/jens/automation2/Action.java index b152f18d..c2907826 100644 --- a/app/src/main/java/com/jens/automation2/Action.java +++ b/app/src/main/java/com/jens/automation2/Action.java @@ -9,7 +9,9 @@ import android.widget.Toast; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; +import java.util.HashMap; import java.util.Locale; +import java.util.Map; public class Action @@ -18,6 +20,8 @@ public class Action public static final String actionParameter2Split = "ap2split"; public static final String intentPairSeparator = "intPairSplit"; + public static final String actionParameters2SeparatorInner = "a2splitInner"; + public static final String actionParameters2SeparatorOuter = "a2splitOuter"; public static final String vibrateSeparator = ","; public enum Action_Enum @@ -683,8 +687,13 @@ public class Action String password = null; String method = ActivityManageActionTriggerUrl.methodGet; String url; + String params = null; - String[] components = getParameter2().split(";"); + String[] components; + if(getParameter2().contains(Action.actionParameter2Split)) + components = getParameter2().split(Action.actionParameter2Split); + else + components = getParameter2().split(";"); if(components.length >= 3) { @@ -694,6 +703,11 @@ public class Action if(components.length >= 4) method = components[3]; + + if(components.length >= 5) + { + params = components[4]; + } } else // compatibility for very old versions which haven't upgraded, yet. url = components[0]; @@ -701,15 +715,16 @@ public class Action try { url = Miscellaneous.replaceVariablesInText(url, context); + params = Miscellaneous.replaceVariablesInText(params, context); Actions myAction = new Actions(); Miscellaneous.logEvent("i", "HTTP", "Attempting download of " + url, 4); //getResources().getString("attemptingDownloadOf"); if(this.getParameter1()) // use authentication - new DownloadTask().execute(url, username, password, method); + new DownloadTask().execute(url, username, password, method, params); else - new DownloadTask().execute(url, null, null); + new DownloadTask().execute(url, null, null, params); } catch(Exception e) { @@ -724,12 +739,14 @@ public class Action { Thread.setDefaultUncaughtExceptionHandler(Miscellaneous.uncaughtExceptionHandler); - int attempts=1; + int attempts = 1; String urlString=parameters[0]; String urlUsername = null; String urlPassword = null; String method = ActivityManageActionTriggerUrl.methodGet; + Map httpParams = new HashMap<>(); + if(parameters.length >= 3) { urlUsername = parameters[1]; @@ -737,6 +754,18 @@ public class Action if(parameters.length >= 4) method = parameters[3]; +empty params are omitted instead of being empty + if(parameters.length >= 5) + { + // has params + String[] paramPairs = parameters[4].split(Action.actionParameters2SeparatorOuter); + for(String pair : paramPairs) + { + String[] pieces = pair.split(Action.actionParameters2SeparatorInner); + httpParams.put(pieces[0], pieces[1]); + } + } + } String response = "HTTP_ERROR"; @@ -750,9 +779,9 @@ public class Action // Either thorough checking or no encryption if(!Settings.httpAcceptAllCertificates || !urlString.toLowerCase(Locale.getDefault()).contains("https")) - response = Miscellaneous.downloadURL(urlString, urlUsername, urlPassword, method); + response = Miscellaneous.downloadURL(urlString, urlUsername, urlPassword, method, httpParams); else - response = Miscellaneous.downloadURLwithoutCertificateChecking(urlString, urlUsername, urlPassword, method); + response = Miscellaneous.downloadURLwithoutCertificateChecking(urlString, urlUsername, urlPassword, method, httpParams); try { diff --git a/app/src/main/java/com/jens/automation2/ActivityManageActionSendBroadcast.java b/app/src/main/java/com/jens/automation2/ActivityManageActionSendBroadcast.java index fe4409d1..fa60b10c 100644 --- a/app/src/main/java/com/jens/automation2/ActivityManageActionSendBroadcast.java +++ b/app/src/main/java/com/jens/automation2/ActivityManageActionSendBroadcast.java @@ -236,8 +236,6 @@ public class ActivityManageActionSendBroadcast extends Activity @Override public void onNothingSelected(AdapterView arg0) { - // TODO Auto-generated method stub - } }); } diff --git a/app/src/main/java/com/jens/automation2/ActivityManageActionStartActivity.java b/app/src/main/java/com/jens/automation2/ActivityManageActionStartActivity.java index 7c179ef8..d7123088 100644 --- a/app/src/main/java/com/jens/automation2/ActivityManageActionStartActivity.java +++ b/app/src/main/java/com/jens/automation2/ActivityManageActionStartActivity.java @@ -242,8 +242,7 @@ public class ActivityManageActionStartActivity extends Activity else parameter2 += Actions.dummyPackageString + Action.actionParameter2Split + etActivityOrActionPath.getText().toString(); -// if(etClassName.getText().toString().length() > 0) - parameter2 += Action.actionParameter2Split + etClassName.getText().toString(); + parameter2 += Action.actionParameter2Split + etClassName.getText().toString(); } if (rbStartAppByActivity.isChecked()) @@ -292,8 +291,6 @@ public class ActivityManageActionStartActivity extends Activity @Override public void onNothingSelected(AdapterView arg0) { - // TODO Auto-generated method stub - } }); diff --git a/app/src/main/java/com/jens/automation2/ActivityManageActionTriggerUrl.java b/app/src/main/java/com/jens/automation2/ActivityManageActionTriggerUrl.java index 3849eced..b8d27da1 100644 --- a/app/src/main/java/com/jens/automation2/ActivityManageActionTriggerUrl.java +++ b/app/src/main/java/com/jens/automation2/ActivityManageActionTriggerUrl.java @@ -1,6 +1,9 @@ package com.jens.automation2; import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.os.Build; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; @@ -17,22 +20,27 @@ import android.widget.RadioButton; import android.widget.TableLayout; import android.widget.Toast; +import androidx.annotation.NonNull; + import com.jens.automation2.Action.Action_Enum; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; import java.util.Map; public class ActivityManageActionTriggerUrl extends Activity { - Button bSaveTriggerUrl; - EditText etTriggerUrl, etTriggerUrlUsername, etTriggerUrlPassword; + Button bSaveTriggerUrl, bAddHttpParam; + EditText etTriggerUrl, etTriggerUrlUsername, etTriggerUrlPassword, etParameterName, etParameterValue; ListView lvTriggerUrlPostParameters; CheckBox chkTriggerUrlUseAuthentication; RadioButton rbTriggerUrlMethodGet, rbTriggerUrlMethodPost; TableLayout tlTriggerUrlAuthentication; - + ArrayAdapter httpParametersAdapter; + + private ArrayList httpParamsList = new ArrayList<>(); ArrayAdapter> lvTriggerUrlPostParametersAdapter; - -// private String existingUrl = ""; public static final String methodGet = "GET"; public static final String methodPost = "POST"; @@ -56,6 +64,29 @@ public class ActivityManageActionTriggerUrl extends Activity bSaveTriggerUrl = (Button)findViewById(R.id.bSaveSpeakText); rbTriggerUrlMethodGet = (RadioButton) findViewById(R.id.rbTriggerUrlMethodGet); rbTriggerUrlMethodPost = (RadioButton) findViewById(R.id.rbTriggerUrlMethodPost); + etTriggerUrl = (EditText) findViewById(R.id.etTriggerUrl); + etParameterName = (EditText) findViewById(R.id.etParameterName); + etParameterValue = (EditText)findViewById(R.id.etParameterValue); + bAddHttpParam = (Button)findViewById(R.id.bAddHttpParam); + + etParameterName.setEnabled(false); + etParameterValue.setEnabled(false); + bAddHttpParam.setEnabled(false); + + rbTriggerUrlMethodPost.setOnCheckedChangeListener(new OnCheckedChangeListener() + { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean checked) + { + etParameterName.setEnabled(checked); + etParameterValue.setEnabled(checked); + bAddHttpParam.setEnabled(checked); + if(checked) + lvTriggerUrlPostParameters.setVisibility(View.VISIBLE); + } + }); + + httpParametersAdapter = new ArrayAdapter(this, R.layout.text_view_for_poi_listview_mediumtextsize, httpParamsList); bSaveTriggerUrl.setOnClickListener(new OnClickListener() { @@ -65,33 +96,38 @@ public class ActivityManageActionTriggerUrl extends Activity if(etTriggerUrl.getText().toString().length() > 0) { if(resultingAction == null) - { resultingAction = new Action(); - } - resultingAction.setAction(Action_Enum.triggerUrl); - resultingAction.setParameter1(chkTriggerUrlUseAuthentication.isChecked()); - - String username = etTriggerUrlUsername.getText().toString(); - String password = etTriggerUrlPassword.getText().toString(); - - if(username == null) - username = ""; - - if(password == null) - password = ""; + resultingAction.setAction(Action_Enum.triggerUrl); + resultingAction.setParameter1(chkTriggerUrlUseAuthentication.isChecked()); - String method = methodGet; - if(rbTriggerUrlMethodPost.isChecked()) - method = methodPost; + String username = etTriggerUrlUsername.getText().toString(); + String password = etTriggerUrlPassword.getText().toString(); - ActivityManageActionTriggerUrl.resultingAction.setParameter2( - username + ";" + - password + ";" + - etTriggerUrl.getText().toString().trim() + ";" + - method - ); + if(username == null) + username = ""; + if(password == null) + password = ""; + + String method = methodGet; + if(rbTriggerUrlMethodPost.isChecked()) + method = methodPost; + + String httpParams = ""; + for (String s : httpParamsList) + httpParams += Action.actionParameters2SeparatorOuter + s; + if(httpParams.length() > 0) + httpParams = httpParams.substring(Action.actionParameters2SeparatorOuter.length()); + + ActivityManageActionTriggerUrl.resultingAction.setParameter2( + username + Action.actionParameter2Split + + password + Action.actionParameter2Split + + etTriggerUrl.getText().toString().trim() + Action.actionParameter2Split + + method + Action.actionParameter2Split + + httpParams + ); +//TODO: Check if http params listview is scrollable backToRuleManager(); } else @@ -137,8 +173,13 @@ public class ActivityManageActionTriggerUrl extends Activity ActivityManageActionTriggerUrl.edit = getIntent().getBooleanExtra("edit", false); if(edit) { - // username,password,URL - String[] components = ActivityManageActionTriggerUrl.resultingAction.getParameter2().split(";"); + // username,password,URL,etc. + String[] components; + + if(ActivityManageActionTriggerUrl.resultingAction.getParameter2().contains(Action.actionParameter2Split)) + components = ActivityManageActionTriggerUrl.resultingAction.getParameter2().split(Action.actionParameter2Split, -1); + else + components = ActivityManageActionTriggerUrl.resultingAction.getParameter2().split(";", -1); if(components.length >= 3) { @@ -160,10 +201,54 @@ public class ActivityManageActionTriggerUrl extends Activity break; } } + + if(components.length >= 5) + { + if(!StringUtils.isEmpty(components[4]) && components[4].contains(Action.actionParameters2SeparatorInner)) + { + String httpParams[] = components[4].split(Action.actionParameters2SeparatorOuter); + for (String paramPair : httpParams) + httpParamsList.add(paramPair); + + updateHttpParamsList(); + } + } } else etTriggerUrl.setText(components[0]); } + + bAddHttpParam.setOnClickListener(new OnClickListener() + { + @Override + public void onClick(View view) + { + if(StringUtils.isEmpty(etParameterName.getText()) || StringUtils.isEmpty(etParameterValue.getText())) + { + Toast.makeText(ActivityManageActionTriggerUrl.this, getResources().getString(R.string.enterValidDataIntoParametersFields), Toast.LENGTH_SHORT).show(); + return; + } + + httpParamsList.add(etParameterName.getText() + Action.actionParameters2SeparatorInner + etParameterValue.getText()); + + updateHttpParamsList(); + etParameterName.setText(""); + etParameterValue.setText(""); + + if(lvTriggerUrlPostParameters.getVisibility() != View.VISIBLE) + lvTriggerUrlPostParameters.setVisibility(View.VISIBLE); + } + }); + + lvTriggerUrlPostParameters.setOnItemLongClickListener(new OnItemLongClickListener() + { + @Override + public boolean onItemLongClick(AdapterView arg0, View arg1, int arg2, long arg3) + { + getHttpParamsDialog(arg2).show(); + return false; + } + }); } private void backToRuleManager() @@ -184,13 +269,21 @@ public class ActivityManageActionTriggerUrl extends Activity method = methodPost; ActivityManageActionTriggerUrl.resultingAction.setParameter1(chkTriggerUrlUseAuthentication.isChecked()); - + + String httpParams = ""; + for (String s : httpParamsList) + httpParams += Action.actionParameters2SeparatorOuter + s; + if(httpParams.length() > 0) + httpParams = httpParams.substring(Action.actionParameters2SeparatorOuter.length()); + ActivityManageActionTriggerUrl.resultingAction.setParameter2( - username + ";" + - password + ";" + - etTriggerUrl.getText().toString() + ";" + - method - ); + username + Action.actionParameter2Split + + password + Action.actionParameter2Split + + etTriggerUrl.getText().toString().trim() + Action.actionParameter2Split + + method + Action.actionParameter2Split + + httpParams + ); + //TODO:Duplicate code in save routine in onCreate() } setResult(RESULT_OK); @@ -211,4 +304,30 @@ public class ActivityManageActionTriggerUrl extends Activity catch(NullPointerException e) {} } + + private void updateHttpParamsList() + { + if(lvTriggerUrlPostParameters.getAdapter() == null) + lvTriggerUrlPostParameters.setAdapter(httpParametersAdapter); + + httpParametersAdapter.notifyDataSetChanged(); + } + + private AlertDialog getHttpParamsDialog(final int itemPosition) + { + AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(ActivityManageActionTriggerUrl.this); + alertDialogBuilder.setTitle(getResources().getString(R.string.whatToDoWithIntentPair)); + alertDialogBuilder.setItems(new String[]{getResources().getString(R.string.delete)}, new DialogInterface.OnClickListener() + { + @Override + public void onClick(DialogInterface dialog, int which) + { + // Only 1 choice at the moment, no need to check + ActivityManageActionTriggerUrl.this.httpParamsList.remove(itemPosition); + updateHttpParamsList(); + } + }); + AlertDialog alertDialog = alertDialogBuilder.create(); + return alertDialog; + } } diff --git a/app/src/main/java/com/jens/automation2/ActivityManagePoi.java b/app/src/main/java/com/jens/automation2/ActivityManagePoi.java index b6826f29..1035e56c 100644 --- a/app/src/main/java/com/jens/automation2/ActivityManagePoi.java +++ b/app/src/main/java/com/jens/automation2/ActivityManagePoi.java @@ -411,22 +411,16 @@ public class ActivityManagePoi extends Activity @Override public void onProviderDisabled(String provider) { - // TODO Auto-generated method stub - } @Override public void onProviderEnabled(String provider) { - // TODO Auto-generated method stub - } @Override public void onStatusChanged(String provider, int status, Bundle extras) { - // TODO Auto-generated method stub - } } @@ -454,22 +448,16 @@ public class ActivityManagePoi extends Activity @Override public void onProviderDisabled(String provider) { - // TODO Auto-generated method stub - } @Override public void onProviderEnabled(String provider) { - // TODO Auto-generated method stub - } @Override public void onStatusChanged(String provider, int status, Bundle extras) { - // TODO Auto-generated method stub - } } diff --git a/app/src/main/java/com/jens/automation2/ActivityManageRule.java b/app/src/main/java/com/jens/automation2/ActivityManageRule.java index 6111896f..c1ae6bbf 100644 --- a/app/src/main/java/com/jens/automation2/ActivityManageRule.java +++ b/app/src/main/java/com/jens/automation2/ActivityManageRule.java @@ -1380,6 +1380,7 @@ public class ActivityManageRule extends Activity if(requestCode == requestCodeActionTriggerUrlAdd) { + //TODO: Transform into newer and cleaner handover method through intent data if(resultCode == RESULT_OK) { //add TriggerUrl diff --git a/app/src/main/java/com/jens/automation2/ActivityManageTriggerCalendar.java b/app/src/main/java/com/jens/automation2/ActivityManageTriggerCalendar.java index 21da88fb..08a61e03 100644 --- a/app/src/main/java/com/jens/automation2/ActivityManageTriggerCalendar.java +++ b/app/src/main/java/com/jens/automation2/ActivityManageTriggerCalendar.java @@ -9,6 +9,7 @@ import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; import android.provider.CalendarContract; +import android.util.Log; import android.view.View; import android.widget.ArrayAdapter; import android.widget.Button; @@ -18,6 +19,7 @@ import android.widget.EditText; import android.widget.LinearLayout; import android.widget.Spinner; import android.widget.TextView; +import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -31,7 +33,7 @@ import java.util.List; public class ActivityManageTriggerCalendar extends Activity { - CheckBox chkCalendarEventActive, chkCalendarAvailabilityBusy, chkCalendarAvailabilityFree, chkCalendarAvailabilityTentative, chkCalendarAvailabilityOutOfOffice, chkCalendarAvailabilityWorkingElsewhere, chkCalendarAllDayEvent; + CheckBox chkCalendarEventActive, chkCalendarAvailabilityBusy, chkCalendarAvailabilityFree, chkCalendarAvailabilityTentative, chkCalendarAvailabilityOutOfOffice, chkCalendarAvailabilityWorkingElsewhere, chkCalendarAllDayEvent, calendarEvaluateAllDayEvent; Spinner spinnerCalendarTitleDirection, spinnerCalendarLocationDirection, spinnerCalendarDescriptionDirection; EditText etCalendarTitle, etCalendarLocation, etCalendarDescription; LinearLayout llCalendarSelection; @@ -51,9 +53,6 @@ public class ActivityManageTriggerCalendar extends Activity Miscellaneous.setDisplayLanguage(this); setContentView(R.layout.activity_manage_trigger_calendar); -// TODO: calculateNextWakeup() muß neu ausgeführt werden, wenn die Regeln geändert werden. - - chkCalendarEventActive = (CheckBox) findViewById(R.id.chkCalendarEventActive); spinnerCalendarTitleDirection = (Spinner)findViewById(R.id.spinnerCalendarTitleDirection); spinnerCalendarLocationDirection = (Spinner)findViewById(R.id.spinnerCalendarLocationDirection); @@ -64,6 +63,7 @@ public class ActivityManageTriggerCalendar extends Activity chkCalendarAvailabilityTentative = (CheckBox)findViewById(R.id.chkCalendarAvailabilityTentative); chkCalendarAvailabilityOutOfOffice = (CheckBox)findViewById(R.id.chkCalendarAvailabilityOutOfOffice); chkCalendarAvailabilityWorkingElsewhere = (CheckBox)findViewById(R.id.chkCalendarAvailabilityWorkingElsewhere); + calendarEvaluateAllDayEvent = (CheckBox)findViewById(R.id.calendarEvaluateAllDayEvent); tvMissingCalendarHint = (TextView) findViewById(R.id.tvMissingCalendarHint); @@ -83,12 +83,23 @@ public class ActivityManageTriggerCalendar extends Activity getResources().getString(R.string.directionStringEndsWith), getResources().getString(R.string.directionStringNotEquals) }; - directionSpinnerAdapter = new ArrayAdapter(this, R.layout.text_view_for_poi_listview_mediumtextsize, ActivityManageTriggerCalendar.directions); + directionSpinnerAdapter = new ArrayAdapter<>(this, R.layout.text_view_for_poi_listview_mediumtextsize, ActivityManageTriggerCalendar.directions); spinnerCalendarTitleDirection.setAdapter(directionSpinnerAdapter); spinnerCalendarLocationDirection.setAdapter(directionSpinnerAdapter); spinnerCalendarDescriptionDirection.setAdapter(directionSpinnerAdapter); directionSpinnerAdapter.notifyDataSetChanged(); + calendarEvaluateAllDayEvent.setChecked(false); + chkCalendarAllDayEvent.setEnabled(false); + calendarEvaluateAllDayEvent.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() + { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean checked) + { + chkCalendarAllDayEvent.setEnabled(checked); + } + }); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if(ActivityPermissions.havePermission(Manifest.permission.READ_CALENDAR, ActivityManageTriggerCalendar.this) || ActivityPermissions.havePermission(Manifest.permission.WRITE_CALENDAR, ActivityManageTriggerCalendar.this)) @@ -186,6 +197,7 @@ public class ActivityManageTriggerCalendar extends Activity titleDir + Trigger.triggerParameter2Split + title + Trigger.triggerParameter2Split + descriptionDir + Trigger.triggerParameter2Split + description + Trigger.triggerParameter2Split + locationDir + Trigger.triggerParameter2Split + location + Trigger.triggerParameter2Split + + String.valueOf(calendarEvaluateAllDayEvent.isChecked()) + Trigger.triggerParameter2Split + String.valueOf(chkCalendarAllDayEvent.isChecked()) + Trigger.triggerParameter2Split + Miscellaneous.explode(separator, availabilityList.toArray(new String[availabilityList.size()])) + Trigger.triggerParameter2Split + Miscellaneous.explode(separator, selectedCalendarsIdArray.toArray(new String[selectedCalendarsIdArray.size()])); @@ -230,14 +242,14 @@ public class ActivityManageTriggerCalendar extends Activity void loadValuesIntoGui(Intent data) { - //TODO:try-catch - - if(data.hasExtra(ActivityManageRule.intentNameTriggerParameter1)) - chkCalendarEventActive.setChecked(data.getBooleanExtra(ActivityManageRule.intentNameTriggerParameter1, true)); - - if(data.hasExtra(ActivityManageRule.intentNameTriggerParameter2)) + try { - String input[] = data.getStringExtra(ActivityManageRule.intentNameTriggerParameter2).split(Trigger.triggerParameter2Split, -1); + if (data.hasExtra(ActivityManageRule.intentNameTriggerParameter1)) + chkCalendarEventActive.setChecked(data.getBooleanExtra(ActivityManageRule.intentNameTriggerParameter1, true)); + + if (data.hasExtra(ActivityManageRule.intentNameTriggerParameter2)) + { + String input[] = data.getStringExtra(ActivityManageRule.intentNameTriggerParameter2).split(Trigger.triggerParameter2Split, -1); /* 0 = titleDir 1 = title @@ -245,88 +257,96 @@ public class ActivityManageTriggerCalendar extends Activity 3 = description 4 = locationDir 5 = location - 6 = all day event - 7 = availability list - 8 = calendars list + 6 = evaluate all day event + 7 = all day event + 8 = availability list + 9 = calendars list */ - for(int i = 0; i < directions.length; i++) - { - if(Trigger.getMatchCode(directions[i]).equalsIgnoreCase(input[0])) - spinnerCalendarTitleDirection.setSelection(i); - - if(Trigger.getMatchCode(directions[i]).equalsIgnoreCase(input[2])) - spinnerCalendarDescriptionDirection.setSelection(i); - - if(Trigger.getMatchCode(directions[i]).equalsIgnoreCase(input[4])) - spinnerCalendarLocationDirection.setSelection(i); - } - - etCalendarTitle.setText(input[1]); - etCalendarDescription.setText(input[3]); - etCalendarLocation.setText(input[5]); - - chkCalendarAllDayEvent.setChecked(Boolean.parseBoolean(input[6])); - - String[] availabilities = null; - if(!StringUtils.isEmpty(input[7])) - availabilities = input[7].split(separator); - - if(availabilities != null) - { - for (String avail : availabilities) + for (int i = 0; i < directions.length; i++) { - if (Integer.parseInt(avail) == CalendarContract.Events.AVAILABILITY_BUSY) - chkCalendarAvailabilityBusy.setChecked(true); - else if (Integer.parseInt(avail) == CalendarContract.Events.AVAILABILITY_FREE) - chkCalendarAvailabilityFree.setChecked(true); - else if (Integer.parseInt(avail) == CalendarContract.Events.AVAILABILITY_TENTATIVE) - chkCalendarAvailabilityTentative.setChecked(true); - else if (Integer.parseInt(avail) == CalendarReceiver.AVAILABILITY_OUT_OF_OFFICE) - chkCalendarAvailabilityOutOfOffice.setChecked(true); - else if (Integer.parseInt(avail) == CalendarReceiver.AVAILABILITY_WORKING_ELSEWHERE) - chkCalendarAvailabilityWorkingElsewhere.setChecked(true); + if (Trigger.getMatchCode(directions[i]).equalsIgnoreCase(input[0])) + spinnerCalendarTitleDirection.setSelection(i); + + if (Trigger.getMatchCode(directions[i]).equalsIgnoreCase(input[2])) + spinnerCalendarDescriptionDirection.setSelection(i); + + if (Trigger.getMatchCode(directions[i]).equalsIgnoreCase(input[4])) + spinnerCalendarLocationDirection.setSelection(i); } - } - String[] calendars = null; - if(!StringUtils.isEmpty(input[8])) - calendars = input[8].split(separator); + etCalendarTitle.setText(input[1]); + etCalendarDescription.setText(input[3]); + etCalendarLocation.setText(input[5]); - if(calendars != null) - { - List usedCalendarIDs = new ArrayList<>(); - List unusedCalendarIDs = new ArrayList<>(); - for (CheckBox checkbox : checkboxesCalendars) + calendarEvaluateAllDayEvent.setChecked(Boolean.parseBoolean(input[6])); + chkCalendarAllDayEvent.setChecked(Boolean.parseBoolean(input[7])); + + String[] availabilities = null; + if (!StringUtils.isEmpty(input[8])) + availabilities = input[8].split(separator); + + if (availabilities != null) { - int id = ((CalendarReceiver.AndroidCalendar) checkbox.getTag()).calendarId; - for (String calId : calendars) + for (String avail : availabilities) { - if (calId.equals(String.valueOf(id))) - { - usedCalendarIDs.add(String.valueOf(id)); - checkbox.setChecked(true); - break; - } + if (Integer.parseInt(avail) == CalendarContract.Events.AVAILABILITY_BUSY) + chkCalendarAvailabilityBusy.setChecked(true); + else if (Integer.parseInt(avail) == CalendarContract.Events.AVAILABILITY_FREE) + chkCalendarAvailabilityFree.setChecked(true); + else if (Integer.parseInt(avail) == CalendarContract.Events.AVAILABILITY_TENTATIVE) + chkCalendarAvailabilityTentative.setChecked(true); + else if (Integer.parseInt(avail) == CalendarReceiver.AVAILABILITY_OUT_OF_OFFICE) + chkCalendarAvailabilityOutOfOffice.setChecked(true); + else if (Integer.parseInt(avail) == CalendarReceiver.AVAILABILITY_WORKING_ELSEWHERE) + chkCalendarAvailabilityWorkingElsewhere.setChecked(true); } } - for (String calId : calendars) - { - if (!Miscellaneous.arraySearch((ArrayList) usedCalendarIDs, calId, false, true)) - unusedCalendarIDs.add(calId); - } - if (unusedCalendarIDs.size() > 0) + + String[] calendars = null; + if (!StringUtils.isEmpty(input[9])) + calendars = input[9].split(separator); + + if (calendars != null) { + List usedCalendarIDs = new ArrayList<>(); + List unusedCalendarIDs = new ArrayList<>(); + for (CheckBox checkbox : checkboxesCalendars) + { + int id = ((CalendarReceiver.AndroidCalendar) checkbox.getTag()).calendarId; + for (String calId : calendars) + { + if (calId.equals(String.valueOf(id))) + { + usedCalendarIDs.add(String.valueOf(id)); + checkbox.setChecked(true); + break; + } + } + } + for (String calId : calendars) + { + if (!Miscellaneous.arraySearch((ArrayList) usedCalendarIDs, calId, false, true)) + unusedCalendarIDs.add(calId); + } + if (unusedCalendarIDs.size() > 0) + { /* A calendar has been configured that has been deleted since. We cannot resolve it. It will be removed with the next save, but we should inform this user of these circumstances. */ - tvMissingCalendarHint.setText(String.format(getResources().getString(R.string.calendarsMissingHint), Miscellaneous.explode(", ", (ArrayList) unusedCalendarIDs))); + tvMissingCalendarHint.setText(String.format(getResources().getString(R.string.calendarsMissingHint), Miscellaneous.explode(", ", (ArrayList) unusedCalendarIDs))); + } } } } + catch (Exception e) + { + Miscellaneous.logEvent("e", "ActivityManagerTriggerCalender", "Error loading values into GUI: " + Log.getStackTraceString(e), 1); + Toast.makeText(ActivityManageTriggerCalendar.this, getResources().getString(R.string.errorLoadingValues), Toast.LENGTH_SHORT).show(); + } } @Override diff --git a/app/src/main/java/com/jens/automation2/ActivityVolumeTest.java b/app/src/main/java/com/jens/automation2/ActivityVolumeTest.java index 4fce0381..91cdc0b3 100644 --- a/app/src/main/java/com/jens/automation2/ActivityVolumeTest.java +++ b/app/src/main/java/com/jens/automation2/ActivityVolumeTest.java @@ -49,20 +49,15 @@ public class ActivityVolumeTest extends Activity @Override public void onStopTrackingTouch(SeekBar seekBar) { - // TODO Auto-generated method stub - } @Override public void onStartTrackingTouch(SeekBar seekBar) { - // TODO Auto-generated method stub - } @Override - public void onProgressChanged(SeekBar seekBar, int progress, - boolean fromUser) + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { etReferenceValue.setText(String.valueOf(sbReferenceValue.getProgress())); } diff --git a/app/src/main/java/com/jens/automation2/AsyncTasks.java b/app/src/main/java/com/jens/automation2/AsyncTasks.java index 4b7401fd..4aefcb78 100644 --- a/app/src/main/java/com/jens/automation2/AsyncTasks.java +++ b/app/src/main/java/com/jens/automation2/AsyncTasks.java @@ -22,7 +22,7 @@ public class AsyncTasks try { - String result = Miscellaneous.downloadURL("https://server47.de/automation/?action=getLatestVersionCode", null, null, ActivityManageActionTriggerUrl.methodGet).trim(); + String result = Miscellaneous.downloadURL("https://server47.de/automation/?action=getLatestVersionCode", null, null, ActivityManageActionTriggerUrl.methodGet, null).trim(); int latestVersion = Integer.parseInt(result); // At this point the update check itself has already been successful. diff --git a/app/src/main/java/com/jens/automation2/AutomationService.java b/app/src/main/java/com/jens/automation2/AutomationService.java index 51c71206..910d0d2d 100644 --- a/app/src/main/java/com/jens/automation2/AutomationService.java +++ b/app/src/main/java/com/jens/automation2/AutomationService.java @@ -28,6 +28,7 @@ import androidx.core.app.NotificationManagerCompat; import com.jens.automation2.Trigger.Trigger_Enum; import com.jens.automation2.location.LocationProvider; +import com.jens.automation2.receivers.CalendarReceiver; import com.jens.automation2.receivers.DateTimeListener; import com.jens.automation2.receivers.PackageReplacedReceiver; import com.jens.automation2.receivers.PhoneStatusListener; @@ -309,6 +310,7 @@ public class AutomationService extends Service implements OnInitListener ReceiverCoordinator.applySettingsAndRules(); DateTimeListener.reloadAlarms(); + CalendarReceiver.armOrRearmTimer(); } @Override @@ -679,8 +681,6 @@ public class AutomationService extends Service implements OnInitListener @Override public void onInit(int status) { - // TODO Auto-generated method stub - } /** diff --git a/app/src/main/java/com/jens/automation2/Miscellaneous.java b/app/src/main/java/com/jens/automation2/Miscellaneous.java index cc035db1..b33b8ac8 100644 --- a/app/src/main/java/com/jens/automation2/Miscellaneous.java +++ b/app/src/main/java/com/jens/automation2/Miscellaneous.java @@ -44,10 +44,8 @@ import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.HttpVersion; import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; -import org.apache.http.client.methods.HttpPut; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.impl.client.DefaultHttpClient; @@ -98,6 +96,7 @@ import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.Scanner; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; @@ -124,7 +123,7 @@ public class Miscellaneous extends Service public static final String lineSeparator = System.getProperty("line.separator"); - public static String downloadURL(String url, String username, String password, String method) + public static String downloadURL(String url, String username, String password, String method, Map httpParams) { HttpClient httpclient = new DefaultHttpClient(); StringBuilder responseBody = new StringBuilder(); @@ -180,7 +179,7 @@ public class Miscellaneous extends Service } } - public static String downloadURLwithoutCertificateChecking(String url, String username, String password, String method) + public static String downloadURLwithoutCertificateChecking(String url, String username, String password, String method, Map httpParams) { try { diff --git a/app/src/main/java/com/jens/automation2/News.java b/app/src/main/java/com/jens/automation2/News.java index f4a9ca64..9fc3b817 100644 --- a/app/src/main/java/com/jens/automation2/News.java +++ b/app/src/main/java/com/jens/automation2/News.java @@ -79,7 +79,7 @@ public class News if (!(new File(filePath)).exists() || Settings.lastNewsPolltime == Settings.default_lastNewsPolltime || now.getTimeInMillis() >= Settings.lastNewsPolltime + (long)(Settings.newsDisplayForXDays * 24 * 60 * 60 * 1000)) { String newsUrl = "https://server47.de/automation/appNews.php"; - newsContent = Miscellaneous.downloadURL(newsUrl, null, null, ActivityManageActionTriggerUrl.methodGet); + newsContent = Miscellaneous.downloadURL(newsUrl, null, null, ActivityManageActionTriggerUrl.methodGet, null); // Cache content to local storage if(Miscellaneous.writeStringToFile(filePath, newsContent)) diff --git a/app/src/main/java/com/jens/automation2/PointOfInterest.java b/app/src/main/java/com/jens/automation2/PointOfInterest.java index 0f799a02..78f48bca 100644 --- a/app/src/main/java/com/jens/automation2/PointOfInterest.java +++ b/app/src/main/java/com/jens/automation2/PointOfInterest.java @@ -694,22 +694,16 @@ public class PointOfInterest implements Comparable @Override public void onProviderDisabled(String provider) { - // TODO Auto-generated method stub - } @Override public void onProviderEnabled(String provider) { - // TODO Auto-generated method stub - } @Override public void onStatusChanged(String provider, int status, Bundle extras) { - // TODO Auto-generated method stub - } } diff --git a/app/src/main/java/com/jens/automation2/Settings.java b/app/src/main/java/com/jens/automation2/Settings.java index 8717d389..99c44aee 100644 --- a/app/src/main/java/com/jens/automation2/Settings.java +++ b/app/src/main/java/com/jens/automation2/Settings.java @@ -149,56 +149,45 @@ public class Settings implements SharedPreferences @Override public Editor edit() { - // TODO Auto-generated method stub return null; } @Override public Map getAll() { - // TODO Auto-generated method stub return null; } @Override public boolean getBoolean(String arg0, boolean arg1) { - // TODO Auto-generated method stub return false; } @Override public float getFloat(String arg0, float arg1) { - // TODO Auto-generated method stub return 0; } @Override public int getInt(String arg0, int arg1) { - // TODO Auto-generated method stub return 0; } @Override public long getLong(String arg0, long arg1) { - // TODO Auto-generated method stub return 0; } @Override public String getString(String arg0, String arg1) { - // TODO Auto-generated method stub return null; } @Override public void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener arg0) { - // TODO Auto-generated method stub - } @Override public void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener arg0) { - // TODO Auto-generated method stub - } public static void readFromPersistentStorage(Context context) @@ -619,7 +608,6 @@ public class Settings implements SharedPreferences @Override public Set getStringSet(String arg0, Set arg1) { - // TODO Auto-generated method stub return null; } } \ No newline at end of file diff --git a/app/src/main/java/com/jens/automation2/Trigger.java b/app/src/main/java/com/jens/automation2/Trigger.java index 4ae136e4..b8d187d9 100644 --- a/app/src/main/java/com/jens/automation2/Trigger.java +++ b/app/src/main/java/com/jens/automation2/Trigger.java @@ -631,9 +631,10 @@ public class Trigger 3 = description 4 = eventLocationDirection 5 = eventLocation - 6 = all day event - 7 = availabilityList - 8 = calendarList + 6 = evaluate all day event + 7 = all day event + 8 = availabilityList + 9 = calendarList */ for(CalendarReceiver.CalendarEvent event : calendarEvents) @@ -677,9 +678,10 @@ public class Trigger 3 = description 4 = eventLocationDirection 5 = eventLocation - 6 = all day event - 7 = availabilityList - 8 = calendarList + 6 = evaluate all day event + 7 = all day event + 8 = availabilityList + 9 = calendarList */ @@ -717,15 +719,18 @@ public class Trigger } } - if (Boolean.parseBoolean(conditions[6]) != event.allDay) + if (Boolean.parseBoolean(conditions[6])) { - Miscellaneous.logEvent("i", "CalendarCheck", "All day setting does not match.", 5); - return false; + if (Boolean.parseBoolean(conditions[7]) != event.allDay) + { + Miscellaneous.logEvent("i", "CalendarCheck", "All day setting does not match.", 5); + return false; + } } - if (!StringUtils.isEmpty(conditions[7])) + if (!StringUtils.isEmpty(conditions[8])) { - String[] availabilities = conditions[7].split(ActivityManageTriggerCalendar.separator); + String[] availabilities = conditions[8].split(ActivityManageTriggerCalendar.separator); if (availabilities.length > 0) { if (!Miscellaneous.arraySearch(availabilities, event.availability, false, true)) @@ -736,9 +741,9 @@ public class Trigger } } - if (!StringUtils.isEmpty(conditions[8])) + if (!StringUtils.isEmpty(conditions[9])) { - String[] calendars = conditions[8].split(ActivityManageTriggerCalendar.separator); + String[] calendars = conditions[9].split(ActivityManageTriggerCalendar.separator); if (calendars.length > 0) { if (!Miscellaneous.arraySearch(calendars, String.valueOf(event.calendarId), false, true)) @@ -748,7 +753,7 @@ public class Trigger } } } -//TODO: all-day abwählbar machen + // No contradictions found Miscellaneous.logEvent("i", "CalendarCheck", "Event " + event + " matches.", 4); return true; @@ -1980,15 +1985,18 @@ public class Trigger returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.calendarDescription) + " " + conditions[4] + " " + conditions[5] + ", "); if(Boolean.parseBoolean(conditions[6])) - returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.allDayEventTrue) + ", "); - else - returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.allDayEventFalse) + ", "); - - if (!StringUtils.isEmpty(conditions[7])) - returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.availabilities) + " " + conditions[7] + ", "); + { + if (Boolean.parseBoolean(conditions[7])) + returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.allDayEventTrue) + ", "); + else + returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.allDayEventFalse) + ", "); + } if (!StringUtils.isEmpty(conditions[8])) - returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.calendars) + " " + conditions[8]); + returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.availabilities) + " " + conditions[8] + ", "); + + if (!StringUtils.isEmpty(conditions[9])) + returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.calendars) + " " + conditions[9]); if (returnString.toString().endsWith(", ")) returnString.delete(returnString.length() - 2, returnString.length()); diff --git a/app/src/main/java/com/jens/automation2/receivers/CalendarReceiver.java b/app/src/main/java/com/jens/automation2/receivers/CalendarReceiver.java index 5f4e0545..f73832a2 100644 --- a/app/src/main/java/com/jens/automation2/receivers/CalendarReceiver.java +++ b/app/src/main/java/com/jens/automation2/receivers/CalendarReceiver.java @@ -283,7 +283,7 @@ public class CalendarReceiver extends BroadcastReceiver implements AutomationLis armOrRearmTimer(); } - private static void armOrRearmTimer() + public static void armOrRearmTimer() { PendingIntent pi = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) @@ -391,19 +391,24 @@ public class CalendarReceiver extends BroadcastReceiver implements AutomationLis Collections.sort(wakeUpCandidatesList); - if(nextWakeup == null || nextWakeup.getTimeInMillis() != wakeUpCandidatesList.get(0)) - { - Calendar newAlarm = Miscellaneous.calendarFromLong(wakeUpCandidatesList.get(0)); - if(nextWakeup == null) - Miscellaneous.logEvent("i", "calculateNextWakeupForCalendar()", "Chose " + Miscellaneous.formatDate(newAlarm.getTime()) + " as next wakeup for calendar triggers. Old was null.", 5); - else - Miscellaneous.logEvent("i", "calculateNextWakeupForCalendar()", "Chose " + Miscellaneous.formatDate(newAlarm.getTime()) + " as next wakeup for calendar triggers. Old was " + Miscellaneous.formatDate(nextWakeup.getTime()), 5); - nextWakeup = newAlarm; - if (!wakeupNeedsToBeScheduled) - wakeupNeedsToBeScheduled = true; - } + if(wakeUpCandidatesList.size() == 0) + Miscellaneous.logEvent("i", "calculateNextWakeupForCalendar()", "Not scheduling any calendar related wakeup as there are no future events that might match a configured trigger.", 5); else - Miscellaneous.logEvent("i", "calculateNextWakeupForCalendar()", "Alarm " + Miscellaneous.formatDate(nextWakeup.getTime()) + " has been selected as next wakeup, but not rescheduling since this was not a change.", 5); + { + if (nextWakeup == null || nextWakeup.getTimeInMillis() != wakeUpCandidatesList.get(0)) + { + Calendar newAlarm = Miscellaneous.calendarFromLong(wakeUpCandidatesList.get(0)); + if (nextWakeup == null) + Miscellaneous.logEvent("i", "calculateNextWakeupForCalendar()", "Chose " + Miscellaneous.formatDate(newAlarm.getTime()) + " as next wakeup for calendar triggers. Old was null.", 5); + else + Miscellaneous.logEvent("i", "calculateNextWakeupForCalendar()", "Chose " + Miscellaneous.formatDate(newAlarm.getTime()) + " as next wakeup for calendar triggers. Old was " + Miscellaneous.formatDate(nextWakeup.getTime()), 5); + nextWakeup = newAlarm; + if (!wakeupNeedsToBeScheduled) + wakeupNeedsToBeScheduled = true; + } + else + Miscellaneous.logEvent("i", "calculateNextWakeupForCalendar()", "Alarm " + Miscellaneous.formatDate(nextWakeup.getTime()) + " has been selected as next wakeup, but not rescheduling since this was not a change.", 5); + } } } diff --git a/app/src/main/res/layout/activity_manage_action_start_activity.xml b/app/src/main/res/layout/activity_manage_action_start_activity.xml index dbae9ed7..a273b501 100644 --- a/app/src/main/res/layout/activity_manage_action_start_activity.xml +++ b/app/src/main/res/layout/activity_manage_action_start_activity.xml @@ -293,7 +293,6 @@ android:layout_height="wrap_content"> diff --git a/app/src/main/res/layout/activity_manage_action_trigger_url.xml b/app/src/main/res/layout/activity_manage_action_trigger_url.xml index cf242116..dd32646e 100644 --- a/app/src/main/res/layout/activity_manage_action_trigger_url.xml +++ b/app/src/main/res/layout/activity_manage_action_trigger_url.xml @@ -118,12 +118,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +