blob: 336b77aad96dc6d91b1d2c5d4bfa7e12267522d6 [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 */
16package com.android.browser;
17
18import android.content.Context;
19import android.os.Handler;
20import android.os.Looper;
Michael Kolb14612442011-06-24 13:06:29 -070021import android.util.Log;
Michael Kolb14612442011-06-24 13:06:29 -070022
23import java.util.HashMap;
24import 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";
Mathew Inwood29721c22011-06-29 17:55:24 +010032 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;
41 private final HashMap<String, PreloaderSession> mSessions;
42
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) {
52 mContext = context;
53 mHandler = new Handler(Looper.getMainLooper());
54 mSessions = new HashMap<String, PreloaderSession>();
55 mFactory = new BrowserWebViewFactory(context);
56
57 }
58
59 private PreloaderSession getSession(String id) {
60 PreloaderSession s = mSessions.get(id);
61 if (s == null) {
62 if (LOGD_ENABLED) Log.d(LOGTAG, "Create new preload session " + id);
63 s = new PreloaderSession(id);
64 mSessions.put(id, s);
65 }
66 return s;
67 }
68
69 private PreloaderSession takeSession(String id) {
70 PreloaderSession s = mSessions.remove(id);
71 if (s != null) {
72 s.cancelTimeout();
73 }
74 return s;
75 }
76
Mathew Inwood29721c22011-06-29 17:55:24 +010077 public void handlePreloadRequest(String id, String url, Map<String, String> headers,
78 String searchBoxQuery) {
Michael Kolb14612442011-06-24 13:06:29 -070079 PreloaderSession s = getSession(id);
80 s.touch(); // reset timer
Mathew Inwood29721c22011-06-29 17:55:24 +010081 PreloadedTabControl tab = s.getTabControl();
82 if (searchBoxQuery != null) {
83 tab.loadUrlIfChanged(url, headers);
84 tab.setQuery(searchBoxQuery);
85 } else {
86 tab.loadUrl(url, headers);
87 }
Michael Kolb14612442011-06-24 13:06:29 -070088 }
89
90 public void discardPreload(String id) {
91 PreloaderSession s = takeSession(id);
92 if (s != null) {
93 if (LOGD_ENABLED) Log.d(LOGTAG, "Discard preload session " + id);
Mathew Inwood29721c22011-06-29 17:55:24 +010094 PreloadedTabControl t = s.getTabControl();
Michael Kolb14612442011-06-24 13:06:29 -070095 t.destroy();
Mathew Inwood29721c22011-06-29 17:55:24 +010096 } else {
97 if (LOGD_ENABLED) Log.d(LOGTAG, "Ignored discard request " + id);
Michael Kolb14612442011-06-24 13:06:29 -070098 }
99 }
100
101 /**
102 * Return a preloaded tab, and remove it from the preloader. This is used when the
103 * view is about to be displayed.
104 */
Mathew Inwood29721c22011-06-29 17:55:24 +0100105 public PreloadedTabControl getPreloadedTab(String id) {
Michael Kolb14612442011-06-24 13:06:29 -0700106 PreloaderSession s = takeSession(id);
107 if (LOGD_ENABLED) Log.d(LOGTAG, "Showing preload session " + id + "=" + s);
Mathew Inwood29721c22011-06-29 17:55:24 +0100108 return s == null ? null : s.getTabControl();
Michael Kolb14612442011-06-24 13:06:29 -0700109 }
110
111 private class PreloaderSession {
112 private final String mId;
Mathew Inwood29721c22011-06-29 17:55:24 +0100113 private final PreloadedTabControl mTabControl;
Michael Kolb14612442011-06-24 13:06:29 -0700114
115 private final Runnable mTimeoutTask = new Runnable(){
116 @Override
117 public void run() {
118 if (LOGD_ENABLED) Log.d(LOGTAG, "Preload session timeout " + mId);
119 discardPreload(mId);
120 }};
121
122 public PreloaderSession(String id) {
123 mId = id;
Mathew Inwood29721c22011-06-29 17:55:24 +0100124 mTabControl = new PreloadedTabControl(
125 new Tab(new PreloadController(mContext), mFactory.createWebView(false)));
Michael Kolb14612442011-06-24 13:06:29 -0700126 touch();
127 }
128
129 public void cancelTimeout() {
130 mHandler.removeCallbacks(mTimeoutTask);
131 }
132
133 public void touch() {
134 cancelTimeout();
135 mHandler.postDelayed(mTimeoutTask, PRERENDER_TIMEOUT_MILLIS);
136 }
137
Mathew Inwood29721c22011-06-29 17:55:24 +0100138 public PreloadedTabControl getTabControl() {
139 return mTabControl;
Michael Kolb14612442011-06-24 13:06:29 -0700140 }
141
142 }
143
144}