diff --git a/app/src/main/java/com/mob/utsmyanmar/ui/navigation/AppNavGraph.kt b/app/src/main/java/com/mob/utsmyanmar/ui/navigation/AppNavGraph.kt index 4a12a7f..a024b96 100644 --- a/app/src/main/java/com/mob/utsmyanmar/ui/navigation/AppNavGraph.kt +++ b/app/src/main/java/com/mob/utsmyanmar/ui/navigation/AppNavGraph.kt @@ -55,6 +55,7 @@ import com.mob.utsmyanmar.viewmodel.EmvTransactionProcessViewModel import com.mob.utsmyanmar.viewmodel.SharedViewModel import com.mob.utsmyanmar.viewmodel.TransProcessViewModel import com.utsmyanmar.paylibs.model.TradeData +import com.utsmyanmar.paylibs.model.enums.TransCVM import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType @RequiresApi(Build.VERSION_CODES.N) @@ -86,9 +87,18 @@ fun AppNavGraph( } composable(Routes.Signature.route) { + val sharedViewModel: SharedViewModel = hiltViewModel(activity) SignaturePad( onBack = { navController.popBackStack() }, - onConfirm = { navController.popBackStack() } + onConfirm = { _, bitmap -> + sharedViewModel.signBitmap = bitmap + navController.navigate(Routes.TransactionResult.route) { + popUpTo(Routes.Signature.route) { + inclusive = true + } + launchSingleTop = true + } + } ) } @@ -663,6 +673,14 @@ fun AppNavGraph( launchSingleTop = true } }, + onNavigateSignature = { + navController.navigate(Routes.Signature.route) { + popUpTo(Routes.Processing.route) { + inclusive = true + } + launchSingleTop = true + } + }, onNavigateMain = { navController.navigate(Routes.Dashboard.route) { popUpTo(Routes.Dashboard.route) { diff --git a/app/src/main/java/com/mob/utsmyanmar/ui/sending_to_host/SendingToHostRoute.kt b/app/src/main/java/com/mob/utsmyanmar/ui/sending_to_host/SendingToHostRoute.kt index 501b919..9fbefed 100644 --- a/app/src/main/java/com/mob/utsmyanmar/ui/sending_to_host/SendingToHostRoute.kt +++ b/app/src/main/java/com/mob/utsmyanmar/ui/sending_to_host/SendingToHostRoute.kt @@ -2,21 +2,14 @@ package com.mob.utsmyanmar.ui.sending_to_host import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.mob.utsmyanmar.model.TransResultStatus -import com.mob.utsmyanmar.viewmodel.SharedViewModel -import com.mob.utsmyanmar.viewmodel.TransProcessViewModel -import kotlinx.coroutines.delay -import androidx.compose.runtime.getValue -import com.mob.utsmyanmar.ui.transaction_result.TransactionResultState -import com.mob.utsmyanmar.viewmodel.ProcessingTransaction -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow -import androidx.compose.runtime.collectAsState import com.mob.utsmyanmar.model.TransactionStatus import com.mob.utsmyanmar.ui.settlement.SettlementViewModel +import com.mob.utsmyanmar.viewmodel.SharedViewModel +import com.mob.utsmyanmar.viewmodel.TransProcessViewModel import com.utsmyanmar.paylibs.utils.iso_utils.TransactionsType -import kotlinx.coroutines.channels.Channel private const val MOCK_HOST_DELAY_MS = 2000L @@ -26,6 +19,7 @@ fun ProcessingRoute( transProcessViewModel: TransProcessViewModel, settlementViewModel: SettlementViewModel, onNavigateTransactionResult: () -> Unit, + onNavigateSignature: () -> Unit, onNavigateMain: ()-> Unit ) { @@ -60,7 +54,11 @@ fun ProcessingRoute( when(transStatus) { TransResultStatus.SUCCESS -> { sharedViewModel.payDetail.value = transProcessViewModel.payDetailResult.value - onNavigateTransactionResult() + if (requiresSignature(sharedViewModel.payDetail.value)) { + onNavigateSignature() + } else { + onNavigateTransactionResult() + } } TransResultStatus.FAIL -> { @@ -75,12 +73,6 @@ fun ProcessingRoute( } } - - - - - - if(sharedViewModel.transactionsType.value == TransactionsType.SETTLEMENT) { ProcessingScreen(settlementStatus.processingState) } else { @@ -89,3 +81,8 @@ fun ProcessingRoute( } + +private fun requiresSignature(payDetail: com.utsmyanmar.paylibs.model.PayDetail?): Boolean { +// return payDetail?.transCVM == TransCVM.SIGNATURE && payDetail.isFreeSign == false + return true; +} diff --git a/app/src/main/java/com/mob/utsmyanmar/ui/signature_pad/SignaturePad.kt b/app/src/main/java/com/mob/utsmyanmar/ui/signature_pad/SignaturePad.kt index 66dedaa..6245950 100644 --- a/app/src/main/java/com/mob/utsmyanmar/ui/signature_pad/SignaturePad.kt +++ b/app/src/main/java/com/mob/utsmyanmar/ui/signature_pad/SignaturePad.kt @@ -1,5 +1,7 @@ package com.mob.utsmyanmar.ui.signature_pad +import android.graphics.Bitmap +import android.graphics.Paint import androidx.compose.foundation.Canvas import androidx.compose.foundation.background import androidx.compose.foundation.gestures.detectDragGestures @@ -29,32 +31,76 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.geometry.Size import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Path import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.mob.utsmyanmar.ui.components.appbar.AppBar import com.mob.utsmyanmar.ui.theme.MOBPOSTheme +import android.graphics.Canvas as AndroidCanvas +import android.graphics.Path as AndroidPath import com.mob.utsmyanmar.ui.theme.Color as AppColor @Composable fun SignaturePad( modifier: Modifier = Modifier, signatureColor: Color = Color.Black, - strokeWidth: Float = 8f, + onBack: () -> Unit = {}, - onConfirm: () -> Unit = {} + onConfirm: (SignatureMode, Bitmap?) -> Unit = { _, _ -> } ) { val paths = remember { mutableStateListOf>() } val currentPath = remember { mutableStateListOf() } var selectedMode by remember { mutableStateOf(SignatureMode.Manual) } + var canvasSize by remember { mutableStateOf(Size.Zero) } + var strokeWidth: Float = 8f; + fun clearSignature() { paths.clear() currentPath.clear() } + fun buildBitmap(): Bitmap? { + if (selectedMode == SignatureMode.Manual) return null + if (paths.isEmpty() && currentPath.isEmpty()) return null + if (canvasSize.width <= 0f || canvasSize.height <= 0f) return null + + val bitmap = Bitmap.createBitmap( + canvasSize.width.toInt(), + canvasSize.height.toInt(), + Bitmap.Config.ARGB_8888 + ) + val canvas = AndroidCanvas(bitmap) + val paint = Paint().apply { + color = android.graphics.Color.BLACK + style = Paint.Style.STROKE + strokeWidth = strokeWidth + isAntiAlias = true + strokeCap = Paint.Cap.ROUND + strokeJoin = Paint.Join.ROUND + } + + fun drawStroke(points: List) { + if (points.size < 2) return + val path = AndroidPath().apply { + moveTo(points.first().x, points.first().y) + for (index in 1 until points.size) { + lineTo(points[index].x, points[index].y) + } + } + canvas.drawPath(path, paint) + } + + paths.forEach(::drawStroke) + drawStroke(currentPath) + + return bitmap + } + Scaffold( topBar = { AppBar( @@ -71,14 +117,17 @@ fun SignaturePad( .padding(16.dp), verticalArrangement = Arrangement.spacedBy(16.dp) ) { - Box( - modifier = Modifier - .weight(1f) - .fillMaxWidth() - .background(Color.White, RoundedCornerShape(16.dp)) - .padding(12.dp) - .pointerInput(Unit) { - detectDragGestures( + Box( + modifier = Modifier + .weight(1f) + .fillMaxWidth() + .background(Color.White, RoundedCornerShape(16.dp)) + .padding(12.dp) + .onSizeChanged { size -> + canvasSize = Size(size.width.toFloat(), size.height.toFloat()) + } + .pointerInput(Unit) { + detectDragGestures( onDragStart = { startOffset -> currentPath.add(startOffset) }, @@ -163,7 +212,13 @@ fun SignaturePad( } Button( - onClick = onConfirm, + onClick = { + val bitmap = buildBitmap() + if (selectedMode == SignatureMode.Digital && bitmap == null) { + return@Button + } + onConfirm(selectedMode, bitmap) + }, modifier = Modifier .weight(1f) .height(50.dp), @@ -179,7 +234,7 @@ fun SignaturePad( } } -private enum class SignatureMode { +enum class SignatureMode { Manual, Digital } diff --git a/app/src/main/java/com/mob/utsmyanmar/viewmodel/SharedViewModel.kt b/app/src/main/java/com/mob/utsmyanmar/viewmodel/SharedViewModel.kt index 15843ae..bf03efa 100644 --- a/app/src/main/java/com/mob/utsmyanmar/viewmodel/SharedViewModel.kt +++ b/app/src/main/java/com/mob/utsmyanmar/viewmodel/SharedViewModel.kt @@ -316,7 +316,7 @@ class SharedViewModel @Inject constructor( private fun printReceipt(isMerchantCopy: Boolean) { PrintXReceipt.getInstance() - .printSmileReceipt(payDetail.value, isMerchantCopy, object : PrintXStatus { + .printSmileReceipt(payDetail.value, isMerchantCopy, signBitmap, object : PrintXStatus { override fun onSuccess() { @@ -351,7 +351,7 @@ class SharedViewModel @Inject constructor( } PrintXReceipt.getInstance() - .printSmileReceipt(getPayDetail(), isFirstPrint, object : PrintXStatus { + .printSmileReceipt(getPayDetail(), isFirstPrint, signBitmap, object : PrintXStatus { override fun onSuccess() { diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/db/AppDatabase.java b/baselib/src/main/java/com/utsmyanmar/baselib/db/AppDatabase.java index ec3572f..f8e3bcb 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/db/AppDatabase.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/db/AppDatabase.java @@ -25,9 +25,9 @@ import com.utsmyanmar.baselib.db.model.RidEntity; import com.utsmyanmar.paylibs.model.PayDetail; -@Database(entities = {PayDetail.class, ChipAidEntity.class, PayWaveEntity.class, PayPassEntity.class, QuickPassEntity.class, RidEntity.class, MPUCtlsEntity.class, BinEntity.class},version = 12,exportSchema = false) +@Database(entities = {PayDetail.class, ChipAidEntity.class, PayWaveEntity.class, PayPassEntity.class, QuickPassEntity.class, RidEntity.class, MPUCtlsEntity.class, BinEntity.class}, version = 13, exportSchema = false) @TypeConverters({SettleDataConverter.class, TransCVMConverter.class, CardSchemeConverter.class}) -public abstract class AppDatabase extends RoomDatabase { +public abstract class AppDatabase extends RoomDatabase { public static volatile AppDatabase INSTANCE; public abstract PayDetailDao payDetailDao(); diff --git a/baselib/src/main/java/com/utsmyanmar/baselib/di/DatabaseModule.java b/baselib/src/main/java/com/utsmyanmar/baselib/di/DatabaseModule.java index ef2e499..2f28b53 100644 --- a/baselib/src/main/java/com/utsmyanmar/baselib/di/DatabaseModule.java +++ b/baselib/src/main/java/com/utsmyanmar/baselib/di/DatabaseModule.java @@ -1,10 +1,6 @@ package com.utsmyanmar.baselib.di; - - -import static com.utsmyanmar.baselib.db.AppDatabase.INSTANCE; - import android.app.Application; import android.content.Context; import android.content.SharedPreferences; @@ -16,8 +12,6 @@ import androidx.room.Room; import androidx.room.RoomDatabase; import androidx.room.migration.Migration; import androidx.sqlite.db.SupportSQLiteDatabase; -import androidx.sqlite.db.SupportSQLiteOpenHelper; - import com.utsmyanmar.baselib.db.AppDatabase; import com.utsmyanmar.baselib.db.dao.BinDao; @@ -28,8 +22,6 @@ import com.utsmyanmar.baselib.db.dao.PayPassDao; import com.utsmyanmar.baselib.db.dao.PayWaveDao; import com.utsmyanmar.baselib.db.dao.QuickPassDao; import com.utsmyanmar.baselib.db.dao.RidDao; -import com.utsmyanmar.baselib.util.SecureKeyUtil; - import java.io.File; import java.io.IOException; @@ -39,13 +31,12 @@ import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.UnrecoverableEntryException; +import java.security.cert.CertificateException; import java.util.concurrent.Executors; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; -import javax.inject.Provider; import javax.inject.Singleton; -import java.security.cert.CertificateException; import dagger.Module; import dagger.Provides; @@ -353,6 +344,14 @@ public class DatabaseModule { } }; + static final Migration MIGRATION_12_13 = new Migration(12, 13) { + @Override + public void migrate(SupportSQLiteDatabase database) { + database.execSQL("ALTER TABLE paydetail " + + " ADD COLUMN signatureBlob BLOB"); + } + }; + private static byte[] getDatabaseKey(Context context) throws KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException, NoSuchProviderException, InvalidAlgorithmParameterException, UnrecoverableEntryException { @@ -398,13 +397,14 @@ public class DatabaseModule { @Provides @Singleton public static AppDatabase provideAppDatabase(Application application) { - return Room.databaseBuilder(application, AppDatabase.class,"yoma") + return Room.databaseBuilder(application, AppDatabase.class, "yoma") // .fallbackToDestructiveMigration() .addMigrations(MIGRATION_7_8) .addMigrations(MIGRATION_8_9) .addMigrations(MIGRATION_9_10) .addMigrations(MIGRATION_10_11) .addMigrations(MIGRATION_11_12) + .addMigrations(MIGRATION_12_13) .allowMainThreadQueries() .addCallback(new RoomDatabase.Callback() { @Override @@ -414,9 +414,9 @@ public class DatabaseModule { @Override public void run() { - /* - * init here - * */ + /* + * init here + * */ } }); } @@ -425,8 +425,6 @@ public class DatabaseModule { } - - private static boolean isDatabaseFileCorruptOrWrongKey(Application application) { File dbFile = application.getDatabasePath(DATABASE_NAME); return dbFile.exists() && dbFile.length() > 0; @@ -466,11 +464,11 @@ public class DatabaseModule { .putLong("db_recreated_time", System.currentTimeMillis()) .apply(); } - + @Provides @Singleton - public static PayDetailDao providePayDetailDao(AppDatabase appDatabase){ + public static PayDetailDao providePayDetailDao(AppDatabase appDatabase) { return appDatabase.payDetailDao(); } @@ -507,9 +505,13 @@ public class DatabaseModule { @Provides @Singleton - public static MPUCtlsDao provideMPUCtlsDao(AppDatabase appDatabase) { return appDatabase.mpuCtlsDao(); } + public static MPUCtlsDao provideMPUCtlsDao(AppDatabase appDatabase) { + return appDatabase.mpuCtlsDao(); + } @Provides @Singleton - public static BinDao provideBinDao(AppDatabase appDatabase) { return appDatabase.binDao(); } + public static BinDao provideBinDao(AppDatabase appDatabase) { + return appDatabase.binDao(); + } } diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/model/PayDetail.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/model/PayDetail.java index 3a7d871..539148f 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/model/PayDetail.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/model/PayDetail.java @@ -74,6 +74,7 @@ public class PayDetail implements Serializable { public String cardOrgCode = ""; // International credit card company code (domain 63.1) public String reference = ""; // Remarks public String eSignHexData = ""; // Electronic signature hexadecimal data + private byte[] signatureBlob; // Signature store as blob type public int transPlatform; // Supported trading platforms: 0: bank card 1: Alipay 2: WeChat 3: UnionPay wallet public int transactionType; // 1: Consumption 2: Consumption cancellation; 3: Return 4. Pre-authorization 5. Pre-authorization cancellation 6. Pre-authorization completed 7. Pre-authorization completed cancellation 8. Settlement 9. Sign-in 10. Sign-out 11. Transaction query @@ -1359,4 +1360,11 @@ public class PayDetail implements Serializable { this.currency = currency; } + public byte[] getSignatureBlob() { + return signatureBlob; + } + + public void setSignatureBlob(byte[] signatureBlob) { + this.signatureBlob = signatureBlob; + } } diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java index beb3175..692b7aa 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/BaseXPrint.java @@ -722,8 +722,7 @@ public abstract class BaseXPrint { sunmiPrinterService.sendRAWData(boldOn(), innerResultCallback); sunmiPrinterService.setAlignment(1, innerResultCallback); - // default - String cvmText = "NO SIGNATURE REQUIRED"; + String cvmText; switch (payDetail.getTransCVM()) { case SIGNATURE: cvmText = "SIGN : -----------------------------"; break; @@ -735,9 +734,10 @@ public abstract class BaseXPrint { cvmText = "NO SIGNATURE REQUIRED"; break; } - + addSignatureBitmap(payDetail); sunmiPrinterService.printText(cvmText, innerResultCallback); + // if (payDetail.getIsFreeSign()) { // sunmiPrinterService.printText("NO SIGNATURE REQUIRED", innerResultCallback); // } else { @@ -948,4 +948,14 @@ public abstract class BaseXPrint { } }; + + private void addSignatureBitmap(PayDetail payDetail) throws RemoteException { + byte[] signatureBlob = payDetail.getSignatureBlob(); + if (signatureBlob != null && signatureBlob.length > 0) { + Bitmap signatureBitmap = android.graphics.BitmapFactory.decodeByteArray(signatureBlob, 0, signatureBlob.length); + if (signatureBitmap != null) { + sunmiPrinterService.printBitmap(signatureBitmap, innerResultCallback); + } + } + } } diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintX.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintX.java index dc6ec76..d7fe3fc 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintX.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintX.java @@ -2,6 +2,7 @@ package com.utsmyanmar.paylibs.print.printx; import com.utsmyanmar.paylibs.model.PayDetail; import com.utsmyanmar.paylibs.utils.enums.HostType; +import android.graphics.Bitmap; import java.util.List; @@ -9,7 +10,7 @@ public interface PrintX { void printSimple(); - void printSmileReceipt(PayDetail payDetail, boolean isMerchantCopy,PrintXStatus printXStatus); + void printSmileReceipt(PayDetail payDetail, boolean isMerchantCopy, Bitmap signBitmap, PrintXStatus printXStatus); void printISOReceipt(PayDetail payDetail); diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintXImpl.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintXImpl.java index 327317b..de26f51 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintXImpl.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintXImpl.java @@ -120,7 +120,7 @@ public class PrintXImpl extends BaseXPrint implements PrintX { @Override - public void printSmileReceipt(PayDetail payDetail, boolean isMerchantCopy,PrintXStatus printXStatus) { + public void printSmileReceipt(PayDetail payDetail, boolean isMerchantCopy, Bitmap signBitmap, PrintXStatus printXStatus) { try { this.callbackStatus = printXStatus; @@ -129,9 +129,9 @@ public class PrintXImpl extends BaseXPrint implements PrintX { } else if (payDetail.getTransactionType() == TransactionsType.SETTLEMENT.value) { printSmileSettlementReport(payDetail,printXStatus); } else if (payDetail.getICC55() == null || payDetail.getICC55().isEmpty() || payDetail.getAccountType().equals(CardScheme.MPU_CTLS.name)) { - printSmileMPUReceipt(payDetail, isMerchantCopy); + printSmileMPUReceipt(payDetail, isMerchantCopy, signBitmap); } else if (!payDetail.getICC55().equals("")) { - printSmileEMVReceipt(payDetail, isMerchantCopy); + printSmileEMVReceipt(payDetail, isMerchantCopy, signBitmap); } } catch (Exception e) { e.printStackTrace(); @@ -256,7 +256,7 @@ public class PrintXImpl extends BaseXPrint implements PrintX { } } - private void printSmileMPUReceipt(PayDetail payDetail, boolean isMerchantCopy) { + private void printSmileMPUReceipt(PayDetail payDetail, boolean isMerchantCopy, Bitmap signBitmap) { try { setHeight(0x12); @@ -268,6 +268,7 @@ public class PrintXImpl extends BaseXPrint implements PrintX { if (payDetail.getTradeAnswerCode().equals(Constant.ANSWER_CODE_APPROVED) || payDetail.getTradeAnswerCode().equals(Constant.ANSWER_CODE_ACCEPT)) { printTransFooter(false,payDetail, isMerchantCopy); + printSignatureBlock(payDetail, signBitmap); } else { String receiptFooter = SystemParamsOperation.getInstance().getReceiptFooter(); sunmiPrinterService.printText("\n", null); @@ -282,7 +283,7 @@ public class PrintXImpl extends BaseXPrint implements PrintX { } } - private void printSmileEMVReceipt(PayDetail payDetail, boolean isMerchantCopy) { + private void printSmileEMVReceipt(PayDetail payDetail, boolean isMerchantCopy, Bitmap signBitmap) { try { setHeight(0x12); printLogo(); @@ -292,6 +293,7 @@ public class PrintXImpl extends BaseXPrint implements PrintX { if (payDetail.getTradeAnswerCode().equals(Constant.ANSWER_CODE_APPROVED) || payDetail.getTradeAnswerCode().equals(Constant.ANSWER_CODE_ACCEPT)) { printTransFooter(false,payDetail, isMerchantCopy); + printSignatureBlock(payDetail, signBitmap); } else { String receiptFooter = SystemParamsOperation.getInstance().getReceiptFooter(); sunmiPrinterService.setFontSize(textSize, null); @@ -307,6 +309,32 @@ public class PrintXImpl extends BaseXPrint implements PrintX { } } + private void printSignatureBlock(PayDetail payDetail, Bitmap signBitmap) { + try { + if (payDetail.getTransCVM() != com.utsmyanmar.paylibs.model.enums.TransCVM.SIGNATURE) { + return; + } + + if (signBitmap == null) { + return; + } + + Bitmap printableBitmap = signBitmap; + if (printableBitmap.getWidth() > 130) { + double size = 1.0 * printableBitmap.getHeight() * 130 / printableBitmap.getWidth(); + int newHeight = (int) size; + printableBitmap = BitmapUtils.scale(printableBitmap, 130, newHeight); + } + + sunmiPrinterService.lineWrap(1, innerResultCallback); + sunmiPrinterService.setAlignment(1, innerResultCallback); + sunmiPrinterService.printBitmap(printableBitmap, innerResultCallback); + sunmiPrinterService.lineWrap(1, innerResultCallback); + } catch (RemoteException e) { + e.printStackTrace(); + } + } + private void printTransDetailWave(PayDetail payDetail) { try { diff --git a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintXReceipt.java b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintXReceipt.java index 80df881..b5b226e 100644 --- a/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintXReceipt.java +++ b/paylibs/src/main/java/com/utsmyanmar/paylibs/print/printx/PrintXReceipt.java @@ -3,6 +3,7 @@ package com.utsmyanmar.paylibs.print.printx; import com.utsmyanmar.paylibs.model.PayDetail; import com.utsmyanmar.paylibs.utils.enums.HostType; +import android.graphics.Bitmap; import java.util.List; public class PrintXReceipt { @@ -21,8 +22,8 @@ public class PrintXReceipt { printX.printSimple(); } - public void printSmileReceipt(PayDetail payDetail,boolean isMerchantCopy,PrintXStatus printXStatus) { - printX.printSmileReceipt(payDetail,isMerchantCopy,printXStatus); + public void printSmileReceipt(PayDetail payDetail,boolean isMerchantCopy, Bitmap signBitmap,PrintXStatus printXStatus) { + printX.printSmileReceipt(payDetail,isMerchantCopy,signBitmap,printXStatus); } public void printSmileSettlementReport(PayDetail payDetail,PrintXStatus printXStatus) {