/*
* 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.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.content.SharedPreferences;
import android.view.ActionMode;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
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.PhoneWebViewFragment;
import com.seal.ui.views.PhoneUrlBar;
import com.seal.utils.Constants;
public abstract class BasePhoneUIManager extends BaseUIManager {
protected enum AnimationType {
NONE, FADE
}
protected static AnimationType sAnimationType;
protected List<PhoneWebViewFragment> mFragmentsList;
protected Map<UUID, PhoneWebViewFragment> mFragmentsMap;
protected PhoneUrlBar mUrlBar;
protected ProgressBar mProgressBar;
protected RelativeLayout mTopBar;
protected LinearLayout mBottomBar;
protected ImageView mBack;
protected ImageView mForward;
protected int mCurrentTabIndex = -1;
protected Fragment mCurrentFragment = null;
protected ActionMode mActionMode;
public BasePhoneUIManager(SealBrowserActivity activity) {
super(activity);
mFragmentsList = new ArrayList<PhoneWebViewFragment>();
mFragmentsMap = new HashMap<UUID, PhoneWebViewFragment>();
}
@Override
public void addTab(String url, boolean openInBackground, boolean privateBrowsing, boolean openByParent) {
boolean startPage = false;
if (Constants.URL_ABOUT_START.equals(url)) {
url = null;
startPage = true;
}
PhoneWebViewFragment fragment = new PhoneWebViewFragment(openByParent);
fragment.init(this, privateBrowsing, url);
mFragmentsList.add(mCurrentTabIndex + 1, fragment);
mFragmentsMap.put(fragment.getUUID(), fragment);
if (!openInBackground) {
mCurrentTabIndex++;
if (startPage) {
fragment.setStartPageShown(true);
if (mStartPageFragment == null) {
createStartPageFragment();
}
setCurrentFragment(mStartPageFragment, sAnimationType);
onShowStartPage();
} else {
fragment.setStartPageShown(false);
setCurrentFragment(fragment, sAnimationType);
}
CustomWebView webView = getCurrentWebView();
if (!webView.isPrivateBrowsingEnabled()) {
Controller.getInstance().getAddonManager().onTabSwitched(mActivity, webView);
}
}
}
@Override
public void closeCurrentTab() {
if (mFragmentsList.size() > 1) {
closeTabByIndex(mCurrentTabIndex);
} else {
closeLastTab();
}
}
@Override
public void closeTab(UUID tabId) {
int index = mFragmentsList.indexOf(getWebViewFragmentByUUID(tabId));
if (mFragmentsList.size() > 1) {
if ((index >= 0) && (index < mFragmentsList.size())) {
closeTabByIndex(index);
}
} else if (index == mCurrentTabIndex) {
closeLastTab();
}
}
protected void closeLastTab() {
PhoneWebViewFragment fragment = mFragmentsList.get(mCurrentTabIndex);
CustomWebView webView = fragment.getWebView();
if (!webView.isPrivateBrowsingEnabled()) {
Controller.getInstance().getAddonManager().onTabClosed(mActivity, webView);
}
webView.onPause();
loadHomePage();
updateUrlBar();
}
protected void closeTabByIndex(int index) {
if ((index >= 0) && (index < mFragmentsList.size())) {
boolean currentTab = index == mCurrentTabIndex;
PhoneWebViewFragment fragment = mFragmentsList.get(index);
CustomWebView webView = fragment.getWebView();
if (!webView.isPrivateBrowsingEnabled()) {
Controller.getInstance().getAddonManager().onTabClosed(mActivity, webView);
}
webView.onPause();
mFragmentsList.remove(index);
mFragmentsMap.remove(fragment.getUUID());
webView.destroy();
if (currentTab) {
if (mCurrentTabIndex > 0) {
mCurrentTabIndex--;
}
showCurrentTab(true);
} else {
if (index < mCurrentTabIndex) {
mCurrentTabIndex--;
}
}
}
}
protected void showCurrentTab(boolean notifyTabSwitched) {
PhoneWebViewFragment newFragment = mFragmentsList.get(mCurrentTabIndex);
if (newFragment.isStartPageShown()) {
setCurrentFragment(mStartPageFragment, sAnimationType);
mUrlBar.hideGoStopReloadButton();
} else {
setCurrentFragment(newFragment, sAnimationType);
mUrlBar.showGoStopReloadButton();
newFragment.getWebView().onResume();
}
if (notifyTabSwitched) {
CustomWebView webView = getCurrentWebView();
if (!webView.isPrivateBrowsingEnabled()) {
Controller.getInstance().getAddonManager().onTabSwitched(mActivity, webView);
}
}
updateUrlBar();
}
@Override
public void onProgressChanged(WebView view, int newProgress) {
if (view == getCurrentWebView()) {
mProgressBar.setProgress(newProgress);
}
}
@Override
public void onReceivedTitle(WebView view, String title) {
if (view == getCurrentWebView()) {
if ((title != null) && (!title.isEmpty())) {
mUrlBar.setSubtitle(title);
} else {
mUrlBar.setSubtitle(R.string.UrlBarUrlDefaultSubTitle);
}
}
}
@Override
public void onShowStartPage() {
mUrlBar.setSubtitle(R.string.UrlBarUrlDefaultSubTitle);
mUrlBar.setGoStopReloadImage(R.drawable.ic_go);
mUrlBar.hideGoStopReloadButton();
mUrlBar.setUrl(null);
mBack.setEnabled(false);
mForward.setEnabled(false);
}
@Override
public void onHideStartPage() {
mUrlBar.showGoStopReloadButton();
}
@Override
public void loadUrl(String url) {
mUrlBar.hideUrl();
super.loadUrl(url);
}
@Override
public CustomWebView getCurrentWebView() {
if (mCurrentTabIndex != -1) {
return mFragmentsList.get(mCurrentTabIndex).getWebView();
} else {
return null;
}
}
@Override
public BaseWebViewFragment getCurrentWebViewFragment() {
if (mCurrentTabIndex != -1) {
return mFragmentsList.get(mCurrentTabIndex);
} else {
return null;
}
}
@Override
protected BaseWebViewFragment getWebViewFragmentByUUID(UUID fragmentId) {
return mFragmentsMap.get(fragmentId);
}
@Override
protected String getCurrentUrl() {
return mUrlBar.getUrl();
}
@Override
protected int getTabCount() {
return mFragmentsList.size();
}
@Override
protected void showStartPage(BaseWebViewFragment webViewFragment) {
if ((webViewFragment != null) && (!webViewFragment.isStartPageShown())) {
webViewFragment.getWebView().onPause();
webViewFragment.setStartPageShown(true);
if (webViewFragment == getCurrentWebViewFragment()) {
if (mStartPageFragment == null) {
createStartPageFragment();
}
setCurrentFragment(mStartPageFragment, sAnimationType);
onShowStartPage();
}
}
}
@Override
protected void hideStartPage(BaseWebViewFragment webViewFragment) {
if ((webViewFragment != null) && (webViewFragment.isStartPageShown())) {
webViewFragment.setStartPageShown(false);
if (webViewFragment == getCurrentWebViewFragment()) {
setCurrentFragment(webViewFragment, sAnimationType);
onHideStartPage();
}
}
}
@Override
protected void resetUI() {
updateUrlBar();
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
for (PhoneWebViewFragment fragment : mFragmentsList) {
fragment.getWebView().loadSettings();
}
}
@Override
protected Collection<BaseWebViewFragment> getTabsFragments() {
return new ArrayList<BaseWebViewFragment>(mFragmentsList);
}
protected void setCurrentFragment(Fragment fragment, AnimationType animationType) {
if (fragment != mCurrentFragment) {
mCurrentFragment = fragment;
FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
switch (animationType) {
case NONE:
break;
case FADE:
fragmentTransaction.setCustomAnimations(R.animator.fade_in, R.animator.fade_out);
break;
default:
break;
}
fragmentTransaction.replace(R.id.WebViewContainer, mCurrentFragment);
fragmentTransaction.commit();
}
}
protected void updateBackForwardEnabled() {
CustomWebView currentWebView = getCurrentWebView();
mBack.setEnabled(currentWebView.canGoBack());
mForward.setEnabled(currentWebView.canGoForward());
}
protected abstract void createStartPageFragment();
protected abstract void updateUrlBar();
}