12036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba/*
22036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba * Copyright (C) 2010 The Android Open Source Project
32036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba *
42036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba * Licensed under the Apache License, Version 2.0 (the "License");
52036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba * you may not use this file except in compliance with the License.
62036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba * You may obtain a copy of the License at
72036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba *
82036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba *      http://www.apache.org/licenses/LICENSE-2.0
92036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba *
102036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba * Unless required by applicable law or agreed to in writing, software
112036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba * distributed under the License is distributed on an "AS IS" BASIS,
122036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba * See the License for the specific language governing permissions and
142036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba * limitations under the License.
152036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba */
162036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba
172036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Klobapackage android.webkit;
182036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba
192036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Klobaimport java.io.IOException;
202036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Klobaimport java.util.HashMap;
212036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Klobaimport java.util.Map;
222036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba
232036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Klobaimport android.net.http.Headers;
242036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Klobaimport android.os.Handler;
252036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Klobaimport android.os.HandlerThread;
262036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Klobaimport android.os.Looper;
272036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Klobaimport android.os.Message;
282036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba
292036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba/**
302036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba * WebViewWorker executes in a separate thread other than UI and WebViewCore. To
312036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba * avoid blocking UI or WebKit's execution, the caller can send a message to
322036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba * WebViewWorker.getHandler() and it will be handled in the WebViewWorkerThread.
332036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba */
342036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Klobafinal class WebViewWorker extends Handler {
352036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba
362036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    private static final String THREAD_NAME = "WebViewWorkerThread";
372036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba
382036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    private static WebViewWorker sWorkerHandler;
392036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba
402036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    private static Map<LoadListener, CacheManager.CacheResult> mCacheResultMap
412036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba            = new HashMap<LoadListener, CacheManager.CacheResult>();
422036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba
432036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    /**
442036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba     * Package level class to be used while creating a cache entry.
452036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba     */
462036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    static class CacheCreateData {
472036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba        LoadListener mListener;
482036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba        String mUrl;
492036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba        String mMimeType;
502036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba        int mStatusCode;
512036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba        long mPostId;
522036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba        Headers mHeaders;
532036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    }
542036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba
552036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    /**
562036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba     * Package level class to be used while saving a cache entry.
572036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba     */
582036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    static class CacheSaveData {
592036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba        LoadListener mListener;
602036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba        String mUrl;
612036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba        long mPostId;
622036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    }
632036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba
642036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    /**
652036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba     * Package level class to be used while updating a cache entry's encoding.
662036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba     */
672036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    static class CacheEncoding {
682036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba        LoadListener mListener;
692036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba        String mEncoding;
702036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    }
712036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba
722036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    /**
732036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba     * Package level class to be used while appending data to a cache entry.
742036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba     */
752036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    static class CacheData {
762036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba        LoadListener mListener;
772036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba        ByteArrayBuilder.Chunk mChunk;
782036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    }
792036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba
802036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    static synchronized WebViewWorker getHandler() {
812036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba        if (sWorkerHandler == null) {
822036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba            HandlerThread thread = new HandlerThread(THREAD_NAME,
832036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                    android.os.Process.THREAD_PRIORITY_DEFAULT
842036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                            + android.os.Process.THREAD_PRIORITY_LESS_FAVORABLE);
852036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba            thread.start();
862036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba            sWorkerHandler = new WebViewWorker(thread.getLooper());
872036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba        }
882036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba        return sWorkerHandler;
892036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    }
902036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba
912036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    private WebViewWorker(Looper looper) {
922036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba        super(looper);
932036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    }
942036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba
952036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    // trigger transaction once a minute
962036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    private static final int CACHE_TRANSACTION_TICKER_INTERVAL = 60 * 1000;
972036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba
982036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    private static boolean mCacheTickersBlocked = true;
992036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba
1002036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    // message ids
1012036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    static final int MSG_ADD_STREAMLOADER = 101;
1022036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    static final int MSG_ADD_HTTPLOADER = 102;
1032036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    static final int MSG_CREATE_CACHE = 103;
1042036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    static final int MSG_UPDATE_CACHE_ENCODING = 104;
1052036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    static final int MSG_APPEND_CACHE = 105;
1062036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    static final int MSG_SAVE_CACHE = 106;
1072036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    static final int MSG_REMOVE_CACHE = 107;
1082036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    static final int MSG_TRIM_CACHE = 108;
1092036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    static final int MSG_CLEAR_CACHE = 109;
1102036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    static final int MSG_CACHE_TRANSACTION_TICKER = 110;
1112036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    static final int MSG_PAUSE_CACHE_TRANSACTION = 111;
1122036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    static final int MSG_RESUME_CACHE_TRANSACTION = 112;
1132036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba
1142036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    @Override
1152036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    public void handleMessage(Message msg) {
1162036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba        switch(msg.what) {
1172036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba            case MSG_ADD_STREAMLOADER: {
1182036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                StreamLoader loader = (StreamLoader) msg.obj;
1192036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                loader.load();
1202036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                break;
1212036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba            }
1222036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba            case MSG_ADD_HTTPLOADER: {
1232036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                FrameLoader loader = (FrameLoader) msg.obj;
1242036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                loader.handleHTTPLoad();
1252036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                break;
1262036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba            }
1272036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba            case MSG_CREATE_CACHE: {
1282036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                CacheCreateData data = (CacheCreateData) msg.obj;
1292036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                CacheManager.CacheResult cache = CacheManager.createCacheFile(
1302036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                        data.mUrl, data.mStatusCode, data.mHeaders,
1312036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                        data.mMimeType, data.mPostId, false);
1322036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                if (cache != null) {
1332036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                    mCacheResultMap.put(data.mListener, cache);
1342036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                } else {
1352036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                    mCacheResultMap.remove(data.mListener);
1362036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                }
1372036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                break;
1382036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba            }
1392036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba            case MSG_UPDATE_CACHE_ENCODING: {
1402036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                CacheEncoding data = (CacheEncoding) msg.obj;
1412036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                CacheManager.CacheResult cache = mCacheResultMap
1422036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                        .get(data.mListener);
1432036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                if (cache != null) {
1442036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                    cache.encoding = data.mEncoding;
1452036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                }
1462036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                break;
1472036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba            }
1482036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba            case MSG_APPEND_CACHE: {
1492036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                CacheData data = (CacheData) msg.obj;
1502036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                CacheManager.CacheResult cache = mCacheResultMap
1512036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                        .get(data.mListener);
1522036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                if (cache != null) {
1532036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                    cache.contentLength += data.mChunk.mLength;
1542036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                    if (cache.contentLength > CacheManager.CACHE_MAX_SIZE) {
1552036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                        CacheManager.cleanupCacheFile(cache);
1562036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                        mCacheResultMap.remove(data.mListener);
1572036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                    } else {
1582036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                        try {
1592036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                            cache.outStream.write(data.mChunk.mArray, 0,
1602036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                                    data.mChunk.mLength);
1612036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                        } catch (IOException e) {
1622036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                            CacheManager.cleanupCacheFile(cache);
1632036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                            mCacheResultMap.remove(data.mListener);
1642036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                        }
1652036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                    }
1662036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                }
1672036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                data.mChunk.release();
1682036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                break;
1692036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba            }
1702036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba            case MSG_SAVE_CACHE: {
1712036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                CacheSaveData data = (CacheSaveData) msg.obj;
1722036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                CacheManager.CacheResult cache = mCacheResultMap
1732036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                        .get(data.mListener);
1742036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                if (cache != null) {
1752036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                    CacheManager.saveCacheFile(data.mUrl, data.mPostId, cache);
1762036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                    mCacheResultMap.remove(data.mListener);
1772036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                }
1782036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                break;
1792036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba            }
1802036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba            case MSG_REMOVE_CACHE: {
1812036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                LoadListener listener = (LoadListener) msg.obj;
1822036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                CacheManager.CacheResult cache = mCacheResultMap.get(listener);
1832036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                if (cache != null) {
1842036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                    CacheManager.cleanupCacheFile(cache);
1852036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                    mCacheResultMap.remove(listener);
1862036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                }
1872036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                break;
1882036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba            }
1892036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba            case MSG_TRIM_CACHE: {
1902036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                CacheManager.trimCacheIfNeeded();
1912036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                break;
1922036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba            }
1932036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba            case MSG_CLEAR_CACHE: {
1942036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                CacheManager.clearCache();
1952036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                break;
1962036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba            }
1972036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba            case MSG_CACHE_TRANSACTION_TICKER: {
1982036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                if (!mCacheTickersBlocked) {
1992036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                    CacheManager.endTransaction();
2002036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                    CacheManager.startTransaction();
2012036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                    sendEmptyMessageDelayed(MSG_CACHE_TRANSACTION_TICKER,
2022036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                            CACHE_TRANSACTION_TICKER_INTERVAL);
2032036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                }
2042036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                break;
2052036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba            }
2062036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba            case MSG_PAUSE_CACHE_TRANSACTION: {
2072036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                if (CacheManager.disableTransaction()) {
2082036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                    mCacheTickersBlocked = true;
2092036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                    removeMessages(MSG_CACHE_TRANSACTION_TICKER);
2102036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                }
2112036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                break;
2122036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba            }
2132036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba            case MSG_RESUME_CACHE_TRANSACTION: {
2142036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                if (CacheManager.enableTransaction()) {
2152036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                    mCacheTickersBlocked = false;
2162036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                    sendEmptyMessageDelayed(MSG_CACHE_TRANSACTION_TICKER,
2172036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                            CACHE_TRANSACTION_TICKER_INTERVAL);
2182036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                }
2192036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                break;
2202036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba            }
2212036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba        }
2222036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba    }
2232036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba}
224