From d5ff11640310cfc9edaf55296fc29350a6564068 Mon Sep 17 00:00:00 2001 From: Chris Thornton Date: Tue, 18 Oct 2016 15:27:00 -0700 Subject: Only purge sound models that violate the new primary key constraint if they don't contain identical data. Bug: 32174118 Change-Id: Ied5e4e852337e5f819c7ded53dd941d79087ce73 --- .../server/voiceinteraction/DatabaseHelper.java | 41 ++++++++++++++++------ 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/DatabaseHelper.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/DatabaseHelper.java index 610f9bcdab4c..dd7b5a8752e5 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/DatabaseHelper.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/DatabaseHelper.java @@ -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 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 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) { -- cgit v1.2.3-59-g8ed1b