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