CustomSignDialog.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. package com.dbs.mplus.knuh.customView;
  2. import androidx.annotation.NonNull;
  3. import androidx.appcompat.app.AppCompatActivity;
  4. import androidx.core.content.ContextCompat;
  5. import android.app.Dialog;
  6. import android.content.Context;
  7. import android.graphics.Bitmap;
  8. import android.graphics.BitmapFactory;
  9. import android.graphics.Color;
  10. import android.graphics.PorterDuff;
  11. import android.graphics.drawable.ColorDrawable;
  12. import android.graphics.drawable.Drawable;
  13. import android.os.Bundle;
  14. import android.util.Base64;
  15. import android.util.Log;
  16. import android.view.KeyEvent;
  17. import android.view.View;
  18. import android.view.inputmethod.EditorInfo;
  19. import android.widget.Button;
  20. import android.widget.EditText;
  21. import android.widget.LinearLayout;
  22. import android.widget.TextView;
  23. import android.widget.Toast;
  24. import com.dbs.mplus.knuh.BuildConfig;
  25. import com.dbs.mplus.knuh.R;
  26. import com.dbs.mplus.knuh.activity.ConsentActivity;
  27. import com.dbs.mplus.knuh.httpTask.CallBack;
  28. import com.dbs.mplus.knuh.httpTask.HttpSoapConnection;
  29. import com.dbs.mplus.knuh.httpTask.SoapParser;
  30. import com.dbs.mplus.knuh.model.UserSignDataInfoVO;
  31. import com.dbs.mplus.knuh.util.ConsentConfig;
  32. import com.dbs.mplus.knuh.util.Util;
  33. import com.github.chrisbanes.photoview.PhotoView;
  34. import com.github.gcacace.signaturepad.views.SignaturePad;
  35. import org.ksoap2.serialization.SoapObject;
  36. import java.io.ByteArrayInputStream;
  37. import java.io.ByteArrayOutputStream;
  38. import java.io.IOException;
  39. import java.io.UnsupportedEncodingException;
  40. import java.util.HashMap;
  41. import java.util.concurrent.ExecutionException;
  42. public class CustomSignDialog extends Dialog {
  43. private static final String TAG = "CustomSignDialog";
  44. private Context mContext;
  45. private ConsentActivity instance;
  46. private AppCompatActivity mActivity;
  47. private UserSignDataInfoVO userSignDataInfoVO;
  48. private String userId = "";
  49. private String userNm = "";
  50. private String loginDeptCd = "";
  51. private String signImageSeqNo = "";
  52. private byte[] signImage;
  53. private Bitmap signPadImg;
  54. private LinearLayout startSignLayout;
  55. private TextView tvUserNm;
  56. private EditText etUserId;
  57. private Button btnCancel;
  58. private Button btnConfirm;
  59. private SignaturePad spSignImage;
  60. // private PhotoView ivSignImage;
  61. public CustomSignDialog(@NonNull Context context, AppCompatActivity activity, UserSignDataInfoVO userSignDataInfoVO) {
  62. super(context);
  63. mContext = context;
  64. mActivity = activity;
  65. this.instance = (ConsentActivity) mContext;
  66. this.userSignDataInfoVO = userSignDataInfoVO;
  67. }
  68. @Override
  69. protected void onCreate(Bundle savedInstanceState) {
  70. super.onCreate(savedInstanceState);
  71. getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
  72. setCanceledOnTouchOutside(false);
  73. setContentView(R.layout.activity_custom_sign_dialog);
  74. init();
  75. }
  76. private void init() {
  77. setLayout();
  78. setEvent();
  79. }
  80. private void setLayout() {
  81. startSignLayout = (LinearLayout) findViewById(R.id.startSignLayout);
  82. tvUserNm = (TextView) findViewById(R.id.tvUserNm);
  83. etUserId = (EditText) findViewById(R.id.etUserId);
  84. spSignImage = (SignaturePad) findViewById(R.id.spSignImage);
  85. btnConfirm = (Button) findViewById(R.id.btnConfirm);
  86. btnCancel = (Button) findViewById(R.id.btnCancel);
  87. // ivSignImage = (PhotoView) findViewById(R.id.ivSignImage);
  88. // ivSignImage.setVisibility(View.GONE);
  89. // spSignImage.setVisibility(View.GONE);
  90. Drawable btnCancelBackground = (Drawable) btnCancel.getBackground();
  91. btnCancelBackground.setColorFilter(ContextCompat.getColor(mContext, R.color.alertCancelColor), PorterDuff.Mode.SRC_ATOP);
  92. setUserSignInfo();
  93. }
  94. private void setUserSignInfo() {
  95. loginDeptCd = Util.getStringPreference(mContext, "userInfo", "deptCd").trim();
  96. userId = userSignDataInfoVO.getUserId();
  97. userNm = userSignDataInfoVO.getUserNm();
  98. signImageSeqNo = userSignDataInfoVO.getSignImageSeqNo();
  99. signImage = userSignDataInfoVO.getSignData().getBytes();
  100. byte[] imgbytes = Base64.decode(signImage, Base64.DEFAULT);
  101. tvUserNm.setText(userNm);
  102. etUserId.setText(userId);
  103. if (!signImage.equals("")) {
  104. Bitmap bitmap = BitmapFactory.decodeByteArray(imgbytes, 0, imgbytes.length);
  105. spSignImage.setSignatureBitmap(bitmap);
  106. // ivSignImage.setImageBitmap(bitmap);
  107. }
  108. // 보건의료정보팀일 경우 환자조회가 가능하도록
  109. if (loginDeptCd.equals("3230000000")) {
  110. etUserId.setEnabled(true);
  111. }
  112. }
  113. private void setEvent() {
  114. startSignLayout.setOnClickListener(onClickListener);
  115. btnConfirm.setOnClickListener(onClickListener);
  116. btnCancel.setOnClickListener(onClickListener);
  117. etUserId.setOnEditorActionListener(onEditorActionListener);
  118. }
  119. private View.OnClickListener onClickListener = new View.OnClickListener() {
  120. @Override
  121. public void onClick(View v) {
  122. if (v == startSignLayout) {
  123. CustomSignPad customSignPad = new CustomSignPad(mContext, spSignImage.getSignatureBitmap());
  124. customSignPad.setDialogListener(new CustomSignPad.CustomSignPadListener() {
  125. @Override
  126. public void onConfirmClicked(Bitmap signPadImage) {
  127. signPadImg = signPadImage;
  128. // ivSignImage.setImageBitmap(signPadImg);
  129. spSignImage.setSignatureBitmap(signPadImg);
  130. }
  131. @Override
  132. public void onCancelClicked() { }
  133. });
  134. customSignPad.show();
  135. } else if (v == btnConfirm) {
  136. setSignImage();
  137. } else if (v == btnCancel) {
  138. dismiss();
  139. }
  140. }
  141. };
  142. private void setSignImage() {
  143. final CallBack callBack = new CallBack() {
  144. @Override
  145. public void result(SoapObject result) {
  146. instance.dismissProgress();
  147. Log.e(TAG, "setSignImage -- > " + result);
  148. if (result == null || result.toString().indexOf("null") > 0 || result.getPropertyCount() == 0) {
  149. stop();
  150. } else {
  151. String rts = result.getProperty("setSignImage").toString().trim();
  152. int res = Integer.parseInt(rts);
  153. if (res == 0) {
  154. stop();
  155. } else {
  156. mActivity.runOnUiThread(new Runnable() {
  157. @Override
  158. public void run() {
  159. Toast.makeText(mContext, mContext.getString(R.string.okSignImgSet), Toast.LENGTH_LONG).show();
  160. instance.csAlert.dismiss();
  161. dismiss();
  162. }
  163. });
  164. }
  165. }
  166. }
  167. @Override
  168. public void stop() {
  169. mActivity.runOnUiThread(new Runnable() {
  170. @Override
  171. public void run() {
  172. instance.showSingButtonDialog(mContext.getString(R.string.setSignImageError));
  173. }
  174. });
  175. }
  176. @Override
  177. public void error() {
  178. }
  179. };
  180. instance.csAlert.show();
  181. instance.csAlert.setContent(mContext.getString(R.string.setSignImage), "");
  182. instance.csAlert.btnConfirm.setOnClickListener(new View.OnClickListener() {
  183. @Override
  184. public void onClick(View v) {
  185. instance.showProgress();
  186. Bitmap drawable = spSignImage.getSignatureBitmap();
  187. ByteArrayOutputStream stream = new ByteArrayOutputStream() ;
  188. drawable.compress(Bitmap.CompressFormat.JPEG, 80, stream) ;
  189. byte[] signArr = stream.toByteArray() ;
  190. String strSignImg = "";
  191. try {
  192. // strSignImg = Util.base64Encode(signArr);
  193. strSignImg = Base64.encodeToString(signArr, Base64.DEFAULT);
  194. stream.close();
  195. } catch (UnsupportedEncodingException e) {
  196. e.printStackTrace();
  197. } catch (IOException e) {
  198. e.printStackTrace();
  199. }
  200. HashMap<String, String> mData = new HashMap<String, String>();
  201. mData.put("instCd", BuildConfig.INST_CD);
  202. mData.put("userId", userId);
  203. mData.put("signSeq", signImageSeqNo);
  204. mData.put("inptId", instance.userId);
  205. mData.put("signImage", strSignImg);
  206. Util.callHttp(mContext, ConsentConfig.HOST_HOSPITAL, ConsentConfig.SET_SIGN_IMAGE, mData, callBack);
  207. }
  208. });
  209. instance.csAlert.btnCancel.setOnClickListener(new View.OnClickListener() {
  210. @Override
  211. public void onClick(View v) {
  212. instance.csAlert.dismiss();
  213. }
  214. });
  215. }
  216. private EditText.OnEditorActionListener onEditorActionListener = new EditText.OnEditorActionListener() {
  217. @Override
  218. public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
  219. if (actionId == EditorInfo.IME_ACTION_DONE || event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
  220. instance.showProgress();
  221. String userId = etUserId.getText().toString().trim();
  222. HashMap<String, String> mData = new HashMap<String, String>();
  223. mData.put("userId", userId);
  224. mData.put("instCd", BuildConfig.INST_CD);
  225. userSignDataInfoVO = getUserSignDataInfo(mData);
  226. if (userSignDataInfoVO == null || userSignDataInfoVO.getUserNm().equals("")) {
  227. instance.dismissProgress();
  228. instance.showSingButtonDialog(mContext.getString(R.string.signDataError));
  229. } else {
  230. instance.dismissProgress();
  231. setNewUserSignInfo();
  232. }
  233. }
  234. return false;
  235. }
  236. };
  237. private void setNewUserSignInfo() {
  238. userId = userSignDataInfoVO.getUserId();
  239. userNm = userSignDataInfoVO.getUserNm();
  240. signImageSeqNo = userSignDataInfoVO.getSignImageSeqNo();
  241. signImage = userSignDataInfoVO.getSignData().getBytes();
  242. tvUserNm.setText(userNm);
  243. etUserId.setText(userId);
  244. if (!signImage.equals("")) {
  245. Bitmap bitmap = BitmapFactory.decodeByteArray(signImage, 0, signImage.length);
  246. spSignImage.setSignatureBitmap(bitmap);
  247. }
  248. }
  249. private UserSignDataInfoVO getUserSignDataInfo(HashMap<String, String> mData) {
  250. UserSignDataInfoVO userSignDataInfoVO = null;
  251. HttpSoapConnection connection = new HttpSoapConnection(ConsentConfig.HOST_HOSPITAL, ConsentConfig.GET_USER_SIGN_DATA_INFO, mData);
  252. try {
  253. SoapObject object = connection.execute().get();
  254. userSignDataInfoVO = SoapParser.getUserSignDataInfo(object);
  255. } catch (ExecutionException e) {
  256. e.printStackTrace();
  257. } catch (InterruptedException e) {
  258. e.printStackTrace();
  259. }
  260. return userSignDataInfoVO;
  261. }
  262. /**
  263. * String 을 Bitmap 으로 변환
  264. * 2020.12.08
  265. * jmRyu
  266. * @param encodedString : 받아올 때, Base64 Encoding Image String 을 받아옴
  267. * @return
  268. */
  269. private Bitmap StringToBitmap(String encodedString) {
  270. try {
  271. byte[] encodeByte = Base64.decode(encodedString, Base64.DEFAULT);
  272. Bitmap bitmap = BitmapFactory.decodeByteArray(encodeByte, 0, encodeByte.length);
  273. return bitmap;
  274. } catch (Exception e) {
  275. e.getMessage();
  276. return null;
  277. }
  278. }
  279. @Override
  280. public void show() {
  281. super.show();
  282. }
  283. @Override
  284. public void dismiss() {
  285. super.dismiss();
  286. }
  287. @Override
  288. public void onBackPressed() {
  289. return;
  290. }
  291. }