blob: 5f90487e03ff2f4cd0d05ef7e6d90754596ad485 [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);
Michael Kolb14612442011-06-24 13:06:29 -070056 }
57
58 private PreloaderSession getSession(String id) {
Narayan Kamathf27b7102011-07-22 13:11:53 +010059 if (mSession == null) {
Michael Kolb14612442011-06-24 13:06:29 -070060 if (LOGD_ENABLED) Log.d(LOGTAG, "Create new preload session " + id);
Narayan Kamathf27b7102011-07-22 13:11:53 +010061 mSession = new PreloaderSession(id);
62 WebViewTimersControl.getInstance().onPrerenderStart(
63 mSession.getWebView());
64 return mSession;
65 } else if (mSession.mId.equals(id)) {
66 if (LOGD_ENABLED) Log.d(LOGTAG, "Returning existing preload session " + id);
67 return mSession;
Michael Kolb14612442011-06-24 13:06:29 -070068 }
Narayan Kamathf27b7102011-07-22 13:11:53 +010069
70 if (LOGD_ENABLED) Log.d(LOGTAG, "Existing session in progress : " + mSession.mId +
71 " returning null.");
72 return null;
Michael Kolb14612442011-06-24 13:06:29 -070073 }
74
75 private PreloaderSession takeSession(String id) {
Narayan Kamathf27b7102011-07-22 13:11:53 +010076 PreloaderSession s = null;
77 if (mSession != null && mSession.mId.equals(id)) {
78 s = mSession;
79 mSession = null;
80 }
81
Michael Kolb14612442011-06-24 13:06:29 -070082 if (s != null) {
83 s.cancelTimeout();
84 }
Narayan Kamathf27b7102011-07-22 13:11:53 +010085
Michael Kolb14612442011-06-24 13:06:29 -070086 return s;
87 }
88
Mathew Inwood29721c22011-06-29 17:55:24 +010089 public void handlePreloadRequest(String id, String url, Map<String, String> headers,
90 String searchBoxQuery) {
Michael Kolb14612442011-06-24 13:06:29 -070091 PreloaderSession s = getSession(id);
Narayan Kamathf27b7102011-07-22 13:11:53 +010092 if (s == null) {
93 if (LOGD_ENABLED) Log.d(LOGTAG, "Discarding preload request, existing"
94 + " session in progress");
95 return;
96 }
97
Michael Kolb14612442011-06-24 13:06:29 -070098 s.touch(); // reset timer
Mathew Inwood29721c22011-06-29 17:55:24 +010099 PreloadedTabControl tab = s.getTabControl();
100 if (searchBoxQuery != null) {
101 tab.loadUrlIfChanged(url, headers);
102 tab.setQuery(searchBoxQuery);
103 } else {
104 tab.loadUrl(url, headers);
105 }
Michael Kolb14612442011-06-24 13:06:29 -0700106 }
107
Mathew Inwooddffa72f2011-08-10 12:37:43 +0100108 public void cancelSearchBoxPreload(String id) {
109 PreloaderSession s = getSession(id);
110 if (s != null) {
111 s.touch(); // reset timer
112 PreloadedTabControl tab = s.getTabControl();
113 tab.searchBoxCancel();
114 }
115 }
116
Michael Kolb14612442011-06-24 13:06:29 -0700117 public void discardPreload(String id) {
118 PreloaderSession s = takeSession(id);
119 if (s != null) {
120 if (LOGD_ENABLED) Log.d(LOGTAG, "Discard preload session " + id);
Mathew Inwoodcf9120e2011-08-02 17:36:07 +0100121 WebViewTimersControl.getInstance().onPrerenderDone(s == null ? null : s.getWebView());
Mathew Inwood29721c22011-06-29 17:55:24 +0100122 PreloadedTabControl t = s.getTabControl();
Michael Kolb14612442011-06-24 13:06:29 -0700123 t.destroy();
Mathew Inwood29721c22011-06-29 17:55:24 +0100124 } else {
125 if (LOGD_ENABLED) Log.d(LOGTAG, "Ignored discard request " + id);
Michael Kolb14612442011-06-24 13:06:29 -0700126 }
127 }
128
129 /**
130 * Return a preloaded tab, and remove it from the preloader. This is used when the
131 * view is about to be displayed.
132 */
Mathew Inwood29721c22011-06-29 17:55:24 +0100133 public PreloadedTabControl getPreloadedTab(String id) {
Michael Kolb14612442011-06-24 13:06:29 -0700134 PreloaderSession s = takeSession(id);
135 if (LOGD_ENABLED) Log.d(LOGTAG, "Showing preload session " + id + "=" + s);
Mathew Inwood29721c22011-06-29 17:55:24 +0100136 return s == null ? null : s.getTabControl();
Michael Kolb14612442011-06-24 13:06:29 -0700137 }
138
139 private class PreloaderSession {
140 private final String mId;
Mathew Inwood29721c22011-06-29 17:55:24 +0100141 private final PreloadedTabControl mTabControl;
Michael Kolb14612442011-06-24 13:06:29 -0700142
143 private final Runnable mTimeoutTask = new Runnable(){
144 @Override
145 public void run() {
146 if (LOGD_ENABLED) Log.d(LOGTAG, "Preload session timeout " + mId);
147 discardPreload(mId);
148 }};
149
150 public PreloaderSession(String id) {
151 mId = id;
Mathew Inwood29721c22011-06-29 17:55:24 +0100152 mTabControl = new PreloadedTabControl(
153 new Tab(new PreloadController(mContext), mFactory.createWebView(false)));
Michael Kolb14612442011-06-24 13:06:29 -0700154 touch();
155 }
156
157 public void cancelTimeout() {
158 mHandler.removeCallbacks(mTimeoutTask);
159 }
160
161 public void touch() {
162 cancelTimeout();
163 mHandler.postDelayed(mTimeoutTask, PRERENDER_TIMEOUT_MILLIS);
164 }
165
Mathew Inwood29721c22011-06-29 17:55:24 +0100166 public PreloadedTabControl getTabControl() {
167 return mTabControl;
Michael Kolb14612442011-06-24 13:06:29 -0700168 }
169
Mathew Inwoode1dbb952011-07-08 17:27:38 +0100170 public WebView getWebView() {
171 Tab t = mTabControl.getTab();
172 return t == null? null : t.getWebView();
173 }
174
Michael Kolb14612442011-06-24 13:06:29 -0700175 }
176
177}