| Index: chrome/android/java/src/org/chromium/chrome/browser/photo_picker/DecoderServiceHost.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/DecoderServiceHost.java b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/DecoderServiceHost.java
|
| deleted file mode 100644
|
| index ae83641d55fa713814cf056836969bc6a8377405..0000000000000000000000000000000000000000
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/DecoderServiceHost.java
|
| +++ /dev/null
|
| @@ -1,294 +0,0 @@
|
| -// Copyright 2017 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.chrome.browser.photo_picker;
|
| -
|
| -import android.content.ComponentName;
|
| -import android.content.Context;
|
| -import android.content.Intent;
|
| -import android.content.ServiceConnection;
|
| -import android.graphics.Bitmap;
|
| -import android.os.Bundle;
|
| -import android.os.Handler;
|
| -import android.os.IBinder;
|
| -import android.os.Message;
|
| -import android.os.Messenger;
|
| -import android.os.ParcelFileDescriptor;
|
| -import android.os.RemoteException;
|
| -import android.os.StrictMode;
|
| -
|
| -import org.chromium.base.Log;
|
| -
|
| -import java.io.File;
|
| -import java.io.FileDescriptor;
|
| -import java.io.FileInputStream;
|
| -import java.io.IOException;
|
| -import java.lang.ref.WeakReference;
|
| -import java.util.LinkedHashMap;
|
| -
|
| -/**
|
| - * A class to communicate with the {@link DecoderService}.
|
| - */
|
| -public class DecoderServiceHost {
|
| - // A tag for logging error messages.
|
| - private static final String TAG = "ImageDecoderHost";
|
| -
|
| - /**
|
| - * Interface for notifying clients of the service being ready.
|
| - */
|
| - public interface ServiceReadyCallback {
|
| - /**
|
| - * A function to define to receive a notification once the service is up and running.
|
| - */
|
| - void serviceReady();
|
| - }
|
| -
|
| - /**
|
| - * An interface notifying clients when an image has finished decoding.
|
| - */
|
| - public interface ImageDecodedCallback {
|
| - /**
|
| - * A function to define to receive a notification that an image has been decoded.
|
| - * @param filePath The file path for the newly decoded image.
|
| - * @param bitmap The results of the decoding (or placeholder image, if failed).
|
| - */
|
| - void imageDecodedCallback(String filePath, Bitmap bitmap);
|
| - }
|
| -
|
| - /**
|
| - * Class for interacting with the main interface of the service.
|
| - */
|
| - private class DecoderServiceConnection implements ServiceConnection {
|
| - // The callback to use to notify the service being ready.
|
| - private ServiceReadyCallback mCallback;
|
| -
|
| - public DecoderServiceConnection(ServiceReadyCallback callback) {
|
| - mCallback = callback;
|
| - }
|
| -
|
| - // Called when a connection to the service has been established.
|
| - public void onServiceConnected(ComponentName name, IBinder service) {
|
| - mService = new Messenger(service);
|
| - mBound = true;
|
| - mCallback.serviceReady();
|
| - }
|
| -
|
| - // Called when a connection to the service has been lost.
|
| - public void onServiceDisconnected(ComponentName name) {
|
| - mBound = false;
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Class for keeping track of the data involved with each request.
|
| - */
|
| - private static class DecoderServiceParams {
|
| - // The path to the file containing the bitmap to decode.
|
| - public String mFilePath;
|
| -
|
| - // The requested size (width and height) of the bitmap, once decoded.
|
| - public int mSize;
|
| -
|
| - // The callback to use to communicate the results of the decoding.
|
| - ImageDecodedCallback mCallback;
|
| -
|
| - public DecoderServiceParams(String filePath, int size, ImageDecodedCallback callback) {
|
| - mFilePath = filePath;
|
| - mSize = size;
|
| - mCallback = callback;
|
| - }
|
| - }
|
| -
|
| - // Map of file paths to decoder parameters in order of request.
|
| - private LinkedHashMap<String, DecoderServiceParams> mRequests = new LinkedHashMap<>();
|
| - LinkedHashMap<String, DecoderServiceParams> getRequests() {
|
| - return mRequests;
|
| - }
|
| -
|
| - // The callback used to notify the client when the service is ready.
|
| - private ServiceReadyCallback mCallback;
|
| -
|
| - // Messenger for communicating with the remote service.
|
| - Messenger mService = null;
|
| -
|
| - // Our service connection to the {@link DecoderService}.
|
| - private DecoderServiceConnection mConnection;
|
| -
|
| - // Flag indicating whether we are bound to the service.
|
| - boolean mBound;
|
| -
|
| - // The inbound messenger used by the remote service to communicate with us.
|
| - final Messenger mMessenger = new Messenger(new IncomingHandler(this));
|
| -
|
| - /**
|
| - * The DecoderServiceHost constructor.
|
| - * @param callback The callback to use when communicating back to the client.
|
| - */
|
| - public DecoderServiceHost(ServiceReadyCallback callback) {
|
| - mCallback = callback;
|
| - }
|
| -
|
| - /**
|
| - * Initiate binding with the {@link DecoderService}.
|
| - * @param context The context to use.
|
| - */
|
| - public void bind(Context context) {
|
| - mConnection = new DecoderServiceConnection(mCallback);
|
| - Intent intent = new Intent(context, DecoderService.class);
|
| - context.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
|
| - }
|
| -
|
| - /**
|
| - * Unbind from the {@link DecoderService}.
|
| - * @param context The context to use.
|
| - */
|
| - public void unbind(Context context) {
|
| - if (mBound) {
|
| - context.unbindService(mConnection);
|
| - mBound = false;
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Accepts a request to decode a single image. Queues up the request and reports back
|
| - * asynchronously on |callback|.
|
| - * @param filePath The path to the file to decode.
|
| - * @param size The requested size (width and height) of the resulting bitmap.
|
| - * @param callback The callback to use to communicate the decoding results.
|
| - */
|
| - public void decodeImage(String filePath, int size, ImageDecodedCallback callback) {
|
| - DecoderServiceParams params = new DecoderServiceParams(filePath, size, callback);
|
| - mRequests.put(filePath, params);
|
| - if (mRequests.size() == 1) dispatchNextDecodeImageRequest();
|
| - }
|
| -
|
| - /**
|
| - * Dispatches the next image for decoding (from the queue).
|
| - */
|
| - private void dispatchNextDecodeImageRequest() {
|
| - if (mRequests.entrySet().iterator().hasNext()) {
|
| - DecoderServiceParams params = mRequests.entrySet().iterator().next().getValue();
|
| - dispatchDecodeImageRequest(params.mFilePath, params.mSize);
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Ties up all the loose ends from the decoding request (communicates the results of the
|
| - * decoding process back to the client, and takes care of house-keeping chores regarding
|
| - * the request queue).
|
| - * @param filePath The path to the image that was just decoded.
|
| - * @param bitmap The resulting decoded bitmap.
|
| - */
|
| - public void closeRequest(String filePath, Bitmap bitmap) {
|
| - DecoderServiceParams params = getRequests().get(filePath);
|
| - if (params != null) {
|
| - params.mCallback.imageDecodedCallback(filePath, bitmap);
|
| - getRequests().remove(filePath);
|
| - }
|
| - dispatchNextDecodeImageRequest();
|
| - }
|
| -
|
| - /**
|
| - * Communicates with the server to decode a single bitmap.
|
| - * @param filePath The path to the image on disk.
|
| - * @param size The requested width and height of the resulting bitmap.
|
| - */
|
| - private void dispatchDecodeImageRequest(String filePath, int size) {
|
| - // Obtain a file descriptor to send over to the sandboxed process.
|
| - File file = new File(filePath);
|
| - FileInputStream inputFile = null;
|
| - ParcelFileDescriptor pfd = null;
|
| - Bundle bundle = new Bundle();
|
| -
|
| - // The restricted utility process can't open the file to read the
|
| - // contents, so we need to obtain a file descriptor to pass over.
|
| - StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
|
| - try {
|
| - try {
|
| - inputFile = new FileInputStream(file);
|
| - FileDescriptor fd = inputFile.getFD();
|
| - pfd = ParcelFileDescriptor.dup(fd);
|
| - bundle.putParcelable(DecoderService.KEY_FILE_DESCRIPTOR, pfd);
|
| - } catch (IOException e) {
|
| - Log.e(TAG, "Unable to obtain FileDescriptor: " + e);
|
| - closeRequest(filePath, null);
|
| - }
|
| - } finally {
|
| - try {
|
| - if (inputFile != null) inputFile.close();
|
| - } catch (IOException e) {
|
| - Log.e(TAG, "Unable to close inputFile: " + e);
|
| - }
|
| - StrictMode.setThreadPolicy(oldPolicy);
|
| - }
|
| -
|
| - if (pfd == null) return;
|
| -
|
| - // Prepare and send the data over.
|
| - Message payload = Message.obtain(null, DecoderService.MSG_DECODE_IMAGE);
|
| - payload.replyTo = mMessenger;
|
| - bundle.putString(DecoderService.KEY_FILE_PATH, filePath);
|
| - bundle.putInt(DecoderService.KEY_SIZE, size);
|
| - payload.setData(bundle);
|
| - try {
|
| - mService.send(payload);
|
| - pfd.close();
|
| - } catch (RemoteException e) {
|
| - Log.e(TAG, "Communications failed (Remote): " + e);
|
| - closeRequest(filePath, null);
|
| - } catch (IOException e) {
|
| - Log.e(TAG, "Communications failed (IO): " + e);
|
| - closeRequest(filePath, null);
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Cancels a request to decode an image (if it hasn't already been dispatched).
|
| - * @param filePath The path to the image to cancel decoding.
|
| - */
|
| - public void cancelDecodeImage(String filePath) {
|
| - mRequests.remove(filePath);
|
| - }
|
| -
|
| - /**
|
| - * A class for handling communications from the service to us.
|
| - */
|
| - static class IncomingHandler extends Handler {
|
| - // The DecoderServiceHost object to communicate with.
|
| - private final WeakReference<DecoderServiceHost> mHost;
|
| -
|
| - /**
|
| - * Constructor for IncomingHandler.
|
| - * @param host The DecoderServiceHost object to communicate with.
|
| - */
|
| - IncomingHandler(DecoderServiceHost host) {
|
| - mHost = new WeakReference<DecoderServiceHost>(host);
|
| - }
|
| -
|
| - @Override
|
| - public void handleMessage(Message msg) {
|
| - DecoderServiceHost host = mHost.get();
|
| - if (host == null) {
|
| - super.handleMessage(msg);
|
| - return;
|
| - }
|
| -
|
| - switch (msg.what) {
|
| - case DecoderService.MSG_IMAGE_DECODED_REPLY:
|
| - Bundle payload = msg.getData();
|
| -
|
| - // Read the reply back from the service.
|
| - String filePath = payload.getString(DecoderService.KEY_FILE_PATH);
|
| - Boolean success = payload.getBoolean(DecoderService.KEY_SUCCESS);
|
| - Bitmap bitmap = success
|
| - ? (Bitmap) payload.getParcelable(DecoderService.KEY_IMAGE_BITMAP)
|
| - : null;
|
| - host.closeRequest(filePath, bitmap);
|
| - break;
|
| - default:
|
| - super.handleMessage(msg);
|
| - }
|
| - }
|
| - }
|
| -}
|
|
|