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 { 110119470022e134a7d6b443128982083b8476b75a9Siyamed Sinir config = new EmojiCompat.Config(new EmojiCompat.MetadataRepoLoader() { 11188257c64fd28b11c082b56f2f81edca8641c410cSiyamed Sinir @Override 112119470022e134a7d6b443128982083b8476b75a9Siyamed Sinir public void load(@NonNull EmojiCompat.MetadataRepoLoaderCallback 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