162 lines
5.1 KiB
Java
162 lines
5.1 KiB
Java
|
/*
|
||
|
* 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();
|
||
|
}
|