Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(151)

Unified Diff: shell/android/apk/src/org/chromium/mojo/shell/IntentReceiverRegistry.java

Issue 1061313003: Introduce intent manager. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Follow review Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: shell/android/apk/src/org/chromium/mojo/shell/IntentReceiverRegistry.java
diff --git a/shell/android/apk/src/org/chromium/mojo/shell/IntentReceiverRegistry.java b/shell/android/apk/src/org/chromium/mojo/shell/IntentReceiverRegistry.java
new file mode 100644
index 0000000000000000000000000000000000000000..ee4b5ac99e8842d7bdaa9dfd7898b71808ea6a1a
--- /dev/null
+++ b/shell/android/apk/src/org/chromium/mojo/shell/IntentReceiverRegistry.java
@@ -0,0 +1,84 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.mojo.shell;
+
+import android.content.Intent;
+import android.os.Parcel;
+
+import org.chromium.base.ApplicationStatus;
+import org.chromium.base.CalledByNative;
+import org.chromium.base.JNINamespace;
+
+import java.nio.ByteBuffer;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * Java helper class for services/android/intent_receiver.mojom. This class creates intents for
+ * privileged mojo applications and route received intent back to the mojo application. The
ppi 2015/04/08 11:10:10 s/received intent/received intents/
ppi 2015/04/08 11:10:10 s/route/routes/
qsr 2015/04/08 11:16:18 Done.
qsr 2015/04/08 11:16:18 Done.
+ * implementation of the IntentReceiverManager service is in C++, but calls back to this class to
+ * access the android framework.
+ */
+@JNINamespace("mojo::shell")
+public class IntentReceiverRegistry {
+ private static class LazyHolder {
+ private static final IntentReceiverRegistry INSTANCE = new IntentReceiverRegistry();
+ }
+
+ /**
+ * Returns the instance.
+ */
+ public static IntentReceiverRegistry getInstance() {
+ return LazyHolder.INSTANCE;
+ }
+
+ private final Map<String, Long> mReceiversByUuid = new HashMap<>();
+ private final Map<Long, String> mUuidsByReceiver = new HashMap<>();
+
+ private IntentReceiverRegistry() {}
+
+ public void onIntentReceived(Intent intent) {
+ String uuid = intent.getAction();
+ if (uuid == null) return;
+ Long ptr = mReceiversByUuid.get(uuid);
+ if (ptr == null) return;
+ nativeOnIntentReceived(ptr, intentToBuffer(intent));
+ }
+
+ private static ByteBuffer intentToBuffer(Intent intent) {
+ Parcel p = Parcel.obtain();
+ intent.writeToParcel(p, 0);
+ p.setDataPosition(0);
+ byte[] b = p.marshall();
+ ByteBuffer result = ByteBuffer.allocateDirect(b.length);
+ result.put(b);
+ result.flip();
+ return result;
+ }
+
+ @CalledByNative
+ private static ByteBuffer registerReceiver(long intentDispatcher) {
+ IntentReceiverRegistry registry = getInstance();
+ String uuid = UUID.randomUUID().toString();
+ Intent intent = new Intent(
+ uuid, null, ApplicationStatus.getApplicationContext(), IntentReceiverService.class);
+ registry.mReceiversByUuid.put(uuid, intentDispatcher);
+ registry.mUuidsByReceiver.put(intentDispatcher, uuid);
+ return intentToBuffer(intent);
+ }
+
+ @CalledByNative
+ private static void unregisterReceiver(long intentDispatcher) {
+ IntentReceiverRegistry registry = getInstance();
+ String uuid = registry.mUuidsByReceiver.get(intentDispatcher);
+ if (uuid != null) {
+ registry.mUuidsByReceiver.remove(intentDispatcher);
+ registry.mReceiversByUuid.remove(uuid);
+ }
+ }
+
+ private static native void nativeOnIntentReceived(long intentDispatcher, ByteBuffer intent);
+}

Powered by Google App Engine
This is Rietveld 408576698