Skip to content

Commit 2641d60

Browse files
update: workflow
2 parents dc3732e + 2bfc15c commit 2641d60

26 files changed

+985
-96
lines changed

.github/workflows/rep-build.yml

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
name: Reproducible Build Check
2+
3+
on: [push, pull_request]
4+
5+
jobs:
6+
verify-reproducibility:
7+
runs-on: ubuntu-latest
8+
steps:
9+
- name: Checkout Source
10+
uses: actions/checkout@v4
11+
12+
- name: Set up Docker Buildx
13+
uses: docker/setup-buildx-action@v3
14+
15+
# --- Build 1 ---
16+
- name: Build First APK
17+
uses: docker/build-push-action@v5
18+
with:
19+
context: .
20+
target: apk-builder
21+
tags: app:build-one
22+
outputs: type=docker,dest=/tmp/image1.tar
23+
cache-from: type=gha # Uses GitHub Actions native cache
24+
cache-to: type=gha,mode=max
25+
26+
- name: Extract Build 1 APK
27+
run: |
28+
docker load -i /tmp/image1.tar
29+
docker create --name container1 app:build-one
30+
# Find the APK regardless of the exact flavor path and copy it out
31+
APK_PATH=$(docker run --rm app:build-one find /android -name "*-unsigned.apk" | head -n 1)
32+
docker cp container1:$APK_PATH ./build1.apk
33+
sha256sum build1.apk > hash1.txt
34+
35+
# --- Build 2 (Sequential to save RAM) ---
36+
- name: Build Second APK
37+
uses: docker/build-push-action@v5
38+
with:
39+
context: .
40+
target: apk-builder
41+
tags: app:build-two
42+
outputs: type=docker,dest=/tmp/image2.tar
43+
# We force a re-run of the build layer by passing a dummy arg or using no-cache
44+
# on the final stage if needed, but usually, a clean build is better.
45+
cache-from: type=gha
46+
47+
- name: Extract Build 2 APK
48+
run: |
49+
docker load -i /tmp/image2.tar
50+
docker create --name container2 app:build-two
51+
APK_PATH=$(docker run --rm app:build-two find /android -name "*-unsigned.apk" | head -n 1)
52+
docker cp container2:$APK_PATH ./build2.apk
53+
sha256sum build2.apk > hash2.txt
54+
55+
# --- Comparison ---
56+
- name: Compare Results
57+
run: |
58+
echo "HASH 1: $(cat hash1.txt)"
59+
echo "HASH 2: $(cat hash2.txt)"
60+
if diff hash1.txt hash2.txt; then
61+
echo "Build is Reproducible!"
62+
else
63+
echo "Build is NOT Reproducible!"
64+
exit 1
65+
fi
66+
67+
# Diagnostic tool in case of failure
68+
- name: Run Diffoscope on Mismatch
69+
if: failure()
70+
run: |
71+
sudo apt-get update && sudo apt-get install -y diffoscope
72+
diffoscope build1.apk build2.apk

.idea/vcs.xml

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Dockerfile

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,35 @@
1+
# --- Stage 1: Base Environment ---
12
FROM ubuntu:22.04 AS base
3+
RUN apt-get update && apt-get install -y openjdk-17-jdk wget unzip && rm -rf /var/lib/apt/lists/*
24

3-
RUN apt update && apt install -y openjdk-17-jdk openjdk-17-jre android-sdk sdkmanager
5+
ENV ANDROID_HOME="/opt/android-sdk"
6+
ENV PATH="${PATH}:${ANDROID_HOME}/cmdline-tools/latest/bin:${ANDROID_HOME}/platform-tools"
47

5-
WORKDIR /android
6-
7-
COPY . .
8-
9-
ENV ANDROID_HOME "/usr/lib/android-sdk/"
10-
ENV PATH "${PATH}:${ANDROID_HOME}tools/:${ANDROID_HOME}platform-tools/"
11-
# ENV GRADLE_OPTS "-Xmx2048m"
8+
# Install Android SDK Tools
9+
RUN mkdir -p ${ANDROID_HOME}/cmdline-tools && \
10+
wget -q https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip -O /tmp/tools.zip && \
11+
unzip /tmp/tools.zip -d ${ANDROID_HOME}/cmdline-tools && \
12+
mv ${ANDROID_HOME}/cmdline-tools/cmdline-tools ${ANDROID_HOME}/cmdline-tools/latest && \
13+
rm /tmp/tools.zip
1214

13-
RUN yes | sdkmanager --licenses
15+
# Pre-install specific versions for reproducibility
16+
RUN yes | sdkmanager --licenses && \
17+
sdkmanager "platforms;android-33" "build-tools;33.0.0" "platform-tools"
1418

15-
ENV PASS=""
16-
ENV MIN_SDK=""
17-
18-
# CMD ./gradlew assembleDebug
19-
FROM base as apk-builder
20-
CMD ./gradlew assembleRelease && \
21-
apksigner sign --ks app/keys/app-release-key.jks \
22-
--ks-pass pass:$PASS \
23-
--in app/build/outputs/apk/release/app-release-unsigned.apk \
24-
--out app/build/outputs/apk/release/app-release.apk
19+
WORKDIR /android
2520

26-
FROM base as bundle-builder
27-
CMD ./gradlew assemble bundleRelease && \
28-
apksigner sign --ks app/keys/app-release-key.jks \
29-
--ks-pass pass:$PASS \
30-
--in app/build/outputs/bundle/release/app-release.aab \
31-
--out app/build/outputs/bundle/release/app-bundle.aab \
32-
--min-sdk-version $MIN_SDK
21+
# --- Stage 2: Cache Gradle ---
22+
COPY gradlew .
23+
COPY gradle gradle
24+
COPY build.gradle .
25+
COPY settings.gradle .
26+
COPY app/build.gradle app/
27+
RUN ./gradlew --no-daemon dependencies
3328

34-
# CMD cp app/build/outputs/apk/debug/app-debug.apk /apkbuilds/
35-
# CMD sha256sum app/build/outputs/apk/debug/app-debug.apk
29+
# --- Stage 3: Build APK ---
30+
FROM base AS apk-builder
31+
COPY . .
32+
# Fixed timestamp for reproducible ZIP/APK entries
33+
ENV SOURCE_DATE_EPOCH=1709834400
34+
# Run the build during the 'docker build' phase so it's saved in the image
35+
RUN ./gradlew assembleRelease --no-daemon

Makefile

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
# pass=$$(cat $(jks_pass))
2-
pass=$(jks_pass)
1+
pass=$$(cat ks.passwd)
32
branch_name=$$(git symbolic-ref HEAD)
43

54
branch=$$(git symbolic-ref HEAD | cut -d "/" -f 3)
@@ -93,7 +92,7 @@ test-flight:
9392
) \
9493
fi
9594

96-
release-cd: test-flight clean requirements.txt bump_version docker-build-aab clean
95+
release-cd: requirements.txt bump_version docker-build-aab
9796
@echo "+ Target branch for relase: ${branch}"
9897
@git tag -f ${tagVersion}
9998
@git push origin ${branch_name}

app/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ android {
114114
dependencies {
115115
implementation project(':smswithoutborders_libsignal-doubleratchet')
116116
// implementation project(':smswithoutborders_libsmsmms:lib_smsmms_android')
117-
implementation 'com.github.smswithoutborders:lib_smsmms_android:12cee57'
117+
implementation 'com.github.smswithoutborders:lib_smsmms_android:8ccccf4'
118118

119119
implementation libs.androidx.room.testing
120120
implementation libs.androidx.activity

app/src/main/AndroidManifest.xml

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,9 @@
66
android:name="android.hardware.telephony"
77
android:required="false" />
88

9-
<uses-permission android:name="android.permission.READ_CONTACTS" />
10-
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
11-
<uses-permission android:name="android.permission.READ_SMS" />
12-
<uses-permission android:name="android.permission.RECEIVE_SMS" />
13-
<uses-permission android:name="android.permission.SEND_SMS" />
14-
<uses-permission android:name="android.permission.RECEIVE_MMS" />
15-
<uses-permission android:name="android.permission.RECEIVE_WAP_PUSH" />
169
<uses-permission android:name="android.permission.INTERNET" />
17-
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
18-
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
19-
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
20-
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
21-
<uses-permission android:name="android.permission.CALL_PHONE" />
22-
2310
<uses-permission android:name="android.permission.READ_LOGS" />
2411
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
25-
26-
<uses-permission android:name="android.permission.WRITE_SMS"/>
2712
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
2813
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
2914
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

app/src/main/java/com/afkanerd/deku/DefaultSMS/receivers/SmsMmsNotificationReceiver.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ class SmsMmsNotificationReceiver: BroadcastReceiver() {
126126
EncryptionController.MessageRequestType.TYPE_REQUEST
127127
) {
128128
context.removeEncryptionRatchetStates(conversation.sms?.address!!)
129+
context.removeEncryptionModeStates(conversation.sms?.address!!)
129130
}
130131

131132
EncryptionController.receiveRequest(

app/src/main/java/com/afkanerd/deku/DefaultSMS/ui/SecureConversationComposable.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ fun SecureConversationComposable(viewModel: SecureConversationViewModel ) {
3434
viewModel.setModal(true)
3535
}
3636
else if(currentState.mode
37-
== EncryptionController.SecureRequestMode.REQUEST_ACCEPTED &&
37+
== EncryptionController.SecureRequestMode.REQUEST_ACCEPTED ||
3838
!ratchetState.isNullOrEmpty()
3939
) {
4040
viewModel.mode = EncryptionController.SecureRequestMode.REQUEST_ACCEPTED

app/src/main/java/com/afkanerd/deku/MainActivity.kt

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import androidx.activity.compose.setContent
77
import androidx.activity.enableEdgeToEdge
88
import androidx.activity.viewModels
99
import androidx.appcompat.app.AppCompatActivity
10+
import androidx.appcompat.app.AppCompatDelegate
1011
import androidx.compose.foundation.layout.fillMaxSize
1112
import androidx.compose.material3.DropdownMenuItem
1213
import androidx.compose.material3.MaterialTheme
@@ -28,14 +29,17 @@ import com.afkanerd.deku.DefaultSMS.ui.components.KeyExchangeType
2829
import com.afkanerd.deku.DefaultSMS.ui.viewModels.SecureConversationViewModel
2930
import com.afkanerd.deku.RemoteListeners.Models.RemoteListener.RemoteListenerQueuesViewModel
3031
import com.afkanerd.deku.RemoteListeners.Models.RemoteListener.RemoteListenersViewModel
32+
import com.afkanerd.deku.RemoteListeners.ui.RMQAddComposable
3133
import com.afkanerd.deku.RemoteListeners.ui.RMQMainComposable
34+
import com.afkanerd.deku.RemoteListeners.ui.RMQQueuesComposable
3235
import com.afkanerd.deku.Router.ui.GatewayClientsMainView
3336
import com.afkanerd.deku.Router.ui.RoutedMessagesMainView
3437
import com.afkanerd.deku.Router.ui.viewModels.GatewayServerViewModel
3538
import com.afkanerd.lib_smsmms_android.R
3639
import com.afkanerd.smswithoutborders_libsmsmms.extensions.context.NEW_NOTIFICATION_ACTION
3740
import com.afkanerd.smswithoutborders_libsmsmms.extensions.context.getDatabase
3841
import com.afkanerd.smswithoutborders_libsmsmms.extensions.context.makeE16PhoneNumber
42+
import com.afkanerd.smswithoutborders_libsmsmms.extensions.context.settingsGetTheme
3943
import com.afkanerd.smswithoutborders_libsmsmms.ui.components.NavHostControllerInstance
4044
import com.afkanerd.smswithoutborders_libsmsmms.ui.navigation.ConversationsScreenNav
4145
import com.afkanerd.smswithoutborders_libsmsmms.ui.viewModels.SearchViewModel
@@ -107,7 +111,7 @@ class MainActivity : AppCompatActivity(){
107111
)
108112
},
109113
onClick = {
110-
navController.navigate(RemoteForwardingScreen)
114+
navController.navigate(RemoteListenersScreen)
111115
it(false)
112116
}
113117
)
@@ -135,6 +139,7 @@ class MainActivity : AppCompatActivity(){
135139
},
136140
onClick = {
137141
secureViewModel.setModal(true)
142+
it(false)
138143
}
139144
)
140145
},
@@ -147,6 +152,18 @@ class MainActivity : AppCompatActivity(){
147152
KeyExchangeType(it)
148153
}
149154
) {
155+
composable<RemoteListenersQueuesScreen> {
156+
RMQQueuesComposable(
157+
remoteListenersViewModel = remoteListenersViewModel,
158+
navController = navController
159+
)
160+
}
161+
composable<RemoteListenersAddScreen> {
162+
RMQAddComposable(
163+
remoteListenerViewModel = remoteListenersViewModel,
164+
navController = navController
165+
)
166+
}
150167
composable<RemoteListenersScreen> {
151168
RMQMainComposable(
152169
remoteListenerViewModel = remoteListenersViewModel,
@@ -221,4 +238,9 @@ class MainActivity : AppCompatActivity(){
221238
}
222239
}
223240
}
241+
242+
override fun onResume() {
243+
super.onResume()
244+
AppCompatDelegate.setDefaultNightMode(settingsGetTheme)
245+
}
224246
}

app/src/main/java/com/afkanerd/deku/Router/ui/modals/GatewayClientAddModal.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ import androidx.compose.foundation.layout.fillMaxWidth
66
import androidx.compose.foundation.layout.padding
77
import androidx.compose.foundation.text.KeyboardOptions
88
import androidx.compose.material3.Button
9-
import androidx.compose.material3.ButtonDefaults
109
import androidx.compose.material3.ExperimentalMaterial3Api
1110
import androidx.compose.material3.HorizontalDivider
1211
import androidx.compose.material3.MaterialTheme
1312
import androidx.compose.material3.ModalBottomSheet
13+
import androidx.compose.material3.OutlinedButton
1414
import androidx.compose.material3.OutlinedTextField
1515
import androidx.compose.material3.SheetValue
1616
import androidx.compose.material3.Text
@@ -93,7 +93,7 @@ fun GatewayServerAddHttpModal(
9393

9494
Spacer(Modifier.padding(16.dp))
9595

96-
Button(onClick = {
96+
Button(modifier = Modifier.fillMaxWidth(), onClick = {
9797
if(gatewayServer != null) {
9898
viewModel.update(
9999
context, gatewayServer.apply {
@@ -104,7 +104,7 @@ fun GatewayServerAddHttpModal(
104104
onDismissCallback()
105105
}
106106
} else {
107-
viewModel.update(
107+
viewModel.add(
108108
context, GatewayServer().apply {
109109
this.URL = url
110110
this.tag = tag
@@ -117,19 +117,19 @@ fun GatewayServerAddHttpModal(
117117
Text(stringResource(R.string.save))
118118
}
119119

120-
Spacer(Modifier.padding(16.dp))
121-
122120
if(gatewayServer != null || LocalInspectionMode.current) {
123-
Button(onClick = {
121+
OutlinedButton(onClick = {
124122
viewModel.delete(
125123
context = context,
126124
gatewayClient = gatewayServer!!,
127125
){
128126
onDismissCallback()
129127
}
130-
}, colors = ButtonDefaults
131-
.buttonColors(MaterialTheme.colorScheme.error) ) {
132-
Text(stringResource(R.string.delete))
128+
},) {
129+
Text(
130+
stringResource(R.string.delete),
131+
color = MaterialTheme.colorScheme.error
132+
)
133133
}
134134
}
135135
}

0 commit comments

Comments
 (0)