Files
park0er-multi-casual-android/app/src/main/java/ai/multica/app/AuthStore.java
T

109 lines
3.9 KiB
Java

package ai.multica.app;
import android.content.Context;
import android.content.SharedPreferences;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
final class AuthStore {
private static final String PREFS = "multica_auth";
private static final String TOKEN = "token";
private static final String WORKSPACE_ID = "workspace_id";
private static final String LANGUAGE = "language";
private static final String INBOX_CACHE_PREFIX = "inbox_cache_";
private static final String CLOUDFRONT_COOKIE_HEADER = "cloudfront_cookie_header";
private final SharedPreferences prefs;
AuthStore(Context context) {
prefs = context.getSharedPreferences(PREFS, Context.MODE_PRIVATE);
}
String token() {
return prefs.getString(TOKEN, null);
}
void saveToken(String token) {
prefs.edit().putString(TOKEN, token).apply();
}
void clearToken() {
prefs.edit().remove(TOKEN).remove(WORKSPACE_ID).remove(CLOUDFRONT_COOKIE_HEADER).apply();
}
String workspaceId() {
return prefs.getString(WORKSPACE_ID, null);
}
void saveWorkspaceId(String workspaceId) {
prefs.edit().putString(WORKSPACE_ID, workspaceId).apply();
}
boolean isChinese() {
return "zh".equals(prefs.getString(LANGUAGE, "en"));
}
void setChinese(boolean enabled) {
prefs.edit().putString(LANGUAGE, enabled ? "zh" : "en").apply();
}
String inboxCache(String workspaceId) {
if (workspaceId == null || workspaceId.trim().isEmpty()) return null;
return prefs.getString(INBOX_CACHE_PREFIX + workspaceId, null);
}
void saveInboxCache(String workspaceId, String json) {
if (workspaceId == null || workspaceId.trim().isEmpty() || json == null || json.trim().isEmpty()) return;
prefs.edit().putString(INBOX_CACHE_PREFIX + workspaceId, json).apply();
}
String cloudFrontCookieHeader() {
return prefs.getString(CLOUDFRONT_COOKIE_HEADER, "");
}
void saveCloudFrontCookies(List<String> setCookieHeaders) {
if (setCookieHeaders == null || setCookieHeaders.isEmpty()) return;
Map<String, String> cookies = parseCookieHeader(cloudFrontCookieHeader());
boolean changed = false;
for (String header : setCookieHeaders) {
if (header == null) continue;
int semicolon = header.indexOf(';');
String pair = (semicolon >= 0 ? header.substring(0, semicolon) : header).trim();
int equals = pair.indexOf('=');
if (equals <= 0) continue;
String name = pair.substring(0, equals).trim();
String value = pair.substring(equals + 1).trim();
if (!name.startsWith("CloudFront-") || value.isEmpty()) continue;
cookies.put(name, value);
changed = true;
}
if (!changed) return;
prefs.edit().putString(CLOUDFRONT_COOKIE_HEADER, joinCookieHeader(cookies)).apply();
}
private static Map<String, String> parseCookieHeader(String header) {
Map<String, String> cookies = new LinkedHashMap<>();
if (header == null || header.trim().isEmpty()) return cookies;
String[] parts = header.split(";");
for (String part : parts) {
String pair = part == null ? "" : part.trim();
int equals = pair.indexOf('=');
if (equals <= 0) continue;
cookies.put(pair.substring(0, equals).trim(), pair.substring(equals + 1).trim());
}
return cookies;
}
private static String joinCookieHeader(Map<String, String> cookies) {
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, String> entry : cookies.entrySet()) {
if (entry.getKey() == null || entry.getValue() == null || entry.getValue().isEmpty()) continue;
if (sb.length() > 0) sb.append("; ");
sb.append(entry.getKey()).append('=').append(entry.getValue());
}
return sb.toString();
}
}