/* * Tint Browser for Android * * Copyright (C) 2012 - to infinity and beyond J. Devauchelle and contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 3 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ package com.seal.ui.managers; import java.util.ArrayList; import java.util.Collection; import java.util.Hashtable; import java.util.Map; import java.util.UUID; import android.app.ActionBar; import android.app.ActionBar.Tab; import android.app.FragmentTransaction; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.view.ActionMode; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageView; import android.widget.ProgressBar; import com.mogoweb.chrome.WebView; import com.seal.R; import com.seal.controllers.Controller; import com.seal.ui.activities.SealBrowserActivity; import com.seal.ui.components.CustomWebView; import com.seal.ui.fragments.BaseWebViewFragment; import com.seal.ui.fragments.StartPageFragment; import com.seal.ui.fragments.TabletStartPageFragment; import com.seal.ui.fragments.TabletWebViewFragment; import com.seal.ui.menu.PopMenu; import com.seal.ui.tabs.WebViewFragmentTabListener; import com.seal.ui.views.TabletUrlBar; import com.seal.ui.views.TabletUrlBar.OnTabletUrlBarEventListener; public class TabletUIManager extends BaseUIManager { private Map<Tab, TabletWebViewFragment> mTabs; private Map<UUID, TabletWebViewFragment> mFragmentsMap; private TabletUrlBar mUrlBar; private ProgressBar mProgressBar; private ImageView mExitFullScreen; private ImageView mMenu; public PopMenu popMenu; private boolean toggleMenu = false; public TabletUIManager(SealBrowserActivity activity) { super(activity); mTabs = new Hashtable<Tab, TabletWebViewFragment>(); mFragmentsMap = new Hashtable<UUID, TabletWebViewFragment>(); if (mStartPageFragment == null) { FragmentTransaction ft = mFragmentManager.beginTransaction(); mStartPageFragment = new TabletStartPageFragment(); ft.add(R.id.WebViewContainer, mStartPageFragment); ft.hide(mStartPageFragment); ft.commit(); } } public void onTabSelected(Tab tab) { updateUrlBar(); CustomWebView webView = getCurrentWebView(); if ((webView != null) && (!webView.isPrivateBrowsingEnabled())) { Controller.getInstance().getAddonManager().onTabSwitched(mActivity, webView); } } @Override protected void setupUI() { popMenu = new PopMenu(mActivity); mActionBar.setDisplayShowTitleEnabled(false); mActionBar.setHomeButtonEnabled(false); mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); mProgressBar = (ProgressBar) mActivity.findViewById(R.id.WebViewProgress); mExitFullScreen = (ImageView) mActivity.findViewById(R.id.ExitFullScreen); mExitFullScreen.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { toggleFullScreen(); } }); mUrlBar = (TabletUrlBar) mActivity.findViewById(R.id.UrlBar); mUrlBar.setEventListener(new OnTabletUrlBarEventListener() { @Override public void onUrlValidated() { loadCurrentUrl(); } @Override public void onHomeClicked() { loadHomePage(); } @Override public void onGoStopReloadClicked() { if (mUrlBar.isUrlChangedByUser()) { // Use the UIManager to load urls, as it perform check on them. loadCurrentUrl(); } else if (getCurrentWebView().isLoading()) { getCurrentWebView().stopLoading(); } else { getCurrentWebView().reload(); } } @Override public void onForwardClicked() { if ((!getCurrentWebViewFragment().isStartPageShown()) && (getCurrentWebView().canGoForward())) { getCurrentWebView().goForward(); } } @Override public void onBookmarksClicked() { openBookmarksActivityForResult(); } @Override public void onBackClicked() { if ((!getCurrentWebViewFragment().isStartPageShown()) && (getCurrentWebView().canGoBack())) { getCurrentWebView().goBack(); } } }); mMenu = (ImageView) mActivity.findViewById(R.id.BtnMenuBar); mMenu.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (!toggleMenu) { if (popMenu != null) popMenu.show(v); toggleMenu = true; } else { if (popMenu != null) popMenu.dismiss(); toggleMenu = false; } } }); super.setupUI(); } @Override public CustomWebView getCurrentWebView() { if (mActionBar.getSelectedTab() != null) { return mTabs.get(mActionBar.getSelectedTab()).getWebView(); } else { return null; } } @Override public String getCurrentUrl() { return mUrlBar.getUrl(); } @Override public BaseWebViewFragment getCurrentWebViewFragment() { if (mActionBar.getSelectedTab() != null) { return mTabs.get(mActionBar.getSelectedTab()); } else { return null; } } @Override public void addTab(String url, boolean openInBackground, boolean privateBrowsing, boolean openByParent) { Tab tab = mActionBar.newTab(); tab.setText(R.string.NewTab); TabletWebViewFragment fragment = new TabletWebViewFragment(); fragment.init(this, tab, privateBrowsing, url); tab.setTabListener(new WebViewFragmentTabListener(this, fragment)); mTabs.put(tab, fragment); mFragmentsMap.put(fragment.getUUID(), fragment); mActionBar.addTab(tab, mActionBar.getSelectedNavigationIndex() + 1); if (!openInBackground) { mActionBar.selectTab(tab); } } @Override public void closeCurrentTab() { if (mActionBar.getTabCount() > 1) { closeTabByTab(mActionBar.getSelectedTab()); } else { loadHomePage(); } } @Override public void closeTab(UUID tabId) { if (mActionBar.getTabCount() > 1) { TabletWebViewFragment fragment = (TabletWebViewFragment) getWebViewFragmentByUUID(tabId); if (fragment != null) { Tab tab = fragment.getTab(); if (tab != null) { closeTabByTab(tab); } } } } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { for (TabletWebViewFragment fragment : mTabs.values()) { fragment.getWebView().loadSettings(); } } @Override public void onMenuVisibilityChanged(boolean isVisible) { } @Override public boolean onKeyBack() { if (!super.onKeyBack()) { CustomWebView currentWebView = getCurrentWebView(); if ((currentWebView != null) && (currentWebView.canGoBack())) { currentWebView.goBack(); return true; } else if (isHomePageStartPage() && !isStartPageShownOnCurrentTab()) { loadHomePage(); return true; } } return false; } @Override public boolean onKeySearch() { mUrlBar.setFocusOnUrl(); return true; } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { if (view == getCurrentWebView()) { mProgressBar.setProgress(0); mProgressBar.setVisibility(View.VISIBLE); mUrlBar.setUrl(url); mUrlBar.setGoStopReloadImage(R.drawable.btn_stop); updateBackForwardEnabled(); } } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); if (view == getCurrentWebView()) { mProgressBar.setProgress(100); mProgressBar.setVisibility(View.INVISIBLE); mUrlBar.setUrl(url); mUrlBar.setGoStopReloadImage(R.drawable.btn_refresh); updateBackForwardEnabled(); } } @Override public void onProgressChanged(WebView view, int newProgress) { if (view == getCurrentWebView()) { mProgressBar.setProgress(newProgress); } } @Override public void onReceivedTitle(WebView view, String title) { for (TabletWebViewFragment fragment : mTabs.values()) { fragment.onReceivedTitle(view, title); } } @Override public void onShowStartPage() { mUrlBar.setUrl(null); mUrlBar.setBackEnabled(false); mUrlBar.setForwardEnabled(false); mUrlBar.setGoStopReloadImage(R.drawable.ic_go); mActionBar.setIcon(R.drawable.ic_launcher); Tab tab = mActionBar.getSelectedTab(); tab.setText(R.string.NewTab); } @Override public void onHideStartPage() { } @Override public boolean onTouch(View v, MotionEvent event) { return false; } @Override protected int getTabCount() { return mTabs.size(); } @Override protected BaseWebViewFragment getWebViewFragmentByUUID(UUID fragmentId) { return mFragmentsMap.get(fragmentId); } @Override public void onActionModeStarted(ActionMode mode) { } @Override public void onActionModeFinished(ActionMode mode) { } @Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { } public StartPageFragment getStartPageFragment() { return mStartPageFragment; } @Override protected void setFullScreenFromPreferences() { boolean fullScreen = isFullScreen(); if (fullScreen) { mActionBar.hide(); } else { mActionBar.show(); } if (mExitFullScreen != null) { mExitFullScreen.setVisibility(fullScreen ? View.VISIBLE : View.GONE); } } @Override protected void showStartPage(BaseWebViewFragment webViewFragment) { if ((webViewFragment != null) && (!webViewFragment.isStartPageShown())) { webViewFragment.getWebView().onPause(); webViewFragment.setStartPageShown(true); if (webViewFragment == getCurrentWebViewFragment()) { FragmentTransaction ft = mFragmentManager.beginTransaction(); ft.hide(webViewFragment); ft.show(mStartPageFragment); ft.commit(); onShowStartPage(); } } } @Override protected void hideStartPage(BaseWebViewFragment webViewFragment) { if ((webViewFragment != null) && (webViewFragment.isStartPageShown())) { webViewFragment.setStartPageShown(false); if (webViewFragment == getCurrentWebViewFragment()) { FragmentTransaction ft = mFragmentManager.beginTransaction(); ft.hide(mStartPageFragment); ft.show(webViewFragment); ft.commit(); onHideStartPage(); } } } @Override protected void resetUI() { updateUrlBar(); } @Override protected Collection<BaseWebViewFragment> getTabsFragments() { return new ArrayList<BaseWebViewFragment>(mTabs.values()); } private void closeTabByTab(Tab tab) { TabletWebViewFragment oldFragment = mTabs.get(tab); if (oldFragment != null) { CustomWebView webView = oldFragment.getWebView(); if (!webView.isPrivateBrowsingEnabled()) { Controller.getInstance().getAddonManager().onTabClosed(mActivity, webView); } webView.onPause(); mTabs.remove(tab); mFragmentsMap.remove(oldFragment.getUUID()); mActionBar.removeTab(tab); } } private void updateUrlBar() { CustomWebView currentWebView; BaseWebViewFragment currentFragment = getCurrentWebViewFragment(); if ((currentFragment != null) && (currentFragment.isStartPageShown())) { currentWebView = null; } else { currentWebView = getCurrentWebView(); } if (currentWebView != null) { String url = currentWebView.getUrl(); if ((url != null) && (!url.isEmpty())) { mUrlBar.setUrl(url); } else { mUrlBar.setUrl(null); } setApplicationButtonImage(currentWebView.getFavicon()); if (currentWebView.isLoading()) { mUrlBar.setGoStopReloadImage(R.drawable.btn_stop); mProgressBar.setVisibility(View.VISIBLE); } else { mUrlBar.setGoStopReloadImage(R.drawable.btn_refresh); mProgressBar.setVisibility(View.GONE); } updateBackForwardEnabled(); } else { mUrlBar.setUrl(null); mUrlBar.setBackEnabled(false); mUrlBar.setForwardEnabled(false); mActionBar.setIcon(R.drawable.ic_launcher); } mUrlBar.setPrivateBrowsingIndicator(currentFragment != null ? currentFragment.isPrivateBrowsingEnabled() : false); } private void updateBackForwardEnabled() { CustomWebView currentWebView = getCurrentWebView(); mUrlBar.setBackEnabled(currentWebView.canGoBack()); mUrlBar.setForwardEnabled(currentWebView.canGoForward()); } @Override public void onShowPopMenu() { // TODO Auto-generated method stub if (popMenu != null) popMenu.show(mMenu); } @Override public void onClosePopMenu() { // TODO Auto-generated method stub if (popMenu != null) { popMenu.dismiss(); } } }