package org.aisen.weibo.sina.ui.activity.profile; import android.app.Activity; import android.app.AlertDialog; import android.app.Fragment; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.text.TextUtils; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.webkit.CookieManager; import android.webkit.JavascriptInterface; import android.webkit.ValueCallback; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import com.afollestad.materialdialogs.AlertDialogWrapper; import org.aisen.android.common.context.GlobalContext; import org.aisen.android.common.utils.ActivityHelper; import org.aisen.android.common.utils.BitmapUtil; import org.aisen.android.common.utils.FileUtils; import org.aisen.android.common.utils.ImagePickerUtils; import org.aisen.android.common.utils.Logger; import org.aisen.android.common.utils.PhotoChoice; import org.aisen.android.common.utils.SystemUtils; import org.aisen.android.common.utils.ViewUtils; import org.aisen.android.component.bitmaploader.core.BitmapDecoder; import org.aisen.android.network.task.TaskException; import org.aisen.android.network.task.WorkTask; import org.aisen.android.support.inject.ViewInject; import org.aisen.android.ui.activity.basic.BaseActivity; import org.aisen.weibo.sina.R; import org.aisen.weibo.sina.base.AppContext; import org.aisen.weibo.sina.base.AppSettings; import org.aisen.weibo.sina.support.bean.AccountBean; import org.aisen.weibo.sina.support.utils.AccountUtils; import org.aisen.weibo.sina.support.utils.ThemeUtils; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import java.io.ByteArrayOutputStream; import java.io.File; import fr.castorflex.android.smoothprogressbar.SmoothProgressBar; /** * Created by wangdan on 15-3-5. */ public class WeiboClientActivity extends BaseActivity implements PhotoChoice.PhotoChoiceListener { public static final String TAG = "WeiboClient"; public static final String HOT_STATUSES = "http://m.weibo.cn/p/index?containerid=102803"; public static final String HOT_TOPICS = "http://m.weibo.cn/p/index?containerid=100803"; public static final String DM_URL = "http://m.weibo.cn"; public static final String WEIBO_TOP = "http://m.weibo.cn/pubs/weibo/feed"; public static final String CHART = "http://m.weibo.cn/msg/chat"; public static final String PROFILE = "http://m.weibo.cn/users/%s?"; public static final String LOGIN = "https://passport.weibo.cn/signin/login"; @ViewInject(id = R.id.webview) WebView mWebView; @ViewInject(id = R.id.progress) SmoothProgressBar progressbar; private ValueCallback<Uri> uploadMsg; private PhotoChoice photoChoice; private boolean askForAuth = false; public static void launchForAuth(Fragment from, int requestCode) { Intent intent = new Intent(from.getActivity(), WeiboClientActivity.class); intent.setAction(Intent.ACTION_VIEW); intent.putExtra("url", LOGIN); intent.putExtra("askForAuth", true); from.startActivityForResult(intent, requestCode); } public static void launchDM(Activity from) { launch(from, DM_URL); } public static void launchHotStatuses(Activity from) { launch(from, HOT_STATUSES); } public static void launchHotTopics(Activity from) { launch(from, HOT_TOPICS); } public static void launchWeiTop(Activity from) { launch(from, WEIBO_TOP); } public static void launchProfile(Activity from, String uid) { launch(from, String.format(PROFILE, uid)); } public static void launchChat(Activity from, String uid) { launch(from, String.format("%s?uid=%s", CHART, uid)); // Intent intent = new Intent(from, TestActivity.class); // intent.putExtra("url", String.format("%s?uid=%s", CHART, uid)); // from.startActivity(intent); } public static void launch(Activity from, String url) { Intent intent = new Intent(from, WeiboClientActivity.class); intent.setAction(Intent.ACTION_VIEW); intent.putExtra("url", url); from.startActivity(intent); } private String mUrl; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.ui_weibo_client); if (!Intent.ACTION_VIEW.equals(getIntent().getAction())) { finish(); return; } askForAuth = savedInstanceState != null ? savedInstanceState.getBoolean("askForAuth") : getIntent().getBooleanExtra("askForAuth", false); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(false); getSupportActionBar().setTitle(""); progressbar.setIndeterminate(true); WebSettings setting = mWebView.getSettings(); setting.setJavaScriptEnabled(true); mWebView.setWebChromeClient(new WeiboWebChromeClient()); mWebView.addJavascriptInterface(new LoginJavaScriptInterface(), "loginjs"); mWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (!TextUtils.isEmpty(url) && isLoginUrl(mUrl) && url.toLowerCase().startsWith("http://m.weibo.cn")) { Logger.d(TAG, "登录成功"); mWebView.loadUrl("javascript:getAccount()"); String cookie = CookieManager.getInstance().getCookie(DM_URL); String accountCookie = AppContext.getAccount().getCookie(); if (TextUtils.isEmpty(accountCookie) || (!TextUtils.isEmpty(cookie) && !cookie.equalsIgnoreCase(accountCookie))) { saveCookie(AppContext.getAccount().getAccount(), AppContext.getAccount().getPassword()); Logger.d(TAG, "手动记录cookie"); } } mUrl = url; view.loadUrl(url); Logger.d(TAG, "overriderUrlLoading = " + url); return true; } }); setting.setJavaScriptCanOpenWindowsAutomatically(true); if (savedInstanceState == null) { if (getIntent().getData() != null) mUrl = getIntent().getData().toString(); if (TextUtils.isEmpty(mUrl)) mUrl = getIntent().getStringExtra("url"); if (mUrl.startsWith("aisen://")) mUrl = mUrl.replace("aisen://", ""); } else { mUrl = savedInstanceState.getString("url"); } // 设置cookie // String cookie = AppContext.getAccount().getCookie(); // if (TextUtils.isEmpty(cookie)) // cookie = ""; // CookieSyncManager.createInstance(this); // CookieManager cookieManager = CookieManager.getInstance(); // cookieManager.setAcceptCookie(true); // cookieManager.setCookie(DM_URL, cookie); // CookieSyncManager.getInstance().sync(); if (askForAuth) { fillAccount(); } else { mWebView.loadUrl(mUrl); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString("url", mUrl); outState.putBoolean("askForAuth", askForAuth); } class WeiboWebChromeClient extends WebChromeClient { @Override public void onProgressChanged(WebView view, int newProgress) { if (newProgress < 100) { progressbar.setVisibility(View.VISIBLE); } else if (newProgress == 100) { progressbar.setVisibility(View.GONE); invalidateOptionsMenu(); } super.onProgressChanged(view, newProgress); } public void openFileChooser(final ValueCallback<Uri> uploadMsg) { AlertDialog.Builder builder = new AlertDialog.Builder(WeiboClientActivity.this) .setItems(getResources().getStringArray(R.array.chatPicChoose), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { WeiboClientActivity.this.uploadMsg = uploadMsg; if (photoChoice == null) { String albumPath = SystemUtils.getSdcardPath() + File.separator + "/DCIM/Camera/"; File albumFile = new File(albumPath); if (!albumFile.exists()) albumFile.mkdirs(); photoChoice = new PhotoChoice(WeiboClientActivity.this, WeiboClientActivity.this, albumPath); photoChoice.setFileName(String.format("%s.jpg", String.valueOf(System.currentTimeMillis() / 1000))); } photoChoice.setMode(PhotoChoice.PhotoChoiceMode.uriType); switch (which) { // 相册 case 0: photoChoice.start(null, 0); break; // 拍照 case 1: photoChoice.start(null, 1); break; default: break; } } }) .setPositiveButton(getString(R.string.cancel), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { WeiboClientActivity.this.uploadMsg = null; uploadMsg.onReceiveValue(null); } }); builder.show(); } // For Android 3.0+ public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) { openFileChooser(uploadMsg); } // For Android > 4.1.1 public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) { openFileChooser(uploadMsg, acceptType); } } final class LoginJavaScriptInterface { public LoginJavaScriptInterface() { } @JavascriptInterface public void setAccount(String account, String password) { Logger.d(TAG, "自动记录cookie"); saveCookie(account, password); } } private void saveCookie(String account, String password) { String cookie = CookieManager.getInstance().getCookie(DM_URL); // Logger.d(TAG, cookie); // 获取到cookie后,保存到账号 AppContext.getAccount().setCookie(cookie); AppContext.getAccount().setAccount(account); AppContext.getAccount().setPassword(password); // 刷新到DB AccountUtils.updateAccount(AppContext.getAccount()); AccountUtils.setLogedinAccount(AppContext.getAccount()); if (askForAuth) { setResult(Activity.RESULT_OK); finish(); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (photoChoice != null) photoChoice.onActivityResult(requestCode, resultCode, data); } public static String getFilePathFromUri(Context context, Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { String path = ImagePickerUtils.getPath(context, uri); return path; } @Override public void choiceByte(byte[] datas) { } @Override public void choiceBitmap(Bitmap bitmap) { } @Override public void choieUri(Uri uri, int requestCode) { // 当拍摄照片时,提示是否设置旋转90度 if (!AppSettings.isRotatePic() && !ActivityHelper.getBooleanShareData(GlobalContext.getInstance(), "RotatePicNoRemind", false)) { new AlertDialogWrapper.Builder(this).setTitle(R.string.remind) .setMessage(R.string.publish_rotate_remind) .setNegativeButton(R.string.donnot_remind, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ActivityHelper.putBooleanShareData(GlobalContext.getInstance(), "RotatePicNoRemind", true); } }) .setPositiveButton(R.string.i_know, null) .show(); } // 拍摄照片时,顺时针旋转90度 if (requestCode == PhotoChoice.CAMERA_IMAGE_REQUEST_CODE && AppSettings.isRotatePic()) { final String path = uri.toString().replace("file://", ""); new WorkTask<Void, Void, String>() { @Override public String workInBackground(Void... params) throws TaskException { try { Bitmap bitmap = BitmapDecoder.decodeSampledBitmapFromFile(path, SystemUtils.getScreenHeight(WeiboClientActivity.this), SystemUtils.getScreenHeight(WeiboClientActivity.this)); bitmap = BitmapUtil.rotateBitmap(bitmap, 90); ByteArrayOutputStream outArray = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outArray); FileUtils.writeFile(new File(path), outArray.toByteArray()); } catch (OutOfMemoryError e) { e.printStackTrace(); } return path; } protected void onSuccess(String result) { uploadPic(result); }; }.execute(); } else { uploadPic(uri.toString()); } } @Override public void unChoice() { } private void uploadPic(String path) { if (uploadMsg != null) { if (path.toString().startsWith("content://")) { path = getFilePathFromUri(this, Uri.parse(path), null, null, null, null); Logger.v(TAG, "相册图片地址, path = " + path); } else { path = path.toString().replace("file://", ""); Logger.v(TAG, "拍照图片地址, path = " + path); // 扫描文件 SystemUtils.scanPhoto(WeiboClientActivity.this, new File(path)); } File file = new File(path); if (file.exists()) uploadMsg.onReceiveValue(Uri.fromFile(file)); else { uploadMsg.onReceiveValue(null); showMessage(R.string.dm_pic_notexist); } Logger.w(TAG, String.format("上传文件是否存在 = %s, 文件路径 = %s", String.valueOf(file.exists()), file.getAbsoluteFile())); } uploadMsg = null; } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_weiboclient, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onPrepareOptionsMenu(Menu menu) { menu.findItem(R.id.fillAccount).setVisible(!TextUtils.isEmpty(mUrl) && isLoginUrl(mUrl)); return super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.fillAccount) { fillAccount(); } else if (item.getItemId() == R.id.refresh) { mWebView.reload(); } return super.onOptionsItemSelected(item); } private void fillAccount() { final String url = "http://passport.weibo.cn/signin/login?"; new WorkTask<Void, Void, String>() { @Override protected void onPrepare() { super.onPrepare(); ViewUtils.createProgressDialog(WeiboClientActivity.this, getString(R.string.account_fillaccount_loading), ThemeUtils.getThemeColor()).show(); } @Override public String workInBackground(Void... p) throws TaskException { try { AccountBean accountBean = AccountUtils.getLogedinAccount(); if (TextUtils.isEmpty(accountBean.getAccount()) || TextUtils.isEmpty(accountBean.getPassword())) throw new TaskException("", getString(R.string.account_fillaccount_faild)); String js = FileUtils.readAssetsFile("mobile.js", GlobalContext.getInstance()); js = js.replace("%username%", accountBean.getAccount()); js = js.replace("%password%", accountBean.getPassword()); Document dom = Jsoup.connect(url).get(); String html = dom.toString(); html = html.replace("</head>", js + "</head>"); return html; } catch (Exception e) { e.printStackTrace(); } throw new TaskException("", getString(R.string.account_fillaccount_faild)); } @Override protected void onSuccess(String s) { super.onSuccess(s); Logger.e(s); mWebView.loadDataWithBaseURL("http://passport.weibo.cn", s, "text/html", "UTF-8", ""); GlobalContext.getInstance().getHandler().postDelayed(new Runnable() { @Override public void run() { mWebView.loadUrl("javascript:fillAccount()"); ViewUtils.dismissProgressDialog(); } }, 1500); } @Override protected void onFailure(TaskException exception) { super.onFailure(exception); showMessage(exception.getMessage()); ViewUtils.dismissProgressDialog(); } }.execute(); } @Override public boolean onHomeClick() { return super.onBackClick(); } @Override public boolean onBackClick() { if (mWebView.canGoBack()) { mWebView.goBack(); return true; } return super.onBackClick(); } private boolean isLoginUrl(String url) { return url.toLowerCase().startsWith("https://passport.weibo.cn/signin/login"); } }