Home | History | Annotate | Download | only in phone
      1 /*
      2  * Copyright (C) 2014 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License
     15  */
     16 
     17 package com.android.systemui.statusbar.phone;
     18 
     19 import android.content.Context;
     20 import android.os.SystemProperties;
     21 import android.text.TextUtils;
     22 import android.util.Log;
     23 import android.util.MathUtils;
     24 
     25 import com.android.systemui.R;
     26 
     27 import java.io.PrintWriter;
     28 import java.util.Arrays;
     29 import java.util.regex.Matcher;
     30 import java.util.regex.Pattern;
     31 
     32 public class DozeParameters {
     33     private static final String TAG = "DozeParameters";
     34     private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
     35 
     36     private static final int MAX_DURATION = 60 * 1000;
     37 
     38     private final Context mContext;
     39 
     40     private static PulseSchedule sPulseSchedule;
     41 
     42     public DozeParameters(Context context) {
     43         mContext = context;
     44     }
     45 
     46     public void dump(PrintWriter pw) {
     47         pw.println("  DozeParameters:");
     48         pw.print("    getDisplayStateSupported(): "); pw.println(getDisplayStateSupported());
     49         pw.print("    getPulseDuration(pickup=false): "); pw.println(getPulseDuration(false));
     50         pw.print("    getPulseDuration(pickup=true): "); pw.println(getPulseDuration(true));
     51         pw.print("    getPulseInDuration(pickup=false): "); pw.println(getPulseInDuration(false));
     52         pw.print("    getPulseInDuration(pickup=true): "); pw.println(getPulseInDuration(true));
     53         pw.print("    getPulseInVisibleDuration(): "); pw.println(getPulseVisibleDuration());
     54         pw.print("    getPulseOutDuration(): "); pw.println(getPulseOutDuration());
     55         pw.print("    getPulseOnSigMotion(): "); pw.println(getPulseOnSigMotion());
     56         pw.print("    getVibrateOnSigMotion(): "); pw.println(getVibrateOnSigMotion());
     57         pw.print("    getPulseOnPickup(): "); pw.println(getPulseOnPickup());
     58         pw.print("    getVibrateOnPickup(): "); pw.println(getVibrateOnPickup());
     59         pw.print("    getProxCheckBeforePulse(): "); pw.println(getProxCheckBeforePulse());
     60         pw.print("    getPulseOnNotifications(): "); pw.println(getPulseOnNotifications());
     61         pw.print("    getPulseSchedule(): "); pw.println(getPulseSchedule());
     62         pw.print("    getPulseScheduleResets(): "); pw.println(getPulseScheduleResets());
     63         pw.print("    getPickupVibrationThreshold(): "); pw.println(getPickupVibrationThreshold());
     64         pw.print("    getPickupPerformsProxCheck(): "); pw.println(getPickupPerformsProxCheck());
     65     }
     66 
     67     public boolean getDisplayStateSupported() {
     68         return getBoolean("doze.display.supported", R.bool.doze_display_state_supported);
     69     }
     70 
     71     public int getPulseDuration(boolean pickup) {
     72         return getPulseInDuration(pickup) + getPulseVisibleDuration() + getPulseOutDuration();
     73     }
     74 
     75     public int getPulseInDuration(boolean pickup) {
     76         return pickup
     77                 ? getInt("doze.pulse.duration.in.pickup", R.integer.doze_pulse_duration_in_pickup)
     78                 : getInt("doze.pulse.duration.in", R.integer.doze_pulse_duration_in);
     79     }
     80 
     81     public int getPulseVisibleDuration() {
     82         return getInt("doze.pulse.duration.visible", R.integer.doze_pulse_duration_visible);
     83     }
     84 
     85     public int getPulseOutDuration() {
     86         return getInt("doze.pulse.duration.out", R.integer.doze_pulse_duration_out);
     87     }
     88 
     89     public boolean getPulseOnSigMotion() {
     90         return getBoolean("doze.pulse.sigmotion", R.bool.doze_pulse_on_significant_motion);
     91     }
     92 
     93     public boolean getVibrateOnSigMotion() {
     94         return SystemProperties.getBoolean("doze.vibrate.sigmotion", false);
     95     }
     96 
     97     public boolean getPulseOnPickup() {
     98         return getBoolean("doze.pulse.pickup", R.bool.doze_pulse_on_pick_up);
     99     }
    100 
    101     public boolean getVibrateOnPickup() {
    102         return SystemProperties.getBoolean("doze.vibrate.pickup", false);
    103     }
    104 
    105     public boolean getProxCheckBeforePulse() {
    106         return getBoolean("doze.pulse.proxcheck", R.bool.doze_proximity_check_before_pulse);
    107     }
    108 
    109     public boolean getPickupPerformsProxCheck() {
    110         return getBoolean("doze.pickup.proxcheck", R.bool.doze_pickup_performs_proximity_check);
    111     }
    112 
    113     public boolean getPulseOnNotifications() {
    114         return getBoolean("doze.pulse.notifications", R.bool.doze_pulse_on_notifications);
    115     }
    116 
    117     public PulseSchedule getPulseSchedule() {
    118         final String spec = getString("doze.pulse.schedule", R.string.doze_pulse_schedule);
    119         if (sPulseSchedule == null || !sPulseSchedule.mSpec.equals(spec)) {
    120             sPulseSchedule = PulseSchedule.parse(spec);
    121         }
    122         return sPulseSchedule;
    123     }
    124 
    125     public int getPulseScheduleResets() {
    126         return getInt("doze.pulse.schedule.resets", R.integer.doze_pulse_schedule_resets);
    127     }
    128 
    129     public int getPickupVibrationThreshold() {
    130         return getInt("doze.pickup.vibration.threshold", R.integer.doze_pickup_vibration_threshold);
    131     }
    132 
    133     private boolean getBoolean(String propName, int resId) {
    134         return SystemProperties.getBoolean(propName, mContext.getResources().getBoolean(resId));
    135     }
    136 
    137     private int getInt(String propName, int resId) {
    138         int value = SystemProperties.getInt(propName, mContext.getResources().getInteger(resId));
    139         return MathUtils.constrain(value, 0, MAX_DURATION);
    140     }
    141 
    142     private String getString(String propName, int resId) {
    143         return SystemProperties.get(propName, mContext.getString(resId));
    144     }
    145 
    146     public static class PulseSchedule {
    147         private static final Pattern PATTERN = Pattern.compile("(\\d+?)s", 0);
    148 
    149         private String mSpec;
    150         private int[] mSchedule;
    151 
    152         public static PulseSchedule parse(String spec) {
    153             if (TextUtils.isEmpty(spec)) return null;
    154             try {
    155                 final PulseSchedule rt = new PulseSchedule();
    156                 rt.mSpec = spec;
    157                 final String[] tokens = spec.split(",");
    158                 rt.mSchedule = new int[tokens.length];
    159                 for (int i = 0; i < tokens.length; i++) {
    160                     final Matcher m = PATTERN.matcher(tokens[i]);
    161                     if (!m.matches()) throw new IllegalArgumentException("Bad token: " + tokens[i]);
    162                     rt.mSchedule[i] = Integer.parseInt(m.group(1));
    163                 }
    164                 if (DEBUG) Log.d(TAG, "Parsed spec [" + spec + "] as: " + rt);
    165                 return rt;
    166             } catch (RuntimeException e) {
    167                 Log.w(TAG, "Error parsing spec: " + spec, e);
    168                 return null;
    169             }
    170         }
    171 
    172         @Override
    173         public String toString() {
    174             return Arrays.toString(mSchedule);
    175         }
    176 
    177         public long getNextTime(long now, long notificationTime) {
    178             for (int i = 0; i < mSchedule.length; i++) {
    179                 final long time = notificationTime + mSchedule[i] * 1000;
    180                 if (time > now) return time;
    181             }
    182             return 0;
    183         }
    184     }
    185 }
    186