[Media Quality] Implement Remove Picture Profile API & temp map functionality
Test: logs and CTS
Bug: 378705930
Flag: android.media.tv.flags.media_quality_fw
Change-Id: If095b33ceb24f13f07cf53bd1c919f8a7918b544
diff --git a/services/core/Android.bp b/services/core/Android.bp
index b9540eb..c6e59a5 100644
--- a/services/core/Android.bp
+++ b/services/core/Android.bp
@@ -220,6 +220,7 @@
"securebox",
"apache-commons-math",
"battery_saver_flag_lib",
+ "guava",
"notification_flags_lib",
"power_hint_flags_lib",
"biometrics_flags_lib",
diff --git a/services/core/java/com/android/server/media/quality/MediaQualityService.java b/services/core/java/com/android/server/media/quality/MediaQualityService.java
index 65d0ab3..2ce03ae 100644
--- a/services/core/java/com/android/server/media/quality/MediaQualityService.java
+++ b/services/core/java/com/android/server/media/quality/MediaQualityService.java
@@ -35,6 +35,9 @@
import com.android.server.SystemService;
+import com.google.common.collect.BiMap;
+import com.google.common.collect.HashBiMap;
+
import org.json.JSONException;
import org.json.JSONObject;
@@ -43,6 +46,7 @@
import java.util.List;
import java.util.Locale;
import java.util.stream.Collectors;
+import java.util.UUID;
/**
* This service manage picture profile and sound profile for TV setting. Also communicates with the
@@ -54,10 +58,12 @@
private static final String TAG = "MediaQualityService";
private final Context mContext;
private final MediaQualityDbHelper mMediaQualityDbHelper;
+ private final BiMap<Long, String> mTempIdMap;
public MediaQualityService(Context context) {
super(context);
mContext = context;
+ mTempIdMap = HashBiMap.create();
mMediaQualityDbHelper = new MediaQualityDbHelper(mContext);
mMediaQualityDbHelper.setWriteAheadLoggingEnabled(true);
mMediaQualityDbHelper.setIdleConnectionTimeout(30);
@@ -83,8 +89,21 @@
values.put(mMediaQualityDbHelper.SETTINGS, bundleToJson(pp.getParameters()));
// id is auto-generated by SQLite upon successful insertion of row
- long id = db.insert(mMediaQualityDbHelper.PICTURE_QUALITY_TABLE_NAME, null, values);
- return new PictureProfile.Builder(pp).setProfileId(Long.toString(id)).build();
+ Long id = db.insert(mMediaQualityDbHelper.PICTURE_QUALITY_TABLE_NAME,
+ null, values);
+ populateTempIdMap(id);
+ pp.setProfileId(mTempIdMap.get(id));
+ return pp;
+ }
+
+ private void populateTempIdMap(Long id) {
+ if (id != null && mTempIdMap.get(id) == null) {
+ String uuid = UUID.randomUUID().toString();
+ while (mTempIdMap.inverse().containsKey(uuid)) {
+ uuid = UUID.randomUUID().toString();
+ }
+ mTempIdMap.put(id, uuid);
+ }
}
@Override
@@ -94,7 +113,15 @@
@Override
public void removePictureProfile(String id, int userId) {
- // TODO: implement
+ Long intId = mTempIdMap.inverse().get(id);
+ if (intId != null) {
+ SQLiteDatabase db = mMediaQualityDbHelper.getWritableDatabase();
+ String selection = BaseParameters.PARAMETER_ID + " = ?";
+ String[] selectionArgs = {Long.toString(intId)};
+ db.delete(mMediaQualityDbHelper.PICTURE_QUALITY_TABLE_NAME, selection,
+ selectionArgs);
+ mTempIdMap.remove(intId);
+ }
}
@Override
@@ -126,7 +153,7 @@
return null;
}
cursor.moveToFirst();
- return getPictureProfileFromCursor(cursor);
+ return getPictureProfileWithTempIdFromCursor(cursor);
}
}
@@ -187,20 +214,28 @@
};
}
- private PictureProfile getPictureProfileFromCursor(Cursor cursor) {
- String returnId = cursor.getString(cursor.getColumnIndexOrThrow(
- BaseParameters.PARAMETER_ID));
- int type = cursor.getInt(cursor.getColumnIndexOrThrow(
- BaseParameters.PARAMETER_TYPE));
- String name = cursor.getString(cursor.getColumnIndexOrThrow(
- BaseParameters.PARAMETER_NAME));
- String inputId = cursor.getString(cursor.getColumnIndexOrThrow(
- BaseParameters.PARAMETER_INPUT_ID));
- String packageName = cursor.getString(cursor.getColumnIndexOrThrow(
- BaseParameters.PARAMETER_PACKAGE));
- String settings = cursor.getString(
- cursor.getColumnIndexOrThrow(mMediaQualityDbHelper.SETTINGS));
- return new PictureProfile(returnId, type, name, inputId,
+ private PictureProfile getPictureProfileWithTempIdFromCursor(Cursor cursor) {
+ int colIndex = cursor.getColumnIndex(BaseParameters.PARAMETER_ID);
+ Long dbId = colIndex != -1 ? cursor.getLong(colIndex) : null;
+ populateTempIdMap(dbId);
+ String tempId = mTempIdMap.get(dbId);
+
+ colIndex = cursor.getColumnIndex(BaseParameters.PARAMETER_TYPE);
+ int type = colIndex != -1 ? cursor.getInt(colIndex) : 0;
+
+ colIndex = cursor.getColumnIndex(BaseParameters.PARAMETER_NAME);
+ String name = colIndex != -1 ? cursor.getString(colIndex) : null;
+
+ colIndex = cursor.getColumnIndex(BaseParameters.PARAMETER_INPUT_ID);
+ String inputId = colIndex != -1 ? cursor.getString(colIndex) : null;
+
+ colIndex = cursor.getColumnIndex(BaseParameters.PARAMETER_PACKAGE);
+ String packageName = colIndex != -1 ? cursor.getString(colIndex) : null;
+
+ colIndex = cursor.getColumnIndex(mMediaQualityDbHelper.SETTINGS);
+ String settings = colIndex != -1 ? cursor.getString(colIndex) : null;
+
+ return new PictureProfile(tempId, type, name, inputId,
packageName, jsonToBundle(settings));
}
@@ -243,7 +278,7 @@
) {
List<PictureProfile> pictureProfiles = new ArrayList<>();
while (cursor.moveToNext()) {
- pictureProfiles.add(getPictureProfileFromCursor(cursor));
+ pictureProfiles.add(getPictureProfileWithTempIdFromCursor(cursor));
}
return pictureProfiles;
}