188257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir/*
288257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir * Copyright (C) 2017 The Android Open Source Project
388257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir *
488257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir * Licensed under the Apache License, Version 2.0 (the "License");
588257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir * you may not use this file except in compliance with the License.
688257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir * You may obtain a copy of the License at
788257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir *
888257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir *      http://www.apache.org/licenses/LICENSE-2.0
988257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir *
1088257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir * Unless required by applicable law or agreed to in writing, software
1188257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir * distributed under the License is distributed on an "AS IS" BASIS,
1288257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1388257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir * See the License for the specific language governing permissions and
1488257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir * limitations under the License.
1588257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir */
1688257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir
1788257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinirpackage com.example.android.support.text.emoji;
1888257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir
1988257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinirimport android.content.Context;
2088257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinirimport android.content.SharedPreferences;
2188257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinirimport android.support.annotation.NonNull;
2288257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinirimport android.support.annotation.Nullable;
2388257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinirimport android.support.text.emoji.EmojiCompat;
2488257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinirimport android.support.text.emoji.FontRequestEmojiCompatConfig;
2588257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinirimport android.support.text.emoji.bundled.BundledEmojiCompatConfig;
2688257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinirimport android.support.v4.provider.FontRequest;
2788257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinirimport android.util.Log;
2888257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir
2988257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinirimport java.util.HashSet;
3088257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinirimport java.util.Set;
3188257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir
3288257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinirclass Config {
3388257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    private static final String TAG = "EmojiDemo";
3488257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir
3588257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    public static final String PREF_NAME = "emojicompat";
3688257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    public static final String KEY_ENABLED = "enabled";
3788257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    public static final String KEY_REPLACE_ALL = "replaceAll";
3888257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    public static final String KEY_DOWNLOADABLE = "downloadable";
3988257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    public static final String KEY_INDICATOR = "indicator";
4088257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    private static Config sInstance;
4188257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir
4288257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    private SharedPreferences mSharedPref;
4388257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    private Context mContext;
4488257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    private boolean mCompatEnabled;
4588257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    private boolean mReplaceAll;
4688257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    private boolean mDownloadable;
4788257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    private boolean mIndicator;
4888257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir
4988257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    private Set<Listener> mListeners = new HashSet<>();
5088257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir
5188257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    private Config() {
5288257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    }
5388257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir
5488257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    void init(Context context) {
5588257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        this.mContext = context;
5688257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        mSharedPref = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
5788257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        mCompatEnabled = mSharedPref.getBoolean(KEY_ENABLED, false);
5888257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        mReplaceAll = mSharedPref.getBoolean(KEY_REPLACE_ALL, false);
5988257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        mDownloadable = mSharedPref.getBoolean(KEY_DOWNLOADABLE, false);
6088257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        mIndicator = mSharedPref.getBoolean(KEY_INDICATOR, false);
6188257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        resetEmojiCompat();
6288257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    }
6388257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir
6488257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    static synchronized Config get() {
6588257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        if (sInstance == null) {
6688257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir            sInstance = new Config();
6788257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        }
6888257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        return sInstance;
6988257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    }
7088257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir
7188257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    void registerListener(Listener listener) {
7288257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        mListeners.add(listener);
7388257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    }
7488257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir
7588257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    void unregisterListener(Listener listener) {
7688257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        mListeners.remove(listener);
7788257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    }
7888257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir
7988257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    void update(boolean compatEnabled, boolean replaceAll, boolean downloadable,
8088257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir            boolean indicator) {
8188257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        mCompatEnabled = compatEnabled;
8288257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        mReplaceAll = replaceAll;
8388257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        mDownloadable = downloadable;
8488257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        mIndicator = indicator;
8588257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        mSharedPref.edit().putBoolean(KEY_ENABLED, mCompatEnabled).apply();
8688257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        mSharedPref.edit().putBoolean(KEY_REPLACE_ALL, mReplaceAll).apply();
87e6c2d24436997536aec22cdf623fc81c8007d9b0Siyamed Sinir        mSharedPref.edit().putBoolean(KEY_DOWNLOADABLE, mDownloadable).apply();
88e6c2d24436997536aec22cdf623fc81c8007d9b0Siyamed Sinir        mSharedPref.edit().putBoolean(KEY_INDICATOR, mIndicator).apply();
8988257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        resetEmojiCompat();
9088257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        for (Listener listener : mListeners) {
9188257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir            listener.onEmojiCompatUpdated();
9288257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        }
9388257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    }
9488257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir
9588257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    private void resetEmojiCompat() {
9688257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        final EmojiCompat.Config config;
9788257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        if (mCompatEnabled) {
9888257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir            if (mDownloadable) {
9988257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir                final FontRequest fontRequest = new FontRequest(
10088257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir                        mContext.getString(R.string.provider_authority),
10188257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir                        mContext.getString(R.string.provider_package),
10288257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir                        mContext.getString(R.string.font_query),
10388257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir                        R.array.com_google_android_gms_fonts_certs);
10488257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir
10588257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir                config = new FontRequestEmojiCompatConfig(mContext, fontRequest);
10688257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir            } else {
10788257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir                config = new BundledEmojiCompatConfig(mContext);
10888257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir            }
10988257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        } else {
11088257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir            config = new EmojiCompat.Config(new EmojiCompat.MetadataLoader() {
11188257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir                @Override
11288257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir                public void load(@NonNull EmojiCompat.LoaderCallback loaderCallback) {
11388257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir                    loaderCallback.onFailed(new RuntimeException("Disable"));
11488257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir                }
11588257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir            }) {
11688257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir            };
11788257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        }
11888257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir
11988257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        config.setReplaceAll(mReplaceAll)
12088257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir                .setEmojiSpanIndicatorEnabled(mIndicator)
12188257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir                .registerInitCallback(new EmojiCompat.InitCallback() {
12288257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir                    @Override
12388257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir                    public void onInitialized() {
12488257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir                        Log.i(TAG, "EmojiCompat initialized");
12588257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir                    }
12688257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir
12788257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir                    @Override
12888257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir                    public void onFailed(@Nullable Throwable throwable) {
12988257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir                        Log.e(TAG, "EmojiCompat initialization failed", throwable);
13088257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir                    }
13188257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir                });
13288257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir
13388257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        EmojiCompat.reset(config);
13488257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    }
13588257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir
13688257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    boolean isCompatEnabled() {
13788257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        return mCompatEnabled;
13888257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    }
13988257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir
14088257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    boolean isReplaceAll() {
14188257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        return mCompatEnabled && mReplaceAll;
14288257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    }
14388257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir
14488257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    boolean isDownloadable() {
14588257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        return mCompatEnabled && mDownloadable;
14688257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    }
14788257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir
14888257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    boolean isIndicator() {
14988257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        return mCompatEnabled && mIndicator;
15088257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    }
15188257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir
15288257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    interface Listener {
15388257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir        void onEmojiCompatUpdated();
15488257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir    }
15588257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir}
156