Merge "Introduce user cache and resolve cross-profile access correctly." into sc-dev
diff --git a/apex/Android.bp b/apex/Android.bp
index a5e9942..cb6da5f 100644
--- a/apex/Android.bp
+++ b/apex/Android.bp
@@ -17,7 +17,7 @@
apex_defaults {
name: "com.android.mediaprovider-defaults",
- java_libs: ["framework-mediaprovider"],
+ bootclasspath_fragments: ["com.android.mediaprovider-bootclasspath-fragment"],
key: "com.android.mediaprovider.key",
certificate: ":com.android.mediaprovider.certificate",
file_contexts: ":com.android.mediaprovider-file_contexts",
@@ -45,3 +45,10 @@
"framework-mediaprovider",
],
}
+
+// Encapsulate the contributions made by the com.android.mediaprovider to the bootclasspath.
+bootclasspath_fragment {
+ name: "com.android.mediaprovider-bootclasspath-fragment",
+ contents: ["framework-mediaprovider"],
+ apex_available: ["com.android.mediaprovider"],
+}
diff --git a/apex/apex_manifest.json b/apex/apex_manifest.json
index 6d8da53..d87ce8d 100644
--- a/apex/apex_manifest.json
+++ b/apex/apex_manifest.json
@@ -1,4 +1,4 @@
{
"name": "com.android.mediaprovider",
- "version": 309999900
+ "version": 309999910
}
diff --git a/jni/FuseDaemon.cpp b/jni/FuseDaemon.cpp
index a482e01..833e9c6 100755
--- a/jni/FuseDaemon.cpp
+++ b/jni/FuseDaemon.cpp
@@ -749,13 +749,8 @@
ATRACE_CALL();
struct fuse* fuse = get_fuse(req);
- if (mode) {
- fuse_reply_err(req, EOPNOTSUPP);
- return;
- }
-
handle* h = reinterpret_cast<handle*>(fi->fh);
- auto err = posix_fallocate(h->fd, offset, length);
+ auto err = fallocate(h->fd, mode, offset, length);
fuse_reply_err(req, err);
}
diff --git a/src/com/android/providers/media/DatabaseHelper.java b/src/com/android/providers/media/DatabaseHelper.java
index f853150..7bcdf62 100644
--- a/src/com/android/providers/media/DatabaseHelper.java
+++ b/src/com/android/providers/media/DatabaseHelper.java
@@ -26,7 +26,6 @@
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
-import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ProviderInfo;
@@ -62,7 +61,6 @@
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
-import com.android.modules.utils.build.SdkLevel;
import com.android.providers.media.playlist.Playlist;
import com.android.providers.media.util.BackgroundThread;
import com.android.providers.media.util.DatabaseUtils;
@@ -106,8 +104,6 @@
*/
public static final String CURRENT_GENERATION_CLAUSE = "SELECT generation FROM local_metadata";
- static final String PREF_DB_FROM_VERSION = "db_from_version";
-
private static final int NOTIFY_BATCH_SIZE = 256;
final Context mContext;
@@ -359,8 +355,6 @@
updateDatabase(db, oldV, newV);
} finally {
mSchemaLock.writeLock().unlock();
- SharedPreferences prefs = mContext.getSharedPreferences(TAG, Context.MODE_PRIVATE);
- prefs.edit().putInt(PREF_DB_FROM_VERSION, oldV).commit();
}
}
@@ -1412,7 +1406,8 @@
private static void updateAddRecording(SQLiteDatabase db, boolean internal) {
db.execSQL("ALTER TABLE files ADD COLUMN is_recording INTEGER DEFAULT 0;");
- updateRecordingForSUpdate(db, internal);
+ // We add the column is_recording, rescan all music files
+ db.execSQL("UPDATE files SET date_modified=0 WHERE is_music=1;");
}
private static void updateAddRedactedUriId(SQLiteDatabase db) {
@@ -1567,7 +1562,6 @@
UserHandle.myUserId()));
}
-
private static void recomputeDataValues(SQLiteDatabase db, boolean internal) {
try (Cursor c = db.query("files", new String[] { FileColumns._ID, FileColumns.DATA },
null, null, null, null, null, null)) {
@@ -1619,13 +1613,6 @@
}
}
- static void updateRecordingForSUpdate(SQLiteDatabase db, boolean internal) {
- if (SdkLevel.isAtLeastS()) {
- // Rescan all music files to update is_recording type
- db.execSQL("UPDATE files SET date_modified=0 WHERE is_music=1;");
- }
- }
-
static final int VERSION_J = 509;
static final int VERSION_K = 700;
static final int VERSION_L = 700;
diff --git a/src/com/android/providers/media/MediaProvider.java b/src/com/android/providers/media/MediaProvider.java
index 5e01c06..e13d874 100644
--- a/src/com/android/providers/media/MediaProvider.java
+++ b/src/com/android/providers/media/MediaProvider.java
@@ -3058,6 +3058,7 @@
Environment.DIRECTORY_MUSIC,
Environment.DIRECTORY_NOTIFICATIONS,
Environment.DIRECTORY_PODCASTS,
+ FileUtils.DIRECTORY_RECORDINGS,
Environment.DIRECTORY_RINGTONES);
}
break;
diff --git a/src/com/android/providers/media/MediaUpgradeReceiver.java b/src/com/android/providers/media/MediaUpgradeReceiver.java
index 320e1c2..abb326a 100644
--- a/src/com/android/providers/media/MediaUpgradeReceiver.java
+++ b/src/com/android/providers/media/MediaUpgradeReceiver.java
@@ -24,7 +24,6 @@
import android.util.Log;
import com.android.providers.media.util.ForegroundThread;
-import com.android.providers.media.util.Logging;
import com.android.providers.media.util.Metrics;
import java.io.File;
@@ -43,8 +42,6 @@
static final String TAG = "MediaUpgradeReceiver";
static final String PREF_DB_VERSION = "db_version";
- private static final int UPDATE_RECORDING_VERSION = 1205;
-
@Override
public void onReceive(Context context, Intent intent) {
// We are now running with the system up, but no apps started,
@@ -67,10 +64,6 @@
prefs.edit().putInt(PREF_DB_VERSION, dbVersion).commit();
try {
- // Lookup the last from_version when upgrade database
- prefs = context.getSharedPreferences(Logging.TAG, Context.MODE_PRIVATE);
- final int fromVersion = prefs.getInt(DatabaseHelper.PREF_DB_FROM_VERSION, 0);
-
File dbDir = context.getDatabasePath("foo").getParentFile();
String[] files = dbDir.list();
if (files == null) return;
@@ -86,13 +79,7 @@
MediaProvider.MIGRATION_LISTENER, null);
helper.runWithTransaction((db) -> {
// Perform just enough to force database upgrade
- final int version = db.getVersion();
- // update the is_recording column for R OS upgraded to S OS
- if (fromVersion >= UPDATE_RECORDING_VERSION
- && prefVersion < DatabaseHelper.VERSION_S) {
- helper.updateRecordingForSUpdate(db, helper.mInternal);
- }
- return version;
+ return db.getVersion();
});
helper.close();
} catch (Throwable t) {
diff --git a/src/com/android/providers/media/scan/ModernMediaScanner.java b/src/com/android/providers/media/scan/ModernMediaScanner.java
index 9a38945..8927bfa 100644
--- a/src/com/android/providers/media/scan/ModernMediaScanner.java
+++ b/src/com/android/providers/media/scan/ModernMediaScanner.java
@@ -1226,6 +1226,8 @@
sAudioTypes.put(Environment.DIRECTORY_MUSIC, AudioColumns.IS_MUSIC);
if (SdkLevel.isAtLeastS()) {
sAudioTypes.put(Environment.DIRECTORY_RECORDINGS, AudioColumns.IS_RECORDING);
+ } else {
+ sAudioTypes.put(FileUtils.DIRECTORY_RECORDINGS, AudioColumns.IS_RECORDING);
}
}
diff --git a/src/com/android/providers/media/util/FileUtils.java b/src/com/android/providers/media/util/FileUtils.java
index cf7c23a..47e1559 100644
--- a/src/com/android/providers/media/util/FileUtils.java
+++ b/src/com/android/providers/media/util/FileUtils.java
@@ -964,6 +964,12 @@
public static final Pattern PATTERN_OBB_OR_CHILD_PATH = Pattern.compile(
"(?i)^/storage/[^/]+/(?:[0-9]+/)?Android/(?:obb)(/?.*)");
+ /**
+ * The recordings directory. This is used for R OS. For S OS or later,
+ * we use {@link Environment#DIRECTORY_RECORDINGS} directly.
+ */
+ public static final String DIRECTORY_RECORDINGS = "Recordings";
+
@VisibleForTesting
public static final String[] DEFAULT_FOLDER_NAMES;
static {
@@ -995,6 +1001,7 @@
Environment.DIRECTORY_DCIM,
Environment.DIRECTORY_DOCUMENTS,
Environment.DIRECTORY_AUDIOBOOKS,
+ DIRECTORY_RECORDINGS,
};
}
}