diff --git a/app/src/main/java/com/utsmm/kbz/MainViewModel.java b/app/src/main/java/com/utsmm/kbz/MainViewModel.java index 69b28ee..9e7c2a6 100644 --- a/app/src/main/java/com/utsmm/kbz/MainViewModel.java +++ b/app/src/main/java/com/utsmm/kbz/MainViewModel.java @@ -58,6 +58,7 @@ public class MainViewModel extends ViewModel { public MutableLiveData kPayStatus = new MutableLiveData<>(); + public SingleLiveEvent disabledMsg = new SingleLiveEvent<>(); public SingleLiveEvent> settlementPOS = new SingleLiveEvent<>(); diff --git a/app/src/main/java/com/utsmm/kbz/ui/SettingsFragment.java b/app/src/main/java/com/utsmm/kbz/ui/SettingsFragment.java index e3c0284..1956ea5 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/SettingsFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/SettingsFragment.java @@ -12,6 +12,7 @@ import androidx.navigation.Navigation; import com.google.gson.Gson; import com.google.gson.stream.MalformedJsonException; +import com.utsmm.kbz.config.Constants; import com.utsmyanmar.baselib.emv.EmvParamOperation; import com.utsmyanmar.baselib.fragment.DataBindingFragment; import com.utsmyanmar.baselib.network.model.sirius.SiriusError; @@ -50,6 +51,7 @@ public class SettingsFragment extends DataBindingFragment { private MainViewModel mainViewModel; private int count = 0; + // Data binding will handle view access automatically private FragmentSettingsModernBinding binding; @@ -182,6 +184,12 @@ public class SettingsFragment extends DataBindingFragment { // ClickEvent class for data binding - this is the proper pattern public class ClickEvent { + public void onHostConfigClick(){ + int routeId = R.id.action_nav_settings_to_hostConfigFragment; + int currentId = R.id.nav_settings; + int hostId = Constants.NAV_HOST_ID; + safeRouteTo(currentId, routeId, hostId); + } public void onVersionClick() { try { diff --git a/app/src/main/java/com/utsmm/kbz/ui/kpay/KPayViewModel.java b/app/src/main/java/com/utsmm/kbz/ui/kpay/KPayViewModel.java index 4d09479..b0a393a 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/kpay/KPayViewModel.java +++ b/app/src/main/java/com/utsmm/kbz/ui/kpay/KPayViewModel.java @@ -67,10 +67,7 @@ public class KPayViewModel extends ViewModel { private static final String NONCE_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; private static final int NONCE_LENGTH = 32; private final SecureRandom secureRandom = new SecureRandom(); - - - - + public MutableLiveData partialRefundEnabled = new MutableLiveData<>(); private String generateRandomTwoChars() { // You can reuse the existing character set and SecureRandom instance @@ -293,6 +290,9 @@ public class KPayViewModel extends ViewModel { @Inject public KPayViewModel(Repository repository) { this.repository = repository; + + boolean enabled = SystemParamsOperation.getInstance().isQrPartialRefundEnable(); + partialRefundEnabled.setValue(enabled); } private TradeData tradeData; diff --git a/app/src/main/java/com/utsmm/kbz/ui/navigation/NaviMainFragment.java b/app/src/main/java/com/utsmm/kbz/ui/navigation/NaviMainFragment.java index bf3b6c9..07d9709 100644 --- a/app/src/main/java/com/utsmm/kbz/ui/navigation/NaviMainFragment.java +++ b/app/src/main/java/com/utsmm/kbz/ui/navigation/NaviMainFragment.java @@ -219,120 +219,6 @@ public class NaviMainFragment extends DataBindingFragment { return grayLevelEnum; } - - public void onClickPrintConfig() { - - DeviceEngine deviceEngine = APIProxy.getDeviceEngine(requireContext()); - Printer printer = deviceEngine.getPrinter(); - DeviceInfo deviceInfo = deviceEngine.getDeviceInfo(); - - int FONT_NORMAL = 24; - int FONT_HEADER = 32; - - int status = printer.getStatus(); - if (status != SdkResult.Success) { - Log.d("Printer", "Printer error: " + status); - return; - } - - SystemParamsOperation sp = SystemParamsOperation.getInstance(); - - String addr1 = sp.getMerchantAddress(); - String addr2 = sp.getMerchantAddress2(); - String phone = sp.getMerchantPhoneNo(); - if (addr2 == null) addr2 = ""; - if (phone == null || phone.trim().isEmpty()) phone = ""; - - printer.setGray(getGrayLevel()); - - // ================== Header ================== - printer.appendPrnStr("==== Device Configs ====", FONT_HEADER, AlignEnum.CENTER, true); - printer.appendPrnStr(" ", FONT_NORMAL, AlignEnum.CENTER, false); - - if(!TextUtils.isEmpty(addr1)) - printer.appendPrnStr(addr1, FONT_NORMAL, AlignEnum.CENTER, true); - if(!TextUtils.isEmpty(addr2)) - printer.appendPrnStr(addr2, FONT_NORMAL, AlignEnum.CENTER, true); - if(!TextUtils.isEmpty(phone)) - printer.appendPrnStr(phone, FONT_NORMAL, AlignEnum.CENTER, true); - - printer.appendPrnStr(" ", FONT_NORMAL, AlignEnum.CENTER, false); - - - // ================== Device Info ================== - printer.appendPrnStr("Device S/N", deviceInfo.getSn(), FONT_NORMAL, true); - printer.appendPrnStr(" ", FONT_NORMAL, AlignEnum.CENTER, false); - - - // ================== Host Section ================== - printer.appendPrnStr("HOSTS", FONT_HEADER, AlignEnum.LEFT, true); - printer.appendPrnStr(" ", FONT_NORMAL, AlignEnum.CENTER, false); - - // ---- Primary Host ---- - printer.appendPrnStr("Name :", sp.getHostName(), FONT_NORMAL, false); - printTwoColWrapped(printer, "IP :", sp.getIpAddress(), FONT_NORMAL, false); - printTwoColWrapped(printer, "Sec IP :", sp.getSecIpAddress(), FONT_NORMAL, false); - printer.appendPrnStr("MID :", sp.getMerchantId(), FONT_NORMAL, false); - printer.appendPrnStr("TID :", sp.getTerminalId(), FONT_NORMAL, false); - - printer.appendPrnStr("--------------------------------", FONT_NORMAL, AlignEnum.LEFT, false); - - // ---- Secondary Host ---- - if (!TextUtils.isEmpty(sp.getSecHostName())) { - - printer.appendPrnStr("Name :", sp.getSecHostName(), FONT_NORMAL, false); - printTwoColWrapped(printer, "IP :", sp.getSecHostIpAddress(), FONT_NORMAL, false); - printTwoColWrapped(printer, "Sec IP :", sp.getSecHostSecIpAddress(), FONT_NORMAL, false); - printer.appendPrnStr("MID :", sp.getSecHostMerchantId(), FONT_NORMAL, false); - printer.appendPrnStr("TID :", sp.getSecHostTerminalId(), FONT_NORMAL, false); - - printer.appendPrnStr("--------------------------------", FONT_NORMAL, AlignEnum.LEFT, false); - } - - // ================== Start Printing ================== - printer.startPrint(true, ret -> { - if(ret == SdkResult.Success){ - Log.d("Printer", "Print success"); - } else { - Log.d("Printer", "Print failed: " + ret); - } - }); - } - - - private void printTwoColWrapped(Printer p, String left, String right, int font, Boolean isBold) { - - if (right == null) right = ""; - - int maxRight = 24; // recommended width for right column - - // If right text fits → print normally - if (right.length() <= maxRight) { - p.appendPrnStr(left, right, font, isBold); - return; - } - - // Otherwise wrap it - int start = 0; - boolean firstLine = true; - - while (start < right.length()) { - int end = Math.min(start + maxRight, right.length()); - String part = right.substring(start, end); - - if (firstLine) { - p.appendPrnStr(left, part, font, isBold); - firstLine = false; - } else { - // subsequent lines: blank left column - p.appendPrnStr(" ", part, font, isBold); - } - - start += maxRight; - } - } - - public void onClickVersion(){ mListener.onClickVersion(); } diff --git a/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigAdapter.java b/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigAdapter.java new file mode 100644 index 0000000..749478b --- /dev/null +++ b/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigAdapter.java @@ -0,0 +1,46 @@ +package com.utsmm.kbz.ui.settings; + +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.utsmm.kbz.databinding.ItemHostConfigBinding; + +import java.util.ArrayList; +import java.util.List; + +public class HostConfigAdapter extends RecyclerView.Adapter { + private List list = new ArrayList<>(); + + public void setList(List newList){ + this.list = newList; + notifyDataSetChanged(); + } + + @NonNull + @Override + public HostConfigAdapter.Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + ItemHostConfigBinding binding = ItemHostConfigBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); + return new Holder(binding); + } + + @Override + public void onBindViewHolder(@NonNull HostConfigAdapter.Holder holder, int position) { + holder.binding.setItem(list.get(position)); + } + + @Override + public int getItemCount() { + return list.size(); + } + + static class Holder extends RecyclerView.ViewHolder { + ItemHostConfigBinding binding; + Holder(ItemHostConfigBinding bind){ + super(bind.getRoot()); + binding = bind; + } + } +} diff --git a/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigFragment.java b/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigFragment.java new file mode 100644 index 0000000..a85fbf5 --- /dev/null +++ b/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigFragment.java @@ -0,0 +1,197 @@ +package com.utsmm.kbz.ui.settings; + +import static androidx.databinding.DataBindingUtil.getBinding; + +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.LinearLayoutManager; + +import android.text.TextUtils; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.nexgo.oaf.apiv3.APIProxy; +import com.nexgo.oaf.apiv3.DeviceEngine; +import com.nexgo.oaf.apiv3.DeviceInfo; +import com.nexgo.oaf.apiv3.SdkResult; +import com.nexgo.oaf.apiv3.device.printer.AlignEnum; +import com.nexgo.oaf.apiv3.device.printer.Printer; +import com.utsmm.kbz.BR; +import com.utsmm.kbz.R; +import com.utsmm.kbz.config.Constants; +import com.utsmm.kbz.databinding.FragmentHostConfigBinding; +import com.utsmyanmar.baselib.fragment.DataBindingFragment; +import com.utsmyanmar.baselib.util.DataBindingConfig; +import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation; + +public class HostConfigFragment extends DataBindingFragment { + + private HostConfigViewModel viewModel; + + @Override + protected void initViewModel() { + viewModel = new ViewModelProvider(this).get(HostConfigViewModel.class); + } + + @Override + protected DataBindingConfig getDataBindingConfig() { + return new DataBindingConfig(R.layout.fragment_host_config, BR.viewModel, viewModel) + .addBindingParam(BR.click, new ClickHandler()); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState){ + super.onViewCreated(view, savedInstanceState); + + FragmentHostConfigBinding binding = (FragmentHostConfigBinding) this.binding; + } + + @Override + public void onResume(){ + super.onResume(); + + setToolBarTitleWithBackIcon("Host Configs"); + } + + @Override + protected int currentId() { + return R.id.hostConfigFragment; + } + + @Override + protected int hostId() { + return Constants.NAV_HOST_ID; + } + + @Override + protected int routeId() { + return 0; + } + + public class ClickHandler { + public void onCancel(){ + safePopBack(R.id.hostConfigFragment, Constants.NAV_HOST_ID); + } + + public void onPrint(){ + + } + } +} + +//public void onClickPrintConfig() { +// +// DeviceEngine deviceEngine = APIProxy.getDeviceEngine(requireContext()); +// Printer printer = deviceEngine.getPrinter(); +// DeviceInfo deviceInfo = deviceEngine.getDeviceInfo(); +// +// int FONT_NORMAL = 24; +// int FONT_HEADER = 32; +// +// int status = printer.getStatus(); +// if (status != SdkResult.Success) { +// Log.d("Printer", "Printer error: " + status); +// return; +// } +// +// SystemParamsOperation sp = SystemParamsOperation.getInstance(); +// +// String addr1 = sp.getMerchantAddress(); +// String addr2 = sp.getMerchantAddress2(); +// String phone = sp.getMerchantPhoneNo(); +// if (addr2 == null) addr2 = ""; +// if (phone == null || phone.trim().isEmpty()) phone = ""; +// +// printer.setGray(getGrayLevel()); +// +// // ================== Header ================== +// printer.appendPrnStr("==== Device Configs ====", FONT_HEADER, AlignEnum.CENTER, true); +// printer.appendPrnStr(" ", FONT_NORMAL, AlignEnum.CENTER, false); +// +// if(!TextUtils.isEmpty(addr1)) +// printer.appendPrnStr(addr1, FONT_NORMAL, AlignEnum.CENTER, true); +// if(!TextUtils.isEmpty(addr2)) +// printer.appendPrnStr(addr2, FONT_NORMAL, AlignEnum.CENTER, true); +// if(!TextUtils.isEmpty(phone)) +// printer.appendPrnStr(phone, FONT_NORMAL, AlignEnum.CENTER, true); +// +// printer.appendPrnStr(" ", FONT_NORMAL, AlignEnum.CENTER, false); +// +// +// // ================== Device Info ================== +// printer.appendPrnStr("Device S/N", deviceInfo.getSn(), FONT_NORMAL, true); +// printer.appendPrnStr(" ", FONT_NORMAL, AlignEnum.CENTER, false); +// +// +// // ================== Host Section ================== +// printer.appendPrnStr("HOSTS", FONT_HEADER, AlignEnum.LEFT, true); +// printer.appendPrnStr(" ", FONT_NORMAL, AlignEnum.CENTER, false); +// +// // ---- Primary Host ---- +// printer.appendPrnStr("Name :", sp.getHostName(), FONT_NORMAL, false); +// printTwoColWrapped(printer, "IP :", sp.getIpAddress(), FONT_NORMAL, false); +// printTwoColWrapped(printer, "Sec IP :", sp.getSecIpAddress(), FONT_NORMAL, false); +// printer.appendPrnStr("MID :", sp.getMerchantId(), FONT_NORMAL, false); +// printer.appendPrnStr("TID :", sp.getTerminalId(), FONT_NORMAL, false); +// +// printer.appendPrnStr("--------------------------------", FONT_NORMAL, AlignEnum.LEFT, false); +// +// // ---- Secondary Host ---- +// if (!TextUtils.isEmpty(sp.getSecHostName())) { +// +// printer.appendPrnStr("Name :", sp.getSecHostName(), FONT_NORMAL, false); +// printTwoColWrapped(printer, "IP :", sp.getSecHostIpAddress(), FONT_NORMAL, false); +// printTwoColWrapped(printer, "Sec IP :", sp.getSecHostSecIpAddress(), FONT_NORMAL, false); +// printer.appendPrnStr("MID :", sp.getSecHostMerchantId(), FONT_NORMAL, false); +// printer.appendPrnStr("TID :", sp.getSecHostTerminalId(), FONT_NORMAL, false); +// +// printer.appendPrnStr("--------------------------------", FONT_NORMAL, AlignEnum.LEFT, false); +// } +// +// // ================== Start Printing ================== +// printer.startPrint(true, ret -> { +// if(ret == SdkResult.Success){ +// Log.d("Printer", "Print success"); +// } else { +// Log.d("Printer", "Print failed: " + ret); +// } +// }); +//} +// +//private void printTwoColWrapped(Printer p, String left, String right, int font, Boolean isBold) { +// +// if (right == null) right = ""; +// +// int maxRight = 24; // recommended width for right column +// +// // If right text fits → print normally +// if (right.length() <= maxRight) { +// p.appendPrnStr(left, right, font, isBold); +// return; +// } +// +// // Otherwise wrap it +// int start = 0; +// boolean firstLine = true; +// +// while (start < right.length()) { +// int end = Math.min(start + maxRight, right.length()); +// String part = right.substring(start, end); +// +// if (firstLine) { +// p.appendPrnStr(left, part, font, isBold); +// firstLine = false; +// } else { +// // subsequent lines: blank left column +// p.appendPrnStr(" ", part, font, isBold); +// } +// +// start += maxRight; +// } +//} \ No newline at end of file diff --git a/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigItem.java b/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigItem.java new file mode 100644 index 0000000..69cdd8f --- /dev/null +++ b/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigItem.java @@ -0,0 +1,33 @@ +package com.utsmm.kbz.ui.settings; + +public class HostConfigItem { + public String name; + public String ip; + public String mid; + public String tid; + public String secHostName; + public String secHostIp; + public String secHostMid; + public String secHostTid; + + public HostConfigItem( + String name, + String ip, + String mid, + String tid, + String secHostName, + String secHostIp, + String secHostMid, + String secHostTid + ){ + this.name = name; + this.ip = ip; + this.mid = mid; + this.tid = tid; + this.secHostName = secHostName; + this.secHostIp = secHostIp; + this.secHostMid = secHostMid; + this.secHostTid = secHostTid; + } + +} diff --git a/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigViewModel.java b/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigViewModel.java new file mode 100644 index 0000000..d4326eb --- /dev/null +++ b/app/src/main/java/com/utsmm/kbz/ui/settings/HostConfigViewModel.java @@ -0,0 +1,26 @@ +package com.utsmm.kbz.ui.settings; + +import androidx.lifecycle.ViewModel; +import com.utsmyanmar.paylibs.utils.core_utils.SystemParamsOperation; + +public class HostConfigViewModel extends ViewModel { + + public String merchantAddress1; + public String merchantAddress2; + public String merchantPhoneNumber; + public String merchantName; + public String merchantPhone; + + public HostConfigViewModel(){ + SystemParamsOperation sp = SystemParamsOperation.getInstance(); + merchantAddress1 = sp.getMerchantAddress(); + merchantAddress2 = sp.getMerchantAddress2(); + merchantPhoneNumber = sp.getMerchantPhoneNo(); + merchantName = sp.getMerchantName(); + merchantPhone = sp.getMerchantPhoneNo(); + } + + private String saftString(String s){ + return s == null ? "" : s; + } +} diff --git a/app/src/main/res/layout/fragment_host_config.xml b/app/src/main/res/layout/fragment_host_config.xml new file mode 100644 index 0000000..f3f2c0e --- /dev/null +++ b/app/src/main/res/layout/fragment_host_config.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +