CB-8510 Fix back button not exiting activity in manual tests

This commit is contained in:
Andrew Grieve 2015-02-25 12:27:06 -05:00
parent 455298d736
commit d6da2ef096
3 changed files with 48 additions and 81 deletions

View File

@ -71,12 +71,12 @@ public interface CordovaWebViewEngine {
* Methods may be added in future cordova versions, but never removed.
*/
public interface Client {
Boolean onKeyDown(int keyCode, KeyEvent event);
Boolean onKeyUp(int keyCode, KeyEvent event);
Boolean onDispatchKeyEvent(KeyEvent event);
boolean shouldOverrideUrlLoading(String url);
void clearLoadTimeoutTimer();
void onPageStarted(String newUrl);
void onReceivedError(int errorCode, String description, String failingUrl);
void onPageFinishedLoading(String url);
void onScrollChanged(int l, int t, int oldl, int oldt);
}
}

View File

@ -476,8 +476,6 @@ public class CordovaWebViewImpl implements CordovaWebView {
}
protected class EngineClient implements CordovaWebViewEngine.Client {
private long lastMenuEventTime = 0;
@Override
public void clearLoadTimeoutTimer() {
loadUrlTimeout++;
@ -539,76 +537,48 @@ public class CordovaWebViewImpl implements CordovaWebView {
}
@Override
public Boolean onKeyDown(int keyCode, KeyEvent event) {
if (boundKeyCodes.contains(keyCode))
{
if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
sendJavascriptEvent("volumedownbutton");
public Boolean onDispatchKeyEvent(KeyEvent event) {
int keyCode = event.getKeyCode();
boolean isBackButton = keyCode == KeyEvent.KEYCODE_BACK;
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if (isBackButton && mCustomView != null) {
return true;
} else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
sendJavascriptEvent("volumeupbutton");
} else if (boundKeyCodes.contains(keyCode)) {
return true;
} else if (isBackButton) {
return engine.canGoBack();
}
return null;
}
else if (keyCode == KeyEvent.KEYCODE_BACK)
{
return !engine.canGoBack() || isButtonPlumbedToJs(KeyEvent.KEYCODE_BACK);
}
else if(keyCode == KeyEvent.KEYCODE_MENU)
{
//How did we get here? Is there a childView?
View childView = ((ViewGroup)engine.getView().getParent()).getFocusedChild();
if(childView != null)
{
//Make sure we close the keyboard if it's present
InputMethodManager imm = (InputMethodManager) cordova.getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(childView.getWindowToken(), 0);
cordova.getActivity().openOptionsMenu();
return true;
}
}
return null;
}
@Override
public Boolean onKeyUp(int keyCode, KeyEvent event)
{
// If back key
if (keyCode == KeyEvent.KEYCODE_BACK) {
// A custom view is currently displayed (e.g. playing a video)
if(mCustomView != null) {
} else if (event.getAction() == KeyEvent.ACTION_UP) {
if (isBackButton && mCustomView != null) {
hideCustomView();
return true;
} else {
// The webview is currently displayed
// If back key is bound, then send event to JavaScript
if (isButtonPlumbedToJs(KeyEvent.KEYCODE_BACK)) {
sendJavascriptEvent("backbutton");
return true;
} else {
// If not bound
// Go to previous page in webview if it is possible to go back
if (engine.goBack()) {
return true;
}
// If not, then invoke default behavior
} else if (boundKeyCodes.contains(keyCode)) {
String eventName = null;
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_DOWN:
eventName = "volumedownbutton";
break;
case KeyEvent.KEYCODE_VOLUME_UP:
eventName = "volumeupbutton";
break;
case KeyEvent.KEYCODE_SEARCH:
eventName = "searchbutton";
break;
case KeyEvent.KEYCODE_MENU:
eventName = "menubutton";
break;
case KeyEvent.KEYCODE_BACK:
eventName = "backbutton";
break;
}
if (eventName != null) {
sendJavascriptEvent(eventName);
return true;
}
} else if (isBackButton) {
return engine.goBack();
}
}
// Legacy
else if (keyCode == KeyEvent.KEYCODE_MENU) {
if (lastMenuEventTime < event.getEventTime()) {
sendJavascriptEvent("menubutton");
}
lastMenuEventTime = event.getEventTime();
return null;
}
// If search key
else if (keyCode == KeyEvent.KEYCODE_SEARCH) {
sendJavascriptEvent("searchbutton");
return true;
}
return null;
}
@ -641,5 +611,13 @@ public class CordovaWebViewImpl implements CordovaWebView {
// Block by default
return true;
}
@Override
public void onScrollChanged(int l, int t, int oldl, int oldt) {
// TODO: scrolling is perf-sensitive, so we'd probably be better to no use postMessage
// here, and also not to create any new objects.
ScrollEvent myEvent = new ScrollEvent(l, t, oldl, oldt, getView());
pluginManager.postMessage("onScrollChanged", myEvent);
}
}
}

View File

@ -63,26 +63,15 @@ public class SystemWebView extends WebView implements CordovaWebViewEngine.Engin
public void onScrollChanged(int l, int t, int oldl, int oldt)
{
super.onScrollChanged(l, t, oldl, oldt);
//We should post a message that the scroll changed
ScrollEvent myEvent = new ScrollEvent(l, t, oldl, oldt, this);
parentEngine.pluginManager.postMessage("onScrollChanged", myEvent);
parentEngine.client.onScrollChanged(l, t, oldl, oldt);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
Boolean ret = parentEngine.client.onKeyDown(keyCode, event);
public boolean dispatchKeyEvent(KeyEvent event) {
Boolean ret = parentEngine.client.onDispatchKeyEvent(event);
if (ret != null) {
return ret.booleanValue();
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
Boolean ret = parentEngine.client.onKeyUp(keyCode, event);
if (ret != null) {
return ret.booleanValue();
}
return super.onKeyUp(keyCode, event);
return super.dispatchKeyEvent(event);
}
}