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

Commit f8cf71d7 authored by Sandeep Siddhartha's avatar Sandeep Siddhartha
Browse files

Support model deletion

the updateKeyphrase call is also used to clear out a sound model currently,
this happens when the sound model passed in has no keyphrases.

We can revisit if we need another deleteSoundModel method

- Also fix an issue with the way we were writing keyphrase to the DB
  and when updating keyphrase, we actually addOrUpdate

Change-Id: Ib7250c2fdafef6bc40387912a79366c334d73292
parent b3325cbb
Loading
Loading
Loading
Loading
+27 −9
Original line number Diff line number Diff line
@@ -94,7 +94,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
    }

    public boolean addOrUpdateKeyphraseSoundModel(KeyphraseSoundModel soundModel) {
        SQLiteDatabase db = this.getWritableDatabase();
        SQLiteDatabase db = getWritableDatabase();
        ContentValues values = new ContentValues();
        // Generate a random ID for the model.
        values.put(SoundModelContract.KEY_ID, soundModel.uuid.toString());
@@ -105,7 +105,7 @@ public class DatabaseHelper extends SQLiteOpenHelper {
        if (db.insertWithOnConflict(
                SoundModelContract.TABLE, null, values, SQLiteDatabase.CONFLICT_REPLACE) != -1) {
            for (Keyphrase keyphrase : soundModel.keyphrases) {
                status &= addKeyphrase(soundModel.uuid, keyphrase);
                status &= addOrUpdateKeyphrase(soundModel.uuid, keyphrase);
            }
            return status;
        } else {
@@ -114,18 +114,16 @@ public class DatabaseHelper extends SQLiteOpenHelper {
        }
    }

    /**
     * TODO(sansid): Change to addOrUpdate to handle changes here.
     */
    private boolean addKeyphrase(UUID modelId, Keyphrase keyphrase) {
        SQLiteDatabase db = this.getWritableDatabase();
    private boolean addOrUpdateKeyphrase(UUID modelId, Keyphrase keyphrase) {
        SQLiteDatabase db = getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(KeyphraseContract.KEY_ID, keyphrase.id);
        values.put(KeyphraseContract.KEY_RECOGNITION_MODES, keyphrase.recognitionModeFlags);
        values.put(KeyphraseContract.KEY_SOUND_MODEL_ID, keyphrase.id);
        values.put(KeyphraseContract.KEY_SOUND_MODEL_ID, modelId.toString());
        values.put(KeyphraseContract.KEY_HINT_TEXT, keyphrase.hintText);
        values.put(KeyphraseContract.KEY_LOCALE, keyphrase.locale);
        if (db.insert(KeyphraseContract.TABLE, null, values) != -1) {
        if (db.insertWithOnConflict(
                KeyphraseContract.TABLE, null, values, SQLiteDatabase.CONFLICT_REPLACE) != -1) {
            return true;
        } else {
            Slog.w(TAG, "Failed to persist keyphrase to database");
@@ -133,6 +131,26 @@ public class DatabaseHelper extends SQLiteOpenHelper {
        }
    }

    /**
     * Deletes the sound model and associated keyphrases.
     */
    public boolean deleteKeyphraseSoundModel(UUID uuid) {
        SQLiteDatabase db = getWritableDatabase();
        String modelId = uuid.toString();
        String soundModelClause = SoundModelContract.KEY_ID + "=" + modelId;
        boolean status = true;
        if (db.delete(SoundModelContract.TABLE, soundModelClause, null) == 0) {
            Slog.w(TAG, "No sound models deleted from the database");
            status = false;
        }
        String keyphraseClause = KeyphraseContract.KEY_SOUND_MODEL_ID + "=" + modelId;
        if (db.delete(KeyphraseContract.TABLE, keyphraseClause, null) == 0) {
            Slog.w(TAG, "No keyphrases deleted from the database");
            status = false;
        }
        return status;
    }

    /**
     * Lists all the keyphrase sound models currently registered with the system.
     */
+16 −3
Original line number Diff line number Diff line
@@ -281,13 +281,26 @@ public class VoiceInteractionManagerService extends SystemService {
                    throw new SecurityException("Caller does not hold the permission "
                            + Manifest.permission.MANAGE_VOICE_KEYPHRASES);
                }
                if (model == null) {
                    throw new IllegalArgumentException("Model must not be null");
                }

                final long caller = Binder.clearCallingIdentity();
                try {
                    // If the keyphrases are not present in the model, delete the model.
                    if (model.keyphrases == null) {
                        if (mDbHelper.deleteKeyphraseSoundModel(model.uuid)) {
                            return STATUS_OK;
                        } else {
                            return STATUS_ERROR;
                        }
                    } else {
                        if (mDbHelper.addOrUpdateKeyphraseSoundModel(model)) {
                            return STATUS_OK;
                        } else {
                            return STATUS_ERROR;
                        }
                    }
                } finally {
                    Binder.restoreCallingIdentity(caller);
                }