MediaResourceGetter.java revision 3551c9c881056c480085172ff9840cab31610854
1c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org// Use of this source code is governed by a BSD-style license that can be
3c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org// found in the LICENSE file.
4c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
5c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgpackage org.chromium.content.browser;
6c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
7c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgimport android.content.Context;
8c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgimport android.content.pm.PackageManager;
9c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgimport android.media.MediaMetadataRetriever;
10c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgimport android.net.ConnectivityManager;
11c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgimport android.net.NetworkInfo;
12c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgimport android.net.Uri;
13c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgimport android.text.TextUtils;
14c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgimport android.util.Log;
15c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
16c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgimport org.chromium.base.CalledByNative;
17c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgimport org.chromium.base.JNINamespace;
18c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgimport org.chromium.base.PathUtils;
19c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
20c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgimport java.io.File;
21c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgimport java.util.HashMap;
22c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
23c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org/**
24c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org * Java counterpart of android MediaResourceGetter.
25c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org */
26c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org@JNINamespace("content")
27c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.orgclass MediaResourceGetter {
28c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
29c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org    private static final String TAG = "MediaResourceGetter";
30c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
31c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org    private static class MediaMetadata {
32c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org        private final int mDurationInMilliseconds;
33c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org        private final int mWidth;
34c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org        private final int mHeight;
35c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org        private final boolean mSuccess;
36c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
37c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org        private MediaMetadata(int durationInMilliseconds, int width, int height, boolean success) {
38c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org            mDurationInMilliseconds = durationInMilliseconds;
39c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org            mWidth = width;
40c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org            mHeight = height;
41c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org            mSuccess = success;
42c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org        }
43c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
44c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org        @CalledByNative("MediaMetadata")
45c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org        private int getDurationInMilliseconds() { return mDurationInMilliseconds; }
46c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
47c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org        @CalledByNative("MediaMetadata")
48c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org        private int getWidth() { return mWidth; }
49c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
50c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org        @CalledByNative("MediaMetadata")
51c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org        private int getHeight() { return mHeight; }
52c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
53c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org        @CalledByNative("MediaMetadata")
54c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org        private boolean isSuccess() { return mSuccess; }
55c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org    }
56c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
57c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org    @CalledByNative
58c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org    private static MediaMetadata extractMediaMetadata(Context context, String url, String cookies) {
59c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org        int durationInMilliseconds = 0;
60c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org        int width = 0;
61c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org        int height = 0;
62c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org        boolean success = false;
63c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org        // TODO(qinmin): use ConnectionTypeObserver to listen to the network type change.
64c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org        ConnectivityManager mConnectivityManager =
65c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
66c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org        if (mConnectivityManager != null) {
67c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org            if (context.checkCallingOrSelfPermission(
68c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                    android.Manifest.permission.ACCESS_NETWORK_STATE) !=
69c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                    PackageManager.PERMISSION_GRANTED) {
70c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                return new MediaMetadata(0, 0, 0, false);
71c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org            }
72c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
73c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org            NetworkInfo info = mConnectivityManager.getActiveNetworkInfo();
74c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org            if (info == null) {
75c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                return new MediaMetadata(durationInMilliseconds, width, height, success);
76c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org            }
77c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org            switch (info.getType()) {
78c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                case ConnectivityManager.TYPE_ETHERNET:
79c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                case ConnectivityManager.TYPE_WIFI:
80c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                    break;
81c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                case ConnectivityManager.TYPE_WIMAX:
82c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                case ConnectivityManager.TYPE_MOBILE:
83c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                default:
84c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                    return new MediaMetadata(durationInMilliseconds, width, height, success);
85c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org            }
86c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org        }
87c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org
88c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
89c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org        try {
90c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org            Uri uri = Uri.parse(url);
91c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org            String scheme = uri.getScheme();
92c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org            if (scheme == null || scheme.equals("file")) {
93c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                File file = new File(uri.getPath());
94c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                String path = file.getAbsolutePath();
95c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                if (file.exists() && (path.startsWith("/mnt/sdcard/") ||
96c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                        path.startsWith("/sdcard/") ||
97c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                        path.startsWith(PathUtils.getExternalStorageDirectory()))) {
98c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                    retriever.setDataSource(path);
99c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                } else {
100c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                    Log.e(TAG, "Unable to read file: " + url);
101c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                    return new MediaMetadata(durationInMilliseconds, width, height, success);
102c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                }
103c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org            } else {
104c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                HashMap<String, String> headersMap = new HashMap<String, String>();
105c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                if (!TextUtils.isEmpty(cookies)) {
106c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                    headersMap.put("Cookie", cookies);
107c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                }
108c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                retriever.setDataSource(url, headersMap);
109c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org            }
110c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org            String duration = retriever.extractMetadata(
111c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                    MediaMetadataRetriever.METADATA_KEY_DURATION);
112c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org            String videoWidth = retriever.extractMetadata(
113c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                    MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH);
114c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org            String videoHeight = retriever.extractMetadata(
115c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                    MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT);
116c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org            if (duration == null || videoWidth == null || videoHeight == null) {
117c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org                return new MediaMetadata(durationInMilliseconds, width, height, success);
118c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org            }
119c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org            durationInMilliseconds = Integer.parseInt(duration);
120c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org            width = Integer.parseInt(videoWidth);
121c9490d33b98b7affb729b5f1db13cb0a348471aagl@chromium.org            height = Integer.parseInt(videoHeight);
122            success = true;
123        } catch (IllegalArgumentException e) {
124            Log.e(TAG, "Invalid url: " + e);
125        } catch (RuntimeException e) {
126            Log.e(TAG, "Invalid url: " + e);
127        }
128        return new MediaMetadata(durationInMilliseconds, width, height, success);
129    }
130}
131