131c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk/*
231c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk * Copyright (C) 2016 The Android Open Source Project
331c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk *
431c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
531c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk * except in compliance with the License. You may obtain a copy of the License at
631c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk *
731c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk *      http://www.apache.org/licenses/LICENSE-2.0
831c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk *
931c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk * Unless required by applicable law or agreed to in writing, software distributed under the
1031c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1131c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk * KIND, either express or implied. See the License for the specific language governing
1231c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk * permissions and limitations under the License.
1331c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk */
1431c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
1531c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monkpackage com.android.settings;
1631c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
1731c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monkimport com.android.internal.logging.MetricsLogger;
1831c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
1931c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monkimport android.annotation.Nullable;
2031c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monkimport android.content.ComponentName;
2131c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monkimport android.content.Context;
2231c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monkimport android.content.SharedPreferences;
2331c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monkimport android.content.pm.PackageManager;
2431c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monkimport android.os.AsyncTask;
2531c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monkimport android.text.TextUtils;
2631c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monkimport android.util.Log;
273e19fc5600f739e7f172fb9331cfc0f4a884d4ceJason Monkimport com.android.internal.logging.MetricsProto.MetricsEvent;
2831c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
2931c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monkimport java.util.Map;
3031c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monkimport java.util.Set;
3131c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
3231c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monkpublic class SharedPreferencesLogger implements SharedPreferences {
3331c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
3431c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    private final String mTag;
3531c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    private final Context mContext;
3631c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
3731c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    public SharedPreferencesLogger(Context context, String tag) {
3831c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        mContext = context;
3931c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        mTag = tag;
4031c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    }
4131c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
4231c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    @Override
4331c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    public Map<String, ?> getAll() {
4431c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        return null;
4531c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    }
4631c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
4731c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    @Override
4831c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    public String getString(String key, @Nullable String defValue) {
4931c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        return defValue;
5031c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    }
5131c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
5231c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    @Override
5331c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    public Set<String> getStringSet(String key, @Nullable Set<String> defValues) {
5431c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        return defValues;
5531c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    }
5631c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
5731c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    @Override
5831c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    public int getInt(String key, int defValue) {
5931c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        return defValue;
6031c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    }
6131c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
6231c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    @Override
6331c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    public long getLong(String key, long defValue) {
6431c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        return defValue;
6531c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    }
6631c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
6731c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    @Override
6831c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    public float getFloat(String key, float defValue) {
6931c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        return defValue;
7031c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    }
7131c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
7231c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    @Override
7331c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    public boolean getBoolean(String key, boolean defValue) {
7431c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        return defValue;
7531c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    }
7631c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
7731c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    @Override
7831c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    public boolean contains(String key) {
7931c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        return false;
8031c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    }
8131c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
8231c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    @Override
8331c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    public Editor edit() {
8431c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        return new EditorLogger();
8531c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    }
8631c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
8731c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    @Override
8831c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    public void registerOnSharedPreferenceChangeListener(
8931c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk            OnSharedPreferenceChangeListener listener) {
9031c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    }
9131c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
9231c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    @Override
9331c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    public void unregisterOnSharedPreferenceChangeListener(
9431c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk            OnSharedPreferenceChangeListener listener) {
9531c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    }
9631c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
9731c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    private void logValue(String key, String value) {
981753dfd5cd5aaeb4c5ed9e2e9e10f13f89bf37d2Chris Wren        MetricsLogger.count(mContext, mTag + "/" + key + "|" + value, 1);
9931c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    }
10031c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
10131c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    private void logPackageName(String key, String value) {
1021753dfd5cd5aaeb4c5ed9e2e9e10f13f89bf37d2Chris Wren        MetricsLogger.count(mContext, mTag + "/" + key, 1);
1033e19fc5600f739e7f172fb9331cfc0f4a884d4ceJason Monk        MetricsLogger.action(mContext, MetricsEvent.ACTION_GENERIC_PACKAGE,
10431c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk                mTag + "/" + key + "|" + value);
10531c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    }
10631c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
10731c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    private void safeLogValue(String key, String value) {
10831c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        new AsyncPackageCheck().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, key, value);
10931c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    }
11031c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
11131c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    private class AsyncPackageCheck extends AsyncTask<String, Void, Void> {
11231c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        @Override
11331c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        protected Void doInBackground(String... params) {
11431c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk            String key = params[0];
11531c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk            String value = params[1];
11631c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk            PackageManager pm = mContext.getPackageManager();
11731c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk            try {
11831c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk                // Check if this might be a component.
11931c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk                ComponentName name = ComponentName.unflattenFromString(value);
12031c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk                if (value != null) {
12131c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk                    value = name.getPackageName();
12231c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk                }
12331c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk            } catch (Exception e) {
12431c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk            }
12531c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk            try {
12631c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk                pm.getPackageInfo(value, PackageManager.MATCH_UNINSTALLED_PACKAGES);
12731c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk                logPackageName(key, value);
12831c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk            } catch (PackageManager.NameNotFoundException e) {
12931c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk                // Clearly not a package, lets log it.
13031c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk                logValue(key, value);
13131c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk            }
13231c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk            return null;
13331c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        }
13431c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    }
13531c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
13631c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    public class EditorLogger implements Editor {
13731c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        @Override
13831c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        public Editor putString(String key, @Nullable String value) {
13931c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk            safeLogValue(key, value);
14031c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk            return this;
14131c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        }
14231c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
14331c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        @Override
14431c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        public Editor putStringSet(String key, @Nullable Set<String> values) {
14531c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk            safeLogValue(key, TextUtils.join(",", values));
14631c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk            return this;
14731c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        }
14831c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
14931c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        @Override
15031c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        public Editor putInt(String key, int value) {
15131c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk            logValue(key, String.valueOf(value));
15231c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk            return this;
15331c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        }
15431c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
15531c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        @Override
15631c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        public Editor putLong(String key, long value) {
15731c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk            logValue(key, String.valueOf(value));
15831c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk            return this;
15931c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        }
16031c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
16131c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        @Override
16231c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        public Editor putFloat(String key, float value) {
16331c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk            logValue(key, String.valueOf(value));
16431c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk            return this;
16531c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        }
16631c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
16731c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        @Override
16831c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        public Editor putBoolean(String key, boolean value) {
16931c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk            logValue(key, String.valueOf(value));
17031c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk            return this;
17131c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        }
17231c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
17331c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        @Override
17431c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        public Editor remove(String key) {
17531c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk            return this;
17631c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        }
17731c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
17831c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        @Override
17931c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        public Editor clear() {
18031c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk            return this;
18131c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        }
18231c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
18331c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        @Override
18431c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        public boolean commit() {
18531c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk            return true;
18631c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        }
18731c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk
18831c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        @Override
18931c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        public void apply() {
19031c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk        }
19131c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk    }
19231c7c32fcc26a421a4d2fef7f006917ef590f426Jason Monk}
193