summaryrefslogtreecommitdiff
path: root/java/com/android/voicemail/impl/transcribe/TranscriptionDbHelper.java
blob: 9d3c2e4a7c8803a0635962d95a12f806c85e8686 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License
 */
package com.android.voicemail.impl.transcribe;

import android.annotation.TargetApi;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build.VERSION_CODES;
import android.provider.VoicemailContract.Voicemails;
import android.support.annotation.VisibleForTesting;
import android.support.annotation.WorkerThread;
import android.support.v4.os.BuildCompat;
import android.util.Pair;
import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
import java.util.ArrayList;
import java.util.List;

/** Helper class for reading and writing transcription data in the database */
@TargetApi(VERSION_CODES.O)
public class TranscriptionDbHelper {
  @VisibleForTesting
  static final String[] PROJECTION =
      new String[] {
        Voicemails._ID, // 0
        Voicemails.TRANSCRIPTION, // 1
        VoicemailCompat.TRANSCRIPTION_STATE // 2
      };

  static final int ID = 0;
  static final int TRANSCRIPTION = 1;
  static final int TRANSCRIPTION_STATE = 2;

  private final ContentResolver contentResolver;
  private final Uri uri;

  TranscriptionDbHelper(Context context, Uri uri) {
    Assert.isNotNull(uri);
    this.contentResolver = context.getContentResolver();
    this.uri = uri;
  }

  TranscriptionDbHelper(Context context) {
    this(context, Voicemails.buildSourceUri(context.getPackageName()));
  }

  @WorkerThread
  @TargetApi(VERSION_CODES.M) // used for try with resources
  Pair<String, Integer> getTranscriptionAndState() {
    Assert.checkState(BuildCompat.isAtLeastO());
    Assert.isWorkerThread();
    try (Cursor cursor = contentResolver.query(uri, PROJECTION, null, null, null)) {
      if (cursor == null) {
        LogUtil.e("TranscriptionDbHelper.getTranscriptionAndState", "query failed.");
        return null;
      }

      if (cursor.moveToFirst()) {
        String transcription = cursor.getString(TRANSCRIPTION);
        int transcriptionState = cursor.getInt(TRANSCRIPTION_STATE);
        return new Pair<>(transcription, transcriptionState);
      }
    }
    LogUtil.i("TranscriptionDbHelper.getTranscriptionAndState", "query returned no results");
    return null;
  }

  @WorkerThread
  @TargetApi(VERSION_CODES.M) // used for try with resources
  List<Uri> getUntranscribedVoicemails() {
    Assert.checkArgument(BuildCompat.isAtLeastO());
    Assert.isWorkerThread();
    List<Uri> untranscribed = new ArrayList<>();
    String whereClause =
        Voicemails.TRANSCRIPTION + " is NULL AND " + VoicemailCompat.TRANSCRIPTION_STATE + "=?";
    String[] whereArgs = {String.valueOf(VoicemailCompat.TRANSCRIPTION_NOT_STARTED)};
    try (Cursor cursor = contentResolver.query(uri, PROJECTION, whereClause, whereArgs, null)) {
      if (cursor == null) {
        LogUtil.e("TranscriptionDbHelper.getUntranscribedVoicemails", "query failed.");
      } else {
        while (cursor.moveToNext()) {
          untranscribed.add(ContentUris.withAppendedId(uri, cursor.getLong(ID)));
        }
      }
    }
    return untranscribed;
  }

  @WorkerThread
  void setTranscriptionState(int transcriptionState) {
    Assert.isWorkerThread();
    LogUtil.i(
        "TranscriptionDbHelper.setTranscriptionState",
        "uri: " + uri + ", state: " + transcriptionState);
    ContentValues values = new ContentValues();
    values.put(VoicemailCompat.TRANSCRIPTION_STATE, transcriptionState);
    updateDatabase(values);
  }

  @WorkerThread
  void setTranscriptionAndState(String transcription, int transcriptionState) {
    Assert.isWorkerThread();
    LogUtil.i(
        "TranscriptionDbHelper.setTranscriptionAndState",
        "uri: " + uri + ", state: " + transcriptionState);
    ContentValues values = new ContentValues();
    values.put(Voicemails.TRANSCRIPTION, transcription);
    values.put(VoicemailCompat.TRANSCRIPTION_STATE, transcriptionState);
    updateDatabase(values);
  }

  private void updateDatabase(ContentValues values) {
    int updatedCount = contentResolver.update(uri, values, null, null);
    if (updatedCount != 1) {
      LogUtil.e(
          "TranscriptionDbHelper.updateDatabase",
          "Wrong row count, should have updated 1 row, was: " + updatedCount);
    }
  }
}