1/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.example.android.support.text.emoji;
18
19import android.content.Context;
20import android.content.SharedPreferences;
21import android.support.annotation.NonNull;
22import android.support.annotation.Nullable;
23import android.support.text.emoji.EmojiCompat;
24import android.support.text.emoji.FontRequestEmojiCompatConfig;
25import android.support.text.emoji.bundled.BundledEmojiCompatConfig;
26import android.support.v4.provider.FontRequest;
27import android.util.Log;
28
29import java.util.HashSet;
30import java.util.Set;
31
32class Config {
33    private static final String TAG = "EmojiDemo";
34
35    public static final String PREF_NAME = "emojicompat";
36    public static final String KEY_ENABLED = "enabled";
37    public static final String KEY_REPLACE_ALL = "replaceAll";
38    public static final String KEY_DOWNLOADABLE = "downloadable";
39    public static final String KEY_INDICATOR = "indicator";
40    private static Config sInstance;
41
42    private SharedPreferences mSharedPref;
43    private Context mContext;
44    private boolean mCompatEnabled;
45    private boolean mReplaceAll;
46    private boolean mDownloadable;
47    private boolean mIndicator;
48
49    private Set<Listener> mListeners = new HashSet<>();
50
51    private Config() {
52    }
53
54    void init(Context context) {
55        this.mContext = context;
56        mSharedPref = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
57        mCompatEnabled = mSharedPref.getBoolean(KEY_ENABLED, false);
58        mReplaceAll = mSharedPref.getBoolean(KEY_REPLACE_ALL, false);
59        mDownloadable = mSharedPref.getBoolean(KEY_DOWNLOADABLE, false);
60        mIndicator = mSharedPref.getBoolean(KEY_INDICATOR, false);
61        resetEmojiCompat();
62    }
63
64    static synchronized Config get() {
65        if (sInstance == null) {
66            sInstance = new Config();
67        }
68        return sInstance;
69    }
70
71    void registerListener(Listener listener) {
72        mListeners.add(listener);
73    }
74
75    void unregisterListener(Listener listener) {
76        mListeners.remove(listener);
77    }
78
79    void update(boolean compatEnabled, boolean replaceAll, boolean downloadable,
80            boolean indicator) {
81        mCompatEnabled = compatEnabled;
82        mReplaceAll = replaceAll;
83        mDownloadable = downloadable;
84        mIndicator = indicator;
85        mSharedPref.edit().putBoolean(KEY_ENABLED, mCompatEnabled).apply();
86        mSharedPref.edit().putBoolean(KEY_REPLACE_ALL, mReplaceAll).apply();
87        mSharedPref.edit().putBoolean(KEY_DOWNLOADABLE, mDownloadable).apply();
88        mSharedPref.edit().putBoolean(KEY_INDICATOR, mIndicator).apply();
89        resetEmojiCompat();
90        for (Listener listener : mListeners) {
91            listener.onEmojiCompatUpdated();
92        }
93    }
94
95    private void resetEmojiCompat() {
96        final EmojiCompat.Config config;
97        if (mCompatEnabled) {
98            if (mDownloadable) {
99                final FontRequest fontRequest = new FontRequest(
100                        mContext.getString(R.string.provider_authority),
101                        mContext.getString(R.string.provider_package),
102                        mContext.getString(R.string.font_query),
103                        R.array.com_google_android_gms_fonts_certs);
104
105                config = new FontRequestEmojiCompatConfig(mContext, fontRequest);
106            } else {
107                config = new BundledEmojiCompatConfig(mContext);
108            }
109        } else {
110            config = new EmojiCompat.Config(new EmojiCompat.MetadataLoader() {
111                @Override
112                public void load(@NonNull EmojiCompat.LoaderCallback loaderCallback) {
113                    loaderCallback.onFailed(new RuntimeException("Disable"));
114                }
115            }) {
116            };
117        }
118
119        config.setReplaceAll(mReplaceAll)
120                .setEmojiSpanIndicatorEnabled(mIndicator)
121                .registerInitCallback(new EmojiCompat.InitCallback() {
122                    @Override
123                    public void onInitialized() {
124                        Log.i(TAG, "EmojiCompat initialized");
125                    }
126
127                    @Override
128                    public void onFailed(@Nullable Throwable throwable) {
129                        Log.e(TAG, "EmojiCompat initialization failed", throwable);
130                    }
131                });
132
133        EmojiCompat.reset(config);
134    }
135
136    boolean isCompatEnabled() {
137        return mCompatEnabled;
138    }
139
140    boolean isReplaceAll() {
141        return mCompatEnabled && mReplaceAll;
142    }
143
144    boolean isDownloadable() {
145        return mCompatEnabled && mDownloadable;
146    }
147
148    boolean isIndicator() {
149        return mCompatEnabled && mIndicator;
150    }
151
152    interface Listener {
153        void onEmojiCompatUpdated();
154    }
155}
156