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