Skip to content
This repository has been archived by the owner on Jan 18, 2024. It is now read-only.

Commit

Permalink
Use PIN code instead of callback URL for OAuth.
Browse files Browse the repository at this point in the history
 - target API 17
  • Loading branch information
takuo committed Feb 28, 2013
1 parent 3a76830 commit c1e832e
Show file tree
Hide file tree
Showing 5 changed files with 143 additions and 15 deletions.
48 changes: 44 additions & 4 deletions res/layout/login.xml
@@ -1,6 +1,46 @@
<?xml version="1.0" encoding="UTF-8"?>
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/webview"

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
android:layout_height="fill_parent">

<WebView
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/buttonPIN"
android:focusable="true"
android:layout_alignParentTop="true" />

<TextView
android:id="@+id/labelPIN"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_below="@+id/webview"
android:layout_centerHorizontal="false"
android:layout_centerVertical="false"
android:gravity="center_vertical"
android:text="@string/pin" />

<EditText
android:id="@+id/edit_code"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_toLeftOf="@+id/buttonPIN"
android:layout_toRightOf="@+id/labelPIN"
android:enabled="false"
android:inputType="number" />

<Button
android:id="@+id/buttonPIN"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:enabled="false"
android:text="@string/ok" />

</RelativeLayout>
6 changes: 4 additions & 2 deletions res/values-ja/strings.xml
Expand Up @@ -4,9 +4,9 @@
<string name="login">ログイン</string>
<string name="logout">ログアウト</string>
<string name="twitter_login">Twitter ログイン</string>
<string name="dialog_message">OAuth を準備中...</string>
<string name="dialog_message">OAuth を準備中&#8230;</string>
<string name="dialog_title">Twitter ログイン</string>
<string name="logout_message">ログアウトしました...</string>
<string name="logout_message">ログアウトしました&#8230;</string>
<string name="action_batari">バタリ</string>
<string name="action_gabari">ガバリ</string>
<string name="action_furoha">フロハ</string>
Expand All @@ -20,4 +20,6 @@
<string name="avoid_limit">API制限を回避するためステータステキストに時刻情報を付加します</string>
<string name="not_loggedin">ログインしてません</string>
<string name="oauth_fail">OAuth 認証に失敗しました</string>
<string name="ok">OK</string>
<string name="pin">PIN</string>
</resources>
6 changes: 4 additions & 2 deletions res/values/strings.xml
Expand Up @@ -4,9 +4,9 @@
<string name="login">Login</string>
<string name="logout">Logout</string>
<string name="twitter_login">Twitter Login</string>
<string name="dialog_message">Preparing OAuth...</string>
<string name="dialog_message">Preparing OAuth&#8230;</string>
<string name="dialog_title">Twitter Login</string>
<string name="logout_message">Logout...</string>
<string name="logout_message">Logout&#8230;</string>
<string name="action_batari">batari</string>
<string name="action_gabari">gabari</string>
<string name="action_furoha">furoha</string>
Expand All @@ -20,4 +20,6 @@
<string name="avoid_limit">Adding time information into status text to avoid API limitation.</string>
<string name="not_loggedin">Not logged in</string>
<string name="oauth_fail">Failed to OAuth</string>
<string name="ok">OK</string>
<string name="pin">PIN</string>
</resources>
21 changes: 16 additions & 5 deletions src/jp/takuo/android/ojiichan/Main.java
Expand Up @@ -4,6 +4,7 @@
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.auth.AccessToken;
import android.R.integer;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
Expand All @@ -12,6 +13,7 @@
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
Expand All @@ -30,9 +32,11 @@
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.Point;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.BitmapDrawable;
import android.util.DisplayMetrics;

import java.util.Timer;
import java.util.TimerTask;

Expand Down Expand Up @@ -165,7 +169,7 @@ protected AnimationDrawable createScaledAnimation(ImageView imageView, int resou
BitmapDrawable drawable = (BitmapDrawable)animationDrawable.getFrame(i);
Bitmap bitmap = drawable.getBitmap();
Bitmap bitmap2 = Bitmap.createScaledBitmap(bitmap, (int)(bitmap.getWidth()*mResizeX), (int)(bitmap.getHeight()*mResizeY), false);
BitmapDrawable bd = new BitmapDrawable(bitmap2);
BitmapDrawable bd = new BitmapDrawable(getResources(), bitmap2);
bd.setTargetDensity(bitmap.getDensity());
retval.addFrame(bd, animationDrawable.getDuration(i));
}
Expand All @@ -187,7 +191,6 @@ public void onCreate(Bundle savedInstanceState) {
mFurohaButton = (ImageView)findViewById(R.id.button_furoha);
mFuroaButton = (ImageView)findViewById(R.id.button_furoa);
mParticle = (ImageView)findViewById(R.id.particle);
ImageView image = (ImageView)findViewById(R.id.mainimage);

WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE);
Display disp = wm.getDefaultDisplay();
Expand All @@ -214,8 +217,16 @@ public void onCreate(Bundle savedInstanceState) {
break;
}
Log.d(LOG_TAG, "titleBarHeight = " + titleBarHeight);
int w = disp.getWidth();
int h = disp.getHeight() - titleBarHeight;
int w, h;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR2) {
w = disp.getWidth();
h = disp.getHeight() - titleBarHeight;
} else {
Point dispSize = new Point();
disp.getSize(dispSize);
w = dispSize.x;
h = dispSize.y - titleBarHeight;
}
Log.d(LOG_TAG, "w: " + w + ", h: " + h);
mScaleX = (float)w / (float)438;
mScaleY = (float)h / (float)600;
Expand All @@ -232,7 +243,7 @@ public void onCreate(Bundle savedInstanceState) {
setScaledImage(mFuroaButton, R.drawable.button_furoa_off);
setScaledImage(mFurohaButton, R.drawable.button_furoha_off);

image.setOnTouchListener(new OnTouchListener() {
mMainImage.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO: make better ImageMap implementation.
Expand Down
77 changes: 75 additions & 2 deletions src/jp/takuo/android/ojiichan/TwitterLogin.java
@@ -1,36 +1,47 @@
package jp.takuo.android.ojiichan;

import java.util.regex.Pattern;
import java.util.regex.Matcher;

import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.auth.AccessToken;
import twitter4j.auth.RequestToken;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class TwitterLogin extends Activity {
private static final String CALLBACK_URL = "ojiichan://oauthcallback/";
private static final String CALLBACK_URL = "oob"; // "ojiichan://oauthcallback/";
private static final String LOG_TAG = "OjiichanLogin";
private ProgressDialog mProgressDialog;
private Twitter mTwitter;
private RequestToken mRequestToken;
private AccessToken mAccessToken;
private WebView mWebView;
private Button mButtonOK;
private EditText mEditPIN;
private Context mContext;
private Intent mIntent;
private Handler mHandler;

class AsyncRequest extends AsyncTask<Void, String, Void> {
public AsyncRequest() {
Expand Down Expand Up @@ -77,6 +88,27 @@ protected Void doInBackground(Void... params) {
}
}

class HTMLParser {
public void log(String str) {
Pattern p = Pattern.compile("<code>(\\d+)</code>");
Matcher m = p.matcher(str);
if (m.find()) {
final String pin = m.group(1);
Log.d("HTMLParser", "PIN CODE: "+ pin);
mHandler.post(new Runnable() {
@Override
public void run() {
mEditPIN.setText(pin);
mEditPIN.setEnabled(true);
mButtonOK.setEnabled(true);
// verifyCode(pin);
}
});
}
}
}

@SuppressLint("SetJavaScriptEnabled") // Be careful!
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Expand All @@ -88,8 +120,20 @@ public void onCreate(Bundle savedInstanceState) {
mTwitter = new TwitterFactory().getInstance();
mTwitter.setOAuthConsumer(Main.CONSUMER_KEY, Main.CONSUMER_SEC);

mHandler = new Handler();

mButtonOK = (Button)findViewById(R.id.buttonPIN);
mButtonOK.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
verifyCode(mEditPIN.getText().toString());
}
});
mEditPIN = (EditText)findViewById(R.id.edit_code);
mWebView = (WebView)findViewById(R.id.webview);
mWebView.addJavascriptInterface(new HTMLParser(), "htmlParser");
mWebView.setWebViewClient(new WebViewClient(){
/*
@Override
public boolean shouldOverrideUrlLoading (WebView view, String url) {
if (url.startsWith(CALLBACK_URL)) {
Expand All @@ -100,6 +144,10 @@ public boolean shouldOverrideUrlLoading (WebView view, String url) {
return true;
}
return false;
}*/
@Override
public void onPageFinished (WebView view, String url) {
view.loadUrl("javascript:window.htmlParser.log(document.documentElement.outerHTML);");
}
});
mWebView.getSettings().setAppCacheEnabled(false);
Expand All @@ -117,6 +165,7 @@ public void onProgressChanged(WebView w, int p) {
req.execute();
}

/*
private void verify(Uri uri) {
if (uri != null) {
String verifier = uri.getQueryParameter("oauth_verifier");
Expand All @@ -138,4 +187,28 @@ private void verify(Uri uri) {
}
}
}
*/

private void verifyCode(String pin) {
try {
mAccessToken = mTwitter.getOAuthAccessToken(mRequestToken, pin);
mTwitter.setOAuthAccessToken(mAccessToken);
String name = mTwitter.getScreenName();
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(mContext);
SharedPreferences.Editor editor = pref.edit();
editor.putString(Main.PREF_ACCESS_TOKEN, mAccessToken.getToken());
editor.putString(Main.PREF_ACCESS_TOKEN_SECRET, mAccessToken.getTokenSecret());
editor.putString(Main.PREF_ACCOUNT, name);
editor.commit();
Toast.makeText(mContext, R.string.success, Toast.LENGTH_LONG).show();
} catch (TwitterException e) {
Log.d(LOG_TAG, "Cannot get AccessToken: " + e.getMessage());
Toast.makeText(mContext, R.string.fail, Toast.LENGTH_LONG).show();
} catch (Exception e) {
Log.d(LOG_TAG, "Cannot get AccessToken: " + e.getMessage());
Toast.makeText(mContext, R.string.fail, Toast.LENGTH_LONG).show();
}
setResult(Activity.RESULT_OK, mIntent);
finish();
}
}

0 comments on commit c1e832e

Please sign in to comment.