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