package org.aisen.weibo.sina.ui.fragment.account;
import org.aisen.weibo.sina.R;
import org.aisen.weibo.sina.support.bean.AccountBean;
import org.aisen.weibo.sina.support.db.AccountDB;
import org.aisen.weibo.sina.support.utils.AppContext;
import org.aisen.weibo.sina.support.utils.BaiduAnalyzeUtils;
import org.aisen.weibo.sina.ui.activity.common.FragmentContainerActivity;
import org.sina.android.SinaSDK;
import org.sina.android.bean.AccessToken;
import org.sina.android.bean.Groups;
import org.sina.android.bean.WeiBoUser;
import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import com.m.common.params.Params;
import com.m.common.params.ParamsUtil;
import com.m.common.settings.SettingUtility;
import com.m.common.utils.Logger;
import com.m.support.Inject.ViewInject;
import com.m.support.task.TaskException;
import com.m.support.task.WorkTask;
import com.m.ui.fragment.ABaseFragment;
import com.m.ui.utils.ViewUtils;
import fr.castorflex.android.smoothprogressbar.SmoothProgressBar;
/**
* 授权页面
*
* @author wangdan
*
*/
public class LoginFragment extends ABaseFragment {
public static void launch(ABaseFragment from, int requestCode) {
FragmentContainerActivity.launchForResult(from, LoginFragment.class, null, requestCode);
}
private static final String TAG = "Login";
@ViewInject(id = R.id.webview)
WebView webView;
@ViewInject(id = R.id.progress)
SmoothProgressBar progressBar;
private AccountTask accountTask;
@Override
protected int inflateContentView() {
return R.layout.ui_login;
}
@SuppressLint("SetJavaScriptEnabled") @Override
protected void layoutInit(LayoutInflater inflater, Bundle savedInstanceSate) {
super.layoutInit(inflater, savedInstanceSate);
ActionBar actionBar = getActivity().getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setTitle(R.string.title_login);
progressBar.setIndeterminate(true);
WebSettings setting = webView.getSettings();
setting.setJavaScriptEnabled(true);
setting.setDomStorageEnabled(true);
setting.setAppCacheEnabled(true);
setting.setDefaultTextEncodingName("utf-8") ;
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, final String url) {
view.loadUrl(url);
return true;
}
});
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
if (newProgress < 100) {
progressBar.setVisibility(View.VISIBLE);
} else if (newProgress == 100) {
progressBar.setVisibility(View.GONE);
}
if (newProgress < 100) {
} else if (newProgress == 100) {
Logger.d(TAG, String.format("progress = 100 , url = %s", view.getUrl()));
// 是否授权成功
if (accountTask == null && webView.getUrl() != null && webView.getUrl().startsWith(SettingUtility.getStringSetting("callback_url"))) {
Params params = ParamsUtil.deCodeUrl(webView.getUrl());
String code = params.getParameter("code");
Logger.d(TAG, "授权成功, code = " + code);
accountTask = new AccountTask();
accountTask.execute(code);
}
}
if (webView.getUrl() != null && webView.getUrl().startsWith(SettingUtility.getStringSetting("callback_url"))) {
webView.setVisibility(View.GONE);
}
super.onProgressChanged(view, newProgress);
}
});
}
@Override
public void requestData() {
super.requestData();
webView.setVisibility(View.VISIBLE);
// 请求授权
SinaSDK.getInstance(null).doWebRequest(webView);
}
/**
* 1、加载授权信息
* 2、加载用户信息
*
* @author wangdan
*
*/
class AccountTask extends WorkTask<String, Integer, WeiBoUser> {
@Override
protected void onPrepare() {
super.onPrepare();
ViewUtils.createNormalProgressDialog(getActivity(), getString(R.string.account_load_auth)).show();
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
if (getActivity() != null)
ViewUtils.updateNormalProgressDialog(getString(values[0]));
}
@Override
public WeiBoUser workInBackground(String... params) throws TaskException {
// 1、请求授权
AccessToken accessToken = SinaSDK.getInstance(null).getAccessToken(params[0]);
AccountBean account = new AccountBean();
account.set_token(accessToken.getToken());
account.setSecret(accessToken.getSecret());
// 2、加载用户信息
publishProgress(R.string.account_load_userinfo);
WeiBoUser user = SinaSDK.getInstance(accessToken).userShow(accessToken.getUid(), null);
// 3、加载分组信息
publishProgress(R.string.account_load_groups);
Groups groups = SinaSDK.getInstance(accessToken).friendshipGroups();
// 4、更新新账户到DB
account.setUser(user);
account.setGroups(groups);
account.setUserId(user.getIdstr());
// 2014-09-18 移除了所有账户信息,包括LoggedIn,所以需要调用AccountFragment.login()
AccountDB.remove(account.getUserId());
AccountDB.newAccount(account);
if (AppContext.isLogedin() &&
// 2014-09-18 仅更新登录用户数据
AppContext.getUser().getIdstr().equals(user.getIdstr())) {
AccountFragment.login(account, false);
}
return user;
}
@Override
protected void onSuccess(WeiBoUser result) {
super.onSuccess(result);
Logger.d(TAG, "授权成功");
BaiduAnalyzeUtils.onEvent("add_account", "添加授权账号");
showMessage(R.string.account_auth_success);
if (getActivity() != null) {
getActivity().setResult(Activity.RESULT_OK);
getActivity().finish();
}
}
@Override
protected void onFailure(TaskException exception) {
super.onFailure(exception);
if ("21324".equals(exception.getErrorCode()) && getActivity() != null) {
new AlertDialog.Builder(getActivity()).setTitle(R.string.remind)
.setMessage(R.string.account_illegal_app)
.setPositiveButton(R.string.confirm, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
getActivity().finish();
}
})
.show();
}
else {
showMessage(exception.getErrorMsg());
if (getActivity() != null)
requestData();
}
}
@Override
protected void onFinished() {
super.onFinished();
ViewUtils.dismissNormalProgressDialog();
accountTask = null;
}
}
}