Revert "Delete code used to read content:// URIs from MediaPlayerService"

This reverts commit fa2219509c820a0a274542b9c8a35257da627208.

Reason for revert: Moves failure on bad URIs from setDataSource to prepare, b/279586249

Change-Id: I6f04e387027f229e4e9a4c0a09e9acae9935f6bf
diff --git a/media/libmediaplayerservice/ActivityManager.cpp b/media/libmediaplayerservice/ActivityManager.cpp
new file mode 100644
index 0000000..438d422
--- /dev/null
+++ b/media/libmediaplayerservice/ActivityManager.cpp
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2006 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <binder/IActivityManager.h>
+#include <binder/IBinder.h>
+#include <binder/IServiceManager.h>
+
+#include "ActivityManager.h"
+
+namespace android {
+
+// Perform ContentProvider.openFile() on the given URI, returning
+// the resulting native file descriptor.  Returns < 0 on error.
+int openContentProviderFile(const String16& uri)
+{
+    int fd = -1;
+
+    sp<IServiceManager> sm = defaultServiceManager();
+    sp<IBinder> binder = sm->getService(String16("activity"));
+    sp<IActivityManager> am = interface_cast<IActivityManager>(binder);
+    if (am != NULL) {
+        fd = am->openContentUri(uri);
+    }
+
+    return fd;
+}
+
+} /* namespace android */
diff --git a/media/libmediaplayerservice/ActivityManager.h b/media/libmediaplayerservice/ActivityManager.h
new file mode 100644
index 0000000..451a004
--- /dev/null
+++ b/media/libmediaplayerservice/ActivityManager.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ActivityManager_H
+#define ActivityManager_H
+
+#include <utils/String16.h>
+
+namespace android {
+
+// Perform a ContentProvider.openFile() call for the given URI.
+//
+// Returns the native file descriptor for the opened stream, < 0 on error.
+extern int openContentProviderFile(const String16& uri);
+
+}
+
+#endif
diff --git a/media/libmediaplayerservice/Android.bp b/media/libmediaplayerservice/Android.bp
index 6ddaf25..266cb17 100644
--- a/media/libmediaplayerservice/Android.bp
+++ b/media/libmediaplayerservice/Android.bp
@@ -20,6 +20,7 @@
 cc_library {
 
     srcs: [
+        "ActivityManager.cpp",
         "DeathNotifier.cpp",
         "MediaPlayerFactory.cpp",
         "MediaPlayerService.cpp",
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp
index 65381c4..9e9e9d8 100644
--- a/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -75,6 +75,7 @@
 
 #include <private/android_filesystem_config.h>
 
+#include "ActivityManager.h"
 #include "MediaRecorderClient.h"
 #include "MediaPlayerService.h"
 #include "MetadataRetrieverClient.h"
@@ -1001,13 +1002,31 @@
         }
     }
 
-    player_type playerType = MediaPlayerFactory::getPlayerType(this, url);
-    sp<MediaPlayerBase> p = setDataSource_pre(playerType);
-    if (p == NULL) {
-        return NO_INIT;
-    }
+    if (strncmp(url, "content://", 10) == 0) {
+        // get a filedescriptor for the content Uri and
+        // pass it to the setDataSource(fd) method
 
-    return mStatus = setDataSource_post(p, p->setDataSource(httpService, url, headers));
+        String16 url16(url);
+        int fd = android::openContentProviderFile(url16);
+        if (fd < 0)
+        {
+            ALOGE("Couldn't open fd for %s", url);
+            return UNKNOWN_ERROR;
+        }
+        status_t status = setDataSource(fd, 0, 0x7fffffffffLL); // this sets mStatus
+        close(fd);
+        return mStatus = status;
+    } else {
+        player_type playerType = MediaPlayerFactory::getPlayerType(this, url);
+        sp<MediaPlayerBase> p = setDataSource_pre(playerType);
+        if (p == NULL) {
+            return NO_INIT;
+        }
+
+        return mStatus =
+                setDataSource_post(
+                p, p->setDataSource(httpService, url, headers));
+    }
 }
 
 status_t MediaPlayerService::Client::setDataSource(int fd, int64_t offset, int64_t length)