diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/requests/oauth/RevokeOauthToken.java b/mastodon/src/main/java/org/joinmastodon/android/api/requests/oauth/RevokeOauthToken.java new file mode 100644 index 000000000..efed6b18a --- /dev/null +++ b/mastodon/src/main/java/org/joinmastodon/android/api/requests/oauth/RevokeOauthToken.java @@ -0,0 +1,25 @@ +package org.joinmastodon.android.api.requests.oauth; + +import org.joinmastodon.android.api.MastodonAPIRequest; + +public class RevokeOauthToken extends MastodonAPIRequest{ + 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; + } + } +} diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSessionManager.java b/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSessionManager.java index 172788bf9..273c0bf18 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSessionManager.java +++ b/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSessionManager.java @@ -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); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTimelineFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTimelineFragment.java index ea98ae9e0..5bce9bf57 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTimelineFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTimelineFragment.java @@ -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 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; } diff --git a/mastodon/src/main/res/values/strings.xml b/mastodon/src/main/res/values/strings.xml index 05842ff76..b35cbbd57 100644 --- a/mastodon/src/main/res/values/strings.xml +++ b/mastodon/src/main/res/values/strings.xml @@ -131,4 +131,6 @@ Audio playback Play Pause + Log out + Add account \ No newline at end of file