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