blob: 082c782fa482bff2309efa8deab836a9f42fddde [file] [log] [blame]
// Copyright 2010-2015, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package org.mozc.android.inputmethod.japanese.emoji;
import org.mozc.android.inputmethod.japanese.MozcLog;
import org.mozc.android.inputmethod.japanese.MozcUtil.TelephonyManagerInterface;
import org.mozc.android.inputmethod.japanese.preference.PreferenceUtil;
import com.google.common.base.Objects;
import com.google.common.base.Preconditions;
import android.content.SharedPreferences;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.annotation.Nullable;
/**
* Providers whose emoji set MechaMozc supports.
*
*/
public enum EmojiProviderType {
/**
* Place holder for following situations.
* <ul>
* <li>Provider detection is failed.
* <li>A user select this item explicitly on the preference screen.
* <li>Emoji is disabled by spec.
* </ul>
* If a user invokes Emoji screen on symbol input view, provider chooser dialog will be shown.
* If Emoji is disabled by spec, Emoji screen itself should be suppressed.
*
* Note:
* <ul>
* <li>NONE is just a default value. User should update it to use Emoji.
* <li>Unicode 6.0 Emoji is available even if DOCOMO, KDDI and SOFTBANK.
* </ul>
*/
NONE((byte) 0),
DOCOMO((byte) 1),
KDDI((byte) 2),
SOFTBANK((byte) 4),
UNICODE((byte) 8),
;
private static final Map<String, EmojiProviderType> NETWORK_OPERATOR_MAP;
private static final Set<String> NAME_SET;
private final byte bitMask;
static {
// The key is "Mobile Country Code" + "Mobile Network Code".
// Note that if the network operator uses MVNO (Mobile Virtual Network Operator),
// the network operator provided by TelephonyManager would be the one of their partner's.
Map<String, EmojiProviderType> networkOperatorMap = new HashMap<String, EmojiProviderType>();
networkOperatorMap.put("44010", DOCOMO);
networkOperatorMap.put("44020", SOFTBANK);
networkOperatorMap.put("44070", KDDI);
NETWORK_OPERATOR_MAP = Collections.unmodifiableMap(networkOperatorMap);
Set<String> nameSet = new HashSet<String>();
for (EmojiProviderType emojiProviderType : values()) {
nameSet.add(emojiProviderType.name());
}
NAME_SET = Collections.unmodifiableSet(nameSet);
}
private EmojiProviderType(byte bitMask) {
this.bitMask = bitMask;
}
public byte getBitMask() {
return bitMask;
}
/**
* Detects emoji provider type and sets it to the given {@code sharedPreferences},
* if necessary based on the Mobile Network Code provided by {@code telephonyManager}.
* If the {@code sharedPreferences} is {@code null}, or already has valid emoji provider type,
* just does nothing.
*
* Note: if the new detected emoji provider type is set to the {@code sharedPreferences}
* and if it has registered callbacks, of course, they will be invoked as usual.
*/
public static void maybeSetDetectedEmojiProviderType(
@Nullable SharedPreferences sharedPreferences, TelephonyManagerInterface telephonyManager) {
Preconditions.checkNotNull(telephonyManager);
if (sharedPreferences == null) {
return;
}
// First, check if the emoji provider has already set to the preference.
String currentProviderTypeString =
sharedPreferences.getString(PreferenceUtil.PREF_EMOJI_PROVIDER_TYPE, null);
if (NAME_SET.contains(currentProviderTypeString) && !currentProviderTypeString.equals("NONE")) {
// Found the valid value.
return;
}
// Here, the EmojiProviderType hasn't set yet, so detect emoji provider.
EmojiProviderType detectedType =
detectEmojiProviderTypeByMobileNetworkOperator(telephonyManager);
sharedPreferences.edit()
.putString(PreferenceUtil.PREF_EMOJI_PROVIDER_TYPE, detectedType.name())
.commit();
MozcLog.i("RUN EMOJI PROVIDER DETECTION: " + detectedType);
}
/**
* @return EmojiProviderType, including NONE. NONE if the detection fails.
*/
private static EmojiProviderType detectEmojiProviderTypeByMobileNetworkOperator(
TelephonyManagerInterface telephonyManager) {
Preconditions.checkNotNull(telephonyManager);
// TODO(hsumita): Consider to make the default value UNICODE.
return Objects.firstNonNull(NETWORK_OPERATOR_MAP.get(telephonyManager.getNetworkOperator()),
NONE);
}
}