Initial release: Claude Pro usage widget for Android

This commit is contained in:
2026-05-22 15:11:56 +00:00
commit 33ac02ead4
639 changed files with 52708 additions and 0 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
View File
Binary file not shown.
@@ -0,0 +1,2 @@
#Fri May 22 01:45:03 UTC 2026
gradle.version=8.6
Binary file not shown.
Binary file not shown.
View File
+30
View File
@@ -0,0 +1,30 @@
# Claude Usage Widget
Android home screen widget that shows your Claude Pro usage at a glance.
## Features
- **SESSION** bar — current 5-hour window utilization with reset time
- **WEEKLY** bar — 7-day rolling usage with reset time
- Tap the widget to open the app; tap ⟳ to force-refresh
- Responsive: works as 4×1 (compact) or 4×2 (full)
- Auto-refreshes every 5 minutes in the background
## Install
1. Download `claude-usage-widget.apk` from the [latest release](../../releases/latest)
2. On your Android phone: **Settings → Apps → Install unknown apps** → allow your browser/file manager
3. Open the downloaded APK and tap Install
4. Open the **Claude Usage** app and sign in with your Claude.ai session cookies
5. Long-press your home screen → Widgets → Claude Usage → drag to place
## Sign-in
The app uses your Claude.ai browser cookies (not a password). In the app, tap **Sign In**, then paste your cookies from a logged-in Claude.ai browser session.
To get cookies: open claude.ai in Chrome → DevTools (F12) → Application → Cookies → copy the `Cookie` header value.
## Requirements
- Android 8.0+ (API 26)
- Active Claude Pro subscription
+63
View File
@@ -0,0 +1,63 @@
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
}
android {
namespace = "me.khodak.claudeusage"
compileSdk = 34
defaultConfig {
applicationId = "me.khodak.claudeusage"
minSdk = 26
targetSdk = 34
versionCode = 1
versionName = "1.0"
}
buildTypes {
release {
isMinifyEnabled = true
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
buildFeatures {
viewBinding = true
}
}
dependencies {
implementation("androidx.core:core-ktx:1.12.0")
implementation("androidx.appcompat:appcompat:1.6.1")
implementation("com.google.android.material:material:1.11.0")
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
// HTTP
implementation("com.squareup.okhttp3:okhttp:4.12.0")
// JSON
implementation("com.google.code.gson:gson:2.10.1")
// Background work
implementation("androidx.work:work-runtime-ktx:2.9.0")
// Secure storage
implementation("androidx.security:security-crypto:1.1.0-alpha06")
// Coroutines
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")
// Lifecycle
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0")
}
@@ -0,0 +1,144 @@
// Generated by view binder compiler. Do not edit!
package me.khodak.claudeusage.databinding;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.viewbinding.ViewBinding;
import androidx.viewbinding.ViewBindings;
import java.lang.NullPointerException;
import java.lang.Override;
import java.lang.String;
import me.khodak.claudeusage.R;
public final class ActivityLoginBinding implements ViewBinding {
@NonNull
private final LinearLayout rootView;
@NonNull
public final Button btnDone;
@NonNull
public final Button btnSaveCookie;
@NonNull
public final EditText etCookie;
@NonNull
public final LinearLayout panelBrowser;
@NonNull
public final LinearLayout panelCookie;
@NonNull
public final Button tabBrowser;
@NonNull
public final Button tabCookie;
@NonNull
public final WebView webView;
private ActivityLoginBinding(@NonNull LinearLayout rootView, @NonNull Button btnDone,
@NonNull Button btnSaveCookie, @NonNull EditText etCookie, @NonNull LinearLayout panelBrowser,
@NonNull LinearLayout panelCookie, @NonNull Button tabBrowser, @NonNull Button tabCookie,
@NonNull WebView webView) {
this.rootView = rootView;
this.btnDone = btnDone;
this.btnSaveCookie = btnSaveCookie;
this.etCookie = etCookie;
this.panelBrowser = panelBrowser;
this.panelCookie = panelCookie;
this.tabBrowser = tabBrowser;
this.tabCookie = tabCookie;
this.webView = webView;
}
@Override
@NonNull
public LinearLayout getRoot() {
return rootView;
}
@NonNull
public static ActivityLoginBinding inflate(@NonNull LayoutInflater inflater) {
return inflate(inflater, null, false);
}
@NonNull
public static ActivityLoginBinding inflate(@NonNull LayoutInflater inflater,
@Nullable ViewGroup parent, boolean attachToParent) {
View root = inflater.inflate(R.layout.activity_login, parent, false);
if (attachToParent) {
parent.addView(root);
}
return bind(root);
}
@NonNull
public static ActivityLoginBinding bind(@NonNull View rootView) {
// The body of this method is generated in a way you would not otherwise write.
// This is done to optimize the compiled bytecode for size and performance.
int id;
missingId: {
id = R.id.btn_done;
Button btnDone = ViewBindings.findChildViewById(rootView, id);
if (btnDone == null) {
break missingId;
}
id = R.id.btn_save_cookie;
Button btnSaveCookie = ViewBindings.findChildViewById(rootView, id);
if (btnSaveCookie == null) {
break missingId;
}
id = R.id.et_cookie;
EditText etCookie = ViewBindings.findChildViewById(rootView, id);
if (etCookie == null) {
break missingId;
}
id = R.id.panel_browser;
LinearLayout panelBrowser = ViewBindings.findChildViewById(rootView, id);
if (panelBrowser == null) {
break missingId;
}
id = R.id.panel_cookie;
LinearLayout panelCookie = ViewBindings.findChildViewById(rootView, id);
if (panelCookie == null) {
break missingId;
}
id = R.id.tab_browser;
Button tabBrowser = ViewBindings.findChildViewById(rootView, id);
if (tabBrowser == null) {
break missingId;
}
id = R.id.tab_cookie;
Button tabCookie = ViewBindings.findChildViewById(rootView, id);
if (tabCookie == null) {
break missingId;
}
id = R.id.webView;
WebView webView = ViewBindings.findChildViewById(rootView, id);
if (webView == null) {
break missingId;
}
return new ActivityLoginBinding((LinearLayout) rootView, btnDone, btnSaveCookie, etCookie,
panelBrowser, panelCookie, tabBrowser, tabCookie, webView);
}
String missingId = rootView.getResources().getResourceName(id);
throw new NullPointerException("Missing required view with ID: ".concat(missingId));
}
}
@@ -0,0 +1,241 @@
// Generated by view binder compiler. Do not edit!
package me.khodak.claudeusage.databinding;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.ScrollView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.viewbinding.ViewBinding;
import androidx.viewbinding.ViewBindings;
import java.lang.NullPointerException;
import java.lang.Override;
import java.lang.String;
import me.khodak.claudeusage.R;
public final class ActivityMainBinding implements ViewBinding {
@NonNull
private final ScrollView rootView;
@NonNull
public final Button btnDebug;
@NonNull
public final Button btnLogin;
@NonNull
public final Button btnLogout;
@NonNull
public final Button btnRefresh;
@NonNull
public final LinearLayout layoutLoggedIn;
@NonNull
public final LinearLayout layoutLoggedOut;
@NonNull
public final ProgressBar progressBar;
@NonNull
public final ProgressBar progressBarWeekly;
@NonNull
public final ProgressBar progressIndicator;
@NonNull
public final TextView tvDebugInfo;
@NonNull
public final TextView tvError;
@NonNull
public final TextView tvReset;
@NonNull
public final TextView tvUpdated;
@NonNull
public final TextView tvUsage;
@NonNull
public final TextView tvWeeklyReset;
@NonNull
public final TextView tvWeeklyUsage;
@NonNull
public final TextView tvWidgetHint;
private ActivityMainBinding(@NonNull ScrollView rootView, @NonNull Button btnDebug,
@NonNull Button btnLogin, @NonNull Button btnLogout, @NonNull Button btnRefresh,
@NonNull LinearLayout layoutLoggedIn, @NonNull LinearLayout layoutLoggedOut,
@NonNull ProgressBar progressBar, @NonNull ProgressBar progressBarWeekly,
@NonNull ProgressBar progressIndicator, @NonNull TextView tvDebugInfo,
@NonNull TextView tvError, @NonNull TextView tvReset, @NonNull TextView tvUpdated,
@NonNull TextView tvUsage, @NonNull TextView tvWeeklyReset, @NonNull TextView tvWeeklyUsage,
@NonNull TextView tvWidgetHint) {
this.rootView = rootView;
this.btnDebug = btnDebug;
this.btnLogin = btnLogin;
this.btnLogout = btnLogout;
this.btnRefresh = btnRefresh;
this.layoutLoggedIn = layoutLoggedIn;
this.layoutLoggedOut = layoutLoggedOut;
this.progressBar = progressBar;
this.progressBarWeekly = progressBarWeekly;
this.progressIndicator = progressIndicator;
this.tvDebugInfo = tvDebugInfo;
this.tvError = tvError;
this.tvReset = tvReset;
this.tvUpdated = tvUpdated;
this.tvUsage = tvUsage;
this.tvWeeklyReset = tvWeeklyReset;
this.tvWeeklyUsage = tvWeeklyUsage;
this.tvWidgetHint = tvWidgetHint;
}
@Override
@NonNull
public ScrollView getRoot() {
return rootView;
}
@NonNull
public static ActivityMainBinding inflate(@NonNull LayoutInflater inflater) {
return inflate(inflater, null, false);
}
@NonNull
public static ActivityMainBinding inflate(@NonNull LayoutInflater inflater,
@Nullable ViewGroup parent, boolean attachToParent) {
View root = inflater.inflate(R.layout.activity_main, parent, false);
if (attachToParent) {
parent.addView(root);
}
return bind(root);
}
@NonNull
public static ActivityMainBinding bind(@NonNull View rootView) {
// The body of this method is generated in a way you would not otherwise write.
// This is done to optimize the compiled bytecode for size and performance.
int id;
missingId: {
id = R.id.btnDebug;
Button btnDebug = ViewBindings.findChildViewById(rootView, id);
if (btnDebug == null) {
break missingId;
}
id = R.id.btnLogin;
Button btnLogin = ViewBindings.findChildViewById(rootView, id);
if (btnLogin == null) {
break missingId;
}
id = R.id.btnLogout;
Button btnLogout = ViewBindings.findChildViewById(rootView, id);
if (btnLogout == null) {
break missingId;
}
id = R.id.btnRefresh;
Button btnRefresh = ViewBindings.findChildViewById(rootView, id);
if (btnRefresh == null) {
break missingId;
}
id = R.id.layoutLoggedIn;
LinearLayout layoutLoggedIn = ViewBindings.findChildViewById(rootView, id);
if (layoutLoggedIn == null) {
break missingId;
}
id = R.id.layoutLoggedOut;
LinearLayout layoutLoggedOut = ViewBindings.findChildViewById(rootView, id);
if (layoutLoggedOut == null) {
break missingId;
}
id = R.id.progressBar;
ProgressBar progressBar = ViewBindings.findChildViewById(rootView, id);
if (progressBar == null) {
break missingId;
}
id = R.id.progressBarWeekly;
ProgressBar progressBarWeekly = ViewBindings.findChildViewById(rootView, id);
if (progressBarWeekly == null) {
break missingId;
}
id = R.id.progressIndicator;
ProgressBar progressIndicator = ViewBindings.findChildViewById(rootView, id);
if (progressIndicator == null) {
break missingId;
}
id = R.id.tvDebugInfo;
TextView tvDebugInfo = ViewBindings.findChildViewById(rootView, id);
if (tvDebugInfo == null) {
break missingId;
}
id = R.id.tvError;
TextView tvError = ViewBindings.findChildViewById(rootView, id);
if (tvError == null) {
break missingId;
}
id = R.id.tvReset;
TextView tvReset = ViewBindings.findChildViewById(rootView, id);
if (tvReset == null) {
break missingId;
}
id = R.id.tvUpdated;
TextView tvUpdated = ViewBindings.findChildViewById(rootView, id);
if (tvUpdated == null) {
break missingId;
}
id = R.id.tvUsage;
TextView tvUsage = ViewBindings.findChildViewById(rootView, id);
if (tvUsage == null) {
break missingId;
}
id = R.id.tvWeeklyReset;
TextView tvWeeklyReset = ViewBindings.findChildViewById(rootView, id);
if (tvWeeklyReset == null) {
break missingId;
}
id = R.id.tvWeeklyUsage;
TextView tvWeeklyUsage = ViewBindings.findChildViewById(rootView, id);
if (tvWeeklyUsage == null) {
break missingId;
}
id = R.id.tvWidgetHint;
TextView tvWidgetHint = ViewBindings.findChildViewById(rootView, id);
if (tvWidgetHint == null) {
break missingId;
}
return new ActivityMainBinding((ScrollView) rootView, btnDebug, btnLogin, btnLogout,
btnRefresh, layoutLoggedIn, layoutLoggedOut, progressBar, progressBarWeekly,
progressIndicator, tvDebugInfo, tvError, tvReset, tvUpdated, tvUsage, tvWeeklyReset,
tvWeeklyUsage, tvWidgetHint);
}
String missingId = rootView.getResources().getResourceName(id);
throw new NullPointerException("Missing required view with ID: ".concat(missingId));
}
}
@@ -0,0 +1,162 @@
// Generated by view binder compiler. Do not edit!
package me.khodak.claudeusage.databinding;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.viewbinding.ViewBinding;
import androidx.viewbinding.ViewBindings;
import java.lang.NullPointerException;
import java.lang.Override;
import java.lang.String;
import me.khodak.claudeusage.R;
public final class WidgetLayoutBinding implements ViewBinding {
@NonNull
private final LinearLayout rootView;
@NonNull
public final ImageButton btnRefresh;
@NonNull
public final ProgressBar progressBar;
@NonNull
public final ProgressBar progressBarWeekly;
@NonNull
public final TextView tvSessionLabel;
@NonNull
public final TextView tvSessionValue;
@NonNull
public final TextView tvStatus;
@NonNull
public final TextView tvUpdated;
@NonNull
public final TextView tvWeeklyLabel;
@NonNull
public final TextView tvWeeklyValue;
@NonNull
public final LinearLayout widgetRoot;
private WidgetLayoutBinding(@NonNull LinearLayout rootView, @NonNull ImageButton btnRefresh,
@NonNull ProgressBar progressBar, @NonNull ProgressBar progressBarWeekly,
@NonNull TextView tvSessionLabel, @NonNull TextView tvSessionValue,
@NonNull TextView tvStatus, @NonNull TextView tvUpdated, @NonNull TextView tvWeeklyLabel,
@NonNull TextView tvWeeklyValue, @NonNull LinearLayout widgetRoot) {
this.rootView = rootView;
this.btnRefresh = btnRefresh;
this.progressBar = progressBar;
this.progressBarWeekly = progressBarWeekly;
this.tvSessionLabel = tvSessionLabel;
this.tvSessionValue = tvSessionValue;
this.tvStatus = tvStatus;
this.tvUpdated = tvUpdated;
this.tvWeeklyLabel = tvWeeklyLabel;
this.tvWeeklyValue = tvWeeklyValue;
this.widgetRoot = widgetRoot;
}
@Override
@NonNull
public LinearLayout getRoot() {
return rootView;
}
@NonNull
public static WidgetLayoutBinding inflate(@NonNull LayoutInflater inflater) {
return inflate(inflater, null, false);
}
@NonNull
public static WidgetLayoutBinding inflate(@NonNull LayoutInflater inflater,
@Nullable ViewGroup parent, boolean attachToParent) {
View root = inflater.inflate(R.layout.widget_layout, parent, false);
if (attachToParent) {
parent.addView(root);
}
return bind(root);
}
@NonNull
public static WidgetLayoutBinding bind(@NonNull View rootView) {
// The body of this method is generated in a way you would not otherwise write.
// This is done to optimize the compiled bytecode for size and performance.
int id;
missingId: {
id = R.id.btn_refresh;
ImageButton btnRefresh = ViewBindings.findChildViewById(rootView, id);
if (btnRefresh == null) {
break missingId;
}
id = R.id.progress_bar;
ProgressBar progressBar = ViewBindings.findChildViewById(rootView, id);
if (progressBar == null) {
break missingId;
}
id = R.id.progress_bar_weekly;
ProgressBar progressBarWeekly = ViewBindings.findChildViewById(rootView, id);
if (progressBarWeekly == null) {
break missingId;
}
id = R.id.tv_session_label;
TextView tvSessionLabel = ViewBindings.findChildViewById(rootView, id);
if (tvSessionLabel == null) {
break missingId;
}
id = R.id.tv_session_value;
TextView tvSessionValue = ViewBindings.findChildViewById(rootView, id);
if (tvSessionValue == null) {
break missingId;
}
id = R.id.tv_status;
TextView tvStatus = ViewBindings.findChildViewById(rootView, id);
if (tvStatus == null) {
break missingId;
}
id = R.id.tv_updated;
TextView tvUpdated = ViewBindings.findChildViewById(rootView, id);
if (tvUpdated == null) {
break missingId;
}
id = R.id.tv_weekly_label;
TextView tvWeeklyLabel = ViewBindings.findChildViewById(rootView, id);
if (tvWeeklyLabel == null) {
break missingId;
}
id = R.id.tv_weekly_value;
TextView tvWeeklyValue = ViewBindings.findChildViewById(rootView, id);
if (tvWeeklyValue == null) {
break missingId;
}
LinearLayout widgetRoot = (LinearLayout) rootView;
return new WidgetLayoutBinding((LinearLayout) rootView, btnRefresh, progressBar,
progressBarWeekly, tvSessionLabel, tvSessionValue, tvStatus, tvUpdated, tvWeeklyLabel,
tvWeeklyValue, widgetRoot);
}
String missingId = rootView.getResources().getResourceName(id);
throw new NullPointerException("Missing required view with ID: ".concat(missingId));
}
}
@@ -0,0 +1,152 @@
// Generated by view binder compiler. Do not edit!
package me.khodak.claudeusage.databinding;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.viewbinding.ViewBinding;
import androidx.viewbinding.ViewBindings;
import java.lang.NullPointerException;
import java.lang.Override;
import java.lang.String;
import me.khodak.claudeusage.R;
public final class WidgetLayoutSmallBinding implements ViewBinding {
@NonNull
private final LinearLayout rootView;
@NonNull
public final ImageButton btnRefresh;
@NonNull
public final ProgressBar progressBar;
@NonNull
public final ProgressBar progressBarWeekly;
@NonNull
public final TextView tvSessionLabel;
@NonNull
public final TextView tvSessionValue;
@NonNull
public final TextView tvStatus;
@NonNull
public final TextView tvWeeklyLabel;
@NonNull
public final TextView tvWeeklyValue;
@NonNull
public final LinearLayout widgetRoot;
private WidgetLayoutSmallBinding(@NonNull LinearLayout rootView, @NonNull ImageButton btnRefresh,
@NonNull ProgressBar progressBar, @NonNull ProgressBar progressBarWeekly,
@NonNull TextView tvSessionLabel, @NonNull TextView tvSessionValue,
@NonNull TextView tvStatus, @NonNull TextView tvWeeklyLabel, @NonNull TextView tvWeeklyValue,
@NonNull LinearLayout widgetRoot) {
this.rootView = rootView;
this.btnRefresh = btnRefresh;
this.progressBar = progressBar;
this.progressBarWeekly = progressBarWeekly;
this.tvSessionLabel = tvSessionLabel;
this.tvSessionValue = tvSessionValue;
this.tvStatus = tvStatus;
this.tvWeeklyLabel = tvWeeklyLabel;
this.tvWeeklyValue = tvWeeklyValue;
this.widgetRoot = widgetRoot;
}
@Override
@NonNull
public LinearLayout getRoot() {
return rootView;
}
@NonNull
public static WidgetLayoutSmallBinding inflate(@NonNull LayoutInflater inflater) {
return inflate(inflater, null, false);
}
@NonNull
public static WidgetLayoutSmallBinding inflate(@NonNull LayoutInflater inflater,
@Nullable ViewGroup parent, boolean attachToParent) {
View root = inflater.inflate(R.layout.widget_layout_small, parent, false);
if (attachToParent) {
parent.addView(root);
}
return bind(root);
}
@NonNull
public static WidgetLayoutSmallBinding bind(@NonNull View rootView) {
// The body of this method is generated in a way you would not otherwise write.
// This is done to optimize the compiled bytecode for size and performance.
int id;
missingId: {
id = R.id.btn_refresh;
ImageButton btnRefresh = ViewBindings.findChildViewById(rootView, id);
if (btnRefresh == null) {
break missingId;
}
id = R.id.progress_bar;
ProgressBar progressBar = ViewBindings.findChildViewById(rootView, id);
if (progressBar == null) {
break missingId;
}
id = R.id.progress_bar_weekly;
ProgressBar progressBarWeekly = ViewBindings.findChildViewById(rootView, id);
if (progressBarWeekly == null) {
break missingId;
}
id = R.id.tv_session_label;
TextView tvSessionLabel = ViewBindings.findChildViewById(rootView, id);
if (tvSessionLabel == null) {
break missingId;
}
id = R.id.tv_session_value;
TextView tvSessionValue = ViewBindings.findChildViewById(rootView, id);
if (tvSessionValue == null) {
break missingId;
}
id = R.id.tv_status;
TextView tvStatus = ViewBindings.findChildViewById(rootView, id);
if (tvStatus == null) {
break missingId;
}
id = R.id.tv_weekly_label;
TextView tvWeeklyLabel = ViewBindings.findChildViewById(rootView, id);
if (tvWeeklyLabel == null) {
break missingId;
}
id = R.id.tv_weekly_value;
TextView tvWeeklyValue = ViewBindings.findChildViewById(rootView, id);
if (tvWeeklyValue == null) {
break missingId;
}
LinearLayout widgetRoot = (LinearLayout) rootView;
return new WidgetLayoutSmallBinding((LinearLayout) rootView, btnRefresh, progressBar,
progressBarWeekly, tvSessionLabel, tvSessionValue, tvStatus, tvWeeklyLabel, tvWeeklyValue,
widgetRoot);
}
String missingId = rootView.getResources().getResourceName(id);
throw new NullPointerException("Missing required view with ID: ".concat(missingId));
}
}
@@ -0,0 +1,2 @@
#- File Locator -
listingFile=../../../outputs/apk/debug/output-metadata.json
@@ -0,0 +1,2 @@
appMetadataVersion=1.1
androidGradlePluginVersion=8.2.2
@@ -0,0 +1,10 @@
{
"version": 3,
"artifactType": {
"type": "COMPATIBLE_SCREEN_MANIFEST",
"kind": "Directory"
},
"applicationId": "me.khodak.claudeusage",
"variantName": "debug",
"elements": []
}
@@ -0,0 +1 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><Layout layout="activity_login" modulePackage="me.khodak.claudeusage" filePath="app/src/main/res/layout/activity_login.xml" directory="layout" isMerge="false" isBindingData="false" rootNodeType="android.widget.LinearLayout"><Targets><Target tag="layout/activity_login_0" view="LinearLayout"><Expressions/><location startLine="1" startOffset="0" endLine="121" endOffset="14"/></Target><Target id="@+id/tab_browser" view="Button"><Expressions/><location startLine="14" startOffset="8" endLine="22" endOffset="41"/></Target><Target id="@+id/tab_cookie" view="Button"><Expressions/><location startLine="24" startOffset="8" endLine="32" endOffset="41"/></Target><Target id="@+id/panel_browser" view="LinearLayout"><Expressions/><location startLine="37" startOffset="4" endLine="59" endOffset="18"/></Target><Target id="@+id/webView" view="WebView"><Expressions/><location startLine="43" startOffset="8" endLine="47" endOffset="39"/></Target><Target id="@+id/btn_done" view="Button"><Expressions/><location startLine="49" startOffset="8" endLine="57" endOffset="42"/></Target><Target id="@+id/panel_cookie" view="LinearLayout"><Expressions/><location startLine="62" startOffset="4" endLine="119" endOffset="18"/></Target><Target id="@+id/et_cookie" view="EditText"><Expressions/><location startLine="96" startOffset="8" endLine="108" endOffset="37"/></Target><Target id="@+id/btn_save_cookie" view="Button"><Expressions/><location startLine="110" startOffset="8" endLine="117" endOffset="41"/></Target></Targets></Layout>
@@ -0,0 +1 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><Layout layout="activity_main" modulePackage="me.khodak.claudeusage" filePath="app/src/main/res/layout/activity_main.xml" directory="layout" isMerge="false" isBindingData="false" rootNodeType="android.widget.ScrollView"><Targets><Target tag="layout/activity_main_0" view="ScrollView"><Expressions/><location startLine="1" startOffset="0" endLine="243" endOffset="12"/></Target><Target id="@+id/progressIndicator" view="ProgressBar"><Expressions/><location startLine="41" startOffset="8" endLine="46" endOffset="39"/></Target><Target id="@+id/layoutLoggedOut" view="LinearLayout"><Expressions/><location startLine="49" startOffset="8" endLine="75" endOffset="22"/></Target><Target id="@+id/btnLogin" view="Button"><Expressions/><location startLine="66" startOffset="12" endLine="73" endOffset="45"/></Target><Target id="@+id/layoutLoggedIn" view="LinearLayout"><Expressions/><location startLine="78" startOffset="8" endLine="240" endOffset="22"/></Target><Target id="@+id/tvUsage" view="TextView"><Expressions/><location startLine="102" startOffset="16" endLine="110" endOffset="46"/></Target><Target id="@+id/progressBar" view="ProgressBar"><Expressions/><location startLine="112" startOffset="16" endLine="121" endOffset="62"/></Target><Target id="@+id/tvReset" view="TextView"><Expressions/><location startLine="123" startOffset="16" endLine="129" endOffset="45"/></Target><Target id="@+id/tvWeeklyUsage" view="TextView"><Expressions/><location startLine="140" startOffset="16" endLine="148" endOffset="46"/></Target><Target id="@+id/progressBarWeekly" view="ProgressBar"><Expressions/><location startLine="150" startOffset="16" endLine="159" endOffset="62"/></Target><Target id="@+id/tvWeeklyReset" view="TextView"><Expressions/><location startLine="161" startOffset="16" endLine="167" endOffset="45"/></Target><Target id="@+id/tvUpdated" view="TextView"><Expressions/><location startLine="169" startOffset="16" endLine="175" endOffset="45"/></Target><Target id="@+id/tvError" view="TextView"><Expressions/><location startLine="177" startOffset="16" endLine="184" endOffset="47"/></Target><Target id="@+id/btnRefresh" view="Button"><Expressions/><location startLine="188" startOffset="12" endLine="195" endOffset="45"/></Target><Target id="@+id/tvWidgetHint" view="TextView"><Expressions/><location startLine="197" startOffset="12" endLine="207" endOffset="39"/></Target><Target id="@+id/btnLogout" view="Button"><Expressions/><location startLine="209" startOffset="12" endLine="216" endOffset="45"/></Target><Target id="@+id/btnDebug" view="Button"><Expressions/><location startLine="218" startOffset="12" endLine="226" endOffset="41"/></Target><Target id="@+id/tvDebugInfo" view="TextView"><Expressions/><location startLine="228" startOffset="12" endLine="238" endOffset="43"/></Target></Targets></Layout>
@@ -0,0 +1 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><Layout layout="widget_layout" modulePackage="me.khodak.claudeusage" filePath="app/src/main/res/layout/widget_layout.xml" directory="layout" isMerge="false" isBindingData="false" rootNodeType="android.widget.LinearLayout" rootNodeViewId="@+id/widget_root"><Targets><Target id="@+id/widget_root" tag="layout/widget_layout_0" view="LinearLayout"><Expressions/><location startLine="1" startOffset="0" endLine="168" endOffset="14"/></Target><Target id="@+id/btn_refresh" view="ImageButton"><Expressions/><location startLine="25" startOffset="8" endLine="32" endOffset="50"/></Target><Target id="@+id/tv_session_value" view="TextView"><Expressions/><location startLine="60" startOffset="8" endLine="67" endOffset="38"/></Target><Target id="@+id/progress_bar" view="ProgressBar"><Expressions/><location startLine="71" startOffset="4" endLine="80" endOffset="50"/></Target><Target id="@+id/tv_session_label" view="TextView"><Expressions/><location startLine="82" startOffset="4" endLine="89" endOffset="32"/></Target><Target id="@+id/tv_weekly_value" view="TextView"><Expressions/><location startLine="108" startOffset="8" endLine="115" endOffset="38"/></Target><Target id="@+id/progress_bar_weekly" view="ProgressBar"><Expressions/><location startLine="119" startOffset="4" endLine="128" endOffset="50"/></Target><Target id="@+id/tv_weekly_label" view="TextView"><Expressions/><location startLine="130" startOffset="4" endLine="137" endOffset="32"/></Target><Target id="@+id/tv_status" view="TextView"><Expressions/><location startLine="147" startOffset="8" endLine="156" endOffset="37"/></Target><Target id="@+id/tv_updated" view="TextView"><Expressions/><location startLine="158" startOffset="8" endLine="164" endOffset="36"/></Target></Targets></Layout>
@@ -0,0 +1 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><Layout layout="widget_layout_small" modulePackage="me.khodak.claudeusage" filePath="app/src/main/res/layout/widget_layout_small.xml" directory="layout" isMerge="false" isBindingData="false" rootNodeType="android.widget.LinearLayout" rootNodeViewId="@+id/widget_root"><Targets><Target id="@+id/widget_root" tag="layout/widget_layout_small_0" view="LinearLayout"><Expressions/><location startLine="1" startOffset="0" endLine="141" endOffset="14"/></Target><Target id="@+id/btn_refresh" view="ImageButton"><Expressions/><location startLine="25" startOffset="8" endLine="31" endOffset="50"/></Target><Target id="@+id/tv_session_value" view="TextView"><Expressions/><location startLine="52" startOffset="8" endLine="59" endOffset="38"/></Target><Target id="@+id/tv_session_label" view="TextView"><Expressions/><location startLine="61" startOffset="8" endLine="68" endOffset="36"/></Target><Target id="@+id/progress_bar" view="ProgressBar"><Expressions/><location startLine="72" startOffset="4" endLine="81" endOffset="50"/></Target><Target id="@+id/tv_weekly_value" view="TextView"><Expressions/><location startLine="100" startOffset="8" endLine="107" endOffset="38"/></Target><Target id="@+id/tv_weekly_label" view="TextView"><Expressions/><location startLine="109" startOffset="8" endLine="116" endOffset="36"/></Target><Target id="@+id/progress_bar_weekly" view="ProgressBar"><Expressions/><location startLine="120" startOffset="4" endLine="129" endOffset="50"/></Target><Target id="@+id/tv_status" view="TextView"><Expressions/><location startLine="131" startOffset="4" endLine="139" endOffset="30"/></Target></Targets></Layout>
@@ -0,0 +1 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><Layout layout="activity_login" modulePackage="me.khodak.claudeusage" filePath="app/src/main/res/layout/activity_login.xml" directory="layout" isMerge="false" isBindingData="false" rootNodeType="android.widget.LinearLayout"><Targets><Target tag="layout/activity_login_0" view="LinearLayout"><Expressions/><location startLine="1" startOffset="0" endLine="121" endOffset="14"/></Target><Target id="@+id/tab_browser" view="Button"><Expressions/><location startLine="14" startOffset="8" endLine="22" endOffset="41"/></Target><Target id="@+id/tab_cookie" view="Button"><Expressions/><location startLine="24" startOffset="8" endLine="32" endOffset="41"/></Target><Target id="@+id/panel_browser" view="LinearLayout"><Expressions/><location startLine="37" startOffset="4" endLine="59" endOffset="18"/></Target><Target id="@+id/webView" view="WebView"><Expressions/><location startLine="43" startOffset="8" endLine="47" endOffset="39"/></Target><Target id="@+id/btn_done" view="Button"><Expressions/><location startLine="49" startOffset="8" endLine="57" endOffset="42"/></Target><Target id="@+id/panel_cookie" view="LinearLayout"><Expressions/><location startLine="62" startOffset="4" endLine="119" endOffset="18"/></Target><Target id="@+id/et_cookie" view="EditText"><Expressions/><location startLine="96" startOffset="8" endLine="108" endOffset="37"/></Target><Target id="@+id/btn_save_cookie" view="Button"><Expressions/><location startLine="110" startOffset="8" endLine="117" endOffset="41"/></Target></Targets></Layout>
@@ -0,0 +1 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><Layout layout="activity_main" modulePackage="me.khodak.claudeusage" filePath="app/src/main/res/layout/activity_main.xml" directory="layout" isMerge="false" isBindingData="false" rootNodeType="android.widget.ScrollView"><Targets><Target tag="layout/activity_main_0" view="ScrollView"><Expressions/><location startLine="1" startOffset="0" endLine="243" endOffset="12"/></Target><Target id="@+id/progressIndicator" view="ProgressBar"><Expressions/><location startLine="41" startOffset="8" endLine="46" endOffset="39"/></Target><Target id="@+id/layoutLoggedOut" view="LinearLayout"><Expressions/><location startLine="49" startOffset="8" endLine="75" endOffset="22"/></Target><Target id="@+id/btnLogin" view="Button"><Expressions/><location startLine="66" startOffset="12" endLine="73" endOffset="45"/></Target><Target id="@+id/layoutLoggedIn" view="LinearLayout"><Expressions/><location startLine="78" startOffset="8" endLine="240" endOffset="22"/></Target><Target id="@+id/tvUsage" view="TextView"><Expressions/><location startLine="102" startOffset="16" endLine="110" endOffset="46"/></Target><Target id="@+id/progressBar" view="ProgressBar"><Expressions/><location startLine="112" startOffset="16" endLine="121" endOffset="62"/></Target><Target id="@+id/tvReset" view="TextView"><Expressions/><location startLine="123" startOffset="16" endLine="129" endOffset="45"/></Target><Target id="@+id/tvWeeklyUsage" view="TextView"><Expressions/><location startLine="140" startOffset="16" endLine="148" endOffset="46"/></Target><Target id="@+id/progressBarWeekly" view="ProgressBar"><Expressions/><location startLine="150" startOffset="16" endLine="159" endOffset="62"/></Target><Target id="@+id/tvWeeklyReset" view="TextView"><Expressions/><location startLine="161" startOffset="16" endLine="167" endOffset="45"/></Target><Target id="@+id/tvUpdated" view="TextView"><Expressions/><location startLine="169" startOffset="16" endLine="175" endOffset="45"/></Target><Target id="@+id/tvError" view="TextView"><Expressions/><location startLine="177" startOffset="16" endLine="184" endOffset="47"/></Target><Target id="@+id/btnRefresh" view="Button"><Expressions/><location startLine="188" startOffset="12" endLine="195" endOffset="45"/></Target><Target id="@+id/tvWidgetHint" view="TextView"><Expressions/><location startLine="197" startOffset="12" endLine="207" endOffset="39"/></Target><Target id="@+id/btnLogout" view="Button"><Expressions/><location startLine="209" startOffset="12" endLine="216" endOffset="45"/></Target><Target id="@+id/btnDebug" view="Button"><Expressions/><location startLine="218" startOffset="12" endLine="226" endOffset="41"/></Target><Target id="@+id/tvDebugInfo" view="TextView"><Expressions/><location startLine="228" startOffset="12" endLine="238" endOffset="43"/></Target></Targets></Layout>
@@ -0,0 +1 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><Layout layout="widget_layout" modulePackage="me.khodak.claudeusage" filePath="app/src/main/res/layout/widget_layout.xml" directory="layout" isMerge="false" isBindingData="false" rootNodeType="android.widget.LinearLayout" rootNodeViewId="@+id/widget_root"><Targets><Target id="@+id/widget_root" tag="layout/widget_layout_0" view="LinearLayout"><Expressions/><location startLine="1" startOffset="0" endLine="168" endOffset="14"/></Target><Target id="@+id/btn_refresh" view="ImageButton"><Expressions/><location startLine="25" startOffset="8" endLine="32" endOffset="50"/></Target><Target id="@+id/tv_session_value" view="TextView"><Expressions/><location startLine="60" startOffset="8" endLine="67" endOffset="38"/></Target><Target id="@+id/progress_bar" view="ProgressBar"><Expressions/><location startLine="71" startOffset="4" endLine="80" endOffset="50"/></Target><Target id="@+id/tv_session_label" view="TextView"><Expressions/><location startLine="82" startOffset="4" endLine="89" endOffset="32"/></Target><Target id="@+id/tv_weekly_value" view="TextView"><Expressions/><location startLine="108" startOffset="8" endLine="115" endOffset="38"/></Target><Target id="@+id/progress_bar_weekly" view="ProgressBar"><Expressions/><location startLine="119" startOffset="4" endLine="128" endOffset="50"/></Target><Target id="@+id/tv_weekly_label" view="TextView"><Expressions/><location startLine="130" startOffset="4" endLine="137" endOffset="32"/></Target><Target id="@+id/tv_status" view="TextView"><Expressions/><location startLine="147" startOffset="8" endLine="156" endOffset="37"/></Target><Target id="@+id/tv_updated" view="TextView"><Expressions/><location startLine="158" startOffset="8" endLine="164" endOffset="36"/></Target></Targets></Layout>
@@ -0,0 +1 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><Layout layout="widget_layout_small" modulePackage="me.khodak.claudeusage" filePath="app/src/main/res/layout/widget_layout_small.xml" directory="layout" isMerge="false" isBindingData="false" rootNodeType="android.widget.LinearLayout" rootNodeViewId="@+id/widget_root"><Targets><Target id="@+id/widget_root" tag="layout/widget_layout_small_0" view="LinearLayout"><Expressions/><location startLine="1" startOffset="0" endLine="141" endOffset="14"/></Target><Target id="@+id/btn_refresh" view="ImageButton"><Expressions/><location startLine="25" startOffset="8" endLine="31" endOffset="50"/></Target><Target id="@+id/tv_session_value" view="TextView"><Expressions/><location startLine="52" startOffset="8" endLine="59" endOffset="38"/></Target><Target id="@+id/tv_session_label" view="TextView"><Expressions/><location startLine="61" startOffset="8" endLine="68" endOffset="36"/></Target><Target id="@+id/progress_bar" view="ProgressBar"><Expressions/><location startLine="72" startOffset="4" endLine="81" endOffset="50"/></Target><Target id="@+id/tv_weekly_value" view="TextView"><Expressions/><location startLine="100" startOffset="8" endLine="107" endOffset="38"/></Target><Target id="@+id/tv_weekly_label" view="TextView"><Expressions/><location startLine="109" startOffset="8" endLine="116" endOffset="36"/></Target><Target id="@+id/progress_bar_weekly" view="ProgressBar"><Expressions/><location startLine="120" startOffset="4" endLine="129" endOffset="50"/></Target><Target id="@+id/tv_status" view="TextView"><Expressions/><location startLine="131" startOffset="4" endLine="139" endOffset="30"/></Target></Targets></Layout>
@@ -0,0 +1 @@
8

Some files were not shown because too many files have changed in this diff Show More