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
This commit is contained in:
@@ -20,13 +20,24 @@ 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. */
|
||||
@@ -35,8 +46,30 @@ public abstract class DynamicDataObserver extends ContentObserver {
|
||||
/** 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user