// 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.
import 'android_utils.dart';

JObject activity = JObject.fromRef(Jni.getCurrentActivity());

final hashmap = HashMap.ctor2(JString.type, JString.type);

extension IntX on int {
  JString toJString() {
    return toString().toJString();
  }
}

/// Display device model number and the number of times this was called
/// as Toast.
void showToast() {
  final toastCount =
      hashmap.getOrDefault("toastCount".toJString(), 0.toJString());
  final newToastCount = (int.parse(toastCount.toDartString()) + 1).toJString();
  hashmap.put("toastCount".toJString(), newToastCount);
  final message =
      '${newToastCount.toDartString()} - ${Build.MODEL.toDartString()}';
  AndroidUtils.showToast(activity, message.toJString(), 0);
}

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: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

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

  final String title;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              child: const Text('Show Device Model'),
              onPressed: () => showToast(),
            ),
          ],
        ),
      ),
    );
  }
}
