/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.appsimobile.appsii.preference; import android.annotation.SuppressLint; import android.content.SharedPreferences; import android.util.Log; import com.google.android.vending.licensing.Obfuscator; import com.google.android.vending.licensing.ValidationException; /** * An wrapper for SharedPreferences that transparently performs data obfuscation. */ public class ObfuscatedPreferences { private static final String TAG = "ObfuscatedPreferences"; private final SharedPreferences mPreferences; final Obfuscator mObfuscator; /** * Constructor. * * @param sp A SharedPreferences instance provided by the system. * @param o The Obfuscator to use when reading or writing data. */ public ObfuscatedPreferences(SharedPreferences sp, Obfuscator o) { mPreferences = sp; mObfuscator = o; } // It is intentional that we do not commit here, so suppress this warning @SuppressLint("CommitPrefEdits") public Editor edit() { return new Editor(mPreferences.edit()); } public String getString(String key, String defValue) { String result; String value = mPreferences.getString(key, null); if (value != null) { try { result = mObfuscator.unobfuscate(value, key); } catch (ValidationException e) { // Unable to unobfuscate, data corrupt or tampered Log.w(TAG, "Validation error while reading preference: " + key); result = defValue; } } else { // Preference not found result = defValue; } return result; } public class Editor { final SharedPreferences.Editor mEditor; boolean mValid; public Editor(SharedPreferences.Editor editor) { mEditor = editor; mValid = true; } public Editor putString(String key, String value) { if (!mValid) throw new IllegalStateException("Editor has already been committed"); String obfuscatedValue = mObfuscator.obfuscate(value, key); mEditor.putString(key, obfuscatedValue); return this; } public void apply() { mEditor.apply(); mValid = false; } } }