Files
app_Settings/src/com/android/settings/dashboard/DynamicDataObserver.java
Jason Chiu c9615611e1 Reduce flickers of Injection
The injection dynamic data was loaded in the background and then post to
main thread to update UI. However, it usually updates after
Fragement.onResume(), which causes the flicker.

To make it more smooth, DashboardFragment to wait for the dynamic data
observers to update UI for a short period, which eliminates the flicker
in most cases.

Also skip the repeated tiles refresh called by onCategoriesChanged in
onResume after all preferences refreshed.

Test: robotest, visual
Bug: 229177114
Change-Id: I04650af9692703f1fc1e6e5ad2090f051b1eeb81
2022-05-09 12:33:54 +08:00

76 lines
2.1 KiB
Java

/*
* Copyright (C) 2019 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.settings.dashboard;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import com.android.settingslib.utils.ThreadUtils;
import java.util.concurrent.CountDownLatch;
/**
* Observer for updating injected dynamic data.
*/
public abstract class DynamicDataObserver extends ContentObserver {
private Runnable mUpdateRunnable;
private CountDownLatch mCountDownLatch;
private boolean mUpdateDelegated;
protected DynamicDataObserver() {
super(new Handler(Looper.getMainLooper()));
mCountDownLatch = new CountDownLatch(1);
// Load data for the first time
onDataChanged();
}
/** Returns the uri of the callback. */
public abstract Uri getUri();
/** Called when data changes. */
public abstract void onDataChanged();
/** Calls the runnable to update UI */
public synchronized void updateUi() {
mUpdateDelegated = true;
if (mUpdateRunnable != null) {
mUpdateRunnable.run();
}
}
/** Returns the count-down latch */
public CountDownLatch getCountDownLatch() {
return mCountDownLatch;
}
@Override
public void onChange(boolean selfChange) {
onDataChanged();
}
protected synchronized void post(Runnable runnable) {
if (mUpdateDelegated) {
ThreadUtils.postOnMainThread(runnable);
} else {
mUpdateRunnable = runnable;
mCountDownLatch.countDown();
}
}
}