Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
dbeef62
Refactor project structure for compose migration
raresvanca Dec 20, 2025
8bd15b6
New Compose slate
raresvanca Jan 24, 2026
35c6f7b
Application Core Logic Migration
raresvanca Jan 24, 2026
ef7a8d3
About screen
raresvanca Jan 24, 2026
c591928
Settings screen
raresvanca Jan 24, 2026
41fb49d
Manual connection dialog
raresvanca Jan 24, 2026
70e44b8
Expandable Segmented List Item
raresvanca Jan 24, 2026
f81cb4a
Tooltip Icon Button
raresvanca Jan 24, 2026
c93b282
Warpinator Icon Outline
raresvanca Jan 24, 2026
13353dd
Home menu
raresvanca Jan 24, 2026
fc6ef2a
Remotes pane
raresvanca Jan 24, 2026
f925691
Transfers pane
raresvanca Jan 24, 2026
5cdcf6f
Home screen
raresvanca Jan 24, 2026
70d98ad
Unit tests
raresvanca Jan 24, 2026
e8b5926
Swipe transfer
raresvanca Jan 24, 2026
0830169
Power manager singleton
raresvanca Jan 24, 2026
04ab035
Detach the repository from Server
raresvanca Jan 24, 2026
e7ca591
Notifications manager migration
raresvanca Jan 24, 2026
3648fc5
Preference manager migration
raresvanca Jan 25, 2026
d59c3cb
Reconnect logic
raresvanca Feb 16, 2026
ca0d8f8
Migrating text sending
raresvanca Feb 26, 2026
14deb0a
Messaging UI
raresvanca Feb 26, 2026
e3cbde0
Share dialog and functionality + Intent handler
raresvanca Feb 26, 2026
e5d9798
Enhance message pane and bubble behavior
raresvanca Feb 28, 2026
983608a
Home screen window insets handling
raresvanca Feb 28, 2026
3bec668
Manual connection dialog state management improvements
raresvanca Mar 1, 2026
932a825
MenuGroupsPopup component extraction
raresvanca Mar 1, 2026
e9b2453
Share dialog UI enhancements and manual connection support
raresvanca Mar 1, 2026
9602228
Add theme and message integration settings
raresvanca Mar 2, 2026
1a93872
Integrated messages into the transfers pane.
raresvanca Mar 2, 2026
a438e55
Refactor MenuGroupsPopup and add message deletion support
raresvanca Mar 2, 2026
33e645a
Message notifications + inhibitions + intent handling
raresvanca Mar 4, 2026
8d39d45
Unified UI messaging system
raresvanca Mar 6, 2026
79da865
Filter out remotes with group code errors from UI list
raresvanca Mar 6, 2026
8162d15
Log saving and reannounce functionality
raresvanca Mar 6, 2026
b504cae
Improve accessibility with semantics and labels
raresvanca Mar 7, 2026
6204e05
String resource refactoring and localization updates
raresvanca Mar 8, 2026
1d2b25d
Support for Chromebooks, Android Laptops, multi window mode and deskt…
raresvanca Mar 11, 2026
26c7af5
Manual connection bug fix
raresvanca Mar 18, 2026
e361029
Fix NavigableListDetailPaneScaffold not reacting to changes, so force…
raresvanca Mar 18, 2026
97d64e9
Fix: Return VoidType for text message transmission
raresvanca Mar 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 62 additions & 16 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
apply plugin: 'com.android.application'
apply plugin: 'com.google.protobuf'
apply plugin: 'org.jetbrains.kotlin.android'
apply plugin: 'org.jetbrains.kotlin.plugin.compose'
apply plugin: 'kotlin-parcelize'
apply plugin: 'org.jetbrains.kotlin.plugin.serialization'
apply plugin: 'com.google.devtools.ksp'
apply plugin: 'com.google.dagger.hilt.android'

android {
compileSdkVersion 36

defaultConfig {
applicationId 'slowscript.warpinator'
minSdkVersion 21 //Required by NSD (attributes)
targetSdkVersion 35
minSdkVersion 23 // Required by compose
targetSdkVersion 36
versionCode 1090
versionName "1.9"
}
Expand All @@ -18,6 +24,11 @@ android {
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}

buildFeatures {
compose true
}

compileOptions {
sourceCompatibility = 17
targetCompatibility = 17
Expand All @@ -28,41 +39,70 @@ android {
}
}
namespace 'slowscript.warpinator'
kotlinOptions {
jvmTarget = '17'
}
buildFeatures {
buildConfig true
}

androidResources {
generateLocaleConfig true
}
}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])

implementation 'androidx.appcompat:appcompat:1.7.1'
implementation 'androidx.core:core:1.17.0'
implementation 'androidx.constraintlayout:constraintlayout:2.2.1'
implementation 'androidx.documentfile:documentfile:1.1.0'
implementation 'com.google.android.material:material:1.13.0'
implementation 'androidx.recyclerview:recyclerview:1.4.0'
implementation 'androidx.cardview:cardview:1.0.0'
// Jetpack Compose
def composeBom = platform('androidx.compose:compose-bom-alpha:2025.12.01')
implementation composeBom

implementation 'androidx.compose.ui:ui-tooling-preview'
debugImplementation 'androidx.compose.ui:ui-tooling'
implementation 'androidx.activity:activity-compose'

// Material 3 Implementations
implementation 'androidx.compose.material3:material3'
implementation 'androidx.compose.material3.adaptive:adaptive'
implementation 'androidx.compose.material3.adaptive:adaptive-layout'
implementation 'androidx.compose.material3.adaptive:adaptive-navigation'
implementation 'androidx.compose.material:material-icons-extended'

// State management
implementation 'androidx.lifecycle:lifecycle-viewmodel-compose'
implementation 'androidx.lifecycle:lifecycle-service'
implementation 'com.google.dagger:hilt-android:2.57.2'
ksp 'com.google.dagger:hilt-compiler:2.57.2'
implementation 'androidx.hilt:hilt-navigation-compose:1.3.0'

implementation 'org.openjax.security:nacl:0.3.2' //Update available, but API is weird now
implementation 'org.bouncycastle:bcpkix-jdk15to18:1.82'
implementation 'io.grpc:grpc-netty:1.75.0'
implementation 'io.grpc:grpc-okhttp:1.75.0'
implementation ('io.grpc:grpc-protobuf:1.75.0') {
implementation('io.grpc:grpc-protobuf:1.75.0') {
exclude group: 'com.google.api.grpc', module: 'proto-google-common-protos'
}
implementation 'io.grpc:grpc-stub:1.75.0'
implementation 'io.grpc:grpc-kotlin-stub:1.5.0'
implementation("com.google.protobuf:protobuf-kotlin:3.25.8")
implementation 'javax.annotation:javax.annotation-api:1.3.2'
implementation 'org.conscrypt:conscrypt-android:2.5.3'

implementation 'com.github.tony19:logback-android:3.0.0'
implementation 'androidx.preference:preference:1.2.1'
implementation 'com.google.guava:guava:33.4.8-android' //This was included by gRPC anyway, so why not use it
implementation 'org.jmdns:jmdns:3.5.8' //Device discovery worsened after update, let's see if this was the problem
// Also, new versions require desugaring on Android 5 and 6
implementation 'com.google.guava:guava:33.4.8-android'
//This was included by gRPC anyway, so why not use it
implementation 'org.jmdns:jmdns:3.5.8'
//Device discovery worsened after update, let's see if this was the problem
// Also, new versions require desugaring on Android 5 and 6
implementation 'org.slf4j:slf4j-api:2.0.17' // For jmdns, it declares a too old dependency
implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.1.0'
implementation 'com.google.zxing:core:3.5.3'

implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.9.0"

testImplementation 'junit:junit:4.13.2'
}

protobuf {
Expand All @@ -73,21 +113,27 @@ protobuf {
grpc {
artifact = 'io.grpc:protoc-gen-grpc-java:1.75.0'
}

grpckt {
artifact = "io.grpc:protoc-gen-grpc-kotlin:1.5.0:jdk8@jar"
}
}
generateProtoTasks {
all().each { task ->
task.builtins {
java { }
java {}
kotlin {}
}
task.plugins {
grpc { }
grpc {}
grpckt {}
}
}
}
}

//If there is a better way to get rid of Netty logging, let me know
configurations.all {
configurations.configureEach {
resolutionStrategy {
dependencySubstitution {
substitute module('ch.qos.logback:logback-classic') using module('com.github.tony19:logback-android:3.0.0')
Expand Down
90 changes: 48 additions & 42 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,23 +11,31 @@
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29"/>
<uses-feature android:name="android.hardware.wifi" android:required="false"/>
<uses-feature android:name="android.hardware.faketouch" android:required="false"/>
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="29" />

<uses-feature
android:name="android.hardware.wifi"
android:required="false" />
<uses-feature
android:name="android.hardware.faketouch"
android:required="false" />

<application
android:name=".app.WarpinatorApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:requestLegacyExternalStorage="true"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:name=".WarpinatorApp">
android:supportsRtl="true">

<receiver
android:name="slowscript.warpinator.Autostart"
android:name="slowscript.warpinator.core.utils.Autostart"
android:enabled="true"
android:exported="false">
<intent-filter>
Expand All @@ -41,34 +49,14 @@
</intent-filter>
</receiver>

<activity android:name=".AboutActivity"
android:label="@string/about"
android:theme="@style/AppTheme.NoActionBar" />

<activity android:name=".ShareActivity"
android:theme="@style/AppTheme.NoActionBar"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.SEND_MULTIPLE" />

<category android:name="android.intent.category.DEFAULT" />

<data android:mimeType="*/*" />
</intent-filter>
</activity>

<activity android:name=".SettingsActivity"
android:label="@string/settings"
android:theme="@style/AppTheme.NoActionBar" />

<activity android:name=".TransfersActivity"
android:theme="@style/AppTheme.NoActionBar" />

<activity android:name=".MainActivity"
<activity
android:name=".app.MainActivity"
android:exported="true"
android:theme="@style/AppTheme.NoActionBar"
android:launchMode="singleTask">
android:launchMode="singleTask"
android:theme="@style/Theme.Warpinator"
android:resizeableActivity="true"
android:windowSoftInputMode="adjustResize"
tools:targetApi="24">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

Expand All @@ -77,32 +65,50 @@
<intent-filter>
<data android:scheme="warpinator" />
<action android:name="android.intent.action.VIEW" />

<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
<intent-filter>
<action android:name="android.service.quicksettings.action.QS_TILE_PREFERENCES" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.SEND_MULTIPLE" />

<category android:name="android.intent.category.DEFAULT" />

<data android:mimeType="*/*" />
</intent-filter>

<meta-data
android:name="WindowManagerPreference:SuppressWindowControlNavigationButton"
android:value="true" />
</activity>

<receiver android:name=".MainService$StopSvcReceiver"
<receiver
android:name=".core.service.StopSvcReceiver"
android:exported="false">
<intent-filter>
<action android:name="StopSvc" />
</intent-filter>
</receiver>

<service android:name=".MainService"
android:foregroundServiceType="dataSync"/>
<service
android:name=".core.service.MainService"
android:description="@string/main_service_description"
android:foregroundServiceType="dataSync" />

<service android:name=".TileMainService"
<service
android:name=".core.service.TileMainService"
android:exported="true"
android:label="@string/app_name"
android:icon="@drawable/ic_notification"
android:label="@string/app_name"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE"
tools:targetApi="n">
tools:targetApi="24">

<meta-data android:name="android.service.quicksettings.TOGGLEABLE_TILE"
<meta-data
android:name="android.service.quicksettings.TOGGLEABLE_TILE"
android:value="true" />

<intent-filter>
Expand Down
50 changes: 0 additions & 50 deletions app/src/main/java/slowscript/warpinator/AboutActivity.java

This file was deleted.

Loading