1163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono/*
2163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono * Copyright (C) 2016 The Android Open Source Project
3163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono *
4163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono * Licensed under the Apache License, Version 2.0 (the "License");
5163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono * you may not use this file except in compliance with the License.
6163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono * You may obtain a copy of the License at
7163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono *
8163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono *      http://www.apache.org/licenses/LICENSE-2.0
9163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono *
10163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono * Unless required by applicable law or agreed to in writing, software
11163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono * distributed under the License is distributed on an "AS IS" BASIS,
12163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono * See the License for the specific language governing permissions and
14163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono * limitations under the License.
15163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono */
16163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono
17163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hironopackage com.android.mtp;
18163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono
19163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hironoimport android.app.Activity;
20163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hironoimport android.content.Intent;
211e3744441a1e4ead0a3c752644bee930be020698Daichi Hironoimport android.hardware.usb.UsbDevice;
22163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hironoimport android.hardware.usb.UsbManager;
231e3744441a1e4ead0a3c752644bee930be020698Daichi Hironoimport android.net.Uri;
24163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hironoimport android.os.Bundle;
251e3744441a1e4ead0a3c752644bee930be020698Daichi Hironoimport android.provider.DocumentsContract;
261e3744441a1e4ead0a3c752644bee930be020698Daichi Hironoimport android.util.Log;
271e3744441a1e4ead0a3c752644bee930be020698Daichi Hirono
281e3744441a1e4ead0a3c752644bee930be020698Daichi Hironoimport java.io.IOException;
29163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono
30163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono/**
31163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono * Invisible activity to receive intents.
32163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono * To show Files app for the UsbManager.ACTION_USB_DEVICE_ATTACHED intent, the intent should be
33163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono * received by activity. The activity has NoDisplay theme and immediately terminate after routing
34163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono * intent to DocumentsUI.
35163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono */
36163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hironopublic class ReceiverActivity extends Activity {
37163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono    @Override
38163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono    protected void onCreate(Bundle savedInstanceState) {
39163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono        super.onCreate(savedInstanceState);
40163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono        if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(getIntent().getAction())) {
411e3744441a1e4ead0a3c752644bee930be020698Daichi Hirono            final UsbDevice device = getIntent().getParcelableExtra(UsbManager.EXTRA_DEVICE);
421e3744441a1e4ead0a3c752644bee930be020698Daichi Hirono            try {
431e3744441a1e4ead0a3c752644bee930be020698Daichi Hirono                final MtpDocumentsProvider provider = MtpDocumentsProvider.getInstance();
441e3744441a1e4ead0a3c752644bee930be020698Daichi Hirono                provider.openDevice(device.getDeviceId());
451e3744441a1e4ead0a3c752644bee930be020698Daichi Hirono                final String deviceRootId = provider.getDeviceDocumentId(device.getDeviceId());
461e3744441a1e4ead0a3c752644bee930be020698Daichi Hirono                final Uri uri = DocumentsContract.buildRootUri(
471e3744441a1e4ead0a3c752644bee930be020698Daichi Hirono                        MtpDocumentsProvider.AUTHORITY, deviceRootId);
481e3744441a1e4ead0a3c752644bee930be020698Daichi Hirono
495d3b37b947ea55901cd19bd058f5379736c31c47Garfield Tan                final Intent intent = new Intent(Intent.ACTION_VIEW);
505d3b37b947ea55901cd19bd058f5379736c31c47Garfield Tan                intent.setDataAndType(uri, DocumentsContract.Root.MIME_TYPE_ITEM);
511e3744441a1e4ead0a3c752644bee930be020698Daichi Hirono                intent.addCategory(Intent.CATEGORY_DEFAULT);
521e3744441a1e4ead0a3c752644bee930be020698Daichi Hirono                this.startActivity(intent);
531e3744441a1e4ead0a3c752644bee930be020698Daichi Hirono            } catch (IOException exception) {
541e3744441a1e4ead0a3c752644bee930be020698Daichi Hirono                Log.e(MtpDocumentsProvider.TAG, "Failed to open device", exception);
551e3744441a1e4ead0a3c752644bee930be020698Daichi Hirono            }
56163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono        }
57163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono        finish();
58163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono    }
59163e4b6ae8a51421c8a9cccfdc2fe872afd09971Daichi Hirono}
60