/*
* 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 android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.graphics.Bitmap;
import android.preference.PreferenceManager;
import android.util.SparseArray;
import android.view.ActionMode;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.mogoweb.chrome.WebView;
import com.seal.R;
import com.seal.ui.activities.SealBrowserActivity;
import com.seal.ui.components.BadgedImageView;
import com.seal.ui.components.CustomWebView;
import com.seal.ui.fragments.BaseWebViewFragment;
import com.seal.ui.fragments.PhoneStartPageFragment;
import com.seal.ui.fragments.PhoneWebViewFragment;
import com.seal.ui.menu.PopMenu;
import com.seal.ui.views.CustomDialog;
import com.seal.ui.views.PhoneUrlBar;
import com.seal.ui.views.PhoneUrlBar.OnPhoneUrlBarEventListener;
import com.seal.ui.views.TabView;
import com.seal.ui.views.TabsScroller;
import com.seal.ui.views.TabsScroller.OnRemoveListener;
import com.seal.utils.Constants;
public class PhoneUIManager extends BasePhoneUIManager {
private RelativeLayout mainPanel;
/* Bottom Bar */
private ImageView mHome;
private ImageView mMenu;
private PopMenu popMenu;
private TabsScroller tabScroller;
private boolean toggleMenu = false;
private BadgedImageView mFaviconView;
private ImageView mExitFullScreen;
private TabAdapter mAdapter;
private SharedPreferences mPreferences;
private View viewDialog;
private CustomDialog mTabDialog;
private LayoutInflater inflater;
static {
sAnimationType = AnimationType.NONE;
}
public PhoneUIManager(SealBrowserActivity activity) {
super(activity);
mPreferences = PreferenceManager.getDefaultSharedPreferences(activity);
mAdapter = new TabAdapter();
tabScroller.setAdapter(mAdapter);
}
@Override
protected void setupUI() {
mActionBar.hide();
//
popMenu = new PopMenu(mActivity);
mainPanel = (RelativeLayout) mActivity.findViewById(R.id.main_panel);
inflater = LayoutInflater.from(mActivity);
viewDialog = inflater.inflate(R.layout.multiwindow_layout, null);
mTabDialog = new CustomDialog(mActivity, R.style.Full_Dialog, viewDialog);
tabScroller = (TabsScroller) viewDialog.findViewById(R.id.tabs_scroller);
mExitFullScreen = (ImageView) mActivity.findViewById(R.id.ExitFullScreen);
mExitFullScreen.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
toggleFullScreen();
}
});
TextView openTabView = (TextView) viewDialog.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), false);
// Wait for the adapter/scoller to updated before scrolling
// to the new tab.
// Maybe find a better way to do this.
mainPanel.postDelayed(new Runnable() {
@Override
public void run() {
tabScroller.snapToSelected(mCurrentTabIndex, true);
}
}, 50);
}
});
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.setSubtitle(R.string.UrlBarUrlDefaultSubTitle);
mFaviconView = (BadgedImageView) mActivity.findViewById(R.id.FaviconView);
mFaviconView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mTabDialog != null && !mTabDialog.isShowing()) mTabDialog.show();
}
});
mTopBar = (RelativeLayout) mActivity.findViewById(R.id.TopBar);
mTopBar.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// Steal event from WebView.
}
});
mBottomBar = (LinearLayout) mActivity.findViewById(R.id.bottomBar);
mMenu = (ImageView) mActivity.findViewById(R.id.BtnMenuBar);
mMenu.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (!toggleMenu) {
if (popMenu != null) {
onShowPopMenu();
}
} else {
if (popMenu != null) {
onClosePopMenu();
}
}
}
});
mBack = (ImageView) mActivity.findViewById(R.id.BtnBack);
mBack.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
/*if (mTabDialog != null && mTabDialog.isShowing()) {
mTabDialog.dismiss();
}*/
if ((!getCurrentWebViewFragment().isStartPageShown()) && (getCurrentWebView().canGoBack())) {
getCurrentWebView().goBack();
}
}
});
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();
}
}
});
mForward.setEnabled(false);
mHome = (ImageView) mActivity.findViewById(R.id.BtnHome);
mHome.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mTabDialog != null && mTabDialog.isShowing()) {
mTabDialog.dismiss();
}
mProgressBar.setProgress(0);
mProgressBar.setVisibility(View.GONE);
loadHomePage();
}
});
tabScroller.setOnRemoveListener(new OnRemoveListener() {
@Override
public void onRemovePosition(int position) {
if (mTabDialog != null && mTabDialog.isShowing()) {
mTabDialog.dismiss();
}
if (mFragmentsList.size() > 1) {
closeTabByIndex(position);
} else {
loadHomePage();
}
}
});
super.setupUI();
}
@Override
public void addTab(String url, boolean openInBackground, boolean privateBrowsing, boolean openByParent) {
super.addTab(url, openInBackground, privateBrowsing, openByParent);
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.btn_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.btn_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);
mainPanel.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 (mTabDialog != null && mTabDialog.isShowing()) {
mTabDialog.dismiss();
return true;
}
if (!super.onKeyBack()) {
if (mUrlBar.isUrlBarVisible()) {
mUrlBar.hideUrl();
return true;
} else {
CustomWebView currentWebView = getCurrentWebView();
if ((currentWebView != null) && (currentWebView.canGoBack())) {
currentWebView.goBack();
return true;
} else if (isHomePageStartPage() && !isStartPageShownOnCurrentTab() && isOpenByParentTab()) {
closeCurrentTab();
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 == SealBrowserActivity.ACTIVITY_BOOKMARKS) && (resultCode == Activity.RESULT_OK)) {
if (mTabDialog != null && mTabDialog.isShowing()) {
mTabDialog.dismiss();
}
}
}
@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);
mBottomBar.setVisibility(View.GONE);
mExitFullScreen.setVisibility(View.VISIBLE);
} else {
winParams.flags &= ~bits;
mTopBar.setVisibility(View.VISIBLE);
mBottomBar.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.setSubtitle(title);
} else {
mUrlBar.setSubtitle(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.btn_stop);
} else {
mProgressBar.setVisibility(View.GONE);
mUrlBar.setGoStopReloadImage(R.drawable.btn_refresh);
}
updateBackForwardEnabled();
} else {
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();
}
private void showTabByIndex(final int index, final 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);
/*mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
});*/
}
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 (mTabDialog != null && mTabDialog.isShowing()) {
mTabDialog.dismiss();
}
int newPos = position - 1;
if (tabview.isClose(v)) {
tabScroller.animateOut(tabview);
if (newPos < 0) {
showTabByIndex(0, true);
} else {
showTabByIndex(newPos, true);
}
} else {
showTabByIndex(position, true);
}
}
});
mViews.put(position, tabview);
return tabview;
}
public TabView getViewAt(int position) {
return mViews.get(position);
}
}
protected boolean isOpenByParentTab() {
BaseWebViewFragment currentWebViewFragment = getCurrentWebViewFragment();
return currentWebViewFragment != null && currentWebViewFragment.isSubView();
}
@Override
public void onShowPopMenu() {
// TODO Auto-generated method stub
if (popMenu != null) {
popMenu.show(mMenu);
toggleMenu = true;
Editor prefEditor = mPreferences.edit();
prefEditor.putBoolean(Constants.TOGGLE_MENU_STATUS, true);
prefEditor.commit();
}
}
@Override
public void onClosePopMenu() {
// TODO Auto-generated method stub
if (popMenu != null) {
popMenu.dismiss();
toggleMenu = false;
Editor prefEditor = mPreferences.edit();
prefEditor.putBoolean(Constants.TOGGLE_MENU_STATUS, false);
prefEditor.commit();
}
}
/*
* E/chromium(27807): [ERROR_REPORT:AwContents_jni.h(295)] Check failed: native. GetAwDrawGLViewContext
*/
}