Skip to content

Commit

Permalink
Merge branch 'category'
Browse files Browse the repository at this point in the history
  • Loading branch information
LucaCoduriV committed Jun 11, 2023
2 parents 63b4e48 + e52ca4c commit bf5418f
Show file tree
Hide file tree
Showing 17 changed files with 825 additions and 193 deletions.
Binary file modified images/notification_center.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 modified images/notification_popup.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions notiflut_daemon/lib/src/native/bridge_definitions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,9 @@ class DaemonAction with _$DaemonAction {
int field0,
) = DaemonAction_FlutterClose;
const factory DaemonAction.flutterCloseAll() = DaemonAction_FlutterCloseAll;
const factory DaemonAction.flutterCloseAllApp(
String field0,
) = DaemonAction_FlutterCloseAllApp;
const factory DaemonAction.flutterActionInvoked(
int field0,
String field1,
Expand Down
258 changes: 258 additions & 0 deletions notiflut_daemon/lib/src/native/bridge_definitions.freezed.dart

Large diffs are not rendered by default.

30 changes: 29 additions & 1 deletion notiflut_daemon/lib/src/native/bridge_generated.dart
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,10 @@ class NativeImpl implements Native {
case 6:
return DaemonAction_FlutterCloseAll();
case 7:
return DaemonAction_FlutterCloseAllApp(
_wire2api_String(raw[1]),
);
case 8:
return DaemonAction_FlutterActionInvoked(
_wire2api_u32(raw[1]),
_wire2api_String(raw[2]),
Expand Down Expand Up @@ -533,10 +537,17 @@ class NativePlatform extends FlutterRustBridgeBase<NativeWire> {
wireObj.tag = 6;
return;
}
if (apiObj is DaemonAction_FlutterCloseAllApp) {
var pre_field0 = api2wire_String(apiObj.field0);
wireObj.tag = 7;
wireObj.kind = inner.inflate_DaemonAction_FlutterCloseAllApp();
wireObj.kind.ref.FlutterCloseAllApp.ref.field0 = pre_field0;
return;
}
if (apiObj is DaemonAction_FlutterActionInvoked) {
var pre_field0 = api2wire_u32(apiObj.field0);
var pre_field1 = api2wire_String(apiObj.field1);
wireObj.tag = 7;
wireObj.tag = 8;
wireObj.kind = inner.inflate_DaemonAction_FlutterActionInvoked();
wireObj.kind.ref.FlutterActionInvoked.ref.field0 = pre_field0;
wireObj.kind.ref.FlutterActionInvoked.ref.field1 = pre_field1;
Expand Down Expand Up @@ -946,6 +957,17 @@ class NativeWire implements FlutterRustBridgeWireBase {
_inflate_DaemonAction_FlutterClosePtr
.asFunction<ffi.Pointer<DaemonActionKind> Function()>();

ffi.Pointer<DaemonActionKind> inflate_DaemonAction_FlutterCloseAllApp() {
return _inflate_DaemonAction_FlutterCloseAllApp();
}

late final _inflate_DaemonAction_FlutterCloseAllAppPtr =
_lookup<ffi.NativeFunction<ffi.Pointer<DaemonActionKind> Function()>>(
'inflate_DaemonAction_FlutterCloseAllApp');
late final _inflate_DaemonAction_FlutterCloseAllApp =
_inflate_DaemonAction_FlutterCloseAllAppPtr
.asFunction<ffi.Pointer<DaemonActionKind> Function()>();

ffi.Pointer<DaemonActionKind> inflate_DaemonAction_FlutterActionInvoked() {
return _inflate_DaemonAction_FlutterActionInvoked();
}
Expand Down Expand Up @@ -1136,6 +1158,10 @@ class wire_DaemonAction_FlutterClose extends ffi.Struct {

class wire_DaemonAction_FlutterCloseAll extends ffi.Opaque {}

class wire_DaemonAction_FlutterCloseAllApp extends ffi.Struct {
external ffi.Pointer<wire_uint_8_list> field0;
}

class wire_DaemonAction_FlutterActionInvoked extends ffi.Struct {
@ffi.Uint32()
external int field0;
Expand All @@ -1158,6 +1184,8 @@ class DaemonActionKind extends ffi.Union {

external ffi.Pointer<wire_DaemonAction_FlutterCloseAll> FlutterCloseAll;

external ffi.Pointer<wire_DaemonAction_FlutterCloseAllApp> FlutterCloseAllApp;

external ffi.Pointer<wire_DaemonAction_FlutterActionInvoked>
FlutterActionInvoked;
}
Expand Down
169 changes: 169 additions & 0 deletions notiflut_daemon/lib/src/widgets/category.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
import 'package:flutter/material.dart' hide BoxDecoration, BoxShadow;
import 'package:flutter_inset_box_shadow/flutter_inset_box_shadow.dart';
import 'package:notiflut_land/src/widgets/notification.dart';
import '../native.dart' as nati;
import '../native/bridge_definitions.dart' as nati;

class NotificationCategory extends StatefulWidget {
final String appName;
final List<NotificationTile> children;
final bool defaultState;

const NotificationCategory({
required this.appName,
this.defaultState = false,
this.children = const [],
super.key,
});

@override
State<NotificationCategory> createState() => _NotificationCategoryState();
}

class _NotificationCategoryState extends State<NotificationCategory> {
bool _open = false;

@override
void initState() {
super.initState();
_open = widget.defaultState;
}

@override
Widget build(BuildContext context) {
return Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Padding(
padding: const EdgeInsets.fromLTRB(10, 0, 0, 0),
child: Text(
widget.appName.capitalize(),
style: const TextStyle(color: Colors.white),
),
),
if (widget.children.length > 1)
Row(
children: [
ElevatedButton(
style: const ButtonStyle(
backgroundColor:
MaterialStatePropertyAll(Color(0xBBE0E0E0)),
shape: MaterialStatePropertyAll(
RoundedRectangleBorder(
borderRadius:
BorderRadius.all(Radius.circular(10))),
)),
onPressed: () {
setState(() {
_open = !_open;
});
},
child: Text(_open ? "Show less" : "See more",
style: const TextStyle(color: Colors.black)),
),
SizedBox(width: 20),
CircleAvatar(
radius: 15,
backgroundColor: const Color(0xBBE0E0E0),
child: IconButton(
iconSize: 15,
icon: const Icon(
Icons.close,
color: Colors.black,
),
onPressed: () {
nati.api.sendDaemonAction(
action: nati.DaemonAction.flutterCloseAllApp(
widget.appName));
},
),
),
SizedBox(width: 5),
],
),
],
),
AnimatedCrossFade(
firstChild: widget.children.isEmpty
? NotificationTile.empty()
: NotificationTileStack(widget.children[0]),
secondChild: Column(children: widget.children),
crossFadeState: widget.children.length == 1
? CrossFadeState.showSecond
: _open
? CrossFadeState.showSecond
: CrossFadeState.showFirst,
duration: const Duration(milliseconds: 300),
),
],
);
}
}

class NotificationTileStack extends StatelessWidget {
final NotificationTile tile;
const NotificationTileStack(this.tile, {super.key});

Widget buildFakeNotificationBottomTile(BuildContext context, int lvl) {
return Container(
margin: EdgeInsets.fromLTRB(10 + lvl * 10, 0, 10 + lvl * 10, 0),
decoration: const BoxDecoration(
color: Color(0xBBE0E0E0),
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(30),
bottomRight: Radius.circular(30),
),
boxShadow: [
BoxShadow(
color: Colors.black54,
blurRadius: 1.0,
offset: Offset(0.0, 0.75),
inset: true,
)
],
),
height: 10,
);
}

@override
Widget build(BuildContext context) {
return Column(
children: [
Stack(
children: [
tile,
Column(
children: [
Visibility(
visible: false,
maintainSize: true,
maintainAnimation: true,
maintainState: true,
child: NotificationTile(
tile.id,
tile.appName,
tile.title,
tile.body,
actions: tile.actions,
margin: const EdgeInsets.fromLTRB(4, 4, 4, 0),
),
),
buildFakeNotificationBottomTile(context, 1),
buildFakeNotificationBottomTile(context, 2),
],
)
],
),
],
);
}
}

extension StringExtension on String {
String capitalize() {
return "${this[0].toUpperCase()}${substring(1)}";
}
}
8 changes: 8 additions & 0 deletions notiflut_daemon/lib/src/widgets/notification.dart
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,11 @@ class NotificationTile extends StatelessWidget {
final Function()? closeAction;
final List<NotificationAction>? actions;
final DateTime? createdAt;
final EdgeInsetsGeometry? margin;

factory NotificationTile.empty() {
return NotificationTile(0, "", "", "");
}

const NotificationTile(
this.id,
Expand All @@ -63,6 +68,7 @@ class NotificationTile extends StatelessWidget {
this.onTileTap,
this.actions,
this.createdAt,
this.margin,
});
// This widget is the root of your application.
@override
Expand All @@ -84,6 +90,8 @@ class NotificationTile extends StatelessWidget {
}
}
return Card(
margin: margin,
color: const Color(0xBBE0E0E0),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
child: Column(
children: [
Expand Down
Loading

0 comments on commit bf5418f

Please sign in to comment.