113 lines
4.1 KiB
Java
113 lines
4.1 KiB
Java
/*
|
|
Licensed to the Apache Software Foundation (ASF) under one
|
|
or more contributor license agreements. See the NOTICE file
|
|
distributed with this work for additional information
|
|
regarding copyright ownership. The ASF licenses this file
|
|
to you 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 org.apache.cordova;
|
|
|
|
import android.content.Context;
|
|
import android.widget.LinearLayout;
|
|
|
|
/**
|
|
* This class is used to detect when the soft keyboard is shown and hidden in the web view.
|
|
*/
|
|
public class LinearLayoutSoftKeyboardDetect extends LinearLayout {
|
|
|
|
private static final String TAG = "SoftKeyboardDetect";
|
|
|
|
private int oldHeight = 0; // Need to save the old height as not to send redundant events
|
|
private int oldWidth = 0; // Need to save old width for orientation change
|
|
private int screenWidth = 0;
|
|
private int screenHeight = 0;
|
|
private CordovaActivity app = null;
|
|
private App appPlugin = null;
|
|
|
|
public LinearLayoutSoftKeyboardDetect(Context context, int width, int height) {
|
|
super(context);
|
|
screenWidth = width;
|
|
screenHeight = height;
|
|
app = (CordovaActivity) context;
|
|
}
|
|
|
|
@Override
|
|
/**
|
|
* Start listening to new measurement events. Fire events when the height
|
|
* gets smaller fire a show keyboard event and when height gets bigger fire
|
|
* a hide keyboard event.
|
|
*
|
|
* Note: We are using the core App plugin to send events over the bridge to Javascript
|
|
*
|
|
* @param widthMeasureSpec
|
|
* @param heightMeasureSpec
|
|
*/
|
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
|
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
|
|
|
|
LOG.v(TAG, "We are in our onMeasure method");
|
|
|
|
// Get the current height of the visible part of the screen.
|
|
// This height will not included the status bar.\
|
|
int width, height;
|
|
|
|
height = MeasureSpec.getSize(heightMeasureSpec);
|
|
width = MeasureSpec.getSize(widthMeasureSpec);
|
|
LOG.v(TAG, "Old Height = %d", oldHeight);
|
|
LOG.v(TAG, "Height = %d", height);
|
|
LOG.v(TAG, "Old Width = %d", oldWidth);
|
|
LOG.v(TAG, "Width = %d", width);
|
|
|
|
// If the oldHeight = 0 then this is the first measure event as the app starts up.
|
|
// If oldHeight == height then we got a measurement change that doesn't affect us.
|
|
if (oldHeight == 0 || oldHeight == height) {
|
|
LOG.d(TAG, "Ignore this event");
|
|
}
|
|
// Account for orientation change and ignore this event/Fire orientation change
|
|
else if (screenHeight == width)
|
|
{
|
|
int tmp_var = screenHeight;
|
|
screenHeight = screenWidth;
|
|
screenWidth = tmp_var;
|
|
LOG.v(TAG, "Orientation Change");
|
|
}
|
|
// If the height as gotten bigger then we will assume the soft keyboard has
|
|
// gone away.
|
|
else if (height > oldHeight) {
|
|
sendEvent("hidekeyboard");
|
|
}
|
|
// If the height as gotten smaller then we will assume the soft keyboard has
|
|
// been displayed.
|
|
else if (height < oldHeight) {
|
|
sendEvent("showkeyboard");
|
|
}
|
|
|
|
// Update the old height for the next event
|
|
oldHeight = height;
|
|
oldWidth = width;
|
|
}
|
|
|
|
private void sendEvent(String event) {
|
|
if (appPlugin == null) {
|
|
appPlugin = (App)app.appView.pluginManager.getPlugin(App.PLUGIN_NAME);
|
|
}
|
|
|
|
if (appPlugin == null) {
|
|
LOG.w(TAG, "Unable to fire event without existing plugin");
|
|
return;
|
|
}
|
|
appPlugin.fireJavascriptEvent(event);
|
|
}
|
|
}
|