[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;
             }