1 /*
2  * Copyright (C) 2017 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 package com.android.server.devicepolicy;
17 
18 import android.util.KeyValueListParser;
19 import android.util.Slog;
20 
21 import java.io.PrintWriter;
22 import java.util.concurrent.TimeUnit;
23 
24 /**
25  * Constants that are configurable via the global settings for {@link DevicePolicyManagerService}.
26  *
27  * Example of setting the values for testing.
28  * adb shell settings put global device_policy_constants das_died_service_reconnect_backoff_sec=10,das_died_service_reconnect_backoff_increase=1.5,das_died_service_reconnect_max_backoff_sec=30
29  */
30 public class DevicePolicyConstants {
31     private static final String TAG = DevicePolicyManagerService.LOG_TAG;
32 
33     private static final String DAS_DIED_SERVICE_RECONNECT_BACKOFF_SEC_KEY
34             = "das_died_service_reconnect_backoff_sec";
35 
36     private static final String DAS_DIED_SERVICE_RECONNECT_BACKOFF_INCREASE_KEY
37             = "das_died_service_reconnect_backoff_increase";
38 
39     private static final String DAS_DIED_SERVICE_RECONNECT_MAX_BACKOFF_SEC_KEY
40             = "das_died_service_reconnect_max_backoff_sec";
41 
42     /**
43      * The back-off before re-connecting, when a service binding died, due to the owner
44      * crashing repeatedly.
45      */
46     public final long DAS_DIED_SERVICE_RECONNECT_BACKOFF_SEC;
47 
48     /**
49      * The exponential back-off increase factor when a binding dies multiple times.
50      */
51     public final double DAS_DIED_SERVICE_RECONNECT_BACKOFF_INCREASE;
52 
53     /**
54      * The max back-off
55      */
56     public final long DAS_DIED_SERVICE_RECONNECT_MAX_BACKOFF_SEC;
57 
DevicePolicyConstants(String settings)58     private DevicePolicyConstants(String settings) {
59 
60         final KeyValueListParser parser = new KeyValueListParser(',');
61         try {
62             parser.setString(settings);
63         } catch (IllegalArgumentException e) {
64             // Failed to parse the settings string, log this and move on
65             // with defaults.
66             Slog.e(TAG, "Bad device policy settings: " + settings);
67         }
68 
69         long dasDiedServiceReconnectBackoffSec = parser.getLong(
70                 DAS_DIED_SERVICE_RECONNECT_BACKOFF_SEC_KEY, TimeUnit.HOURS.toSeconds(1));
71 
72         double dasDiedServiceReconnectBackoffIncrease = parser.getFloat(
73                 DAS_DIED_SERVICE_RECONNECT_BACKOFF_INCREASE_KEY, 2f);
74 
75         long dasDiedServiceReconnectMaxBackoffSec = parser.getLong(
76                 DAS_DIED_SERVICE_RECONNECT_MAX_BACKOFF_SEC_KEY, TimeUnit.DAYS.toSeconds(1));
77 
78         // Set minimum: 5 seconds.
79         dasDiedServiceReconnectBackoffSec = Math.max(5, dasDiedServiceReconnectBackoffSec);
80 
81         // Set minimum: 1.0.
82         dasDiedServiceReconnectBackoffIncrease =
83                 Math.max(1, dasDiedServiceReconnectBackoffIncrease);
84 
85         // Make sure max >= default back off.
86         dasDiedServiceReconnectMaxBackoffSec = Math.max(dasDiedServiceReconnectBackoffSec,
87                 dasDiedServiceReconnectMaxBackoffSec);
88 
89         DAS_DIED_SERVICE_RECONNECT_BACKOFF_SEC = dasDiedServiceReconnectBackoffSec;
90         DAS_DIED_SERVICE_RECONNECT_BACKOFF_INCREASE = dasDiedServiceReconnectBackoffIncrease;
91         DAS_DIED_SERVICE_RECONNECT_MAX_BACKOFF_SEC = dasDiedServiceReconnectMaxBackoffSec;
92 
93     }
94 
loadFromString(String settings)95     public static DevicePolicyConstants loadFromString(String settings) {
96         return new DevicePolicyConstants(settings);
97     }
98 
dump(String prefix, PrintWriter pw)99     public void dump(String prefix, PrintWriter pw) {
100         pw.print(prefix);
101         pw.println("Constants:");
102 
103         pw.print(prefix);
104         pw.print("  DAS_DIED_SERVICE_RECONNECT_BACKOFF_SEC: ");
105         pw.println( DAS_DIED_SERVICE_RECONNECT_BACKOFF_SEC);
106 
107         pw.print(prefix);
108         pw.print("  DAS_DIED_SERVICE_RECONNECT_BACKOFF_INCREASE: ");
109         pw.println( DAS_DIED_SERVICE_RECONNECT_BACKOFF_INCREASE);
110 
111         pw.print(prefix);
112         pw.print("  DAS_DIED_SERVICE_RECONNECT_MAX_BACKOFF_SEC: ");
113         pw.println( DAS_DIED_SERVICE_RECONNECT_MAX_BACKOFF_SEC);
114     }
115 }
116