/*
* 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 org.tint.ui.managers;
import org.tint.R;
import org.tint.ui.activities.TintBrowserActivity;
import org.tint.ui.components.BadgedImageView;
import org.tint.ui.components.CustomWebView;
import org.tint.ui.fragments.BaseWebViewFragment;
import org.tint.ui.fragments.PhoneStartPageFragment;
import org.tint.ui.fragments.PhoneWebViewFragment;
import org.tint.ui.fragments.StartPageFragment.OnStartPageItemClickedListener;
import org.tint.ui.views.PanelLayout;
import org.tint.ui.views.PanelLayout.PanelEventsListener;
import org.tint.ui.views.PhoneUrlBar;
import org.tint.ui.views.PhoneUrlBar.OnPhoneUrlBarEventListener;
import org.tint.ui.views.TabView;
import org.tint.ui.views.TabsScroller.OnRemoveListener;
import org.tint.utils.Constants;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.preference.PreferenceManager;
import android.util.SparseArray;
import android.view.ActionMode;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
public class PhoneUIManager extends BasePhoneUIManager {
private PanelLayout mPanel;
private BadgedImageView mFaviconView;
private ImageView mHome;
private ImageView mExitFullScreen;
private TabAdapter mAdapter;
private SharedPreferences mPreferences;
static {
sAnimationType = AnimationType.NONE;
}
public PhoneUIManager(TintBrowserActivity activity) {
super(activity);
mPreferences = PreferenceManager.getDefaultSharedPreferences(activity);
mAdapter = new TabAdapter();
mPanel.getTabsScroller().setAdapter(mAdapter);
}
@Override
protected void setupUI() {
mActionBar.hide();
mPanel = (PanelLayout) mActivity.findViewById(R.id.panel_layout);
mPanel.setPanelEventsListener(new PanelEventsListener() {
@Override
public void onPanelShown() {
mPanel.getTabsScroller().snapToSelected(mCurrentTabIndex, true);
}
@Override
public void onPanelHidden() { }
});
mExitFullScreen = (ImageView) mActivity.findViewById(R.id.ExitFullScreen);
mExitFullScreen.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
toggleFullScreen();
}
});
ImageView openTabView = (ImageView) mActivity.findViewById(R.id.BtnAddTab);
openTabView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
addTab(true, PreferenceManager.getDefaultSharedPreferences(v.getContext()).
getBoolean(Constants.PREFERENCE_INCOGNITO_BY_DEFAULT, false));
if (mPreferences.getBoolean(Constants.PREFERENCE_CLOSE_PANEL_ON_NEW_TAB, true)) {
mPanel.hidePanel();
} else {
// Wait for the adapter/scoller to updated before scrolling to the new tab.
// Maybe find a better way to do this.
mPanel.postDelayed(new Runnable() {
@Override
public void run() {
mPanel.getTabsScroller().snapToSelected(mCurrentTabIndex, true);
}
}, 50);
}
}
});
ImageView openBookmarksView = (ImageView) mActivity.findViewById(R.id.BtnBookmarks);
openBookmarksView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
openBookmarksActivityForResult();
}
});
mProgressBar = (ProgressBar) mActivity.findViewById(R.id.WebViewProgress);
mProgressBar.setIndeterminate(false);
mProgressBar.setMax(100);
mProgressBar.setVisibility(View.GONE);
mUrlBar = (PhoneUrlBar) mActivity.findViewById(R.id.UrlBar);
mUrlBar.setEventListener(new OnPhoneUrlBarEventListener() {
@Override
public void onVisibilityChanged(boolean urlBarVisible) {
if (urlBarVisible) {
mUrlBar.showGoStopReloadButton();
} else {
BaseWebViewFragment currentFragment = getCurrentWebViewFragment();
if ((currentFragment != null) &&
(currentFragment.isStartPageShown())){
mUrlBar.hideGoStopReloadButton();
}
}
}
@Override
public void onUrlValidated() {
loadCurrentUrl();
}
@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 onMenuVisibilityChanged(boolean isVisible) {
mMenuVisible = isVisible;
}
});
mUrlBar.setTitle(R.string.ApplicationName);
mUrlBar.setSubtitle(R.string.UrlBarUrlDefaultSubTitle);
mFaviconView = (BadgedImageView) mActivity.findViewById(R.id.FaviconView);
mFaviconView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mUrlBar.isUrlBarVisible()) {
mUrlBar.hideUrl();
} else {
mPanel.togglePanel();
}
}
});
mTopBar = (RelativeLayout) mActivity.findViewById(R.id.TopBar);
mTopBar.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// Steal event from WebView.
}
});
mBack = (ImageView) mActivity.findViewById(R.id.BtnBack);
mBack.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if ((!getCurrentWebViewFragment().isStartPageShown()) &&
(getCurrentWebView().canGoBack())) {
getCurrentWebView().goBack();
mPanel.hidePanel();
}
}
});
mBack.setEnabled(false);
mForward = (ImageView) mActivity.findViewById(R.id.BtnForward);
mForward.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if ((!getCurrentWebViewFragment().isStartPageShown()) &&
(getCurrentWebView().canGoForward())) {
getCurrentWebView().goForward();
mPanel.hidePanel();
}
}
});
mForward.setEnabled(false);
mHome = (ImageView) mActivity.findViewById(R.id.BtnHome);
mHome.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mProgressBar.setProgress(0);
mProgressBar.setVisibility(View.GONE);
loadHomePage();
mPanel.hidePanel();
}
});
mPanel.getTabsScroller().setOnRemoveListener(new OnRemoveListener() {
@Override
public void onRemovePosition(int position) {
if (mFragmentsList.size() > 1) {
closeTabByIndex(position);
} else {
loadHomePage();
}
}
});
super.setupUI();
}
@Override
public void addTab(String url, boolean openInBackground, boolean privateBrowsing) {
super.addTab(url, openInBackground, privateBrowsing);
updateUrlBar();
mAdapter.notifyDataSetChanged();
}
@Override
protected void closeLastTab() {
super.closeLastTab();
mAdapter.notifyDataSetChanged();
}
@Override
protected void closeTabByIndex(int index) {
super.closeTabByIndex(index);
updateUrlBar();
mAdapter.notifyDataSetChanged();
}
@Override
protected void showCurrentTab(boolean notifyTabSwitched) {
super.showCurrentTab(notifyTabSwitched);
TabView currentTabView = mAdapter.getViewAt(mCurrentTabIndex);
if (currentTabView != null) {
currentTabView.setSelected(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.ic_stop);
updateBackForwardEnabled();
}
CustomWebView webview = (CustomWebView) view;
PhoneWebViewFragment parent = (PhoneWebViewFragment) webview.getParentFragment();
if (parent != null) {
int index = mFragmentsList.indexOf(parent);
if (index != -1) {
TabView tabview = mAdapter.getViewAt(index);
tabview.setFavicon(null);
}
}
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
if (view == getCurrentWebView()) {
mProgressBar.setProgress(100);
mProgressBar.setVisibility(View.GONE);
mUrlBar.setUrl(url);
mUrlBar.setGoStopReloadImage(R.drawable.ic_refresh);
updateBackForwardEnabled();
}
}
@Override
public void onClientPageFinished(final CustomWebView view, String url) {
super.onClientPageFinished(view, url);
PhoneWebViewFragment parent = (PhoneWebViewFragment) view.getParentFragment();
if ((parent != null) &&
(!parent.isStartPageShown()) &&
(!view.isLoading())) {
int index = mFragmentsList.indexOf(parent);
if (index != -1) {
final TabView tabview = mAdapter.getViewAt(index);
mPanel.postDelayed(new Runnable() {
@Override
public void run() {
tabview.setImage(view.capturePicture());
}
}, 50);
}
}
}
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
mAdapter.notifyDataSetChanged();
}
@Override
public void onReceivedIcon(WebView view, Bitmap icon) {
// Don't call parent here, we don't need the parent behavior.
CustomWebView webview = (CustomWebView) view;
PhoneWebViewFragment parent = (PhoneWebViewFragment) webview.getParentFragment();
if ((parent != null) &&
(!parent.isStartPageShown())) {
int index = mFragmentsList.indexOf(parent);
if (index != -1) {
TabView tabview = mAdapter.getViewAt(index);
tabview.setFavicon(icon);
}
}
}
@Override
public boolean onKeyBack() {
if (!super.onKeyBack()) {
if (mUrlBar.isUrlBarVisible()) {
mUrlBar.hideUrl();
return true;
} else if (mPanel.isPanelShown()) {
mPanel.hidePanel();
return true;
} else {
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.showUrl();
return true;
}
@Override
public void onMenuVisibilityChanged(boolean isVisible) { }
@Override
public void onShowStartPage() {
super.onShowStartPage();
mAdapter.notifyDataSetChanged();
}
@Override
public void onActionModeStarted(ActionMode mode) {
mActionMode = mode;
}
@Override
public void onActionModeFinished(ActionMode mode) {
if (mActionMode != null) {
mActionMode = null;
InputMethodManager mgr = (InputMethodManager) mActivity.getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.hideSoftInputFromWindow(null, 0);
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if ((requestCode == TintBrowserActivity.ACTIVITY_BOOKMARKS) &&
(resultCode == Activity.RESULT_OK)) {
if (mPanel.isPanelShown()) {
mPanel.hidePanel();
}
}
}
@Override
public boolean onTouch(View v, MotionEvent event) {
return false;
}
@Override
protected void setFullScreenFromPreferences() {
boolean fullScreen = isFullScreen();
Window win = mActivity.getWindow();
WindowManager.LayoutParams winParams = win.getAttributes();
final int bits = WindowManager.LayoutParams.FLAG_FULLSCREEN;
if (fullScreen) {
winParams.flags |= bits;
mTopBar.setVisibility(View.GONE);
mExitFullScreen.setVisibility(View.VISIBLE);
} else {
winParams.flags &= ~bits;
mTopBar.setVisibility(View.VISIBLE);
mExitFullScreen.setVisibility(View.GONE);
}
win.setAttributes(winParams);
}
@Override
protected void updateUrlBar() {
CustomWebView currentWebView;
BaseWebViewFragment currentFragment = getCurrentWebViewFragment();
if ((currentFragment != null) &&
(currentFragment.isStartPageShown())) {
currentWebView = null;
} else {
currentWebView = getCurrentWebView();
}
if (currentWebView != null) {
String title = currentWebView.getTitle();
String url = currentWebView.getUrl();
Bitmap icon = currentWebView.getFavicon();
if ((title != null) &&
(!title.isEmpty())) {
mUrlBar.setTitle(title);
} else {
mUrlBar.setTitle(R.string.ApplicationName);
}
if ((url != null) &&
(!url.isEmpty())) {
mUrlBar.setSubtitle(url);
mUrlBar.setUrl(url);
} else {
mUrlBar.setSubtitle(R.string.UrlBarUrlDefaultSubTitle);
mUrlBar.setUrl(null);
}
setApplicationButtonImage(icon);
if (currentWebView.isLoading()) {
mProgressBar.setProgress(currentWebView.getProgress());
mProgressBar.setVisibility(View.VISIBLE);
mUrlBar.setGoStopReloadImage(R.drawable.ic_stop);
} else {
mProgressBar.setVisibility(View.GONE);
mUrlBar.setGoStopReloadImage(R.drawable.ic_refresh);
}
updateBackForwardEnabled();
} else {
mUrlBar.setTitle(R.string.ApplicationName);
mUrlBar.setSubtitle(R.string.UrlBarUrlDefaultSubTitle);
mProgressBar.setVisibility(View.GONE);
mUrlBar.setUrl(null);
mBack.setEnabled(false);
mForward.setEnabled(false);
}
mFaviconView.setValue(mFragmentsList.size());
mUrlBar.setPrivateBrowsingIndicator(currentFragment != null ? currentFragment.isPrivateBrowsingEnabled() : false);
}
@Override
protected void createStartPageFragment() {
mStartPageFragment = new PhoneStartPageFragment();
mStartPageFragment.setOnStartPageItemClickedListener(new OnStartPageItemClickedListener() {
@Override
public void onStartPageItemClicked(String url) {
loadUrl(url);
}
});
}
private void showTabByIndex(int index, boolean notifyTabSwitched) {
PhoneWebViewFragment oldFragment = mFragmentsList.get(mCurrentTabIndex);
oldFragment.getWebView().onPause();
TabView oldTabView = mAdapter.getViewAt(mCurrentTabIndex);
if (oldTabView != null) {
oldTabView.setSelected(false);
}
mCurrentTabIndex = index;
showCurrentTab(notifyTabSwitched);
}
private class TabAdapter extends BaseAdapter {
private SparseArray<TabView> mViews;
public TabAdapter() {
super();
mViews = new SparseArray<TabView>();
}
@Override
public int getCount() {
return mFragmentsList.size();
}
@Override
public PhoneWebViewFragment getItem(int position) {
return mFragmentsList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public void notifyDataSetChanged() {
mViews.clear();
super.notifyDataSetChanged();
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final TabView tabview = new TabView(mActivity);
PhoneWebViewFragment fragment = getItem(position);
if (fragment.isStartPageShown()) {
tabview.setTitle(R.string.StartPageLabel);
tabview.setFavicon(null);
} else {
CustomWebView webView = fragment.getWebView();
tabview.setTitle(webView.getTitle());
tabview.setFavicon(webView.getFavicon());
tabview.setImage(webView.isLoading() ? null : webView.capturePicture());
}
tabview.setSelected(position == mCurrentTabIndex);
tabview.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (tabview.isClose(v)) {
mPanel.getTabsScroller().animateOut(tabview);
} else {
showTabByIndex(position, true);
mPanel.hidePanel();
}
}
});
mViews.put(position, tabview);
return tabview;
}
public TabView getViewAt(int position) {
return mViews.get(position);
}
}
}