Commit 5867701e authored by Gandha Ryanto's avatar Gandha Ryanto

Update to lib null safety

parent 58351685
...@@ -26,7 +26,7 @@ apply plugin: 'kotlin-android' ...@@ -26,7 +26,7 @@ apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android { android {
compileSdkVersion 30 compileSdkVersion 33
sourceSets { sourceSets {
main.java.srcDirs += 'src/main/kotlin' main.java.srcDirs += 'src/main/kotlin'
...@@ -36,7 +36,7 @@ android { ...@@ -36,7 +36,7 @@ android {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.mdd.flutter_mdd_simulator" applicationId "com.mdd.flutter_mdd_simulator"
minSdkVersion 22 minSdkVersion 22
targetSdkVersion 30 targetSdkVersion 33
versionCode flutterVersionCode.toInteger() versionCode flutterVersionCode.toInteger()
versionName flutterVersionName versionName flutterVersionName
} }
...@@ -48,6 +48,8 @@ android { ...@@ -48,6 +48,8 @@ android {
signingConfig signingConfigs.debug signingConfig signingConfigs.debug
} }
} }
namespace 'com.mdd.flutter_mdd_simulator'
} }
flutter { flutter {
...@@ -56,4 +58,5 @@ flutter { ...@@ -56,4 +58,5 @@ flutter {
dependencies { dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation "androidx.core:core-ktx:1.6.10"
} }
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android">
package="com.mdd.flutter_mdd_simulator">
<!-- Flutter needs it to communicate with the running application <!-- Flutter needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc. to allow setting breakpoints, to provide hot reload, etc.
--> -->
......
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android">
package="com.mdd.flutter_mdd_simulator">
<application <application
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
android:label="flutter_mdd_simulator" android:label="flutter_mdd_simulator"
android:networkSecurityConfig="@xml/network_security_config"
android:preserveLegacyExternalStorage="true" android:preserveLegacyExternalStorage="true"
android:requestLegacyExternalStorage="true"> android:requestLegacyExternalStorage="true">
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:exported="true"
android:hardwareAccelerated="true" android:hardwareAccelerated="true"
android:launchMode="singleTop" android:launchMode="singleTop"
android:theme="@style/LaunchTheme" android:theme="@style/LaunchTheme"
......
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">apidev.mdd.co.id</domain>
</domain-config>
</network-security-config>
\ No newline at end of file
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android">
package="com.mdd.flutter_mdd_simulator">
<!-- Flutter needs it to communicate with the running application <!-- Flutter needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc. to allow setting breakpoints, to provide hot reload, etc.
--> -->
......
buildscript { buildscript {
ext.kotlin_version = '1.3.50' ext.kotlin_version = '1.8.0'
repositories { repositories {
google() google()
jcenter() jcenter()
mavenCentral()
maven {
url "https://mobile-repo.mdd.co.id:8081/artifactory/android-library/"
allowInsecureProtocol(true)
credentials {
username = "admin"
password = "Mddcoid*123#"
}
}
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:4.1.0' classpath 'com.android.tools.build:gradle:7.4.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
} }
} }
...@@ -15,6 +24,15 @@ allprojects { ...@@ -15,6 +24,15 @@ allprojects {
repositories { repositories {
google() google()
jcenter() jcenter()
mavenCentral()
maven {
url "https://mobile-repo.mdd.co.id:8081/artifactory/android-library/"
allowInsecureProtocol(true)
credentials {
username = "admin"
password = "Mddcoid*123#"
}
}
} }
} }
...@@ -26,6 +44,6 @@ subprojects { ...@@ -26,6 +44,6 @@ subprojects {
project.evaluationDependsOn(':app') project.evaluationDependsOn(':app')
} }
task clean(type: Delete) { tasks.register("clean", Delete) {
delete rootProject.buildDir delete rootProject.buildDir
} }
...@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME ...@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-all.zip
import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/painting.dart';
import 'package:flutter_mdd_simulator/screen/TapCard.dart'; import 'package:flutter_mdd_simulator/screen/TapCard.dart';
import 'package:prepaid_lib_flutter/unik_lib_flutter.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:prepaid_lib_flutter_null_safety/unik_lib_flutter.dart';
void main() { void main() {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
...@@ -21,7 +23,7 @@ class MyApp extends StatelessWidget { ...@@ -21,7 +23,7 @@ class MyApp extends StatelessWidget {
} }
class NfcScan extends StatefulWidget { class NfcScan extends StatefulWidget {
NfcScan({Key key}) : super(key: key); NfcScan({Key? key}) : super(key: key);
@override @override
_MyAppState createState() => _MyAppState(); _MyAppState createState() => _MyAppState();
...@@ -31,10 +33,11 @@ class _MyAppState extends State<NfcScan> { ...@@ -31,10 +33,11 @@ class _MyAppState extends State<NfcScan> {
String _balance = "0", _cardNumber = "000000000000000", _status = "Unknown"; String _balance = "0", _cardNumber = "000000000000000", _status = "Unknown";
String _bgCard = "images/mandiri_bg.png"; String _bgCard = "images/mandiri_bg.png";
bool _isLoading = false; bool _isLoading = false;
String paidAmount; String? paidAmount;
String _identifier = 'Unknown'; String _identifier = 'Unknown';
String _bankName; String? _bankName;
bool isSuccessInit; bool? isSuccessInit;
List<dynamic>? listHistory;
@override @override
void initState() { void initState() {
...@@ -44,16 +47,19 @@ class _MyAppState extends State<NfcScan> { ...@@ -44,16 +47,19 @@ class _MyAppState extends State<NfcScan> {
void initLibrary() async { void initLibrary() async {
isSuccessInit = await UnikLibFlutter.initUnikLib( isSuccessInit = await UnikLibFlutter.initUnikLib(
"49df5f81d59fae23ec6f542372fc9497" /*"1234567abc"*/, 1); "4dd9063acfc04848b801288f23c6eeff" /*"1234567abc"*/, 1);
print("isSuccessInit $isSuccessInit"); print("isSuccessInit $isSuccessInit");
} }
void getCardInfo() async { void getCardInfo() async {
_setStateDefault();
/// optional you can use List<String> varName = List<String>.filled(1, ""); /// optional you can use List<String> varName = List<String>.filled(1, "");
List<String> cardUid = List(1); List<String> cardUid = [''];
List<String> cardNumber = List(1); List<String> cardNumber = [''];
List<String> balance = List(1); List<String> balance = [''];
List<String> bankName = List(1); List<String> bankName = [''];
List<String> history = [''];
bool isSuccess = await UnikLibFlutter.getCardInfo( bool isSuccess = await UnikLibFlutter.getCardInfo(
cardUid, cardNumber, balance, bankName, cardUid, cardNumber, balance, bankName,
...@@ -64,59 +70,99 @@ class _MyAppState extends State<NfcScan> { ...@@ -64,59 +70,99 @@ class _MyAppState extends State<NfcScan> {
print( print(
"isSuccess $isSuccess, cardNumber ${cardNumber[0]}, balance ${balance[0]}, bankName ${bankName[0]}"); "isSuccess $isSuccess, cardNumber ${cardNumber[0]}, balance ${balance[0]}, bankName ${bankName[0]}");
_setStateCard(isSuccess, cardNumber[0], balance[0], bankName[0]); bool jsonHistory = await UnikLibFlutter.getHistory(history);
print("jsonHistory ${history[0]}");
this.setState(() {
listHistory = jsonDecode(history[0]);
});
UnikLibFlutter.stopReader(messageSuccess: "Cek saldo berhasil");
_setStateCard(true, cardNumber[0], balance[0], bankName[0]);
// bool historyStatus = await UnikLibFlutter.getHistory(history);
//
// print("History Transaction ${jsonEncode(historyStatus)}");
} }
void updateBalance() async { void updateBalance() async {
List<String> status = [null]; _setStateDefault();
List<String> cardNumber = [null]; List<String> status = [''];
List<String> balance = [null]; List<String> cardNumber = [''];
List<String> bankName = [null]; List<String> balance = [''];
List<String> beforeBalance = [null]; List<String> bankName = [''];
if (isSuccessInit) { List<String> beforeBalance = [''];
bool isSuccess = await UnikLibFlutter.updateBalance( // if (isSuccessInit) {
status, bool isSuccess = await UnikLibFlutter.updateBalance(status, cardNumber,
cardNumber, balance, bankName, beforeBalance, "085735442829", "developer@mdd.co.id",
balance, callbackState: (String stateOperation) =>
bankName, (stateOperation == UnikLibFlutter.WAITING_STATUS)
beforeBalance, ? UnikLibFlutter.setIosMessage(
"085735442829", "Mohon tunggu, jangan lepaskan kartu")
"developer@mdd.co.id", : print("state operation DONE"),
callbackState: (String stateOperation) => callbackTimeout: (bool isTimeout) => print("timeout $isTimeout"),
(stateOperation == UnikLibFlutter.WAITING_STATUS) errorNfc: (bool value) => print("error nfc $value"));
? print("state operation WAITING") print("isSuccess $isSuccess");
: print("state operation DONE"), print("status update ${status[0]}");
callbackTimeout: (bool isTimeout) => print("timeout $isTimeout"),
errorNfc: (bool value) => print("error nfc $value")); print("cardNumber ${cardNumber[0]}");
print("isSuccess $isSuccess");
print("status update ${status[0]}");
this.setState(() { this.setState(() {
_status = status[0]; _status = status[0];
}); });
_setStateCard(isSuccess, cardNumber[0], balance[0], bankName[0]);
if (isSuccess) {
UnikLibFlutter.stopReader(messageSuccess: "Update balance berhasil");
_setStateCard(true, cardNumber[0], balance[0], bankName[0]);
} else {
print("Terjadi kesalahan");
UnikLibFlutter.stopReader(messageError: "Update balance gagal");
_setStateCard(false, cardNumber[0], balance[0], bankName[0]);
// Navigator.of(context).pop();
} }
// }
} }
void _setStateCard( void _setStateCard(
bool isSuccess, String cardNumber, String balance, String bankName) { bool isSuccess, String cardNumber, String balance, String bankName) {
if (isSuccess) { this.setState(() {
this.setState(() { _cardNumber = cardNumber;
_cardNumber = cardNumber ?? "0000000000000000"; _balance = balance;
_balance = balance ?? "0"; _bgCard =
_bgCard = (bankName == "BNI") ? "images/bni_bg.png" : "images/mandiri_bg.png";
(bankName == "BNI") ? "images/bni_bg.png" : "images/mandiri_bg.png"; _bankName = bankName;
_bankName = bankName; });
}); if (Platform.isAndroid) Navigator.pop(context);
} else { }
print("Something went wrong");
this.setState(() { void _setStateDefault() {
_bgCard = this.setState(() {
(bankName == "BNI") ? "images/bni_bg.png" : "images/mandiri_bg.png"; _cardNumber = "0000000000000000";
_bankName = bankName; _balance = "0";
}); _bgCard = "images/mandiri_bg.png";
} listHistory = null;
Navigator.pop(context); _status = "Unknown";
});
}
Widget listViewBuilder(List<dynamic> list) {
return Container(
height: 300,
child: ListView.builder(
itemBuilder: (context, index) {
return Column(
children: [
Text("amount : ${list[index]["amount"]}"),
Text("date : ${list[index]["date"]}"),
Text("type : ${list[index]["type"]}"),
SizedBox(
height: 10,
)
],
);
},
itemCount: list.length,
),
);
} }
@override @override
...@@ -200,8 +246,7 @@ class _MyAppState extends State<NfcScan> { ...@@ -200,8 +246,7 @@ class _MyAppState extends State<NfcScan> {
(match) => "${match.group(0)} "), (match) => "${match.group(0)} "),
style: TextStyle( style: TextStyle(
color: Colors.white, color: Colors.white,
fontSize: 18) ?? fontSize: 18)),
"0000000000000000"),
SizedBox( SizedBox(
height: 17, height: 17,
), ),
...@@ -215,7 +260,7 @@ class _MyAppState extends State<NfcScan> { ...@@ -215,7 +260,7 @@ class _MyAppState extends State<NfcScan> {
Text( Text(
NumberFormat.simpleCurrency( NumberFormat.simpleCurrency(
locale: 'id_ID') locale: 'id_ID')
.format(int.parse(_balance) ?? "0"), .format(int.parse(_balance)),
style: TextStyle(color: Colors.white)), style: TextStyle(color: Colors.white)),
], ],
)) ))
...@@ -233,7 +278,8 @@ class _MyAppState extends State<NfcScan> { ...@@ -233,7 +278,8 @@ class _MyAppState extends State<NfcScan> {
icon: Icon(Icons.update_rounded), icon: Icon(Icons.update_rounded),
onPressed: () { onPressed: () {
updateBalance(); updateBalance();
_showBottomSheet(TapCard(), 0.50); if (Platform.isAndroid)
_showBottomSheet(TapCard(), 0.50);
}, },
)), )),
SizedBox( SizedBox(
...@@ -243,24 +289,31 @@ class _MyAppState extends State<NfcScan> { ...@@ -243,24 +289,31 @@ class _MyAppState extends State<NfcScan> {
alignment: Alignment.center, alignment: Alignment.center,
child: _isLoading child: _isLoading
? CircularProgressIndicator() ? CircularProgressIndicator()
: Text(_status ?? "Unknown"), : Text(_status),
),
SizedBox(
height: 10,
),
(listHistory != null)
? listViewBuilder(listHistory!)
: SizedBox(
width: 1,
) )
], ],
), ),
)), )),
floatingActionButton: FloatingActionButton( floatingActionButton: FloatingActionButton(
onPressed: () { onPressed: () async {
if (isSuccessInit) { // if (isSuccessInit) {
getCardInfo(); getCardInfo();
_showBottomSheet(TapCard(), 0.50); if (Platform.isAndroid) _showBottomSheet(TapCard(), 0.50);
} else { // } else {
print("Init Failed"); // print("Init Failed");
} // }
}, },
child: const Icon(Icons.cached), child: const Icon(Icons.cached),
backgroundColor: Colors.blue, backgroundColor: Colors.blue,
), ),
); );
} }
} }
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gifimage/flutter_gifimage.dart'; import 'package:flutter_gif/flutter_gif.dart';
class TapCard extends StatefulWidget { class TapCard extends StatefulWidget {
@override @override
_TapCardState createState() => _TapCardState(); _TapCardState createState() => _TapCardState();
} }
class _TapCardState extends State<TapCard> with TickerProviderStateMixin { class _TapCardState extends State<TapCard>{
GifController controller;
@override @override
void initState() { void initState() {
controller = GifController(vsync: this);
WidgetsBinding.instance.addPostFrameCallback((_) {
controller.repeat(min: 0, max: 10, period: Duration(seconds: 3));
});
super.initState(); super.initState();
} }
@override @override
dispose() { dispose() {
controller.dispose();
super.dispose(); super.dispose();
} }
...@@ -31,8 +24,7 @@ class _TapCardState extends State<TapCard> with TickerProviderStateMixin { ...@@ -31,8 +24,7 @@ class _TapCardState extends State<TapCard> with TickerProviderStateMixin {
return Container( return Container(
padding: EdgeInsets.all(30), padding: EdgeInsets.all(30),
child: Column(mainAxisAlignment: MainAxisAlignment.start, children: [ child: Column(mainAxisAlignment: MainAxisAlignment.start, children: [
GifImage( Image(
controller: controller,
image: AssetImage("images/gif_tap_card.gif"), image: AssetImage("images/gif_tap_card.gif"),
width: 280, width: 280,
), ),
......
...@@ -18,7 +18,9 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev ...@@ -18,7 +18,9 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
version: 1.0.0+1 version: 1.0.0+1
environment: environment:
sdk: ">=2.7.0 <3.0.0" sdk: ">=2.12.0 <3.0.0"
flutter: ">=1.20.0"
dependencies: dependencies:
flutter: flutter:
...@@ -27,15 +29,22 @@ dependencies: ...@@ -27,15 +29,22 @@ dependencies:
# The following adds the Cupertino Icons font to your application. # The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons. # Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.2 cupertino_icons: ^1.0.6
flutter_nfc_kit: ^2.2.1 intl: ^0.18.1
flutter_gifimage: ^1.0.1
intl: ^0.16.1 prepaid_lib_flutter_null_safety:
prepaid_lib_flutter:
hosted: hosted:
name: prepaid_lib_flutter name: prepaid_lib_flutter_null_safety
url: http://202.158.132.228:4000 url: https://pub.dev
version: 0.0.6 version: ^0.0.25-nullsafety
flutter_encrypt_lib:
hosted:
name: flutter_encrypt_lib
url: https://pub-dev.multidaya.id
version: 0.0.10
flutter_gif: ^0.0.4
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment