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

Commit 20fc9805 authored by wangqi's avatar wangqi Committed by android-build-merger
Browse files

Merge "Change RttTransciptUtil methods to return ListenableFuture." am: a935f669

am: e41d0a79

Change-Id: If5fa94e4ba6e93e46ddbe00e19bebacb1637fa86
parents d77548cd e41d0a79
Loading
Loading
Loading
Loading
+13 −26
Original line number Diff line number Diff line
@@ -30,7 +30,6 @@ import android.support.annotation.MainThread;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresPermission;
import android.support.annotation.WorkerThread;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
@@ -65,7 +64,7 @@ import com.android.dialer.precall.PreCall;
import com.android.dialer.rtt.RttTranscriptActivity;
import com.android.dialer.rtt.RttTranscriptUtil;
import com.google.common.base.Preconditions;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.collect.ImmutableSet;
import com.google.i18n.phonenumbers.NumberParseException;
import com.google.i18n.phonenumbers.PhoneNumberUtil;
import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
@@ -100,7 +99,7 @@ abstract class CallDetailsActivityCommon extends AppCompatActivity {

  private CallDetailsAdapterCommon adapter;
  private CallDetailsEntries callDetailsEntries;
  private UiListener<CallDetailsEntries> checkRttTranscriptAvailabilityListener;
  private UiListener<ImmutableSet<String>> checkRttTranscriptAvailabilityListener;

  /**
   * Handles the intent that launches {@link OldCallDetailsActivity} or {@link CallDetailsActivity},
@@ -160,40 +159,28 @@ abstract class CallDetailsActivityCommon extends AppCompatActivity {
  }

  protected void loadRttTranscriptAvailability() {
    ImmutableSet.Builder<String> builder = ImmutableSet.builder();
    for (CallDetailsEntry entry : callDetailsEntries.getEntriesList()) {
      builder.add(entry.getCallMappingId());
    }
    checkRttTranscriptAvailabilityListener.listen(
        this,
        checkRttTranscriptAvailability(),
        this::setCallDetailsEntries,
        RttTranscriptUtil.getAvailableRttTranscriptIds(this, builder.build()),
        this::updateCallDetailsEntriesWithRttTranscriptAvailability,
        throwable -> {
          throw new RuntimeException(throwable);
        });
  }

  private ListenableFuture<CallDetailsEntries> checkRttTranscriptAvailability() {
    return DialerExecutorComponent.get(this)
        .backgroundExecutor()
        .submit(() -> checkRttTranscriptAvailabilityInBackground(callDetailsEntries));
  }

  /**
   * Check RTT transcript availability.
   *
   * @param input the original {@link CallDetailsEntries}
   * @return {@link CallDetailsEntries} with updated RTT transcript availability.
   */
  @WorkerThread
  private CallDetailsEntries checkRttTranscriptAvailabilityInBackground(
      @Nullable CallDetailsEntries input) {
    RttTranscriptUtil rttTranscriptUtil = new RttTranscriptUtil(this);

  private void updateCallDetailsEntriesWithRttTranscriptAvailability(
      ImmutableSet<String> availableTranscripIds) {
    CallDetailsEntries.Builder mutableCallDetailsEntries = CallDetailsEntries.newBuilder();
    for (CallDetailsEntry entry : input.getEntriesList()) {
    for (CallDetailsEntry entry : callDetailsEntries.getEntriesList()) {
      CallDetailsEntry.Builder newEntry = CallDetailsEntry.newBuilder().mergeFrom(entry);
      newEntry.setHasRttTranscript(
          rttTranscriptUtil.checkRttTranscriptAvailability(String.valueOf(entry.getDate())));
      newEntry.setHasRttTranscript(availableTranscripIds.contains(entry.getCallMappingId()));
      mutableCallDetailsEntries.addEntries(newEntry.build());
    }
    return mutableCallDetailsEntries.build();
    setCallDetailsEntries(mutableCallDetailsEntries.build());
  }

  @Override
+1 −8
Original line number Diff line number Diff line
@@ -30,7 +30,6 @@ import com.android.dialer.common.concurrent.DialerExecutorComponent;
import com.android.dialer.common.concurrent.UiListener;
import com.android.dialer.glidephotomanager.PhotoInfo;
import com.android.dialer.protos.ProtoParsers;
import com.google.common.util.concurrent.ListenableFuture;

/** Activity holds RTT transcript. */
public class RttTranscriptActivity extends AppCompatActivity {
@@ -80,7 +79,7 @@ public class RttTranscriptActivity extends AppCompatActivity {
    String id = intent.getStringExtra(EXTRA_TRANSCRIPT_ID);
    rttTranscriptUiListener.listen(
        this,
        getRttTranscript(id),
        RttTranscriptUtil.loadRttTranscript(this, id),
        adapter::setRttTranscript,
        throwable -> {
          throw new RuntimeException(throwable);
@@ -112,10 +111,4 @@ public class RttTranscriptActivity extends AppCompatActivity {
    }
    return super.onOptionsItemSelected(item);
  }

  private ListenableFuture<RttTranscript> getRttTranscript(String id) {
    return DialerExecutorComponent.get(this)
        .backgroundExecutor()
        .submit(() -> new RttTranscriptUtil(this).getRttTranscript(id));
  }
}
+50 −20
Original line number Diff line number Diff line
@@ -21,50 +21,65 @@ import android.content.Context;
import android.database.Cursor;
import android.support.annotation.WorkerThread;
import com.android.dialer.common.Assert;
import com.android.dialer.common.concurrent.DialerExecutorComponent;
import com.android.dialer.common.database.Selection;
import com.android.dialer.rtt.RttTranscriptContract.RttTranscriptColumn;
import com.google.common.collect.ImmutableSet;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.protobuf.InvalidProtocolBufferException;

/** Util class to save and load RTT transcript. */
public final class RttTranscriptUtil {

  private final RttTranscriptDatabaseHelper databaseHelper;

  public RttTranscriptUtil(Context context) {
    databaseHelper = new RttTranscriptDatabaseHelper(context.getApplicationContext());
  public static ListenableFuture<ImmutableSet<String>> getAvailableRttTranscriptIds(
      Context context, ImmutableSet<String> transcriptIds) {
    return DialerExecutorComponent.get(context)
        .backgroundExecutor()
        .submit(() -> checkRttTranscriptAvailability(context, transcriptIds));
  }

  @Override
  protected void finalize() throws Throwable {
    databaseHelper.close();
    super.finalize();
  }

  /** @return true if there is RTT transcript available. */
  @WorkerThread
  public boolean checkRttTranscriptAvailability(String transcriptId) {
  private static ImmutableSet<String> checkRttTranscriptAvailability(
      Context context, ImmutableSet<String> transcriptIds) {
    Assert.isWorkerThread();
    RttTranscriptDatabaseHelper databaseHelper = new RttTranscriptDatabaseHelper(context);
    ImmutableSet.Builder<String> builder = ImmutableSet.builder();
    Selection selection =
        Selection.builder()
            .and(Selection.column(RttTranscriptColumn.TRANSCRIPT_ID).in(transcriptIds))
            .build();

    try (Cursor cursor =
        databaseHelper
            .getReadableDatabase()
            .query(
                RttTranscriptDatabaseHelper.TABLE,
                new String[] {RttTranscriptColumn.TRANSCRIPT_ID},
                RttTranscriptColumn.TRANSCRIPT_ID + " = ?",
                new String[] {transcriptId},
                selection.getSelection(),
                selection.getSelectionArgs(),
                null,
                null,
                null)) {
      if (cursor != null && cursor.moveToFirst()) {
        return true;
      } else {
        return false;
      if (cursor != null) {
        while (cursor.moveToNext()) {
          builder.add(cursor.getString(0));
        }
      }
    }
    databaseHelper.close();
    return builder.build();
  }

  static ListenableFuture<RttTranscript> loadRttTranscript(Context context, String transcriptId) {
    return DialerExecutorComponent.get(context)
        .lightweightExecutor()
        .submit(() -> getRttTranscript(context, transcriptId));
  }

  @WorkerThread
  public RttTranscript getRttTranscript(String transcriptId) {
  private static RttTranscript getRttTranscript(Context context, String transcriptId) {
    Assert.isWorkerThread();
    RttTranscriptDatabaseHelper databaseHelper = new RttTranscriptDatabaseHelper(context);
    try (Cursor cursor =
        databaseHelper
            .getReadableDatabase()
@@ -85,17 +100,32 @@ public final class RttTranscriptUtil {
      } else {
        return null;
      }
    } finally {
      databaseHelper.close();
    }
  }

  public static ListenableFuture<Void> saveRttTranscript(
      Context context, RttTranscript rttTranscript) {
    return DialerExecutorComponent.get(context)
        .backgroundExecutor()
        .submit(
            () -> {
              save(context, rttTranscript);
              return null;
            });
  }

  @WorkerThread
  public void saveRttTranscript(RttTranscript rttTranscript) {
  private static void save(Context context, RttTranscript rttTranscript) {
    Assert.isWorkerThread();
    RttTranscriptDatabaseHelper databaseHelper = new RttTranscriptDatabaseHelper(context);
    ContentValues value = new ContentValues();
    value.put(RttTranscriptColumn.TRANSCRIPT_ID, rttTranscript.getId());
    value.put(RttTranscriptColumn.TRANSCRIPT_DATA, rttTranscript.toByteArray());
    long id =
        databaseHelper.getWritableDatabase().insert(RttTranscriptDatabaseHelper.TABLE, null, value);
    databaseHelper.close();
    if (id < 0) {
      throw new RuntimeException("Failed to save RTT transcript");
    }
+4 −12
Original line number Diff line number Diff line
@@ -58,7 +58,6 @@ import com.android.dialer.callintent.CallSpecificAppData;
import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
import com.android.dialer.common.concurrent.DefaultFutureCallback;
import com.android.dialer.common.concurrent.DialerExecutorComponent;
import com.android.dialer.compat.telephony.TelephonyManagerCompat;
import com.android.dialer.configprovider.ConfigProviderBindings;
import com.android.dialer.duo.DuoComponent;
@@ -91,7 +90,6 @@ import com.android.incallui.videotech.empty.EmptyVideoTech;
import com.android.incallui.videotech.ims.ImsVideoTech;
import com.android.incallui.videotech.utils.VideoUtils;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.MoreExecutors;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -550,16 +548,10 @@ public class DialerCall implements VideoTechListener, StateChangedListener, Capa
  public void onDestroy() {
    LogUtil.enterBlock("DialerCall.onDestroy");
    if (rttTranscript != null) {
      RttTranscript rttTranscriptToSave = rttTranscript;
      ListenableFuture<Void> future =
          DialerExecutorComponent.get(context)
              .backgroundExecutor()
              .submit(
                  () -> {
                    new RttTranscriptUtil(context).saveRttTranscript(rttTranscriptToSave);
                    return null;
                  });
      Futures.addCallback(future, new DefaultFutureCallback<>(), MoreExecutors.directExecutor());
      Futures.addCallback(
          RttTranscriptUtil.saveRttTranscript(context, rttTranscript),
          new DefaultFutureCallback<>(),
          MoreExecutors.directExecutor());
      // Sets to null so it won't be saved again when called multiple times.
      rttTranscript = null;
    }