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

Commit 2c93da90 authored by Julia Reynolds's avatar Julia Reynolds
Browse files

Synchronize on subscription list.

Bug: 27676283
Change-Id: I0382369895ba54abab7e43e28b72495db9f84f94
parent 1c9bd42a
Loading
Loading
Loading
Loading
+64 −52
Original line number Diff line number Diff line
@@ -44,6 +44,8 @@ import com.android.server.notification.CalendarTracker.CheckEventResult;
import com.android.server.notification.NotificationManagerService.DumpFilter;

import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

/**
 * Built-in zen condition provider for calendar event-based conditions.
@@ -96,11 +98,13 @@ public class EventConditionProvider extends SystemConditionProviderService {
        pw.print("      mRegistered="); pw.println(mRegistered);
        pw.print("      mBootComplete="); pw.println(mBootComplete);
        dumpUpcomingTime(pw, "mNextAlarmTime", mNextAlarmTime, System.currentTimeMillis());
        synchronized (mSubscriptions) {
            pw.println("      mSubscriptions=");
            for (Uri conditionId : mSubscriptions) {
                pw.print("        ");
                pw.println(conditionId);
            }
        }
        pw.println("      mTrackers=");
        for (int i = 0; i < mTrackers.size(); i++) {
            pw.print("        user="); pw.println(mTrackers.keyAt(i));
@@ -142,21 +146,25 @@ public class EventConditionProvider extends SystemConditionProviderService {
    public void onSubscribe(Uri conditionId) {
        if (DEBUG) Slog.d(TAG, "onSubscribe " + conditionId);
        if (!ZenModeConfig.isValidEventConditionId(conditionId)) {
            notifyCondition(conditionId, Condition.STATE_FALSE, "badCondition");
            notifyCondition(createCondition(conditionId, Condition.STATE_FALSE));
            return;
        }
        synchronized (mSubscriptions) {
            if (mSubscriptions.add(conditionId)) {
                evaluateSubscriptions();
            }
        }
    }

    @Override
    public void onUnsubscribe(Uri conditionId) {
        if (DEBUG) Slog.d(TAG, "onUnsubscribe " + conditionId);
        synchronized (mSubscriptions) {
            if (mSubscriptions.remove(conditionId)) {
                evaluateSubscriptions();
            }
        }
    }

    @Override
    public void attachBase(Context base) {
@@ -198,15 +206,18 @@ public class EventConditionProvider extends SystemConditionProviderService {
            return;
        }
        final long now = System.currentTimeMillis();
        List<Condition> conditionsToNotify = new ArrayList<>();
        synchronized (mSubscriptions) {
            for (int i = 0; i < mTrackers.size(); i++) {
            mTrackers.valueAt(i).setCallback(mSubscriptions.isEmpty() ? null : mTrackerCallback);
                mTrackers.valueAt(i).setCallback(
                        mSubscriptions.isEmpty() ? null : mTrackerCallback);
            }
            setRegistered(!mSubscriptions.isEmpty());
            long reevaluateAt = 0;
            for (Uri conditionId : mSubscriptions) {
                final EventInfo event = ZenModeConfig.tryParseEventConditionId(conditionId);
                if (event == null) {
                notifyCondition(conditionId, Condition.STATE_FALSE, "badConditionId");
                    conditionsToNotify.add(createCondition(conditionId, Condition.STATE_FALSE));
                    continue;
                }
                CheckEventResult result = null;
@@ -228,21 +239,28 @@ public class EventConditionProvider extends SystemConditionProviderService {
                    final CalendarTracker tracker = mTrackers.get(userId);
                    if (tracker == null) {
                        Slog.w(TAG, "No calendar tracker found for user " + userId);
                    notifyCondition(conditionId, Condition.STATE_FALSE, "badUserId");
                        conditionsToNotify.add(createCondition(conditionId, Condition.STATE_FALSE));
                        continue;
                    }
                    result = tracker.checkEvent(event, now);
                }
            if (result.recheckAt != 0 && (reevaluateAt == 0 || result.recheckAt < reevaluateAt)) {
                if (result.recheckAt != 0
                        && (reevaluateAt == 0 || result.recheckAt < reevaluateAt)) {
                    reevaluateAt = result.recheckAt;
                }
                if (!result.inEvent) {
                notifyCondition(conditionId, Condition.STATE_FALSE, "!inEventNow");
                    conditionsToNotify.add(createCondition(conditionId, Condition.STATE_FALSE));
                    continue;
                }
            notifyCondition(conditionId, Condition.STATE_TRUE, "inEventNow");
                conditionsToNotify.add(createCondition(conditionId, Condition.STATE_TRUE));
            }
            rescheduleAlarm(now, reevaluateAt);
        }
        for (Condition condition : conditionsToNotify) {
            if (condition != null) {
                notifyCondition(condition);
            }
        }
        if (DEBUG) Slog.d(TAG, "evaluateSubscriptions took " + (System.currentTimeMillis() - now));
    }

@@ -266,12 +284,6 @@ public class EventConditionProvider extends SystemConditionProviderService {
        alarms.setExact(AlarmManager.RTC_WAKEUP, time, pendingIntent);
    }

    private void notifyCondition(Uri conditionId, int state, String reason) {
        if (DEBUG) Slog.d(TAG, "notifyCondition " + conditionId + " "
                + Condition.stateToString(state) + " reason=" + reason);
        notifyCondition(createCondition(conditionId, state));
    }

    private Condition createCondition(Uri id, int state) {
        final String summary = NOT_SHOWN;
        final String line1 = NOT_SHOWN;