diff --git a/.github/workflows/ios.yml b/.github/workflows/ios.yml index 662cff6..28344ea 100644 --- a/.github/workflows/ios.yml +++ b/.github/workflows/ios.yml @@ -19,7 +19,7 @@ jobs: - name: Set up Flutter uses: subosito/flutter-action@v2 with: - flutter-version-file: pubspec.yaml + flutter-version: 3.47.4 - name: Set up Go uses: actions/setup-go@v6 diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 5437318..b56f16f 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -19,7 +19,7 @@ jobs: - name: Set up Flutter uses: subosito/flutter-action@v2 with: - flutter-version-file: pubspec.yaml + flutter-version: 3.47.4 - name: Set up Go uses: actions/setup-go@v6 diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 4aa566c..d9c3402 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -19,7 +19,7 @@ jobs: - name: Set up Flutter uses: subosito/flutter-action@v2 with: - flutter-version-file: pubspec.yaml + flutter-version: 3.47.4 - name: Set up Go uses: actions/setup-go@v6 diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 46feed1..89e537b 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -14,6 +14,13 @@ if (keystorePropertiesFile.exists()) { } } +fun versionCodeOf(versionName: String): Int { + val parts = versionName.split("-", limit = 2) + val (major, minor, patch) = parts[0].split(".").map(String::toInt) + val preRelease = parts.getOrNull(1)?.let { Regex("\\d+").find(it)?.value?.toInt() ?: 0 } ?: 999 + return major * 100_000_000 + minor * 1_000_000 + patch * 10_000 + preRelease +} + android { namespace = "nexus.federated.nexus" compileSdk = 37 @@ -31,7 +38,7 @@ android { minSdk = 29 targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode + versionCode = versionCodeOf(flutter.versionName!!) versionName = flutter.versionName multiDexEnabled = true diff --git a/hook/build.dart b/hook/build.dart index ca84fda..8726642 100644 --- a/hook/build.dart +++ b/hook/build.dart @@ -64,14 +64,10 @@ Future main(List args) => build(args, (input, output) async { final targetNdkApi = codeConfig.android.targetNdkApi; - // Treats empty variables as unset, since e.g. F-Droid sets ANDROID_NDK_HOME to "" without an NDK - String? env(String name) => switch (Platform.environment[name]) { - "" => null, - final value => value, - }; - Future findNdkFromSdk() async { - final androidHome = env("ANDROID_HOME") ?? env("ANDROID_SDK_ROOT"); + final androidHome = + Platform.environment["ANDROID_HOME"] ?? + Platform.environment["ANDROID_SDK_ROOT"]; if (androidHome == null) return null; final ndkDir = Directory(join(androidHome, "ndk")); @@ -82,9 +78,9 @@ Future main(List args) => build(args, (input, output) async { } final ndkHome = - env("ANDROID_NDK_HOME") ?? - env("ANDROID_NDK_ROOT") ?? - env("NDK_HOME") ?? + Platform.environment["ANDROID_NDK_HOME"] ?? + Platform.environment["ANDROID_NDK_ROOT"] ?? + Platform.environment["NDK_HOME"] ?? await findNdkFromSdk(); if (ndkHome == null) { @@ -95,7 +91,8 @@ Future main(List args) => build(args, (input, output) async { // TODO: Someone please give me a way to detect host architecture so I can change this final hostTag = - env("ANDROID_HOST_TAG") ?? "${Platform.operatingSystem}-x86_64"; + Platform.environment["ANDROID_HOST_TAG"] ?? + "${Platform.operatingSystem}-x86_64"; final ccTriple = switch (targetArch) { Architecture.arm64 => "aarch64-linux-android", Architecture.arm => "armv7a-linux-androideabi", diff --git a/lib/controllers/room_chat.dart b/lib/controllers/room_chat.dart index 2a53a0d..773f30d 100644 --- a/lib/controllers/room_chat.dart +++ b/lib/controllers/room_chat.dart @@ -295,7 +295,6 @@ class RoomChatController(final ChatParams info) : null, ), ); - if (!ref.mounted) return; if (response.events.isEmpty) { state = .data(chat); @@ -334,7 +333,6 @@ class RoomChatController(final ChatParams info) : chat!.historicalData!.start, ), ); - if (!ref.mounted) return; ref .read(RoomsController.provider.notifier) @@ -347,7 +345,6 @@ class RoomChatController(final ChatParams info) final rootRowId = direction == .backward ? await threadRootBefore(paginationResponse) : null; - if (!ref.mounted) return; final eventRowIds = [ ?rootRowId, ...(direction == .forward @@ -386,7 +383,6 @@ class RoomChatController(final ChatParams info) ); } } catch (_) { - if (!ref.mounted) return; state = .data(chat); rethrow; } diff --git a/linux/nix/build_env.nix b/linux/nix/build_env.nix index 8883959..01b810c 100644 --- a/linux/nix/build_env.nix +++ b/linux/nix/build_env.nix @@ -5,8 +5,6 @@ with pkgs; [ stdenv.cc - # webcrypto's build hook runs CMake with the Unix Makefiles generator - gnumake go git ffmpeg-headless @@ -22,22 +20,13 @@ ] ++ lib.optionals pkgs.stdenv.isLinux [ wayland + # nativeapi includes XInput2.h, which needs these, but xi.pc only lists them privately + libxext + libxfixes (callPackage ./pkg/hook_pkg_config.nix { }) ]; env = lib.optionalAttrs pkgs.stdenv.isLinux { - # nativeapi includes XInput2.h and GTK's Wayland headers, which need these, but xi.pc and gdk-3.0.pc - # only list them privately, so its hook's pkg-config doesn't return them. Hooks only get NIX_ variables. - "NIX_CFLAGS_COMPILE_${pkgs.stdenv.cc.suffixSalt}" = - lib.concatMapStringsSep " " (pkg: "-isystem ${lib.getDev pkg}/include") - ( - with pkgs; - [ - libxext - libxfixes - wayland - ] - ); # better_player loads libmpv at runtime to play videos LD_LIBRARY_PATH = "./build/native_assets/linux:${ lib.makeLibraryPath [ diff --git a/linux/nix/default.nix b/linux/nix/default.nix index 8f09dbc..7e69e46 100644 --- a/linux/nix/default.nix +++ b/linux/nix/default.nix @@ -65,9 +65,6 @@ apps = let buildEnv = import ./build_env.nix { inherit pkgs lib; }; - testEnv = buildEnv.env // { - DBUS_SESSION_CONFIG = "${pkgs.dbus}/share/dbus-1/session.conf"; - }; e2e = pkgs.writeShellApplication { name = "nexus-e2e"; runtimeInputs = @@ -78,7 +75,7 @@ curl dbus ]); - runtimeEnv = testEnv; + runtimeEnv = buildEnv.env; text = builtins.readFile ./e2e.sh; }; screenshots = pkgs.writeShellApplication { @@ -90,7 +87,7 @@ oxipng pngquant ]); - runtimeEnv = testEnv; + runtimeEnv = buildEnv.env; text = builtins.readFile ./screenshots.sh; }; diff --git a/linux/nix/e2e.sh b/linux/nix/e2e.sh index 585712b..6cc9f09 100755 --- a/linux/nix/e2e.sh +++ b/linux/nix/e2e.sh @@ -69,7 +69,7 @@ for file in "${files[@]}"; do name="$(basename "$file" .dart)" mkdir -p "$work/$name/data" "$work/$name/cache" XDG_DATA_HOME="$work/$name/data" XDG_CACHE_HOME="$work/$name/cache" \ - dbus-run-session --config-file="$DBUS_SESSION_CONFIG" -- \ + dbus-run-session -- \ flutter test "$file" -d linux \ --dart-define="NEXUS_E2E_HOMESERVER=$homeserver" "${flutter_args[@]}" || status=$? diff --git a/linux/nix/screenshots.sh b/linux/nix/screenshots.sh index f3dced6..cdf18ff 100644 --- a/linux/nix/screenshots.sh +++ b/linux/nix/screenshots.sh @@ -12,7 +12,7 @@ GOCACHE="$(go env GOCACHE)" export GOCACHE XDG_DATA_HOME="$work/data" XDG_CACHE_HOME="$work/cache" \ - dbus-run-session --config-file="$DBUS_SESSION_CONFIG" -- \ + dbus-run-session -- \ flutter test integration_test/screenshots/screenshots_test.dart -d linux \ --dart-define="SCREENSHOTS_DIR=$work/out" "$@" diff --git a/pubspec.lock b/pubspec.lock index 27a602e..72d5924 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1960,4 +1960,4 @@ packages: version: "2.2.4" sdks: dart: ">=3.13.3 <4.0.0" - flutter: "3.47.4" + flutter: ">=3.47.0" diff --git a/pubspec.yaml b/pubspec.yaml index aa1efbc..76f274f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: nexus description: "A simple and user-friendly Matrix client" -version: 1.1.1+101010999 +version: 1.1.1 publish_to: none flutter: @@ -16,8 +16,7 @@ flutter: uses-material-design: true environment: - sdk: 3.13.3 - flutter: 3.47.4 + sdk: ^3.13.3 dependency_overrides: dynamic_color: 2.1.0