forked from github/cordova-android
CB-8510 Fix back button not exiting activity in manual tests
This commit is contained in:
parent
455298d736
commit
d6da2ef096
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user