blob: d3ec6031ace475ef915875334cedafbd3394ea07 [file] [log] [blame]
/*
* Copyright (C) 2007 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 android.webkit;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.Process;
import android.util.Log;
abstract class WebSyncManager implements Runnable {
// message code for sync message
private static final int SYNC_MESSAGE = 101;
// time delay in millisec for a sync (now) message
private static int SYNC_NOW_INTERVAL = 100; // 100 millisec
// time delay in millisec for a sync (later) message
private static int SYNC_LATER_INTERVAL = 5 * 60 * 1000; // 5 minutes
// thread for syncing
private Thread mSyncThread;
// Name of thread
private String mThreadName;
// handler of the sync thread
protected Handler mHandler;
// database for the persistent storage
protected WebViewDatabase mDataBase;
// Ref count for calls to start/stop sync
private int mStartSyncRefCount;
// log tag
protected static final String LOGTAG = "websync";
private class SyncHandler extends Handler {
@Override
public void handleMessage(Message msg) {
if (msg.what == SYNC_MESSAGE) {
if (DebugFlags.WEB_SYNC_MANAGER) {
Log.v(LOGTAG, "*** WebSyncManager sync ***");
}
syncFromRamToFlash();
// send a delayed message to request sync later
Message newmsg = obtainMessage(SYNC_MESSAGE);
sendMessageDelayed(newmsg, SYNC_LATER_INTERVAL);
}
}
}
protected WebSyncManager(Context context, String name) {
mThreadName = name;
if (context != null) {
mDataBase = WebViewDatabase.getInstance(context);
mSyncThread = new Thread(this);
mSyncThread.setName(mThreadName);
mSyncThread.start();
} else {
throw new IllegalStateException(
"WebSyncManager can't be created without context");
}
}
protected Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException("doesn't implement Cloneable");
}
public void run() {
// prepare Looper for sync handler
Looper.prepare();
mHandler = new SyncHandler();
onSyncInit();
// lower the priority after onSyncInit() is done
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
Message msg = mHandler.obtainMessage(SYNC_MESSAGE);
mHandler.sendMessageDelayed(msg, SYNC_LATER_INTERVAL);
Looper.loop();
}
/**
* sync() forces sync manager to sync now
*/
public void sync() {
if (DebugFlags.WEB_SYNC_MANAGER) {
Log.v(LOGTAG, "*** WebSyncManager sync ***");
}
if (mHandler == null) {
return;
}
mHandler.removeMessages(SYNC_MESSAGE);
Message msg = mHandler.obtainMessage(SYNC_MESSAGE);
mHandler.sendMessageDelayed(msg, SYNC_NOW_INTERVAL);
}
/**
* resetSync() resets sync manager's timer
*/
public void resetSync() {
if (DebugFlags.WEB_SYNC_MANAGER) {
Log.v(LOGTAG, "*** WebSyncManager resetSync ***");
}
if (mHandler == null) {
return;
}
mHandler.removeMessages(SYNC_MESSAGE);
Message msg = mHandler.obtainMessage(SYNC_MESSAGE);
mHandler.sendMessageDelayed(msg, SYNC_LATER_INTERVAL);
}
/**
* startSync() requests sync manager to start sync
*/
public void startSync() {
if (DebugFlags.WEB_SYNC_MANAGER) {
Log.v(LOGTAG, "*** WebSyncManager startSync ***, Ref count:" +
mStartSyncRefCount);
}
if (mHandler == null) {
return;
}
if (++mStartSyncRefCount == 1) {
Message msg = mHandler.obtainMessage(SYNC_MESSAGE);
mHandler.sendMessageDelayed(msg, SYNC_LATER_INTERVAL);
}
}
/**
* stopSync() requests sync manager to stop sync. remove any SYNC_MESSAGE in
* the queue to break the sync loop
*/
public void stopSync() {
if (DebugFlags.WEB_SYNC_MANAGER) {
Log.v(LOGTAG, "*** WebSyncManager stopSync ***, Ref count:" +
mStartSyncRefCount);
}
if (mHandler == null) {
return;
}
if (--mStartSyncRefCount == 0) {
mHandler.removeMessages(SYNC_MESSAGE);
}
}
protected void onSyncInit() {
}
abstract void syncFromRamToFlash();
}