mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-15 14:25:52 +00:00
Bug 776027 - Move intent handling to IntentHelper. r=wesj
This commit is contained in:
parent
374b91222a
commit
a67c87c9a9
@ -669,49 +669,7 @@ public abstract class GeckoApp
|
||||
} else {
|
||||
// something went wrong.
|
||||
Log.e(LOGTAG, "Received Contact:Add message with no email nor phone number");
|
||||
}
|
||||
} else if (event.equals("Intent:GetHandlers")) {
|
||||
Intent intent = GeckoAppShell.getOpenURIIntent((Context) this, message.optString("url"),
|
||||
message.optString("mime"), message.optString("action"), message.optString("title"));
|
||||
String[] handlers = GeckoAppShell.getHandlersForIntent(intent);
|
||||
List<String> appList = Arrays.asList(handlers);
|
||||
JSONObject handlersJSON = new JSONObject();
|
||||
handlersJSON.put("apps", new JSONArray(appList));
|
||||
EventDispatcher.sendResponse(message, handlersJSON);
|
||||
} else if (event.equals("Intent:Open")) {
|
||||
GeckoAppShell.openUriExternal(message.optString("url"),
|
||||
message.optString("mime"), message.optString("packageName"),
|
||||
message.optString("className"), message.optString("action"), message.optString("title"));
|
||||
} else if (event.equals("Intent:OpenForResult")) {
|
||||
Intent intent = GeckoAppShell.getOpenURIIntent(this,
|
||||
message.optString("url"),
|
||||
message.optString("mime"),
|
||||
message.optString("action"),
|
||||
message.optString("title"));
|
||||
intent.setClassName(message.optString("packageName"), message.optString("className"));
|
||||
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||
|
||||
final JSONObject originalMessage = message;
|
||||
ActivityHandlerHelper.startIntentForActivity(this,
|
||||
intent,
|
||||
new ActivityResultHandler() {
|
||||
@Override
|
||||
public void onActivityResult (int resultCode, Intent data) {
|
||||
JSONObject response = new JSONObject();
|
||||
|
||||
try {
|
||||
if (data != null) {
|
||||
response.put("extras", bundleToJSON(data.getExtras()));
|
||||
}
|
||||
response.put("resultCode", resultCode);
|
||||
} catch (JSONException e) {
|
||||
Log.w(LOGTAG, "Error building JSON response.", e);
|
||||
}
|
||||
|
||||
EventDispatcher.sendResponse(originalMessage, response);
|
||||
}
|
||||
});
|
||||
}
|
||||
} else if (event.equals("Locale:Set")) {
|
||||
setLocale(message.getString("locale"));
|
||||
} else if (event.equals("NativeApp:IsDebuggable")) {
|
||||
@ -872,23 +830,6 @@ public abstract class GeckoApp
|
||||
});
|
||||
}
|
||||
|
||||
private JSONObject bundleToJSON(Bundle bundle) {
|
||||
JSONObject json = new JSONObject();
|
||||
if (bundle == null) {
|
||||
return json;
|
||||
}
|
||||
|
||||
for (String key : bundle.keySet()) {
|
||||
try {
|
||||
json.put(key, bundle.get(key));
|
||||
} catch (JSONException e) {
|
||||
Log.w(LOGTAG, "Error building JSON response.", e);
|
||||
}
|
||||
}
|
||||
|
||||
return json;
|
||||
}
|
||||
|
||||
private void addFullScreenPluginView(View view) {
|
||||
if (mFullScreenPluginView != null) {
|
||||
Log.w(LOGTAG, "Already have a fullscreen plugin view");
|
||||
@ -1387,6 +1328,7 @@ public abstract class GeckoApp
|
||||
|
||||
GeckoAppShell.setNotificationClient(makeNotificationClient());
|
||||
NotificationHelper.init(getApplicationContext());
|
||||
IntentHelper.init(this);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1598,9 +1540,6 @@ public abstract class GeckoApp
|
||||
registerEventListener("Update:Install");
|
||||
registerEventListener("PrivateBrowsing:Data");
|
||||
registerEventListener("Contact:Add");
|
||||
registerEventListener("Intent:Open");
|
||||
registerEventListener("Intent:OpenForResult");
|
||||
registerEventListener("Intent:GetHandlers");
|
||||
registerEventListener("Locale:Set");
|
||||
registerEventListener("NativeApp:IsDebuggable");
|
||||
registerEventListener("SystemUI:Visibility");
|
||||
@ -2130,8 +2069,6 @@ public abstract class GeckoApp
|
||||
unregisterEventListener("Update:Install");
|
||||
unregisterEventListener("PrivateBrowsing:Data");
|
||||
unregisterEventListener("Contact:Add");
|
||||
unregisterEventListener("Intent:Open");
|
||||
unregisterEventListener("Intent:GetHandlers");
|
||||
unregisterEventListener("Locale:Set");
|
||||
unregisterEventListener("NativeApp:IsDebuggable");
|
||||
unregisterEventListener("SystemUI:Visibility");
|
||||
@ -2153,6 +2090,7 @@ public abstract class GeckoApp
|
||||
if (mTextSelection != null)
|
||||
mTextSelection.destroy();
|
||||
NotificationHelper.destroy();
|
||||
IntentHelper.destroy();
|
||||
|
||||
if (SmsManager.getInstance() != null) {
|
||||
SmsManager.getInstance().stop();
|
||||
|
134
mobile/android/base/IntentHelper.java
Normal file
134
mobile/android/base/IntentHelper.java
Normal file
@ -0,0 +1,134 @@
|
||||
/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
package org.mozilla.gecko;
|
||||
|
||||
import org.mozilla.gecko.util.ActivityResultHandler;
|
||||
import org.mozilla.gecko.util.GeckoEventListener;
|
||||
import org.mozilla.gecko.util.JSONUtils;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.util.Log;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
public final class IntentHelper implements GeckoEventListener {
|
||||
private static final String LOGTAG = "GeckoIntentHelper";
|
||||
private static final String[] EVENTS = {
|
||||
"Intent:GetHandlers",
|
||||
"Intent:Open",
|
||||
"Intent:OpenForResult"
|
||||
};
|
||||
private static IntentHelper instance;
|
||||
|
||||
private Activity activity;
|
||||
|
||||
private IntentHelper(Activity activity) {
|
||||
this.activity = activity;
|
||||
for (String event : EVENTS) {
|
||||
GeckoAppShell.getEventDispatcher().registerEventListener(event, this);
|
||||
}
|
||||
}
|
||||
|
||||
public static IntentHelper init(Activity activity) {
|
||||
if (instance == null) {
|
||||
instance = new IntentHelper(activity);
|
||||
} else {
|
||||
Log.w(LOGTAG, "IntentHelper.init() called twice, ignoring.");
|
||||
}
|
||||
|
||||
return instance;
|
||||
}
|
||||
|
||||
public static void destroy() {
|
||||
if (instance != null) {
|
||||
for (String event : EVENTS) {
|
||||
GeckoAppShell.getEventDispatcher().unregisterEventListener(event, instance);
|
||||
}
|
||||
|
||||
instance = null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleMessage(String event, JSONObject message) {
|
||||
try {
|
||||
if (event.equals("Intent:GetHandlers")) {
|
||||
getHandlers(message);
|
||||
} else if (event.equals("Intent:Open")) {
|
||||
open(message);
|
||||
} else if (event.equals("Intent:OpenForResult")) {
|
||||
openForResult(message);
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
Log.e(LOGTAG, "Exception handling message \"" + event + "\":", e);
|
||||
}
|
||||
}
|
||||
|
||||
private void getHandlers(JSONObject message) throws JSONException {
|
||||
final Intent intent = GeckoAppShell.getOpenURIIntent(activity,
|
||||
message.optString("url"),
|
||||
message.optString("mime"),
|
||||
message.optString("action"),
|
||||
message.optString("title"));
|
||||
final List<String> appList = Arrays.asList(GeckoAppShell.getHandlersForIntent(intent));
|
||||
|
||||
final JSONObject response = new JSONObject();
|
||||
response.put("apps", new JSONArray(appList));
|
||||
EventDispatcher.sendResponse(message, response);
|
||||
}
|
||||
|
||||
private void open(JSONObject message) throws JSONException {
|
||||
GeckoAppShell.openUriExternal(message.optString("url"),
|
||||
message.optString("mime"),
|
||||
message.optString("packageName"),
|
||||
message.optString("className"),
|
||||
message.optString("action"),
|
||||
message.optString("title"));
|
||||
}
|
||||
|
||||
private void openForResult(final JSONObject message) throws JSONException {
|
||||
Intent intent = GeckoAppShell.getOpenURIIntent(activity,
|
||||
message.optString("url"),
|
||||
message.optString("mime"),
|
||||
message.optString("action"),
|
||||
message.optString("title"));
|
||||
intent.setClassName(message.optString("packageName"), message.optString("className"));
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||
|
||||
ActivityHandlerHelper.startIntentForActivity(activity, intent, new ResultHandler(message));
|
||||
}
|
||||
|
||||
private static class ResultHandler implements ActivityResultHandler {
|
||||
private final JSONObject message;
|
||||
|
||||
public ResultHandler(JSONObject message) {
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityResult (int resultCode, Intent data) {
|
||||
JSONObject response = new JSONObject();
|
||||
|
||||
try {
|
||||
if (data != null) {
|
||||
response.put("extras", JSONUtils.bundleToJSON(data.getExtras()));
|
||||
}
|
||||
response.put("resultCode", resultCode);
|
||||
} catch (JSONException e) {
|
||||
Log.w(LOGTAG, "Error building JSON response.", e);
|
||||
}
|
||||
|
||||
EventDispatcher.sendResponse(message, response);
|
||||
}
|
||||
}
|
||||
}
|
@ -281,6 +281,7 @@ gbjar.sources += [
|
||||
'home/TopSitesThumbnailView.java',
|
||||
'home/TwoLinePageRow.java',
|
||||
'InputMethods.java',
|
||||
'IntentHelper.java',
|
||||
'JavaAddonManager.java',
|
||||
'LightweightTheme.java',
|
||||
'LightweightThemeDrawable.java',
|
||||
|
@ -7,6 +7,7 @@ package org.mozilla.gecko.util;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
|
||||
import java.net.MalformedURLException;
|
||||
@ -54,4 +55,21 @@ public final class JSONUtils {
|
||||
throw new IllegalArgumentException(name + "=" + uuidString, e);
|
||||
}
|
||||
}
|
||||
|
||||
public static JSONObject bundleToJSON(Bundle bundle) {
|
||||
JSONObject json = new JSONObject();
|
||||
if (bundle == null) {
|
||||
return json;
|
||||
}
|
||||
|
||||
for (String key : bundle.keySet()) {
|
||||
try {
|
||||
json.put(key, bundle.get(key));
|
||||
} catch (JSONException e) {
|
||||
Log.w(LOGTAG, "Error building JSON response.", e);
|
||||
}
|
||||
}
|
||||
|
||||
return json;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user