From 339be98f01f82f29a230584652eb2090bd0fc9e9 Mon Sep 17 00:00:00 2001 From: Jhalakupadhyay Date: Wed, 5 Jun 2024 23:58:27 +0530 Subject: [PATCH 1/2] chore: resolved merge conflicts --- lib/bademagic_module/bluetooth/bluetooth.dart | 258 +++++----- .../utils/byte_array_utils.dart | 52 +- .../utils/data_to_bytearray_converter.dart | 462 +++++++++--------- lib/providers/badge_message_provider.dart | 93 ++-- lib/providers/cardsprovider.dart | 55 ++- lib/view/homescreen.dart | 279 +++++++---- lib/view/widgets/speedial.dart | 252 ++++++++++ pubspec.lock | 47 +- pubspec.yaml | 2 + 9 files changed, 940 insertions(+), 560 deletions(-) create mode 100644 lib/view/widgets/speedial.dart diff --git a/lib/bademagic_module/bluetooth/bluetooth.dart b/lib/bademagic_module/bluetooth/bluetooth.dart index f35e6b84c..51ba9f389 100644 --- a/lib/bademagic_module/bluetooth/bluetooth.dart +++ b/lib/bademagic_module/bluetooth/bluetooth.dart @@ -1,129 +1,129 @@ -import 'dart:async'; -import 'package:badgemagic/bademagic_module/models/data.dart'; -import 'package:badgemagic/bademagic_module/utils/data_to_bytearray_converter.dart'; -import 'package:flutter_blue_plus/flutter_blue_plus.dart'; -import 'package:logger/logger.dart'; - -class BadgeMagicBluetooth { - static final Logger logger = Logger(); - - static Future writeCharacteristic( - BluetoothDevice device, - Guid characteristicId, - Data data, - ) async { - List> dataChunks = convert(data); - logger.d("Data to write: $dataChunks"); - - try { - List services = await device.discoverServices(); - for (BluetoothService service in services) { - for (BluetoothCharacteristic characteristic - in service.characteristics) { - if (characteristic.uuid == characteristicId && - characteristic.properties.write) { - for (int attempt = 1; attempt <= 3; attempt++) { - for (List chunk in dataChunks) { - bool success = false; - try { - await characteristic.write(chunk, withoutResponse: false); - await Future.delayed(const Duration( - milliseconds: 100)); // Add a delay between writes - success = true; - } catch (e) { - logger.e("Write failed, retrying ($attempt/3): $e"); - } - if (!success) { - throw Exception( - "Failed to write chunk after 3 attempts: $chunk"); - } - } - } - logger.d("Characteristic written successfully"); - return; // Exit once the target characteristic is written - } - } - } - logger.d("Target characteristic not found"); - } catch (e) { - logger.e("Failed to write characteristic: $e"); - } - } - - static Future scanAndConnect(Data data) async { - ScanResult? foundDevice; - - StreamSubscription>? subscription; - - try { - subscription = FlutterBluePlus.scanResults.listen( - (results) async { - if (results.isNotEmpty) { - foundDevice = results.firstWhere( - (result) => - result.device.remoteId.toString() == "50:54:7B:63:10:F5", - ); - if (foundDevice != null) { - await connectToDevice(foundDevice!, data); - } else { - logger.e("Target device not found."); - } - } - }, - onError: (e) { - logger.e("Scan error: $e"); - }, - ); - - await FlutterBluePlus.startScan( - withServices: [Guid("0000fee0-0000-1000-8000-00805f9b34fb")], - timeout: const Duration(seconds: 10), - ); - - // Wait for the scan to complete before cancelling the subscription - await Future.delayed(const Duration(seconds: 11)); - } finally { - await subscription?.cancel(); - } - } - - static Future connectToDevice(ScanResult scanResult, Data data) async { - const int maxRetries = 3; - int attempt = 0; - bool connected = false; - - while (attempt < maxRetries && !connected) { - try { - await scanResult.device.connect(autoConnect: false); - BluetoothConnectionState connectionState = - await scanResult.device.connectionState.first; - - if (connectionState == BluetoothConnectionState.connected) { - logger.d("Device connected"); - await writeCharacteristic( - scanResult.device, - Guid("0000fee1-0000-1000-8000-00805f9b34fb"), - data, - ); - connected = true; - } else { - logger.e("Failed to connect to the device"); - } - } catch (e) { - logger.e("Connection error: $e"); - attempt++; - if (attempt < maxRetries) { - logger.d("Retrying connection ($attempt/$maxRetries)..."); - await Future.delayed( - const Duration(seconds: 2)); // Wait before retrying - } else { - logger.e("Max retries reached. Connection failed."); - } - } finally { - if (!connected) { - await scanResult.device.disconnect(); - } - } - } - } -} +import 'dart:async'; +import 'package:badgemagic/bademagic_module/models/data.dart'; +import 'package:badgemagic/bademagic_module/utils/data_to_bytearray_converter.dart'; +import 'package:flutter_blue_plus/flutter_blue_plus.dart'; +import 'package:logger/logger.dart'; + +class BadgeMagicBluetooth { + static final Logger logger = Logger(); + + static Future writeCharacteristic( + BluetoothDevice device, + Guid characteristicId, + Data data, + ) async { + List> dataChunks = convert(data); + logger.d("Data to write: $dataChunks"); + + try { + List services = await device.discoverServices(); + for (BluetoothService service in services) { + for (BluetoothCharacteristic characteristic + in service.characteristics) { + if (characteristic.uuid == characteristicId && + characteristic.properties.write) { + for (int attempt = 1; attempt <= 3; attempt++) { + for (List chunk in dataChunks) { + bool success = false; + try { + await characteristic.write(chunk, withoutResponse: false); + await Future.delayed(const Duration( + milliseconds: 100)); // Add a delay between writes + success = true; + } catch (e) { + logger.e("Write failed, retrying ($attempt/3): $e"); + } + if (!success) { + throw Exception( + "Failed to write chunk after 3 attempts: $chunk"); + } + } + } + logger.d("Characteristic written successfully"); + return; // Exit once the target characteristic is written + } + } + } + logger.d("Target characteristic not found"); + } catch (e) { + logger.e("Failed to write characteristic: $e"); + } + } + + static Future scanAndConnect(Data data) async { + ScanResult? foundDevice; + + StreamSubscription>? subscription; + + try { + subscription = FlutterBluePlus.scanResults.listen( + (results) async { + if (results.isNotEmpty) { + foundDevice = results.firstWhere( + (result) => + result.device.remoteId.toString() == "50:54:7B:63:10:F5", + ); + if (foundDevice != null) { + await connectToDevice(foundDevice!, data); + } else { + logger.e("Target device not found."); + } + } + }, + onError: (e) { + logger.e("Scan error: $e"); + }, + ); + + await FlutterBluePlus.startScan( + withServices: [Guid("0000fee0-0000-1000-8000-00805f9b34fb")], + timeout: const Duration(seconds: 10), + ); + + // Wait for the scan to complete before cancelling the subscription + await Future.delayed(const Duration(seconds: 11)); + } finally { + await subscription?.cancel(); + } + } + + static Future connectToDevice(ScanResult scanResult, Data data) async { + const int maxRetries = 3; + int attempt = 0; + bool connected = false; + + while (attempt < maxRetries && !connected) { + try { + await scanResult.device.connect(autoConnect: false); + BluetoothConnectionState connectionState = + await scanResult.device.connectionState.first; + + if (connectionState == BluetoothConnectionState.connected) { + logger.d("Device connected"); + await writeCharacteristic( + scanResult.device, + Guid("0000fee1-0000-1000-8000-00805f9b34fb"), + data, + ); + connected = true; + } else { + logger.e("Failed to connect to the device"); + } + } catch (e) { + logger.e("Connection error: $e"); + attempt++; + if (attempt < maxRetries) { + logger.d("Retrying connection ($attempt/$maxRetries)..."); + await Future.delayed( + const Duration(seconds: 2)); // Wait before retrying + } else { + logger.e("Max retries reached. Connection failed."); + } + } finally { + if (!connected) { + await scanResult.device.disconnect(); + } + } + } + } +} diff --git a/lib/bademagic_module/utils/byte_array_utils.dart b/lib/bademagic_module/utils/byte_array_utils.dart index d95349221..c80026afc 100644 --- a/lib/bademagic_module/utils/byte_array_utils.dart +++ b/lib/bademagic_module/utils/byte_array_utils.dart @@ -1,26 +1,26 @@ -import 'package:logger/logger.dart'; - -final Logger logger = Logger(); - -String toHex(List bytes) { - StringBuffer buffer = StringBuffer(); - for (int byte in bytes) { - buffer.write('${byte < 16 ? '0' : ''}${byte.toRadixString(16)}'); - } - return buffer.toString().toUpperCase(); -} - -List hexStringToByteArray(String hexString) { - if (hexString.length % 2 != 0) { - throw ArgumentError("Invalid hex string: $hexString"); - } - - List data = []; - for (int i = 0; i < hexString.length; i += 2) { - int firstDigit = int.parse(hexString[i], radix: 16); - int secondDigit = int.parse(hexString[i + 1], radix: 16); - data.add((firstDigit << 4) + secondDigit); - } - logger.d(data.length); - return data; -} +import 'package:logger/logger.dart'; + +final Logger logger = Logger(); + +String toHex(List bytes) { + StringBuffer buffer = StringBuffer(); + for (int byte in bytes) { + buffer.write('${byte < 16 ? '0' : ''}${byte.toRadixString(16)}'); + } + return buffer.toString().toUpperCase(); +} + +List hexStringToByteArray(String hexString) { + if (hexString.length % 2 != 0) { + throw ArgumentError("Invalid hex string: $hexString"); + } + + List data = []; + for (int i = 0; i < hexString.length; i += 2) { + int firstDigit = int.parse(hexString[i], radix: 16); + int secondDigit = int.parse(hexString[i + 1], radix: 16); + data.add((firstDigit << 4) + secondDigit); + } + logger.d(data.length); + return data; +} diff --git a/lib/bademagic_module/utils/data_to_bytearray_converter.dart b/lib/bademagic_module/utils/data_to_bytearray_converter.dart index 94f670b01..0782e8e6d 100644 --- a/lib/bademagic_module/utils/data_to_bytearray_converter.dart +++ b/lib/bademagic_module/utils/data_to_bytearray_converter.dart @@ -1,231 +1,231 @@ -import 'package:badgemagic/bademagic_module/models/data.dart'; -import 'package:badgemagic/bademagic_module/utils/byte_array_utils.dart'; -import 'package:logger/logger.dart'; - -final Logger logger = Logger(); - -var maxMessages = 8; -var packetStart = "77616E670000"; -var packetByteSize = 16; - -Map charCodes = { - '0': "007CC6CEDEF6E6C6C67C00", - '1': "0018387818181818187E00", - '2': "007CC6060C183060C6FE00", - '3': "007CC606063C0606C67C00", - '4': "000C1C3C6CCCFE0C0C1E00", - '5': "00FEC0C0FC060606C67C00", - '6': "007CC6C0C0FCC6C6C67C00", - '7': "00FEC6060C183030303000", - '8': "007CC6C6C67CC6C6C67C00", - '9': "007CC6C6C67E0606C67C00", - '#': "006C6CFE6C6CFE6C6C0000", - '&': "00386C6C3876DCCCCC7600", - '_': "00000000000000000000FF", - '-': "0000000000FE0000000000", - '?': "007CC6C60C181800181800", - '@': "00003C429DA5ADB6403C00", - '(': "000C183030303030180C00", - ')': "0030180C0C0C0C0C183000", - '=': "0000007E00007E00000000", - '+': "00000018187E1818000000", - '!': "00183C3C3C181800181800", - '\'': "1818081000000000000000", - ':': "0000001818000018180000", - '%': "006092966C106CD2920C00", - '/': "000002060C183060C08000", - '"': "6666222200000000000000", - '[': "003C303030303030303C00", - ']': "003C0C0C0C0C0C0C0C3C00", - ' ': "0000000000000000000000", - '*': "000000663CFF3C66000000", - ',': "0000000000000030301020", - '.': "0000000000000000303000", - '\$': "107CD6D6701CD6D67C1010", - '~': "0076DC0000000000000000", - '{': "000E181818701818180E00", - '}': "00701818180E1818187000", - '<': "00060C18306030180C0600", - '>': "006030180C060C18306000", - '^': "386CC60000000000000000", - '`': "1818100800000000000000", - ';': "0000001818000018180810", - '\\': "0080C06030180C06020000", - '|': "0018181818001818181800", - 'a': "00000000780C7CCCCC7600", - 'b': "00E060607C666666667C00", - 'c': "000000007CC6C0C0C67C00", - 'd': "001C0C0C7CCCCCCCCC7600", - 'e': "000000007CC6FEC0C67C00", - 'f': "001C363078303030307800", - 'g': "00000076CCCCCC7C0CCC78", - 'h': "00E060606C76666666E600", - 'i': "0018180038181818183C00", - 'j': "0C0C001C0C0C0C0CCCCC78", - 'k': "00E06060666C78786CE600", - 'l': "0038181818181818183C00", - 'm': "00000000ECFED6D6D6C600", - 'n': "00000000DC666666666600", - 'o': "000000007CC6C6C6C67C00", - 'p': "000000DC6666667C6060F0", - 'q': "0000007CCCCCCC7C0C0C1E", - 'r': "00000000DE76606060F000", - 's': "000000007CC6701CC67C00", - 't': "00103030FC303030341800", - 'u': "00000000CCCCCCCCCC7600", - 'v': "00000000C6C6C66C381000", - 'w': "00000000C6D6D6D6FE6C00", - 'x': "00000000C66C38386CC600", - 'y': "000000C6C6C6C67E060CF8", - 'z': "00000000FE8C183062FE00", - 'A': "00386CC6C6FEC6C6C6C600", - 'B': "00FC6666667C666666FC00", - 'C': "007CC6C6C0C0C0C6C67C00", - 'D': "00FC66666666666666FC00", - 'E': "00FE66626878686266FE00", - 'F': "00FE66626878686060F000", - 'G': "007CC6C6C0C0CEC6C67E00", - 'H': "00C6C6C6C6FEC6C6C6C600", - 'I': "003C181818181818183C00", - 'J': "001E0C0C0C0C0CCCCC7800", - 'K': "00E6666C6C786C6C66E600", - 'L': "00F060606060606266FE00", - 'M': "0082C6EEFED6C6C6C6C600", - 'N': "0086C6E6F6DECEC6C6C600", - 'O': "007CC6C6C6C6C6C6C67C00", - 'P': "00FC6666667C606060F000", - 'Q': "007CC6C6C6C6C6D6DE7C06", - 'R': "00FC6666667C6C6666E600", - 'S': "007CC6C660380CC6C67C00", - 'T': "007E7E5A18181818183C00", - 'U': "00C6C6C6C6C6C6C6C67C00", - 'V': "00C6C6C6C6C6C66C381000", - 'W': "00C6C6C6C6D6FEEEC68200", - 'X': "00C6C66C7C387C6CC6C600", - 'Y': "00666666663C1818183C00", - 'Z': "00FEC6860C183062C6FE00" -}; - -//This function is used to add all the chunks of message that have been calculates -//and converts them into an array of byte characters -//this array of byte characters are stored in List -//this message is chunked into 32 bytes of each -//and each 32 bytes of the mesasge is then transmitted to the hexString to byte -//array function which generates a list of bytes to pass -List> convert(Data data) { - assert(data.messages.length <= maxMessages, "Max messages=$maxMessages"); - - String message = - ("$packetStart${getFlash(data)}${getMarquee(data)}${getOptions(data)}${getSizes(data)}000000000000${getTime(DateTime.now())}0000000000000000000000000000000000000000${getMessage(data)}"); - int length = message.length; - message += fillZeros(length); - logger.d("Final Message is = $message"); - List chunks = []; - int chunkSize = packetByteSize * 2; - for (var i = 0; i < message.length; i += chunkSize) { - int end = (i + chunkSize) < message.length ? i + chunkSize : message.length; - chunks.add(message.substring(i, end)); - } - List> ans = []; - for (int x = 0; x < chunks.length; x++) { - ans.add(hexStringToByteArray(chunks[x])); - } - return ans; -} - -//Function to get flash bytes of the message -String getFlash(Data data) { - List flashByte = List.filled(1, 0); - - data.messages.asMap().forEach((index, message) { - int flashFlag = message.flash ? 1 : 0; - flashByte[0] = flashByte[0] | (flashFlag << index) & 0xFF; - }); - logger.d("Get flash = ${toHex(flashByte)}"); - return toHex(flashByte); -} - -//Function to get the Marquee bytes of the message -String getMarquee(Data data) { - List marqueeBytes = List.filled(1, 0); - data.messages.asMap().forEach((index, message) { - int marqueeFlag = message.marquee ? 1 : 0; - marqueeBytes[0] = marqueeBytes[0] | (marqueeFlag << index) & 0xFF; - }); - logger.d("Get Marquee = ${toHex(marqueeBytes)}"); - return toHex(marqueeBytes); -} - -//gets the values of the mode and speed from the message and takes -//or operation on them and then converts them to hexadecimal value -String getOptions(Data data) { - final nbMessages = data.messages.length; - String ans = data.messages - .map((message) => - int.parse(message.speed.hexValue) | - int.parse(message.mode.hexValue)) - .map((value) => toHex(List.filled(1, value))) - .join() + - '00' * (maxMessages - nbMessages); - logger.d("get options = $ans"); - return ans; -} - -//gets the sizes of the message -String getSizes(Data data) { - final nbMessages = data.messages.length; - String ans = data.messages - .map((m) => m.text.length) - .map((length) => toHex([ - int.parse(((length >> 8) & 0xFF).toRadixString(16).padLeft(2, '0')), - int.parse((length & 0xFF).toRadixString(16).padLeft(2, '0')), - ])) - .join() - .padRight(32 - nbMessages * 4 + 4, '0'); - logger.d("get sizes = $ans"); - return ans; -} - -//Function converts the date time of the call to hexvalue -String getTime(DateTime now) { - String ans = toHex([ - int.parse((now.year & 0xFF).toString().padLeft(2, '0')), - int.parse(((now.month + 1) & 0xFF).toString().padLeft(2, '0')), - int.parse((now.day & 0xFF).toString().padLeft(2, '0')), - int.parse((now.hour & 0xFF).toString().padLeft(2, '0')), - int.parse((now.minute & 0xFF).toString().padLeft(2, '0')), - int.parse((now.second & 0xFF).toString().padLeft(2, '0')) - ]); - logger.d("get time = $ans"); - return ans; -} - -//Function to get messages -String getMessage(Data data) { - String msg = data.messages - .map((e) => e.text) - .join(' ') - .split("") - .where((element) => charCodes.containsKey(element)) - .map((e) => charCodes[e]) - .join(); - logger.d("get message = $msg"); - return msg; -} - -//filling he rest length with the 0 -String fillZeros(int length) { - String ans = "0" * - (((length / (packetByteSize * 2) + 1) * packetByteSize * 2) - length) - .toInt(); - logger.d("Fill wit zeroes = $ans"); - return ans; -} - -//function to display messages on the virtual badge -List displayVirtualBadge(Data data) { - String display = getMessage(data); - List ans = hexStringToByteArray(display); - logger.d(ans as String?); - return ans; -} +import 'package:badgemagic/bademagic_module/models/data.dart'; +import 'package:badgemagic/bademagic_module/utils/byte_array_utils.dart'; +import 'package:logger/logger.dart'; + +final Logger logger = Logger(); + +var maxMessages = 8; +var packetStart = "77616E670000"; +var packetByteSize = 16; + +Map charCodes = { + '0': "007CC6CEDEF6E6C6C67C00", + '1': "0018387818181818187E00", + '2': "007CC6060C183060C6FE00", + '3': "007CC606063C0606C67C00", + '4': "000C1C3C6CCCFE0C0C1E00", + '5': "00FEC0C0FC060606C67C00", + '6': "007CC6C0C0FCC6C6C67C00", + '7': "00FEC6060C183030303000", + '8': "007CC6C6C67CC6C6C67C00", + '9': "007CC6C6C67E0606C67C00", + '#': "006C6CFE6C6CFE6C6C0000", + '&': "00386C6C3876DCCCCC7600", + '_': "00000000000000000000FF", + '-': "0000000000FE0000000000", + '?': "007CC6C60C181800181800", + '@': "00003C429DA5ADB6403C00", + '(': "000C183030303030180C00", + ')': "0030180C0C0C0C0C183000", + '=': "0000007E00007E00000000", + '+': "00000018187E1818000000", + '!': "00183C3C3C181800181800", + '\'': "1818081000000000000000", + ':': "0000001818000018180000", + '%': "006092966C106CD2920C00", + '/': "000002060C183060C08000", + '"': "6666222200000000000000", + '[': "003C303030303030303C00", + ']': "003C0C0C0C0C0C0C0C3C00", + ' ': "0000000000000000000000", + '*': "000000663CFF3C66000000", + ',': "0000000000000030301020", + '.': "0000000000000000303000", + '\$': "107CD6D6701CD6D67C1010", + '~': "0076DC0000000000000000", + '{': "000E181818701818180E00", + '}': "00701818180E1818187000", + '<': "00060C18306030180C0600", + '>': "006030180C060C18306000", + '^': "386CC60000000000000000", + '`': "1818100800000000000000", + ';': "0000001818000018180810", + '\\': "0080C06030180C06020000", + '|': "0018181818001818181800", + 'a': "00000000780C7CCCCC7600", + 'b': "00E060607C666666667C00", + 'c': "000000007CC6C0C0C67C00", + 'd': "001C0C0C7CCCCCCCCC7600", + 'e': "000000007CC6FEC0C67C00", + 'f': "001C363078303030307800", + 'g': "00000076CCCCCC7C0CCC78", + 'h': "00E060606C76666666E600", + 'i': "0018180038181818183C00", + 'j': "0C0C001C0C0C0C0CCCCC78", + 'k': "00E06060666C78786CE600", + 'l': "0038181818181818183C00", + 'm': "00000000ECFED6D6D6C600", + 'n': "00000000DC666666666600", + 'o': "000000007CC6C6C6C67C00", + 'p': "000000DC6666667C6060F0", + 'q': "0000007CCCCCCC7C0C0C1E", + 'r': "00000000DE76606060F000", + 's': "000000007CC6701CC67C00", + 't': "00103030FC303030341800", + 'u': "00000000CCCCCCCCCC7600", + 'v': "00000000C6C6C66C381000", + 'w': "00000000C6D6D6D6FE6C00", + 'x': "00000000C66C38386CC600", + 'y': "000000C6C6C6C67E060CF8", + 'z': "00000000FE8C183062FE00", + 'A': "00386CC6C6FEC6C6C6C600", + 'B': "00FC6666667C666666FC00", + 'C': "007CC6C6C0C0C0C6C67C00", + 'D': "00FC66666666666666FC00", + 'E': "00FE66626878686266FE00", + 'F': "00FE66626878686060F000", + 'G': "007CC6C6C0C0CEC6C67E00", + 'H': "00C6C6C6C6FEC6C6C6C600", + 'I': "003C181818181818183C00", + 'J': "001E0C0C0C0C0CCCCC7800", + 'K': "00E6666C6C786C6C66E600", + 'L': "00F060606060606266FE00", + 'M': "0082C6EEFED6C6C6C6C600", + 'N': "0086C6E6F6DECEC6C6C600", + 'O': "007CC6C6C6C6C6C6C67C00", + 'P': "00FC6666667C606060F000", + 'Q': "007CC6C6C6C6C6D6DE7C06", + 'R': "00FC6666667C6C6666E600", + 'S': "007CC6C660380CC6C67C00", + 'T': "007E7E5A18181818183C00", + 'U': "00C6C6C6C6C6C6C6C67C00", + 'V': "00C6C6C6C6C6C66C381000", + 'W': "00C6C6C6C6D6FEEEC68200", + 'X': "00C6C66C7C387C6CC6C600", + 'Y': "00666666663C1818183C00", + 'Z': "00FEC6860C183062C6FE00" +}; + +//This function is used to add all the chunks of message that have been calculates +//and converts them into an array of byte characters +//this array of byte characters are stored in List +//this message is chunked into 32 bytes of each +//and each 32 bytes of the mesasge is then transmitted to the hexString to byte +//array function which generates a list of bytes to pass +List> convert(Data data) { + assert(data.messages.length <= maxMessages, "Max messages=$maxMessages"); + + String message = + ("$packetStart${getFlash(data)}${getMarquee(data)}${getOptions(data)}${getSizes(data)}000000000000${getTime(DateTime.now())}0000000000000000000000000000000000000000${getMessage(data)}"); + int length = message.length; + message += fillZeros(length); + logger.d("Final Message is = $message"); + List chunks = []; + int chunkSize = packetByteSize * 2; + for (var i = 0; i < message.length; i += chunkSize) { + int end = (i + chunkSize) < message.length ? i + chunkSize : message.length; + chunks.add(message.substring(i, end)); + } + List> ans = []; + for (int x = 0; x < chunks.length; x++) { + ans.add(hexStringToByteArray(chunks[x])); + } + return ans; +} + +//Function to get flash bytes of the message +String getFlash(Data data) { + List flashByte = List.filled(1, 0); + + data.messages.asMap().forEach((index, message) { + int flashFlag = message.flash ? 1 : 0; + flashByte[0] = flashByte[0] | (flashFlag << index) & 0xFF; + }); + logger.d("Get flash = ${toHex(flashByte)}"); + return toHex(flashByte); +} + +//Function to get the Marquee bytes of the message +String getMarquee(Data data) { + List marqueeBytes = List.filled(1, 0); + data.messages.asMap().forEach((index, message) { + int marqueeFlag = message.marquee ? 1 : 0; + marqueeBytes[0] = marqueeBytes[0] | (marqueeFlag << index) & 0xFF; + }); + logger.d("Get Marquee = ${toHex(marqueeBytes)}"); + return toHex(marqueeBytes); +} + +//gets the values of the mode and speed from the message and takes +//or operation on them and then converts them to hexadecimal value +String getOptions(Data data) { + final nbMessages = data.messages.length; + String ans = data.messages + .map((message) => + int.parse(message.speed.hexValue) | + int.parse(message.mode.hexValue)) + .map((value) => toHex(List.filled(1, value))) + .join() + + '00' * (maxMessages - nbMessages); + logger.d("get options = $ans"); + return ans; +} + +//gets the sizes of the message +String getSizes(Data data) { + final nbMessages = data.messages.length; + String ans = data.messages + .map((m) => m.text.length) + .map((length) => toHex([ + int.parse(((length >> 8) & 0xFF).toRadixString(16).padLeft(2, '0')), + int.parse((length & 0xFF).toRadixString(16).padLeft(2, '0')), + ])) + .join() + .padRight(32 - nbMessages * 4 + 4, '0'); + logger.d("get sizes = $ans"); + return ans; +} + +//Function converts the date time of the call to hexvalue +String getTime(DateTime now) { + String ans = toHex([ + int.parse((now.year & 0xFF).toString().padLeft(2, '0')), + int.parse(((now.month + 1) & 0xFF).toString().padLeft(2, '0')), + int.parse((now.day & 0xFF).toString().padLeft(2, '0')), + int.parse((now.hour & 0xFF).toString().padLeft(2, '0')), + int.parse((now.minute & 0xFF).toString().padLeft(2, '0')), + int.parse((now.second & 0xFF).toString().padLeft(2, '0')) + ]); + logger.d("get time = $ans"); + return ans; +} + +//Function to get messages +String getMessage(Data data) { + String msg = data.messages + .map((e) => e.text) + .join(' ') + .split("") + .where((element) => charCodes.containsKey(element)) + .map((e) => charCodes[e]) + .join(); + logger.d("get message = $msg"); + return msg; +} + +//filling he rest length with the 0 +String fillZeros(int length) { + String ans = "0" * + (((length / (packetByteSize * 2) + 1) * packetByteSize * 2) - length) + .toInt(); + logger.d("Fill wit zeroes = $ans"); + return ans; +} + +//function to display messages on the virtual badge +List displayVirtualBadge(Data data) { + String display = getMessage(data); + List ans = hexStringToByteArray(display); + logger.d(ans as String?); + return ans; +} diff --git a/lib/providers/badge_message_provider.dart b/lib/providers/badge_message_provider.dart index 41dfcf34b..fb0a9460d 100644 --- a/lib/providers/badge_message_provider.dart +++ b/lib/providers/badge_message_provider.dart @@ -1,40 +1,53 @@ -import 'package:badgemagic/bademagic_module/bluetooth/bluetooth.dart'; -import 'package:badgemagic/bademagic_module/models/data.dart'; -import 'package:badgemagic/bademagic_module/models/messages.dart'; -import 'package:badgemagic/bademagic_module/models/mode.dart'; -import 'package:badgemagic/bademagic_module/models/speed.dart'; -import 'package:flutter/material.dart'; -import 'package:logger/logger.dart'; - -class BadgeMessageProvider extends ChangeNotifier { - static final Logger logger = Logger(); - - Map modeValueMap = { - 0: Mode.left, - 1: Mode.right, - 2: Mode.up, - 3: Mode.down, - 4: Mode.fixed, - 5: Mode.snowflake, - 6: Mode.picture, - 7: Mode.animation, - 8: Mode.laser - }; - - void generateMessage( - String text, bool flash, bool marq, Speed speed, Mode mode) { - Data data = Data(messages: [ - Message(text: text, flash: flash, marquee: marq, speed: speed, mode: mode) - ]); - dataFormed(data); - transferData(data); - } - - void transferData(Data data) { - BadgeMagicBluetooth.scanAndConnect(data); - logger.d(".......Data is being transferred......."); - } - - void dataFormed(Data data) => logger.d( - "${data.messages.length} message : ${data.messages[0].text} Flash : ${data.messages[0].flash} Marquee : ${data.messages[0].marquee} Mode : ${data.messages[0].mode}"); -} +import 'package:badgemagic/bademagic_module/bluetooth/bluetooth.dart'; +import 'package:badgemagic/bademagic_module/models/data.dart'; +import 'package:badgemagic/bademagic_module/models/messages.dart'; +import 'package:badgemagic/bademagic_module/models/mode.dart'; +import 'package:badgemagic/bademagic_module/models/speed.dart'; +import 'package:flutter/material.dart'; +import 'package:logger/logger.dart'; + +class BadgeMessageProvider extends ChangeNotifier { + BadgeMagicBluetooth badgeMagicBluetooth = BadgeMagicBluetooth(); + static final Logger logger = Logger(); + + Map modeValueMap = { + 0: Mode.left, + 1: Mode.right, + 2: Mode.up, + 3: Mode.down, + 4: Mode.fixed, + 5: Mode.snowflake, + 6: Mode.picture, + 7: Mode.animation, + 8: Mode.laser + }; + + Map speedMap = { + 1: Speed.one, + 2: Speed.two, + 3: Speed.three, + 4: Speed.four, + 5: Speed.five, + 6: Speed.six, + 7: Speed.seven, + 8: Speed.eight, + }; + + Data generateMessage( + String text, bool flash, bool marq, Speed speed, Mode mode) { + Data data = Data(messages: [ + Message(text: text, flash: flash, marquee: marq, speed: speed, mode: mode) + ]); + dataFormed(data); + transferData(data); + return data; + } + + void transferData(Data data) { + BadgeMagicBluetooth.scanAndConnect(data); + logger.d(".......Data is being transferred......."); + } + + void dataFormed(Data data) => logger.d( + "${data.messages.length} message : ${data.messages[0].text} Flash : ${data.messages[0].flash} Marquee : ${data.messages[0].marquee} Mode : ${data.messages[0].mode}"); +} diff --git a/lib/providers/cardsprovider.dart b/lib/providers/cardsprovider.dart index c15b0a747..2717d4a6e 100644 --- a/lib/providers/cardsprovider.dart +++ b/lib/providers/cardsprovider.dart @@ -1,23 +1,32 @@ -import 'package:flutter/material.dart'; - -class CardProvider extends ChangeNotifier { - TextEditingController message = TextEditingController(); - int animationIndex = 0; - List effectsIndex = [0, 0, 0]; - - int getAnimationIndex() => animationIndex; - - TextEditingController getController() => message; - - int getEffectIndex(int index) => effectsIndex[index]; - - void setAnimationIndex(int index) { - animationIndex = index; - notifyListeners(); - } - - void setEffectIndex(int index) { - effectsIndex[index] = effectsIndex[index] == 1 ? 0 : 1; - notifyListeners(); - } -} +import 'package:flutter/material.dart'; + +class CardProvider extends ChangeNotifier { + int outerValue = 1; + + int getOuterValue() => outerValue; + + void setOuterValue(int value) { + outerValue = value; + notifyListeners(); + } + + TextEditingController message = TextEditingController(); + int animationIndex = 0; + List effectsIndex = [0, 0, 0]; + + int getAnimationIndex() => animationIndex; + + TextEditingController getController() => message; + + int getEffectIndex(int index) => effectsIndex[index]; + + void setAnimationIndex(int index) { + animationIndex = index; + notifyListeners(); + } + + void setEffectIndex(int index) { + effectsIndex[index] = effectsIndex[index] == 1 ? 0 : 1; + notifyListeners(); + } +} diff --git a/lib/view/homescreen.dart b/lib/view/homescreen.dart index 25b64013d..ffaa81245 100644 --- a/lib/view/homescreen.dart +++ b/lib/view/homescreen.dart @@ -1,98 +1,181 @@ -import 'package:badgemagic/bademagic_module/models/speed.dart'; -import 'package:badgemagic/providers/badge_message_provider.dart'; -import 'package:badgemagic/providers/cardsprovider.dart'; -import 'package:badgemagic/view/widgets/homescreentabs.dart'; -import 'package:flutter/material.dart'; -import 'package:logger/logger.dart'; -import 'package:provider/provider.dart'; - -class HomeScreen extends StatefulWidget { - const HomeScreen({super.key}); - - @override - State createState() => _HomeScreenState(); -} - -class _HomeScreenState extends State with TickerProviderStateMixin { - static final Logger logger = Logger(); - - late final TabController _tabController; - @override - void initState() { - super.initState(); - _tabController = TabController(length: 3, vsync: this); - } - - @override - Widget build(BuildContext context) { - BadgeMessageProvider badgeData = Provider.of(context); - CardProvider cardData = Provider.of(context); - return DefaultTabController( - length: 3, - child: Scaffold( - appBar: AppBar( - backgroundColor: Colors.red, - title: const Text( - 'Badge Magic', - style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold), - ), - centerTitle: true, - ), - body: SafeArea( - child: Column( - children: [ - const Badge(), - Container( - margin: const EdgeInsets.all(15), - child: Material( - borderRadius: BorderRadius.circular(10), - elevation: 10, - child: TextField( - controller: cardData.getController(), - decoration: InputDecoration( - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(10)), - prefixIcon: const Icon(Icons.tag_faces_outlined), - focusedBorder: const OutlineInputBorder( - borderSide: BorderSide(color: Colors.red))), - ), - ), - ), - TabBar( - indicatorSize: TabBarIndicatorSize.label, - controller: _tabController, - tabs: const [ - Tab(text: 'Speed'), - Tab(text: 'Animation'), - Tab(text: 'Effects'), - ], - ), - Expanded( - child: TabBarView( - controller: _tabController, - children: [ - Container(), - const AnimationTab(), - const EffectTab(), - ], - ), - ), - TextButton( - onPressed: () async { - logger.d( - "${cardData.getAnimationIndex()} : ${cardData.getController().text} : ${cardData.getEffectIndex(2)}"); - badgeData.generateMessage( - cardData.getController().text, - cardData.getEffectIndex(1) == 1, - cardData.getEffectIndex(2) == 1, - Speed.eight, - badgeData.modeValueMap[cardData.getAnimationIndex()]!); - }, - child: const Text('Transffer')) - ], - ), - ), - ), - ); - } -} +import 'package:badgemagic/bademagic_module/models/data.dart'; +import 'package:badgemagic/providers/badge_message_provider.dart'; +import 'package:badgemagic/providers/cardsprovider.dart'; +import 'package:badgemagic/view/widgets/homescreentabs.dart'; +import 'package:badgemagic/view/widgets/speedial.dart'; +import 'package:badgemagic/virtualbadge/view/badgeui.dart'; +import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:logger/logger.dart'; +import 'package:provider/provider.dart'; + +class HomeScreen extends StatefulWidget { + const HomeScreen({super.key}); + + @override + State createState() => _HomeScreenState(); +} + +class _HomeScreenState extends State with TickerProviderStateMixin { + static final Logger logger = Logger(); + + late final TabController _tabController; + BadgeMessageProvider badgeData = BadgeMessageProvider(); + + @override + void initState() { + super.initState(); + _tabController = TabController(length: 3, vsync: this); + } + + Future transferData(BuildContext context, CardProvider cardData) async { + Fluttertoast.showToast( + msg: "Transferring...", + toastLength: Toast.LENGTH_LONG, + gravity: ToastGravity.BOTTOM, + backgroundColor: Colors.black, + textColor: Colors.white, + fontSize: 16.0, + ); + + try { + Data data = badgeData.generateMessage( + cardData.getController().text, + cardData.getEffectIndex(1) == 1, + cardData.getEffectIndex(2) == 1, + badgeData.speedMap[cardData.getOuterValue()]!, + badgeData.modeValueMap[cardData.getAnimationIndex()]!, + ); + + Fluttertoast.showToast( + msg: "Transfer successful", + toastLength: Toast.LENGTH_SHORT, + gravity: ToastGravity.BOTTOM, + backgroundColor: Colors.green, + textColor: Colors.white, + fontSize: 16.0, + ); + } catch (e) { + Fluttertoast.showToast( + msg: "Transfer failed: $e", + toastLength: Toast.LENGTH_LONG, + gravity: ToastGravity.CENTER, + backgroundColor: Colors.red, + textColor: Colors.white, + fontSize: 16.0, + ); + } + } + + @override + Widget build(BuildContext context) { + double height = MediaQuery.of(context).size.height; + double width = MediaQuery.of(context).size.width; + CardProvider cardData = Provider.of(context); + return DefaultTabController( + length: 3, + child: Scaffold( + appBar: AppBar( + backgroundColor: Colors.red, + title: const Text( + 'Badge Magic', + style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold), + ), + centerTitle: true, + ), + body: SafeArea( + child: Container( + height: height, + width: width, + child: Column( + children: [ + BMBadge(), + Container( + margin: const EdgeInsets.all(15), + child: Material( + borderRadius: BorderRadius.circular(10), + elevation: 10, + child: TextField( + controller: cardData.getController(), + decoration: InputDecoration( + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10)), + prefixIcon: const Icon(Icons.tag_faces_outlined), + focusedBorder: const OutlineInputBorder( + borderSide: BorderSide(color: Colors.red))), + ), + ), + ), + TabBar( + indicatorSize: TabBarIndicatorSize.label, + controller: _tabController, + tabs: const [ + Tab(text: 'Speed'), + Tab(text: 'Animation'), + Tab(text: 'Effects'), + ], + ), + SingleChildScrollView( + child: Container( + child: Column( + children: [ + AspectRatio( + aspectRatio: 1.5, + child: TabBarView( + physics: const NeverScrollableScrollPhysics(), + controller: _tabController, + children: const [ + RadialDial(), + AnimationTab(), + EffectTab(), + ], + ), + ), + Container( + padding: EdgeInsets.only( + bottom: height * 0.2, + top: height * 0.02), // Adjust the value as needed + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + GestureDetector( + onTap: () { + if (cardData.getController().text.isEmpty) { + Fluttertoast.showToast( + msg: + "Please enter some text to transfer.", + toastLength: Toast.LENGTH_SHORT, + gravity: ToastGravity.BOTTOM, + backgroundColor: Colors.red, + textColor: Colors.white, + fontSize: 16.0, + ); + return; + } + transferData(context, cardData); + }, + child: Container( + padding: EdgeInsets.symmetric( + horizontal: 20, vertical: 8), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: Colors.grey.shade400, + ), + child: Text('Transfer'), + ), + ), + ], + ), + ), + ], + ), + ), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/view/widgets/speedial.dart b/lib/view/widgets/speedial.dart new file mode 100644 index 000000000..1afb273cf --- /dev/null +++ b/lib/view/widgets/speedial.dart @@ -0,0 +1,252 @@ +import 'package:badgemagic/providers/cardsprovider.dart'; +import 'package:flutter/material.dart'; +import 'dart:math'; + +import 'package:provider/provider.dart'; + +class InnerDialPainter extends CustomPainter { + @override + void paint(Canvas canvas, Size size) { + final center = Offset(size.width / 2, size.height / 2); + final radius = min(size.width / 2, size.height / 2) * 0.9; + + final paint = Paint() + ..color = Colors.grey.shade300 + ..style = PaintingStyle.stroke + ..strokeWidth = 12; + + canvas.drawCircle(center, radius, paint); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) { + return false; + } +} + +class RadialDialPainter extends CustomPainter { + final double value; + final double max; + final Color color; + + RadialDialPainter({ + required this.value, + required this.max, + required this.color, + }); + + @override + void paint(Canvas canvas, Size size) { + final center = Offset(size.width / 2, size.height / 2); + final radius = min(size.width / 2, size.height / 2) * 0.8; + + final paint = Paint() + ..color = Colors.grey.shade300 + ..style = PaintingStyle.stroke + ..strokeCap = StrokeCap.round + ..strokeWidth = 15; + + const startAngle = 3 * pi / 4; + + canvas.drawArc( + Rect.fromCircle(center: center, radius: radius), + startAngle, + 6 * pi / 4, + false, + paint, + ); + + final Progresspaint = Paint() + ..color = Colors.red + ..style = PaintingStyle.stroke + ..strokeCap = StrokeCap.round + ..strokeWidth = 15; + + canvas.drawArc( + Rect.fromCircle(center: center, radius: radius), + startAngle, + 6 * pi / 4 * (value / max), + false, + Progresspaint, + ); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) { + return true; + } +} + +class InnerPointerPainter extends CustomPainter { + final double value; + final double max; + final Color color; + + InnerPointerPainter({ + required this.value, + required this.max, + required this.color, + }); + + @override + void paint(Canvas canvas, Size size) { + final center = Offset(size.width / 2, size.height / 2); + final radius = min(size.width / 2, size.height / 2) * 0.8; + + final pointerAngle = 3 * pi / 4 + 6 * pi / 4 * (value / max); + final pointerLength = radius + 25; + + final pointerPaint = Paint() + ..color = color + ..strokeCap = StrokeCap.round + ..strokeWidth = 4; + + final pointerStart = Offset( + center.dx + radius * cos(pointerAngle), + center.dy + radius * sin(pointerAngle), + ); + final pointerEnd = Offset( + center.dx + pointerLength * cos(pointerAngle), + center.dy + pointerLength * sin(pointerAngle), + ); + + canvas.drawLine(pointerStart, pointerEnd, pointerPaint); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) { + return true; + } +} + +class RadialDial extends StatefulWidget { + const RadialDial({super.key}); + + @override + // ignore: library_private_types_in_public_api + _RadialDialState createState() => _RadialDialState(); +} + +class _RadialDialState extends State { + double outerValue = 0.0; + final double maxValue = 8.0; + + final double initialAngle = 155 * pi / 180; + double previousAngle = 0.0; + bool isDragging = true; + + @override + void initState() { + super.initState(); + + previousAngle = initialAngle; + } + + @override + Widget build(BuildContext context) { + CardProvider outerValueProvider = Provider.of(context); + + void _updateOuterValue(double angle) { + const startAngle = 155 * pi / 270; + const endAngle = 360 * pi / 180; + + const totalAngle = endAngle - startAngle; + + final numSections = maxValue; + + final anglePerSection = totalAngle / numSections; + + final section = ((angle - startAngle) / anglePerSection).round(); + + final clampedSection = section.clamp(1, numSections); + + setState(() { + outerValueProvider.setOuterValue(clampedSection.toInt()); + }); + } + + void _updateAngle(Offset position, Size size) { + if (!isDragging) return; + + final center = Offset(size.width / 2, size.height / 2); + final dx = position.dx - center.dx; + final dy = position.dy - center.dy; + final distanceFromCenter = sqrt(dx * dx + dy * dy); + + if (distanceFromCenter > size.width / 2) return; + + var angle = atan2(dy, dx); + + if (angle < 0) { + angle += 2 * pi; + } + + const startAngle = 155 * pi / 270; + const endAngle = 360 * pi / 180; + + if (angle >= startAngle && angle <= endAngle) { + if ((angle >= previousAngle && angle <= endAngle) || + (angle < startAngle && previousAngle < startAngle) || + (angle - previousAngle).abs() < pi) { + setState(() { + _updateOuterValue(angle); + }); + } + previousAngle = angle; + } + } + + return Stack( + alignment: Alignment.center, + children: [ + CustomPaint( + painter: RadialDialPainter( + value: outerValueProvider.getOuterValue().toDouble(), + max: maxValue, + color: Colors.red), + child: const SizedBox( + width: 250, + height: 250, + ), + ), + CustomPaint( + painter: InnerDialPainter(), + child: Container( + color: Colors.transparent, + width: 170, + height: 170, + ), + ), + GestureDetector( + onPanUpdate: (details) { + if (isDragging) { + RenderBox renderBox = context.findRenderObject() as RenderBox; + Offset localPosition = + renderBox.globalToLocal(details.globalPosition); + _updateAngle(localPosition, renderBox.size); + } + }, + child: CustomPaint( + painter: InnerPointerPainter( + value: outerValueProvider.getOuterValue().toDouble(), + max: maxValue, + color: Colors.red), + child: const SizedBox( + width: 80, + height: 80, + ), + ), + ), + Positioned( + child: Text( + (outerValueProvider.getOuterValue()).toString(), + style: const TextStyle( + fontSize: 60, + fontWeight: FontWeight.w600, + color: Color.fromRGBO(113, 113, 113, 1)), + ), + ), + ], + ); + } +} diff --git a/pubspec.lock b/pubspec.lock index 972a95d4d..d7a39f67a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -139,6 +139,19 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + fluttertoast: + dependency: "direct main" + description: + name: fluttertoast + sha256: "7eae679e596a44fdf761853a706f74979f8dd3cd92cf4e23cae161fda091b847" + url: "https://pub.dev" + source: hosted + version: "8.2.6" glob: dependency: transitive description: @@ -151,26 +164,26 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" url: "https://pub.dev" source: hosted - version: "10.0.4" + version: "10.0.0" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "2.0.1" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "2.0.1" lints: dependency: transitive description: @@ -207,10 +220,10 @@ packages: dependency: transitive description: name: meta - sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" + sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.11.0" nested: dependency: transitive description: @@ -300,10 +313,10 @@ packages: dependency: transitive description: name: test_api - sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" + sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" url: "https://pub.dev" source: hosted - version: "0.7.0" + version: "0.6.1" typed_data: dependency: transitive description: @@ -324,10 +337,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" + sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 url: "https://pub.dev" source: hosted - version: "14.2.1" + version: "13.0.0" watcher: dependency: transitive description: @@ -336,6 +349,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" + web: + dependency: transitive + description: + name: web + sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" + url: "https://pub.dev" + source: hosted + version: "0.5.1" yaml: dependency: transitive description: @@ -346,4 +367,4 @@ packages: version: "3.1.2" sdks: dart: ">=3.3.4 <4.0.0" - flutter: ">=3.18.0-18.0.pre.54" + flutter: ">=2.5.0" diff --git a/pubspec.yaml b/pubspec.yaml index 0053a5311..982e429c8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -37,6 +37,7 @@ dependencies: cupertino_icons: ^1.0.6 provider: ^6.1.2 flutter_blue_plus: ^1.32.7 + fluttertoast: ^8.2.6 logger: ^2.3.0 dev_dependencies: @@ -94,3 +95,4 @@ flutter: # # For details regarding fonts from package dependencies, # see https://flutter.dev/custom-fonts/#from-packages + From d54dd5a946d143f094d83fec4148bccc76eef6a3 Mon Sep 17 00:00:00 2001 From: Jhalakupadhyay Date: Fri, 7 Jun 2024 14:23:00 +0530 Subject: [PATCH 2/2] chore: formated code --- lib/providers/badge_message_provider.dart | 3 +- lib/view/homescreen.dart | 105 ++++++++++------------ lib/view/widgets/speedial.dart | 12 +-- 3 files changed, 56 insertions(+), 64 deletions(-) diff --git a/lib/providers/badge_message_provider.dart b/lib/providers/badge_message_provider.dart index fb0a9460d..a93bff283 100644 --- a/lib/providers/badge_message_provider.dart +++ b/lib/providers/badge_message_provider.dart @@ -33,14 +33,13 @@ class BadgeMessageProvider extends ChangeNotifier { 8: Speed.eight, }; - Data generateMessage( + void generateMessage( String text, bool flash, bool marq, Speed speed, Mode mode) { Data data = Data(messages: [ Message(text: text, flash: flash, marquee: marq, speed: speed, mode: mode) ]); dataFormed(data); transferData(data); - return data; } void transferData(Data data) { diff --git a/lib/view/homescreen.dart b/lib/view/homescreen.dart index ffaa81245..9cef9920e 100644 --- a/lib/view/homescreen.dart +++ b/lib/view/homescreen.dart @@ -1,4 +1,3 @@ -import 'package:badgemagic/bademagic_module/models/data.dart'; import 'package:badgemagic/providers/badge_message_provider.dart'; import 'package:badgemagic/providers/cardsprovider.dart'; import 'package:badgemagic/view/widgets/homescreentabs.dart'; @@ -6,7 +5,6 @@ import 'package:badgemagic/view/widgets/speedial.dart'; import 'package:badgemagic/virtualbadge/view/badgeui.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; -import 'package:logger/logger.dart'; import 'package:provider/provider.dart'; class HomeScreen extends StatefulWidget { @@ -17,8 +15,6 @@ class HomeScreen extends StatefulWidget { } class _HomeScreenState extends State with TickerProviderStateMixin { - static final Logger logger = Logger(); - late final TabController _tabController; BadgeMessageProvider badgeData = BadgeMessageProvider(); @@ -39,7 +35,7 @@ class _HomeScreenState extends State with TickerProviderStateMixin { ); try { - Data data = badgeData.generateMessage( + badgeData.generateMessage( cardData.getController().text, cardData.getEffectIndex(1) == 1, cardData.getEffectIndex(2) == 1, @@ -84,12 +80,12 @@ class _HomeScreenState extends State with TickerProviderStateMixin { centerTitle: true, ), body: SafeArea( - child: Container( + child: SizedBox( height: height, width: width, child: Column( children: [ - BMBadge(), + const BMBadge(), Container( margin: const EdgeInsets.all(15), child: Material( @@ -116,59 +112,56 @@ class _HomeScreenState extends State with TickerProviderStateMixin { ], ), SingleChildScrollView( - child: Container( - child: Column( - children: [ - AspectRatio( - aspectRatio: 1.5, - child: TabBarView( - physics: const NeverScrollableScrollPhysics(), - controller: _tabController, - children: const [ - RadialDial(), - AnimationTab(), - EffectTab(), - ], - ), + child: Column( + children: [ + AspectRatio( + aspectRatio: 1.5, + child: TabBarView( + physics: const NeverScrollableScrollPhysics(), + controller: _tabController, + children: const [ + RadialDial(), + AnimationTab(), + EffectTab(), + ], ), - Container( - padding: EdgeInsets.only( - bottom: height * 0.2, - top: height * 0.02), // Adjust the value as needed - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - GestureDetector( - onTap: () { - if (cardData.getController().text.isEmpty) { - Fluttertoast.showToast( - msg: - "Please enter some text to transfer.", - toastLength: Toast.LENGTH_SHORT, - gravity: ToastGravity.BOTTOM, - backgroundColor: Colors.red, - textColor: Colors.white, - fontSize: 16.0, - ); - return; - } - transferData(context, cardData); - }, - child: Container( - padding: EdgeInsets.symmetric( - horizontal: 20, vertical: 8), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10), - color: Colors.grey.shade400, - ), - child: Text('Transfer'), + ), + Container( + padding: EdgeInsets.only( + bottom: height * 0.2, + top: height * 0.02), // Adjust the value as needed + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + GestureDetector( + onTap: () { + if (cardData.getController().text.isEmpty) { + Fluttertoast.showToast( + msg: "Please enter some text to transfer.", + toastLength: Toast.LENGTH_SHORT, + gravity: ToastGravity.BOTTOM, + backgroundColor: Colors.red, + textColor: Colors.white, + fontSize: 16.0, + ); + return; + } + transferData(context, cardData); + }, + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: 20, vertical: 8), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: Colors.grey.shade400, ), + child: const Text('Transfer'), ), - ], - ), + ), + ], ), - ], - ), + ), + ], ), ), ], diff --git a/lib/view/widgets/speedial.dart b/lib/view/widgets/speedial.dart index 1afb273cf..411239608 100644 --- a/lib/view/widgets/speedial.dart +++ b/lib/view/widgets/speedial.dart @@ -56,7 +56,7 @@ class RadialDialPainter extends CustomPainter { paint, ); - final Progresspaint = Paint() + final progressPaint = Paint() ..color = Colors.red ..style = PaintingStyle.stroke ..strokeCap = StrokeCap.round @@ -67,7 +67,7 @@ class RadialDialPainter extends CustomPainter { startAngle, 6 * pi / 4 * (value / max), false, - Progresspaint, + progressPaint, ); } @@ -146,7 +146,7 @@ class _RadialDialState extends State { Widget build(BuildContext context) { CardProvider outerValueProvider = Provider.of(context); - void _updateOuterValue(double angle) { + void updateOuterValue(double angle) { const startAngle = 155 * pi / 270; const endAngle = 360 * pi / 180; @@ -165,7 +165,7 @@ class _RadialDialState extends State { }); } - void _updateAngle(Offset position, Size size) { + void updateAngle(Offset position, Size size) { if (!isDragging) return; final center = Offset(size.width / 2, size.height / 2); @@ -189,7 +189,7 @@ class _RadialDialState extends State { (angle < startAngle && previousAngle < startAngle) || (angle - previousAngle).abs() < pi) { setState(() { - _updateOuterValue(angle); + updateOuterValue(angle); }); } previousAngle = angle; @@ -223,7 +223,7 @@ class _RadialDialState extends State { RenderBox renderBox = context.findRenderObject() as RenderBox; Offset localPosition = renderBox.globalToLocal(details.globalPosition); - _updateAngle(localPosition, renderBox.size); + updateAngle(localPosition, renderBox.size); } }, child: CustomPaint(