blob: 4a9fe15e79f5c86994c30d18b17688c3eea59921 [file] [log] [blame]
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.ui;
import android.content.Context;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
/**
* Utility functions for common Android UI tasks.
* This class is not supposed to be instantiated.
*/
public class UiUtils {
/**
* Guards this class from being instantiated.
*/
private UiUtils() {
}
/** The minimum size of the bottom margin below the app to detect a keyboard. */
private static float KEYBOARD_DETECT_BOTTOM_THRESHOLD_DP = 100;
/**
* Shows the software keyboard if necessary.
* @param view The currently focused {@link View}, which would receive soft keyboard input.
*/
public static void showKeyboard(View view) {
InputMethodManager imm =
(InputMethodManager) view.getContext().getSystemService(
Context.INPUT_METHOD_SERVICE);
// Only shows soft keyboard if there isn't an open physical keyboard.
imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
}
/**
* Hides the keyboard.
* @param view The {@link View} that is currently accepting input.
* @return Whether the keyboard was visible before.
*/
public static boolean hideKeyboard(View view) {
InputMethodManager imm =
(InputMethodManager) view.getContext().getSystemService(
Context.INPUT_METHOD_SERVICE);
return imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
public static boolean isKeyboardShowing(Context context, View view) {
View rootView = view.getRootView();
if (rootView == null) return false;
Rect appRect = new Rect();
rootView.getWindowVisibleDisplayFrame(appRect);
final float screenHeight = context.getResources().getDisplayMetrics().heightPixels;
final float bottomMargin = Math.abs(appRect.bottom - screenHeight);
final float density = context.getResources().getDisplayMetrics().density;
return bottomMargin > KEYBOARD_DETECT_BOTTOM_THRESHOLD_DP * density;
}
/**
* Inserts a {@link View} into a {@link ViewGroup} after directly before a given {@View}.
* @param container The {@link View} to add newView to.
* @param newView The new {@link View} to add.
* @param existingView The {@link View} to insert the newView before.
* @return The index where newView was inserted, or -1 if it was not inserted.
*/
public static int insertBefore(ViewGroup container, View newView, View existingView) {
return insertView(container, newView, existingView, false);
}
/**
* Inserts a {@link View} into a {@link ViewGroup} after directly after a given {@View}.
* @param container The {@link View} to add newView to.
* @param newView The new {@link View} to add.
* @param existingView The {@link View} to insert the newView after.
* @return The index where newView was inserted, or -1 if it was not inserted.
*/
public static int insertAfter(ViewGroup container, View newView, View existingView) {
return insertView(container, newView, existingView, true);
}
private static int insertView(
ViewGroup container, View newView, View existingView, boolean after) {
// See if the view has already been added.
int index = container.indexOfChild(newView);
if (index >= 0) return index;
// Find the location of the existing view.
index = container.indexOfChild(existingView);
if (index < 0) return -1;
// Add the view.
if (after) index++;
container.addView(newView, index);
return index;
}
}