mastodon-app-ufficiale-android/mastodon/src/main/java/org/joinmastodon/android/OAuthActivity.java

104 lines
3.2 KiB
Java

package org.joinmastodon.android;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;
import org.joinmastodon.android.api.requests.accounts.GetOwnAccount;
import org.joinmastodon.android.api.requests.oauth.GetOauthToken;
import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.model.Account;
import org.joinmastodon.android.model.Application;
import org.joinmastodon.android.model.Instance;
import org.joinmastodon.android.model.Token;
import androidx.annotation.Nullable;
import me.grishka.appkit.api.Callback;
import me.grishka.appkit.api.ErrorResponse;
public class OAuthActivity extends Activity{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Uri uri=getIntent().getData();
if(uri==null || isTaskRoot()){
finish();
return;
}
if(uri.getQueryParameter("error")!=null){
String error=uri.getQueryParameter("error_description");
if(TextUtils.isEmpty(error))
error=uri.getQueryParameter("error");
Toast.makeText(this, error, Toast.LENGTH_LONG).show();
finish();
restartMainActivity();
return;
}
String code=uri.getQueryParameter("code");
if(TextUtils.isEmpty(code)){
finish();
return;
}
Instance instance=AccountSessionManager.getInstance().getAuthenticatingInstance();
Application app=AccountSessionManager.getInstance().getAuthenticatingApp();
if(instance==null || app==null){
finish();
return;
}
ProgressDialog progress=new ProgressDialog(this);
progress.setMessage(getString(R.string.finishing_auth));
progress.setCancelable(false);
progress.show();
new GetOauthToken(app.clientId, app.clientSecret, code)
.setCallback(new Callback<>(){
@Override
public void onSuccess(Token token){
new GetOwnAccount()
.setCallback(new Callback<>(){
@Override
public void onSuccess(Account account){
AccountSessionManager.getInstance().addAccount(instance, token, account, app);
progress.dismiss();
finish();
// not calling restartMainActivity() here on purpose to have it recreated (notice different flags)
Intent intent=new Intent(OAuthActivity.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
@Override
public void onError(ErrorResponse error){
handleError(error);
progress.dismiss();
}
})
.exec(instance.uri, token);
}
@Override
public void onError(ErrorResponse error){
handleError(error);
progress.dismiss();
}
})
.execNoAuth(instance.uri);
}
private void handleError(ErrorResponse error){
error.showToast(OAuthActivity.this);
finish();
restartMainActivity();
}
private void restartMainActivity(){
Intent intent=new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
}
}