package org.qii.weiciyuan.ui.browser;
import org.qii.weiciyuan.R;
import org.qii.weiciyuan.dao.shorturl.Mid2IdDao;
import org.qii.weiciyuan.support.error.WeiboException;
import org.qii.weiciyuan.support.file.FileManager;
import org.qii.weiciyuan.support.lib.MyAsyncTask;
import org.qii.weiciyuan.support.utils.GlobalContext;
import org.qii.weiciyuan.support.utils.Utility;
import org.qii.weiciyuan.ui.common.CommonProgressDialogFragment;
import org.qii.weiciyuan.ui.userinfo.UserInfoActivity;
import android.app.ActionBar;
import android.app.Activity;
import android.app.Fragment;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.text.TextUtils;
import android.util.Log;
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.animation.Animation;
import android.view.animation.AnimationUtils;
import android.webkit.WebChromeClient;
import android.webkit.WebIconDatabase;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.ShareActionProvider;
import android.widget.Toast;
import java.lang.ref.WeakReference;
/**
* User: qii
* Date: 13-2-19
*/
public class BrowserWebFragment extends Fragment {
private WebView mWebView;
private ProgressBar mProgressBar;
private boolean mIsWebViewAvailable;
private String mUrl = null;
private ShareActionProvider mShareActionProvider;
private MenuItem refreshItem;
public BrowserWebFragment() {
super();
}
public BrowserWebFragment(String url) {
super();
mUrl = url;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("mUrl", mUrl);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
setRetainInstance(true);
/**
*some devices for example Nexus 7 4.2.2 version will receive website favicon, but some
* devices may cant, Galaxy Nexus 4.2.2 version
*/
String path = FileManager.getWebViewFaviconDirPath();
if (!TextUtils.isEmpty(path)) {
WebIconDatabase.getInstance().open(FileManager.getWebViewFaviconDirPath());
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (savedInstanceState != null) {
mUrl = savedInstanceState.getString("mUrl");
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.browserwebfragment_layout, container, false);
if (mWebView != null) {
mWebView.destroy();
}
mWebView = (WebView) view.findViewById(R.id.webView);
mProgressBar = (ProgressBar) view.findViewById(R.id.progressbar);
mWebView.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
mWebView.goBack();
return true;
}
return false;
}
});
mWebView.setWebViewClient(new InnerWebViewClient());
mWebView.setWebChromeClient(new InnerWebChromeClient());
mIsWebViewAvailable = true;
WebSettings settings = mWebView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setBuiltInZoomControls(true);
settings.setDisplayZoomControls(false);
return view;
}
public void loadUrl(String url) {
if (mIsWebViewAvailable) {
getWebView().loadUrl(mUrl = url);
} else {
Log.w("ImprovedWebViewFragment",
"WebView cannot be found. Check the view and fragment have been loaded.");
}
}
@Override
public void onPause() {
super.onPause();
mWebView.onPause();
}
@Override
public void onResume() {
mWebView.onResume();
super.onResume();
}
@Override
public void onDestroyView() {
mIsWebViewAvailable = false;
super.onDestroyView();
}
@Override
public void onDestroy() {
if (mWebView != null) {
mWebView.destroy();
mWebView = null;
}
super.onDestroy();
}
public WebView getWebView() {
return mIsWebViewAvailable ? mWebView : null;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.actionbar_menu_browserwebfragment, menu);
MenuItem item = menu.findItem(R.id.menu_share);
mShareActionProvider = (ShareActionProvider) item.getActionProvider();
refreshItem = menu.findItem(R.id.menu_refresh);
super.onCreateOptionsMenu(menu, inflater);
if (Utility.isWeiboAccountDomainLink(mUrl)) {
String result = Utility.getDomainFromWeiboAccountLink(mUrl);
Intent intent = new Intent(getActivity(), UserInfoActivity.class);
intent.putExtra("domain", result);
getActivity().startActivity(intent);
getActivity().finish();
} else if (Utility.isWeiboMid(mUrl)) {
String mid = Utility.getMidFromUrl(mUrl);
RedirectLinkToWeiboIdTask task = new RedirectLinkToWeiboIdTask(
BrowserWebFragment.this, mUrl, mid);
task.executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR);
} else {
mWebView.loadUrl(mUrl);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_close:
getActivity().finish();
break;
case R.id.menu_refresh:
getWebView().reload();
break;
case R.id.menu_open_with_other_app:
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(mUrl));
getActivity().startActivity(intent);
break;
case R.id.menu_copy:
ClipboardManager cm = (ClipboardManager) getActivity()
.getSystemService(Context.CLIPBOARD_SERVICE);
cm.setPrimaryClip(ClipData.newPlainText("sinaweibo", buildShareCopyContent()));
Toast.makeText(getActivity(), getString(R.string.copy_successfully),
Toast.LENGTH_SHORT).show();
break;
case R.id.menu_share:
Utility.setShareIntent(getActivity(), mShareActionProvider,
buildShareCopyContent());
break;
}
return super.onOptionsItemSelected(item);
}
private String buildShareCopyContent() {
String title = mWebView.getTitle();
String url = mWebView.getUrl();
if (!TextUtils.isEmpty(title) && !TextUtils.isEmpty(url)) {
return title + " " + url;
} else {
return mUrl;
}
}
private void startRefreshAnimation() {
LayoutInflater inflater = (LayoutInflater) getActivity()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ImageView iv = (ImageView) inflater.inflate(R.layout.refresh_action_view, null);
Animation rotation = AnimationUtils.loadAnimation(getActivity(), R.anim.refresh);
iv.startAnimation(rotation);
finishRefreshAnimation();
refreshItem.setActionView(iv);
}
private void finishRefreshAnimation() {
if (refreshItem.getActionView() != null) {
refreshItem.getActionView().clearAnimation();
refreshItem.setActionView(null);
}
}
private class InnerWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (Utility.isWeiboAccountDomainLink(url)) {
String result = Utility.getDomainFromWeiboAccountLink(url);
Intent intent = new Intent(getActivity(), UserInfoActivity.class);
intent.putExtra("domain", result);
getActivity().startActivity(intent);
getActivity().finish();
return true;
} else if (Utility.isWeiboMid(url)) {
String mid = Utility.getMidFromUrl(url);
RedirectLinkToWeiboIdTask task = new RedirectLinkToWeiboIdTask(
BrowserWebFragment.this, url, mid);
task.executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR);
return true;
} else {
view.loadUrl(url);
return true;
}
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
if (getActivity() == null) {
return;
}
startRefreshAnimation();
}
@Override
public void onPageFinished(WebView view, String url) {
if (getActivity() == null) {
return;
}
ActionBar actionBar = getActivity().getActionBar();
if (actionBar == null) {
return;
}
if (!TextUtils.isEmpty(view.getTitle())) {
actionBar.setTitle(view.getTitle());
}
finishRefreshAnimation();
}
}
private class InnerWebChromeClient extends WebChromeClient {
@Override
public void onReceivedTitle(WebView view, String sTitle) {
super.onReceivedTitle(view, sTitle);
if (sTitle != null && sTitle.length() > 0) {
if (getActivity() == null) {
return;
}
ActionBar actionBar = getActivity().getActionBar();
if (actionBar == null) {
return;
}
if (!TextUtils.isEmpty(view.getTitle())) {
actionBar.setTitle(view.getTitle());
}
}
}
//website icon is too small
@Override
public void onReceivedIcon(WebView view, Bitmap icon) {
super.onReceivedIcon(view, icon);
if (getActivity() == null) {
return;
}
// getActivity().getActionBar().setIcon(new BitmapDrawable(getActivity().getResources(), icon));
}
public void onProgressChanged(WebView view, int progress) {
if (getActivity() == null) {
return;
}
if (!mProgressBar.isShown()) {
mProgressBar.setVisibility(View.VISIBLE);
}
mProgressBar.setProgress(progress);
if (progress == 100) {
mProgressBar.setVisibility(View.INVISIBLE);
}
}
}
private static class RedirectLinkToWeiboIdTask extends MyAsyncTask<Void, Void, String> {
private String mid;
private String oriUrl;
private WeakReference<BrowserWebFragment> webFragmentWeakReference;
private CommonProgressDialogFragment commonProgressDialogFragment;
private String progressStr;
public RedirectLinkToWeiboIdTask(BrowserWebFragment webFragment, String oriUrl,
String mid) {
this.oriUrl = oriUrl;
this.mid = mid;
this.progressStr = webFragment.getString(R.string.converting_weibo_link);
this.webFragmentWeakReference = new WeakReference<BrowserWebFragment>(webFragment);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
BrowserWebFragment webFragment = webFragmentWeakReference.get();
if (webFragment == null) {
return;
}
Activity activity = webFragment.getActivity();
if (activity == null) {
return;
}
commonProgressDialogFragment = CommonProgressDialogFragment.newInstance(progressStr);
commonProgressDialogFragment
.show(((FragmentActivity) activity).getSupportFragmentManager(), "dialog");
}
@Override
protected String doInBackground(Void... params) {
try {
return new Mid2IdDao(GlobalContext.getInstance().getSpecialToken(), mid).getId();
} catch (WeiboException e) {
return "0";
}
}
@Override
protected void onPostExecute(String id) {
super.onPostExecute(id);
BrowserWebFragment webFragment = webFragmentWeakReference.get();
if (webFragment == null) {
return;
}
Activity activity = webFragment.getActivity();
if (activity == null) {
return;
}
commonProgressDialogFragment.dismissAllowingStateLoss();
if (Long.valueOf(id) > 0L) {
webFragment.startActivity(BrowserWeiboMsgActivity.newIntent(id,
GlobalContext.getInstance().getSpecialToken()));
activity.finish();
} else {
Toast.makeText(GlobalContext.getInstance(), R.string.cant_not_convert_to_weibo_id,
Toast.LENGTH_SHORT).show();
webFragment.mWebView.loadUrl(oriUrl);
}
}
}
}