Open the connected device in Files app when tapping notification.

Previously when tapping the MTP devce notification, MtpDocumentsProvider
opens home direcotry in Files app. The CL adds data URI of connected
device to the intent so that MtpDocumentsProvider can open the connected
device's root in Files app.

BUG=26611224
Change-Id: I97ecd6669852cd2fc875294cbcbf5660fbfaa0da
This commit is contained in:
Daichi Hirono
2016-02-11 10:08:21 -08:00
parent db338c2e90
commit 1e3744441a
3 changed files with 51 additions and 9 deletions

View File

@@ -342,6 +342,26 @@ class MtpDatabase {
}
}
String getDeviceDocumentId(int deviceId) throws FileNotFoundException {
try (final Cursor cursor = mDatabase.query(
TABLE_DOCUMENTS,
strings(Document.COLUMN_DOCUMENT_ID),
COLUMN_DEVICE_ID + " = ? AND " + COLUMN_DOCUMENT_TYPE + " = ? AND " +
COLUMN_ROW_STATE + " != ?",
strings(deviceId, DOCUMENT_TYPE_DEVICE, ROW_STATE_DISCONNECTED),
null,
null,
null,
"1")) {
if (cursor.getCount() > 0) {
cursor.moveToNext();
return cursor.getString(0);
} else {
throw new FileNotFoundException("The device ID not found: " + deviceId);
}
}
}
/**
* Adds new document under the parent.
* The method does not affect invalidated and pending documents because we know the document is

View File

@@ -349,6 +349,16 @@ public class MtpDocumentsProvider extends DocumentsProvider {
}
}
/**
* Obtains document ID for the given device ID.
* @param deviceId
* @return document ID
* @throws FileNotFoundException device ID has not been build.
*/
public String getDeviceDocumentId(int deviceId) throws FileNotFoundException {
return mDatabase.getDeviceDocumentId(deviceId);
}
/**
* Resumes root scanner to handle the update of device list.
*/

View File

@@ -17,10 +17,15 @@
package com.android.mtp;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.DocumentsContract;
import android.util.Log;
import java.io.IOException;
/**
* Invisible activity to receive intents.
@@ -33,14 +38,21 @@ public class ReceiverActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(getIntent().getAction())) {
// TODO: To obtain data URI for the attached device, we need to wait until RootScanner
// found the device and add it to database. Set correct root URI, and use ACTION_BROWSE
// to launch Documents UI.
final Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setComponent(new ComponentName(
"com.android.documentsui", "com.android.documentsui.LauncherActivity"));
this.startActivity(intent);
final UsbDevice device = getIntent().getParcelableExtra(UsbManager.EXTRA_DEVICE);
try {
final MtpDocumentsProvider provider = MtpDocumentsProvider.getInstance();
provider.openDevice(device.getDeviceId());
final String deviceRootId = provider.getDeviceDocumentId(device.getDeviceId());
final Uri uri = DocumentsContract.buildRootUri(
MtpDocumentsProvider.AUTHORITY, deviceRootId);
final Intent intent = new Intent(DocumentsContract.ACTION_BROWSE);
intent.setData(uri);
intent.addCategory(Intent.CATEGORY_DEFAULT);
this.startActivity(intent);
} catch (IOException exception) {
Log.e(MtpDocumentsProvider.TAG, "Failed to open device", exception);
}
}
finish();
}