• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
DozeParameters(Context context)42     public DozeParameters(Context context) {
43         mContext = context;
44     }
45 
dump(PrintWriter pw)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 
getDisplayStateSupported()67     public boolean getDisplayStateSupported() {
68         return getBoolean("doze.display.supported", R.bool.doze_display_state_supported);
69     }
70 
getPulseDuration(boolean pickup)71     public int getPulseDuration(boolean pickup) {
72         return getPulseInDuration(pickup) + getPulseVisibleDuration() + getPulseOutDuration();
73     }
74 
getPulseInDuration(boolean pickup)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 
getPulseVisibleDuration()81     public int getPulseVisibleDuration() {
82         return getInt("doze.pulse.duration.visible", R.integer.doze_pulse_duration_visible);
83     }
84 
getPulseOutDuration()85     public int getPulseOutDuration() {
86         return getInt("doze.pulse.duration.out", R.integer.doze_pulse_duration_out);
87     }
88 
getPulseOnSigMotion()89     public boolean getPulseOnSigMotion() {
90         return getBoolean("doze.pulse.sigmotion", R.bool.doze_pulse_on_significant_motion);
91     }
92 
getVibrateOnSigMotion()93     public boolean getVibrateOnSigMotion() {
94         return SystemProperties.getBoolean("doze.vibrate.sigmotion", false);
95     }
96 
getPulseOnPickup()97     public boolean getPulseOnPickup() {
98         return getBoolean("doze.pulse.pickup", R.bool.doze_pulse_on_pick_up);
99     }
100 
getVibrateOnPickup()101     public boolean getVibrateOnPickup() {
102         return SystemProperties.getBoolean("doze.vibrate.pickup", false);
103     }
104 
getProxCheckBeforePulse()105     public boolean getProxCheckBeforePulse() {
106         return getBoolean("doze.pulse.proxcheck", R.bool.doze_proximity_check_before_pulse);
107     }
108 
getPickupPerformsProxCheck()109     public boolean getPickupPerformsProxCheck() {
110         return getBoolean("doze.pickup.proxcheck", R.bool.doze_pickup_performs_proximity_check);
111     }
112 
getPulseOnNotifications()113     public boolean getPulseOnNotifications() {
114         return getBoolean("doze.pulse.notifications", R.bool.doze_pulse_on_notifications);
115     }
116 
getPulseSchedule()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 
getPulseScheduleResets()125     public int getPulseScheduleResets() {
126         return getInt("doze.pulse.schedule.resets", R.integer.doze_pulse_schedule_resets);
127     }
128 
getPickupVibrationThreshold()129     public int getPickupVibrationThreshold() {
130         return getInt("doze.pickup.vibration.threshold", R.integer.doze_pickup_vibration_threshold);
131     }
132 
getBoolean(String propName, int resId)133     private boolean getBoolean(String propName, int resId) {
134         return SystemProperties.getBoolean(propName, mContext.getResources().getBoolean(resId));
135     }
136 
getInt(String propName, int resId)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 
getString(String propName, int resId)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 
parse(String spec)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
toString()173         public String toString() {
174             return Arrays.toString(mSchedule);
175         }
176 
getNextTime(long now, long notificationTime)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