diff options
author | zachh <zachh@google.com> | 2017-12-05 17:42:58 -0800 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2017-12-07 18:26:26 -0800 |
commit | 5194036b423d455a517d06b38fd616a8bbfc4896 (patch) | |
tree | d9437bc5c8be48e7122c88b8c3e36edc94443b9d /java/com/android/dialer/calllog/datasources | |
parent | 6f7d6f1bc3f90d16f5b90c8424a5783f07bef1ec (diff) |
Switched CallLogDataSource interface to be Future based.
Bug: 34672501
Test: existing
PiperOrigin-RevId: 178038086
Change-Id: I1230992ad04bb4415f5a29bd15802d23dff88012
Diffstat (limited to 'java/com/android/dialer/calllog/datasources')
5 files changed, 64 insertions, 93 deletions
diff --git a/java/com/android/dialer/calllog/datasources/CallLogDataSource.java b/java/com/android/dialer/calllog/datasources/CallLogDataSource.java index 3fff3ba53..60654a81a 100644 --- a/java/com/android/dialer/calllog/datasources/CallLogDataSource.java +++ b/java/com/android/dialer/calllog/datasources/CallLogDataSource.java @@ -21,6 +21,7 @@ import android.content.Context; import android.support.annotation.MainThread; import android.support.annotation.WorkerThread; import com.android.dialer.calllog.database.contract.AnnotatedCallLogContract; +import com.google.common.util.concurrent.ListenableFuture; import java.util.List; /** @@ -64,8 +65,7 @@ public interface CallLogDataSource { * * @see CallLogDataSource class doc for complete lifecyle information */ - @WorkerThread - boolean isDirty(Context appContext); + ListenableFuture<Boolean> isDirty(Context appContext); /** * Computes the set of mutations necessary to update the annotated call log with respect to this @@ -76,8 +76,7 @@ public interface CallLogDataSource { * contain inserts from the system call log, and these inserts should be modified by each data * source. */ - @WorkerThread - void fill(Context appContext, CallLogMutations mutations); + ListenableFuture<Void> fill(Context appContext, CallLogMutations mutations); /** * Called after database mutations have been applied to all data sources. This is useful for @@ -86,8 +85,7 @@ public interface CallLogDataSource { * * @see CallLogDataSource class doc for complete lifecyle information */ - @WorkerThread - void onSuccessfulFill(Context appContext); + ListenableFuture<Void> onSuccessfulFill(Context appContext); /** * Combines raw annotated call log rows into a single coalesced row. diff --git a/java/com/android/dialer/calllog/datasources/DataSources.java b/java/com/android/dialer/calllog/datasources/DataSources.java index 113a9f7b1..9fe6c1db3 100644 --- a/java/com/android/dialer/calllog/datasources/DataSources.java +++ b/java/com/android/dialer/calllog/datasources/DataSources.java @@ -16,13 +16,12 @@ package com.android.dialer.calllog.datasources; -import com.android.dialer.calllog.datasources.systemcalllog.SystemCallLogDataSource; import com.google.common.collect.ImmutableList; /** Immutable lists of data sources used to populate the annotated call log. */ public interface DataSources { - SystemCallLogDataSource getSystemCallLogDataSource(); + CallLogDataSource getSystemCallLogDataSource(); ImmutableList<CallLogDataSource> getDataSourcesIncludingSystemCallLog(); diff --git a/java/com/android/dialer/calllog/datasources/contacts/ContactsDataSource.java b/java/com/android/dialer/calllog/datasources/contacts/ContactsDataSource.java deleted file mode 100644 index f0384b09a..000000000 --- a/java/com/android/dialer/calllog/datasources/contacts/ContactsDataSource.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * 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.dialer.calllog.datasources.contacts; - -import android.content.ContentValues; -import android.content.Context; -import android.support.annotation.MainThread; -import android.support.annotation.WorkerThread; -import com.android.dialer.calllog.datasources.CallLogDataSource; -import com.android.dialer.calllog.datasources.CallLogMutations; -import com.android.dialer.common.Assert; -import java.util.List; -import javax.inject.Inject; - -/** Responsible for maintaining the contacts related columns in the annotated call log. */ -public final class ContactsDataSource implements CallLogDataSource { - - @Inject - public ContactsDataSource() {} - - @WorkerThread - @Override - public boolean isDirty(Context appContext) { - Assert.isWorkerThread(); - - // TODO(zachh): Implementation. - return false; - } - - @WorkerThread - @Override - public void fill( - Context appContext, - CallLogMutations mutations) { - Assert.isWorkerThread(); - // TODO(zachh): Implementation. - } - - @Override - public void onSuccessfulFill(Context appContext) { - // TODO(zachh): Implementation. - } - - @Override - public ContentValues coalesce(List<ContentValues> individualRowsSortedByTimestampDesc) { - // TODO(zachh): Implementation. - return new ContentValues(); - } - - @MainThread - @Override - public void registerContentObservers( - Context appContext, ContentObserverCallbacks contentObserverCallbacks) { - // TODO(zachh): Guard against missing permissions during callback registration. - } -} diff --git a/java/com/android/dialer/calllog/datasources/phonelookup/PhoneLookupDataSource.java b/java/com/android/dialer/calllog/datasources/phonelookup/PhoneLookupDataSource.java index 010cb8541..41eaf2bae 100644 --- a/java/com/android/dialer/calllog/datasources/phonelookup/PhoneLookupDataSource.java +++ b/java/com/android/dialer/calllog/datasources/phonelookup/PhoneLookupDataSource.java @@ -29,6 +29,7 @@ import com.android.dialer.calllog.database.contract.AnnotatedCallLogContract.Ann import com.android.dialer.calllog.datasources.CallLogDataSource; import com.android.dialer.calllog.datasources.CallLogMutations; import com.android.dialer.common.LogUtil; +import com.android.dialer.common.concurrent.Annotations.NonUiParallel; import com.android.dialer.phonelookup.PhoneLookup; import com.android.dialer.phonelookup.PhoneLookupInfo; import com.android.dialer.phonelookup.PhoneLookupSelector; @@ -37,6 +38,9 @@ import com.android.dialer.phonenumberproto.DialerPhoneNumberUtil; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Maps; +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.ListeningExecutorService; +import com.google.common.util.concurrent.MoreExecutors; import com.google.i18n.phonenumbers.PhoneNumberUtil; import com.google.protobuf.InvalidProtocolBufferException; import java.util.Arrays; @@ -45,6 +49,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; import javax.inject.Inject; /** @@ -54,15 +59,31 @@ import javax.inject.Inject; public final class PhoneLookupDataSource implements CallLogDataSource { private final PhoneLookup phoneLookup; + private final ListeningExecutorService executorService; @Inject - PhoneLookupDataSource(PhoneLookup phoneLookup) { + PhoneLookupDataSource(PhoneLookup phoneLookup, @NonUiParallel ExecutorService executorService) { this.phoneLookup = phoneLookup; + this.executorService = MoreExecutors.listeningDecorator(executorService); + } + + @Override + public ListenableFuture<Boolean> isDirty(Context appContext) { + return executorService.submit(() -> isDirtyInternal(appContext)); + } + + @Override + public ListenableFuture<Void> fill(Context appContext, CallLogMutations mutations) { + return executorService.submit(() -> fillInternal(appContext, mutations)); } - @WorkerThread @Override - public boolean isDirty(Context appContext) { + public ListenableFuture<Void> onSuccessfulFill(Context appContext) { + return executorService.submit(this::onSuccessfulFillInternal); + } + + @WorkerThread + private boolean isDirtyInternal(Context appContext) { ImmutableSet<DialerPhoneNumber> uniqueDialerPhoneNumbers = queryDistinctDialerPhoneNumbersFromAnnotatedCallLog(appContext); @@ -102,8 +123,7 @@ public final class PhoneLookupDataSource implements CallLogDataSource { * </ul> */ @WorkerThread - @Override - public void fill(Context appContext, CallLogMutations mutations) { + private Void fillInternal(Context appContext, CallLogMutations mutations) { Map<DialerPhoneNumber, Set<Long>> annotatedCallLogIdsByNumber = queryIdAndNumberFromAnnotatedCallLog(appContext); ImmutableMap<DialerPhoneNumber, PhoneLookupInfo> originalPhoneLookupInfosByNumber = @@ -137,12 +157,13 @@ public final class PhoneLookupDataSource implements CallLogDataSource { } } updateMutations(rowsToUpdate.build(), mutations); + return null; } @WorkerThread - @Override - public void onSuccessfulFill(Context appContext) { + private Void onSuccessfulFillInternal() { // TODO(zachh): Update PhoneLookupHistory. + return null; } @WorkerThread diff --git a/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java b/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java index ef40c308e..dfc768c0a 100644 --- a/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java +++ b/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java @@ -45,15 +45,20 @@ import com.android.dialer.calllog.datasources.util.RowCombiner; import com.android.dialer.calllogutils.PhoneAccountUtils; import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; +import com.android.dialer.common.concurrent.Annotations.NonUiParallel; import com.android.dialer.common.concurrent.ThreadUtil; import com.android.dialer.phonenumberproto.DialerPhoneNumberUtil; import com.android.dialer.storage.StorageComponent; import com.android.dialer.theme.R; import com.android.dialer.util.PermissionsUtil; +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.ListeningExecutorService; +import com.google.common.util.concurrent.MoreExecutors; import com.google.i18n.phonenumbers.PhoneNumberUtil; import java.util.Arrays; import java.util.List; import java.util.Set; +import java.util.concurrent.ExecutorService; import javax.inject.Inject; /** @@ -66,10 +71,14 @@ public class SystemCallLogDataSource implements CallLogDataSource { @VisibleForTesting static final String PREF_LAST_TIMESTAMP_PROCESSED = "systemCallLogLastTimestampProcessed"; + private final ListeningExecutorService executorService; + @Nullable private Long lastTimestampProcessed; @Inject - public SystemCallLogDataSource() {} + SystemCallLogDataSource(@NonUiParallel ExecutorService executorService) { + this.executorService = MoreExecutors.listeningDecorator(executorService); + } @MainThread @Override @@ -94,9 +103,23 @@ public class SystemCallLogDataSource implements CallLogDataSource { ThreadUtil.getUiThreadHandler(), appContext, contentObserverCallbacks)); } - @WorkerThread @Override - public boolean isDirty(Context appContext) { + public ListenableFuture<Boolean> isDirty(Context appContext) { + return executorService.submit(() -> isDirtyInternal(appContext)); + } + + @Override + public ListenableFuture<Void> fill(Context appContext, CallLogMutations mutations) { + return executorService.submit(() -> fillInternal(appContext, mutations)); + } + + @Override + public ListenableFuture<Void> onSuccessfulFill(Context appContext) { + return executorService.submit(() -> onSuccessfulFillInternal(appContext)); + } + + @WorkerThread + private boolean isDirtyInternal(Context appContext) { Assert.isWorkerThread(); /* @@ -113,15 +136,14 @@ public class SystemCallLogDataSource implements CallLogDataSource { } @WorkerThread - @Override - public void fill(Context appContext, CallLogMutations mutations) { + private Void fillInternal(Context appContext, CallLogMutations mutations) { Assert.isWorkerThread(); lastTimestampProcessed = null; if (!PermissionsUtil.hasPermission(appContext, permission.READ_CALL_LOG)) { LogUtil.i("SystemCallLogDataSource.fill", "no call log permissions"); - return; + return null; } // This data source should always run first so the mutations should always be empty. @@ -136,11 +158,11 @@ public class SystemCallLogDataSource implements CallLogDataSource { handleInsertsAndUpdates(appContext, mutations, annotatedCallLogIds); handleDeletes(appContext, annotatedCallLogIds, mutations); + return null; } @WorkerThread - @Override - public void onSuccessfulFill(Context appContext) { + private Void onSuccessfulFillInternal(Context appContext) { // If a fill operation was a no-op, lastTimestampProcessed could still be null. if (lastTimestampProcessed != null) { StorageComponent.get(appContext) @@ -149,6 +171,7 @@ public class SystemCallLogDataSource implements CallLogDataSource { .putLong(PREF_LAST_TIMESTAMP_PROCESSED, lastTimestampProcessed) .apply(); } + return null; } @Override |