ParseApplication/ExternalLibs/Parse-SDK-Android/Parse/src/main/java/com/parse/ParseSession.java

126 lines
4.2 KiB
Java

/*
* Copyright (c) 2015-present, Parse, LLC.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.parse;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import bolts.Continuation;
import bolts.Task;
/**
* The {@code ParseSession} is a local representation of session data that can be saved
* and retrieved from the Parse cloud.
*/
@ParseClassName("_Session")
public class ParseSession extends ParseObject {
private static final String KEY_SESSION_TOKEN = "sessionToken";
private static final String KEY_CREATED_WITH = "createdWith";
private static final String KEY_RESTRICTED = "restricted";
private static final String KEY_USER = "user";
private static final String KEY_EXPIRES_AT = "expiresAt";
private static final String KEY_INSTALLATION_ID = "installationId";
private static final List<String> READ_ONLY_KEYS = Collections.unmodifiableList(
Arrays.asList(KEY_SESSION_TOKEN, KEY_CREATED_WITH, KEY_RESTRICTED, KEY_USER, KEY_EXPIRES_AT,
KEY_INSTALLATION_ID));
private static ParseSessionController getSessionController() {
return ParseCorePlugins.getInstance().getSessionController();
}
/**
* Get the current {@code ParseSession} object related to the current user.
*
* @return A task that resolves a {@code ParseSession} object or {@code null} if not valid or
* logged in.
*/
public static Task<ParseSession> getCurrentSessionInBackground() {
return ParseUser.getCurrentSessionTokenAsync().onSuccessTask(new Continuation<String, Task<ParseSession>>() {
@Override
public Task<ParseSession> then(Task<String> task) throws Exception {
String sessionToken = task.getResult();
if (sessionToken == null) {
return Task.forResult(null);
}
return getSessionController().getSessionAsync(sessionToken).onSuccess(new Continuation<ParseObject.State, ParseSession>() {
@Override
public ParseSession then(Task<ParseObject.State> task) throws Exception {
ParseObject.State result = task.getResult();
return ParseObject.from(result);
}
});
}
});
}
/**
* Get the current {@code ParseSession} object related to the current user.
*
* @param callback A callback that returns a {@code ParseSession} object or {@code null} if not
* valid or logged in.
*/
public static void getCurrentSessionInBackground(GetCallback<ParseSession> callback) {
ParseTaskUtils.callbackOnMainThreadAsync(getCurrentSessionInBackground(), callback);
}
/* package */ static Task<Void> revokeAsync(String sessionToken) {
if (sessionToken == null || !isRevocableSessionToken(sessionToken)) {
return Task.forResult(null);
}
return getSessionController().revokeAsync(sessionToken);
}
/* package */ static Task<String> upgradeToRevocableSessionAsync(String sessionToken) {
if (sessionToken == null || isRevocableSessionToken(sessionToken)) {
return Task.forResult(sessionToken);
}
return getSessionController().upgradeToRevocable(sessionToken).onSuccess(new Continuation<ParseObject.State, String>() {
@Override
public String then(Task<ParseObject.State> task) throws Exception {
ParseObject.State result = task.getResult();
return ParseObject.<ParseSession>from(result).getSessionToken();
}
});
}
/* package */ static boolean isRevocableSessionToken(String sessionToken) {
return sessionToken.contains("r:");
}
/**
* Constructs a query for {@code ParseSession}.
*
* @see com.parse.ParseQuery#getQuery(Class)
*/
public static ParseQuery<ParseSession> getQuery() {
return ParseQuery.getQuery(ParseSession.class);
}
@Override
/* package */ boolean needsDefaultACL() {
return false;
}
@Override
/* package */ boolean isKeyMutable(String key) {
return !READ_ONLY_KEYS.contains(key);
}
/**
* @return the session token for a user, if they are logged in.
*/
public String getSessionToken() {
return getString(KEY_SESSION_TOKEN);
}
}