Account switcher

This commit is contained in:
Grishka 2022-02-28 10:18:01 +03:00
parent a5cd675c17
commit bb9cf5f5df
4 changed files with 79 additions and 0 deletions

View File

@ -0,0 +1,25 @@
package org.joinmastodon.android.api.requests.oauth;
import org.joinmastodon.android.api.MastodonAPIRequest;
public class RevokeOauthToken extends MastodonAPIRequest<Object>{
public RevokeOauthToken(String clientID, String clientSecret, String token){
super(HttpMethod.POST, "/oauth/revoke", Object.class);
setRequestBody(new Body(clientID, clientSecret, token));
}
@Override
protected String getPathPrefix(){
return "";
}
private static class Body{
public String clientId, clientSecret, token;
public Body(String clientId, String clientSecret, String token){
this.clientId=clientId;
this.clientSecret=clientSecret;
this.token=token;
}
}
}

View File

@ -131,6 +131,13 @@ public class AccountSessionManager{
return lastActiveAccountID;
}
public void setLastActiveAccountID(String id){
if(!sessions.containsKey(id))
throw new IllegalStateException("Account session "+id+" not found");
lastActiveAccountID=id;
prefs.edit().putString("lastActiveAccount", id).apply();
}
public void removeAccount(String id){
AccountSession session=getAccount(id);
sessions.remove(id);

View File

@ -1,6 +1,8 @@
package org.joinmastodon.android.fragments;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.os.Bundle;
@ -17,20 +19,27 @@ import android.widget.Toolbar;
import com.squareup.otto.Subscribe;
import org.joinmastodon.android.E;
import org.joinmastodon.android.MainActivity;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.requests.oauth.RevokeOauthToken;
import org.joinmastodon.android.api.requests.timelines.GetHomeTimeline;
import org.joinmastodon.android.api.session.AccountSession;
import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.events.StatusCountersUpdatedEvent;
import org.joinmastodon.android.events.StatusCreatedEvent;
import org.joinmastodon.android.events.StatusDeletedEvent;
import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.ui.M3AlertDialogBuilder;
import org.joinmastodon.android.ui.utils.UiUtils;
import org.parceler.Parcels;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import me.grishka.appkit.Nav;
import me.grishka.appkit.api.Callback;
import me.grishka.appkit.api.ErrorResponse;
import me.grishka.appkit.api.SimpleCallback;
public class HomeTimelineFragment extends StatusListFragment{
@ -74,6 +83,42 @@ public class HomeTimelineFragment extends StatusListFragment{
@Override
public boolean onOptionsItemSelected(MenuItem item){
ArrayList<String> options=new ArrayList<>();
for(AccountSession session:AccountSessionManager.getInstance().getLoggedInAccounts()){
options.add(session.self.displayName+"\n("+session.self.username+"@"+session.domain+")");
}
new M3AlertDialogBuilder(getActivity())
.setItems(options.toArray(new String[0]), (dialog, which)->{
AccountSession session=AccountSessionManager.getInstance().getLoggedInAccounts().get(which);
AccountSessionManager.getInstance().setLastActiveAccountID(session.getID());
getActivity().finish();
getActivity().startActivity(new Intent(getActivity(), MainActivity.class));
})
.setPositiveButton(R.string.log_out, (dialog, which)->{
AccountSession session=AccountSessionManager.getInstance().getAccount(accountID);
new RevokeOauthToken(session.app.clientId, session.app.clientSecret, session.token.accessToken)
.setCallback(new Callback<>(){
@Override
public void onSuccess(Object result){
AccountSessionManager.getInstance().removeAccount(session.getID());
getActivity().finish();
getActivity().startActivity(new Intent(getActivity(), MainActivity.class));
}
@Override
public void onError(ErrorResponse error){
AccountSessionManager.getInstance().removeAccount(session.getID());
getActivity().finish();
getActivity().startActivity(new Intent(getActivity(), MainActivity.class));
}
})
.wrapProgress(getActivity(), R.string.loading, false)
.execNoAuth(session.domain);
})
.setNegativeButton(R.string.add_account, (dialog, which)->{
Nav.go(getActivity(), SplashFragment.class, null);
})
.show();
return true;
}

View File

@ -131,4 +131,6 @@
<string name="notification_channel_audio_player">Audio playback</string>
<string name="play">Play</string>
<string name="pause">Pause</string>
<string name="log_out">Log out</string>
<string name="add_account">Add account</string>
</resources>