Loading java/com/android/dialer/calldetails/CallDetailsActivityCommon.java +13 −26 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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}, Loading Loading @@ -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 Loading java/com/android/dialer/rtt/RttTranscriptActivity.java +1 −8 Original line number Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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); Loading Loading @@ -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)); } } java/com/android/dialer/rtt/RttTranscriptUtil.java +50 −20 Original line number Diff line number Diff line Loading @@ -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() Loading @@ -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"); } Loading java/com/android/incallui/call/DialerCall.java +4 −12 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; } Loading Loading
java/com/android/dialer/calldetails/CallDetailsActivityCommon.java +13 −26 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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}, Loading Loading @@ -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 Loading
java/com/android/dialer/rtt/RttTranscriptActivity.java +1 −8 Original line number Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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); Loading Loading @@ -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)); } }
java/com/android/dialer/rtt/RttTranscriptUtil.java +50 −20 Original line number Diff line number Diff line Loading @@ -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() Loading @@ -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"); } Loading
java/com/android/incallui/call/DialerCall.java +4 −12 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; } Loading