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

Commit 0842fe87 authored by Julia Reynolds's avatar Julia Reynolds
Browse files

Add 'until next alarm' option to QS zen panel.

Unlike the implementation in LMR1, this is a countdown condition
(a countdown until the time of what was the next alarm when the
rule was created). The rule will not change if alarms change.
Also, alarms up to 7 days in the future will be considered.

Bug: 21648799
Change-Id: Id7fa9dbdbad1539e4da19b1d0e0c4395bb13e6cb
parent 45610acb
Loading
Loading
Loading
Loading
+44 −31
Original line number Diff line number Diff line
@@ -68,6 +68,7 @@ public class ZenModeConfig implements Parcelable {
    public static final int[] MINUTE_BUCKETS = generateMinuteBuckets();
    private static final int SECONDS_MS = 1000;
    private static final int MINUTES_MS = 60 * SECONDS_MS;
    private static final int DAY_MINUTES = 24 * 60;
    private static final int ZERO_VALUE_MS = 10 * SECONDS_MS;

    private static final boolean DEFAULT_ALLOW_CALLS = true;
@@ -561,14 +562,6 @@ public class ZenModeConfig implements Parcelable {
        return tryParseLong(val, defValue);
    }

    public ArraySet<String> getAutomaticRuleNames() {
        final ArraySet<String> rt = new ArraySet<String>();
        for (int i = 0; i < automaticRules.size(); i++) {
            rt.add(automaticRules.valueAt(i).name);
        }
        return rt;
    }

    @Override
    public int describeContents() {
        return 0;
@@ -661,40 +654,65 @@ public class ZenModeConfig implements Parcelable {
            boolean shortVersion) {
        final long now = System.currentTimeMillis();
        final long millis = minutesFromNow == 0 ? ZERO_VALUE_MS : minutesFromNow * MINUTES_MS;
        return toTimeCondition(context, now + millis, minutesFromNow, now, userHandle,
                shortVersion);
        return toTimeCondition(context, now + millis, minutesFromNow, userHandle, shortVersion);
    }

    public static Condition toTimeCondition(Context context, long time, int minutes, long now,
    public static Condition toTimeCondition(Context context, long time, int minutes,
            int userHandle, boolean shortVersion) {
        final int num, summaryResId, line1ResId;
        final int num;
        String summary, line1, line2;
        final CharSequence formattedTime = getFormattedTime(context, time, minutes, userHandle);
        final Resources res = context.getResources();
        if (minutes < 60) {
            // display as minutes
            num = minutes;
            summaryResId = shortVersion ? R.plurals.zen_mode_duration_minutes_summary_short
            int summaryResId = shortVersion ? R.plurals.zen_mode_duration_minutes_summary_short
                    : R.plurals.zen_mode_duration_minutes_summary;
            line1ResId = shortVersion ? R.plurals.zen_mode_duration_minutes_short
            summary = res.getQuantityString(summaryResId, num, num, formattedTime);
            int line1ResId = shortVersion ? R.plurals.zen_mode_duration_minutes_short
                    : R.plurals.zen_mode_duration_minutes;
        } else {
            line1 = res.getQuantityString(line1ResId, num, num, formattedTime);
            line2 = res.getString(R.string.zen_mode_until, formattedTime);
        } else if (minutes < DAY_MINUTES) {
            // display as hours
            num =  Math.round(minutes / 60f);
            summaryResId = shortVersion ? R.plurals.zen_mode_duration_hours_summary_short
            int summaryResId = shortVersion ? R.plurals.zen_mode_duration_hours_summary_short
                    : R.plurals.zen_mode_duration_hours_summary;
            line1ResId = shortVersion ? R.plurals.zen_mode_duration_hours_short
            summary = res.getQuantityString(summaryResId, num, num, formattedTime);
            int line1ResId = shortVersion ? R.plurals.zen_mode_duration_hours_short
                    : R.plurals.zen_mode_duration_hours;
            line1 = res.getQuantityString(line1ResId, num, num, formattedTime);
            line2 = res.getString(R.string.zen_mode_until, formattedTime);
        } else {
            // display as day/time
            summary = line1 = line2 = res.getString(R.string.zen_mode_until, formattedTime);
        }
        final String skeleton = DateFormat.is24HourFormat(context, userHandle) ? "Hm" : "hma";
        final String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), skeleton);
        final CharSequence formattedTime = DateFormat.format(pattern, time);
        final Resources res = context.getResources();
        final String summary = res.getQuantityString(summaryResId, num, num, formattedTime);
        final String line1 = res.getQuantityString(line1ResId, num, num, formattedTime);
        final String line2 = res.getString(R.string.zen_mode_until, formattedTime);
        final Uri id = toCountdownConditionId(time);
        return new Condition(id, summary, line1, line2, 0, Condition.STATE_TRUE,
                Condition.FLAG_RELEVANT_NOW);
    }

    public static Condition toNextAlarmCondition(Context context, long now, long alarm,
            int userHandle) {
        int minutes = Math.round((alarm-now) / (float) MINUTES_MS);
        final CharSequence formattedTime = getFormattedTime(context, alarm, minutes, userHandle);
        final Resources res = context.getResources();
        final String line1 = res.getString(R.string.zen_mode_alarm, formattedTime);
        final Uri id = toCountdownConditionId(alarm);
        return new Condition(id, "", line1, "", 0, Condition.STATE_TRUE,
                Condition.FLAG_RELEVANT_NOW);
    }

    private static CharSequence getFormattedTime(Context context, long time, int minutes,
            int userHandle) {
        String skeleton = DateFormat.is24HourFormat(context, userHandle) ? "Hm" : "hma";
        if (minutes > DAY_MINUTES) {
            skeleton = "EEE " + (DateFormat.is24HourFormat(context, userHandle) ? "Hm" : "hma");
        }
        final String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), skeleton);
        return DateFormat.format(pattern, time);
    }

    // ==== Built-in system conditions ====

    public static final String SYSTEM_AUTHORITY = "android";
@@ -900,11 +918,6 @@ public class ZenModeConfig implements Parcelable {
        return UUID.randomUUID().toString().replace("-", "");
    }

    public static String getConditionLine1(Context context, ZenModeConfig config,
            int userHandle, boolean shortVersion) {
        return getConditionLine(context, config, userHandle, true /*useLine1*/, shortVersion);
    }

    public static String getConditionSummary(Context context, ZenModeConfig config,
            int userHandle, boolean shortVersion) {
        return getConditionLine(context, config, userHandle, false /*useLine1*/, shortVersion);
@@ -923,8 +936,8 @@ public class ZenModeConfig implements Parcelable {
            if (time > 0) {
                final long now = System.currentTimeMillis();
                final long span = time - now;
                c = toTimeCondition(context,
                        time, Math.round(span / (float) MINUTES_MS), now, userHandle, shortVersion);
                c = toTimeCondition(context, time, Math.round(span / (float) MINUTES_MS),
                        userHandle, shortVersion);
            }
            final String rt = c == null ? "" : useLine1 ? c.line1 : c.summary;
            return TextUtils.isEmpty(rt) ? "" : rt;
+3 −0
Original line number Diff line number Diff line
@@ -3993,6 +3993,9 @@
    <!-- Zen mode condition - line two: ending time. [CHAR LIMIT=NONE] -->
    <string name="zen_mode_until">Until <xliff:g id="formattedTime" example="10:00 PM">%1$s</xliff:g></string>

    <!-- Zen mode condition - line one: Until next alarm. [CHAR LIMIT=NONE] -->
    <string name="zen_mode_alarm">Until <xliff:g id="formattedTime" example="10:00 PM">%1$s</xliff:g> (next alarm)</string>

    <!-- Zen mode condition: no exit criteria. [CHAR LIMIT=NONE] -->
    <string name="zen_mode_forever">Until you turn this off</string>

+1 −0
Original line number Diff line number Diff line
@@ -2078,6 +2078,7 @@
  <java-symbol type="string" name="zen_mode_default_events_name" />
  <java-symbol type="array" name="config_system_condition_providers" />
  <java-symbol type="string" name="muted_by" />
  <java-symbol type="string" name="zen_mode_alarm" />

  <java-symbol type="string" name="select_day" />
  <java-symbol type="string" name="select_year" />
+0 −1
Original line number Diff line number Diff line
@@ -27,7 +27,6 @@ public interface ZenModeController {
    void removeCallback(Callback callback);
    void setZen(int zen, Uri conditionId, String reason);
    int getZen();
    void requestConditions(boolean request);
    ZenRule getManualRule();
    ZenModeConfig getConfig();
    long getNextAlarm();
+0 −9
Original line number Diff line number Diff line
@@ -120,15 +120,6 @@ public class ZenModeControllerImpl implements ZenModeController {
        return mSetupObserver.isDeviceProvisioned() && mSetupObserver.isUserSetup();
    }

    @Override
    public void requestConditions(boolean request) {
        mRequesting = request;
        mNoMan.requestZenModeConditions(mListener, request ? Condition.FLAG_RELEVANT_NOW : 0);
        if (!mRequesting) {
            mConditions.clear();
        }
    }

    @Override
    public ZenRule getManualRule() {
        return mConfig == null ? null : mConfig.manualRule;
Loading