X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fcom%2Fandroid%2Fbrowser%2FBrowserActivity.java;h=24694082dcf310dd9ade370d92eaca90acfda97c;hb=003a5ddf3a7ff1b30bfd82cddc8da49cb9fedf15;hp=92e1968194aa1fe7276af512be09b20754298d9a;hpb=90be8e2aaa6915fd3e8106bb3f2cd512d18d9369;p=android-x86%2Fpackages-apps-Browser.git diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java index 92e1968..2469408 100644 --- a/src/com/android/browser/BrowserActivity.java +++ b/src/com/android/browser/BrowserActivity.java @@ -23,6 +23,8 @@ import android.app.SearchManager; import android.content.ActivityNotFoundException; import android.content.BroadcastReceiver; import android.content.ComponentName; +import android.content.ContentProvider; +import android.content.ContentProviderClient; import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; @@ -65,11 +67,13 @@ import android.provider.ContactsContract; import android.provider.ContactsContract.Intents.Insert; import android.provider.Downloads; import android.provider.MediaStore; +import android.speech.RecognizerResultsIntent; import android.text.IClipboard; import android.text.TextUtils; import android.text.format.DateFormat; import android.util.AttributeSet; import android.util.Log; +import android.util.Patterns; import android.view.ContextMenu; import android.view.Gravity; import android.view.KeyEvent; @@ -107,9 +111,8 @@ import android.accounts.AuthenticatorException; import android.accounts.OperationCanceledException; import android.accounts.AccountManagerCallback; -import com.android.common.Patterns; - -import com.google.android.googlelogin.GoogleLoginServiceConstants; +import com.android.common.Search; +import com.android.common.speech.LoggingEvents; import java.io.ByteArrayOutputStream; import java.io.File; @@ -123,6 +126,11 @@ import java.net.URLEncoder; import java.text.ParseException; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -147,13 +155,20 @@ public class BrowserActivity extends Activity private Account[] mAccountsGoogle; private Account[] mAccountsPreferHosted; + // XXX: These constants should be exposed through some public api. Hardcode + // the values for now until some solution for gsf can be worked out. + // http://b/issue?id=2425179 + private static final String ACCOUNT_TYPE = "com.google"; + private static final String FEATURE_LEGACY_GOOGLE = "legacy_google"; + private static final String FEATURE_LEGACY_HOSTED_OR_GOOGLE = + "legacy_hosted_or_google"; + private void startReadOfGoogleAccounts() { mAccountsGoogle = null; mAccountsPreferHosted = null; AccountManager.get(this).getAccountsByTypeAndFeatures( - GoogleLoginServiceConstants.ACCOUNT_TYPE, - new String[]{GoogleLoginServiceConstants.FEATURE_LEGACY_HOSTED_OR_GOOGLE}, + ACCOUNT_TYPE, new String[]{ FEATURE_LEGACY_HOSTED_OR_GOOGLE }, this, null); } @@ -164,8 +179,7 @@ public class BrowserActivity extends Activity mAccountsGoogle = accountManagerFuture.getResult(); AccountManager.get(this).getAccountsByTypeAndFeatures( - GoogleLoginServiceConstants.ACCOUNT_TYPE, - new String[]{GoogleLoginServiceConstants.FEATURE_LEGACY_GOOGLE}, + ACCOUNT_TYPE, new String[]{ FEATURE_LEGACY_GOOGLE }, this, null); } else { mAccountsPreferHosted = accountManagerFuture.getResult(); @@ -242,6 +256,12 @@ public class BrowserActivity extends Activity // test the browser in OpenGL // requestWindowFeature(Window.FEATURE_OPENGL); + // enable this to test the browser in 32bit + if (false) { + getWindow().setFormat(PixelFormat.RGBX_8888); + BitmapFactory.setDefaultConfig(Bitmap.Config.ARGB_8888); + } + setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL); mResolver = getContentResolver(); @@ -286,6 +306,14 @@ public class BrowserActivity extends Activity PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Browser"); + // Find out if the network is currently up. + ConnectivityManager cm = (ConnectivityManager) getSystemService( + Context.CONNECTIVITY_SERVICE); + NetworkInfo info = cm.getActiveNetworkInfo(); + if (info != null) { + mIsNetworkUp = info.isAvailable(); + } + /* enables registration for changes in network status from http stack */ mNetworkStateChangedFilter = new IntentFilter(); @@ -296,17 +324,15 @@ public class BrowserActivity extends Activity public void onReceive(Context context, Intent intent) { if (intent.getAction().equals( ConnectivityManager.CONNECTIVITY_ACTION)) { - boolean noConnectivity = intent.getBooleanExtra( - ConnectivityManager.EXTRA_NO_CONNECTIVITY, false); - if (!noConnectivity) { - NetworkInfo info = intent.getParcelableExtra( - ConnectivityManager.EXTRA_NETWORK_INFO); - String typeName = info.getTypeName(); - String subtypeName = info.getSubtypeName(); - sendNetworkType(typeName.toLowerCase(), - (subtypeName != null ? subtypeName.toLowerCase() : "")); - } - onNetworkToggle(!noConnectivity); + + NetworkInfo info = intent.getParcelableExtra( + ConnectivityManager.EXTRA_NETWORK_INFO); + String typeName = info.getTypeName(); + String subtypeName = info.getSubtypeName(); + sendNetworkType(typeName.toLowerCase(), + (subtypeName != null ? subtypeName.toLowerCase() : "")); + + onNetworkToggle(info.isAvailable()); } } }; @@ -326,6 +352,12 @@ public class BrowserActivity extends Activity // if it is replacing, refreshPlugins() when adding return; } + + if (sGoogleApps.contains(packageName)) { + BrowserActivity.this.packageChanged(packageName, + Intent.ACTION_PACKAGE_ADDED.equals(action)); + } + PackageManager pm = BrowserActivity.this.getPackageManager(); PackageInfo pkgInfo = null; try { @@ -373,9 +405,12 @@ public class BrowserActivity extends Activity // the tab will be close when exit. UrlData urlData = getUrlDataFromIntent(intent); + String action = intent.getAction(); final Tab t = mTabControl.createNewTab( - Intent.ACTION_VIEW.equals(intent.getAction()) && - intent.getData() != null, + (Intent.ACTION_VIEW.equals(action) && + intent.getData() != null) + || RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS + .equals(action), intent.getStringExtra(Browser.EXTRA_APPLICATION_ID), urlData.mUrl); mTabControl.setCurrentTab(t); attachTabToContentView(t); @@ -397,16 +432,12 @@ public class BrowserActivity extends Activity if (urlData.isEmpty()) { if (mSettings.isLoginInitialized()) { - webView.loadUrl(mSettings.getHomePage()); + loadUrl(webView, mSettings.getHomePage()); } else { waitForCredentials(); } } else { - if (extra != null) { - urlData.setPostData(extra - .getByteArray(Browser.EXTRA_POST_DATA)); - } - urlData.loadIn(webView); + loadUrlDataIn(t, urlData); } } else { // TabControl.restoreState() will create a new tab even if @@ -419,6 +450,26 @@ public class BrowserActivity extends Activity if (jsFlags.trim().length() != 0) { mTabControl.getCurrentWebView().setJsFlags(jsFlags); } + // Work out which packages are installed on the system. + getInstalledPackages(); + } + + /** + * Feed the previously stored results strings to the BrowserProvider so that + * the SearchDialog will show them instead of the standard searches. + * @param result String to show on the editable line of the SearchDialog. + */ + /* package */ void showVoiceSearchResults(String result) { + ContentProviderClient client = mResolver.acquireContentProviderClient( + Browser.BOOKMARKS_URI); + ContentProvider prov = client.getLocalContentProvider(); + BrowserProvider bp = (BrowserProvider) prov; + bp.setQueryResults(mTabControl.getCurrentTab().getVoiceSearchResults()); + client.release(); + + startSearch(result, false, + createGoogleSearchSourceBundle(GOOGLE_SEARCH_SOURCE_SEARCHKEY), + false); } @Override @@ -444,10 +495,36 @@ public class BrowserActivity extends Activity // just resume the browser return; } + boolean activateVoiceSearch = RecognizerResultsIntent + .ACTION_VOICE_SEARCH_RESULTS.equals(action); if (Intent.ACTION_VIEW.equals(action) || Intent.ACTION_SEARCH.equals(action) || MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action) - || Intent.ACTION_WEB_SEARCH.equals(action)) { + || Intent.ACTION_WEB_SEARCH.equals(action) + || activateVoiceSearch) { + if (current.isInVoiceSearchMode()) { + String title = current.getVoiceDisplayTitle(); + if (title != null && title.equals(intent.getStringExtra( + SearchManager.QUERY))) { + // The user submitted the same search as the last voice + // search, so do nothing. + return; + } + if (Intent.ACTION_SEARCH.equals(action) + && current.voiceSearchSourceIsGoogle()) { + Intent logIntent = new Intent( + LoggingEvents.ACTION_LOG_EVENT); + logIntent.putExtra(LoggingEvents.EXTRA_EVENT, + LoggingEvents.VoiceSearch.QUERY_UPDATED); + logIntent.putExtra( + LoggingEvents.VoiceSearch.EXTRA_QUERY_UPDATED_VALUE, + intent.getDataString()); + sendBroadcast(logIntent); + // Note, onPageStarted will revert the voice title bar + // When http://b/issue?id=2379215 is fixed, we should update + // the title bar here. + } + } // If this was a search request (e.g. search query directly typed into the address bar), // pass it on to the default web search provider. if (handleWebSearchIntent(intent)) { @@ -458,12 +535,10 @@ public class BrowserActivity extends Activity if (urlData.isEmpty()) { urlData = new UrlData(mSettings.getHomePage()); } - urlData.setPostData(intent - .getByteArrayExtra(Browser.EXTRA_POST_DATA)); final String appId = intent .getStringExtra(Browser.EXTRA_APPLICATION_ID); - if (Intent.ACTION_VIEW.equals(action) + if ((Intent.ACTION_VIEW.equals(action) || activateVoiceSearch) && !getPackageName().equals(appId) && (flags & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) { Tab appTab = mTabControl.getTabFromId(appId); @@ -483,14 +558,14 @@ public class BrowserActivity extends Activity if (current != appTab) { switchToTab(mTabControl.getTabIndex(appTab)); if (needsLoad) { - urlData.loadIn(appTab.getWebView()); + loadUrlDataIn(appTab, urlData); } } else { // If the tab was the current tab, we have to attach // it to the view system again. attachTabToContentView(appTab); if (needsLoad) { - urlData.loadIn(appTab.getWebView()); + loadUrlDataIn(appTab, urlData); } } return; @@ -539,7 +614,7 @@ public class BrowserActivity extends Activity } // Get rid of the subwindow if it exists dismissSubWindow(current); - urlData.loadIn(current.getWebView()); + loadUrlDataIn(current, urlData); } } } @@ -569,6 +644,10 @@ public class BrowserActivity extends Activity String url = null; final String action = intent.getAction(); + if (RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS.equals( + action)) { + return false; + } if (Intent.ACTION_VIEW.equals(action)) { Uri data = intent.getData(); if (data != null) url = data.toString(); @@ -620,7 +699,8 @@ public class BrowserActivity extends Activity } private UrlData getUrlDataFromIntent(Intent intent) { - String url = null; + String url = ""; + Map headers = null; if (intent != null) { final String action = intent.getAction(); if (Intent.ACTION_VIEW.equals(action)) { @@ -632,12 +712,17 @@ public class BrowserActivity extends Activity url += "?" + mimeType; } } - if ("inline:".equals(url)) { - return new InlinedUrlData( - intent.getStringExtra(Browser.EXTRA_INLINE_CONTENT), - intent.getType(), - intent.getStringExtra(Browser.EXTRA_INLINE_ENCODING), - intent.getStringExtra(Browser.EXTRA_INLINE_FAILURL)); + if (url != null && url.startsWith("http")) { + final Bundle pairs = intent + .getBundleExtra(Browser.EXTRA_HEADERS); + if (pairs != null && !pairs.isEmpty()) { + Iterator iter = pairs.keySet().iterator(); + headers = new HashMap(); + while (iter.hasNext()) { + String key = iter.next(); + headers.put(key, pairs.getString(key)); + } + } } } else if (Intent.ACTION_SEARCH.equals(action) || MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action) @@ -645,17 +730,17 @@ public class BrowserActivity extends Activity url = intent.getStringExtra(SearchManager.QUERY); if (url != null) { mLastEnteredUrl = url; - Browser.updateVisitedHistory(mResolver, url, false); // In general, we shouldn't modify URL from Intent. // But currently, we get the user-typed URL from search box as well. url = fixUrl(url); url = smartUrlFilter(url); + Browser.updateVisitedHistory(mResolver, url, false); String searchSource = "&source=android-" + GOOGLE_SEARCH_SOURCE_SUGGEST + "&"; if (url.contains(searchSource)) { String source = null; final Bundle appData = intent.getBundleExtra(SearchManager.APP_DATA); if (appData != null) { - source = appData.getString(SearchManager.SOURCE); + source = appData.getString(Search.SOURCE); } if (TextUtils.isEmpty(source)) { source = GOOGLE_SEARCH_SOURCE_UNKNOWN; @@ -665,9 +750,22 @@ public class BrowserActivity extends Activity } } } - return new UrlData(url); + return new UrlData(url, headers, intent); + } + /* package */ void showVoiceTitleBar(String title) { + mTitleBar.setInVoiceMode(true); + mFakeTitleBar.setInVoiceMode(true); + + mTitleBar.setDisplayTitle(title); + mFakeTitleBar.setDisplayTitle(title); } + /* package */ void revertVoiceTitleBar() { + mTitleBar.setInVoiceMode(false); + mFakeTitleBar.setInVoiceMode(false); + mTitleBar.setDisplayTitle(mUrl); + mFakeTitleBar.setDisplayTitle(mUrl); + } /* package */ static String fixUrl(String inUrl) { // FIXME: Converting the url to lower case // duplicates functionality in smartUrlFilter(). @@ -1138,7 +1236,7 @@ public class BrowserActivity extends Activity // Load the page WebView w = mTabControl.getCurrentWebView(); if (w != null) { - w.loadUrl(mSettings.getHomePage()); + loadUrl(w, mSettings.getHomePage()); } // Update the settings, need to do this last as it can take a moment @@ -1256,22 +1354,20 @@ public class BrowserActivity extends Activity private Bundle createGoogleSearchSourceBundle(String source) { Bundle bundle = new Bundle(); - bundle.putString(SearchManager.SOURCE, source); + bundle.putString(Search.SOURCE, source); return bundle; } - /** - * Overriding this to insert a local information bundle - */ - @Override - public boolean onSearchRequested() { + /* package */ void editUrl() { if (mOptionsMenuOpen) closeOptionsMenu(); String url = (getTopWindow() == null) ? null : getTopWindow().getUrl(); startSearch(mSettings.getHomePage().equals(url) ? null : url, true, - createGoogleSearchSourceBundle(GOOGLE_SEARCH_SOURCE_SEARCHKEY), false); - return true; + null, false); } + /** + * Overriding this to insert a local information bundle + */ @Override public void startSearch(String initialQuery, boolean selectInitialQuery, Bundle appSearchData, boolean globalSearch) { @@ -1381,7 +1477,7 @@ public class BrowserActivity extends Activity break; case R.id.goto_menu_id: - onSearchRequested(); + editUrl(); break; case R.id.bookmarks_menu_id: @@ -1437,7 +1533,7 @@ public class BrowserActivity extends Activity Tab current = mTabControl.getCurrentTab(); if (current != null) { dismissSubWindow(current); - current.getWebView().loadUrl(mSettings.getHomePage()); + loadUrl(current.getWebView(), mSettings.getHomePage()); } break; @@ -1455,6 +1551,7 @@ public class BrowserActivity extends Activity } mFindDialog.setWebView(getTopWindow()); mFindDialog.show(); + getTopWindow().setFindIsUp(true); mMenuState = EMPTY_MENU; break; @@ -1486,6 +1583,10 @@ public class BrowserActivity extends Activity getTopWindow().debugDump(); break; + case R.id.dump_counters_menu_id: + getTopWindow().dumpV8Counters(); + break; + case R.id.zoom_in_menu_id: getTopWindow().zoomIn(); break; @@ -1590,6 +1691,12 @@ public class BrowserActivity extends Activity final MenuItem nav = menu.findItem(R.id.dump_nav_menu_id); nav.setVisible(isNavDump); nav.setEnabled(isNavDump); + + boolean showDebugSettings = mSettings.showDebugSettings(); + final MenuItem counter = menu.findItem(R.id.dump_counters_menu_id); + counter.setVisible(showDebugSettings); + counter.setEnabled(showDebugSettings); + break; } mCurrentMenuState = mMenuState; @@ -1599,6 +1706,9 @@ public class BrowserActivity extends Activity @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { + if (v instanceof TitleBar) { + return; + } WebView webview = (WebView) v; WebView.HitTestResult result = webview.getHitTestResult(); if (result == null) { @@ -1734,6 +1844,11 @@ public class BrowserActivity extends Activity WebView view = t.getWebView(); view.setEmbeddedTitleBar(mTitleBar); + if (t.isInVoiceSearchMode()) { + showVoiceTitleBar(t.getVoiceDisplayTitle()); + } else { + revertVoiceTitleBar(); + } // Request focus on the top window. t.getTopWindow().requestFocus(); } @@ -1795,7 +1910,7 @@ public class BrowserActivity extends Activity mTabControl.setCurrentTab(tab); attachTabToContentView(tab); if (!urlData.isEmpty()) { - urlData.loadIn(webview); + loadUrlDataIn(tab, urlData); } return tab; } else { @@ -1803,10 +1918,10 @@ public class BrowserActivity extends Activity dismissSubWindow(currentTab); if (!urlData.isEmpty()) { // Load the given url. - urlData.loadIn(currentTab.getWebView()); + loadUrlDataIn(currentTab, urlData); } + return currentTab; } - return currentTab; } private Tab openTab(String url) { @@ -1814,7 +1929,7 @@ public class BrowserActivity extends Activity Tab t = mTabControl.createNewTab(); if (t != null) { WebView view = t.getWebView(); - view.loadUrl(url); + loadUrl(view, url); } return t; } else { @@ -1983,8 +2098,10 @@ public class BrowserActivity extends Activity mUrl = url; mTitle = title; - mTitleBar.setTitleAndUrl(title, url); - mFakeTitleBar.setTitleAndUrl(title, url); + // If we are in voice search mode, the title has already been set. + if (mTabControl.getCurrentTab().isInVoiceSearchMode()) return; + mTitleBar.setDisplayTitle(url); + mFakeTitleBar.setDisplayTitle(url); } /** @@ -2045,7 +2162,7 @@ public class BrowserActivity extends Activity resetTitleIconAndProgress(); } - private void goBackOnePageOrQuit() { + /* package */ void goBackOnePageOrQuit() { Tab current = mTabControl.getCurrentTab(); if (current == null) { /* @@ -2256,7 +2373,7 @@ public class BrowserActivity extends Activity switch (msg.arg1) { case R.id.open_context_menu_id: case R.id.view_image_context_menu_id: - loadURL(getTopWindow(), url); + loadUrlFromContext(getTopWindow(), url); break; case R.id.open_newtab_context_menu_id: final Tab parent = mTabControl.getCurrentTab(); @@ -2321,7 +2438,7 @@ public class BrowserActivity extends Activity } case LOAD_URL: - loadURL(getTopWindow(), (String) msg.obj); + loadUrlFromContext(getTopWindow(), (String) msg.obj); break; case STOP_LOAD: @@ -2357,7 +2474,7 @@ public class BrowserActivity extends Activity * an {@link Intent} to launch the Activity chooser. * @param c Context used to launch a new Activity. * @param title Title of the page. Stored in the Intent with - * {@link Browser#EXTRA_SHARE_TITLE} + * {@link Intent#EXTRA_SUBJECT} * @param url URL of the page. Stored in the Intent with * {@link Intent#EXTRA_TEXT} * @param favicon Bitmap of the favicon for the page. Stored in the Intent @@ -2370,7 +2487,7 @@ public class BrowserActivity extends Activity Intent send = new Intent(Intent.ACTION_SEND); send.setType("text/plain"); send.putExtra(Intent.EXTRA_TEXT, url); - send.putExtra(Browser.EXTRA_SHARE_TITLE, title); + send.putExtra(Intent.EXTRA_SUBJECT, title); send.putExtra(Browser.EXTRA_SHARE_FAVICON, favicon); send.putExtra(Browser.EXTRA_SHARE_SCREENSHOT, screenshot); try { @@ -2500,6 +2617,10 @@ public class BrowserActivity extends Activity /* package */ final static String SCHEME_WTAI_SD = "wtai://wp/sd;"; /* package */ final static String SCHEME_WTAI_AP = "wtai://wp/ap;"; + // Keep this initial progress in sync with initialProgressValue (* 100) + // in ProgressTracker.cpp + private final static int INITIAL_PROGRESS = 10; + void onPageStarted(WebView view, String url, Bitmap favicon) { // when BrowserActivity just starts, onPageStarted may be called before // onResume as it is triggered from onCreate. Call resumeWebViewTimers @@ -2510,11 +2631,9 @@ public class BrowserActivity extends Activity resetLockIcon(url); setUrlTitle(url, null); setFavicon(favicon); - // Keep this initial progress in sync with initialProgressValue (* 100) - // in ProgressTracker.cpp // Show some progress so that the user knows the page is beginning to // load - onProgressChanged(view, 10); + onProgressChanged(view, INITIAL_PROGRESS); mDidStopLoad = false; if (!mIsNetworkUp) createAndShowNetworkDialog(); @@ -2716,12 +2835,19 @@ public class BrowserActivity extends Activity hideFakeTitleBar(); } } - } else if (!mInLoad) { - // onPageFinished may have already been called but a subframe is - // still loading and updating the progress. Reset mInLoad and update - // the menu items. - mInLoad = true; - updateInLoadMenuItems(); + } else { + if (!mInLoad) { + // onPageFinished may have already been called but a subframe is + // still loading and updating the progress. Reset mInLoad and + // update the menu items. + mInLoad = true; + updateInLoadMenuItems(); + } + // When the page first begins to load, the Activity may still be + // paused, in which case showFakeTitleBar will do nothing. Call + // again as the page continues to load so that it will be shown. + // (Calling it will the fake title bar is already showing will also + // do nothing. if (!mOptionsMenuOpen || mIconView) { // This page has begun to load, so show the title bar showFakeTitleBar(); @@ -3299,14 +3425,14 @@ public class BrowserActivity extends Activity } // issued on: - String issuedOn = reformatCertificateDate( - certificate.getValidNotBefore()); + String issuedOn = formatCertificateDate( + certificate.getValidNotBeforeDate()); ((TextView) certificateView.findViewById(R.id.issued_on)) .setText(issuedOn); // expires on: - String expiresOn = reformatCertificateDate( - certificate.getValidNotAfter()); + String expiresOn = formatCertificateDate( + certificate.getValidNotAfterDate()); ((TextView) certificateView.findViewById(R.id.expires_on)) .setText(expiresOn); @@ -3314,31 +3440,19 @@ public class BrowserActivity extends Activity } /** - * Re-formats the certificate date (Date.toString()) string to - * a properly localized date string. + * Formats the certificate date to a properly localized date string. * @return Properly localized version of the certificate date string and - * the original certificate date string if fails to localize. - * If the original string is null, returns an empty string "". + * the "" if it fails to localize. */ - private String reformatCertificateDate(String certificateDate) { - String reformattedDate = null; - - if (certificateDate != null) { - Date date = null; - try { - date = java.text.DateFormat.getInstance().parse(certificateDate); - } catch (ParseException e) { - date = null; - } - - if (date != null) { - reformattedDate = - DateFormat.getDateFormat(this).format(date); - } + private String formatCertificateDate(Date certificateDate) { + if (certificateDate == null) { + return ""; } - - return reformattedDate != null ? reformattedDate : - (certificateDate != null ? certificateDate : ""); + String formattedDate = DateFormat.getDateFormat(this).format(certificateDate); + if (formattedDate == null) { + return ""; + } + return formattedDate; } /** @@ -3498,7 +3612,7 @@ public class BrowserActivity extends Activity mTabControl.getCurrentTab(); dismissSubWindow(currentTab); if (data != null && data.length() != 0) { - getTopWindow().loadUrl(data); + loadUrl(getTopWindow(), data); } } } @@ -3582,16 +3696,56 @@ public class BrowserActivity extends Activity } // Called when loading from context menu or LOAD_URL message - private void loadURL(WebView view, String url) { + private void loadUrlFromContext(WebView view, String url) { // In case the user enters nothing. if (url != null && url.length() != 0 && view != null) { url = smartUrlFilter(url); if (!view.getWebViewClient().shouldOverrideUrlLoading(view, url)) { - view.loadUrl(url); + loadUrl(view, url); } } } + /** + * Load the URL into the given WebView and update the title bar + * to reflect the new load. Call this instead of WebView.loadUrl + * directly. + * @param view The WebView used to load url. + * @param url The URL to load. + */ + private void loadUrl(WebView view, String url) { + updateTitleBarForNewLoad(view, url); + view.loadUrl(url); + } + + /** + * Load UrlData into a Tab and update the title bar to reflect the new + * load. Call this instead of UrlData.loadIn directly. + * @param t The Tab used to load. + * @param data The UrlData being loaded. + */ + private void loadUrlDataIn(Tab t, UrlData data) { + updateTitleBarForNewLoad(t.getWebView(), data.mUrl); + data.loadIn(t); + } + + /** + * If the WebView is the top window, update the title bar to reflect + * loading the new URL. i.e. set its text, clear the favicon (which + * will be set once the page begins loading), and set the progress to + * INITIAL_PROGRESS to show that the page has begun to load. Called + * by loadUrl and loadUrlDataIn. + * @param view The WebView that is starting a load. + * @param url The URL that is being loaded. + */ + private void updateTitleBarForNewLoad(WebView view, String url) { + if (view == getTopWindow()) { + setUrlTitle(url, null); + setFavicon(null); + onProgressChanged(view, INITIAL_PROGRESS); + } + } + private String smartUrlFilter(Uri inUri) { if (inUri != null) { return smartUrlFilter(inUri.toString()); @@ -3710,6 +3864,54 @@ public class BrowserActivity extends Activity } } + private void packageChanged(String packageName, boolean wasAdded) { + WebView w = mTabControl.getCurrentWebView(); + if (w == null) { + return; + } + + if (wasAdded) { + w.addPackageName(packageName); + } else { + w.removePackageName(packageName); + } + } + + private void addPackageNames(Set packageNames) { + WebView w = mTabControl.getCurrentWebView(); + if (w == null) { + return; + } + + w.addPackageNames(packageNames); + } + + private void getInstalledPackages() { + AsyncTask > task = + new AsyncTask >() { + protected Set doInBackground(Void... unused) { + Set installedPackages = new HashSet(); + PackageManager pm = BrowserActivity.this.getPackageManager(); + if (pm != null) { + List packages = pm.getInstalledPackages(0); + for (PackageInfo p : packages) { + if (BrowserActivity.this.sGoogleApps.contains(p.packageName)) { + installedPackages.add(p.packageName); + } + } + } + + return installedPackages; + } + + // Executes on the UI thread + protected void onPostExecute(Set installedPackages) { + addPackageNames(installedPackages); + } + }; + task.execute(); + } + final static int LOCK_ICON_UNSECURE = 0; final static int LOCK_ICON_SECURE = 1; final static int LOCK_ICON_MIXED = 2; @@ -3876,59 +4078,56 @@ public class BrowserActivity extends Activity // the video progress view private View mVideoProgressView; + // The Google packages we monitor for the navigator.isApplicationInstalled() + // API. Add as needed. + private static Set sGoogleApps; + static { + sGoogleApps = new HashSet(); + sGoogleApps.add("com.google.android.youtube"); + } + /** * A UrlData class to abstract how the content will be set to WebView. * This base class uses loadUrl to show the content. */ private static class UrlData { - String mUrl; - byte[] mPostData; + final String mUrl; + final Map mHeaders; + final Intent mVoiceIntent; UrlData(String url) { this.mUrl = url; + this.mHeaders = null; + this.mVoiceIntent = null; } - void setPostData(byte[] postData) { - mPostData = postData; + UrlData(String url, Map headers, Intent intent) { + this.mUrl = url; + this.mHeaders = headers; + if (RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS + .equals(intent.getAction())) { + this.mVoiceIntent = intent; + } else { + this.mVoiceIntent = null; + } } boolean isEmpty() { - return mUrl == null || mUrl.length() == 0; + return mVoiceIntent == null && (mUrl == null || mUrl.length() == 0); } - public void loadIn(WebView webView) { - if (mPostData != null) { - webView.postUrl(mUrl, mPostData); + /** + * Load this UrlData into the given Tab. Use loadUrlDataIn to update + * the title bar as well. + */ + public void loadIn(Tab t) { + if (mVoiceIntent != null) { + t.activateVoiceSearchMode(mVoiceIntent); } else { - webView.loadUrl(mUrl); + t.getWebView().loadUrl(mUrl, mHeaders); } } }; - /** - * A subclass of UrlData class that can display inlined content using - * {@link WebView#loadDataWithBaseURL(String, String, String, String, String)}. - */ - private static class InlinedUrlData extends UrlData { - InlinedUrlData(String inlined, String mimeType, String encoding, String failUrl) { - super(failUrl); - mInlined = inlined; - mMimeType = mimeType; - mEncoding = encoding; - } - String mMimeType; - String mInlined; - String mEncoding; - @Override - boolean isEmpty() { - return mInlined == null || mInlined.length() == 0 || super.isEmpty(); - } - - @Override - public void loadIn(WebView webView) { - webView.loadDataWithBaseURL(null, mInlined, mMimeType, mEncoding, mUrl); - } - } - /* package */ static final UrlData EMPTY_URL_DATA = new UrlData(null); }