1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)package org.chromium.base.test.util;
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdochimport android.content.ComponentCallbacks;
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import android.content.ContentResolver;
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import android.content.Context;
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import android.content.ContextWrapper;
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import android.content.SharedPreferences;
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import android.test.mock.MockContentResolver;
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import android.test.mock.MockContext;
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import java.util.HashMap;
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import java.util.Map;
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * ContextWrapper that adds functionality for SharedPreferences and a way to set and retrieve flags.
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public class AdvancedMockContext extends ContextWrapper {
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private final MockContentResolver mMockContentResolver = new MockContentResolver();
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private final Map<String, SharedPreferences> mSharedPreferences =
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            new HashMap<String, SharedPreferences>();
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    private final Map<String, Boolean> mFlags = new HashMap<String, Boolean>();
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public AdvancedMockContext(Context base) {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        super(base);
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public AdvancedMockContext() {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        super(new MockContext());
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Override
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public String getPackageName() {
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return getBaseContext().getPackageName();
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Override
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public Context getApplicationContext() {
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return this;
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Override
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public ContentResolver getContentResolver() {
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return mMockContentResolver;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public MockContentResolver getMockContentResolver() {
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return mMockContentResolver;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    @Override
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public SharedPreferences getSharedPreferences(String name, int mode) {
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        synchronized (mSharedPreferences) {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            if (!mSharedPreferences.containsKey(name)) {
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                // Auto-create shared preferences to mimic Android Context behavior
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                mSharedPreferences.put(name, new InMemorySharedPreferences());
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return mSharedPreferences.get(name);
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    @Override
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    public void registerComponentCallbacks(ComponentCallbacks callback) {
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        getBaseContext().registerComponentCallbacks(callback);
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    @Override
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    public void unregisterComponentCallbacks(ComponentCallbacks callback) {
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        getBaseContext().unregisterComponentCallbacks(callback);
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void addSharedPreferences(String name, Map<String, Object> data) {
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        synchronized (mSharedPreferences) {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            mSharedPreferences.put(name, new InMemorySharedPreferences(data));
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void setFlag(String key) {
85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        mFlags.put(key, true);
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public void clearFlag(String key) {
89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        mFlags.remove(key);
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public boolean isFlagSet(String key) {
93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        return mFlags.containsKey(key) && mFlags.get(key);
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    /**
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     * Builder for maps of type Map<String, Object> to be used with
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     * {@link #addSharedPreferences(String, java.util.Map)}.
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch     */
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public static class MapBuilder {
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        private final Map<String, Object> mData = new HashMap<String, Object>();
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        public static MapBuilder create() {
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return new MapBuilder();
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        public MapBuilder add(String key, Object value) {
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            mData.put(key, value);
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return this;
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        public Map<String, Object> build() {
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return mData;
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
119