Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Verified Commit 8cd209b7 authored by mebitek's avatar mebitek Committed by Fahim M. Choudhury
Browse files

feat: show tasks on day, week, month and agenda view (from option menu)

Calendar uses /e/OS's Tasks app's data to show tasks on Calendar.

FIXME: Clicking on event is not opening event info details. Instead, it shows indefinite progress indicator.
parent a9d5994e
Loading
Loading
Loading
Loading
+3 −5
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@
  -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="foundation.e.calendar"
    android:installLocation="auto">

    <uses-permission android:name="android.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS" />
@@ -34,8 +33,8 @@
    <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
    <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
    <uses-permission android:name="org.dmfs.permission.READ_TASKS" />
    <uses-permission android:name="org.dmfs.permission.WRITE_TASKS" />
    <uses-permission android:name="foundation.e.permission.READ_TASKS" />
    <uses-permission android:name="foundation.e.permission.WRITE_TASKS" />

    <queries>
        <intent>
@@ -53,8 +52,7 @@
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="https" />
        </intent>
        <provider android:authorities="org.tasks" android:exported="false" />
        <provider android:authorities="org.dmfs.tasks" android:exported="false" />
        <provider android:authorities="foundation.e.tasks" android:exported="false" />
    </queries>

    <application android:name="com.android.calendar.CalendarApplication"
+8 −8
Original line number Diff line number Diff line
@@ -88,7 +88,7 @@ import com.android.calendar.alerts.AlertService;
import com.android.calendar.event.CalendarPickerDialogFragment;
import com.android.calendar.event.EditEventHelper;
import com.android.calendar.month.MonthByWeekFragment;
import com.android.calendar.persistence.tasks.DmfsOpenTasksContract;
import com.android.calendar.persistence.tasks.OpenTasksContract;
import com.android.calendar.selectcalendars.SelectVisibleCalendarsFragment;
import com.android.calendar.settings.GeneralPreferences;
import com.android.calendar.settings.SettingsActivity;
@@ -481,17 +481,17 @@ public class AllInOneActivity extends AbstractCalendarActivity implements EventH
                ContextCompat.checkSelfPermission(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) ||
                ContextCompat.checkSelfPermission(this, DmfsOpenTasksContract.TASK_READ_PERMISSION)
                ContextCompat.checkSelfPermission(this, OpenTasksContract.TASK_READ_PERMISSION)
                != PackageManager.PERMISSION_GRANTED ||
                ContextCompat.checkSelfPermission(this, DmfsOpenTasksContract.TASK_WRITE_PERMISSION)
                ContextCompat.checkSelfPermission(this, OpenTasksContract.TASK_WRITE_PERMISSION)
                != PackageManager.PERMISSION_GRANTED) {

            ArrayList<String> permissionsList = new ArrayList<>(Arrays.asList(
                    Manifest.permission.WRITE_CALENDAR,
                    Manifest.permission.READ_CALENDAR,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE,
                    DmfsOpenTasksContract.TASK_READ_PERMISSION,
                    DmfsOpenTasksContract.TASK_WRITE_PERMISSION
                    OpenTasksContract.TASK_READ_PERMISSION,
                    OpenTasksContract.TASK_WRITE_PERMISSION
            ));

            // Permission for calendar notifications
@@ -1093,7 +1093,7 @@ public class AllInOneActivity extends AbstractCalendarActivity implements EventH
        } else if (itemId == R.id.action_info) {
            checkAndRequestDisablingDoze();
        } else if (itemId == R.id.action_view_agenda_tasks || itemId == R.id.action_view_agenda_events) {
                FragmentManager manager = getFragmentManager();
                FragmentManager manager = getSupportFragmentManager();
                FragmentTransaction transaction = manager.beginTransaction();
                long millis = Utils.timeFromIntentInMillis(getIntent());
                AgendaFragment frag = new AgendaFragment(millis, false);
@@ -1584,7 +1584,7 @@ public class AllInOneActivity extends AbstractCalendarActivity implements EventH
                if ((mCurrentView == ViewType.AGENDA && mShowEventInfoFullScreenAgenda) || ((mCurrentView == ViewType.DAY || (mCurrentView == ViewType.WEEK) || mCurrentView == ViewType.MONTH) && mShowEventInfoFullScreen)) {
                    // start event info as activity
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    Uri eventUri = ContentUris.withAppendedId(DmfsOpenTasksContract.Tasks.PROVIDER_URI, event.id);
                    Uri eventUri = ContentUris.withAppendedId(OpenTasksContract.Tasks.PROVIDER_URI, event.id);
                    intent.setData(eventUri);
                    intent.setClass(this, EventInfoActivity.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP);
@@ -1600,7 +1600,7 @@ public class AllInOneActivity extends AbstractCalendarActivity implements EventH
                            EventInfoFragment.DIALOG_WINDOW_STYLE,
                            null /* No reminders to explicitly pass in. */);
                    fragment.setDialogParams(event.x, event.y, mActionBar.getHeight());
                    FragmentManager fm = getFragmentManager();
                    FragmentManager fm = getSupportFragmentManager();
                    FragmentTransaction ft = fm.beginTransaction();
                    // if we have an old popup replace it
                    Fragment fOld = fm.findFragmentByTag(EVENT_INFO_FRAGMENT_TAG);
+2 −2
Original line number Diff line number Diff line
@@ -42,7 +42,7 @@ import android.util.Log;
import android.util.Pair;

import com.android.calendar.event.EditEventActivity;
import com.android.calendar.persistence.tasks.DmfsOpenTasksContract;
import com.android.calendar.persistence.tasks.OpenTasksContract;
import com.android.calendar.settings.GeneralPreferences;
import com.android.calendar.settings.SettingsActivity;
import com.android.calendarcommon2.Time;
@@ -598,7 +598,7 @@ public class CalendarController {

    public void launchViewTask(long eventId, long startMillis, long endMillis, int response) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        Uri eventUri = ContentUris.withAppendedId(DmfsOpenTasksContract.Tasks.PROVIDER_URI, eventId);
        Uri eventUri = ContentUris.withAppendedId(OpenTasksContract.Tasks.PROVIDER_URI, eventId);
        intent.setData(eventUri);
        intent.setClass(mContext, AllInOneActivity.class);
        intent.putExtra(EXTRA_EVENT_BEGIN_TIME, startMillis);
+22 −22
Original line number Diff line number Diff line
@@ -34,7 +34,7 @@ import android.text.TextUtils;
import android.text.format.DateUtils;
import android.util.Log;

import com.android.calendar.persistence.tasks.DmfsOpenTasksContract;
import com.android.calendar.persistence.tasks.OpenTasksContract;
import com.android.calendar.settings.GeneralPreferences;

import java.sql.Timestamp;
@@ -93,25 +93,25 @@ public class Event implements Cloneable {
                    + DateUtils.DAY_IN_MILLIS + " AS " + DISPLAY_AS_ALLDAY, // 20
    };

    public static final String[] TASK_PROJECTION = new String[]{DmfsOpenTasksContract.Tasks.COLUMN_TITLE,        // 0
            DmfsOpenTasksContract.Tasks.COLUMN_LOCATION,     // 1
            DmfsOpenTasksContract.Tasks.COLUMN_IS_ALLDAY,    // 2
            DmfsOpenTasksContract.Tasks.COLUMN_LIST_COLOR,   // 3
            DmfsOpenTasksContract.Tasks.COLUMN_TZ,           // 4
            DmfsOpenTasksContract.Tasks.COLUMN_ID,           // 5
            DmfsOpenTasksContract.Tasks.COLUMN_START_DATE,   // 6
            DmfsOpenTasksContract.Tasks.COLUMN_DUE_DATE,     // 7
            DmfsOpenTasksContract.Tasks.COLUMN_ID,           // 8
            DmfsOpenTasksContract.Tasks.COLUMN_START_DATE,   // 9
            DmfsOpenTasksContract.Tasks.COLUMN_DUE_DATE,     // 10
            DmfsOpenTasksContract.Tasks.COLUMN_START_DATE,   // 11
            DmfsOpenTasksContract.Tasks.COLUMN_DUE_DATE,     // 12
            DmfsOpenTasksContract.Tasks.COLUMN_HAS_ALLARMS,  // 13
            DmfsOpenTasksContract.Tasks.COLUMN_RRULE,        // 14
            DmfsOpenTasksContract.Tasks.COLUMN_RDATE,        // 15
            DmfsOpenTasksContract.Tasks.COLUMN_STATUS,       // 16
            DmfsOpenTasksContract.Tasks.COLUMN_ACCOUNT_NAME, // 17
            DmfsOpenTasksContract.Tasks.COLUMN_ORGANIZER,    // 18
    public static final String[] TASK_PROJECTION = new String[]{OpenTasksContract.Tasks.COLUMN_TITLE,        // 0
            OpenTasksContract.Tasks.COLUMN_LOCATION,     // 1
            OpenTasksContract.Tasks.COLUMN_IS_ALLDAY,    // 2
            OpenTasksContract.Tasks.COLUMN_LIST_COLOR,   // 3
            OpenTasksContract.Tasks.COLUMN_TZ,           // 4
            OpenTasksContract.Tasks.COLUMN_ID,           // 5
            OpenTasksContract.Tasks.COLUMN_START_DATE,   // 6
            OpenTasksContract.Tasks.COLUMN_DUE_DATE,     // 7
            OpenTasksContract.Tasks.COLUMN_ID,           // 8
            OpenTasksContract.Tasks.COLUMN_START_DATE,   // 9
            OpenTasksContract.Tasks.COLUMN_DUE_DATE,     // 10
            OpenTasksContract.Tasks.COLUMN_START_DATE,   // 11
            OpenTasksContract.Tasks.COLUMN_DUE_DATE,     // 12
            OpenTasksContract.Tasks.COLUMN_HAS_ALLARMS,  // 13
            OpenTasksContract.Tasks.COLUMN_RRULE,        // 14
            OpenTasksContract.Tasks.COLUMN_RDATE,        // 15
            OpenTasksContract.Tasks.COLUMN_STATUS,       // 16
            OpenTasksContract.Tasks.COLUMN_ACCOUNT_NAME, // 17
            OpenTasksContract.Tasks.COLUMN_ORGANIZER,    // 18
            "0>0",                                           // 19
            "0>0",                                           // 20
    };
@@ -290,9 +290,9 @@ public class Event implements Cloneable {
    public static Cursor instancesQueryForTasks(ContentResolver cr, String[] projection, int startDay, int endDay) {
        long startMills = getMillsFromJulian(startDay, true);
        long endMills = getMillsFromJulian(endDay, false);
        String taskWhere = DmfsOpenTasksContract.Tasks.COLUMN_STATUS + NOT_EQUALS + DmfsOpenTasksContract.Tasks.STATUS_COMPLETED + AND_BRACKET + DmfsOpenTasksContract.Tasks.COLUMN_DUE_DATE + LTE + endMills + CLOSING_BRACKET + AND_BRACKET + DmfsOpenTasksContract.Tasks.COLUMN_DUE_DATE + GTE + startMills + CLOSING_BRACKET + AND_BRACKET + DmfsOpenTasksContract.Tasks.COLUMN_VISIBLE + " = 1" + CLOSING_BRACKET + AND_BRACKET + DmfsOpenTasksContract.Tasks.COLUMN_DUE_DATE + " != 0" + CLOSING_BRACKET;
        String taskWhere = OpenTasksContract.Tasks.COLUMN_STATUS + NOT_EQUALS + OpenTasksContract.Tasks.STATUS_COMPLETED + AND_BRACKET + OpenTasksContract.Tasks.COLUMN_DUE_DATE + LTE + endMills + CLOSING_BRACKET + AND_BRACKET + OpenTasksContract.Tasks.COLUMN_DUE_DATE + GTE + startMills + CLOSING_BRACKET + AND_BRACKET + OpenTasksContract.Tasks.COLUMN_VISIBLE + " = 1" + CLOSING_BRACKET + AND_BRACKET + OpenTasksContract.Tasks.COLUMN_DUE_DATE + " != 0" + CLOSING_BRACKET;

        return cr.query(DmfsOpenTasksContract.Tasks.PROVIDER_URI, projection, taskWhere, null, "due ASC, title ASC");
        return cr.query(OpenTasksContract.Tasks.PROVIDER_URI, projection, taskWhere, null, "due ASC, title ASC");
    }

    public static long getMillsFromJulian(int day, boolean isStart) {
+31 −32
Original line number Diff line number Diff line
@@ -121,7 +121,7 @@ import com.android.calendar.icalendar.IcalendarUtils;
import com.android.calendar.icalendar.Organizer;
import com.android.calendar.icalendar.VCalendar;
import com.android.calendar.icalendar.VEvent;
import com.android.calendar.persistence.tasks.DmfsOpenTasksContract;
import com.android.calendar.persistence.tasks.OpenTasksContract;
import com.android.calendar.settings.GeneralPreferences;
import com.android.calendarcommon2.DateException;
import com.android.calendarcommon2.Duration;
@@ -139,7 +139,6 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;

@@ -196,12 +195,12 @@ public class EventInfoFragment extends DialogFragment implements OnCheckedChange
    };

    static final String[] TASK_LIST_PROJECTION = new String[]{
            DmfsOpenTasksContract.TaskLists.COLUMN_ID,           // 0
            DmfsOpenTasksContract.TaskLists.COLUMN_NAME,  // 1
            DmfsOpenTasksContract.TaskLists.COLUMN_LIST_OWNER, // 2
            OpenTasksContract.TaskLists.COLUMN_ID,           // 0
            OpenTasksContract.TaskLists.COLUMN_NAME,  // 1
            OpenTasksContract.TaskLists.COLUMN_LIST_OWNER, // 2
            "0 AS canOrganizerRespond", // 3
            DmfsOpenTasksContract.TaskLists.COLUMN_ACCOUNT_NAME, // 4
            DmfsOpenTasksContract.TaskLists.COLUMN_ACCOUNT_TYPE  // 5
            OpenTasksContract.TaskLists.COLUMN_ACCOUNT_NAME, // 4
            OpenTasksContract.TaskLists.COLUMN_ACCOUNT_TYPE  // 5
    };
    static final int CALENDARS_INDEX_DISPLAY_NAME = 1;
    static final int CALENDARS_INDEX_OWNER_ACCOUNT = 2;
@@ -210,10 +209,10 @@ public class EventInfoFragment extends DialogFragment implements OnCheckedChange
    static final int CALENDARS_INDEX_ACCOUNT_TYPE = 5;
    static final String CALENDARS_WHERE = Calendars._ID + "=?";

    static final String TASK_LIST_WHERE = DmfsOpenTasksContract.TaskLists.COLUMN_ID + "=?";
    static final String TASK_LIST_WHERE = OpenTasksContract.TaskLists.COLUMN_ID + "=?";
    static final String CALENDARS_DUPLICATE_NAME_WHERE = Calendars.CALENDAR_DISPLAY_NAME + "=?";

    static final String TASK_LIST_DUPLICATE_NAME_WHERE =  DmfsOpenTasksContract.TaskLists.COLUMN_NAME + "=?";
    static final String TASK_LIST_DUPLICATE_NAME_WHERE =  OpenTasksContract.TaskLists.COLUMN_NAME + "=?";
    static final String CALENDARS_VISIBLE_WHERE = Calendars.VISIBLE + "=?";
    static final String[] COLORS_PROJECTION = new String[]{
            Colors._ID, // 0
@@ -282,33 +281,33 @@ public class EventInfoFragment extends DialogFragment implements OnCheckedChange
    };

    private static final String[] TASK_PROJECTION = new String[] {
            DmfsOpenTasksContract.Tasks.COLUMN_ID,                  // 0  do not remove; used in DeleteEventHelper
            DmfsOpenTasksContract.Tasks.COLUMN_TITLE,               // 1  do not remove; used in DeleteEventHelper
            DmfsOpenTasksContract.Tasks.COLUMN_RRULE,               // 2  do not remove; used in DeleteEventHelper
            DmfsOpenTasksContract.Tasks.COLUMN_IS_ALLDAY,           // 3  do not remove; used in DeleteEventHelper
            DmfsOpenTasksContract.Tasks.COLUMN_LIST_ID,             // 4  do not remove; used in DeleteEventHelper
            DmfsOpenTasksContract.Tasks.COLUMN_DTSTART,             // 5  do not remove; used in DeleteEventHelper
            DmfsOpenTasksContract.Tasks.COLUMN_SYNC_ID,             // 6  do not remove; used in DeleteEventHelper
            DmfsOpenTasksContract.Tasks.COLUMN_TZ,                  // 7  do not remove; used in DeleteEventHelper
            DmfsOpenTasksContract.Tasks.COLUMN_DESCRIPTION,         // 8
            DmfsOpenTasksContract.Tasks.COLUMN_LOCATION,            // 9
            DmfsOpenTasksContract.Tasks.COLUMN_LIST_ACCESS_LEVEL,   // 10
            DmfsOpenTasksContract.Tasks.COLUMN_LIST_COLOR,          // 11
            DmfsOpenTasksContract.Tasks.COLUMN_COLOR,               // 12
            DmfsOpenTasksContract.Tasks.COLUMN_STATUS,              // 13
            OpenTasksContract.Tasks.COLUMN_ID,                  // 0  do not remove; used in DeleteEventHelper
            OpenTasksContract.Tasks.COLUMN_TITLE,               // 1  do not remove; used in DeleteEventHelper
            OpenTasksContract.Tasks.COLUMN_RRULE,               // 2  do not remove; used in DeleteEventHelper
            OpenTasksContract.Tasks.COLUMN_IS_ALLDAY,           // 3  do not remove; used in DeleteEventHelper
            OpenTasksContract.Tasks.COLUMN_LIST_ID,             // 4  do not remove; used in DeleteEventHelper
            OpenTasksContract.Tasks.COLUMN_DTSTART,             // 5  do not remove; used in DeleteEventHelper
            OpenTasksContract.Tasks.COLUMN_SYNC_ID,             // 6  do not remove; used in DeleteEventHelper
            OpenTasksContract.Tasks.COLUMN_TZ,                  // 7  do not remove; used in DeleteEventHelper
            OpenTasksContract.Tasks.COLUMN_DESCRIPTION,         // 8
            OpenTasksContract.Tasks.COLUMN_LOCATION,            // 9
            OpenTasksContract.Tasks.COLUMN_LIST_ACCESS_LEVEL,   // 10
            OpenTasksContract.Tasks.COLUMN_LIST_COLOR,          // 11
            OpenTasksContract.Tasks.COLUMN_COLOR,               // 12
            OpenTasksContract.Tasks.COLUMN_STATUS,              // 13
            "0 AS hasAttendeeData",                                 // 14
            DmfsOpenTasksContract.Tasks.COLUMN_ORGANIZER,           // 15
            DmfsOpenTasksContract.Tasks.COLUMN_HAS_ALLARMS,         // 16
            OpenTasksContract.Tasks.COLUMN_ORGANIZER,           // 15
            OpenTasksContract.Tasks.COLUMN_HAS_ALLARMS,         // 16
            "10 AS maxReminders",                                   // 17
            "0 AS allowedReminders",                                // 18
            "null AS customAppPackage",                             // 19
            "null AS customAppUri",                                 // 20
            DmfsOpenTasksContract.Tasks.COLUMN_DUE_DATE,            // 21
            DmfsOpenTasksContract.Tasks.COLUMN_DURATION,            // 22
            DmfsOpenTasksContract.Tasks.COLUMN_ORIGINAL_INSTANCE_SYNC_ID,   // 23 do not remove; used in DeleteEventHelper
            OpenTasksContract.Tasks.COLUMN_DUE_DATE,            // 21
            OpenTasksContract.Tasks.COLUMN_DURATION,            // 22
            OpenTasksContract.Tasks.COLUMN_ORIGINAL_INSTANCE_SYNC_ID,   // 23 do not remove; used in DeleteEventHelper
            "0 AS availability",                                    // 24
            "0 AS accessLevel",                                     // 25
            DmfsOpenTasksContract.Tasks.COLUMN_ACCOUNT_NAME,        // 26
            OpenTasksContract.Tasks.COLUMN_ACCOUNT_NAME,        // 26
    };
    private static final int EVENT_INDEX_ID = 0;
    private static final int EVENT_INDEX_TITLE = 1;
@@ -1915,7 +1914,7 @@ public class EventInfoFragment extends DialogFragment implements OnCheckedChange

            // start visible calendars query
            if (isTaskList) {
                mHandler.startQuery(TOKEN_QUERY_VISIBLE_TASK_LIST, null, DmfsOpenTasksContract.TaskLists.PROVIDER_URI,
                mHandler.startQuery(TOKEN_QUERY_VISIBLE_TASK_LIST, null, OpenTasksContract.TaskLists.PROVIDER_URI,
                        TASK_LIST_PROJECTION, CALENDARS_VISIBLE_WHERE, new String[]{"1"}, null);
            } else{
                mHandler.startQuery(TOKEN_QUERY_VISIBLE_CALENDARS, null, Calendars.CONTENT_URI,
@@ -2551,7 +2550,7 @@ public class EventInfoFragment extends DialogFragment implements OnCheckedChange
                    updateEvent(mView);
                    prepareReminders();

                    uri = DmfsOpenTasksContract.TaskLists.PROVIDER_URI;
                    uri = OpenTasksContract.TaskLists.PROVIDER_URI;
                    args = new String[]{
                            Long.toString(mEventCursor.getLong(EVENT_INDEX_CALENDAR_ID))};
                    startQuery(TOKEN_QUERY_TASK_LIST, null, uri, TASK_LIST_PROJECTION,
@@ -2697,7 +2696,7 @@ public class EventInfoFragment extends DialogFragment implements OnCheckedChange
                        // email to the calendar owner display.
                        String displayName = mCalendarsCursor.getString(CALENDARS_INDEX_DISPLAY_NAME);
                        mHandler.startQuery(TOKEN_QUERY_DUPLICATE_TASK_LIST, null,
                                DmfsOpenTasksContract.TaskLists.PROVIDER_URI, TASK_LIST_PROJECTION,
                                OpenTasksContract.TaskLists.PROVIDER_URI, TASK_LIST_PROJECTION,
                                TASK_LIST_DUPLICATE_NAME_WHERE, new String[]{displayName}, null);
                    } else {
                        // Don't need to display the calendar owner when there is only a single
Loading