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. * Methods may be added in future cordova versions, but never removed.
*/ */
public interface Client { public interface Client {
Boolean onKeyDown(int keyCode, KeyEvent event); Boolean onDispatchKeyEvent(KeyEvent event);
Boolean onKeyUp(int keyCode, KeyEvent event);
boolean shouldOverrideUrlLoading(String url); boolean shouldOverrideUrlLoading(String url);
void clearLoadTimeoutTimer(); void clearLoadTimeoutTimer();
void onPageStarted(String newUrl); void onPageStarted(String newUrl);
void onReceivedError(int errorCode, String description, String failingUrl); void onReceivedError(int errorCode, String description, String failingUrl);
void onPageFinishedLoading(String url); 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 { protected class EngineClient implements CordovaWebViewEngine.Client {
private long lastMenuEventTime = 0;
@Override @Override
public void clearLoadTimeoutTimer() { public void clearLoadTimeoutTimer() {
loadUrlTimeout++; loadUrlTimeout++;
@ -539,76 +537,48 @@ public class CordovaWebViewImpl implements CordovaWebView {
} }
@Override @Override
public Boolean onKeyDown(int keyCode, KeyEvent event) { public Boolean onDispatchKeyEvent(KeyEvent event) {
if (boundKeyCodes.contains(keyCode)) int keyCode = event.getKeyCode();
{ boolean isBackButton = keyCode == KeyEvent.KEYCODE_BACK;
if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) { if (event.getAction() == KeyEvent.ACTION_DOWN) {
sendJavascriptEvent("volumedownbutton"); if (isBackButton && mCustomView != null) {
return true; return true;
} else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) { } else if (boundKeyCodes.contains(keyCode)) {
sendJavascriptEvent("volumeupbutton");
return true; return true;
} else if (isBackButton) {
return engine.canGoBack();
} }
return null; } else if (event.getAction() == KeyEvent.ACTION_UP) {
} if (isBackButton && mCustomView != 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) {
hideCustomView(); hideCustomView();
return true; return true;
} else { } else if (boundKeyCodes.contains(keyCode)) {
// The webview is currently displayed String eventName = null;
// If back key is bound, then send event to JavaScript switch (keyCode) {
if (isButtonPlumbedToJs(KeyEvent.KEYCODE_BACK)) { case KeyEvent.KEYCODE_VOLUME_DOWN:
sendJavascriptEvent("backbutton"); eventName = "volumedownbutton";
return true; break;
} else { case KeyEvent.KEYCODE_VOLUME_UP:
// If not bound eventName = "volumeupbutton";
// Go to previous page in webview if it is possible to go back break;
if (engine.goBack()) { 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; return true;
} }
// If not, then invoke default behavior } 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; return null;
} }
@ -641,5 +611,13 @@ public class CordovaWebViewImpl implements CordovaWebView {
// Block by default // Block by default
return true; 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) public void onScrollChanged(int l, int t, int oldl, int oldt)
{ {
super.onScrollChanged(l, t, oldl, oldt); super.onScrollChanged(l, t, oldl, oldt);
//We should post a message that the scroll changed parentEngine.client.onScrollChanged(l, t, oldl, oldt);
ScrollEvent myEvent = new ScrollEvent(l, t, oldl, oldt, this);
parentEngine.pluginManager.postMessage("onScrollChanged", myEvent);
} }
@Override @Override
public boolean onKeyDown(int keyCode, KeyEvent event) { public boolean dispatchKeyEvent(KeyEvent event) {
Boolean ret = parentEngine.client.onKeyDown(keyCode, event); Boolean ret = parentEngine.client.onDispatchKeyEvent(event);
if (ret != null) { if (ret != null) {
return ret.booleanValue(); return ret.booleanValue();
} }
return super.onKeyDown(keyCode, event); return super.dispatchKeyEvent(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);
} }
} }