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

am: 519b7837bb

Change-Id: I7788e4a5a09ba918e4a142bebf797af4db3b8afe
This commit is contained in:
Chris Thornton
2016-10-19 01:33:45 +00:00
committed by android-build-merger

View File

@@ -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) {