Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
3 changes: 2 additions & 1 deletion .github/workflows/dart.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ permissions:

jobs:
build:
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04

steps:
- uses: actions/checkout@v3
Expand All @@ -42,6 +42,7 @@ jobs:
sudo apt-get install -y libsdl2-dev
sudo apt-get install -y libwebkit2gtk-4.1-dev
sudo apt-get install -y libopus-dev libogg-dev
sudo apt-get install -y libmpv-dev mpv
sudo apt-get install -y libcurl4-openssl-dev
flutter doctor

Expand Down
24 changes: 15 additions & 9 deletions .github/workflows/manual-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,10 @@ jobs:
matrix:
include:
- arch: amd64
runner: ubuntu-22.04
runner: ubuntu-24.04
flutter_arch: x64
- arch: arm64
runner: ubuntu-22.04-arm
runner: ubuntu-24.04-arm
flutter_arch: arm64
steps:
- run: g++ --version
Expand Down Expand Up @@ -95,6 +95,7 @@ jobs:
sudo apt-get install -y libsdl2-dev
sudo apt-get install -y libwebkit2gtk-4.1-dev
sudo apt-get install -y libopus-dev libogg-dev
sudo apt-get install -y libmpv-dev mpv
sudo apt-get install -y libcurl4-openssl-dev
flutter doctor

Expand Down Expand Up @@ -169,11 +170,11 @@ jobs:
matrix:
include:
- arch: amd64
runner: ubuntu-22.04
runner: ubuntu-24.04
flutter_arch: x64
artifact_suffix: ""
- arch: arm64
runner: ubuntu-22.04-arm
runner: ubuntu-24.04-arm
flutter_arch: arm64
artifact_suffix: "-arm64"
steps:
Expand Down Expand Up @@ -227,13 +228,13 @@ jobs:
matrix:
include:
- arch: amd64
runner: ubuntu-22.04
runner: ubuntu-24.04
flutter_arch: x64
appimage_arch: x86_64
recipe: ./AppImageBuilder.yml
artifact_suffix: ""
- arch: arm64
runner: ubuntu-22.04-arm
runner: ubuntu-24.04-arm
flutter_arch: arm64
appimage_arch: aarch64
recipe: ./AppImageBuilder-arm64.yml
Expand All @@ -255,7 +256,7 @@ jobs:
- name: Install appimage-builder dependencies
run: |
sudo apt-get update
sudo apt-get install -y python3-pip python3-setuptools patchelf desktop-file-utils libgdk-pixbuf2.0-dev fakeroot strace binutils coreutils
sudo apt-get install -y python3-venv patchelf desktop-file-utils libgdk-pixbuf-2.0-dev fakeroot strace binutils coreutils

- name: Download appimagetool
run: |
Expand All @@ -267,10 +268,15 @@ jobs:
sudo chmod +x /usr/local/bin/appimagetool

- name: Install appimage-builder
run: sudo pip3 install appimage-builder==1.1.0
run: |
python3 -m venv "${{ runner.temp }}/appimage-builder-venv"
# appimage-builder 1.1.0 relies on LegacyVersion when comparing
# Debian-style versions such as 1.22.6ubuntu6.
"${{ runner.temp }}/appimage-builder-venv/bin/pip" install appimage-builder==1.1.0 "packaging<22"

- name: Build AppImage
run: appimage-builder --recipe ${{ matrix.recipe }} --skip-test
run: |
"${{ runner.temp }}/appimage-builder-venv/bin/appimage-builder" --recipe "${{ matrix.recipe }}" --skip-test

- run: mv "Mixin Messenger-latest-${{ matrix.appimage_arch }}.AppImage" mixin_desktop_linux_${{ matrix.arch }}.AppImage
- name: Upload AppImage Artifact
Expand Down
13 changes: 7 additions & 6 deletions AppImageBuilder-arm64.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,19 @@ AppDir:
arch: arm64
allow_unauthenticated: true
sources:
- sourceline: deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy main restricted universe multiverse
- sourceline: deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy-updates main restricted universe multiverse
- sourceline: deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy-backports main restricted universe multiverse
- sourceline: deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ jammy-security main restricted universe multiverse
- sourceline: deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ noble main restricted universe multiverse
- sourceline: deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ noble-updates main restricted universe multiverse
- sourceline: deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ noble-backports main restricted universe multiverse
- sourceline: deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ noble-security main restricted universe multiverse
include:
- libgtk-3-0
- libgtk-3-0t64
- libwebkit2gtk-4.1-0
# Bundle GTK input method clients, but keep the input method daemon on the host.
- ibus-gtk3
- fcitx5-frontend-gtk3
- libsdl2-2.0-0
- libopus0
- libmpv2
exclude:
- humanity-icon-theme
- hicolor-icon-theme
Expand All @@ -45,7 +46,7 @@ AppDir:
after_bundle:
# Package extraction does not run Debian's GTK cache trigger. AppRun v2 maps
# the generated build-time AppDir paths to the runtime AppDir mount point.
- LD_LIBRARY_PATH=AppDir/lib/aarch64-linux-gnu:AppDir/usr/lib/aarch64-linux-gnu AppDir/usr/lib/aarch64-linux-gnu/libgtk-3-0/gtk-query-immodules-3.0 AppDir/usr/lib/aarch64-linux-gnu/gtk-3.0/3.0.0/immodules/*.so > AppDir/usr/lib/aarch64-linux-gnu/gtk-3.0/3.0.0/immodules.cache
- LD_LIBRARY_PATH=AppDir/lib/aarch64-linux-gnu:AppDir/usr/lib/aarch64-linux-gnu AppDir/usr/lib/aarch64-linux-gnu/libgtk-3-0t64/gtk-query-immodules-3.0 AppDir/usr/lib/aarch64-linux-gnu/gtk-3.0/3.0.0/immodules/*.so > AppDir/usr/lib/aarch64-linux-gnu/gtk-3.0/3.0.0/immodules.cache
runtime:
env:
GIO_MODULE_DIR: $APPDIR/usr/lib/aarch64-linux-gnu/gio/modules/
Expand Down
13 changes: 7 additions & 6 deletions AppImageBuilder.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,19 @@ AppDir:
arch: amd64
allow_unauthenticated: true
sources:
- sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy main restricted universe multiverse
- sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy-updates main restricted universe multiverse
- sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy-backports main restricted universe multiverse
- sourceline: deb http://security.ubuntu.com/ubuntu jammy-security main restricted universe multiverse
- sourceline: deb http://archive.ubuntu.com/ubuntu/ noble main restricted universe multiverse
- sourceline: deb http://archive.ubuntu.com/ubuntu/ noble-updates main restricted universe multiverse
- sourceline: deb http://archive.ubuntu.com/ubuntu/ noble-backports main restricted universe multiverse
- sourceline: deb http://security.ubuntu.com/ubuntu noble-security main restricted universe multiverse
include:
- libgtk-3-0
- libgtk-3-0t64
- libwebkit2gtk-4.1-0
# Bundle GTK input method clients, but keep the input method daemon on the host.
- ibus-gtk3
- fcitx5-frontend-gtk3
- libsdl2-2.0-0
- libopus0
- libmpv2
exclude:
- humanity-icon-theme
- hicolor-icon-theme
Expand All @@ -45,7 +46,7 @@ AppDir:
after_bundle:
# Package extraction does not run Debian's GTK cache trigger. AppRun v2 maps
# the generated build-time AppDir paths to the runtime AppDir mount point.
- LD_LIBRARY_PATH=AppDir/lib/x86_64-linux-gnu:AppDir/usr/lib/x86_64-linux-gnu AppDir/usr/lib/x86_64-linux-gnu/libgtk-3-0/gtk-query-immodules-3.0 AppDir/usr/lib/x86_64-linux-gnu/gtk-3.0/3.0.0/immodules/*.so > AppDir/usr/lib/x86_64-linux-gnu/gtk-3.0/3.0.0/immodules.cache
- LD_LIBRARY_PATH=AppDir/lib/x86_64-linux-gnu:AppDir/usr/lib/x86_64-linux-gnu AppDir/usr/lib/x86_64-linux-gnu/libgtk-3-0t64/gtk-query-immodules-3.0 AppDir/usr/lib/x86_64-linux-gnu/gtk-3.0/3.0.0/immodules/*.so > AppDir/usr/lib/x86_64-linux-gnu/gtk-3.0/3.0.0/immodules.cache
runtime:
env:
GIO_MODULE_DIR: $APPDIR/usr/lib/x86_64-linux-gnu/gio/modules/
Expand Down
7 changes: 6 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,15 @@ sudo apt-get install libsqlite3-dev
sudo apt-get install webkit2gtk-4.1
sudo apt-get install libsdl2-dev
sudo apt-get install libopus-dev libogg-dev
sudo apt-get install libmpv-dev mpv
```

### Portable archive runtime

The portable Linux archive uses the system's shared libraries. Install the
`libmpv` runtime before using it (`libmpv2` on Debian and Ubuntu).


# License

Released under the [GPLv3](https://github.com/MixinNetwork/flutter-app/blob/master/LICENSE) license.

2 changes: 1 addition & 1 deletion dist/deb/DEBIAN/control
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@ Homepage: https://mixin.one/messenger
Package: mixin-desktop
Maintainer: Mixin Team
Architecture: amd64
Depends: libgtk-3-0 (>= 3.10.0), libsdl2-2.0-0, libwebkit2gtk-4.1-0, libopus0
Depends: libgtk-3-0t64 (>= 3.24.41), libsdl2-2.0-0, libwebkit2gtk-4.1-0, libopus0, libmpv2
Description: Mixin messenger desktop
5 changes: 3 additions & 2 deletions dist/snap/snap/snapcraft.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ parts:
plugin: dump
stage-packages:
- libsdl2-2.0-0
- libgtk-3-0
- libgtk-3-0t64
- libwebkit2gtk-4.1-0
- libopus0
- libopus0
- libmpv2
2 changes: 2 additions & 0 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:isolate/isolate.dart';
import 'package:media_kit/media_kit.dart';
import 'package:overlay_support/overlay_support.dart';
import 'package:protocol_handler/protocol_handler.dart';
import 'package:rhttp/rhttp.dart';
Expand Down Expand Up @@ -43,6 +44,7 @@ Future<void> _runApp(List<String> args) async {
await Rhttp.init();

WidgetsFlutterBinding.ensureInitialized();
MediaKit.ensureInitialized();

await loadFallbackFonts();

Expand Down
19 changes: 12 additions & 7 deletions lib/ui/home/chat/files_preview.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:image/image.dart' as image;
import 'package:media_kit_video/media_kit_video.dart';
import 'package:mime/mime.dart';
import 'package:path/path.dart' as path;
import 'package:path_provider/path_provider.dart';
import 'package:super_context_menu/super_context_menu.dart';
import 'package:video_compress/video_compress.dart';
import 'package:video_player/video_player.dart';

import '../../../constants/brightness_theme_data.dart';
import '../../../constants/constants.dart';
Expand All @@ -41,6 +41,7 @@ import '../../../widgets/high_light_text.dart';
import '../../../widgets/image.dart';
import '../../../widgets/interactive_decorated_box.dart';
import '../../../widgets/menu.dart';
import '../../../widgets/message/item/video/media_kit_video_player.dart';
import '../../../widgets/mixin_image.dart';
import '../../provider/conversation_provider.dart';
import '../../provider/quote_message_provider.dart';
Expand Down Expand Up @@ -779,11 +780,12 @@ class _AnimatedListBuilder extends HookConsumerWidget {
}

final _videoControllerProvider = ChangeNotifierProvider.autoDispose
.family<VideoPlayerController, _VideoFile>(
(ref, file) => VideoPlayerController.file(File(file.path))
..initialize()
..setVolume(0)
..setLooping(true),
.family<MediaKitVideoPlayer, _VideoFile>(
(ref, file) => MediaKitVideoPlayer(
file.path,
looping: true,
muted: true,
),
);

final _videoBlurHashProvider = FutureProvider.autoDispose
Expand Down Expand Up @@ -832,7 +834,10 @@ class _TileBigVideo extends HookConsumerWidget {
Center(
child: AspectRatio(
aspectRatio: aspectRatio,
child: VideoPlayer(controller),
child: Video(
controller: controller.controller,
controls: null,
),
),
),
Positioned(
Expand Down
1 change: 1 addition & 0 deletions lib/ui/home/chat/voice_recorder_bottom_bar.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import 'package:equatable/equatable.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart' hide ChangeNotifierProvider;
import 'package:media_kit/media_kit.dart';
import 'package:ogg_opus_player/ogg_opus_player.dart';
import 'package:provider/provider.dart';

Expand Down
40 changes: 23 additions & 17 deletions lib/ui/home/chat/voice_recorder_state.dart
Original file line number Diff line number Diff line change
Expand Up @@ -170,39 +170,45 @@ class VoiceRecorderNotifier extends ValueNotifier<VoiceRecorderState> {
}

class _Player {
_Player(this.path);
_Player(this.path) : _player = Player() {
_subscriptions.addAll([
_player.stream.playing.listen((playing) {
isPlaying.value = playing;
}),
_player.stream.completed.listen((completed) {
if (completed) {
unawaited(stop());
}
}),
]);
}

final String path;

final isPlaying = ValueNotifier<bool>(false);

double get position => _player?.currentPosition ?? 0.0;
double get position =>
_player.state.position.inMicroseconds / Duration.microsecondsPerSecond;

OggOpusPlayer? _player;
final Player _player;
final _subscriptions = <StreamSubscription<dynamic>>[];

Future<void> start() async {
await AudioSession.instance.activePlayback();
final player = OggOpusPlayer(path);
player.state.addListener(() {
final state = player.state.value;
isPlaying.value = state == PlayerState.playing;
if (state == PlayerState.ended) {
stop();
}
});
player.play();
_player = player;
await _player.open(Media(path));
}

Future<void> stop() async {
_player?.pause();
_player?.dispose();
_player = null;
await _player.stop();
await AudioSession.instance.deactivate();
isPlaying.value = false;
}

void dispose() {
stop();
unawaited(stop());
for (final subscription in _subscriptions) {
unawaited(subscription.cancel());
}
unawaited(_player.dispose());
}
}
Loading
Loading