calendar trigger
This commit is contained in:
parent
584495ef61
commit
d2606b72cd
@ -17,17 +17,19 @@ import androidx.annotation.Nullable;
|
||||
|
||||
import com.jens.automation2.receivers.CalendarReceiver;
|
||||
|
||||
import java.sql.Array;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class ActivityManageTriggerCalendar extends Activity
|
||||
{
|
||||
CheckBox chkCalendarEventDirection, chkCalendarAvailabilityBusy, chkCalendarAvailabilityFree, chkCalendarAvailabilityTentative, chkCalendarAvailabilityOutOfOffice, chkCalendarAvailabilityWorkingElsewhere;
|
||||
CheckBox chkCalendarEventActive, chkCalendarAvailabilityBusy, chkCalendarAvailabilityFree, chkCalendarAvailabilityTentative, chkCalendarAvailabilityOutOfOffice, chkCalendarAvailabilityWorkingElsewhere;
|
||||
Spinner spinnerCalendarTitleDirection, spinnerCalendarLocationDirection, spinnerCalendarDescriptionDirection;
|
||||
EditText etCalendarTitle, etCalendarLocation, etCalendarDescription;
|
||||
LinearLayout llCalendarSelection;
|
||||
Button bSaveTriggerCalendar;
|
||||
List<CheckBox> checkboxesCalendars = new ArrayList<>();
|
||||
final static String separator = ",";
|
||||
|
||||
private static String[] directions;
|
||||
ArrayAdapter<String> directionSpinnerAdapter;
|
||||
@ -39,7 +41,7 @@ public class ActivityManageTriggerCalendar extends Activity
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.activity_manage_trigger_calendar);
|
||||
|
||||
chkCalendarEventDirection = (CheckBox) findViewById(R.id.chkCalendarEventDirection);
|
||||
chkCalendarEventActive = (CheckBox) findViewById(R.id.chkCalendarEventActive);
|
||||
spinnerCalendarTitleDirection = (Spinner)findViewById(R.id.spinnerCalendarTitleDirection);
|
||||
spinnerCalendarLocationDirection = (Spinner)findViewById(R.id.spinnerCalendarLocationDirection);
|
||||
spinnerCalendarDescriptionDirection = (Spinner)findViewById(R.id.spinnerCalendarDescriptionDirection);
|
||||
@ -80,15 +82,15 @@ public class ActivityManageTriggerCalendar extends Activity
|
||||
checkboxesCalendars.add(oneCalCheckbox);
|
||||
}
|
||||
|
||||
chkCalendarEventDirection.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
|
||||
chkCalendarEventActive.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
|
||||
{
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton compoundButton, boolean checked)
|
||||
{
|
||||
if(checked)
|
||||
chkCalendarEventDirection.setText(R.string.eventIsCurrentlyHappening);
|
||||
chkCalendarEventActive.setText(R.string.eventIsCurrentlyHappening);
|
||||
else
|
||||
chkCalendarEventDirection.setText(R.string.eventIsCurrentlyNotHappening);
|
||||
chkCalendarEventActive.setText(R.string.eventIsCurrentlyNotHappening);
|
||||
}
|
||||
});
|
||||
|
||||
@ -126,16 +128,19 @@ public class ActivityManageTriggerCalendar extends Activity
|
||||
if(calCheckbox.isChecked())
|
||||
selectedCalendarsList.add((CalendarReceiver.AndroidCalendar) calCheckbox.getTag());
|
||||
}
|
||||
List<String> selectedCalendarsIdArray = new ArrayList<>();
|
||||
for(CalendarReceiver.AndroidCalendar cal : selectedCalendarsList)
|
||||
selectedCalendarsIdArray.add(String.valueOf(cal.calendarId));
|
||||
|
||||
String returnString =
|
||||
titleDir + Trigger.triggerParameter2Split + title + Trigger.triggerParameter2Split +
|
||||
descriptionDir + Trigger.triggerParameter2Split + description + Trigger.triggerParameter2Split +
|
||||
locationDir + Trigger.triggerParameter2Split + location + Trigger.triggerParameter2Split +
|
||||
Miscellaneous.explode(",", availabilityList.toArray(new String[availabilityList.size()])) + Trigger.triggerParameter2Split +
|
||||
Miscellaneous.explode(",", selectedCalendarsList.toArray(new String[availabilityList.size()]));
|
||||
Miscellaneous.explode(separator, availabilityList.toArray(new String[availabilityList.size()])) + Trigger.triggerParameter2Split +
|
||||
Miscellaneous.explode(separator, selectedCalendarsIdArray.toArray(new String[selectedCalendarsIdArray.size()]));
|
||||
|
||||
Intent data = new Intent();
|
||||
data.putExtra(ActivityManageRule.intentNameTriggerParameter1, chkCalendarEventDirection.isChecked());
|
||||
data.putExtra(ActivityManageRule.intentNameTriggerParameter1, chkCalendarEventActive.isChecked());
|
||||
data.putExtra(ActivityManageRule.intentNameTriggerParameter2, returnString);
|
||||
ActivityManageTriggerCalendar.this.setResult(RESULT_OK, data);
|
||||
|
||||
@ -153,7 +158,7 @@ public class ActivityManageTriggerCalendar extends Activity
|
||||
//TODO:try-catch
|
||||
|
||||
if(data.hasExtra(ActivityManageRule.intentNameTriggerParameter1))
|
||||
chkCalendarEventDirection.setChecked(data.getBooleanExtra(ActivityManageRule.intentNameTriggerParameter1, true));
|
||||
chkCalendarEventActive.setChecked(data.getBooleanExtra(ActivityManageRule.intentNameTriggerParameter1, true));
|
||||
|
||||
if(data.hasExtra(ActivityManageRule.intentNameTriggerParameter2))
|
||||
{
|
||||
@ -165,8 +170,8 @@ public class ActivityManageTriggerCalendar extends Activity
|
||||
3 = description
|
||||
4 = locationDir
|
||||
5 = location
|
||||
6 = availabilityDir
|
||||
7 = availability
|
||||
6 = availability list
|
||||
7 = calendars list
|
||||
*/
|
||||
|
||||
for(int i = 0; i < directions.length; i++)
|
||||
@ -184,6 +189,36 @@ public class ActivityManageTriggerCalendar extends Activity
|
||||
etCalendarTitle.setText(input[1]);
|
||||
etCalendarDescription.setText(input[3]);
|
||||
etCalendarLocation.setText(input[5]);
|
||||
|
||||
String[] availabilities = input[6].split(separator);
|
||||
String[] calendars = input[7].split(separator);
|
||||
|
||||
for(String avail : availabilities)
|
||||
{
|
||||
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(CheckBox checkbox : checkboxesCalendars)
|
||||
{
|
||||
int id = ((CalendarReceiver.AndroidCalendar)checkbox.getTag()).calendarId;
|
||||
for(String calId : calendars)
|
||||
{
|
||||
if(calId.equals(String.valueOf(id)))
|
||||
{
|
||||
checkbox.setChecked(true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -637,34 +637,66 @@ public class Trigger
|
||||
|
||||
for(CalendarReceiver.CalendarEvent event : calendarEvents)
|
||||
{
|
||||
boolean isActive = Boolean.parseBoolean(conditions[0]);
|
||||
if(isActive == event.isCurrentActive())
|
||||
boolean isActive = getTriggerParameter();
|
||||
if(isActive != event.isCurrentlyActive())
|
||||
{
|
||||
if(Miscellaneous.compare(conditions[0], conditions[1], event.title))
|
||||
{
|
||||
// title matches according to demands
|
||||
Miscellaneous.logEvent("i", "CalendarCheck", "Event has to be currently active: " + String.valueOf(triggerParameter) + ", but is required otherwise.", 5);
|
||||
break;
|
||||
}
|
||||
|
||||
if(Miscellaneous.compare(conditions[2], conditions[3], event.description))
|
||||
if(!StringUtils.isEmpty(conditions[1]))
|
||||
{
|
||||
// description matches according to demands
|
||||
|
||||
if(Miscellaneous.compare(conditions[4], conditions[5], event.location))
|
||||
if (!Miscellaneous.compare(conditions[0], conditions[1], event.title))
|
||||
{
|
||||
// location matches according to demands
|
||||
Miscellaneous.logEvent("i", "CalendarCheck", "Title does not match.", 5);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(Miscellaneous.compare(conditions[6], conditions[7], event.availability))
|
||||
if(!StringUtils.isEmpty(conditions[3]))
|
||||
{
|
||||
// availability matches according to demands
|
||||
if (!Miscellaneous.compare(conditions[2], conditions[3], event.description))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "CalendarCheck", "Description does not match.", 5);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(!StringUtils.isEmpty(conditions[5]))
|
||||
{
|
||||
if (!Miscellaneous.compare(conditions[4], conditions[5], event.location))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "CalendarCheck", "Location does not match.", 5);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
String[] availabilities = conditions[6].split(ActivityManageTriggerCalendar.separator);
|
||||
if(availabilities.length > 0)
|
||||
{
|
||||
if(!Miscellaneous.arraySearch(availabilities, event.availability, false, true))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "CalendarCheck", "Availability does not match.", 5);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
String[] calendars = conditions[7].split(ActivityManageTriggerCalendar.separator);
|
||||
if(availabilities.length > 0)
|
||||
{
|
||||
if(!Miscellaneous.arraySearch(calendars, String.valueOf(event.calendarId), false, true))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "CalendarCheck", "Calendar does not match.", 5);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// No contradictions found
|
||||
Miscellaneous.logEvent("i", "CalendarCheck", "Event " + event + " matches.", 4);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
//At this point none of the calendar items matches this trigger
|
||||
|
||||
//TODO: If trigger demands no calendar event and there is absolutely no future event, we'll need to check for that.
|
||||
}
|
||||
|
@ -7,6 +7,8 @@ import android.content.IntentFilter;
|
||||
import android.database.Cursor;
|
||||
import android.net.Uri;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.jens.automation2.AutomationService;
|
||||
import com.jens.automation2.Miscellaneous;
|
||||
import com.jens.automation2.Rule;
|
||||
@ -116,11 +118,18 @@ public class CalendarReceiver extends BroadcastReceiver implements AutomationLis
|
||||
public Calendar start, end;
|
||||
public boolean allDay;
|
||||
|
||||
public boolean isCurrentActive()
|
||||
public boolean isCurrentlyActive()
|
||||
{
|
||||
Calendar now = Calendar.getInstance();
|
||||
return now.getTimeInMillis() >= start.getTimeInMillis() && now.getTimeInMillis() < end.getTimeInMillis();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return title;
|
||||
}
|
||||
}
|
||||
|
||||
public static List<AndroidCalendar> readCalendars(Context context)
|
||||
|
@ -36,7 +36,7 @@
|
||||
android:text="@string/direction"/>
|
||||
|
||||
<CheckBox
|
||||
android:id="@+id/chkCalendarEventDirection"
|
||||
android:id="@+id/chkCalendarEventActive"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/eventIsCurrentlyHappening"
|
||||
|
@ -919,5 +919,5 @@
|
||||
<string name="calendarStringWorkingElsewhere">working elsewhere</string>
|
||||
<string name="selectingNoneItemForAllToMatch">Select no item if any will do.</string>
|
||||
<string name="calendars">Calendars</string>
|
||||
<string name="calendarAvailabilityTypesUnsupported">It may be that only the first 4 types are actually working becaue the other types are not part of Google Calendar.</string>
|
||||
<string name="calendarAvailabilityTypesUnsupported">It may be that only the first 3 types are actually working becaue the other types are not part of Google Calendar.</string>
|
||||
</resources>
|
Loading…
Reference in New Issue
Block a user