1702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project/* //device/content/providers/media/src/com/android/providers/media/MediaScannerReceiver.java
2702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project**
3702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project** Copyright 2007, The Android Open Source Project
4702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project**
5702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");
6702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project** you may not use this file except in compliance with the License.
7702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project** You may obtain a copy of the License at
8702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project**
9702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project**     http://www.apache.org/licenses/LICENSE-2.0
10702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project**
11702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project** Unless required by applicable law or agreed to in writing, software
12702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS,
13702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project** See the License for the specific language governing permissions and
15702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project** limitations under the License.
16702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project*/
17702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project
18702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Projectpackage com.android.providers.media;
19702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project
208efd65fe64c7978534bb549b2329068a2f8c5075Jeff Sharkeyimport android.content.BroadcastReceiver;
21702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Projectimport android.content.Context;
22702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Projectimport android.content.Intent;
23702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Projectimport android.net.Uri;
24702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Projectimport android.os.Bundle;
254fc4097f6d46c64e946426c1e905858b5a7e9c32Mike Lockwoodimport android.os.Environment;
264fc4097f6d46c64e946426c1e905858b5a7e9c32Mike Lockwoodimport android.util.Log;
27702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project
28e358a9013e9a33b5dc0ab5b25e7748d92d01c066Marco Nelissenimport java.io.File;
29e358a9013e9a33b5dc0ab5b25e7748d92d01c066Marco Nelissenimport java.io.IOException;
30e358a9013e9a33b5dc0ab5b25e7748d92d01c066Marco Nelissen
318efd65fe64c7978534bb549b2329068a2f8c5075Jeff Sharkeypublic class MediaScannerReceiver extends BroadcastReceiver {
32702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project    private final static String TAG = "MediaScannerReceiver";
33702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project
34702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project    @Override
35702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project    public void onReceive(Context context, Intent intent) {
368efd65fe64c7978534bb549b2329068a2f8c5075Jeff Sharkey        final String action = intent.getAction();
378efd65fe64c7978534bb549b2329068a2f8c5075Jeff Sharkey        final Uri uri = intent.getData();
388efd65fe64c7978534bb549b2329068a2f8c5075Jeff Sharkey        if (Intent.ACTION_BOOT_COMPLETED.equals(action)) {
3981befcaad462ea93d3683339232898b96185999eJeff Sharkey            // Scan both internal and external storage
40702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project            scan(context, MediaProvider.INTERNAL_VOLUME);
4181befcaad462ea93d3683339232898b96185999eJeff Sharkey            scan(context, MediaProvider.EXTERNAL_VOLUME);
428efd65fe64c7978534bb549b2329068a2f8c5075Jeff Sharkey
43702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project        } else {
44702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project            if (uri.getScheme().equals("file")) {
45702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project                // handle intents related to external storage
46702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project                String path = uri.getPath();
47235df0dced216be183af77a4083ee0968a472fc0Mike Lockwood                String externalStoragePath = Environment.getExternalStorageDirectory().getPath();
48e358a9013e9a33b5dc0ab5b25e7748d92d01c066Marco Nelissen                String legacyPath = Environment.getLegacyExternalStorageDirectory().getPath();
49e358a9013e9a33b5dc0ab5b25e7748d92d01c066Marco Nelissen
50e358a9013e9a33b5dc0ab5b25e7748d92d01c066Marco Nelissen                try {
51e358a9013e9a33b5dc0ab5b25e7748d92d01c066Marco Nelissen                    path = new File(path).getCanonicalPath();
52e358a9013e9a33b5dc0ab5b25e7748d92d01c066Marco Nelissen                } catch (IOException e) {
53e358a9013e9a33b5dc0ab5b25e7748d92d01c066Marco Nelissen                    Log.e(TAG, "couldn't canonicalize " + path);
54e358a9013e9a33b5dc0ab5b25e7748d92d01c066Marco Nelissen                    return;
55e358a9013e9a33b5dc0ab5b25e7748d92d01c066Marco Nelissen                }
56e358a9013e9a33b5dc0ab5b25e7748d92d01c066Marco Nelissen                if (path.startsWith(legacyPath)) {
57e358a9013e9a33b5dc0ab5b25e7748d92d01c066Marco Nelissen                    path = externalStoragePath + path.substring(legacyPath.length());
58e358a9013e9a33b5dc0ab5b25e7748d92d01c066Marco Nelissen                }
59235df0dced216be183af77a4083ee0968a472fc0Mike Lockwood
60235df0dced216be183af77a4083ee0968a472fc0Mike Lockwood                Log.d(TAG, "action: " + action + " path: " + path);
618efd65fe64c7978534bb549b2329068a2f8c5075Jeff Sharkey                if (Intent.ACTION_MEDIA_MOUNTED.equals(action)) {
62235df0dced216be183af77a4083ee0968a472fc0Mike Lockwood                    // scan whenever any volume is mounted
63235df0dced216be183af77a4083ee0968a472fc0Mike Lockwood                    scan(context, MediaProvider.EXTERNAL_VOLUME);
648efd65fe64c7978534bb549b2329068a2f8c5075Jeff Sharkey                } else if (Intent.ACTION_MEDIA_SCANNER_SCAN_FILE.equals(action) &&
6517ad80b32f839ccddac3911799ff732d1ca3a006Mike Lockwood                        path != null && path.startsWith(externalStoragePath + "/")) {
6617ad80b32f839ccddac3911799ff732d1ca3a006Mike Lockwood                    scanFile(context, path);
67702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project                }
68702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project            }
69702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project        }
70702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project    }
71702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project
72702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project    private void scan(Context context, String volume) {
73702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project        Bundle args = new Bundle();
74702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project        args.putString("volume", volume);
75702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project        context.startService(
76702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project                new Intent(context, MediaScannerService.class).putExtras(args));
77702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project    }
78702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project
79702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project    private void scanFile(Context context, String path) {
80702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project        Bundle args = new Bundle();
81702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project        args.putString("filepath", path);
82702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project        context.startService(
83702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project                new Intent(context, MediaScannerService.class).putExtras(args));
84702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project    }
85702152725052b7b3903ed647cf53f04724886a1bThe Android Open Source Project}
86