1d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu/* 2d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu * Copyright (C) 2013 The Android Open Source Project 3d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu * 4d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu * Licensed under the Apache License, Version 2.0 (the "License"); 5d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu * you may not use this file except in compliance with the License. 6d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu * You may obtain a copy of the License at 7d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu * 8d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu * http://www.apache.org/licenses/LICENSE-2.0 9d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu * 10d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu * Unless required by applicable law or agreed to in writing, software 11d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu * distributed under the License is distributed on an "AS IS" BASIS, 12d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu * See the License for the specific language governing permissions and 14d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu * limitations under the License. 15d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu */ 16d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu 17d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescupackage com.android.gallery3d.ingest; 18d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu 19d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescuimport android.app.NotificationManager; 20d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescuimport android.app.PendingIntent; 21d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescuimport android.app.Service; 22d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescuimport android.content.Context; 23d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescuimport android.content.Intent; 24d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescuimport android.media.MediaScannerConnection; 25d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescuimport android.media.MediaScannerConnection.MediaScannerConnectionClient; 26d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescuimport android.mtp.MtpDevice; 27d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescuimport android.mtp.MtpDeviceInfo; 28d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescuimport android.mtp.MtpObjectInfo; 29d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescuimport android.net.Uri; 30d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescuimport android.os.Binder; 31d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescuimport android.os.IBinder; 32d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescuimport android.os.SystemClock; 33d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescuimport android.support.v4.app.NotificationCompat; 34d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescuimport android.util.SparseBooleanArray; 35d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescuimport android.widget.Adapter; 36d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu 37d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescuimport com.android.gallery3d.R; 38d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescuimport com.android.gallery3d.app.NotificationIds; 39d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescuimport com.android.gallery3d.data.MtpClient; 40d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescuimport com.android.gallery3d.util.BucketNames; 41384971f7ce93c98249825d0498ad4bcbd4104895Bobby Georgescuimport com.android.gallery3d.util.UsageStatistics; 42d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu 43d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescuimport java.util.ArrayList; 44d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescuimport java.util.Collection; 45d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescuimport java.util.List; 46d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu 47d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescupublic class IngestService extends Service implements ImportTask.Listener, 48d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu MtpDeviceIndex.ProgressListener, MtpClient.Listener { 49d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu 50d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu public class LocalBinder extends Binder { 51d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu IngestService getService() { 52d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu return IngestService.this; 53d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 54d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 55d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu 56d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu private static final int PROGRESS_UPDATE_INTERVAL_MS = 180; 57d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu 58d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu private static MtpClient sClient; 59d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu 60d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu private final IBinder mBinder = new LocalBinder(); 61d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu private ScannerClient mScannerClient; 62d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu private MtpDevice mDevice; 63d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu private String mDevicePrettyName; 64d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu private MtpDeviceIndex mIndex; 65d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu private IngestActivity mClientActivity; 66d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu private boolean mRedeliverImportFinish = false; 67384971f7ce93c98249825d0498ad4bcbd4104895Bobby Georgescu private int mRedeliverImportFinishCount = 0; 68d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu private Collection<MtpObjectInfo> mRedeliverObjectsNotImported; 69d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu private boolean mRedeliverNotifyIndexChanged = false; 70c8a9e86919dca8938948f97efc3dcbe143e806bfBobby Georgescu private boolean mRedeliverIndexFinish = false; 71d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu private NotificationManager mNotificationManager; 72d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu private NotificationCompat.Builder mNotificationBuilder; 73d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu private long mLastProgressIndexTime = 0; 7413fec90b6a03e21a88cb8b8425e65289904d4186Bobby Georgescu private boolean mNeedRelaunchNotification = false; 75d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu 76d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu @Override 77d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu public void onCreate() { 78d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu super.onCreate(); 79d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mScannerClient = new ScannerClient(this); 80d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 81d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mNotificationBuilder = new NotificationCompat.Builder(this); 82d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mNotificationBuilder.setSmallIcon(android.R.drawable.stat_notify_sync) // TODO drawable 83d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu .setContentIntent(PendingIntent.getActivity(this, 0, new Intent(this, IngestActivity.class), 0)); 84d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mIndex = MtpDeviceIndex.getInstance(); 85d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mIndex.setProgressListener(this); 86d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu 87d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu if (sClient == null) { 88d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu sClient = new MtpClient(getApplicationContext()); 89d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 90d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu List<MtpDevice> devices = sClient.getDeviceList(); 91d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu if (devices.size() > 0) { 92d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu setDevice(devices.get(0)); 93d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 94d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu sClient.addListener(this); 95d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 96d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu 97d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu @Override 98d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu public void onDestroy() { 99d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu sClient.removeListener(this); 100d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mIndex.unsetProgressListener(this); 101d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu super.onDestroy(); 102d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 103d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu 104d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu @Override 105d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu public IBinder onBind(Intent intent) { 106d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu return mBinder; 107d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 108d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu 109d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu private void setDevice(MtpDevice device) { 110d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu if (mDevice == device) return; 111d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mRedeliverImportFinish = false; 112d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mRedeliverObjectsNotImported = null; 113d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mRedeliverNotifyIndexChanged = false; 114c8a9e86919dca8938948f97efc3dcbe143e806bfBobby Georgescu mRedeliverIndexFinish = false; 115d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mDevice = device; 116d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mIndex.setDevice(mDevice); 117d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu if (mDevice != null) { 118d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu MtpDeviceInfo deviceInfo = mDevice.getDeviceInfo(); 119c8a9e86919dca8938948f97efc3dcbe143e806bfBobby Georgescu if (deviceInfo == null) { 120c8a9e86919dca8938948f97efc3dcbe143e806bfBobby Georgescu setDevice(null); 121c8a9e86919dca8938948f97efc3dcbe143e806bfBobby Georgescu return; 122c8a9e86919dca8938948f97efc3dcbe143e806bfBobby Georgescu } else { 123c8a9e86919dca8938948f97efc3dcbe143e806bfBobby Georgescu mDevicePrettyName = deviceInfo.getModel(); 124c8a9e86919dca8938948f97efc3dcbe143e806bfBobby Georgescu mNotificationBuilder.setContentTitle(mDevicePrettyName); 125c8a9e86919dca8938948f97efc3dcbe143e806bfBobby Georgescu new Thread(mIndex.getIndexRunnable()).start(); 126c8a9e86919dca8938948f97efc3dcbe143e806bfBobby Georgescu } 127d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } else { 128d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mDevicePrettyName = null; 129d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 130d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu if (mClientActivity != null) { 131d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mClientActivity.notifyIndexChanged(); 132d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } else { 133d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mRedeliverNotifyIndexChanged = true; 134d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 135d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 136d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu 137d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu protected MtpDeviceIndex getIndex() { 138d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu return mIndex; 139d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 140d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu 141d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu protected void setClientActivity(IngestActivity activity) { 142d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu if (mClientActivity == activity) return; 143d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mClientActivity = activity; 14413fec90b6a03e21a88cb8b8425e65289904d4186Bobby Georgescu if (mClientActivity == null) { 14513fec90b6a03e21a88cb8b8425e65289904d4186Bobby Georgescu if (mNeedRelaunchNotification) { 14613fec90b6a03e21a88cb8b8425e65289904d4186Bobby Georgescu mNotificationBuilder.setProgress(0, 0, false) 14713fec90b6a03e21a88cb8b8425e65289904d4186Bobby Georgescu .setContentText(getResources().getText(R.string.ingest_scanning_done)); 14813fec90b6a03e21a88cb8b8425e65289904d4186Bobby Georgescu mNotificationManager.notify(NotificationIds.INGEST_NOTIFICATION_SCANNING, 14913fec90b6a03e21a88cb8b8425e65289904d4186Bobby Georgescu mNotificationBuilder.build()); 15013fec90b6a03e21a88cb8b8425e65289904d4186Bobby Georgescu } 15113fec90b6a03e21a88cb8b8425e65289904d4186Bobby Georgescu return; 15213fec90b6a03e21a88cb8b8425e65289904d4186Bobby Georgescu } 153d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mNotificationManager.cancel(NotificationIds.INGEST_NOTIFICATION_IMPORTING); 154d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mNotificationManager.cancel(NotificationIds.INGEST_NOTIFICATION_SCANNING); 155d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu if (mRedeliverImportFinish) { 156384971f7ce93c98249825d0498ad4bcbd4104895Bobby Georgescu mClientActivity.onImportFinish(mRedeliverObjectsNotImported, 157384971f7ce93c98249825d0498ad4bcbd4104895Bobby Georgescu mRedeliverImportFinishCount); 158d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mRedeliverImportFinish = false; 159d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mRedeliverObjectsNotImported = null; 160d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 161d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu if (mRedeliverNotifyIndexChanged) { 162d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mClientActivity.notifyIndexChanged(); 163d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mRedeliverNotifyIndexChanged = false; 164d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 165c8a9e86919dca8938948f97efc3dcbe143e806bfBobby Georgescu if (mRedeliverIndexFinish) { 166c8a9e86919dca8938948f97efc3dcbe143e806bfBobby Georgescu mClientActivity.onIndexFinish(); 167c8a9e86919dca8938948f97efc3dcbe143e806bfBobby Georgescu mRedeliverIndexFinish = false; 168c8a9e86919dca8938948f97efc3dcbe143e806bfBobby Georgescu } 169d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 170d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu 171d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu protected void importSelectedItems(SparseBooleanArray selected, Adapter adapter) { 172d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu List<MtpObjectInfo> importHandles = new ArrayList<MtpObjectInfo>(); 173d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu for (int i = 0; i < selected.size(); i++) { 174d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu if (selected.valueAt(i)) { 175d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu Object item = adapter.getItem(selected.keyAt(i)); 176d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu if (item instanceof MtpObjectInfo) { 177d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu importHandles.add(((MtpObjectInfo) item)); 178d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 179d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 180d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 181d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu ImportTask task = new ImportTask(mDevice, importHandles, BucketNames.IMPORTED, this); 182d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu task.setListener(this); 183d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mNotificationBuilder.setProgress(0, 0, true) 184d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu .setContentText(getResources().getText(R.string.ingest_importing)); 185d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu startForeground(NotificationIds.INGEST_NOTIFICATION_IMPORTING, 186d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mNotificationBuilder.build()); 187d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu new Thread(task).start(); 188d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 189d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu 190d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu @Override 191d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu public void deviceAdded(MtpDevice device) { 192d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu if (mDevice == null) { 193d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu setDevice(device); 194384971f7ce93c98249825d0498ad4bcbd4104895Bobby Georgescu UsageStatistics.onEvent(UsageStatistics.COMPONENT_IMPORTER, 195384971f7ce93c98249825d0498ad4bcbd4104895Bobby Georgescu "DeviceConnected", null); 196d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 197d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 198d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu 199d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu @Override 200d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu public void deviceRemoved(MtpDevice device) { 201d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu if (device == mDevice) { 202d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu setDevice(null); 20313fec90b6a03e21a88cb8b8425e65289904d4186Bobby Georgescu mNeedRelaunchNotification = false; 204568a8cf9ec253a635a36866efc0e3acebbba2a2eBobby Georgescu mNotificationManager.cancel(NotificationIds.INGEST_NOTIFICATION_SCANNING); 205d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 206d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 207d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu 208d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu @Override 209d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu public void onImportProgress(int visitedCount, int totalCount, 210d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu String pathIfSuccessful) { 211d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu if (pathIfSuccessful != null) { 212d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mScannerClient.scanPath(pathIfSuccessful); 213d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 21413fec90b6a03e21a88cb8b8425e65289904d4186Bobby Georgescu mNeedRelaunchNotification = false; 215d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu if (mClientActivity != null) { 216d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mClientActivity.onImportProgress(visitedCount, totalCount, pathIfSuccessful); 217d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 218a7a73f3f8ea26835c376f38e75bcef12a25cac26Bobby Georgescu mNotificationBuilder.setProgress(totalCount, visitedCount, false) 219a7a73f3f8ea26835c376f38e75bcef12a25cac26Bobby Georgescu .setContentText(getResources().getText(R.string.ingest_importing)); 220a7a73f3f8ea26835c376f38e75bcef12a25cac26Bobby Georgescu mNotificationManager.notify(NotificationIds.INGEST_NOTIFICATION_IMPORTING, 221a7a73f3f8ea26835c376f38e75bcef12a25cac26Bobby Georgescu mNotificationBuilder.build()); 222d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 223d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu 224d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu @Override 225384971f7ce93c98249825d0498ad4bcbd4104895Bobby Georgescu public void onImportFinish(Collection<MtpObjectInfo> objectsNotImported, 226384971f7ce93c98249825d0498ad4bcbd4104895Bobby Georgescu int visitedCount) { 227c8a9e86919dca8938948f97efc3dcbe143e806bfBobby Georgescu stopForeground(true); 22813fec90b6a03e21a88cb8b8425e65289904d4186Bobby Georgescu mNeedRelaunchNotification = true; 229d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu if (mClientActivity != null) { 230384971f7ce93c98249825d0498ad4bcbd4104895Bobby Georgescu mClientActivity.onImportFinish(objectsNotImported, visitedCount); 231d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } else { 232d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mRedeliverImportFinish = true; 233d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mRedeliverObjectsNotImported = objectsNotImported; 234384971f7ce93c98249825d0498ad4bcbd4104895Bobby Georgescu mRedeliverImportFinishCount = visitedCount; 235d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mNotificationBuilder.setProgress(0, 0, false) 236d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu .setContentText(getResources().getText(R.string.import_complete)); 237d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mNotificationManager.notify(NotificationIds.INGEST_NOTIFICATION_IMPORTING, 238d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mNotificationBuilder.build()); 239d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 240384971f7ce93c98249825d0498ad4bcbd4104895Bobby Georgescu UsageStatistics.onEvent(UsageStatistics.COMPONENT_IMPORTER, 241384971f7ce93c98249825d0498ad4bcbd4104895Bobby Georgescu "ImportFinished", null, visitedCount); 242d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 243d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu 244d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu @Override 245d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu public void onObjectIndexed(MtpObjectInfo object, int numVisited) { 24613fec90b6a03e21a88cb8b8425e65289904d4186Bobby Georgescu mNeedRelaunchNotification = false; 247d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu if (mClientActivity != null) { 248d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mClientActivity.onObjectIndexed(object, numVisited); 249d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } else { 250d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu // Throttle the updates to one every PROGRESS_UPDATE_INTERVAL_MS milliseconds 251d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu long currentTime = SystemClock.uptimeMillis(); 252d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu if (currentTime > mLastProgressIndexTime + PROGRESS_UPDATE_INTERVAL_MS) { 253d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mLastProgressIndexTime = currentTime; 254d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mNotificationBuilder.setProgress(0, numVisited, true) 255d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu .setContentText(getResources().getText(R.string.ingest_scanning)); 256d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mNotificationManager.notify(NotificationIds.INGEST_NOTIFICATION_SCANNING, 257d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mNotificationBuilder.build()); 258d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 259d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 260d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 261d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu 262d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu @Override 263d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu public void onSorting() { 264d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu if (mClientActivity != null) mClientActivity.onSorting(); 265d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 266d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu 267d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu @Override 268d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu public void onIndexFinish() { 26913fec90b6a03e21a88cb8b8425e65289904d4186Bobby Georgescu mNeedRelaunchNotification = true; 270d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu if (mClientActivity != null) { 271d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mClientActivity.onIndexFinish(); 272d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } else { 273d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mNotificationBuilder.setProgress(0, 0, false) 274d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu .setContentText(getResources().getText(R.string.ingest_scanning_done)); 275d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mNotificationManager.notify(NotificationIds.INGEST_NOTIFICATION_SCANNING, 276d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mNotificationBuilder.build()); 277c8a9e86919dca8938948f97efc3dcbe143e806bfBobby Georgescu mRedeliverIndexFinish = true; 278d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 279d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 280d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu 281d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu // Copied from old Gallery3d code 282d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu private static final class ScannerClient implements MediaScannerConnectionClient { 283d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu ArrayList<String> mPaths = new ArrayList<String>(); 284d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu MediaScannerConnection mScannerConnection; 285d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu boolean mConnected; 286d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu Object mLock = new Object(); 287d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu 288d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu public ScannerClient(Context context) { 289d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mScannerConnection = new MediaScannerConnection(context, this); 290d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 291d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu 292d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu public void scanPath(String path) { 293d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu synchronized (mLock) { 294d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu if (mConnected) { 295d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mScannerConnection.scanFile(path, null); 296d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } else { 297d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mPaths.add(path); 298d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mScannerConnection.connect(); 299d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 300d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 301d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 302d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu 303d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu @Override 304d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu public void onMediaScannerConnected() { 305d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu synchronized (mLock) { 306d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mConnected = true; 307d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu if (!mPaths.isEmpty()) { 308d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu for (String path : mPaths) { 309d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mScannerConnection.scanFile(path, null); 310d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 311d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu mPaths.clear(); 312d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 313d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 314d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 315d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu 316d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu @Override 317d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu public void onScanCompleted(String path, Uri uri) { 318d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 319d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu } 320d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu} 321