Skip to content
Merged
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
4 changes: 4 additions & 0 deletions .github/workflows/version_and_tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,10 @@ jobs:
steps:
# https://github.com/marketplace/actions/checkout
- uses: actions/checkout@main
# https://github.com/webfactory/ssh-agent
- uses: webfactory/ssh-agent@v0.9.0
with:
ssh-private-key: ${{ secrets.WHISP_SSH_PRIVATE_KEY }}
# https://github.com/marketplace/actions/flutter-action
- name: Extract flutter SDK version from FVM
run: echo "FLUTTER_SDK_VERSION=$(jq -r '.flutterSdkVersion' .fvm/fvm_config.json)" >> $GITHUB_ENV
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

# Miscellaneous
*.class
#*.lock
*.lock
*.log
*.pyc
*.swp
Expand Down
17 changes: 1 addition & 16 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,19 +43,4 @@ fvm flutter pub run build_runner watch --delete-conflicting-outputs
## Contributing
Pull requests are welcomed. For major changes, please open an issue first, to enable a discussion on what you would like to improve. Please make sure to provide and update tests as well.

## [Licence](./LICENSE.md)

A new Flutter project.

## Getting Started

This project is a starting point for a Flutter application.

A few resources to get you started if this is your first Flutter project:

- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)

For help getting started with Flutter development, view the
[online documentation](https://docs.flutter.dev/), which offers tutorials,
samples, guidance on mobile development, and a full API reference.
## [Licence](./LICENSE.md)
Binary file added assets/blue_cloud.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/blue_cloud_anim.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/cream_cloud.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/cream_cloud_anim.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/fonts/Kalam-Bold.ttf
Binary file not shown.
Binary file added assets/snggle_face.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions lib/cubit/receive_tab_cubit/a_receive_tab_state.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import 'package:equatable/equatable.dart';

abstract class AReceiveTabState extends Equatable {
const AReceiveTabState();
}
78 changes: 78 additions & 0 deletions lib/cubit/receive_tab_cubit/receive_tab_cubit.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:mrumru/mrumru.dart';
import 'package:whisp/cubit/receive_tab_cubit/a_receive_tab_state.dart';
import 'package:whisp/cubit/receive_tab_cubit/states/receive_tab_empty_state.dart';
import 'package:whisp/cubit/receive_tab_cubit/states/receive_tab_failed_state.dart';
import 'package:whisp/cubit/receive_tab_cubit/states/receive_tab_recording_state.dart';
import 'package:whisp/cubit/receive_tab_cubit/states/receive_tab_result_state.dart';
import 'package:whisp/shared/audio_settings_mode.dart';
import 'package:whisp/shared/utils/logger/app_logger.dart';

class ReceiveTabCubit extends Cubit<AReceiveTabState> {
AudioSettingsModel _audioSettingsModel = AudioSettingsModel(
frequencyGenerator: MusicalFrequencyGenerator(
frequencies: MusicalFrequencies.fdm9FullScaleAMaj,
),
);
late AudioDecoder _audioDecoder;
bool _canceledByUserBool = false;

ReceiveTabCubit() : super(const ReceiveTabEmptyState());

void resetScreen() {
emit(const ReceiveTabEmptyState());
}

void switchAudioType(AudioSettingsMode audioSettingsMode) {
if (audioSettingsMode == AudioSettingsMode.rocket) {
_audioSettingsModel = AudioSettingsModel(frequencyGenerator: StandardFrequencyGenerator(subbandCount: 32));
} else {
_audioSettingsModel = AudioSettingsModel(
frequencyGenerator: MusicalFrequencyGenerator(
frequencies: MusicalFrequencies.fdm9FullScaleAMaj,
),
);
}
}

void startRecording() {
try {
_audioDecoder = AudioDecoder(
audioSettingsModel: _audioSettingsModel,
onMetadataFrameReceived: _handleMetadataFrameReceived,
onDecodingCompleted: _handleDecodingCompleted,
onDecodingFailed: _handleDecodingFailed,
);
emit(const ReceiveTabRecordingState());
_audioDecoder.startRecording();
} catch (e) {
AppLogger().log(message: 'Cannot start recording: $e');
emit(const ReceiveTabEmptyState());
}
}

void stopRecording() {
_canceledByUserBool = true;
emit(const ReceiveTabEmptyState());
_audioDecoder.cancelRecording();
}

void _handleDecodingCompleted(FrameCollectionModel frameCollectionModel) {
if (_canceledByUserBool == false) {
List<String> decodedMessagePartList = frameCollectionModel.getMessageParts();
emit(ReceiveTabResultState(
decodedMessagePartList: decodedMessagePartList,
brokenMessageIndexList: frameCollectionModel.getBrokenDataFrameIndexes(),
));
}
_canceledByUserBool = false;
}

void _handleDecodingFailed() {
emit(const ReceiveTabFailedState());
}

void _handleMetadataFrameReceived(MetadataFrameModel metadataFrameModel) {
emit(const ReceiveTabRecordingState(decodingBool: true));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import 'package:whisp/cubit/receive_tab_cubit/a_receive_tab_state.dart';

class ReceiveTabEmptyState extends AReceiveTabState {
const ReceiveTabEmptyState();

@override
List<Object?> get props => <Object>[];
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import 'package:whisp/cubit/receive_tab_cubit/a_receive_tab_state.dart';

class ReceiveTabFailedState extends AReceiveTabState {
const ReceiveTabFailedState();

@override
List<Object?> get props => <Object>[];
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import 'package:whisp/cubit/receive_tab_cubit/a_receive_tab_state.dart';

class ReceiveTabRecordingState extends AReceiveTabState {
final bool decodingBool;

const ReceiveTabRecordingState({
this.decodingBool = false,
});

@override
List<Object?> get props => <Object>[decodingBool];
}
17 changes: 17 additions & 0 deletions lib/cubit/receive_tab_cubit/states/receive_tab_result_state.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import 'package:whisp/cubit/receive_tab_cubit/a_receive_tab_state.dart';

class ReceiveTabResultState extends AReceiveTabState {
final List<String> decodedMessagePartList;
final List<int> brokenMessageIndexList;

const ReceiveTabResultState({
required this.decodedMessagePartList,
required this.brokenMessageIndexList,
});

@override
List<Object?> get props => <Object>[
decodedMessagePartList,
brokenMessageIndexList,
];
}
10 changes: 10 additions & 0 deletions lib/cubit/theme_cubit/a_theme_state.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import 'package:equatable/equatable.dart';
import 'package:whisp/cubit/theme_cubit/theme_assets.dart';

abstract class AThemeState extends Equatable {
final ThemeAssets themeAssets;

const AThemeState({
required this.themeAssets,
});
}
29 changes: 29 additions & 0 deletions lib/cubit/theme_cubit/states/theme_dark_state.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import 'package:flutter/material.dart';
import 'package:whisp/cubit/theme_cubit/a_theme_state.dart';
import 'package:whisp/cubit/theme_cubit/theme_assets.dart';
import 'package:whisp/widgets/outlined_icon.dart';

class ThemeDarkState extends AThemeState {
ThemeDarkState()
: super(
themeAssets: ThemeAssets(
cloudStill: Image.asset('assets/blue_cloud.png', fit: BoxFit.cover),
cloudMoving: Image.asset('assets/blue_cloud_anim.webp', fit: BoxFit.cover, filterQuality: FilterQuality.none),
snggleFace: Image.asset('assets/snggle_face.gif', fit: BoxFit.contain),
backgroundColor: const Color(0xff245161),
primaryColor: const Color(0xffd6e7f2),
particlesColor: const Color(0xff5e676c).withOpacity(0.1),
textColor: Colors.white,
themeChangeIcon: const OutlinedIcon(
icon: Icons.nightlight,
outlineWidth: 4,
outlineColor: Colors.black,
fillColor: Color(0xffd6e7f2),
size: 40,
),
),
);

@override
List<Object?> get props => <Object>[themeAssets];
}
29 changes: 29 additions & 0 deletions lib/cubit/theme_cubit/states/theme_light_state.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import 'package:flutter/material.dart';
import 'package:whisp/cubit/theme_cubit/a_theme_state.dart';
import 'package:whisp/cubit/theme_cubit/theme_assets.dart';
import 'package:whisp/widgets/outlined_icon.dart';

class ThemeLightState extends AThemeState {
ThemeLightState()
: super(
themeAssets: ThemeAssets(
cloudStill: Image.asset('assets/cream_cloud.png', fit: BoxFit.cover),
cloudMoving: Image.asset('assets/cream_cloud_anim.webp', fit: BoxFit.cover, filterQuality: FilterQuality.none),
snggleFace: Image.asset('assets/snggle_face.gif', fit: BoxFit.contain),
backgroundColor: const Color(0xffecad9d),
primaryColor: const Color(0xffffead2),
particlesColor: const Color(0xff726a60).withOpacity(0.1),
textColor: Colors.black,
themeChangeIcon: const OutlinedIcon(
icon: Icons.sunny,
outlineWidth: 4,
outlineColor: Colors.black,
fillColor: Color(0xffffead2),
size: 40,
),
),
);

@override
List<Object?> get props => <Object>[themeAssets];
}
28 changes: 28 additions & 0 deletions lib/cubit/theme_cubit/theme_assets.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import 'package:equatable/equatable.dart';
import 'package:flutter/material.dart';
import 'package:whisp/widgets/outlined_icon.dart';

class ThemeAssets extends Equatable {
final Image cloudStill;
final Image cloudMoving;
final Image snggleFace;
final Color backgroundColor;
final Color primaryColor;
final Color particlesColor;
final Color textColor;
final OutlinedIcon themeChangeIcon;

const ThemeAssets({
required this.cloudStill,
required this.cloudMoving,
required this.snggleFace,
required this.backgroundColor,
required this.primaryColor,
required this.particlesColor,
required this.textColor,
required this.themeChangeIcon,
});

@override
List<Object?> get props => <Object>[cloudStill, cloudMoving, snggleFace, backgroundColor, primaryColor, particlesColor, textColor, themeChangeIcon];
}
16 changes: 16 additions & 0 deletions lib/cubit/theme_cubit/theme_cubit.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:whisp/cubit/theme_cubit/a_theme_state.dart';
import 'package:whisp/cubit/theme_cubit/states/theme_dark_state.dart';
import 'package:whisp/cubit/theme_cubit/states/theme_light_state.dart';

class ThemeCubit extends Cubit<AThemeState> {
ThemeCubit() : super(ThemeLightState());

void switchTheme() {
if (state is ThemeLightState) {
emit(ThemeDarkState());
} else {
emit(ThemeLightState());
}
}
}
Loading