Android tablet remote UI: styling pass, color picker, arrange mode indicator, connection gating

- Button styling standardization with green ring state indicators (Connect, Rescan, Log, Clear Layout, Reset ALL)
- Input field labels with proper DP-based padding and spacing
- Feedback & title widget color picker with 7-color palette and persistence layer
- Font weight selection for text widgets (deferred visual implementation)
- Hide/Show and Reset Size buttons in context menu
- Flashing pink border around entire app when Arrange mode is ON (500ms fade in/out cycle)
- Arrange button disabled until connected to desktop app, with alpha indicator
- WidgetLayoutState now persists color and fontWeight properties
- Arrange mode visual debugging with smooth fade animation instead of harsh strobe

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
Paul Lipscomb
2026-07-30 18:47:07 -05:00
parent f7ac34141a
commit 3425ec69de
909 changed files with 43638 additions and 0 deletions
@@ -0,0 +1,88 @@
1<?xml version="1.0" encoding="utf-8"?>
2<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 package="com.virtualcontroller.remote"
4 android:versionCode="1"
5 android:versionName="0.1-stage1" >
6
7 <uses-sdk
8 android:minSdkVersion="24"
9 android:targetSdkVersion="34" />
10
11 <uses-permission android:name="android.permission.INTERNET" />
11-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:4:5-67
11-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:4:22-64
12 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
12-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:5:5-76
12-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:5:22-73
13 <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
13-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:6:5-86
13-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:6:22-83
14
15 <permission
15-->[androidx.core:core:1.9.0] C:\Users\paul\.gradle\caches\transforms-3\f2fad28c1c5d2c61b5fd790a54a73678\transformed\core-1.9.0\AndroidManifest.xml:22:5-24:47
16 android:name="com.virtualcontroller.remote.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION"
16-->[androidx.core:core:1.9.0] C:\Users\paul\.gradle\caches\transforms-3\f2fad28c1c5d2c61b5fd790a54a73678\transformed\core-1.9.0\AndroidManifest.xml:23:9-81
17 android:protectionLevel="signature" />
17-->[androidx.core:core:1.9.0] C:\Users\paul\.gradle\caches\transforms-3\f2fad28c1c5d2c61b5fd790a54a73678\transformed\core-1.9.0\AndroidManifest.xml:24:9-44
18
19 <uses-permission android:name="com.virtualcontroller.remote.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION" />
19-->[androidx.core:core:1.9.0] C:\Users\paul\.gradle\caches\transforms-3\f2fad28c1c5d2c61b5fd790a54a73678\transformed\core-1.9.0\AndroidManifest.xml:26:5-97
19-->[androidx.core:core:1.9.0] C:\Users\paul\.gradle\caches\transforms-3\f2fad28c1c5d2c61b5fd790a54a73678\transformed\core-1.9.0\AndroidManifest.xml:26:22-94
20
21 <application
21-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:8:5-21:19
22 android:allowBackup="true"
22-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:9:9-35
23 android:appComponentFactory="androidx.core.app.CoreComponentFactory"
23-->[androidx.core:core:1.9.0] C:\Users\paul\.gradle\caches\transforms-3\f2fad28c1c5d2c61b5fd790a54a73678\transformed\core-1.9.0\AndroidManifest.xml:28:18-86
24 android:debuggable="true"
25 android:extractNativeLibs="false"
26 android:label="VC Remote"
26-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:10:9-34
27 android:testOnly="true"
28 android:theme="@style/Theme.AppCompat.NoActionBar"
28-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:11:9-59
29 android:usesCleartextTraffic="true" >
29-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:12:9-44
30 <activity
30-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:13:9-20:20
31 android:name="com.virtualcontroller.remote.arrange.ArrangeActivity"
31-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:14:13-52
32 android:exported="true" >
32-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:15:13-36
33 <intent-filter>
33-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:16:13-19:29
34 <action android:name="android.intent.action.MAIN" />
34-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:17:17-69
34-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:17:25-66
35
36 <category android:name="android.intent.category.LAUNCHER" />
36-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:18:17-77
36-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:18:27-74
37 </intent-filter>
38 </activity>
39
40 <provider
40-->[androidx.emoji2:emoji2:1.2.0] C:\Users\paul\.gradle\caches\transforms-3\fc9eaa3b98f9058478d5dc9f0fd73d1a\transformed\emoji2-1.2.0\AndroidManifest.xml:24:9-32:20
41 android:name="androidx.startup.InitializationProvider"
41-->[androidx.emoji2:emoji2:1.2.0] C:\Users\paul\.gradle\caches\transforms-3\fc9eaa3b98f9058478d5dc9f0fd73d1a\transformed\emoji2-1.2.0\AndroidManifest.xml:25:13-67
42 android:authorities="com.virtualcontroller.remote.androidx-startup"
42-->[androidx.emoji2:emoji2:1.2.0] C:\Users\paul\.gradle\caches\transforms-3\fc9eaa3b98f9058478d5dc9f0fd73d1a\transformed\emoji2-1.2.0\AndroidManifest.xml:26:13-68
43 android:exported="false" >
43-->[androidx.emoji2:emoji2:1.2.0] C:\Users\paul\.gradle\caches\transforms-3\fc9eaa3b98f9058478d5dc9f0fd73d1a\transformed\emoji2-1.2.0\AndroidManifest.xml:27:13-37
44 <meta-data
44-->[androidx.emoji2:emoji2:1.2.0] C:\Users\paul\.gradle\caches\transforms-3\fc9eaa3b98f9058478d5dc9f0fd73d1a\transformed\emoji2-1.2.0\AndroidManifest.xml:29:13-31:52
45 android:name="androidx.emoji2.text.EmojiCompatInitializer"
45-->[androidx.emoji2:emoji2:1.2.0] C:\Users\paul\.gradle\caches\transforms-3\fc9eaa3b98f9058478d5dc9f0fd73d1a\transformed\emoji2-1.2.0\AndroidManifest.xml:30:17-75
46 android:value="androidx.startup" />
46-->[androidx.emoji2:emoji2:1.2.0] C:\Users\paul\.gradle\caches\transforms-3\fc9eaa3b98f9058478d5dc9f0fd73d1a\transformed\emoji2-1.2.0\AndroidManifest.xml:31:17-49
47 <meta-data
47-->[androidx.lifecycle:lifecycle-process:2.4.1] C:\Users\paul\.gradle\caches\transforms-3\fd7cc8aedcacab326b1297905d9395c4\transformed\lifecycle-process-2.4.1\AndroidManifest.xml:31:13-33:52
48 android:name="androidx.lifecycle.ProcessLifecycleInitializer"
48-->[androidx.lifecycle:lifecycle-process:2.4.1] C:\Users\paul\.gradle\caches\transforms-3\fd7cc8aedcacab326b1297905d9395c4\transformed\lifecycle-process-2.4.1\AndroidManifest.xml:32:17-78
49 android:value="androidx.startup" />
49-->[androidx.lifecycle:lifecycle-process:2.4.1] C:\Users\paul\.gradle\caches\transforms-3\fd7cc8aedcacab326b1297905d9395c4\transformed\lifecycle-process-2.4.1\AndroidManifest.xml:33:17-49
50 </provider>
51 </application>
52
53</manifest>
@@ -0,0 +1,91 @@
1<?xml version="1.0" encoding="utf-8"?>
2<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 package="com.virtualcontroller.remote"
4 android:versionCode="1"
5 android:versionName="0.1-stage1" >
6
7 <uses-sdk
8 android:minSdkVersion="24"
9 android:targetSdkVersion="34" />
10
11 <uses-permission android:name="android.permission.INTERNET" />
11-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:4:5-67
11-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:4:22-64
12 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
12-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:5:5-76
12-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:5:22-73
13 <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
13-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:6:5-86
13-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:6:22-83
14 <uses-permission android:name="android.permission.VIBRATE" />
14-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:7:5-66
14-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:7:22-63
15
16 <permission
16-->[androidx.core:core:1.9.0] C:\Users\paul\.gradle\caches\transforms-4\f0d3566678117a732b42c141a9708ee7\transformed\core-1.9.0\AndroidManifest.xml:22:5-24:47
17 android:name="com.virtualcontroller.remote.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION"
17-->[androidx.core:core:1.9.0] C:\Users\paul\.gradle\caches\transforms-4\f0d3566678117a732b42c141a9708ee7\transformed\core-1.9.0\AndroidManifest.xml:23:9-81
18 android:protectionLevel="signature" />
18-->[androidx.core:core:1.9.0] C:\Users\paul\.gradle\caches\transforms-4\f0d3566678117a732b42c141a9708ee7\transformed\core-1.9.0\AndroidManifest.xml:24:9-44
19
20 <uses-permission android:name="com.virtualcontroller.remote.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION" />
20-->[androidx.core:core:1.9.0] C:\Users\paul\.gradle\caches\transforms-4\f0d3566678117a732b42c141a9708ee7\transformed\core-1.9.0\AndroidManifest.xml:26:5-97
20-->[androidx.core:core:1.9.0] C:\Users\paul\.gradle\caches\transforms-4\f0d3566678117a732b42c141a9708ee7\transformed\core-1.9.0\AndroidManifest.xml:26:22-94
21
22 <application
22-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:9:5-22:19
23 android:allowBackup="true"
23-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:10:9-35
24 android:appComponentFactory="androidx.core.app.CoreComponentFactory"
24-->[androidx.core:core:1.9.0] C:\Users\paul\.gradle\caches\transforms-4\f0d3566678117a732b42c141a9708ee7\transformed\core-1.9.0\AndroidManifest.xml:28:18-86
25 android:debuggable="true"
26 android:extractNativeLibs="false"
27 android:label="VC Remote"
27-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:11:9-34
28 android:testOnly="true"
29 android:theme="@style/Theme.AppCompat.NoActionBar"
29-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:12:9-59
30 android:usesCleartextTraffic="true" >
30-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:13:9-44
31 <activity
31-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:14:9-21:20
32 android:name="com.virtualcontroller.remote.arrange.ArrangeActivity"
32-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:15:13-52
33 android:exported="true" >
33-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:16:13-36
34 <intent-filter>
34-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:17:13-20:29
35 <action android:name="android.intent.action.MAIN" />
35-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:18:17-69
35-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:18:25-66
36
37 <category android:name="android.intent.category.LAUNCHER" />
37-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:19:17-77
37-->E:\20260608-virtual-controller-py\remote-client-android\app\src\main\AndroidManifest.xml:19:27-74
38 </intent-filter>
39 </activity>
40
41 <provider
41-->[androidx.emoji2:emoji2:1.2.0] C:\Users\paul\.gradle\caches\transforms-4\8a4da37dc5a2167e0075ee7012655367\transformed\emoji2-1.2.0\AndroidManifest.xml:24:9-32:20
42 android:name="androidx.startup.InitializationProvider"
42-->[androidx.emoji2:emoji2:1.2.0] C:\Users\paul\.gradle\caches\transforms-4\8a4da37dc5a2167e0075ee7012655367\transformed\emoji2-1.2.0\AndroidManifest.xml:25:13-67
43 android:authorities="com.virtualcontroller.remote.androidx-startup"
43-->[androidx.emoji2:emoji2:1.2.0] C:\Users\paul\.gradle\caches\transforms-4\8a4da37dc5a2167e0075ee7012655367\transformed\emoji2-1.2.0\AndroidManifest.xml:26:13-68
44 android:exported="false" >
44-->[androidx.emoji2:emoji2:1.2.0] C:\Users\paul\.gradle\caches\transforms-4\8a4da37dc5a2167e0075ee7012655367\transformed\emoji2-1.2.0\AndroidManifest.xml:27:13-37
45 <meta-data
45-->[androidx.emoji2:emoji2:1.2.0] C:\Users\paul\.gradle\caches\transforms-4\8a4da37dc5a2167e0075ee7012655367\transformed\emoji2-1.2.0\AndroidManifest.xml:29:13-31:52
46 android:name="androidx.emoji2.text.EmojiCompatInitializer"
46-->[androidx.emoji2:emoji2:1.2.0] C:\Users\paul\.gradle\caches\transforms-4\8a4da37dc5a2167e0075ee7012655367\transformed\emoji2-1.2.0\AndroidManifest.xml:30:17-75
47 android:value="androidx.startup" />
47-->[androidx.emoji2:emoji2:1.2.0] C:\Users\paul\.gradle\caches\transforms-4\8a4da37dc5a2167e0075ee7012655367\transformed\emoji2-1.2.0\AndroidManifest.xml:31:17-49
48 <meta-data
48-->[androidx.lifecycle:lifecycle-process:2.4.1] C:\Users\paul\.gradle\caches\transforms-4\4b7f719f1ae848b3b60d2b53f0bdb6d9\transformed\lifecycle-process-2.4.1\AndroidManifest.xml:31:13-33:52
49 android:name="androidx.lifecycle.ProcessLifecycleInitializer"
49-->[androidx.lifecycle:lifecycle-process:2.4.1] C:\Users\paul\.gradle\caches\transforms-4\4b7f719f1ae848b3b60d2b53f0bdb6d9\transformed\lifecycle-process-2.4.1\AndroidManifest.xml:32:17-78
50 android:value="androidx.startup" />
50-->[androidx.lifecycle:lifecycle-process:2.4.1] C:\Users\paul\.gradle\caches\transforms-4\4b7f719f1ae848b3b60d2b53f0bdb6d9\transformed\lifecycle-process-2.4.1\AndroidManifest.xml:33:17-49
51 </provider>
52 </application>
53
54</manifest>