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
76 lines
2.1 KiB
Java
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();
|
|
}
|
|
}
|
|
}
|