Skip to content

Commit 8c13045

Browse files
committed
WIP: simpler token api
1 parent 7545985 commit 8c13045

8 files changed

+874
-298
lines changed

android/build.gradle

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
// START - required to allow working on this project inside Android Studio
2-
// YES, jcenter is required twice - it somehow tricks studio into compiling deps below
3-
// doesn't break anything anywhere else and projects using this lib work as normal
41
buildscript {
52
repositories {
63
jcenter()
4+
maven { url "https://jitpack.io" }
75
}
86
dependencies {
97
classpath 'com.android.tools.build:gradle:2.1.3'
@@ -12,6 +10,7 @@ buildscript {
1210
// END
1311

1412
apply plugin: 'com.android.library'
13+
apply plugin: 'maven'
1514

1615
android {
1716
compileSdkVersion 23
@@ -35,25 +34,25 @@ android {
3534
}
3635
}
3736

38-
// START - required to allow working on this project inside Android Studio
39-
// YES, jcenter is required twice - it somehow tricks studio into compiling deps below
40-
// doesn't break anything anywhere else and projects using this lib work as normal
41-
// you'll now have code completion/validation and all the other AS goodies.
4237
allprojects {
4338
repositories {
4439
jcenter()
40+
maven { url "https://jitpack.io" }
4541
}
4642
}
4743
// END
4844

4945
dependencies {
5046
compile 'com.facebook.react:react-native:+'
51-
compile 'com.wu-man:android-oauth-client:0.4.5@aar'
52-
compile 'com.google.android.gms:play-services-base:+'
53-
compile 'com.android.volley:volley:+'
47+
// compile 'com.wu-man:android-oauth-client:0.4.5@aar'
48+
// compile 'com.google.android.gms:play-services-base:+'
49+
// compile 'com.android.volley:volley:+'
50+
compile 'com.github.scribejava:scribejava-apis:+'
51+
compile 'com.github.delight-im:Android-AdvancedWebView:v3.0.0'
52+
compile 'com.google.code.gson:gson:+'
5453

55-
compile 'com.google.api-client:google-api-client-android:1.19.0' exclude module: 'httpclient'
56-
compile 'com.google.http-client:google-http-client-gson:1.19.0' exclude module: 'httpclient'
54+
// compile 'com.google.api-client:google-api-client-android:1.19.0' exclude module: 'httpclient'
55+
// compile 'com.google.http-client:google-http-client-gson:1.19.0' exclude module: 'httpclient'
5756

5857
// compile('com.google.api-client:google-api-client-android:1.15.0-rc') {
5958
// exclude group: 'com.google.android.google-play-services', module: 'google-play-services'
@@ -62,6 +61,5 @@ dependencies {
6261
// }
6362
// // compile 'com.google.oauth-client:google-oauth-client-java6:1.15.0-rc'
6463
// compile 'com.google.apis:google-api-services-oauth2:v1-rev129-1.22.0'
65-
compile 'com.google.http-client:google-http-client-jackson2:1.22.0'
64+
// compile 'com.google.http-client:google-http-client-jackson2:1.22.0'
6665
}
67-
Lines changed: 251 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,251 @@
1+
package io.fullstack.oauth;
2+
3+
import im.delight.android.webview.AdvancedWebView;
4+
import android.app.Dialog;
5+
6+
import android.net.Uri;
7+
import java.util.Set;
8+
import java.net.URL;
9+
import java.net.MalformedURLException;
10+
import android.text.TextUtils;
11+
import android.annotation.SuppressLint;
12+
import android.widget.LinearLayout;
13+
import android.view.Gravity;
14+
15+
import android.app.DialogFragment;
16+
import android.content.DialogInterface;
17+
import android.widget.FrameLayout;
18+
19+
import android.webkit.WebView;
20+
import android.view.View;
21+
import android.webkit.WebViewClient;
22+
import android.content.Intent;
23+
import android.view.LayoutInflater;
24+
import android.view.ViewGroup;
25+
import android.view.ViewGroup.LayoutParams;
26+
import android.content.Context;
27+
import android.util.DisplayMetrics;
28+
29+
import com.github.scribejava.core.model.OAuth1AccessToken;
30+
import com.github.scribejava.core.model.OAuth1RequestToken;
31+
import android.util.Log;
32+
import android.graphics.Bitmap;
33+
import android.os.Bundle;
34+
import android.app.Fragment;
35+
import java.io.IOException;
36+
37+
public class OAuthManagerDialogFragment extends DialogFragment implements AdvancedWebView.Listener {
38+
39+
private static final int WEBVIEW_TAG = 100001;
40+
private static final int WIDGET_TAG = 100002;
41+
42+
private static final String TAG = "OAuthManagerDialogFragment";
43+
private OAuthManagerFragmentController mController;
44+
45+
private AdvancedWebView mWebView;
46+
47+
public static final OAuthManagerDialogFragment newInstance(
48+
OAuthManagerFragmentController controller
49+
) {
50+
Bundle args = new Bundle();
51+
OAuthManagerDialogFragment frag =
52+
new OAuthManagerDialogFragment(controller);
53+
54+
return frag;
55+
}
56+
57+
public OAuthManagerDialogFragment(
58+
OAuthManagerFragmentController controller
59+
) {
60+
this.mController = controller;
61+
}
62+
63+
@Override
64+
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
65+
// View rootView = inflater.inflate(R.id.primary, container, false);
66+
final Context context = inflater.getContext();
67+
// DisplayMetrics metrics = context.getResources().getDisplayMetrics();
68+
// final int DIALOG_HEIGHT = (int) Math.min(0.8f * metrics.heightPixels, 1024);
69+
70+
FrameLayout rootView = new FrameLayout(context);
71+
getDialog().setCanceledOnTouchOutside(true);
72+
rootView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
73+
74+
// mWebView = (AdvancedWebView) rootView.findViewById(R.id.webview);
75+
Log.d(TAG, "Creating webview");
76+
mWebView = new AdvancedWebView(context);
77+
mWebView.setId(WEBVIEW_TAG);
78+
mWebView.setListener(this, this);
79+
mWebView.setVisibility(View.VISIBLE);
80+
81+
rootView.addView(mWebView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
82+
83+
LinearLayout pframe = new LinearLayout(context);
84+
pframe.setId(WIDGET_TAG);
85+
pframe.setOrientation(LinearLayout.VERTICAL);
86+
pframe.setVisibility(View.GONE);
87+
pframe.setGravity(Gravity.CENTER);
88+
89+
rootView.addView(pframe,
90+
new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
91+
92+
this.setupWebView(mWebView);
93+
mController.getRequestTokenUrlAndLoad(mWebView);
94+
95+
Log.d(TAG, "Loading view...");
96+
return rootView;
97+
}
98+
99+
private void setupWebView(AdvancedWebView webView) {
100+
Log.d(TAG, "Setting webview client");
101+
webView.setWebViewClient(new WebViewClient() {
102+
@Override
103+
public boolean shouldOverrideUrlLoading(WebView view, String url) {
104+
Log.i(TAG, "shouldOverrideUrlLoading: " + url);
105+
interceptUrl(view, url, true);
106+
return true;
107+
}
108+
109+
@Override
110+
public void onReceivedError(WebView view, int code, String desc, String failingUrl) {
111+
Log.i(TAG, "onReceivedError: " + failingUrl);
112+
super.onReceivedError(view, code, desc, failingUrl);
113+
onError(desc);
114+
}
115+
116+
private boolean interceptUrl(WebView view, String url, boolean loadUrl) {
117+
if (isCallbackUri(url, mController.getCallbackUrl())) {
118+
// We are on callback page
119+
Log.d(TAG, "We got the callback url: " + url);
120+
Uri responseUri = Uri.parse(url);
121+
String oauthToken = responseUri.getQueryParameter("oauth_token");
122+
String oauthVerifier = responseUri.getQueryParameter("oauth_verifier");
123+
mController.getAccessToken(mWebView, oauthVerifier);
124+
125+
return true;
126+
}
127+
128+
if (loadUrl) {
129+
view.loadUrl(url);
130+
}
131+
132+
return false;
133+
}
134+
});
135+
}
136+
137+
public void setComplete(final OAuth1AccessToken accessToken) {
138+
Log.d(TAG, "Completed: " + accessToken);
139+
}
140+
141+
@Override
142+
public void onStart() {
143+
super.onStart();
144+
145+
Log.d(TAG, "onStart for DialogFragment");
146+
}
147+
148+
@Override
149+
public void onDismiss(final DialogInterface dialog) {
150+
super.onDismiss(dialog);
151+
Log.d(TAG, "Dismissing dialog");
152+
}
153+
154+
155+
// @Override
156+
// void onCancel(DialogInterface dialog) {
157+
// Log.d(TAG, "onCancel called for dialog");
158+
// onError("Cancelled");
159+
// }
160+
161+
@SuppressLint("NewApi")
162+
@Override
163+
public void onResume() {
164+
super.onResume();
165+
mWebView.onResume();
166+
Log.d(TAG, "onResume called");
167+
}
168+
169+
@SuppressLint("NewApi")
170+
@Override
171+
public void onPause() {
172+
Log.d(TAG, "onPause called");
173+
mWebView.onPause();
174+
super.onPause();
175+
}
176+
177+
@Override
178+
public void onDestroy() {
179+
mWebView.onDestroy();
180+
this.mController = null;
181+
// ...
182+
super.onDestroy();
183+
}
184+
185+
@Override
186+
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
187+
super.onActivityResult(requestCode, resultCode, intent);
188+
mWebView.onActivityResult(requestCode, resultCode, intent);
189+
190+
Log.d(TAG, "onActivityResult: " + requestCode);
191+
// ...
192+
}
193+
194+
@Override
195+
public void onPageStarted(String url, Bitmap favicon) {
196+
Log.d(TAG, "onPageStarted " + url);
197+
}
198+
199+
@Override
200+
public void onPageFinished(String url) {
201+
Log.d(TAG, "onPageFinished: " + url);
202+
}
203+
204+
@Override
205+
public void onPageError(int errorCode, String description, String failingUrl) {
206+
Log.e(TAG, "onPageError: " + failingUrl);
207+
}
208+
209+
@Override
210+
public void onDownloadRequested(String url, String suggestedFilename, String mimeType, long contentLength, String contentDisposition, String userAgent) { }
211+
212+
@Override
213+
public void onExternalPageRequest(String url) {
214+
Log.d(TAG, "onExternalPageRequest: " + url);
215+
}
216+
217+
private void onError(String msg) {
218+
Log.e(TAG, "Error: " + msg);
219+
}
220+
221+
static boolean isCallbackUri(String uri, String callbackUrl) {
222+
Uri u = null;
223+
Uri r = null;
224+
try {
225+
u = Uri.parse(uri);
226+
r = Uri.parse(callbackUrl);
227+
} catch (NullPointerException e) {
228+
return false;
229+
}
230+
231+
if (u == null || r == null) return false;
232+
233+
boolean rOpaque = r.isOpaque();
234+
boolean uOpaque = u.isOpaque();
235+
if (uOpaque != rOpaque) return false;
236+
237+
if (rOpaque) return TextUtils.equals(uri, callbackUrl);
238+
if (!TextUtils.equals(r.getScheme(), u.getScheme())) return false;
239+
if (u.getPort() != r.getPort()) return false;
240+
if (!TextUtils.isEmpty(r.getPath()) && !TextUtils.equals(r.getPath(), u.getPath())) return false;
241+
242+
Set<String> paramKeys = r.getQueryParameterNames();
243+
for (String key : paramKeys) {
244+
if (!TextUtils.equals(r.getQueryParameter(key), u.getQueryParameter(key))) return false;
245+
}
246+
247+
String frag = r.getFragment();
248+
if (!TextUtils.isEmpty(frag) && !TextUtils.equals(frag, u.getFragment())) return false;
249+
return true;
250+
}
251+
}

0 commit comments

Comments
 (0)