// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.compositor.overlays.strip;
import android.os.Handler;
/**
* {@code TabLoadTracker} is used to handle tracking whether or not to visually show if a tab is
* loading or not.
*/
public class TabLoadTracker {
private static final long LOAD_FINISHED_VISUAL_DELAY_MS = 100;
private final Handler mHandler = new Handler();
// Callback Tracking State
private final int mId;
private final TabLoadTrackerCallback mCallback;
// Internal Loading State
private boolean mLoading;
private boolean mPageLoading;
/**
* The callback object to be notified of when the loading state changes.
*/
public interface TabLoadTrackerCallback {
/**
* Called when the loading state tracked by this tab should visually change.
* @param id The id of the Tab.
*/
public void loadStateChanged(int id);
}
/**
* Creates an instance of the {@link TabLoadTracker} class.
* @param id The id of the tab to track for callback purposes.
* @param callback The {@link TabLoadTrackerCallback} to notify on loading state changes.
*/
public TabLoadTracker(int id, TabLoadTrackerCallback callback) {
mId = id;
mCallback = callback;
}
/**
* Called when this tab has started loading.
*/
public void pageLoadingStarted() {
if (!mPageLoading) {
mPageLoading = true;
mCallback.loadStateChanged(mId);
}
mHandler.removeCallbacks(mPageLoadFinishedRunnable);
}
/**
* Called when this tab has finished loading.
*/
public void pageLoadingFinished() {
if (!mPageLoading) return;
mHandler.removeCallbacks(mPageLoadFinishedRunnable);
mHandler.postDelayed(mPageLoadFinishedRunnable, LOAD_FINISHED_VISUAL_DELAY_MS);
}
/**
* Called when this tab has started loading resources.
*/
public void loadingStarted() {
if (!mLoading) {
mLoading = true;
mCallback.loadStateChanged(mId);
}
mHandler.removeCallbacks(mLoadFinishedRunnable);
}
/**
* Called when this tab has finished loading resources.
*/
public void loadingFinished() {
if (!mLoading) return;
mHandler.removeCallbacks(mLoadFinishedRunnable);
mHandler.postDelayed(mLoadFinishedRunnable, LOAD_FINISHED_VISUAL_DELAY_MS);
}
/**
* @return Whether or not this tab should be visually represented as loading.
*/
public boolean isLoading() {
return mLoading || mPageLoading;
}
private Runnable mLoadFinishedRunnable = new Runnable() {
@Override
public void run() {
mLoading = false;
mCallback.loadStateChanged(mId);
}
};
private Runnable mPageLoadFinishedRunnable = new Runnable() {
@Override
public void run() {
mPageLoading = false;
mCallback.loadStateChanged(mId);
}
};
}