Bug 776027 - Move intent handling to IntentHelper. r=wesj

This commit is contained in:
Josh Dover 2014-04-25 16:28:00 +02:00
Родитель 13b254277b
Коммит 1134dcec0f
4 изменённых файлов: 164 добавлений и 65 удалений

Просмотреть файл

@ -637,49 +637,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")) {
@ -840,23 +798,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");
@ -1355,6 +1296,7 @@ public abstract class GeckoApp
GeckoAppShell.setNotificationClient(makeNotificationClient());
NotificationHelper.init(getApplicationContext());
IntentHelper.init(this);
}
/**
@ -1568,9 +1510,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");
@ -2104,8 +2043,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");
@ -2127,6 +2064,7 @@ public abstract class GeckoApp
if (mTextSelection != null)
mTextSelection.destroy();
NotificationHelper.destroy();
IntentHelper.destroy();
if (SmsManager.getInstance() != null) {
SmsManager.getInstance().stop();

Просмотреть файл

@ -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);
}
}
}

Просмотреть файл

@ -287,6 +287,7 @@ gbjar.sources += [
'home/TopSitesThumbnailView.java',
'home/TwoLinePageRow.java',
'InputMethods.java',
'IntentHelper.java',
'JavaAddonManager.java',
'LightweightTheme.java',
'LightweightThemeDrawable.java',

Просмотреть файл

@ -9,7 +9,16 @@ import java.util.UUID;
import org.json.JSONException;
import org.json.JSONObject;
import android.os.Bundle;
import android.util.Log;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.UUID;
public final class JSONUtils {
private static final String LOGTAG = "GeckoJSONUtils";
private JSONUtils() {}
public static UUID getUUID(String name, JSONObject json) {
@ -25,4 +34,21 @@ public final class JSONUtils {
throw new IllegalArgumentException(name + "=" + uuidString, e);
}
}
public static JSONObject bundleToJSON(Bundle bundle) {
if (bundle == null || bundle.isEmpty()) {
return null;
}
JSONObject json = new JSONObject();
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;
}
}