Index: services/camera_roll/src/org/chromium/services/camera_roll/CameraRollApp.java |
diff --git a/services/camera_roll/src/org/chromium/services/camera_roll/CameraRollApp.java b/services/camera_roll/src/org/chromium/services/camera_roll/CameraRollApp.java |
deleted file mode 100644 |
index 07ea0741ff764423e2b44b95818be3153914da7e..0000000000000000000000000000000000000000 |
--- a/services/camera_roll/src/org/chromium/services/camera_roll/CameraRollApp.java |
+++ /dev/null |
@@ -1,253 +0,0 @@ |
-// 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.services.camera_roll; |
- |
-import android.content.Context; |
-import android.os.Environment; |
-import android.util.Log; |
-import android.webkit.MimeTypeMap; |
- |
-import org.chromium.mojo.application.ApplicationConnection; |
-import org.chromium.mojo.application.ApplicationDelegate; |
-import org.chromium.mojo.application.ApplicationRunner; |
-import org.chromium.mojo.application.ServiceFactoryBinder; |
-import org.chromium.mojo.bindings.InterfaceRequest; |
-import org.chromium.mojo.system.Core; |
-import org.chromium.mojo.system.DataPipe; |
-import org.chromium.mojo.system.MessagePipeHandle; |
-import org.chromium.mojo.system.MojoException; |
-import org.chromium.mojo.system.MojoResult; |
-import org.chromium.mojo.system.Pair; |
-import org.chromium.mojom.mojo.CameraRollService; |
-import org.chromium.mojom.mojo.Photo; |
-import org.chromium.mojom.mojo.Shell; |
- |
-import java.io.File; |
-import java.io.FileInputStream; |
-import java.io.IOException; |
-import java.io.UnsupportedEncodingException; |
-import java.math.BigInteger; |
-import java.nio.ByteBuffer; |
-import java.nio.channels.FileChannel; |
-import java.security.MessageDigest; |
-import java.security.NoSuchAlgorithmException; |
-import java.util.ArrayList; |
-import java.util.Collections; |
-import java.util.Comparator; |
-import java.util.concurrent.Executor; |
-import java.util.concurrent.ExecutorService; |
-import java.util.concurrent.Executors; |
- |
-/** |
- * Implementation of org.chromium.mojom.mojo.CameraRollService. |
- */ |
-class CameraRollServiceImpl implements CameraRollService { |
- private static final String TAG = "CameraRollServiceImpl"; |
- |
- private final Core mCore; |
- private final Executor mExecutor; |
- private ArrayList<File> mPhotos; |
- |
- class CopyToPipeJob implements Runnable { |
- private static final String TAG = "CopyToPipeJob"; |
- |
- private final File mPhotoFile; |
- private DataPipe.ProducerHandle mProducer; |
- |
- CopyToPipeJob(File photoFile, DataPipe.ProducerHandle producerHandle) { |
- mPhotoFile = photoFile; |
- mProducer = producerHandle; |
- } |
- |
- @Override |
- public void run() { |
- try (FileInputStream fileInputStream = new FileInputStream(mPhotoFile); |
- FileChannel channel = fileInputStream.getChannel()) { |
- int bytesRead = 0; |
- do { |
- try { |
- ByteBuffer buffer = mProducer.beginWriteData(0, DataPipe.WriteFlags.none()); |
- bytesRead = channel.read(buffer); |
- mProducer.endWriteData(bytesRead == -1 ? 0 : bytesRead); |
- } catch (MojoException e) { |
- if (e.getMojoResult() == MojoResult.SHOULD_WAIT) { |
- mCore.wait( |
- mProducer, Core.HandleSignals.WRITABLE, Core.DEADLINE_INFINITE); |
- } else if (e.getMojoResult() == MojoResult.FAILED_PRECONDITION) { |
- break; |
- } else { |
- throw e; |
- } |
- } |
- } while (bytesRead != -1); |
- } catch (IOException e) { |
- Log.e(TAG, e.toString()); |
- } finally { |
- mProducer.close(); |
- } |
- } |
- } |
- |
- CameraRollServiceImpl(Core core, Executor executor) { |
- mCore = core; |
- mExecutor = executor; |
- constructPhotoGallery(); |
- } |
- |
- /** |
- * Updates the list from which |getPhoto| returns its result. |
- * |
- * @see org.chromium.mojom.mojo.CameraRollService#update() |
- */ |
- @Override |
- public void update() { |
- constructPhotoGallery(); |
- } |
- |
- /** |
- * Returns the number of photos available in the camera roll. |
- * |
- * @see org.chromium.mojom.mojo.CameraRollService#getCount(CountResponse) |
- */ |
- @Override |
- public void getCount(CameraRollService.GetCountResponse callback) { |
- callback.call(mPhotos.size()); |
- } |
- |
- /** |
- * Returns the photo from the current snapshot of the camera roll at the |
- * requested index. |
- * |
- * @see org.chromium.mojom.mojo.CameraRollService#getPhoto(int, GetNextPhotoResponse) |
- */ |
- @Override |
- public void getPhoto(int index, CameraRollService.GetPhotoResponse callback) { |
- if (index >= mPhotos.size()) { |
- callback.call(null); |
- return; |
- } |
- |
- File photoFile = mPhotos.get(index); |
- |
- Photo photo = new Photo(); |
- |
- try { |
- String uniqueId = Long.toString(photoFile.lastModified()) + photoFile.getPath(); |
- MessageDigest md = MessageDigest.getInstance("SHA-256"); |
- md.update(uniqueId.getBytes("UTF-8")); |
- byte[] hash = md.digest(); |
- BigInteger bigInt = new BigInteger(1, hash); |
- photo.uniqueId = bigInt.toString(16); |
- } catch (NoSuchAlgorithmException e) { |
- Log.e(TAG, e.toString()); |
- } catch (UnsupportedEncodingException e) { |
- Log.e(TAG, e.toString()); |
- } |
- |
- Pair<DataPipe.ProducerHandle, DataPipe.ConsumerHandle> handles = mCore.createDataPipe(null); |
- |
- photo.content = handles.second; |
- |
- callback.call(photo); |
- mExecutor.execute(new CopyToPipeJob(photoFile, handles.first)); |
- } |
- |
- private void constructPhotoGallery() { |
- mPhotos = new ArrayList<File>(); |
- File dcimDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); |
- findAllImageFiles(dcimDir, mPhotos); |
- Collections.sort(mPhotos, Collections.reverseOrder(new Comparator<File>() { |
- public int compare(File f1, File f2) { |
- return Long.compare(f1.lastModified(), f2.lastModified()); |
- } |
- })); |
- } |
- |
- private void findAllImageFiles(File rootDir, ArrayList<File> outputImageFiles) { |
- for (File file : rootDir.listFiles()) { |
- if (file.isHidden()) { |
- continue; |
- } |
- if (file.isDirectory()) { |
- findAllImageFiles(file, outputImageFiles); |
- } |
- if (file.isFile()) { |
- String extension = MimeTypeMap.getFileExtensionFromUrl(file.toURI().toString()); |
- if (extension != null) { |
- String type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); |
- if (type != null && type.contains("image")) { |
- outputImageFiles.add(file); |
- } |
- } |
- } |
- } |
- } |
- |
- /** |
- * When connection is closed, we stop receiving location updates. |
- * |
- * @see org.chromium.mojo.bindings.Interface#close() |
- */ |
- @Override |
- public void close() {} |
- |
- /** |
- * @see org.chromium.mojo.bindings.Interface#onConnectionError(MojoException) |
- */ |
- @Override |
- public void onConnectionError(MojoException e) {} |
-} |
- |
-/** |
- * Android application for running the |CameraRollService|. |
- */ |
-public class CameraRollApp implements ApplicationDelegate { |
- private final Core mCore; |
- private final ExecutorService mThreadPool; |
- |
- CameraRollApp(Core core) { |
- mCore = core; |
- mThreadPool = Executors.newCachedThreadPool(); |
- } |
- |
- /** |
- * @see ApplicationDelegate#initialize(Shell, String[], String) |
- */ |
- |
- @Override |
- public void initialize(Shell shell, String[] args, String url) {} |
- /** |
- * @see ApplicationDelegate#configureIncomingConnection(ApplicationConnection) |
- */ |
- @Override |
- public boolean configureIncomingConnection(ApplicationConnection connection) { |
- connection.addService(new ServiceFactoryBinder<CameraRollService>() { |
- @Override |
- public void bind(InterfaceRequest<CameraRollService> request) { |
- CameraRollService.MANAGER.bind( |
- new CameraRollServiceImpl(mCore, mThreadPool), request); |
- } |
- |
- @Override |
- public String getInterfaceName() { |
- return CameraRollService.MANAGER.getName(); |
- } |
- }); |
- return true; |
- } |
- |
- /** |
- * @see ApplicationDelegate#quit() |
- */ |
- @Override |
- public void quit() { |
- mThreadPool.shutdown(); |
- } |
- |
- public static void mojoMain( |
- Context context, Core core, MessagePipeHandle applicationRequestHandle) { |
- ApplicationRunner.run(new CameraRollApp(core), core, applicationRequestHandle); |
- } |
-} |