Compare commits
	
		
			3 Commits
		
	
	
		
			456bac67f2
			...
			85e5e5f144
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 85e5e5f144 | |||
| bece579f9d | |||
| 8271852867 | 
@@ -1,7 +1,17 @@
 | 
				
			|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
 | 
					<manifest xmlns:android="http://schemas.android.com/apk/res/android">
 | 
				
			||||||
 | 
					    <uses-feature android:name="android.hardware.camera" />
 | 
				
			||||||
 | 
					    <uses-feature android:name="android.hardware.camera.autofocus" />
 | 
				
			||||||
    <uses-permission android:name="android.permission.WAKE_LOCK" />
 | 
					    <uses-permission android:name="android.permission.WAKE_LOCK" />
 | 
				
			||||||
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
 | 
					    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
 | 
				
			||||||
    <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
 | 
					    <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
 | 
				
			||||||
 | 
					    <uses-permission android:name="android.permission.CAMERA" />
 | 
				
			||||||
 | 
					    <uses-permission android:name="android.permission.RECORD_AUDIO" />
 | 
				
			||||||
 | 
					    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 | 
				
			||||||
 | 
					    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
 | 
				
			||||||
 | 
					    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
 | 
				
			||||||
 | 
					    <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
 | 
				
			||||||
 | 
					    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
 | 
				
			||||||
 | 
					    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <application
 | 
					    <application
 | 
				
			||||||
        android:label="Solian"
 | 
					        android:label="Solian"
 | 
				
			||||||
@@ -20,12 +30,12 @@
 | 
				
			|||||||
                 while the Flutter UI initializes. After that, this theme continues
 | 
					                 while the Flutter UI initializes. After that, this theme continues
 | 
				
			||||||
                 to determine the Window background behind the Flutter UI. -->
 | 
					                 to determine the Window background behind the Flutter UI. -->
 | 
				
			||||||
            <meta-data
 | 
					            <meta-data
 | 
				
			||||||
              android:name="io.flutter.embedding.android.NormalTheme"
 | 
					                android:name="io.flutter.embedding.android.NormalTheme"
 | 
				
			||||||
              android:resource="@style/NormalTheme"
 | 
					                android:resource="@style/NormalTheme"
 | 
				
			||||||
              />
 | 
					            />
 | 
				
			||||||
            <intent-filter>
 | 
					            <intent-filter>
 | 
				
			||||||
                <action android:name="android.intent.action.MAIN"/>
 | 
					                <action android:name="android.intent.action.MAIN" />
 | 
				
			||||||
                <category android:name="android.intent.category.LAUNCHER"/>
 | 
					                <category android:name="android.intent.category.LAUNCHER" />
 | 
				
			||||||
            </intent-filter>
 | 
					            </intent-filter>
 | 
				
			||||||
        </activity>
 | 
					        </activity>
 | 
				
			||||||
        <!-- Don't delete the meta-data below.
 | 
					        <!-- Don't delete the meta-data below.
 | 
				
			||||||
@@ -41,8 +51,8 @@
 | 
				
			|||||||
         In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
 | 
					         In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
 | 
				
			||||||
    <queries>
 | 
					    <queries>
 | 
				
			||||||
        <intent>
 | 
					        <intent>
 | 
				
			||||||
            <action android:name="android.intent.action.PROCESS_TEXT"/>
 | 
					            <action android:name="android.intent.action.PROCESS_TEXT" />
 | 
				
			||||||
            <data android:mimeType="text/plain"/>
 | 
					            <data android:mimeType="text/plain" />
 | 
				
			||||||
        </intent>
 | 
					        </intent>
 | 
				
			||||||
    </queries>
 | 
					    </queries>
 | 
				
			||||||
</manifest>
 | 
					</manifest>
 | 
				
			||||||
@@ -510,6 +510,7 @@
 | 
				
			|||||||
				BUNDLE_LOADER = "$(TEST_HOST)";
 | 
									BUNDLE_LOADER = "$(TEST_HOST)";
 | 
				
			||||||
				CODE_SIGN_STYLE = Automatic;
 | 
									CODE_SIGN_STYLE = Automatic;
 | 
				
			||||||
				CURRENT_PROJECT_VERSION = 1;
 | 
									CURRENT_PROJECT_VERSION = 1;
 | 
				
			||||||
 | 
									DEVELOPMENT_TEAM = W7HPZ53V6B;
 | 
				
			||||||
				GENERATE_INFOPLIST_FILE = YES;
 | 
									GENERATE_INFOPLIST_FILE = YES;
 | 
				
			||||||
				MARKETING_VERSION = 1.0;
 | 
									MARKETING_VERSION = 1.0;
 | 
				
			||||||
				PRODUCT_BUNDLE_IDENTIFIER = dev.solsynth.solian.RunnerTests;
 | 
									PRODUCT_BUNDLE_IDENTIFIER = dev.solsynth.solian.RunnerTests;
 | 
				
			||||||
@@ -528,6 +529,7 @@
 | 
				
			|||||||
				BUNDLE_LOADER = "$(TEST_HOST)";
 | 
									BUNDLE_LOADER = "$(TEST_HOST)";
 | 
				
			||||||
				CODE_SIGN_STYLE = Automatic;
 | 
									CODE_SIGN_STYLE = Automatic;
 | 
				
			||||||
				CURRENT_PROJECT_VERSION = 1;
 | 
									CURRENT_PROJECT_VERSION = 1;
 | 
				
			||||||
 | 
									DEVELOPMENT_TEAM = W7HPZ53V6B;
 | 
				
			||||||
				GENERATE_INFOPLIST_FILE = YES;
 | 
									GENERATE_INFOPLIST_FILE = YES;
 | 
				
			||||||
				MARKETING_VERSION = 1.0;
 | 
									MARKETING_VERSION = 1.0;
 | 
				
			||||||
				PRODUCT_BUNDLE_IDENTIFIER = dev.solsynth.solian.RunnerTests;
 | 
									PRODUCT_BUNDLE_IDENTIFIER = dev.solsynth.solian.RunnerTests;
 | 
				
			||||||
@@ -544,6 +546,7 @@
 | 
				
			|||||||
				BUNDLE_LOADER = "$(TEST_HOST)";
 | 
									BUNDLE_LOADER = "$(TEST_HOST)";
 | 
				
			||||||
				CODE_SIGN_STYLE = Automatic;
 | 
									CODE_SIGN_STYLE = Automatic;
 | 
				
			||||||
				CURRENT_PROJECT_VERSION = 1;
 | 
									CURRENT_PROJECT_VERSION = 1;
 | 
				
			||||||
 | 
									DEVELOPMENT_TEAM = W7HPZ53V6B;
 | 
				
			||||||
				GENERATE_INFOPLIST_FILE = YES;
 | 
									GENERATE_INFOPLIST_FILE = YES;
 | 
				
			||||||
				MARKETING_VERSION = 1.0;
 | 
									MARKETING_VERSION = 1.0;
 | 
				
			||||||
				PRODUCT_BUNDLE_IDENTIFIER = dev.solsynth.solian.RunnerTests;
 | 
									PRODUCT_BUNDLE_IDENTIFIER = dev.solsynth.solian.RunnerTests;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,10 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
 | 
					<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
 | 
				
			||||||
 | 
					    <device id="retina6_12" orientation="portrait" appearance="light"/>
 | 
				
			||||||
    <dependencies>
 | 
					    <dependencies>
 | 
				
			||||||
        <deployment identifier="iOS"/>
 | 
					        <deployment identifier="iOS"/>
 | 
				
			||||||
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
 | 
					        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22685"/>
 | 
				
			||||||
 | 
					        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
 | 
				
			||||||
    </dependencies>
 | 
					    </dependencies>
 | 
				
			||||||
    <scenes>
 | 
					    <scenes>
 | 
				
			||||||
        <!--Flutter View Controller-->
 | 
					        <!--Flutter View Controller-->
 | 
				
			||||||
@@ -14,13 +16,14 @@
 | 
				
			|||||||
                        <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
 | 
					                        <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
 | 
				
			||||||
                    </layoutGuides>
 | 
					                    </layoutGuides>
 | 
				
			||||||
                    <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
 | 
					                    <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
 | 
				
			||||||
                        <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
 | 
					                        <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
 | 
				
			||||||
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
 | 
					                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
 | 
				
			||||||
                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
 | 
					                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
 | 
				
			||||||
                    </view>
 | 
					                    </view>
 | 
				
			||||||
                </viewController>
 | 
					                </viewController>
 | 
				
			||||||
                <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
 | 
					                <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
 | 
				
			||||||
            </objects>
 | 
					            </objects>
 | 
				
			||||||
 | 
					            <point key="canvasLocation" x="-16" y="-40"/>
 | 
				
			||||||
        </scene>
 | 
					        </scene>
 | 
				
			||||||
    </scenes>
 | 
					    </scenes>
 | 
				
			||||||
</document>
 | 
					</document>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,8 +2,6 @@
 | 
				
			|||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 | 
					<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 | 
				
			||||||
<plist version="1.0">
 | 
					<plist version="1.0">
 | 
				
			||||||
<dict>
 | 
					<dict>
 | 
				
			||||||
	<key>ITSAppUsesNonExemptEncryption</key>
 | 
					 | 
				
			||||||
	<false/>
 | 
					 | 
				
			||||||
	<key>CADisableMinimumFrameDurationOnPhone</key>
 | 
						<key>CADisableMinimumFrameDurationOnPhone</key>
 | 
				
			||||||
	<true/>
 | 
						<true/>
 | 
				
			||||||
	<key>CFBundleDevelopmentRegion</key>
 | 
						<key>CFBundleDevelopmentRegion</key>
 | 
				
			||||||
@@ -26,6 +24,8 @@
 | 
				
			|||||||
	<string>????</string>
 | 
						<string>????</string>
 | 
				
			||||||
	<key>CFBundleVersion</key>
 | 
						<key>CFBundleVersion</key>
 | 
				
			||||||
	<string>$(FLUTTER_BUILD_NUMBER)</string>
 | 
						<string>$(FLUTTER_BUILD_NUMBER)</string>
 | 
				
			||||||
 | 
						<key>ITSAppUsesNonExemptEncryption</key>
 | 
				
			||||||
 | 
						<false/>
 | 
				
			||||||
	<key>LSRequiresIPhoneOS</key>
 | 
						<key>LSRequiresIPhoneOS</key>
 | 
				
			||||||
	<true/>
 | 
						<true/>
 | 
				
			||||||
	<key>NSCameraUsageDescription</key>
 | 
						<key>NSCameraUsageDescription</key>
 | 
				
			||||||
@@ -36,6 +36,13 @@
 | 
				
			|||||||
	<string>Allow you add photo to your message or post</string>
 | 
						<string>Allow you add photo to your message or post</string>
 | 
				
			||||||
	<key>UIApplicationSupportsIndirectInputEvents</key>
 | 
						<key>UIApplicationSupportsIndirectInputEvents</key>
 | 
				
			||||||
	<true/>
 | 
						<true/>
 | 
				
			||||||
 | 
						<key>UIBackgroundModes</key>
 | 
				
			||||||
 | 
						<array>
 | 
				
			||||||
 | 
							<string>audio</string>
 | 
				
			||||||
 | 
							<string>fetch</string>
 | 
				
			||||||
 | 
							<string>remote-notification</string>
 | 
				
			||||||
 | 
							<string>voip</string>
 | 
				
			||||||
 | 
						</array>
 | 
				
			||||||
	<key>UILaunchStoryboardName</key>
 | 
						<key>UILaunchStoryboardName</key>
 | 
				
			||||||
	<string>LaunchScreen</string>
 | 
						<string>LaunchScreen</string>
 | 
				
			||||||
	<key>UIMainStoryboardFile</key>
 | 
						<key>UIMainStoryboardFile</key>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +1,4 @@
 | 
				
			|||||||
 | 
					import 'dart:async';
 | 
				
			||||||
import 'dart:math' as math;
 | 
					import 'dart:math' as math;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import 'package:flutter/material.dart';
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
@@ -5,6 +6,7 @@ import 'package:get/get.dart';
 | 
				
			|||||||
import 'package:solian/providers/content/call.dart';
 | 
					import 'package:solian/providers/content/call.dart';
 | 
				
			||||||
import 'package:solian/widgets/chat/call/call_controls.dart';
 | 
					import 'package:solian/widgets/chat/call/call_controls.dart';
 | 
				
			||||||
import 'package:solian/widgets/chat/call/call_participant.dart';
 | 
					import 'package:solian/widgets/chat/call/call_participant.dart';
 | 
				
			||||||
 | 
					import 'package:solian/widgets/prev_page.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class CallScreen extends StatefulWidget {
 | 
					class CallScreen extends StatefulWidget {
 | 
				
			||||||
  const CallScreen({super.key});
 | 
					  const CallScreen({super.key});
 | 
				
			||||||
@@ -14,6 +16,24 @@ class CallScreen extends StatefulWidget {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class _CallScreenState extends State<CallScreen> {
 | 
					class _CallScreenState extends State<CallScreen> {
 | 
				
			||||||
 | 
					  String parseDuration() {
 | 
				
			||||||
 | 
					    final ChatCallProvider provider = Get.find();
 | 
				
			||||||
 | 
					    if (provider.current.value == null) return '00:00:00';
 | 
				
			||||||
 | 
					    Duration duration =
 | 
				
			||||||
 | 
					        DateTime.now().difference(provider.current.value!.createdAt);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    String twoDigits(int n) => n.toString().padLeft(2, '0');
 | 
				
			||||||
 | 
					    String formattedTime = "${twoDigits(duration.inHours)}:"
 | 
				
			||||||
 | 
					        "${twoDigits(duration.inMinutes.remainder(60))}:"
 | 
				
			||||||
 | 
					        "${twoDigits(duration.inSeconds.remainder(60))}";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Timer.periodic(const Duration(seconds: 1), (_) {
 | 
				
			||||||
 | 
					      setState(() {});
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return formattedTime;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @override
 | 
					  @override
 | 
				
			||||||
  void initState() {
 | 
					  void initState() {
 | 
				
			||||||
    Get.find<ChatCallProvider>().setupRoom();
 | 
					    Get.find<ChatCallProvider>().setupRoom();
 | 
				
			||||||
@@ -26,73 +46,92 @@ class _CallScreenState extends State<CallScreen> {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    return Material(
 | 
					    return Material(
 | 
				
			||||||
      color: Theme.of(context).colorScheme.surface,
 | 
					      color: Theme.of(context).colorScheme.surface,
 | 
				
			||||||
      child: SafeArea(
 | 
					      child: Scaffold(
 | 
				
			||||||
        top: false,
 | 
					        appBar: AppBar(
 | 
				
			||||||
        child: Obx(
 | 
					          title: RichText(
 | 
				
			||||||
          () => Stack(
 | 
					            textAlign: TextAlign.center,
 | 
				
			||||||
            children: [
 | 
					            text: TextSpan(children: [
 | 
				
			||||||
              Column(
 | 
					              TextSpan(
 | 
				
			||||||
                children: [
 | 
					                text: 'call'.tr,
 | 
				
			||||||
                  Expanded(
 | 
					                style: Theme.of(context).textTheme.titleLarge,
 | 
				
			||||||
                    child: Container(
 | 
					 | 
				
			||||||
                      color: Theme.of(context).colorScheme.surfaceContainer,
 | 
					 | 
				
			||||||
                      child: provider.focusTrack.value != null
 | 
					 | 
				
			||||||
                          ? InteractiveParticipantWidget(
 | 
					 | 
				
			||||||
                              isFixed: false,
 | 
					 | 
				
			||||||
                              participant: provider.focusTrack.value!,
 | 
					 | 
				
			||||||
                              onTap: () {},
 | 
					 | 
				
			||||||
                            )
 | 
					 | 
				
			||||||
                          : const SizedBox(),
 | 
					 | 
				
			||||||
                    ),
 | 
					 | 
				
			||||||
                  ),
 | 
					 | 
				
			||||||
                  if (provider.room.localParticipant != null)
 | 
					 | 
				
			||||||
                    ControlsWidget(
 | 
					 | 
				
			||||||
                      provider.room,
 | 
					 | 
				
			||||||
                      provider.room.localParticipant!,
 | 
					 | 
				
			||||||
                    ),
 | 
					 | 
				
			||||||
                ],
 | 
					 | 
				
			||||||
              ),
 | 
					              ),
 | 
				
			||||||
              Positioned(
 | 
					              const TextSpan(text: "\n"),
 | 
				
			||||||
                left: 0,
 | 
					              TextSpan(
 | 
				
			||||||
                right: 0,
 | 
					                text: parseDuration(),
 | 
				
			||||||
                top: 0,
 | 
					                style: Theme.of(context).textTheme.bodySmall,
 | 
				
			||||||
                child: SizedBox(
 | 
					              ),
 | 
				
			||||||
                  height: 128,
 | 
					            ]),
 | 
				
			||||||
                  child: ListView.builder(
 | 
					          ),
 | 
				
			||||||
                    scrollDirection: Axis.horizontal,
 | 
					          leading: const PrevPageButton(),
 | 
				
			||||||
                    itemCount: math.max(0, provider.participantTracks.length),
 | 
					        ),
 | 
				
			||||||
                    itemBuilder: (BuildContext context, int index) {
 | 
					        body: SafeArea(
 | 
				
			||||||
                      final track = provider.participantTracks[index];
 | 
					          child: Obx(
 | 
				
			||||||
                      if (track.participant.sid ==
 | 
					            () => Stack(
 | 
				
			||||||
                          provider.focusTrack.value?.participant.sid) {
 | 
					              children: [
 | 
				
			||||||
                        return Container();
 | 
					                Column(
 | 
				
			||||||
                      }
 | 
					                  children: [
 | 
				
			||||||
 | 
					                    Expanded(
 | 
				
			||||||
 | 
					                      child: Container(
 | 
				
			||||||
 | 
					                        color: Theme.of(context).colorScheme.surfaceContainer,
 | 
				
			||||||
 | 
					                        child: provider.focusTrack.value != null
 | 
				
			||||||
 | 
					                            ? InteractiveParticipantWidget(
 | 
				
			||||||
 | 
					                                isFixed: false,
 | 
				
			||||||
 | 
					                                participant: provider.focusTrack.value!,
 | 
				
			||||||
 | 
					                                onTap: () {},
 | 
				
			||||||
 | 
					                              )
 | 
				
			||||||
 | 
					                            : const SizedBox(),
 | 
				
			||||||
 | 
					                      ),
 | 
				
			||||||
 | 
					                    ),
 | 
				
			||||||
 | 
					                    if (provider.room.localParticipant != null)
 | 
				
			||||||
 | 
					                      ControlsWidget(
 | 
				
			||||||
 | 
					                        provider.room,
 | 
				
			||||||
 | 
					                        provider.room.localParticipant!,
 | 
				
			||||||
 | 
					                      ),
 | 
				
			||||||
 | 
					                  ],
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
 | 
					                Positioned(
 | 
				
			||||||
 | 
					                  left: 0,
 | 
				
			||||||
 | 
					                  right: 0,
 | 
				
			||||||
 | 
					                  top: 0,
 | 
				
			||||||
 | 
					                  child: SizedBox(
 | 
				
			||||||
 | 
					                    height: 128,
 | 
				
			||||||
 | 
					                    child: ListView.builder(
 | 
				
			||||||
 | 
					                      scrollDirection: Axis.horizontal,
 | 
				
			||||||
 | 
					                      itemCount: math.max(0, provider.participantTracks.length),
 | 
				
			||||||
 | 
					                      itemBuilder: (BuildContext context, int index) {
 | 
				
			||||||
 | 
					                        final track = provider.participantTracks[index];
 | 
				
			||||||
 | 
					                        if (track.participant.sid ==
 | 
				
			||||||
 | 
					                            provider.focusTrack.value?.participant.sid) {
 | 
				
			||||||
 | 
					                          return Container();
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                      return Padding(
 | 
					                        return Padding(
 | 
				
			||||||
                        padding: const EdgeInsets.only(top: 8, left: 8),
 | 
					                          padding: const EdgeInsets.only(top: 8, left: 8),
 | 
				
			||||||
                        child: ClipRRect(
 | 
					                          child: ClipRRect(
 | 
				
			||||||
                          borderRadius:
 | 
					                            borderRadius:
 | 
				
			||||||
                              const BorderRadius.all(Radius.circular(8)),
 | 
					                                const BorderRadius.all(Radius.circular(8)),
 | 
				
			||||||
                          child: InteractiveParticipantWidget(
 | 
					                            child: InteractiveParticipantWidget(
 | 
				
			||||||
                            isFixed: true,
 | 
					                              isFixed: true,
 | 
				
			||||||
                            width: 120,
 | 
					                              width: 120,
 | 
				
			||||||
                            height: 120,
 | 
					                              height: 120,
 | 
				
			||||||
                            color: Theme.of(context).cardColor,
 | 
					                              color: Theme.of(context).cardColor,
 | 
				
			||||||
                            participant: track,
 | 
					                              participant: track,
 | 
				
			||||||
                            onTap: () {
 | 
					                              onTap: () {
 | 
				
			||||||
                              if (track.participant.sid !=
 | 
					                                if (track.participant.sid !=
 | 
				
			||||||
                                  provider.focusTrack.value?.participant.sid) {
 | 
					                                    provider
 | 
				
			||||||
                                provider.changeFocusTrack(track);
 | 
					                                        .focusTrack.value?.participant.sid) {
 | 
				
			||||||
                              }
 | 
					                                  provider.changeFocusTrack(track);
 | 
				
			||||||
                            },
 | 
					                                }
 | 
				
			||||||
 | 
					                              },
 | 
				
			||||||
 | 
					                            ),
 | 
				
			||||||
                          ),
 | 
					                          ),
 | 
				
			||||||
                        ),
 | 
					                        );
 | 
				
			||||||
                      );
 | 
					                      },
 | 
				
			||||||
                    },
 | 
					                    ),
 | 
				
			||||||
                  ),
 | 
					                  ),
 | 
				
			||||||
                ),
 | 
					                ),
 | 
				
			||||||
              ),
 | 
					              ],
 | 
				
			||||||
            ],
 | 
					            ),
 | 
				
			||||||
          ),
 | 
					          ),
 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
      ),
 | 
					      ),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -153,6 +153,7 @@ class SolianMessages extends Translations {
 | 
				
			|||||||
          'messageDeletionConfirm': 'Confirm message deletion',
 | 
					          'messageDeletionConfirm': 'Confirm message deletion',
 | 
				
			||||||
          'messageDeletionConfirmCaption':
 | 
					          'messageDeletionConfirmCaption':
 | 
				
			||||||
              'Are your sure to delete message @id? This action cannot be undone!',
 | 
					              'Are your sure to delete message @id? This action cannot be undone!',
 | 
				
			||||||
 | 
					          'call': 'Call',
 | 
				
			||||||
          'callOngoing': 'A call is ongoing...',
 | 
					          'callOngoing': 'A call is ongoing...',
 | 
				
			||||||
          'callJoin': 'Join',
 | 
					          'callJoin': 'Join',
 | 
				
			||||||
          'callResume': 'Resume',
 | 
					          'callResume': 'Resume',
 | 
				
			||||||
@@ -322,6 +323,7 @@ class SolianMessages extends Translations {
 | 
				
			|||||||
          'messageActionList': '消息的操作',
 | 
					          'messageActionList': '消息的操作',
 | 
				
			||||||
          'messageDeletionConfirm': '确认删除消息',
 | 
					          'messageDeletionConfirm': '确认删除消息',
 | 
				
			||||||
          'messageDeletionConfirmCaption': '你确定要删除消息 @id 吗?该操作不可撤销。',
 | 
					          'messageDeletionConfirmCaption': '你确定要删除消息 @id 吗?该操作不可撤销。',
 | 
				
			||||||
 | 
					          'call': '通话',
 | 
				
			||||||
          'callOngoing': '一则通话正在进行中…',
 | 
					          'callOngoing': '一则通话正在进行中…',
 | 
				
			||||||
          'callJoin': '加入',
 | 
					          'callJoin': '加入',
 | 
				
			||||||
          'callResume': '恢复',
 | 
					          'callResume': '恢复',
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -91,6 +91,7 @@ class _AttachmentListState extends State<AttachmentList> {
 | 
				
			|||||||
  @override
 | 
					  @override
 | 
				
			||||||
  void initState() {
 | 
					  void initState() {
 | 
				
			||||||
    super.initState();
 | 
					    super.initState();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    getMetadataList();
 | 
					    getMetadataList();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user