/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.statusbar.tablet;
import android.content.Context;
import android.os.IBinder;
import android.provider.Settings;
import android.util.AttributeSet;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager;
import android.view.inputmethod.InputMethodSubtype;
import android.view.View;
import android.widget.ImageView;
import com.android.systemui.R;
import java.util.List;
public class InputMethodButton extends ImageView {
private static final String TAG = "StatusBar/InputMethodButton";
private static final boolean DEBUG = false;
// These values are defined in Settings application.
private static final int ID_IME_BUTTON_VISIBILITY_AUTO = 0;
private static final int ID_IME_BUTTON_VISIBILITY_ALWAYS_SHOW = 1;
private static final int ID_IME_BUTTON_VISIBILITY_ALWAYS_HIDE = 2;
// other services we wish to talk to
private final InputMethodManager mImm;
private final int mId;
private ImageView mIcon;
private IBinder mToken;
private boolean mShowButton = false;
private boolean mScreenLocked = false;
private boolean mHardKeyboardAvailable;
// Please refer to InputMethodManagerService.TAG_TRY_SUPPRESSING_IME_SWITCHER
private static final String TAG_TRY_SUPPRESSING_IME_SWITCHER = "TrySuppressingImeSwitcher";
public InputMethodButton(Context context, AttributeSet attrs) {
super(context, attrs);
// Resource Id of the input method button. This id is defined in status_bar.xml
mId = getId();
// IME hookup
mImm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
}
@Override
protected void onAttachedToWindow() {
mIcon = (ImageView) findViewById(mId);
refreshStatusIcon();
}
// Refer to InputMethodManagerService.needsToShowImeSwitchOngoingNotification()
private boolean needsToShowIMEButtonWhenVisibilityAuto() {
List<InputMethodInfo> imis = mImm.getEnabledInputMethodList();
final int N = imis.size();
if (N > 2) return true;
if (N < 1) return false;
int nonAuxCount = 0;
int auxCount = 0;
InputMethodSubtype nonAuxSubtype = null;
InputMethodSubtype auxSubtype = null;
for(int i = 0; i < N; ++i) {
final InputMethodInfo imi = imis.get(i);
final List<InputMethodSubtype> subtypes = mImm.getEnabledInputMethodSubtypeList(
imi, true);
final int subtypeCount = subtypes.size();
if (subtypeCount == 0) {
++nonAuxCount;
} else {
for (int j = 0; j < subtypeCount; ++j) {
final InputMethodSubtype subtype = subtypes.get(j);
if (!subtype.isAuxiliary()) {
++nonAuxCount;
nonAuxSubtype = subtype;
} else {
++auxCount;
auxSubtype = subtype;
}
}
}
}
if (nonAuxCount > 1 || auxCount > 1) {
return true;
} else if (nonAuxCount == 1 && auxCount == 1) {
if (nonAuxSubtype != null && auxSubtype != null
&& (nonAuxSubtype.getLocale().equals(auxSubtype.getLocale())
|| auxSubtype.overridesImplicitlyEnabledSubtype()
|| nonAuxSubtype.overridesImplicitlyEnabledSubtype())
&& nonAuxSubtype.containsExtraValueKey(TAG_TRY_SUPPRESSING_IME_SWITCHER)) {
return false;
}
return true;
}
return false;
}
private boolean needsToShowIMEButton() {
if (!mShowButton || mScreenLocked) return false;
if (mHardKeyboardAvailable) {
return true;
}
final int visibility = loadInputMethodSelectorVisibility();
switch (visibility) {
case ID_IME_BUTTON_VISIBILITY_AUTO:
return needsToShowIMEButtonWhenVisibilityAuto();
case ID_IME_BUTTON_VISIBILITY_ALWAYS_SHOW:
return true;
case ID_IME_BUTTON_VISIBILITY_ALWAYS_HIDE:
return false;
}
return false;
}
private void refreshStatusIcon() {
if (mIcon == null) {
return;
}
if (!needsToShowIMEButton()) {
setVisibility(View.GONE);
return;
} else {
setVisibility(View.VISIBLE);
}
mIcon.setImageResource(R.drawable.ic_sysbar_ime);
}
private int loadInputMethodSelectorVisibility() {
return Settings.Secure.getInt(getContext().getContentResolver(),
Settings.Secure.INPUT_METHOD_SELECTOR_VISIBILITY, ID_IME_BUTTON_VISIBILITY_AUTO);
}
public void setIconImage(int resId) {
if (mIcon != null) {
mIcon.setImageResource(resId);
}
}
public void setImeWindowStatus(IBinder token, boolean showButton) {
mToken = token;
mShowButton = showButton;
refreshStatusIcon();
}
public void setHardKeyboardStatus(boolean available) {
if (mHardKeyboardAvailable != available) {
mHardKeyboardAvailable = available;
refreshStatusIcon();
}
}
public void setScreenLocked(boolean locked) {
mScreenLocked = locked;
refreshStatusIcon();
}
}