Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b587d8d2 authored by Chris Thornton's avatar Chris Thornton Committed by android-build-merger
Browse files

Only purge sound models that violate the new primary key constraint if they...

Only purge sound models that violate the new primary key constraint if they don't contain identical data. am: d5ff1164 am: 519b7837
am: a7f3f1aa

Change-Id: I5a376cac47bd279ed13116213b2a78ddcdae8eb2
parents 28928d8f a7f3f1aa
Loading
Loading
Loading
Loading
+31 −10
Original line number Diff line number Diff line
@@ -27,10 +27,11 @@ import android.hardware.soundtrigger.SoundTrigger.KeyphraseSoundModel;
import android.text.TextUtils;
import android.util.Slog;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.UUID;
import java.util.List;
import java.util.ArrayList;

/**
 * Helper to manage the database of the sound models that have been registered on the device.
@@ -123,7 +124,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
            db.execSQL("DROP TABLE IF EXISTS " + SoundModelContract.TABLE);
            onCreate(db);
            for (SoundModelRecord record : old_records) {
                if (!record.violatesV6PrimaryKeyConstraint(old_records)) {
                if (record.ifViolatesV6PrimaryKeyIsFirstOfAnyDuplicates(old_records)) {
                    try {
                        long return_value = record.writeToDatabase(6, db);
                        if (return_value == -1) {
@@ -351,19 +352,39 @@ public class DatabaseHelper extends SQLiteOpenHelper {
            users = c.getString(c.getColumnIndex(SoundModelContract.KEY_USERS));
        }

        // Check to see if this record conflicts with some other record in the list of records.
        public boolean violatesV6PrimaryKeyConstraint(List<SoundModelRecord> records) {
        private boolean V6PrimaryKeyMatches(SoundModelRecord record) {
          return keyphraseId == record.keyphraseId && stringComparisonHelper(locale, record.locale)
              && stringComparisonHelper(users, record.users);
        }

        // Returns true if this record is a) the only record with the same V6 primary key, or b) the
        // first record in the list of all records that have the same primary key and equal data.
        // It will return false if a) there are any records that have the same primary key and
        // different data, or b) there is a previous record in the list that has the same primary
        // key and data.
        // Note that 'this' object must be inside the list.
        public boolean ifViolatesV6PrimaryKeyIsFirstOfAnyDuplicates(
                List<SoundModelRecord> records) {
            // First pass - check to see if all the records that have the same primary key have
            // duplicated data.
            for (SoundModelRecord record : records) {
                if (this == record) {
                    continue;
                }
                if (keyphraseId == record.keyphraseId
                        && stringComparisonHelper(locale, record.locale)
                        && stringComparisonHelper(users, record.users)) {
                    return true;
                // If we have different/missing data with the same primary key, then we should drop
                // everything.
                if (this.V6PrimaryKeyMatches(record) && !Arrays.equals(data, record.data)) {
                    return false;
                }
            }
            return false;

            // We only want to return true for the first duplicated model.
            for (SoundModelRecord record : records) {
                if (this.V6PrimaryKeyMatches(record)) {
                    return this == record;
                }
            }
            return true;
        }

        public long writeToDatabase(int version, SQLiteDatabase db) {