package org.succlz123.doubanbooklog.ui.login;
import android.app.Activity;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.Toolbar;
import org.json.JSONException;
import org.json.JSONObject;
import org.succlz123.doubanbooklog.DoubanApplication;
import org.succlz123.doubanbooklog.R;
import org.succlz123.doubanbooklog.bean.DbAccount;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
/**
* Created by fashi on 2015/3/25.
*/
public class LoginActivity extends Activity {
private static final String doubanUrl = "https://www.douban.com/service/auth2/auth";
private static final String tokenUrl = "https://www.douban.com/service/auth2/token";
public static final String apiKey = "0e24b05dfc621fc02a6e1119f5265f40";
private static final String secret = "e8a9edd1c47e067b";
private static final String redirectUrl = "doubanbooklog://ok";
private WebView webView;
private Toolbar mToolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login_webview);
mToolbar = (Toolbar) findViewById(R.id.toolbar);
mToolbar.setTitle("登录");
mToolbar.setTitleTextColor(Color.parseColor("#FFFFFF"));
final Button toolbarBtn = (Button) findViewById(R.id.toolbar_btn);
toolbarBtn.setBackgroundResource(R.drawable.back);
toolbarBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
webView = (WebView) findViewById(R.id.login_webview);
String url = doubanUrl + "?" + "client_id=" + apiKey + "&redirect_uri=" + redirectUrl
+ "&response_type=code&scope=book_basic_r,book_basic_w,douban_basic_common";//scope是权限
webView.loadUrl(url);
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith(redirectUrl)) {
String code = Uri.parse(url).getQueryParameter("code");
Log.v("LoginActivity", "code=" + code);
getToken(code);
return true;
}
return super.shouldOverrideUrlLoading(view, url);
}
});
}
public void getToken(String code) {
final String adress = tokenUrl + "?" + "client_id=" + apiKey + "&client_secret=" + secret + "&redirect_uri=" + redirectUrl + "&grant_type=" + "authorization_code" + "&code=" + code;
new Thread(new Runnable() {
@Override
public void run() {
try {
URL url = new URL(adress);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
InputStream a = conn.getInputStream();
final String json = inputStream2String(a);
runOnUiThread(new Runnable() {
@Override
public void run() {
DbAccount account = getAccoutFromJson(json);
DoubanApplication.getInstance().addAccount(account);
finish();
}
});
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
public String inputStream2String(InputStream in) throws IOException {
StringBuffer out = new StringBuffer();
byte[] b = new byte[4096];
for (int n; (n = in.read(b)) != -1; ) {
out.append(new String(b, 0, n));
}
return out.toString();
}
private DbAccount getAccoutFromJson(String result) {
try {
JSONObject jsonObject = new JSONObject(result);
String accessToken = jsonObject.optString("access_token", "");
String userName = jsonObject.optString("douban_user_name", "");
Integer userId = jsonObject.optInt("douban_user_id", 0);
Integer expiresIn = jsonObject.optInt("expires_in", 0);
String refreshToken = jsonObject.optString("refresh_token", "");
DbAccount dba = new DbAccount();
dba.setAccess_token(accessToken);
dba.setDouban_user_name(userName);
dba.setDouban_user_id(userId);
dba.setExpires_in(expiresIn);
dba.setRefresh_token(refreshToken);
return dba;
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
}