1d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng/*
2d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng * Copyright (C) 2018 The Android Open Source Project
3d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng *
4d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng * Licensed under the Apache License, Version 2.0 (the "License");
5d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng * you may not use this file except in compliance with the License.
6d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng * You may obtain a copy of the License at
7d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng *
8d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng *      http://www.apache.org/licenses/LICENSE-2.0
9d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng *
10d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng * Unless required by applicable law or agreed to in writing, software
11d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng * distributed under the License is distributed on an "AS IS" BASIS,
12d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng * See the License for the specific language governing permissions and
14d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng * limitations under the License
15d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng */
16d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng
17d069a888cf32f105bf6843a7083770f5b82af74eAnnie Mengpackage com.android.server.backup;
18d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng
19d069a888cf32f105bf6843a7083770f5b82af74eAnnie Mengimport android.content.ContentResolver;
20d069a888cf32f105bf6843a7083770f5b82af74eAnnie Mengimport android.os.Handler;
21d069a888cf32f105bf6843a7083770f5b82af74eAnnie Mengimport android.provider.Settings;
22d069a888cf32f105bf6843a7083770f5b82af74eAnnie Mengimport android.util.KeyValueListParser;
23d069a888cf32f105bf6843a7083770f5b82af74eAnnie Mengimport android.util.KeyValueSettingObserver;
2492892163d58b580056d38f6ca2c93fb714b9e4b8Annie Mengimport android.util.Slog;
25d069a888cf32f105bf6843a7083770f5b82af74eAnnie Mengimport com.android.internal.annotations.GuardedBy;
26d069a888cf32f105bf6843a7083770f5b82af74eAnnie Mengimport com.android.internal.annotations.VisibleForTesting;
27d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng
28d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng/**
29d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng * Configure backup and restore agent timeouts.
30d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng *
31d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng * <p>These timeout parameters are stored in Settings.Global to be configurable flags with P/H. They
32d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng * are represented as a comma-delimited key value list.
33d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng */
34d069a888cf32f105bf6843a7083770f5b82af74eAnnie Mengpublic class BackupAgentTimeoutParameters extends KeyValueSettingObserver {
3592892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng    private static final String TAG = "BackupAgentTimeout";
3692892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng
37d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    @VisibleForTesting
38d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    public static final String SETTING = Settings.Global.BACKUP_AGENT_TIMEOUT_PARAMETERS;
39d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng
40d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    @VisibleForTesting
41d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    public static final String SETTING_KV_BACKUP_AGENT_TIMEOUT_MILLIS =
42d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng            "kv_backup_agent_timeout_millis";
43d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng
44d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    @VisibleForTesting
45d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    public static final String SETTING_FULL_BACKUP_AGENT_TIMEOUT_MILLIS =
46d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng            "full_backup_agent_timeout_millis";
47d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng
48d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    @VisibleForTesting
49d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    public static final String SETTING_SHARED_BACKUP_AGENT_TIMEOUT_MILLIS =
50d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng            "shared_backup_agent_timeout_millis";
51d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng
52d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    @VisibleForTesting
53d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    public static final String SETTING_RESTORE_AGENT_TIMEOUT_MILLIS =
54d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng            "restore_agent_timeout_millis";
55d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng
56d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    @VisibleForTesting
57d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    public static final String SETTING_RESTORE_AGENT_FINISHED_TIMEOUT_MILLIS =
58d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng            "restore_agent_finished_timeout_millis";
59d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng
60d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    // Default values
61d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    @VisibleForTesting public static final long DEFAULT_KV_BACKUP_AGENT_TIMEOUT_MILLIS = 30 * 1000;
62d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng
63d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    @VisibleForTesting
64d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    public static final long DEFAULT_FULL_BACKUP_AGENT_TIMEOUT_MILLIS = 5 * 60 * 1000;
65d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng
66d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    @VisibleForTesting
67d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    public static final long DEFAULT_SHARED_BACKUP_AGENT_TIMEOUT_MILLIS = 30 * 60 * 1000;
68d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng
69d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    @VisibleForTesting public static final long DEFAULT_RESTORE_AGENT_TIMEOUT_MILLIS = 60 * 1000;
70d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng
71d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    @VisibleForTesting
72d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    public static final long DEFAULT_RESTORE_AGENT_FINISHED_TIMEOUT_MILLIS = 30 * 1000;
73d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng
74d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    @GuardedBy("mLock")
75d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    private long mKvBackupAgentTimeoutMillis;
76d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng
77d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    @GuardedBy("mLock")
78d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    private long mFullBackupAgentTimeoutMillis;
79d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng
80d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    @GuardedBy("mLock")
81d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    private long mSharedBackupAgentTimeoutMillis;
82d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng
83d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    @GuardedBy("mLock")
84d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    private long mRestoreAgentTimeoutMillis;
85d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng
86d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    @GuardedBy("mLock")
87d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    private long mRestoreAgentFinishedTimeoutMillis;
88d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng
89d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    private final Object mLock = new Object();
90d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng
91d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    public BackupAgentTimeoutParameters(Handler handler, ContentResolver resolver) {
92d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng        super(handler, resolver, Settings.Global.getUriFor(SETTING));
93d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    }
94d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng
95d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    public String getSettingValue(ContentResolver resolver) {
96d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng        return Settings.Global.getString(resolver, SETTING);
97d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    }
98d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng
99d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    public void update(KeyValueListParser parser) {
100d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng        synchronized (mLock) {
101d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng            mKvBackupAgentTimeoutMillis =
102d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng                    parser.getLong(
103d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng                            SETTING_KV_BACKUP_AGENT_TIMEOUT_MILLIS,
104d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng                            DEFAULT_KV_BACKUP_AGENT_TIMEOUT_MILLIS);
105d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng            mFullBackupAgentTimeoutMillis =
106d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng                    parser.getLong(
107d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng                            SETTING_FULL_BACKUP_AGENT_TIMEOUT_MILLIS,
108d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng                            DEFAULT_FULL_BACKUP_AGENT_TIMEOUT_MILLIS);
109d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng            mSharedBackupAgentTimeoutMillis =
110d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng                    parser.getLong(
111d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng                            SETTING_SHARED_BACKUP_AGENT_TIMEOUT_MILLIS,
112d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng                            DEFAULT_SHARED_BACKUP_AGENT_TIMEOUT_MILLIS);
113d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng            mRestoreAgentTimeoutMillis =
114d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng                    parser.getLong(
115d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng                            SETTING_RESTORE_AGENT_TIMEOUT_MILLIS,
116d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng                            DEFAULT_RESTORE_AGENT_TIMEOUT_MILLIS);
117d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng            mRestoreAgentFinishedTimeoutMillis =
118d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng                    parser.getLong(
119d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng                            SETTING_RESTORE_AGENT_FINISHED_TIMEOUT_MILLIS,
120d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng                            DEFAULT_RESTORE_AGENT_FINISHED_TIMEOUT_MILLIS);
121d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng        }
122d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    }
123d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng
124d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    public long getKvBackupAgentTimeoutMillis() {
125d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng        synchronized (mLock) {
12692892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng            if (BackupManagerService.DEBUG_SCHEDULING) {
12792892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng                Slog.v(TAG, "getKvBackupAgentTimeoutMillis(): " + mKvBackupAgentTimeoutMillis);
12892892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng            }
129d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng            return mKvBackupAgentTimeoutMillis;
130d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng        }
131d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    }
132d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng
133d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    public long getFullBackupAgentTimeoutMillis() {
134d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng        synchronized (mLock) {
13592892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng            if (BackupManagerService.DEBUG_SCHEDULING) {
13692892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng                Slog.v(TAG, "getFullBackupAgentTimeoutMillis(): " + mFullBackupAgentTimeoutMillis);
13792892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng            }
138d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng            return mFullBackupAgentTimeoutMillis;
139d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng        }
140d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    }
141d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng
142d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    public long getSharedBackupAgentTimeoutMillis() {
143d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng        synchronized (mLock) {
14492892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng            if (BackupManagerService.DEBUG_SCHEDULING) {
14592892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng                Slog.v(
14692892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng                        TAG,
14792892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng                        "getSharedBackupAgentTimeoutMillis(): " + mSharedBackupAgentTimeoutMillis);
14892892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng            }
149d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng            return mSharedBackupAgentTimeoutMillis;
150d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng        }
151d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    }
152d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng
153d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    public long getRestoreAgentTimeoutMillis() {
154d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng        synchronized (mLock) {
15592892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng            if (BackupManagerService.DEBUG_SCHEDULING) {
15692892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng                Slog.v(TAG, "getRestoreAgentTimeoutMillis(): " + mRestoreAgentTimeoutMillis);
15792892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng            }
158d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng            return mRestoreAgentTimeoutMillis;
159d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng        }
160d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    }
161d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng
162d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    public long getRestoreAgentFinishedTimeoutMillis() {
163d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng        synchronized (mLock) {
16492892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng            if (BackupManagerService.DEBUG_SCHEDULING) {
16592892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng                Slog.v(
16692892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng                        TAG,
16792892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng                        "getRestoreAgentFinishedTimeoutMillis(): "
16892892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng                                + mRestoreAgentFinishedTimeoutMillis);
16992892163d58b580056d38f6ca2c93fb714b9e4b8Annie Meng            }
170d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng            return mRestoreAgentFinishedTimeoutMillis;
171d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng        }
172d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng    }
173d069a888cf32f105bf6843a7083770f5b82af74eAnnie Meng}
174