Initial commit: Roku web remote server + Android app

This commit is contained in:
2026-07-09 06:07:41 -04:00
commit a950674d1e
701 changed files with 69650 additions and 0 deletions
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
View File
@@ -0,0 +1,2 @@
#Tue May 26 23:56:06 EDT 2026
gradle.version=8.5
Binary file not shown.
Binary file not shown.
View File
+53
View File
@@ -0,0 +1,53 @@
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
}
android {
namespace = "com.utumno.tvremote"
compileSdk = 34
defaultConfig {
applicationId = "com.utumno.tvremote"
minSdk = 24
targetSdk = 34
versionCode = 1
versionName = "1.0.0"
// Allow cleartext for local WireGuard network
vectorDrawables.useSupportLibrary = true
}
buildTypes {
release {
isMinifyEnabled = false
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("androidx.activity:activity-ktx:1.8.2")
implementation("androidx.webkit:webkit:1.10.0")
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0")
implementation("androidx.coordinatorlayout:coordinatorlayout:1.2.0")
implementation("com.google.android.material:material:1.11.0")
}
@@ -0,0 +1,137 @@
// Generated by view binder compiler. Do not edit!
package com.utumno.tvremote.databinding;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import androidx.viewbinding.ViewBinding;
import androidx.viewbinding.ViewBindings;
import com.google.android.material.button.MaterialButton;
import com.utumno.tvremote.R;
import java.lang.NullPointerException;
import java.lang.Override;
import java.lang.String;
public final class ActivityMainBinding implements ViewBinding {
@NonNull
private final CoordinatorLayout rootView;
@NonNull
public final TextView errorMessage;
@NonNull
public final TextView errorTitle;
@NonNull
public final LinearLayout errorView;
@NonNull
public final ProgressBar progressBar;
@NonNull
public final MaterialButton retryButton;
@NonNull
public final SwipeRefreshLayout swipeRefresh;
@NonNull
public final WebView webview;
private ActivityMainBinding(@NonNull CoordinatorLayout rootView, @NonNull TextView errorMessage,
@NonNull TextView errorTitle, @NonNull LinearLayout errorView,
@NonNull ProgressBar progressBar, @NonNull MaterialButton retryButton,
@NonNull SwipeRefreshLayout swipeRefresh, @NonNull WebView webview) {
this.rootView = rootView;
this.errorMessage = errorMessage;
this.errorTitle = errorTitle;
this.errorView = errorView;
this.progressBar = progressBar;
this.retryButton = retryButton;
this.swipeRefresh = swipeRefresh;
this.webview = webview;
}
@Override
@NonNull
public CoordinatorLayout 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.error_message;
TextView errorMessage = ViewBindings.findChildViewById(rootView, id);
if (errorMessage == null) {
break missingId;
}
id = R.id.error_title;
TextView errorTitle = ViewBindings.findChildViewById(rootView, id);
if (errorTitle == null) {
break missingId;
}
id = R.id.error_view;
LinearLayout errorView = ViewBindings.findChildViewById(rootView, id);
if (errorView == null) {
break missingId;
}
id = R.id.progress_bar;
ProgressBar progressBar = ViewBindings.findChildViewById(rootView, id);
if (progressBar == null) {
break missingId;
}
id = R.id.retry_button;
MaterialButton retryButton = ViewBindings.findChildViewById(rootView, id);
if (retryButton == null) {
break missingId;
}
id = R.id.swipe_refresh;
SwipeRefreshLayout swipeRefresh = ViewBindings.findChildViewById(rootView, id);
if (swipeRefresh == null) {
break missingId;
}
id = R.id.webview;
WebView webview = ViewBindings.findChildViewById(rootView, id);
if (webview == null) {
break missingId;
}
return new ActivityMainBinding((CoordinatorLayout) rootView, errorMessage, errorTitle,
errorView, progressBar, retryButton, swipeRefresh, webview);
}
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": "com.utumno.tvremote",
"variantName": "debug",
"elements": []
}
@@ -0,0 +1 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><Layout layout="activity_main" modulePackage="com.utumno.tvremote" filePath="app/src/main/res/layout/activity_main.xml" directory="layout" isMerge="false" isBindingData="false" rootNodeType="androidx.coordinatorlayout.widget.CoordinatorLayout"><Targets><Target tag="layout/activity_main_0" view="androidx.coordinatorlayout.widget.CoordinatorLayout"><Expressions/><location startLine="1" startOffset="0" endLine="103" endOffset="53"/></Target><Target id="@+id/swipe_refresh" view="androidx.swiperefreshlayout.widget.SwipeRefreshLayout"><Expressions/><location startLine="9" startOffset="4" endLine="37" endOffset="59"/></Target><Target id="@+id/webview" view="WebView"><Expressions/><location startLine="19" startOffset="12" endLine="23" endOffset="43"/></Target><Target id="@+id/progress_bar" view="ProgressBar"><Expressions/><location startLine="25" startOffset="12" endLine="33" endOffset="35"/></Target><Target id="@+id/error_view" view="LinearLayout"><Expressions/><location startLine="40" startOffset="4" endLine="101" endOffset="18"/></Target><Target id="@+id/error_title" view="TextView"><Expressions/><location startLine="67" startOffset="8" endLine="75" endOffset="38"/></Target><Target id="@+id/error_message" view="TextView"><Expressions/><location startLine="77" startOffset="8" endLine="87" endOffset="38"/></Target><Target id="@+id/retry_button" view="com.google.android.material.button.MaterialButton"><Expressions/><location startLine="89" startOffset="8" endLine="99" endOffset="49"/></Target></Targets></Layout>
@@ -0,0 +1 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><Layout layout="activity_main" modulePackage="com.utumno.tvremote" filePath="app/src/main/res/layout/activity_main.xml" directory="layout" isMerge="false" isBindingData="false" rootNodeType="androidx.coordinatorlayout.widget.CoordinatorLayout"><Targets><Target tag="layout/activity_main_0" view="androidx.coordinatorlayout.widget.CoordinatorLayout"><Expressions/><location startLine="1" startOffset="0" endLine="103" endOffset="53"/></Target><Target id="@+id/swipe_refresh" view="androidx.swiperefreshlayout.widget.SwipeRefreshLayout"><Expressions/><location startLine="9" startOffset="4" endLine="37" endOffset="59"/></Target><Target id="@+id/webview" view="WebView"><Expressions/><location startLine="19" startOffset="12" endLine="23" endOffset="43"/></Target><Target id="@+id/progress_bar" view="ProgressBar"><Expressions/><location startLine="25" startOffset="12" endLine="33" endOffset="35"/></Target><Target id="@+id/error_view" view="LinearLayout"><Expressions/><location startLine="40" startOffset="4" endLine="101" endOffset="18"/></Target><Target id="@+id/error_title" view="TextView"><Expressions/><location startLine="67" startOffset="8" endLine="75" endOffset="38"/></Target><Target id="@+id/error_message" view="TextView"><Expressions/><location startLine="77" startOffset="8" endLine="87" endOffset="38"/></Target><Target id="@+id/retry_button" view="com.google.android.material.button.MaterialButton"><Expressions/><location startLine="89" startOffset="8" endLine="99" endOffset="49"/></Target></Targets></Layout>

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