142113ea809342a8cc7d2ed7d53583e6d5daac791Erik// Copyright 2011 Google Inc. All Rights Reserved.
242113ea809342a8cc7d2ed7d53583e6d5daac791Erik
342113ea809342a8cc7d2ed7d53583e6d5daac791Erikpackage com.android.vending.sectool.v1;
442113ea809342a8cc7d2ed7d53583e6d5daac791Erik
542113ea809342a8cc7d2ed7d53583e6d5daac791Erikimport com.android.vending.sectool.v1.GoogleSettingsContract;
642113ea809342a8cc7d2ed7d53583e6d5daac791Erikimport com.android.vending.sectool.v1.Gservices;
742113ea809342a8cc7d2ed7d53583e6d5daac791Erik
842113ea809342a8cc7d2ed7d53583e6d5daac791Erikimport android.app.Application;
942113ea809342a8cc7d2ed7d53583e6d5daac791Erikimport android.content.ContentResolver;
1042113ea809342a8cc7d2ed7d53583e6d5daac791Erikimport android.content.Context;
1142113ea809342a8cc7d2ed7d53583e6d5daac791Erik
1242113ea809342a8cc7d2ed7d53583e6d5daac791Erik/**
1342113ea809342a8cc7d2ed7d53583e6d5daac791Erik * A convenient way to read Gservices values, inspired by Flag.
1442113ea809342a8cc7d2ed7d53583e6d5daac791Erik *
1542113ea809342a8cc7d2ed7d53583e6d5daac791Erik * You must call {@link #init(Context)} before any calls to {@link #get()}.
1642113ea809342a8cc7d2ed7d53583e6d5daac791Erik * The recommended place to call this is in {@link Application#onCreate()}.
1742113ea809342a8cc7d2ed7d53583e6d5daac791Erik */
1842113ea809342a8cc7d2ed7d53583e6d5daac791Erikpublic abstract class GservicesValue<T> {
1942113ea809342a8cc7d2ed7d53583e6d5daac791Erik    private static GservicesReader sGservicesReader = null;
2042113ea809342a8cc7d2ed7d53583e6d5daac791Erik
2142113ea809342a8cc7d2ed7d53583e6d5daac791Erik    public static void init(Context context) {
2242113ea809342a8cc7d2ed7d53583e6d5daac791Erik        sGservicesReader = new GservicesReaderImpl(context.getContentResolver());
2342113ea809342a8cc7d2ed7d53583e6d5daac791Erik    }
2442113ea809342a8cc7d2ed7d53583e6d5daac791Erik
2542113ea809342a8cc7d2ed7d53583e6d5daac791Erik    public static void initForTests() {
2642113ea809342a8cc7d2ed7d53583e6d5daac791Erik        sGservicesReader = new GservicesReaderForTests();
2742113ea809342a8cc7d2ed7d53583e6d5daac791Erik    }
2842113ea809342a8cc7d2ed7d53583e6d5daac791Erik
2942113ea809342a8cc7d2ed7d53583e6d5daac791Erik    protected final String mKey;
3042113ea809342a8cc7d2ed7d53583e6d5daac791Erik    protected final T mDefaultValue;
3142113ea809342a8cc7d2ed7d53583e6d5daac791Erik    private T mOverride = null;
3242113ea809342a8cc7d2ed7d53583e6d5daac791Erik
3342113ea809342a8cc7d2ed7d53583e6d5daac791Erik    protected GservicesValue(String key, T defaultValue) {
3442113ea809342a8cc7d2ed7d53583e6d5daac791Erik        mKey = key;
3542113ea809342a8cc7d2ed7d53583e6d5daac791Erik        mDefaultValue = defaultValue;
3642113ea809342a8cc7d2ed7d53583e6d5daac791Erik    }
3742113ea809342a8cc7d2ed7d53583e6d5daac791Erik
3842113ea809342a8cc7d2ed7d53583e6d5daac791Erik    /** For tests. */
3942113ea809342a8cc7d2ed7d53583e6d5daac791Erik    public void override(T value) {
4042113ea809342a8cc7d2ed7d53583e6d5daac791Erik        mOverride = value;
4142113ea809342a8cc7d2ed7d53583e6d5daac791Erik    }
4242113ea809342a8cc7d2ed7d53583e6d5daac791Erik
4342113ea809342a8cc7d2ed7d53583e6d5daac791Erik    protected abstract T retrieve(String key);
4442113ea809342a8cc7d2ed7d53583e6d5daac791Erik
4542113ea809342a8cc7d2ed7d53583e6d5daac791Erik    public final T get() {
4642113ea809342a8cc7d2ed7d53583e6d5daac791Erik        if (mOverride != null) {
4742113ea809342a8cc7d2ed7d53583e6d5daac791Erik            return mOverride;
4842113ea809342a8cc7d2ed7d53583e6d5daac791Erik        }
4942113ea809342a8cc7d2ed7d53583e6d5daac791Erik        return retrieve(mKey);
5042113ea809342a8cc7d2ed7d53583e6d5daac791Erik    }
5142113ea809342a8cc7d2ed7d53583e6d5daac791Erik
5242113ea809342a8cc7d2ed7d53583e6d5daac791Erik    public static GservicesValue<Boolean> value(String key, boolean defaultValue) {
5342113ea809342a8cc7d2ed7d53583e6d5daac791Erik        return new GservicesValue<Boolean>(key, defaultValue) {
5442113ea809342a8cc7d2ed7d53583e6d5daac791Erik            @Override
5542113ea809342a8cc7d2ed7d53583e6d5daac791Erik            protected Boolean retrieve(String key) {
5642113ea809342a8cc7d2ed7d53583e6d5daac791Erik                return sGservicesReader.getBoolean(mKey, mDefaultValue);
5742113ea809342a8cc7d2ed7d53583e6d5daac791Erik            }
5842113ea809342a8cc7d2ed7d53583e6d5daac791Erik        };
5942113ea809342a8cc7d2ed7d53583e6d5daac791Erik    }
6042113ea809342a8cc7d2ed7d53583e6d5daac791Erik
6142113ea809342a8cc7d2ed7d53583e6d5daac791Erik    public static GservicesValue<Long> value(String key, Long defaultValue) {
6242113ea809342a8cc7d2ed7d53583e6d5daac791Erik        return new GservicesValue<Long>(key, defaultValue) {
6342113ea809342a8cc7d2ed7d53583e6d5daac791Erik            @Override
6442113ea809342a8cc7d2ed7d53583e6d5daac791Erik            protected Long retrieve(String key) {
6542113ea809342a8cc7d2ed7d53583e6d5daac791Erik                return sGservicesReader.getLong(mKey, mDefaultValue);
6642113ea809342a8cc7d2ed7d53583e6d5daac791Erik            }
6742113ea809342a8cc7d2ed7d53583e6d5daac791Erik        };
6842113ea809342a8cc7d2ed7d53583e6d5daac791Erik    }
6942113ea809342a8cc7d2ed7d53583e6d5daac791Erik
7042113ea809342a8cc7d2ed7d53583e6d5daac791Erik    public static GservicesValue<Integer> value(String key, Integer defaultValue) {
7142113ea809342a8cc7d2ed7d53583e6d5daac791Erik        return new GservicesValue<Integer>(key, defaultValue) {
7242113ea809342a8cc7d2ed7d53583e6d5daac791Erik            @Override
7342113ea809342a8cc7d2ed7d53583e6d5daac791Erik            protected Integer retrieve(String key) {
7442113ea809342a8cc7d2ed7d53583e6d5daac791Erik                return sGservicesReader.getInt(mKey, mDefaultValue);
7542113ea809342a8cc7d2ed7d53583e6d5daac791Erik            }
7642113ea809342a8cc7d2ed7d53583e6d5daac791Erik        };
7742113ea809342a8cc7d2ed7d53583e6d5daac791Erik    }
7842113ea809342a8cc7d2ed7d53583e6d5daac791Erik
7942113ea809342a8cc7d2ed7d53583e6d5daac791Erik    public static GservicesValue<String> value(String key, String defaultValue) {
8042113ea809342a8cc7d2ed7d53583e6d5daac791Erik        return new GservicesValue<String>(key, defaultValue) {
8142113ea809342a8cc7d2ed7d53583e6d5daac791Erik            @Override
8242113ea809342a8cc7d2ed7d53583e6d5daac791Erik            protected String retrieve(String key) {
8342113ea809342a8cc7d2ed7d53583e6d5daac791Erik                return sGservicesReader.getString(mKey, mDefaultValue);
8442113ea809342a8cc7d2ed7d53583e6d5daac791Erik            }
8542113ea809342a8cc7d2ed7d53583e6d5daac791Erik        };
8642113ea809342a8cc7d2ed7d53583e6d5daac791Erik    }
8742113ea809342a8cc7d2ed7d53583e6d5daac791Erik
8842113ea809342a8cc7d2ed7d53583e6d5daac791Erik    public static GservicesValue<String> partnerSetting(String key, String defaultValue) {
8942113ea809342a8cc7d2ed7d53583e6d5daac791Erik        return new GservicesValue<String>(key, defaultValue) {
9042113ea809342a8cc7d2ed7d53583e6d5daac791Erik            @Override
9142113ea809342a8cc7d2ed7d53583e6d5daac791Erik            protected String retrieve(String key) {
9242113ea809342a8cc7d2ed7d53583e6d5daac791Erik                return sGservicesReader.getPartnerString(mKey, mDefaultValue);
9342113ea809342a8cc7d2ed7d53583e6d5daac791Erik            }
9442113ea809342a8cc7d2ed7d53583e6d5daac791Erik        };
9542113ea809342a8cc7d2ed7d53583e6d5daac791Erik    }
9642113ea809342a8cc7d2ed7d53583e6d5daac791Erik
9742113ea809342a8cc7d2ed7d53583e6d5daac791Erik
9842113ea809342a8cc7d2ed7d53583e6d5daac791Erik    private interface GservicesReader {
9942113ea809342a8cc7d2ed7d53583e6d5daac791Erik        public Boolean getBoolean(String key, Boolean defaultValue);
10042113ea809342a8cc7d2ed7d53583e6d5daac791Erik        public Long getLong(String key, Long defaultValue);
10142113ea809342a8cc7d2ed7d53583e6d5daac791Erik        public Integer getInt(String key, Integer defaultValue);
10242113ea809342a8cc7d2ed7d53583e6d5daac791Erik        public String getString(String key, String defaultValue);
10342113ea809342a8cc7d2ed7d53583e6d5daac791Erik        public String getPartnerString(String key, String defaultValue);
10442113ea809342a8cc7d2ed7d53583e6d5daac791Erik    }
10542113ea809342a8cc7d2ed7d53583e6d5daac791Erik
10642113ea809342a8cc7d2ed7d53583e6d5daac791Erik    /** The real Gservices reader. */
10742113ea809342a8cc7d2ed7d53583e6d5daac791Erik    private static class GservicesReaderImpl implements GservicesReader {
10842113ea809342a8cc7d2ed7d53583e6d5daac791Erik        private final ContentResolver mContentResolver;
10942113ea809342a8cc7d2ed7d53583e6d5daac791Erik        public GservicesReaderImpl(ContentResolver contentResolver) {
11042113ea809342a8cc7d2ed7d53583e6d5daac791Erik            mContentResolver = contentResolver;
11142113ea809342a8cc7d2ed7d53583e6d5daac791Erik        }
11242113ea809342a8cc7d2ed7d53583e6d5daac791Erik
11342113ea809342a8cc7d2ed7d53583e6d5daac791Erik        public Boolean getBoolean(String key, Boolean defaultValue) {
11442113ea809342a8cc7d2ed7d53583e6d5daac791Erik            return Gservices.getBoolean(mContentResolver, key, defaultValue);
11542113ea809342a8cc7d2ed7d53583e6d5daac791Erik        }
11642113ea809342a8cc7d2ed7d53583e6d5daac791Erik
11742113ea809342a8cc7d2ed7d53583e6d5daac791Erik        public Integer getInt(String key, Integer defaultValue) {
11842113ea809342a8cc7d2ed7d53583e6d5daac791Erik            return Gservices.getInt(mContentResolver, key, defaultValue);
11942113ea809342a8cc7d2ed7d53583e6d5daac791Erik        }
12042113ea809342a8cc7d2ed7d53583e6d5daac791Erik
12142113ea809342a8cc7d2ed7d53583e6d5daac791Erik        public Long getLong(String key, Long defaultValue) {
12242113ea809342a8cc7d2ed7d53583e6d5daac791Erik            return Gservices.getLong(mContentResolver, key, defaultValue);
12342113ea809342a8cc7d2ed7d53583e6d5daac791Erik        }
12442113ea809342a8cc7d2ed7d53583e6d5daac791Erik
12542113ea809342a8cc7d2ed7d53583e6d5daac791Erik        public String getString(String key, String defaultValue) {
12642113ea809342a8cc7d2ed7d53583e6d5daac791Erik            return Gservices.getString(mContentResolver, key, defaultValue);
12742113ea809342a8cc7d2ed7d53583e6d5daac791Erik        }
12842113ea809342a8cc7d2ed7d53583e6d5daac791Erik
12942113ea809342a8cc7d2ed7d53583e6d5daac791Erik        public String getPartnerString(String key, String defaultValue) {
13042113ea809342a8cc7d2ed7d53583e6d5daac791Erik            return GoogleSettingsContract.Partner.getString(mContentResolver, key, defaultValue);
13142113ea809342a8cc7d2ed7d53583e6d5daac791Erik        }
13242113ea809342a8cc7d2ed7d53583e6d5daac791Erik    }
13342113ea809342a8cc7d2ed7d53583e6d5daac791Erik
13442113ea809342a8cc7d2ed7d53583e6d5daac791Erik    /** Implementation of GservicesReader for testing. */
13542113ea809342a8cc7d2ed7d53583e6d5daac791Erik    private static class GservicesReaderForTests implements GservicesReader {
13642113ea809342a8cc7d2ed7d53583e6d5daac791Erik        public Boolean getBoolean(String key, Boolean defaultValue) { return defaultValue; }
13742113ea809342a8cc7d2ed7d53583e6d5daac791Erik        public Integer getInt(String key, Integer defaultValue) { return defaultValue; }
13842113ea809342a8cc7d2ed7d53583e6d5daac791Erik        public Long getLong(String key, Long defaultValue) { return defaultValue; }
13942113ea809342a8cc7d2ed7d53583e6d5daac791Erik        public String getString(String key, String defaultValue) { return defaultValue; }
14042113ea809342a8cc7d2ed7d53583e6d5daac791Erik        public String getPartnerString(String key, String defaultValue) { return defaultValue; }
14142113ea809342a8cc7d2ed7d53583e6d5daac791Erik    }
14242113ea809342a8cc7d2ed7d53583e6d5daac791Erik}
143