diff --git a/README.md b/README.md index 2d3ef2e..e543c9a 100644 --- a/README.md +++ b/README.md @@ -2,3 +2,7 @@ effortless webrtc screensharing +# ai usage transparency + +i maintain full control of the website, while the android and electron apps are "controlled" by the ai. +i, of course, review code, but would like to implement stuff on \ No newline at end of file diff --git a/mobile-wrapper/README.md b/mobile-wrapper/README.md deleted file mode 100644 index b4e07b7..0000000 --- a/mobile-wrapper/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# Helium Mobile Wrapper (Android) - -This is a TypeScript mobile wrapper built with React + Capacitor for opening -the Helium web app on Android. - -## Why this approach - -- Capacitor keeps the project in TypeScript. -- The app first tries to open Helium directly in Google Chrome on Android. -- A fallback button opens Helium with the default browser. - -## Setup - -```bash -pnpm -C mobile-wrapper install -pnpm -C mobile-wrapper build -pnpm -C mobile-wrapper cap:android:add -pnpm -C mobile-wrapper cap:sync -pnpm -C mobile-wrapper cap:android:open -``` - -Then build/run from Android Studio. - -## Notes on screen sharing with audio - -- Android support for screen-capture audio depends on OS version, Chrome - version, OEM restrictions, and user permissions. -- If audio is unavailable, update Android + Chrome and confirm audio capture is - enabled in the system screen-share dialog. -- A pure in-app WebView wrapper is less reliable for audio capture than Chrome - Custom Tabs on Android. diff --git a/mobile-wrapper/android/.gitignore b/mobile-wrapper/android/.gitignore deleted file mode 100644 index 48354a3..0000000 --- a/mobile-wrapper/android/.gitignore +++ /dev/null @@ -1,101 +0,0 @@ -# Using Android gitignore template: https://github.com/github/gitignore/blob/HEAD/Android.gitignore - -# Built application files -*.apk -*.aar -*.ap_ -*.aab - -# Files for the ART/Dalvik VM -*.dex - -# Java class files -*.class - -# Generated files -bin/ -gen/ -out/ -# Uncomment the following line in case you need and you don't have the release build type files in your app -# release/ - -# Gradle files -.gradle/ -build/ - -# Local configuration file (sdk path, etc) -local.properties - -# Proguard folder generated by Eclipse -proguard/ - -# Log Files -*.log - -# Android Studio Navigation editor temp files -.navigation/ - -# Android Studio captures folder -captures/ - -# IntelliJ -*.iml -.idea/workspace.xml -.idea/tasks.xml -.idea/gradle.xml -.idea/assetWizardSettings.xml -.idea/dictionaries -.idea/libraries -# Android Studio 3 in .gitignore file. -.idea/caches -.idea/modules.xml -# Comment next line if keeping position of elements in Navigation Editor is relevant for you -.idea/navEditor.xml - -# Keystore files -# Uncomment the following lines if you do not want to check your keystore files in. -#*.jks -#*.keystore - -# External native build folder generated in Android Studio 2.2 and later -.externalNativeBuild -.cxx/ - -# Google Services (e.g. APIs or Firebase) -# google-services.json - -# Freeline -freeline.py -freeline/ -freeline_project_description.json - -# fastlane -fastlane/report.xml -fastlane/Preview.html -fastlane/screenshots -fastlane/test_output -fastlane/readme.md - -# Version control -vcs.xml - -# lint -lint/intermediates/ -lint/generated/ -lint/outputs/ -lint/tmp/ -# lint/reports/ - -# Android Profiling -*.hprof - -# Cordova plugins for Capacitor -capacitor-cordova-android-plugins - -# Copied web assets -app/src/main/assets/public - -# Generated Config files -app/src/main/assets/capacitor.config.json -app/src/main/assets/capacitor.plugins.json -app/src/main/res/xml/config.xml diff --git a/mobile-wrapper/android/app/.gitignore b/mobile-wrapper/android/app/.gitignore deleted file mode 100644 index 043df80..0000000 --- a/mobile-wrapper/android/app/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/build/* -!/build/.npmkeep diff --git a/mobile-wrapper/android/app/build.gradle b/mobile-wrapper/android/app/build.gradle deleted file mode 100644 index 6fea0a8..0000000 --- a/mobile-wrapper/android/app/build.gradle +++ /dev/null @@ -1,54 +0,0 @@ -apply plugin: 'com.android.application' - -android { - namespace "dev.srizan.helium.mobile" - compileSdk rootProject.ext.compileSdkVersion - defaultConfig { - applicationId "dev.srizan.helium.mobile" - minSdkVersion rootProject.ext.minSdkVersion - targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 1 - versionName "1.0" - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - aaptOptions { - // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. - // Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61 - ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~' - } - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } -} - -repositories { - flatDir{ - dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs' - } -} - -dependencies { - implementation fileTree(include: ['*.jar'], dir: 'libs') - implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion" - implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion" - implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion" - implementation project(':capacitor-android') - testImplementation "junit:junit:$junitVersion" - androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion" - androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion" - implementation project(':capacitor-cordova-android-plugins') -} - -apply from: 'capacitor.build.gradle' - -try { - def servicesJSON = file('google-services.json') - if (servicesJSON.text) { - apply plugin: 'com.google.gms.google-services' - } -} catch(Exception e) { - logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work") -} diff --git a/mobile-wrapper/android/app/capacitor.build.gradle b/mobile-wrapper/android/app/capacitor.build.gradle deleted file mode 100644 index 70f93fc..0000000 --- a/mobile-wrapper/android/app/capacitor.build.gradle +++ /dev/null @@ -1,20 +0,0 @@ -// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN - -android { - compileOptions { - sourceCompatibility JavaVersion.VERSION_21 - targetCompatibility JavaVersion.VERSION_21 - } -} - -apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle" -dependencies { - implementation project(':capacitor-app') - implementation project(':capacitor-browser') - -} - - -if (hasProperty('postBuildExtras')) { - postBuildExtras() -} diff --git a/mobile-wrapper/android/app/proguard-rules.pro b/mobile-wrapper/android/app/proguard-rules.pro deleted file mode 100644 index f1b4245..0000000 --- a/mobile-wrapper/android/app/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/mobile-wrapper/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java b/mobile-wrapper/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java deleted file mode 100644 index f2c2217..0000000 --- a/mobile-wrapper/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.getcapacitor.myapp; - -import static org.junit.Assert.*; - -import android.content.Context; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.platform.app.InstrumentationRegistry; -import org.junit.Test; -import org.junit.runner.RunWith; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - - @Test - public void useAppContext() throws Exception { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); - - assertEquals("com.getcapacitor.app", appContext.getPackageName()); - } -} diff --git a/mobile-wrapper/android/app/src/main/AndroidManifest.xml b/mobile-wrapper/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 340e7df..0000000 --- a/mobile-wrapper/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mobile-wrapper/android/app/src/main/java/dev/srizan/helium/mobile/MainActivity.java b/mobile-wrapper/android/app/src/main/java/dev/srizan/helium/mobile/MainActivity.java deleted file mode 100644 index f2dcff8..0000000 --- a/mobile-wrapper/android/app/src/main/java/dev/srizan/helium/mobile/MainActivity.java +++ /dev/null @@ -1,5 +0,0 @@ -package dev.srizan.helium.mobile; - -import com.getcapacitor.BridgeActivity; - -public class MainActivity extends BridgeActivity {} diff --git a/mobile-wrapper/android/app/src/main/res/drawable-land-hdpi/splash.png b/mobile-wrapper/android/app/src/main/res/drawable-land-hdpi/splash.png deleted file mode 100644 index e31573b..0000000 Binary files a/mobile-wrapper/android/app/src/main/res/drawable-land-hdpi/splash.png and /dev/null differ diff --git a/mobile-wrapper/android/app/src/main/res/drawable-land-mdpi/splash.png b/mobile-wrapper/android/app/src/main/res/drawable-land-mdpi/splash.png deleted file mode 100644 index f7a6492..0000000 Binary files a/mobile-wrapper/android/app/src/main/res/drawable-land-mdpi/splash.png and /dev/null differ diff --git a/mobile-wrapper/android/app/src/main/res/drawable-land-xhdpi/splash.png b/mobile-wrapper/android/app/src/main/res/drawable-land-xhdpi/splash.png deleted file mode 100644 index 8077255..0000000 Binary files a/mobile-wrapper/android/app/src/main/res/drawable-land-xhdpi/splash.png and /dev/null differ diff --git a/mobile-wrapper/android/app/src/main/res/drawable-land-xxhdpi/splash.png b/mobile-wrapper/android/app/src/main/res/drawable-land-xxhdpi/splash.png deleted file mode 100644 index 14c6c8f..0000000 Binary files a/mobile-wrapper/android/app/src/main/res/drawable-land-xxhdpi/splash.png and /dev/null differ diff --git a/mobile-wrapper/android/app/src/main/res/drawable-land-xxxhdpi/splash.png b/mobile-wrapper/android/app/src/main/res/drawable-land-xxxhdpi/splash.png deleted file mode 100644 index 244ca25..0000000 Binary files a/mobile-wrapper/android/app/src/main/res/drawable-land-xxxhdpi/splash.png and /dev/null differ diff --git a/mobile-wrapper/android/app/src/main/res/drawable-port-hdpi/splash.png b/mobile-wrapper/android/app/src/main/res/drawable-port-hdpi/splash.png deleted file mode 100644 index 74faaa5..0000000 Binary files a/mobile-wrapper/android/app/src/main/res/drawable-port-hdpi/splash.png and /dev/null differ diff --git a/mobile-wrapper/android/app/src/main/res/drawable-port-mdpi/splash.png b/mobile-wrapper/android/app/src/main/res/drawable-port-mdpi/splash.png deleted file mode 100644 index e944f4a..0000000 Binary files a/mobile-wrapper/android/app/src/main/res/drawable-port-mdpi/splash.png and /dev/null differ diff --git a/mobile-wrapper/android/app/src/main/res/drawable-port-xhdpi/splash.png b/mobile-wrapper/android/app/src/main/res/drawable-port-xhdpi/splash.png deleted file mode 100644 index 564a82f..0000000 Binary files a/mobile-wrapper/android/app/src/main/res/drawable-port-xhdpi/splash.png and /dev/null differ diff --git a/mobile-wrapper/android/app/src/main/res/drawable-port-xxhdpi/splash.png b/mobile-wrapper/android/app/src/main/res/drawable-port-xxhdpi/splash.png deleted file mode 100644 index bfabe68..0000000 Binary files a/mobile-wrapper/android/app/src/main/res/drawable-port-xxhdpi/splash.png and /dev/null differ diff --git a/mobile-wrapper/android/app/src/main/res/drawable-port-xxxhdpi/splash.png b/mobile-wrapper/android/app/src/main/res/drawable-port-xxxhdpi/splash.png deleted file mode 100644 index 6929071..0000000 Binary files a/mobile-wrapper/android/app/src/main/res/drawable-port-xxxhdpi/splash.png and /dev/null differ diff --git a/mobile-wrapper/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/mobile-wrapper/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index c7bd21d..0000000 --- a/mobile-wrapper/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - diff --git a/mobile-wrapper/android/app/src/main/res/drawable/ic_launcher_background.xml b/mobile-wrapper/android/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index d5fccc5..0000000 --- a/mobile-wrapper/android/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mobile-wrapper/android/app/src/main/res/drawable/splash.png b/mobile-wrapper/android/app/src/main/res/drawable/splash.png deleted file mode 100644 index f7a6492..0000000 Binary files a/mobile-wrapper/android/app/src/main/res/drawable/splash.png and /dev/null differ diff --git a/mobile-wrapper/android/app/src/main/res/layout/activity_main.xml b/mobile-wrapper/android/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index b5ad138..0000000 --- a/mobile-wrapper/android/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - diff --git a/mobile-wrapper/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/mobile-wrapper/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index 036d09b..0000000 --- a/mobile-wrapper/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/mobile-wrapper/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/mobile-wrapper/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index 036d09b..0000000 --- a/mobile-wrapper/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/mobile-wrapper/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/mobile-wrapper/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index c023e50..0000000 Binary files a/mobile-wrapper/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/mobile-wrapper/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/mobile-wrapper/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png deleted file mode 100644 index 2127973..0000000 Binary files a/mobile-wrapper/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/mobile-wrapper/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/mobile-wrapper/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index b441f37..0000000 Binary files a/mobile-wrapper/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and /dev/null differ diff --git a/mobile-wrapper/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/mobile-wrapper/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 72905b8..0000000 Binary files a/mobile-wrapper/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/mobile-wrapper/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/mobile-wrapper/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png deleted file mode 100644 index 8ed0605..0000000 Binary files a/mobile-wrapper/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/mobile-wrapper/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/mobile-wrapper/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index 9502e47..0000000 Binary files a/mobile-wrapper/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and /dev/null differ diff --git a/mobile-wrapper/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/mobile-wrapper/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 4d1e077..0000000 Binary files a/mobile-wrapper/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/mobile-wrapper/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/mobile-wrapper/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png deleted file mode 100644 index df0f158..0000000 Binary files a/mobile-wrapper/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/mobile-wrapper/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/mobile-wrapper/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index 853db04..0000000 Binary files a/mobile-wrapper/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and /dev/null differ diff --git a/mobile-wrapper/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/mobile-wrapper/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 6cdf97c..0000000 Binary files a/mobile-wrapper/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/mobile-wrapper/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/mobile-wrapper/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png deleted file mode 100644 index 2960cbb..0000000 Binary files a/mobile-wrapper/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/mobile-wrapper/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/mobile-wrapper/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index 8e3093a..0000000 Binary files a/mobile-wrapper/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/mobile-wrapper/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/mobile-wrapper/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 46de6e2..0000000 Binary files a/mobile-wrapper/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/mobile-wrapper/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/mobile-wrapper/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png deleted file mode 100644 index d2ea9ab..0000000 Binary files a/mobile-wrapper/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/mobile-wrapper/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/mobile-wrapper/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index a40d73e..0000000 Binary files a/mobile-wrapper/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/mobile-wrapper/android/app/src/main/res/values/ic_launcher_background.xml b/mobile-wrapper/android/app/src/main/res/values/ic_launcher_background.xml deleted file mode 100644 index c5d5899..0000000 --- a/mobile-wrapper/android/app/src/main/res/values/ic_launcher_background.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - #FFFFFF - \ No newline at end of file diff --git a/mobile-wrapper/android/app/src/main/res/values/strings.xml b/mobile-wrapper/android/app/src/main/res/values/strings.xml deleted file mode 100644 index 4cb3778..0000000 --- a/mobile-wrapper/android/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - Helium Mobile - Helium Mobile - dev.srizan.helium.mobile - dev.srizan.helium.mobile - diff --git a/mobile-wrapper/android/app/src/main/res/values/styles.xml b/mobile-wrapper/android/app/src/main/res/values/styles.xml deleted file mode 100644 index be874e5..0000000 --- a/mobile-wrapper/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/mobile-wrapper/android/app/src/main/res/xml/file_paths.xml b/mobile-wrapper/android/app/src/main/res/xml/file_paths.xml deleted file mode 100644 index bd0c4d8..0000000 --- a/mobile-wrapper/android/app/src/main/res/xml/file_paths.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/mobile-wrapper/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java b/mobile-wrapper/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java deleted file mode 100644 index 0297327..0000000 --- a/mobile-wrapper/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.getcapacitor.myapp; - -import static org.junit.Assert.*; - -import org.junit.Test; - -/** - * Example local unit test, which will execute on the development machine (host). - * - * @see Testing documentation - */ -public class ExampleUnitTest { - - @Test - public void addition_isCorrect() throws Exception { - assertEquals(4, 2 + 2); - } -} diff --git a/mobile-wrapper/android/build.gradle b/mobile-wrapper/android/build.gradle deleted file mode 100644 index f1b3b0e..0000000 --- a/mobile-wrapper/android/build.gradle +++ /dev/null @@ -1,29 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. - -buildscript { - - repositories { - google() - mavenCentral() - } - dependencies { - classpath 'com.android.tools.build:gradle:8.7.2' - classpath 'com.google.gms:google-services:4.4.2' - - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files - } -} - -apply from: "variables.gradle" - -allprojects { - repositories { - google() - mavenCentral() - } -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/mobile-wrapper/android/capacitor.settings.gradle b/mobile-wrapper/android/capacitor.settings.gradle deleted file mode 100644 index 9e56504..0000000 --- a/mobile-wrapper/android/capacitor.settings.gradle +++ /dev/null @@ -1,9 +0,0 @@ -// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN -include ':capacitor-android' -project(':capacitor-android').projectDir = new File('../../node_modules/.pnpm/@capacitor+android@7.5.0_@capacitor+core@7.5.0/node_modules/@capacitor/android/capacitor') - -include ':capacitor-app' -project(':capacitor-app').projectDir = new File('../../node_modules/.pnpm/@capacitor+app@7.1.2_@capacitor+core@7.5.0/node_modules/@capacitor/app/android') - -include ':capacitor-browser' -project(':capacitor-browser').projectDir = new File('../../node_modules/.pnpm/@capacitor+browser@7.0.4_@capacitor+core@7.5.0/node_modules/@capacitor/browser/android') diff --git a/mobile-wrapper/android/gradle.properties b/mobile-wrapper/android/gradle.properties deleted file mode 100644 index 2e87c52..0000000 --- a/mobile-wrapper/android/gradle.properties +++ /dev/null @@ -1,22 +0,0 @@ -# Project-wide Gradle settings. - -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. - -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html - -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx1536m - -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true - -# AndroidX package structure to make it clearer which packages are bundled with the -# Android operating system, and which are packaged with your app's APK -# https://developer.android.com/topic/libraries/support-library/androidx-rn -android.useAndroidX=true diff --git a/mobile-wrapper/android/gradle/wrapper/gradle-wrapper.jar b/mobile-wrapper/android/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index a4b76b9..0000000 Binary files a/mobile-wrapper/android/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/mobile-wrapper/android/gradle/wrapper/gradle-wrapper.properties b/mobile-wrapper/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index c1d5e01..0000000 --- a/mobile-wrapper/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,7 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-all.zip -networkTimeout=10000 -validateDistributionUrl=true -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/mobile-wrapper/android/gradlew b/mobile-wrapper/android/gradlew deleted file mode 100755 index f5feea6..0000000 --- a/mobile-wrapper/android/gradlew +++ /dev/null @@ -1,252 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# SPDX-License-Identifier: Apache-2.0 -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -# This is normally unused -# shellcheck disable=SC2034 -APP_BASE_NAME=${0##*/} -# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - if ! command -v java >/dev/null 2>&1 - then - die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC2039,SC3045 - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC2039,SC3045 - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, -# and any embedded shellness will be escaped. -# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be -# treated as '${Hostname}' itself on the command line. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/mobile-wrapper/android/gradlew.bat b/mobile-wrapper/android/gradlew.bat deleted file mode 100644 index 9b42019..0000000 --- a/mobile-wrapper/android/gradlew.bat +++ /dev/null @@ -1,94 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem -@rem SPDX-License-Identifier: Apache-2.0 -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/mobile-wrapper/android/settings.gradle b/mobile-wrapper/android/settings.gradle deleted file mode 100644 index 3b4431d..0000000 --- a/mobile-wrapper/android/settings.gradle +++ /dev/null @@ -1,5 +0,0 @@ -include ':app' -include ':capacitor-cordova-android-plugins' -project(':capacitor-cordova-android-plugins').projectDir = new File('./capacitor-cordova-android-plugins/') - -apply from: 'capacitor.settings.gradle' \ No newline at end of file diff --git a/mobile-wrapper/android/variables.gradle b/mobile-wrapper/android/variables.gradle deleted file mode 100644 index 2c8e408..0000000 --- a/mobile-wrapper/android/variables.gradle +++ /dev/null @@ -1,16 +0,0 @@ -ext { - minSdkVersion = 23 - compileSdkVersion = 35 - targetSdkVersion = 35 - androidxActivityVersion = '1.9.2' - androidxAppCompatVersion = '1.7.0' - androidxCoordinatorLayoutVersion = '1.2.0' - androidxCoreVersion = '1.15.0' - androidxFragmentVersion = '1.8.4' - coreSplashScreenVersion = '1.0.1' - androidxWebkitVersion = '1.12.1' - junitVersion = '4.13.2' - androidxJunitVersion = '1.2.1' - androidxEspressoCoreVersion = '3.6.1' - cordovaAndroidVersion = '10.1.1' -} \ No newline at end of file diff --git a/mobile-wrapper/capacitor.config.ts b/mobile-wrapper/capacitor.config.ts deleted file mode 100644 index dec4924..0000000 --- a/mobile-wrapper/capacitor.config.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { CapacitorConfig } from "@capacitor/cli"; - -const config: CapacitorConfig = { - appId: "dev.srizan.helium.mobile", - appName: "Helium Mobile", - webDir: "dist", - server: { - androidScheme: "https", - }, -}; - -export default config; diff --git a/mobile-wrapper/index.html b/mobile-wrapper/index.html deleted file mode 100644 index 411564c..0000000 --- a/mobile-wrapper/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - Helium Mobile - - -
- - - diff --git a/mobile-wrapper/package.json b/mobile-wrapper/package.json deleted file mode 100644 index 8f94efd..0000000 --- a/mobile-wrapper/package.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "helium-mobile-wrapper", - "version": "0.1.0", - "private": true, - "type": "module", - "scripts": { - "dev": "vite", - "build": "tsc && vite build", - "preview": "vite preview", - "cap:sync": "cap sync", - "cap:android:add": "cap add android", - "cap:android:open": "cap open android", - "cap:android:run": "cap run android" - }, - "dependencies": { - "@capacitor/app": "^7.1.2", - "@capacitor/android": "^7.4.3", - "@capacitor/browser": "^7.0.2", - "@capacitor/core": "^7.4.3", - "react": "19.2.3", - "react-dom": "19.2.3" - }, - "devDependencies": { - "@capacitor/cli": "^7.4.3", - "@types/react": "^19.2.2", - "@types/react-dom": "^19.2.2", - "@vitejs/plugin-react": "^5.1.0", - "typescript": "^5.9.3", - "vite": "^7.2.2" - } -} diff --git a/mobile-wrapper/src/App.tsx b/mobile-wrapper/src/App.tsx deleted file mode 100644 index bf0541a..0000000 --- a/mobile-wrapper/src/App.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { Browser } from "@capacitor/browser"; - -const HELIUM_URL = "https://helium.srizan.dev"; -const HELIUM_CHROME_INTENT_URL = - "intent://helium.srizan.dev#Intent;scheme=https;package=com.android.chrome;end"; - -function isAndroid(): boolean { - return /android/i.test(navigator.userAgent); -} - -async function openHelium(): Promise { - if (isAndroid()) { - window.location.href = HELIUM_CHROME_INTENT_URL; - return; - } - - await Browser.open({ - url: HELIUM_URL, - presentationStyle: "fullscreen", - }); -} - -async function openHeliumFallback(): Promise { - await Browser.open({ - url: HELIUM_URL, - presentationStyle: "fullscreen", - }); -} - -function App() { - return ( -
-
-

Helium Android Wrapper

-

Open Helium with screen share support

-

- This wrapper launches Helium in a Chrome Custom Tab. On most Android - devices this gives the best chance for WebRTC screen sharing, - including audio when Android and Chrome allow it. -

- - - - - -

- If Chrome is not installed, use the fallback button. For audio capture, - update Chrome and Android, then enable audio in the system - screen-share picker. -

-
-
- ); -} - -export default App; diff --git a/mobile-wrapper/src/main.tsx b/mobile-wrapper/src/main.tsx deleted file mode 100644 index be363fd..0000000 --- a/mobile-wrapper/src/main.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { StrictMode } from "react"; -import { createRoot } from "react-dom/client"; -import App from "./App"; -import "./styles.css"; - -const rootElement = document.getElementById("root"); - -if (!rootElement) { - throw new Error("Root element not found"); -} - -createRoot(rootElement).render( - - - , -); diff --git a/mobile-wrapper/src/styles.css b/mobile-wrapper/src/styles.css deleted file mode 100644 index 4a3fcd7..0000000 --- a/mobile-wrapper/src/styles.css +++ /dev/null @@ -1,91 +0,0 @@ -:root { - font-family: "Manrope", "Segoe UI", sans-serif; - color: #1a2027; - background: radial-gradient(circle at 20% 20%, #e5f5ff 0%, #f4f8ff 45%, #f6f6f2 100%); -} - -* { - box-sizing: border-box; -} - -html, -body, -#root { - margin: 0; - min-height: 100%; -} - -.page { - min-height: 100vh; - display: grid; - place-items: center; - padding: 24px; -} - -.card { - width: min(560px, 100%); - border-radius: 20px; - background: rgba(255, 255, 255, 0.8); - border: 1px solid #d7e3f6; - box-shadow: 0 24px 80px -48px rgba(24, 78, 148, 0.45); - padding: 24px; - display: grid; - gap: 14px; -} - -.eyebrow { - margin: 0; - font-size: 0.8rem; - text-transform: uppercase; - letter-spacing: 0.06em; - color: #4e7ab3; - font-weight: 700; -} - -h1 { - margin: 0; - font-size: clamp(1.3rem, 4vw, 1.8rem); - line-height: 1.2; -} - -.lead, -.note { - margin: 0; - line-height: 1.5; -} - -.lead { - color: #2b3a4d; -} - -.note { - font-size: 0.9rem; - color: #4f5f73; -} - -.cta { - border: 0; - border-radius: 12px; - padding: 12px 16px; - width: fit-content; - font-size: 1rem; - font-weight: 700; - color: #fff; - background: linear-gradient(135deg, #2563eb, #0f67d2); - box-shadow: 0 10px 24px -12px rgba(15, 103, 210, 0.7); -} - -.cta:active { - transform: translateY(1px); -} - -.secondary { - border: 1px solid #c8d9ee; - border-radius: 12px; - padding: 11px 16px; - width: fit-content; - font-size: 0.95rem; - font-weight: 700; - color: #234669; - background: #f7fbff; -} diff --git a/mobile-wrapper/tsconfig.json b/mobile-wrapper/tsconfig.json deleted file mode 100644 index e967365..0000000 --- a/mobile-wrapper/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2022", - "useDefineForClassFields": true, - "lib": ["ES2022", "DOM", "DOM.Iterable"], - "module": "ESNext", - "skipLibCheck": true, - "moduleResolution": "Bundler", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true - }, - "include": ["src", "capacitor.config.ts", "vite.config.ts"] -} diff --git a/mobile-wrapper/vite.config.ts b/mobile-wrapper/vite.config.ts deleted file mode 100644 index 2fd0293..0000000 --- a/mobile-wrapper/vite.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig } from "vite"; -import react from "@vitejs/plugin-react"; - -export default defineConfig({ - base: "./", - plugins: [react()], -}); diff --git a/native-app/app.json b/native-app/app.json index 5be58dd..e6408b1 100644 --- a/native-app/app.json +++ b/native-app/app.json @@ -4,13 +4,31 @@ "slug": "helium-native", "scheme": "heliumnative", "version": "0.1.0", + "icon": "./assets/images/icon.png", "orientation": "portrait", - "userInterfaceStyle": "light", + "userInterfaceStyle": "automatic", "android": { - "package": "dev.srizan.helium.viewer" + "package": "dev.srizan.helium.viewer", + "adaptiveIcon": { + "foregroundImage": "./assets/images/adaptive-icon.png", + "backgroundColor": "#c026d3", + "monochromeImage": "./assets/images/adaptive-icon-monochrome.png" + } }, "plugins": [ - "expo-secure-store" + "expo-secure-store", + [ + "expo-splash-screen", + { + "backgroundColor": "#fdfbff", + "image": "./assets/images/splash-icon.png", + "imageWidth": 220, + "dark": { + "backgroundColor": "#1e1b2e", + "image": "./assets/images/splash-icon-dark.png" + } + } + ] ], "ios": { "bundleIdentifier": "dev.srizan.helium.viewer" diff --git a/native-app/assets/images/adaptive-icon-monochrome.png b/native-app/assets/images/adaptive-icon-monochrome.png new file mode 100644 index 0000000..beb3b17 Binary files /dev/null and b/native-app/assets/images/adaptive-icon-monochrome.png differ diff --git a/native-app/assets/images/adaptive-icon.png b/native-app/assets/images/adaptive-icon.png new file mode 100644 index 0000000..beb3b17 Binary files /dev/null and b/native-app/assets/images/adaptive-icon.png differ diff --git a/native-app/assets/images/icon.png b/native-app/assets/images/icon.png new file mode 100644 index 0000000..8860617 Binary files /dev/null and b/native-app/assets/images/icon.png differ diff --git a/native-app/assets/images/logo-brand.svg b/native-app/assets/images/logo-brand.svg new file mode 100644 index 0000000..09fcb77 --- /dev/null +++ b/native-app/assets/images/logo-brand.svg @@ -0,0 +1,18 @@ + + + + diff --git a/native-app/assets/images/logo-white.svg b/native-app/assets/images/logo-white.svg new file mode 100644 index 0000000..d0b06e5 --- /dev/null +++ b/native-app/assets/images/logo-white.svg @@ -0,0 +1,18 @@ + + + + diff --git a/native-app/assets/images/splash-icon-dark.png b/native-app/assets/images/splash-icon-dark.png new file mode 100644 index 0000000..0ec9652 Binary files /dev/null and b/native-app/assets/images/splash-icon-dark.png differ diff --git a/native-app/assets/images/splash-icon.png b/native-app/assets/images/splash-icon.png new file mode 100644 index 0000000..c143d57 Binary files /dev/null and b/native-app/assets/images/splash-icon.png differ diff --git a/native-app/package.json b/native-app/package.json index a94a7d0..1132891 100644 --- a/native-app/package.json +++ b/native-app/package.json @@ -14,6 +14,7 @@ "@clerk/clerk-expo": "^2.19.22", "expo": "^54.0.0", "expo-secure-store": "^15.0.0", + "expo-splash-screen": "~31.0.13", "react": "19.2.0", "react-native": "0.82.0", "react-native-url-polyfill": "^2.0.0", diff --git a/native-app/src/components/ui/Button.tsx b/native-app/src/components/ui/Button.tsx new file mode 100644 index 0000000..6f8f93c --- /dev/null +++ b/native-app/src/components/ui/Button.tsx @@ -0,0 +1,138 @@ +import React from "react"; +import { + ActivityIndicator, + Pressable, + PressableProps, + StyleSheet, + Text, + View, +} from "react-native"; + +import { useAppTheme } from "../../lib/theme"; + +interface ButtonProps extends PressableProps { + variant?: "default" | "secondary" | "destructive" | "outline" | "ghost"; + size?: "default" | "sm" | "lg" | "icon"; + label?: string; + loading?: boolean; + children?: React.ReactNode; +} + +export function Button({ + variant = "default", + size = "default", + label, + loading = false, + children, + style, + disabled, + ...props +}: ButtonProps) { + const theme = useAppTheme(); + + const getBackgroundColor = (pressed: boolean) => { + if (disabled) return theme.muted; + switch (variant) { + case "default": + return theme.primary; + case "destructive": + return theme.destructive; + case "secondary": + return theme.secondary; + case "outline": + case "ghost": + return pressed ? theme.accent : "transparent"; + default: + return theme.primary; + } + }; + + const getBorderColor = () => { + if (variant === "outline") return theme.input; + return "transparent"; + }; + + const getTextColor = () => { + if (disabled) return theme.mutedForeground; + switch (variant) { + case "default": + return theme.primaryForeground; + case "destructive": + return theme.destructiveForeground; + case "secondary": + return theme.secondaryForeground; + case "outline": + case "ghost": + return theme.foreground; + default: + return theme.primaryForeground; + } + }; + + const getPadding = () => { + switch (size) { + case "sm": + return { paddingVertical: 8, paddingHorizontal: 12 }; + case "lg": + return { paddingVertical: 12, paddingHorizontal: 32 }; + case "icon": + return { padding: 10, width: 40, height: 40, justifyContent: "center", alignItems: "center" } as const; + default: + return { paddingVertical: 10, paddingHorizontal: 16 }; + } + }; + + return ( + [ + styles.base, + { + backgroundColor: getBackgroundColor(pressed), + borderColor: getBorderColor(), + borderWidth: variant === "outline" ? 1 : 0, + opacity: pressed && variant !== "outline" && variant !== "ghost" ? 0.9 : 1, + }, + getPadding(), + style as any, + ]} + {...props} + > + {loading ? ( + + ) : ( + + {children ? ( + children + ) : ( + + {label} + + )} + + )} + + ); +} + +const styles = StyleSheet.create({ + base: { + flexDirection: "row", + alignItems: "center", + justifyContent: "center", + borderRadius: 8, // radius-md + }, + contentContainer: { + flexDirection: "row", + alignItems: "center", + gap: 8, + }, + text: { + fontWeight: "600", + }, +}); diff --git a/native-app/src/components/ui/Card.tsx b/native-app/src/components/ui/Card.tsx new file mode 100644 index 0000000..8ec80ae --- /dev/null +++ b/native-app/src/components/ui/Card.tsx @@ -0,0 +1,87 @@ +import React from "react"; +import { StyleSheet, Text, TextProps, View, ViewProps } from "react-native"; + +import { useAppTheme } from "../../lib/theme"; + +export function Card({ style, ...props }: ViewProps) { + const theme = useAppTheme(); + return ( + + ); +} + +export function CardHeader({ style, ...props }: ViewProps) { + return ; +} + +export function CardTitle({ style, ...props }: TextProps) { + const theme = useAppTheme(); + return ( + + ); +} + +export function CardDescription({ style, ...props }: TextProps) { + const theme = useAppTheme(); + return ( + + ); +} + +export function CardContent({ style, ...props }: ViewProps) { + return ; +} + +export function CardFooter({ style, ...props }: ViewProps) { + return ; +} + +const styles = StyleSheet.create({ + card: { + borderRadius: 12, // radius-xl + borderWidth: 1, + overflow: "hidden", + }, + header: { + padding: 18, + gap: 4, + }, + title: { + fontSize: 20, + fontWeight: "700", + letterSpacing: -0.5, + }, + description: { + fontSize: 14, + }, + content: { + paddingHorizontal: 18, + paddingBottom: 18, + }, + footer: { + padding: 18, + paddingTop: 0, + flexDirection: "row", + alignItems: "center", + }, +}); diff --git a/native-app/src/components/ui/Input.tsx b/native-app/src/components/ui/Input.tsx new file mode 100644 index 0000000..83345f7 --- /dev/null +++ b/native-app/src/components/ui/Input.tsx @@ -0,0 +1,55 @@ +import React from "react"; +import { StyleSheet, TextInput, TextInputProps, View, Text } from "react-native"; + +import { useAppTheme } from "../../lib/theme"; + +interface InputProps extends TextInputProps { + label?: string; + error?: string; +} + +export function Input({ label, error, style, ...props }: InputProps) { + const theme = useAppTheme(); + + return ( + + {label && {label}} + + {error && {error}} + + ); +} + +const styles = StyleSheet.create({ + container: { + gap: 8, + marginBottom: 16, + }, + label: { + fontSize: 14, + fontWeight: "500", + }, + input: { + height: 40, // h-10 + borderWidth: 1, + borderRadius: 8, // radius-md + paddingHorizontal: 12, + fontSize: 14, + }, + error: { + fontSize: 12, + marginTop: 4, + }, +}); diff --git a/native-app/src/components/ui/index.ts b/native-app/src/components/ui/index.ts new file mode 100644 index 0000000..000b8ef --- /dev/null +++ b/native-app/src/components/ui/index.ts @@ -0,0 +1,3 @@ +export * from "./Button"; +export * from "./Card"; +export * from "./Input"; diff --git a/native-app/src/i18n/messages.ts b/native-app/src/i18n/messages.ts index 6d61f15..fff48cd 100644 --- a/native-app/src/i18n/messages.ts +++ b/native-app/src/i18n/messages.ts @@ -93,43 +93,43 @@ export const messages: Record = { }, es: { missingClerkKey: "Falta EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY", - appTitle: "Helium Nativo", - signInSubtitle: "Inicia sesion con Clerk", + appTitle: "Helium (Android)", + signInSubtitle: "Inicia sesión con Clerk", email: "Correo", - password: "Contrasena", - signIn: "Iniciar sesion", - signingIn: "Iniciando sesion...", - signedIn: "Sesion iniciada", - signInFailed: "Error al iniciar sesion", + password: "Contraseña", + signIn: "Iniciar sesión", + signingIn: "Iniciando sesión...", + signedIn: "Sesión iniciada", + signInFailed: "Error al iniciar sesión", needsExtraStep: "Falta un paso adicional: {status}", - loadingPresets: "Cargando presets", + loadingPresets: "Cargando ajustes predefinidos", couldNotReadToken: "No se pudo leer el token", - noPresetsFound: "No se encontraron presets", + noPresetsFound: "No se encontraron ajustes predefinidos", loadedIceServers: "Se cargaron {count} entradas ICE", - failedToLoadPresets: "Error al cargar presets: {message}", + failedToLoadPresets: "Error al cargar ajustes predefinidos: {message}", failedToParsePreset: "Error al parsear ICE del preset", streamerTitle: "Helium Emisor", streamerSubtitle: "Comparte la pantalla de Android con Helium", preset: "Preset", - session: "Sesion", + session: "Sesión", status: "Estado", viewers: "Espectadores", defaultLabel: "predeterminado", startShare: "Iniciar pantalla", stop: "Detener", - signOut: "Cerrar sesion", + signOut: "Cerrar sesión", previewActive: "Captura activa. Vista previa desactivada para menor latencia.", previewIdle: "Inicia la captura para transmitir esta pantalla", statusIdle: "En espera", statusStopped: "Detenido", - statusNoPreset: "No hay preset seleccionado", + statusNoPreset: "No hay ajuste predefinido seleccionado", statusRequestingCapture: "Solicitando captura de pantalla", statusNoVideoTrack: "La captura inicio sin pista de video", statusCapturing: "Capturando {video} video / {audio} audio", - statusConnectingSignaling: "Conectando senalizacion", + statusConnectingSignaling: "Conectando señalización", statusCreatingRoom: "Creando sala", - statusRoomCreated: "Codigo de sala: {roomId}", - statusViewerJoined: "Se unio un espectador", + statusRoomCreated: "Código de sala: {roomId}", + statusViewerJoined: "Se unió un espectador", statusPeerState: "Estado del peer: {state}", statusWebsocketError: "Error de WebSocket", statusWebsocketClosed: "WebSocket cerrado", diff --git a/native-app/src/lib/theme.ts b/native-app/src/lib/theme.ts index 2c273c1..43d6203 100644 --- a/native-app/src/lib/theme.ts +++ b/native-app/src/lib/theme.ts @@ -14,41 +14,62 @@ export interface AppTheme { secondaryForeground: string; accent: string; destructive: string; + destructiveForeground: string; } const lightTheme: AppTheme = { - background: "#f0eff5", - foreground: "#4f4c64", - card: "#eceaf2", - border: "#e1dee9", - input: "#dfdce8", - muted: "#e7e5ee", - mutedForeground: "#66637d", - primary: "#a43ad7", - primaryForeground: "#ffffff", - secondary: "#be9bcd", - secondaryForeground: "#3f3452", - accent: "#d0cee0", - destructive: "#b4435a", + background: "#FAFAFA", // slightly off-white + foreground: "#09090b", // zinc-950 + card: "#FFFFFF", + border: "#E4E4E7", // zinc-200 + input: "#E4E4E7", + muted: "#F4F4F5", // zinc-100 + mutedForeground: "#71717A", // zinc-500 + primary: "#c026d3", // fuchsia-600 + primaryForeground: "#FFFFFF", + secondary: "#F4F4F5", // zinc-100 + secondaryForeground: "#18181B", // zinc-900 + accent: "#F4F4F5", + destructive: "#EF4444", // red-500 + destructiveForeground: "#FFFFFF", }; const darkTheme: AppTheme = { - background: "#30273b", - foreground: "#e4deec", - card: "#2a2234", - border: "#494055", - input: "#534a5f", - muted: "#3b3347", - mutedForeground: "#bbb3c7", - primary: "#d28ee8", - primaryForeground: "#48245f", - secondary: "#6d4a82", - secondaryForeground: "#eadcf1", - accent: "#5a5268", - destructive: "#d46f7a", + background: "#18181b", // zinc-950 (or slight purple tint per brand: #1a1625) + foreground: "#FAFAFA", // zinc-50 + card: "#18181b", // Matches background often in shadcn default, or slightly lighter + border: "#27272A", // zinc-800 + input: "#27272A", + muted: "#27272A", + mutedForeground: "#A1A1AA", // zinc-400 + primary: "#d946ef", // fuchsia-500 + primaryForeground: "#1a1625", + secondary: "#27272A", + secondaryForeground: "#FAFAFA", + accent: "#27272A", + destructive: "#7F1D1D", // red-900 + destructiveForeground: "#FFFFFF", +}; + +// Override with specific brand colors from oklch analysis if needed +const brandLightTheme = { + ...lightTheme, + background: "#fdfbff", // slightly purple white + primary: "#c026d3", + secondary: "#f5f3ff", // light violet +}; + +const brandDarkTheme = { + ...darkTheme, + background: "#1e1b2e", // Deep purple/slate + card: "#1e1b2e", + border: "#2e2a45", + input: "#2e2a45", + muted: "#2e2a45", + primary: "#e879f9", // bright fuchsia }; export function useAppTheme(): AppTheme { const colorScheme = useColorScheme(); - return colorScheme === "dark" ? darkTheme : lightTheme; + return colorScheme === "dark" ? brandDarkTheme : brandLightTheme; } diff --git a/native-app/src/screens/SignInScreen.tsx b/native-app/src/screens/SignInScreen.tsx index 861a9f1..6736f94 100644 --- a/native-app/src/screens/SignInScreen.tsx +++ b/native-app/src/screens/SignInScreen.tsx @@ -1,16 +1,18 @@ import { useState } from "react"; import { useSignIn } from "@clerk/clerk-expo"; import { - ActivityIndicator, - Pressable, + KeyboardAvoidingView, + Platform, StyleSheet, Text, - TextInput, View, } from "react-native"; import { useAppTheme } from "../lib/theme"; import { useI18n } from "../i18n/I18nProvider"; +import { Button } from "../components/ui/Button"; +import { Input } from "../components/ui/Input"; +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../components/ui/Card"; export function SignInScreen() { const theme = useAppTheme(); @@ -48,42 +50,52 @@ export function SignInScreen() { return ( - {t("appTitle")} - {t("signInSubtitle")} - - - - - { - void onSignIn(); - }} - style={styles.button} + - {isLoaded ? ( - {t("signIn")} - ) : ( - - )} - + + + {t("appTitle")} + + {t("signInSubtitle")} + + + + + - {status} + + + ); })} - - + + - - {t("session")} - {t("status")}: {t(statusKey, statusParams)} - {t("viewers")}: {viewerCount} - {roomCode || "------"} + + + {t("session")} + + {t("status")}: {t(statusKey, statusParams)} • {t("viewers")}: {viewerCount} + + + + + {roomCode || "------"} + - - { - void startSharing(); - }} - style={styles.primaryButton} - > - {t("startShare")} - - - - {t("stop")} - - - + +