Account switcher
This commit is contained in:
parent
a5cd675c17
commit
bb9cf5f5df
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -131,6 +131,13 @@ public class AccountSessionManager{
|
||||||
return lastActiveAccountID;
|
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){
|
public void removeAccount(String id){
|
||||||
AccountSession session=getAccount(id);
|
AccountSession session=getAccount(id);
|
||||||
sessions.remove(id);
|
sessions.remove(id);
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package org.joinmastodon.android.fragments;
|
package org.joinmastodon.android.fragments;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.content.Intent;
|
||||||
import android.content.res.ColorStateList;
|
import android.content.res.ColorStateList;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
@ -17,20 +19,27 @@ import android.widget.Toolbar;
|
||||||
import com.squareup.otto.Subscribe;
|
import com.squareup.otto.Subscribe;
|
||||||
|
|
||||||
import org.joinmastodon.android.E;
|
import org.joinmastodon.android.E;
|
||||||
|
import org.joinmastodon.android.MainActivity;
|
||||||
import org.joinmastodon.android.R;
|
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.requests.timelines.GetHomeTimeline;
|
||||||
|
import org.joinmastodon.android.api.session.AccountSession;
|
||||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||||
import org.joinmastodon.android.events.StatusCountersUpdatedEvent;
|
import org.joinmastodon.android.events.StatusCountersUpdatedEvent;
|
||||||
import org.joinmastodon.android.events.StatusCreatedEvent;
|
import org.joinmastodon.android.events.StatusCreatedEvent;
|
||||||
import org.joinmastodon.android.events.StatusDeletedEvent;
|
import org.joinmastodon.android.events.StatusDeletedEvent;
|
||||||
import org.joinmastodon.android.model.Status;
|
import org.joinmastodon.android.model.Status;
|
||||||
|
import org.joinmastodon.android.ui.M3AlertDialogBuilder;
|
||||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||||
import org.parceler.Parcels;
|
import org.parceler.Parcels;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import me.grishka.appkit.Nav;
|
import me.grishka.appkit.Nav;
|
||||||
|
import me.grishka.appkit.api.Callback;
|
||||||
|
import me.grishka.appkit.api.ErrorResponse;
|
||||||
import me.grishka.appkit.api.SimpleCallback;
|
import me.grishka.appkit.api.SimpleCallback;
|
||||||
|
|
||||||
public class HomeTimelineFragment extends StatusListFragment{
|
public class HomeTimelineFragment extends StatusListFragment{
|
||||||
|
@ -74,6 +83,42 @@ public class HomeTimelineFragment extends StatusListFragment{
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onOptionsItemSelected(MenuItem item){
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -131,4 +131,6 @@
|
||||||
<string name="notification_channel_audio_player">Audio playback</string>
|
<string name="notification_channel_audio_player">Audio playback</string>
|
||||||
<string name="play">Play</string>
|
<string name="play">Play</string>
|
||||||
<string name="pause">Pause</string>
|
<string name="pause">Pause</string>
|
||||||
|
<string name="log_out">Log out</string>
|
||||||
|
<string name="add_account">Add account</string>
|
||||||
</resources>
|
</resources>
|
Loading…
Reference in New Issue