blob: 7d8c3676d79231241471ae26260dfe0c9c11bd77 [file] [log] [blame]
Michael Kolb14612442011-06-24 13:06:29 -07001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Bijan Amirzada41242f22014-03-21 12:12:18 -070016package com.android.browser;
Michael Kolb14612442011-06-24 13:06:29 -070017
18import android.content.Context;
19import android.os.Handler;
20import android.os.Looper;
Michael Kolb14612442011-06-24 13:06:29 -070021import android.util.Log;
Bijan Amirzada9b1e9882014-02-26 17:15:46 -080022import org.codeaurora.swe.WebView;
Michael Kolb14612442011-06-24 13:06:29 -070023
Michael Kolb14612442011-06-24 13:06:29 -070024import java.util.Map;
25
26/**
27 * Singleton class for handling preload requests.
28 */
29public class Preloader {
30
31 private final static String LOGTAG = "browser.preloader";
Bijan Amirzada41242f22014-03-21 12:12:18 -070032 private final static boolean LOGD_ENABLED = com.android.browser.Browser.LOGD_ENABLED;
Michael Kolb14612442011-06-24 13:06:29 -070033
34 private static final int PRERENDER_TIMEOUT_MILLIS = 30 * 1000; // 30s
35
36 private static Preloader sInstance;
37
38 private final Context mContext;
39 private final Handler mHandler;
40 private final BrowserWebViewFactory mFactory;
Narayan Kamathf27b7102011-07-22 13:11:53 +010041 private volatile PreloaderSession mSession;
Michael Kolb14612442011-06-24 13:06:29 -070042
43 public static void initialize(Context context) {
44 sInstance = new Preloader(context);
45 }
46
47 public static Preloader getInstance() {
48 return sInstance;
49 }
50
51 private Preloader(Context context) {
Ben Murdoch914c5592011-08-01 13:58:47 +010052 mContext = context.getApplicationContext();
Michael Kolb14612442011-06-24 13:06:29 -070053 mHandler = new Handler(Looper.getMainLooper());
Narayan Kamathf27b7102011-07-22 13:11:53 +010054 mSession = null;
Michael Kolb14612442011-06-24 13:06:29 -070055 mFactory = new BrowserWebViewFactory(context);
56
57 }
58
59 private PreloaderSession getSession(String id) {
Narayan Kamathf27b7102011-07-22 13:11:53 +010060 if (mSession == null) {
Michael Kolb14612442011-06-24 13:06:29 -070061 if (LOGD_ENABLED) Log.d(LOGTAG, "Create new preload session " + id);
Narayan Kamathf27b7102011-07-22 13:11:53 +010062 mSession = new PreloaderSession(id);
63 WebViewTimersControl.getInstance().onPrerenderStart(
64 mSession.getWebView());
65 return mSession;
66 } else if (mSession.mId.equals(id)) {
67 if (LOGD_ENABLED) Log.d(LOGTAG, "Returning existing preload session " + id);
68 return mSession;
Michael Kolb14612442011-06-24 13:06:29 -070069 }
Narayan Kamathf27b7102011-07-22 13:11:53 +010070
71 if (LOGD_ENABLED) Log.d(LOGTAG, "Existing session in progress : " + mSession.mId +
72 " returning null.");
73 return null;
Michael Kolb14612442011-06-24 13:06:29 -070074 }
75
76 private PreloaderSession takeSession(String id) {
Narayan Kamathf27b7102011-07-22 13:11:53 +010077 PreloaderSession s = null;
78 if (mSession != null && mSession.mId.equals(id)) {
79 s = mSession;
80 mSession = null;
81 }
82
Michael Kolb14612442011-06-24 13:06:29 -070083 if (s != null) {
84 s.cancelTimeout();
85 }
Narayan Kamathf27b7102011-07-22 13:11:53 +010086
Michael Kolb14612442011-06-24 13:06:29 -070087 return s;
88 }
89
Mathew Inwood29721c22011-06-29 17:55:24 +010090 public void handlePreloadRequest(String id, String url, Map<String, String> headers,
91 String searchBoxQuery) {
Michael Kolb14612442011-06-24 13:06:29 -070092 PreloaderSession s = getSession(id);
Narayan Kamathf27b7102011-07-22 13:11:53 +010093 if (s == null) {
94 if (LOGD_ENABLED) Log.d(LOGTAG, "Discarding preload request, existing"
95 + " session in progress");
96 return;
97 }
98
Michael Kolb14612442011-06-24 13:06:29 -070099 s.touch(); // reset timer
Mathew Inwood29721c22011-06-29 17:55:24 +0100100 PreloadedTabControl tab = s.getTabControl();
101 if (searchBoxQuery != null) {
102 tab.loadUrlIfChanged(url, headers);
103 tab.setQuery(searchBoxQuery);
104 } else {
105 tab.loadUrl(url, headers);
106 }
Michael Kolb14612442011-06-24 13:06:29 -0700107 }
108
Mathew Inwooddffa72f2011-08-10 12:37:43 +0100109 public void cancelSearchBoxPreload(String id) {
110 PreloaderSession s = getSession(id);
111 if (s != null) {
112 s.touch(); // reset timer
113 PreloadedTabControl tab = s.getTabControl();
114 tab.searchBoxCancel();
115 }
116 }
117
Michael Kolb14612442011-06-24 13:06:29 -0700118 public void discardPreload(String id) {
119 PreloaderSession s = takeSession(id);
120 if (s != null) {
121 if (LOGD_ENABLED) Log.d(LOGTAG, "Discard preload session " + id);
Mathew Inwoodcf9120e2011-08-02 17:36:07 +0100122 WebViewTimersControl.getInstance().onPrerenderDone(s == null ? null : s.getWebView());
Mathew Inwood29721c22011-06-29 17:55:24 +0100123 PreloadedTabControl t = s.getTabControl();
Michael Kolb14612442011-06-24 13:06:29 -0700124 t.destroy();
Mathew Inwood29721c22011-06-29 17:55:24 +0100125 } else {
126 if (LOGD_ENABLED) Log.d(LOGTAG, "Ignored discard request " + id);
Michael Kolb14612442011-06-24 13:06:29 -0700127 }
128 }
129
130 /**
131 * Return a preloaded tab, and remove it from the preloader. This is used when the
132 * view is about to be displayed.
133 */
Mathew Inwood29721c22011-06-29 17:55:24 +0100134 public PreloadedTabControl getPreloadedTab(String id) {
Michael Kolb14612442011-06-24 13:06:29 -0700135 PreloaderSession s = takeSession(id);
136 if (LOGD_ENABLED) Log.d(LOGTAG, "Showing preload session " + id + "=" + s);
Mathew Inwood29721c22011-06-29 17:55:24 +0100137 return s == null ? null : s.getTabControl();
Michael Kolb14612442011-06-24 13:06:29 -0700138 }
139
140 private class PreloaderSession {
141 private final String mId;
Mathew Inwood29721c22011-06-29 17:55:24 +0100142 private final PreloadedTabControl mTabControl;
Michael Kolb14612442011-06-24 13:06:29 -0700143
144 private final Runnable mTimeoutTask = new Runnable(){
145 @Override
146 public void run() {
147 if (LOGD_ENABLED) Log.d(LOGTAG, "Preload session timeout " + mId);
148 discardPreload(mId);
149 }};
150
151 public PreloaderSession(String id) {
152 mId = id;
Mathew Inwood29721c22011-06-29 17:55:24 +0100153 mTabControl = new PreloadedTabControl(
154 new Tab(new PreloadController(mContext), mFactory.createWebView(false)));
Michael Kolb14612442011-06-24 13:06:29 -0700155 touch();
156 }
157
158 public void cancelTimeout() {
159 mHandler.removeCallbacks(mTimeoutTask);
160 }
161
162 public void touch() {
163 cancelTimeout();
164 mHandler.postDelayed(mTimeoutTask, PRERENDER_TIMEOUT_MILLIS);
165 }
166
Mathew Inwood29721c22011-06-29 17:55:24 +0100167 public PreloadedTabControl getTabControl() {
168 return mTabControl;
Michael Kolb14612442011-06-24 13:06:29 -0700169 }
170
Mathew Inwoode1dbb952011-07-08 17:27:38 +0100171 public WebView getWebView() {
172 Tab t = mTabControl.getTab();
173 return t == null? null : t.getWebView();
174 }
175
Michael Kolb14612442011-06-24 13:06:29 -0700176 }
177
178}