package org.gingercal.net; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Locale; /** * In-memory diagnostics log (last few hundred lines): every request with its status and timing, * sign-in steps, stream attempts. Viewable in the app and savable to the SD card, so a problem * on a real server can be reported precisely. Tokens are never logged. */ public final class DiagLog { private static final int MAX = 400; private static final List lines = new ArrayList(); private static final SimpleDateFormat fmt = new SimpleDateFormat("HH:mm:ss", Locale.US); private DiagLog() {} public static void log(String msg) { String line; synchronized (fmt) { line = fmt.format(new Date()) + " " + msg; } synchronized (lines) { lines.add(line); if (lines.size() > MAX) lines.remove(0); } } public static String dump() { StringBuilder sb = new StringBuilder(); synchronized (lines) { for (int i = 0; i < lines.size(); i++) sb.append(lines.get(i)).append('\n'); } return sb.toString(); } public static void clear() { synchronized (lines) { lines.clear(); } } /** URL without the token value, safe to show and share. */ public static String redact(String url) { if (url == null) return ""; return url.replaceAll("((?:X-Plex-Token|token|T|Passwd)=)[^&]*", "$1***"); } }