Skip to content

Commit 004aec1

Browse files
committed
Merge remote-tracking branch 'origin/main' into evaluate-hyper-legacy-client-des-1288
2 parents a807322 + 022033c commit 004aec1

File tree

59 files changed

+1246
-578
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+1246
-578
lines changed

.github/workflows/android-app.yml

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -148,14 +148,19 @@ jobs:
148148
./building/container-run.sh android android/gradlew -p android --console plain --stacktrace --no-daemon
149149
clean
150150
151+
- name: Prepare build tasks
152+
id: build-tasks
153+
run: |
154+
tasks=":app:assembleOssProdDebug assembleOssProdAndroidTest :test:mockapi:assemble"
155+
if [[ "${{ needs.prepare.outputs.E2E_TEST_REPEAT }}" != '0' ]]; then
156+
tasks+=" :app:assemblePlayStagemoleDebug :test:e2e:assemble"
157+
fi
158+
echo "tasks=$tasks" >> $GITHUB_OUTPUT
159+
151160
- name: Build apks
152161
run: >
153162
./building/container-run.sh android android/gradlew -p android --console plain --stacktrace --no-daemon
154-
:app:assembleOssProdDebug
155-
:app:assemblePlayStagemoleDebug
156-
assembleOssProdAndroidTest
157-
:test:mockapi:assemble
158-
:test:e2e:assemble
163+
"${{ steps.build-tasks.outputs.tasks }}"
159164
160165
- name: Upload apks
161166
uses: actions/upload-artifact@v4

.github/workflows/desktop-e2e.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ jobs:
155155
if: ${{ github.event.inputs.gotatun == 'true' }}
156156
run: |
157157
export CARGO_TARGET_DIR=target/
158-
./build.sh --optimize --boringtun
158+
./build.sh --optimize --gotatun
159159
- name: Build test executable
160160
run: ./desktop/packages/mullvad-vpn/scripts/build-test-executable.sh
161161
- name: Upload app
@@ -353,7 +353,7 @@ jobs:
353353
if: ${{ github.event.inputs.gotatun == 'true' }}
354354
shell: bash
355355
run: |
356-
./build.sh --optimize --boringtun
356+
./build.sh --optimize --gotatun
357357
# FIXME: Strip architecture-specific suffix. The remaining steps assume that the windows installer has no
358358
# arch-suffix. This should probably be addressed when we add a Windows arm runner. Or maybe it will just keep
359359
# on working ¯\_(ツ)_/¯
@@ -448,7 +448,7 @@ jobs:
448448
run: ./build.sh
449449
- name: Build app (with GotaTun 🦀)
450450
if: ${{ github.event.inputs.gotatun == 'true' }}
451-
run: ./build.sh --optimize --boringtun
451+
run: ./build.sh --optimize --gotatun
452452
- name: Build test executable
453453
run: ./desktop/packages/mullvad-vpn/scripts/build-test-executable.sh
454454
- uses: actions/upload-artifact@v4

Cargo.lock

Lines changed: 3 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

android/CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,17 @@ Line wrap the file at 100 chars. Th
2121
* **Fixed**: for any bug fixes.
2222
* **Security**: in case of vulnerabilities.
2323

24+
## [android/2026.1-beta2] - 2025-01-27
25+
### Changed
26+
- Disable "View logs" button until logs are fully parsed.
27+
28+
### Fixed
29+
- Various fixes for layout positioning when using a RTL language.
30+
- Fix not being able to open the app via notification if the app icon is changed.
31+
- Fix scroll to selection sometimes not working in select location screen.
32+
- Fix disabled content blockers hint not showing.
33+
34+
2435
## [android/2026.1-beta1] - 2025-01-22
2536
### Added
2637
- Add Arabic and Persian as new languages in the app with full RTL support.

android/app/src/main/AndroidManifest.xml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,6 @@
7878
android:targetActivity="net.mullvad.mullvadvpn.ui.MainActivity"
7979
tools:ignore="DiscouragedApi,UnusedAttribute">
8080

81-
<intent-filter>
82-
<action android:name="android.service.quicksettings.action.QS_TILE_PREFERENCES" />
83-
</intent-filter>
8481
<intent-filter>
8582
<action android:name="net.mullvad.mullvadvpn.request_vpn_permission" />
8683
</intent-filter>

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/Scaffolding.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ fun MullvadSnackbar(modifier: Modifier = Modifier, snackbarData: SnackbarData) {
116116
containerColor = MaterialTheme.colorScheme.surfaceContainer,
117117
contentColor = MaterialTheme.colorScheme.onSurface,
118118
actionColor = MaterialTheme.colorScheme.onSurface,
119+
dismissActionContentColor = MaterialTheme.colorScheme.onSurface,
119120
)
120121
}
121122

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/DeviceListScreen.kt

Lines changed: 18 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ import kotlinx.coroutines.launch
4040
import net.mullvad.mullvadvpn.R
4141
import net.mullvad.mullvadvpn.compose.button.PrimaryButton
4242
import net.mullvad.mullvadvpn.compose.button.VariantButton
43-
import net.mullvad.mullvadvpn.compose.component.DeviceListItem
4443
import net.mullvad.mullvadvpn.compose.component.ScaffoldWithTopBar
4544
import net.mullvad.mullvadvpn.compose.component.drawVerticalScrollbar
4645
import net.mullvad.mullvadvpn.compose.extensions.dropUnlessResumed
@@ -55,6 +54,8 @@ import net.mullvad.mullvadvpn.lib.model.DeviceId
5554
import net.mullvad.mullvadvpn.lib.theme.AppTheme
5655
import net.mullvad.mullvadvpn.lib.theme.Dimens
5756
import net.mullvad.mullvadvpn.lib.theme.color.selected
57+
import net.mullvad.mullvadvpn.lib.ui.component.listitem.DeviceListItem
58+
import net.mullvad.mullvadvpn.lib.ui.component.positionForIndex
5859
import net.mullvad.mullvadvpn.lib.ui.designsystem.MullvadCircularProgressIndicatorLarge
5960
import net.mullvad.mullvadvpn.viewmodel.DeviceListSideEffect
6061
import net.mullvad.mullvadvpn.viewmodel.DeviceListViewModel
@@ -156,7 +157,13 @@ fun DeviceListScreen(
156157
) {
157158
Column(
158159
modifier =
159-
Modifier.fillMaxSize().padding(it).padding(bottom = Dimens.screenBottomMargin)
160+
Modifier.fillMaxSize()
161+
.padding(it)
162+
.padding(
163+
bottom = Dimens.screenBottomMargin,
164+
start = Dimens.sideMarginNew,
165+
end = Dimens.sideMarginNew,
166+
)
160167
) {
161168
val scrollState = rememberScrollState()
162169
Column(
@@ -195,12 +202,7 @@ private fun ColumnScope.DeviceListError(tryAgain: () -> Unit) {
195202
PrimaryButton(
196203
onClick = tryAgain,
197204
text = stringResource(id = R.string.try_again),
198-
modifier =
199-
Modifier.padding(
200-
top = Dimens.buttonSpacing,
201-
start = Dimens.sideMargin,
202-
end = Dimens.sideMargin,
203-
),
205+
modifier = Modifier.padding(top = Dimens.buttonSpacing),
204206
)
205207
}
206208
}
@@ -211,7 +213,11 @@ private fun ColumnScope.DeviceListContent(
211213
navigateToRemoveDeviceConfirmationDialog: (Device) -> Unit,
212214
) {
213215
state.devices.forEachIndexed { index, (device, loading) ->
214-
DeviceListItem(device = device, isLoading = loading) {
216+
DeviceListItem(
217+
position = state.devices.positionForIndex(index),
218+
device = device,
219+
isLoading = loading,
220+
) {
215221
navigateToRemoveDeviceConfirmationDialog(device)
216222
}
217223
if (state.devices.lastIndex != index) {
@@ -261,12 +267,7 @@ private fun ColumnScope.DeviceListHeader(state: DeviceListUiState) {
261267
),
262268
style = MaterialTheme.typography.headlineSmall,
263269
color = MaterialTheme.colorScheme.onSurface,
264-
modifier =
265-
Modifier.padding(
266-
start = Dimens.sideMargin,
267-
end = Dimens.sideMargin,
268-
top = Dimens.screenTopMargin,
269-
),
270+
modifier = Modifier.padding(top = Dimens.screenTopMargin),
270271
)
271272

272273
if (state is DeviceListUiState.Content) {
@@ -285,12 +286,7 @@ private fun ColumnScope.DeviceListHeader(state: DeviceListUiState) {
285286
modifier =
286287
Modifier.wrapContentHeight()
287288
.animateContentSize()
288-
.padding(
289-
top = Dimens.smallPadding,
290-
start = Dimens.sideMargin,
291-
end = Dimens.sideMargin,
292-
bottom = Dimens.cellVerticalSpacing,
293-
),
289+
.padding(top = Dimens.smallPadding, bottom = Dimens.cellVerticalSpacing),
294290
)
295291
}
296292
}
@@ -301,14 +297,7 @@ private fun DeviceListButtonPanel(
301297
onContinueWithLogin: () -> Unit,
302298
onBackClick: () -> Unit,
303299
) {
304-
Column(
305-
modifier =
306-
Modifier.padding(
307-
start = Dimens.sideMargin,
308-
end = Dimens.sideMargin,
309-
top = Dimens.mediumPadding,
310-
)
311-
) {
300+
Column(modifier = Modifier.padding(top = Dimens.mediumPadding)) {
312301
VariantButton(
313302
text = stringResource(id = R.string.continue_login),
314303
onClick = onContinueWithLogin,

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ManageDevicesScreen.kt

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package net.mullvad.mullvadvpn.compose.screen
33
import androidx.compose.foundation.layout.Arrangement
44
import androidx.compose.foundation.layout.Box
55
import androidx.compose.foundation.layout.Column
6+
import androidx.compose.foundation.layout.Spacer
7+
import androidx.compose.foundation.layout.height
68
import androidx.compose.foundation.layout.padding
79
import androidx.compose.material3.HorizontalDivider
810
import androidx.compose.material3.MaterialTheme
@@ -28,10 +30,9 @@ import com.ramcosta.composedestinations.result.ResultRecipient
2830
import kotlinx.coroutines.launch
2931
import net.mullvad.mullvadvpn.R
3032
import net.mullvad.mullvadvpn.compose.button.PrimaryButton
31-
import net.mullvad.mullvadvpn.compose.cell.BaseSubtitleCell
32-
import net.mullvad.mullvadvpn.compose.component.DeviceListItem
3333
import net.mullvad.mullvadvpn.compose.component.NavigateBackIconButton
3434
import net.mullvad.mullvadvpn.compose.component.ScaffoldWithMediumTopBar
35+
import net.mullvad.mullvadvpn.compose.component.textResource
3536
import net.mullvad.mullvadvpn.compose.extensions.dropUnlessResumed
3637
import net.mullvad.mullvadvpn.compose.preview.ManageDevicesUiStatePreviewParameterProvider
3738
import net.mullvad.mullvadvpn.compose.state.ManageDevicesUiState
@@ -44,6 +45,8 @@ import net.mullvad.mullvadvpn.lib.model.DeviceId
4445
import net.mullvad.mullvadvpn.lib.model.GetDeviceListError
4546
import net.mullvad.mullvadvpn.lib.theme.AppTheme
4647
import net.mullvad.mullvadvpn.lib.theme.Dimens
48+
import net.mullvad.mullvadvpn.lib.ui.component.listitem.DeviceListItem
49+
import net.mullvad.mullvadvpn.lib.ui.component.positionForIndex
4750
import net.mullvad.mullvadvpn.lib.ui.designsystem.MullvadCircularProgressIndicatorMedium
4851
import net.mullvad.mullvadvpn.util.Lce
4952
import net.mullvad.mullvadvpn.viewmodel.ManageDevicesSideEffect
@@ -140,12 +143,13 @@ private fun Content(
140143
state: ManageDevicesUiState,
141144
navigateToRemoveDeviceConfirmationDialog: (device: Device) -> Unit,
142145
) {
143-
Column(modifier) {
144-
BaseSubtitleCell(
145-
text = stringResource(R.string.manage_devices_description),
146+
Column(modifier.padding(horizontal = Dimens.sideMarginNew)) {
147+
Text(
148+
text = textResource(id = R.string.manage_devices_description),
146149
style = MaterialTheme.typography.labelLarge,
147150
color = MaterialTheme.colorScheme.onSurfaceVariant,
148151
)
152+
Spacer(Modifier.height(Dimens.verticalSpace))
149153
ManageDevicesItems(
150154
state = state,
151155
navigateToRemoveDeviceConfirmationDialog = navigateToRemoveDeviceConfirmationDialog,
@@ -166,8 +170,8 @@ private fun Error(modifier: Modifier, tryAgain: () -> Unit) {
166170
modifier =
167171
Modifier.padding(
168172
top = Dimens.buttonSpacing,
169-
start = Dimens.sideMargin,
170-
end = Dimens.sideMargin,
173+
start = Dimens.sideMarginNew,
174+
end = Dimens.sideMarginNew,
171175
),
172176
)
173177
}
@@ -186,7 +190,12 @@ private fun ManageDevicesItems(
186190
navigateToRemoveDeviceConfirmationDialog: (Device) -> Unit,
187191
) {
188192
state.devices.forEachIndexed { index, (device, loading, isCurrentDevice) ->
189-
DeviceListItem(device = device, isLoading = loading, isCurrentDevice = isCurrentDevice) {
193+
DeviceListItem(
194+
position = state.devices.positionForIndex(index),
195+
device = device,
196+
isLoading = loading,
197+
isCurrentDevice = isCurrentDevice,
198+
) {
190199
navigateToRemoveDeviceConfirmationDialog(device)
191200
}
192201
if (state.devices.lastIndex != index) {

0 commit comments

Comments
 (0)