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 17 package com.example.android.support.text.emoji; 18 19 import android.content.Context; 20 import android.content.SharedPreferences; 21 import android.util.Log; 22 23 import androidx.annotation.NonNull; 24 import androidx.annotation.Nullable; 25 import androidx.core.provider.FontRequest; 26 import androidx.emoji.bundled.BundledEmojiCompatConfig; 27 import androidx.emoji.text.EmojiCompat; 28 import androidx.emoji.text.FontRequestEmojiCompatConfig; 29 30 import java.util.HashSet; 31 import java.util.Set; 32 33 class Config { 34 private static final String TAG = "EmojiDemo"; 35 36 public static final String PREF_NAME = "emojicompat"; 37 public static final String KEY_ENABLED = "enabled"; 38 public static final String KEY_REPLACE_ALL = "replaceAll"; 39 public static final String KEY_DOWNLOADABLE = "downloadable"; 40 public static final String KEY_INDICATOR = "indicator"; 41 private static Config sInstance; 42 43 private SharedPreferences mSharedPref; 44 private Context mContext; 45 private boolean mCompatEnabled; 46 private boolean mReplaceAll; 47 private boolean mDownloadable; 48 private boolean mIndicator; 49 50 private Set<Listener> mListeners = new HashSet<>(); 51 Config()52 private Config() { 53 } 54 init(Context context)55 void init(Context context) { 56 this.mContext = context; 57 mSharedPref = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); 58 mCompatEnabled = mSharedPref.getBoolean(KEY_ENABLED, false); 59 mReplaceAll = mSharedPref.getBoolean(KEY_REPLACE_ALL, false); 60 mDownloadable = mSharedPref.getBoolean(KEY_DOWNLOADABLE, false); 61 mIndicator = mSharedPref.getBoolean(KEY_INDICATOR, false); 62 resetEmojiCompat(); 63 } 64 get()65 static synchronized Config get() { 66 if (sInstance == null) { 67 sInstance = new Config(); 68 } 69 return sInstance; 70 } 71 registerListener(Listener listener)72 void registerListener(Listener listener) { 73 mListeners.add(listener); 74 } 75 unregisterListener(Listener listener)76 void unregisterListener(Listener listener) { 77 mListeners.remove(listener); 78 } 79 update(boolean compatEnabled, boolean replaceAll, boolean downloadable, boolean indicator)80 void update(boolean compatEnabled, boolean replaceAll, boolean downloadable, 81 boolean indicator) { 82 mCompatEnabled = compatEnabled; 83 mReplaceAll = replaceAll; 84 mDownloadable = downloadable; 85 mIndicator = indicator; 86 mSharedPref.edit().putBoolean(KEY_ENABLED, mCompatEnabled).apply(); 87 mSharedPref.edit().putBoolean(KEY_REPLACE_ALL, mReplaceAll).apply(); 88 mSharedPref.edit().putBoolean(KEY_DOWNLOADABLE, mDownloadable).apply(); 89 mSharedPref.edit().putBoolean(KEY_INDICATOR, mIndicator).apply(); 90 resetEmojiCompat(); 91 for (Listener listener : mListeners) { 92 listener.onEmojiCompatUpdated(); 93 } 94 } 95 resetEmojiCompat()96 private void resetEmojiCompat() { 97 final EmojiCompat.Config config; 98 if (mCompatEnabled) { 99 if (mDownloadable) { 100 final FontRequest fontRequest = new FontRequest( 101 mContext.getString(R.string.provider_authority), 102 mContext.getString(R.string.provider_package), 103 mContext.getString(R.string.font_query), 104 R.array.com_google_android_gms_fonts_certs); 105 106 config = new FontRequestEmojiCompatConfig(mContext, fontRequest); 107 } else { 108 config = new BundledEmojiCompatConfig(mContext); 109 } 110 } else { 111 config = new EmojiCompat.Config(new EmojiCompat.MetadataRepoLoader() { 112 @Override 113 public void load(@NonNull EmojiCompat.MetadataRepoLoaderCallback loaderCallback) { 114 loaderCallback.onFailed(new RuntimeException("Disable")); 115 } 116 }) { 117 }; 118 } 119 120 config.setReplaceAll(mReplaceAll) 121 .setEmojiSpanIndicatorEnabled(mIndicator) 122 .registerInitCallback(new EmojiCompat.InitCallback() { 123 @Override 124 public void onInitialized() { 125 Log.i(TAG, "EmojiCompat initialized"); 126 } 127 128 @Override 129 public void onFailed(@Nullable Throwable throwable) { 130 Log.e(TAG, "EmojiCompat initialization failed", throwable); 131 } 132 }); 133 134 EmojiCompat.reset(config); 135 } 136 isCompatEnabled()137 boolean isCompatEnabled() { 138 return mCompatEnabled; 139 } 140 isReplaceAll()141 boolean isReplaceAll() { 142 return mCompatEnabled && mReplaceAll; 143 } 144 isDownloadable()145 boolean isDownloadable() { 146 return mCompatEnabled && mDownloadable; 147 } 148 isIndicator()149 boolean isIndicator() { 150 return mCompatEnabled && mIndicator; 151 } 152 153 interface Listener { onEmojiCompatUpdated()154 void onEmojiCompatUpdated(); 155 } 156 } 157