Commit a454a35d authored by Varun Patil's avatar Varun Patil

Rewrite login to use Chrome tabs

parent 9859862d
...@@ -70,5 +70,6 @@ dependencies { ...@@ -70,5 +70,6 @@ dependencies {
implementation "com.github.prolificinteractive:material-calendarview:${materialCalendarViewVersion}" implementation "com.github.prolificinteractive:material-calendarview:${materialCalendarViewVersion}"
implementation "com.jakewharton.threetenabp:threetenabp:${threetenBPVersion}" implementation "com.jakewharton.threetenabp:threetenabp:${threetenBPVersion}"
implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.browser:browser:1.0.0'
} }
apply plugin: 'com.google.gms.google-services' apply plugin: 'com.google.gms.google-services'
...@@ -95,13 +95,16 @@ ...@@ -95,13 +95,16 @@
android:screenOrientation="portrait"> android:screenOrientation="portrait">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
<intent-filter> <intent-filter>
<action android:name="HANDLE_AUTHORIZATION_RESPONSE" /> <action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data
android:host="insti.app"
android:scheme="instiapp"/>
</intent-filter> </intent-filter>
</activity> </activity>
......
...@@ -77,7 +77,7 @@ ...@@ -77,7 +77,7 @@
<div class="lowerdiv"> <div class="lowerdiv">
<div class="logindiv"> <div class="logindiv">
<a class="login" <a class="login"
href="https://gymkhana.iitb.ac.in/sso/account/login/?next=/sso/oauth/authorize/%3Fclient_id%3DvR1pU7wXWyve1rUkg0fMS6StL1Kr6paoSmRIiLXJ%26response_type%3Dcode%26scope%3Dbasic%2520profile%2520picture%2520sex%2520ldap%2520phone%2520insti_address%2520program%2520secondary_emails%26redirect_uri=https://redirecturi"> href="https://loginuri">
LOG IN VIA SSO LOG IN VIA SSO
</a> </a>
<br><br> <br><br>
......
...@@ -6,12 +6,12 @@ import android.content.Context; ...@@ -6,12 +6,12 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log;
import android.webkit.WebView; import android.webkit.WebView;
import android.webkit.WebViewClient; import android.webkit.WebViewClient;
import android.widget.Toast; import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.browser.customtabs.CustomTabsIntent;
import com.google.android.gms.tasks.OnSuccessListener; import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.FirebaseInstanceId;
...@@ -20,23 +20,23 @@ import com.google.firebase.iid.InstanceIdResult; ...@@ -20,23 +20,23 @@ import com.google.firebase.iid.InstanceIdResult;
import app.insti.Constants; import app.insti.Constants;
import app.insti.R; import app.insti.R;
import app.insti.SessionManager; import app.insti.SessionManager;
import app.insti.api.EmptyCallback;
import app.insti.api.RetrofitInterface; import app.insti.api.RetrofitInterface;
import app.insti.api.ServiceGenerator; import app.insti.api.ServiceGenerator;
import app.insti.api.response.LoginResponse; import app.insti.api.response.LoginResponse;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response; import retrofit2.Response;
public class LoginActivity extends AppCompatActivity { public class LoginActivity extends AppCompatActivity {
private static final String TAG = "LoginActivity"; private static final String TAG = "LoginActivity";
private final String redirectUri = "https://redirecturi"; private final String redirectUri = "https://insti.app/login-android.html";
private final String guestUri = "https://guesturi"; private final String guestUri = "https://guesturi";
private final String loginUri = "https://loginuri";
public String authCode = null; public String authCode = null;
public String fcmId = null; public String fcmId = null;
private SessionManager session; private SessionManager session;
private Context mContext = this; private Context mContext = this;
private boolean loggingIn = false;
private ProgressDialog progressDialog; private ProgressDialog progressDialog;
private RetrofitInterface retrofitInterface; private RetrofitInterface retrofitInterface;
...@@ -75,15 +75,10 @@ public class LoginActivity extends AppCompatActivity { ...@@ -75,15 +75,10 @@ public class LoginActivity extends AppCompatActivity {
protected void onStart() { protected void onStart() {
super.onStart(); super.onStart();
// Initialize
ServiceGenerator serviceGenerator = new ServiceGenerator(getApplicationContext()); ServiceGenerator serviceGenerator = new ServiceGenerator(getApplicationContext());
this.retrofitInterface = serviceGenerator.getRetrofitInterface(); this.retrofitInterface = serviceGenerator.getRetrofitInterface();
WebView webview = (WebView) findViewById(R.id.login_webview);
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setDomStorageEnabled(true);
webview.setWebViewClient(new WvClient());
webview.loadUrl("file:///android_asset/login.html");
// Get FCM Id // Get FCM Id
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() { FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() {
@Override @Override
...@@ -91,66 +86,47 @@ public class LoginActivity extends AppCompatActivity { ...@@ -91,66 +86,47 @@ public class LoginActivity extends AppCompatActivity {
fcmId = instanceIdResult.getToken(); fcmId = instanceIdResult.getToken();
} }
}); });
}
private void login(final String authorizationCode, final String redirectURL) { // Login if intent is present
/* This can be null if play services is hung */ String action = getIntent().getAction();
RetrofitInterface retrofitInterface = getRetrofitInterface(); String data = getIntent().getDataString();
Call<LoginResponse> call; if (Intent.ACTION_VIEW.equals(action) && data != null) {
if (fcmId == null) { Uri query = Uri.parse(data);
call = retrofitInterface.login(authorizationCode, redirectURL); authCode = query.getQueryParameter("code");
} else {
call = retrofitInterface.login(authorizationCode, redirectURL, fcmId);
}
call.enqueue(new Callback<LoginResponse>() { /* Show progress dialog */
@Override
public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
if (response.isSuccessful()) {
session.createLoginSession(response.body().getUser().getUserName(), response.body().getUser(), response.body().getSessionID());
progressDialog.dismiss();
openMainActivity();
finish();
} else {
Toast.makeText(LoginActivity.this, "Authorization Failed!", Toast.LENGTH_LONG).show();
progressDialog.dismiss();
}
}
@Override
public void onFailure(Call<LoginResponse> call, Throwable t) {
//Network Error
}
});
}
@Deprecated
private void passLogin(final String username, final String password) {
if (!progressDialog.isShowing()) {
progressDialog.setMessage("Logging In"); progressDialog.setMessage("Logging In");
progressDialog.setCancelable(false); progressDialog.setCancelable(false);
progressDialog.setIndeterminate(true); progressDialog.setIndeterminate(true);
if (!progressDialog.isShowing()) {
progressDialog.show(); progressDialog.show();
} }
RetrofitInterface retrofitInterface = getRetrofitInterface(); /* Perform the login */
Call<LoginResponse> call; login(authCode, redirectUri);
}
// Setup web view placeholder
WebView webview = findViewById(R.id.login_webview);
webview.setWebViewClient(new WvClient());
webview.loadUrl("file:///android_asset/login.html");
}
private void login(final String authorizationCode, final String redirectURL) {
/* This can be null if play services is hung */ /* This can be null if play services is hung */
RetrofitInterface retrofitInterface = getRetrofitInterface();
Call<LoginResponse> call;
if (fcmId == null) { if (fcmId == null) {
call = retrofitInterface.passwordLogin(username, password); call = retrofitInterface.login(authorizationCode, redirectURL);
} else { } else {
call = retrofitInterface.passwordLogin(username, password, fcmId); call = retrofitInterface.login(authorizationCode, redirectURL, fcmId);
} }
/* Log in the user */ call.enqueue(new EmptyCallback<LoginResponse>() {
call.enqueue(new Callback<LoginResponse>() {
@Override @Override
public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) { public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
loggingIn = false;
if (response.isSuccessful()) { if (response.isSuccessful()) {
Log.d(TAG, "Login request successful"); session.createLoginSession(response.body().getUser().getUserName(), response.body().getUser(), response.body().getSessionID());
session.createLoginSession(username, response.body().getUser(), response.body().getSessionID());
progressDialog.dismiss(); progressDialog.dismiss();
openMainActivity(); openMainActivity();
finish(); finish();
...@@ -159,32 +135,21 @@ public class LoginActivity extends AppCompatActivity { ...@@ -159,32 +135,21 @@ public class LoginActivity extends AppCompatActivity {
progressDialog.dismiss(); progressDialog.dismiss();
} }
} }
@Override
public void onFailure(Call<LoginResponse> call, Throwable t) {
loggingIn = false;
}
}); });
} }
private class WvClient extends WebViewClient { private class WvClient extends WebViewClient {
@Override @Override
public boolean shouldOverrideUrlLoading(final WebView view, final String url) { public boolean shouldOverrideUrlLoading(final WebView view, final String url) {
/* Capture redirect */ /* Actual login button */
if (url.startsWith(redirectUri)) { if (url.startsWith(loginUri)) {
/* Show progress dialog */ CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder()
progressDialog.setMessage("Logging In"); .addDefaultShareMenuItem()
progressDialog.setCancelable(false); .setToolbarColor(LoginActivity.this.getResources()
progressDialog.setIndeterminate(true); .getColor(R.color.colorPrimary))
if (!progressDialog.isShowing()) { .setShowTitle(true)
progressDialog.show(); .build();
} customTabsIntent.launchUrl(LoginActivity.this, Uri.parse("https://gymkhana.iitb.ac.in/sso/account/login/?next=/sso/oauth/authorize/%3Fclient_id%3DvR1pU7wXWyve1rUkg0fMS6StL1Kr6paoSmRIiLXJ%26response_type%3Dcode%26scope%3Dbasic%2520profile%2520picture%2520sex%2520ldap%2520phone%2520insti_address%2520program%2520secondary_emails%26redirect_uri=https://insti.app/login-android.html"));
loggingIn = true;
/* Get auth code from query */
String query = Uri.parse(url).getQuery();
authCode = query.substring(query.lastIndexOf("=") + 1);
login(authCode, redirectUri);
return true; return true;
} }
...@@ -195,23 +160,10 @@ public class LoginActivity extends AppCompatActivity { ...@@ -195,23 +160,10 @@ public class LoginActivity extends AppCompatActivity {
return true; return true;
} }
if (!progressDialog.isShowing()) {
progressDialog.setMessage("Loading");
progressDialog.setCancelable(false);
progressDialog.setIndeterminate(true);
progressDialog.show();
}
/* Load URL */ /* Load URL */
view.loadUrl(url); view.loadUrl(url);
return false; return false;
} }
@Override
public void onPageFinished(WebView view, String url) {
if (progressDialog.isShowing() && !loggingIn) {
progressDialog.dismiss();
}
}
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment