package com.hawkbrowser.shell; import java.util.ArrayList; import com.hawkbrowser.R; import com.hawkbrowser.app.*; import com.hawkbrowser.app.DownloadDialog.Param; import com.hawkbrowser.core.*; import com.hawkbrowser.util.*; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Point; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.FragmentManager; import android.util.Log; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.Window; import com.hawkbrowser.webkit.DownloadListener; import com.hawkbrowser.webkit.WebView; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.PopupWindow; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; public final class HawkBrowser extends Activity implements NavigationBar.EventListener, HawkWebViewClient.EventListener, HawkWebChromeClient.EventListener, DownloadListener, PopMenuBar.EventListener { public static final String INTENT_EXTRA_ACTION = "action"; public static final String INTENT_EXTRA_URL = "url"; public static final String INTENT_ACTION_OPENURL = "openUrl"; private ArrayList<HawkWebView> mViews; private HawkWebView mCurrentView; private LayoutParams mWebViewLayoutParams; private int mIndexOfWebView; private NavigationBar mNavigationBar; private WebViewSelecter mViewSelecter; private AddressBar mAddressBar; private ProgressBar mProgressBar; private PopMenuBar mPopMenuBar; private static History mHistory; private static DownloadManager mDownloadMgr; private long mPrevBackKeyUpTime; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main_frame); mViews = new ArrayList<HawkWebView>(); ViewGroup navigationBar = (ViewGroup)findViewById(R.id.mainframe_navigationbar); mNavigationBar = new NavigationBar(this, navigationBar, this); ViewGroup addressBarView = (ViewGroup) findViewById(R.id.mainframe_addressbar); mAddressBar = new AddressBar(this, addressBarView); mAddressBar.setEventListener(new AddressBar.EventListener() { @Override public void onGo(String url) { mCurrentView.loadUrl(url); mCurrentView.requestFocus(); } }); mProgressBar = (ProgressBar) findViewById(R.id.mainframe_progressbar); new Handler().post(new Runnable() { @Override public void run() { delayLoadWebView(); } }); } private void delayLoadWebView() { String homePage = getResources().getString(R.string.homepageurl); Uri uri = getIntent().getData(); if(null != uri) { homePage = uri.toString().toString(); } HawkWebView newView = (HawkWebView) findViewById(R.id.mainframe_webView); mWebViewLayoutParams = newView.getLayoutParams(); ViewGroup layout = (ViewGroup) findViewById(R.id.main_frame); mIndexOfWebView = layout.indexOfChild(newView); newView.init(new HawkWebViewClient(this), new HawkWebChromeClient(this)); newView.setDownloadListener(this); newView.loadUrl(homePage); showView(newView); } private void updateViewThumbnail(HawkWebView view) { if(null == view) return; Bitmap oldBitmap = (Bitmap) view.getTag(); if(null != oldBitmap) oldBitmap.recycle(); Bitmap thumbnail = view.drawToBitmap(); view.setTag(thumbnail); } private void showView(HawkWebView newView) { if(null != mCurrentView && mCurrentView != newView) { updateViewThumbnail(mCurrentView); ViewGroup layout = (ViewGroup) findViewById(R.id.main_frame); // View curView = layout.findViewById(R.id.mainframe_webView); layout.removeView(mCurrentView); mCurrentView.setVisibility(View.INVISIBLE); newView.setVisibility(View.VISIBLE); layout.addView(newView, mIndexOfWebView); mAddressBar.setTitle(newView.getUrl()); mProgressBar.setProgress(newView.getProgress()); } if(!mViews.contains(newView)) { mViews.add(newView); } String viewCount = String.format("%d", mViews.size()); mNavigationBar.setSelectWindowText(viewCount); newView.requestFocus(); mCurrentView = newView; } /* disable options menu @Override public boolean onPrepareOptionsMenu(Menu menu) { MenuItem back = menu.findItem(R.id.menu_goback); back.setVisible(mCurrentView.canGoBack()); MenuItem forward = menu.findItem(R.id.menu_goforward); forward.setVisible(mCurrentView.canGoForward()); return true; } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater mi = getMenuInflater(); mi.inflate(R.menu.option_menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) { case R.id.menu_goback: mCurrentView.goBack(); return true; case R.id.menu_goforward: mCurrentView.goForward(); return true; case R.id.menu_newwindow: // Intent intent = new Intent(this, HawkBrowser.class); // startActivity(intent); newWebView(); return true; case R.id.menu_selectwindow: selectWebView(); return true; } return false; } */ private void newWebView(String url) { HawkWebView newView = new HawkWebView(this); newView.setId(R.id.mainframe_webView); newView.init(new HawkWebViewClient(this), new HawkWebChromeClient(this)); newView.setLayoutParams(mWebViewLayoutParams); newView.setDownloadListener(this); newView.loadUrl(url); showView(newView); } private void selectWebView() { if(null != mViewSelecter) { mViewSelecter.dismiss(); mViewSelecter = null; return; } ArrayList<String> titles = new ArrayList<String>(); ArrayList<Bitmap> bitmaps = new ArrayList<Bitmap>(); updateViewThumbnail(mCurrentView); for(HawkWebView wv : mViews) { String title = wv.getTitle(); if((null == title) || title.isEmpty()) { title = getResources().getString(R.string.defaultpagetitle); } titles.add(title); Bitmap webBmp = (Bitmap) wv.getTag(); // Bitmap webBmp = ImageUtil.loadBitmapFromView(wv); bitmaps.add(webBmp); } mViewSelecter = new WebViewSelecter(this, titles, bitmaps); mViewSelecter.setEventListener(new WebViewSelecter.EventListener() { @Override public void onItemSelect(int i) { if(null != mViewSelecter) { mViewSelecter.dismiss(); mViewSelecter = null; } showView(mViews.get(i)); } @Override public void onItemClose(int i) { Bitmap thumbnail = (Bitmap)mViews.get(i).getTag(); if(null != thumbnail) { thumbnail.recycle(); mViews.get(i).setTag(null); } mViews.get(i).destroy(); mViews.remove(i); if(mViews.isEmpty()) { mViewSelecter.dismiss(); mViewSelecter = null; newWebView(getResources().getString(R.string.homepageurl)); } else { mViewSelecter.updateItems(); int nextView = i + 1; if(nextView >= mViews.size()) { nextView = mViews.size() - 1; } showView(mViews.get(nextView)); } } }); View selectWindow = findViewById(R.id.mainframe_navigationbar); // Point screenSize = CommonUtil.screenSize(this); // PopupWindow mPopup = new PopupWindow(mViewSelecter.getView(), screenSize.x, 200); // mPopup.showAsDropDown(selectWindow, 0, 0); mViewSelecter.show(selectWindow); } // NavigationBar Listener start @Override public void onGoBack() { mCurrentView.goBack(); } @Override public void onGoForward() { mCurrentView.goForward(); } @Override public void onNewWebView() { newWebView(getResources().getString(R.string.homepageurl)); } @Override public void onMenu() { if(null == mPopMenuBar) { mPopMenuBar = new PopMenuBar(this, this); View anchor = findViewById(R.id.navigationbar_menu); mPopMenuBar.show(anchor); } else { mPopMenuBar.dismiss(); mPopMenuBar = null; } } @Override public void onSelectWebView() { selectWebView(); } // NavigationBar Listener end // WebChromeClient Listener start @Override public void onReceivedTitle(WebView view, String title) { // mAddressBar.setTitle(title); } @Override public void onProgressChanged(WebView view, int newProgress) { mProgressBar.setProgress(newProgress); final int MAX_PROGRESS = 100; if(MAX_PROGRESS == newProgress) { mProgressBar.setVisibility(View.GONE); } } // WebChromeClient Listener end // WebViewClient Listener start @Override public void onPageFinished(WebView view, String url) { mProgressBar.setVisibility(View.GONE); mAddressBar.setTitle(view.getUrl()); setBackForwardState(view); addHistory(view, url); view.scrollTo(0, 0); } private void addHistory(WebView view, String url) { String title = view.getTitle(); if(null == title) { title = getResources().getString(R.string.defaultpagetitle); } getHistory(this).add(title, url); } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { mProgressBar.setVisibility(View.VISIBLE); setBackForwardState(view); } // WebViewClient Listener end @Override public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { Log.d("Download", String.format("download: %s", url)); DownloadDialog.Param param = new DownloadDialog.Param(url, userAgent, contentDisposition, mimetype, contentLength, this); DownloadDialog dlg = new DownloadDialog(param, new DownloadDialog.Listener() { @Override public void onClick(boolean isConfirmed, String newName, Param param) { if(isConfirmed) { getDownloadMgr(param.mContext).Download(param.mUrl, param.mUserAgent, newName, param.mContentDisposition, param.mMimeType, param.mSize); } } }); dlg.show(); } // PopMenuBar Listener begin @Override public void onShowDownloadMgr() { mPopMenuBar.dismiss(); mPopMenuBar = null; Intent intent = new Intent(this, DownloadActivity.class); startActivity(intent); } @Override public void onQuit() { if(null != mPopMenuBar) { mPopMenuBar.dismiss(); mPopMenuBar = null; } for(HawkWebView view : mViews) { view.destroy(); } mViews.clear(); finish(); System.exit(0); } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if(keyCode == KeyEvent.KEYCODE_BACK) { long time = System.currentTimeMillis(); if(mPrevBackKeyUpTime == 0 || time - mPrevBackKeyUpTime < 2000) { mPrevBackKeyUpTime = time; } else { new Handler().post(new Runnable() { @Override public void run() { // TODO Auto-generated method stub onQuit(); } }); } return true; } return super.onKeyUp(keyCode, event); } public void onRefresh() { mPopMenuBar.dismiss(); mPopMenuBar = null; mCurrentView.reload(); } public void onAddBookmark() { mPopMenuBar.dismiss(); mPopMenuBar = null; Bookmark bm = new Bookmark(this); String title = mCurrentView.getTitle(); if(null == title || title.isEmpty()) { title = getResources().getString(R.string.defaultpagetitle); } Bookmark.Item item = new Bookmark.Item(mCurrentView.getTitle(), mCurrentView.getUrl(), Bookmark.Type.Link); Log.d("Bookmark", String.format("onAddBookmark: %s", item.toString())); if(!bm.Add(item)) { CommonUtil.showTips(this, R.string.bookmark_exist); } bm.Flush(); } public void onShowSetting() { mPopMenuBar.dismiss(); mPopMenuBar = null; Intent intent = new Intent(this, SettingActivity.class); startActivity(intent); } public static History getHistory(Context context) { if(null == mHistory) { mHistory = new History(context); } return mHistory; } public static DownloadManager getDownloadMgr(Context context) { if(null == mDownloadMgr) { mDownloadMgr = new DownloadManager(context); } return mDownloadMgr; } public void onShowBookmark() { mPopMenuBar.dismiss(); mPopMenuBar = null; Intent intent = new Intent(this, BookmarkActivity.class); startActivity(intent); } // PopMenuBar Listener end @SuppressLint("NewApi") private void setBackForwardState(WebView view) { if(android.os.Build.VERSION.SDK_INT >= 11) { invalidateOptionsMenu(); } mNavigationBar.setCanGoBack(view.canGoBack()); mNavigationBar.setCanGoForward(view.canGoForward()); } protected void onStart() { super.onStart(); } @Override protected void onRestart() { super.onRestart(); } @Override protected void onResume() { super.onResume(); } @Override protected void onPause() { super.onPause(); } @Override protected void onStop() { super.onStop(); } @Override protected void onDestroy() { super.onDestroy(); for(HawkWebView v : mViews) { v.destroy(); } if(null != mDownloadMgr) { mDownloadMgr.save(); } } @Override protected void onNewIntent(Intent intent) { String action = intent.getStringExtra(INTENT_EXTRA_ACTION); if((null != action) && action.equals(INTENT_ACTION_OPENURL)) { String url = intent.getStringExtra(INTENT_EXTRA_URL); if(url != null) { newWebView(url); } } else { Uri uri = intent.getData(); if((null != uri) && uri.getScheme().startsWith("http")) { newWebView(uri.toString()); } } } }