// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package org.chromium.content.browser; import android.content.Context; import android.content.pm.PackageManager; import android.media.MediaMetadataRetriever; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.text.TextUtils; import android.util.Log; import org.chromium.base.CalledByNative; import org.chromium.base.JNINamespace; import org.chromium.base.PathUtils; import java.io.File; import java.util.HashMap; /** * Java counterpart of android MediaResourceGetter. */ @JNINamespace("content") class MediaResourceGetter { private static final String TAG = "MediaResourceGetter"; private static class MediaMetadata { private final int mDurationInMilliseconds; private final int mWidth; private final int mHeight; private final boolean mSuccess; private MediaMetadata(int durationInMilliseconds, int width, int height, boolean success) { mDurationInMilliseconds = durationInMilliseconds; mWidth = width; mHeight = height; mSuccess = success; } @CalledByNative("MediaMetadata") private int getDurationInMilliseconds() { return mDurationInMilliseconds; } @CalledByNative("MediaMetadata") private int getWidth() { return mWidth; } @CalledByNative("MediaMetadata") private int getHeight() { return mHeight; } @CalledByNative("MediaMetadata") private boolean isSuccess() { return mSuccess; } } @CalledByNative private static MediaMetadata extractMediaMetadata(Context context, String url, String cookies, String userAgent) { int durationInMilliseconds = 0; int width = 0; int height = 0; boolean success = false; if ("GT-I9100".contentEquals(android.os.Build.MODEL) && android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) { return new MediaMetadata(0, 0, 0, success); } // TODO(qinmin): use ConnectionTypeObserver to listen to the network type change. ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (mConnectivityManager != null) { if (context.checkCallingOrSelfPermission( android.Manifest.permission.ACCESS_NETWORK_STATE) != PackageManager.PERMISSION_GRANTED) { return new MediaMetadata(0, 0, 0, false); } NetworkInfo info = mConnectivityManager.getActiveNetworkInfo(); if (info == null) { return new MediaMetadata(durationInMilliseconds, width, height, success); } switch (info.getType()) { case ConnectivityManager.TYPE_ETHERNET: case ConnectivityManager.TYPE_WIFI: break; case ConnectivityManager.TYPE_WIMAX: case ConnectivityManager.TYPE_MOBILE: default: return new MediaMetadata(durationInMilliseconds, width, height, success); } } MediaMetadataRetriever retriever = new MediaMetadataRetriever(); try { Uri uri = Uri.parse(url); String scheme = uri.getScheme(); if (scheme == null || scheme.equals("file")) { File file = new File(uri.getPath()); String path = file.getAbsolutePath(); if (file.exists() && (path.startsWith("/mnt/sdcard/") || path.startsWith("/sdcard/") || path.startsWith(PathUtils.getExternalStorageDirectory()) || path.startsWith(context.getCacheDir().getAbsolutePath()))) { retriever.setDataSource(path); } else { return new MediaMetadata(durationInMilliseconds, width, height, success); } } else { HashMap<String, String> headersMap = new HashMap<String, String>(); if (!TextUtils.isEmpty(cookies)) { headersMap.put("Cookie", cookies); } if (!TextUtils.isEmpty(userAgent)) { headersMap.put("User-Agent", userAgent); } retriever.setDataSource(url, headersMap); } String duration = retriever.extractMetadata( MediaMetadataRetriever.METADATA_KEY_DURATION); String videoWidth = retriever.extractMetadata( MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH); String videoHeight = retriever.extractMetadata( MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT); if (duration == null || videoWidth == null || videoHeight == null) { return new MediaMetadata(durationInMilliseconds, width, height, success); } durationInMilliseconds = Integer.parseInt(duration); width = Integer.parseInt(videoWidth); height = Integer.parseInt(videoHeight); success = true; } catch (IllegalArgumentException e) { Log.e(TAG, "Invalid url: " + e); } catch (RuntimeException e) { Log.e(TAG, "Invalid url: " + e); } return new MediaMetadata(durationInMilliseconds, width, height, success); } }