OSDN Git Service

First pass at the url rendering service.
authorPatrick Scott <phanna@android.com>
Thu, 14 Jan 2010 20:11:42 +0000 (15:11 -0500)
committerPatrick Scott <phanna@android.com>
Thu, 28 Jan 2010 13:27:42 +0000 (08:27 -0500)
The service renders a list of urls at the given dimension and invokes the
callback interface for each result. A ParcelFileDescriptor is used to transfer
the large image data to the client. The client must close the file descriptor
is order free the underlying resources.

A more robust api will use UrlRendererRequest and UrlRendererResponse objects
to transfer data.

Android.mk
core/java/android/service/urlrenderer/IUrlRendererCallback.aidl [new file with mode: 0644]
core/java/android/service/urlrenderer/IUrlRendererService.aidl [new file with mode: 0644]
core/java/android/service/urlrenderer/UrlRenderer.java [new file with mode: 0644]
core/java/android/service/urlrenderer/UrlRendererService.java [new file with mode: 0644]

index 7520afe..7cd482c 100644 (file)
@@ -119,6 +119,8 @@ LOCAL_SRC_FILES += \
        core/java/android/os/IPowerManager.aidl \
     core/java/android/os/IRemoteCallback.aidl \
        core/java/android/os/IVibratorService.aidl \
+       core/java/android/service/urlrenderer/IUrlRendererService.aidl \
+       core/java/android/service/urlrenderer/IUrlRendererCallback.aidl \
     core/java/android/service/wallpaper/IWallpaperConnection.aidl \
     core/java/android/service/wallpaper/IWallpaperEngine.aidl \
     core/java/android/service/wallpaper/IWallpaperService.aidl \
diff --git a/core/java/android/service/urlrenderer/IUrlRendererCallback.aidl b/core/java/android/service/urlrenderer/IUrlRendererCallback.aidl
new file mode 100644 (file)
index 0000000..004aca7
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.service.urlrenderer;
+
+import android.os.ParcelFileDescriptor;
+
+/**
+ * {@hide}
+ */
+oneway interface IUrlRendererCallback {
+    void complete(String url, in ParcelFileDescriptor result);
+}
diff --git a/core/java/android/service/urlrenderer/IUrlRendererService.aidl b/core/java/android/service/urlrenderer/IUrlRendererService.aidl
new file mode 100644 (file)
index 0000000..d561fdc
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.service.urlrenderer;
+
+import android.service.urlrenderer.IUrlRendererCallback;
+
+/**
+ * {@hide}
+ */
+interface IUrlRendererService {
+    void render(in List<String> urls, int width, int height,
+            IUrlRendererCallback cb);
+}
diff --git a/core/java/android/service/urlrenderer/UrlRenderer.java b/core/java/android/service/urlrenderer/UrlRenderer.java
new file mode 100644 (file)
index 0000000..6057d6c
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.service.urlrenderer;
+
+import android.os.IBinder;
+import android.os.ParcelFileDescriptor;
+import android.os.RemoteException;
+
+import java.util.List;
+
+/**
+ * TODO(phanna): Document this class.
+ * {@hide} while developing
+ */
+public final class UrlRenderer {
+    /**
+     * Interface for clients to receive the result of calls to
+     * {@link UrlRenderer#render}.
+     * {@hide} while developing
+     */
+    public interface Callback {
+        /**
+         * Calls to {@link render} will result in multiple invokations of this
+         * method for each url.  A null result means that there was a server
+         * error or a problem rendering the url.
+         * @param url  The url that has been rendered.
+         * @param result  A ParcelFileDescriptor containing the encoded image
+         *                data. The client is responsible for closing the stream
+         *                to free resources.  A null result indicates a failure
+         *                to render.
+         */
+        public void complete(String url, ParcelFileDescriptor result);
+    }
+
+    private IUrlRendererService mService;
+
+    /**
+     * Create a new UrlRenderer to remotely render urls.
+     * @param service  An IBinder service usually obtained through
+     *                 {@link ServiceConnection#onServiceConnected}
+     */
+    public UrlRenderer(IBinder service) {
+        mService = IUrlRendererService.Stub.asInterface(service);
+    }
+
+    private static class InternalCallback extends IUrlRendererCallback.Stub {
+        private final Callback mCallback;
+        InternalCallback(Callback cb) {
+            mCallback = cb;
+        }
+
+        public void complete(String url, ParcelFileDescriptor result) {
+            mCallback.complete(url, result);
+        }
+    }
+
+    /**
+     * Render the list of <var>urls</var> and invoke the <var>callback</var>
+     * for each result.
+     * @param urls  A List of urls to render.
+     * @param width  The desired width of the result.
+     * @param height  The desired height of the result.
+     * @param callback  An instance of {@link Callback} invoked for each url.
+     */
+    public void render(List<String> urls, int width, int height,
+            Callback callback) {
+        if (mService != null) {
+            try {
+                mService.render(urls, width, height,
+                        new InternalCallback(callback));
+            } catch (RemoteException ex) {
+            }
+        }
+    }
+}
diff --git a/core/java/android/service/urlrenderer/UrlRendererService.java b/core/java/android/service/urlrenderer/UrlRendererService.java
new file mode 100644 (file)
index 0000000..f7bf7d7
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.service.urlrenderer;
+
+import android.annotation.SdkConstant;
+import android.annotation.SdkConstant.SdkConstantType;
+import android.app.Service;
+import android.os.ParcelFileDescriptor;
+import android.os.RemoteException;
+
+import java.util.List;
+
+/**
+ * TODO(phanna): Complete documentation.
+ * {@hide} while developing
+ */
+public abstract class UrlRendererService extends Service {
+    /**
+     * The {@link Intent} that must be declared as handled by the service.
+     */
+    @SdkConstant(SdkConstantType.SERVICE_ACTION)
+    public static final String SERVICE_INTERFACE =
+            "android.service.urlrenderer.UrlRendererService";
+
+    static final String TAG = "UrlRendererService";
+
+    private static class InternalCallback implements UrlRenderer.Callback {
+        private final IUrlRendererCallback mCallback;
+        InternalCallback(IUrlRendererCallback cb) {
+            mCallback = cb;
+        }
+
+        public void complete(String url, ParcelFileDescriptor result) {
+            try {
+                mCallback.complete(url, result);
+            } catch (RemoteException ex) {
+            }
+        }
+    }
+
+    private final IUrlRendererService.Stub mBinderInterface =
+            new IUrlRendererService.Stub() {
+                public void render(List<String> urls, int width, int height,
+                        IUrlRendererCallback cb) {
+                    processRequest(urls, width, height,
+                            new InternalCallback(cb));
+                }
+            };
+
+    /**
+     * Implement to return the implementation of the internal accessibility
+     * service interface.  Subclasses should not override.
+     */
+    @Override
+    public final android.os.IBinder onBind(android.content.Intent intent) {
+        return mBinderInterface;
+    }
+
+    /**
+     * When all clients unbind from the service, stop the service.  Subclasses
+     * should not override.
+     */
+    @Override
+    public final boolean onUnbind(android.content.Intent intent) {
+        stopSelf();
+        return false;
+    }
+
+    /**
+     * Subclasses implement this function to process the given urls.  When each
+     * url is complete, the subclass must invoke the callback with the result.
+     * @param urls  A list of urls to render at the given dimensions.
+     * @param width  The desired width of the result.
+     * @param height  The desired height of the result.
+     * @param cb  The callback to invoke when each url is complete.
+     */
+    public abstract void processRequest(List<String> urls, int width,
+            int height, UrlRenderer.Callback cb);
+}