// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'package:flutter/material.dart';
import 'package:jni/jni.dart';

// The hierarchy created in generated code will mirror the java package
// structure. This is an implementation convenience and we may allow
// more customization in future.
import 'package:notification_plugin/com/example/notification_plugin.dart';

JlObject activity = JlObject.fromRef(Jni.getInstance().getCurrentActivity());

int i = 0;

void showNotification(String title, String text) {
  i = i + 1;
  var jTitle = JlString.fromString(title);
  var jText = JlString.fromString(text);
  Notifications.showNotification(activity, i, jTitle, jText);
  jTitle.delete();
  jText.delete();
}

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.teal,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatelessWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  final _title = TextEditingController(text: 'Hello from JNI');
  final _text = TextEditingController(text: '😀');

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
      ),
      body: Center(
        child: Padding(
          padding: const EdgeInsets.all(16),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              TextFormField(
                controller: _title,
                textCapitalization: TextCapitalization.sentences,
                decoration:
                    const InputDecoration(labelText: 'Notification title'),
              ),
              TextFormField(
                controller: _text,
                keyboardType: TextInputType.multiline,
                minLines: 1,
                maxLines: 4,
                decoration:
                    const InputDecoration(labelText: 'Notification text'),
              ),
              ElevatedButton(
                child: const Text('Show Notification'),
                onPressed: () => showNotification(_title.text, _text.text),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
