packages/apps/Dialer/java/com/android/dialer/calllog/AnnotatedCallLogMigrator.java

91 lines
3.4 KiB
Java
Raw Permalink Normal View History

2025-08-25 08:38:42 +08:00
/*
* Copyright (C) 2018 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;
import android.content.SharedPreferences;
import com.android.dialer.common.LogUtil;
import com.android.dialer.common.concurrent.Annotations.BackgroundExecutor;
import com.android.dialer.storage.Unencrypted;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors;
import javax.inject.Inject;
/**
* Builds the annotated call log on application create once after the feature is enabled to reduce
* the latency the first time call log is shown.
*/
public final class AnnotatedCallLogMigrator {
private static final String PREF_MIGRATED = "annotatedCallLogMigratorMigrated";
private final SharedPreferences sharedPreferences;
private final RefreshAnnotatedCallLogWorker refreshAnnotatedCallLogWorker;
private final ListeningExecutorService backgroundExecutor;
@Inject
AnnotatedCallLogMigrator(
@Unencrypted SharedPreferences sharedPreferences,
@BackgroundExecutor ListeningExecutorService backgroundExecutor,
RefreshAnnotatedCallLogWorker refreshAnnotatedCallLogWorker) {
this.sharedPreferences = sharedPreferences;
this.backgroundExecutor = backgroundExecutor;
this.refreshAnnotatedCallLogWorker = refreshAnnotatedCallLogWorker;
}
/**
* Builds the annotated call log on application create once after the feature is enabled to reduce
* the latency the first time call log is shown.
*/
public ListenableFuture<Void> migrate() {
return Futures.transformAsync(
shouldMigrate(),
(shouldMigrate) -> {
if (!shouldMigrate) {
return Futures.immediateFuture(null);
}
LogUtil.i("AnnotatedCallLogMigrator.migrate", "migrating annotated call log");
return Futures.transform(
refreshAnnotatedCallLogWorker.refreshWithoutDirtyCheck(),
(unused) -> {
sharedPreferences.edit().putBoolean(PREF_MIGRATED, true).apply();
return null;
},
MoreExecutors.directExecutor());
},
MoreExecutors.directExecutor());
}
private ListenableFuture<Boolean> shouldMigrate() {
return backgroundExecutor.submit(() -> !sharedPreferences.getBoolean(PREF_MIGRATED, false));
}
/**
* Clears data that indicates if migration happened or not. This is necessary if migration needs
* to happen again, for example because the call log framework was disabled via flags due to a
* problem.
*/
ListenableFuture<Void> clearData() {
return backgroundExecutor.submit(
() -> {
sharedPreferences.edit().remove(PREF_MIGRATED).apply();
return null;
});
}
}