Kaynağa Gözat

서명이미지 설정 중간 커밋

jeongminRyu 4 yıl önce
ebeveyn
işleme
05701b7207

+ 5 - 0
.idea/codeStyles/codeStyleConfig.xml

@@ -0,0 +1,5 @@
+<component name="ProjectCodeStyleConfiguration">
+  <state>
+    <option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
+  </state>
+</component>

+ 6 - 1
app/build.gradle

@@ -63,8 +63,12 @@ android {
             applicationIdSuffix ".local"
             buildConfigField "String", "originalPackageName", "\"com.dbs.mplus.knuh\""
 //            buildConfigField "String", "CONSENT_SERVER_URL", "\"http://128.127.95.125/\""
-            buildConfigField "String", "CONSENT_SERVER_URL", "\"http://172.16.1.21:8091/\""
+//            buildConfigField "String", "CONSENT_SERVER_URL", "\"http://172.16.1.21:8091/\""
+//            buildConfigField "String", "CONSENT_SERVER_URL", "\"http://211.118.215.111:8091/\""
+            buildConfigField "String", "CONSENT_SERVER_URL", "\"http://172.16.10.194:8081/\""
+//            buildConfigField "String", "CONSENT_SERVER_URL", "\"https://192.168.198.107:443/\""
             buildConfigField "String", "CONSENT_EFORM_SERVER_URL", "\"https://emadev.knuh.kr:8095/eformservice.aspx\""
+
             buildConfigField "String", "INST_CD", "\"031\""
             manifestPlaceholders = [appLabel: "로컬교육"]
         }
@@ -132,4 +136,5 @@ dependencies {
     implementation 'com.github.chrisbanes:PhotoView:2.0.0'
     implementation 'androidx.recyclerview:recyclerview:1.1.0'
     implementation 'androidx.viewpager:viewpager:1.0.0'
+    implementation 'com.github.gcacace:signature-pad:1.2.0'
 }

+ 4 - 9
app/src/main/AndroidManifest.xml

@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
     package="com.dbs.mplus.knuh">
     <!-- 인터넷 사용 -->
     <uses-permission android:name="android.permission.INTERNET" /> <!-- 스토리지 접근 -->
@@ -10,11 +11,8 @@
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
-    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
-<!--    <uses-permission-sdk-23 android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/> &lt;!&ndash; 배터리 최적화 화이트리스트 추가를 위한 퍼미션 &ndash;&gt;-->
-    <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/> <!-- 배터리 최적화 화이트리스트 추가를 위한 퍼미션 -->
-
-
+    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- <uses-permission-sdk-23 android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/> &lt;!&ndash; 배터리 최적화 화이트리스트 추가를 위한 퍼미션 &ndash;&gt; -->
+    <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" /> <!-- 배터리 최적화 화이트리스트 추가를 위한 퍼미션 -->
     <permission
         android:name="android.permission.NETWORK_SETTINGS"
         android:protectionLevel="signature" />
@@ -29,7 +27,6 @@
         android:supportsRtl="true"
         android:theme="@style/AppTheme"
         android:usesCleartextTraffic="true">
-
         <activity
             android:name=".activity.ConsentActivity"
             android:screenOrientation="landscape"
@@ -45,16 +42,14 @@
         </activity>
         <activity
             android:name=".activity.DepartmentList"
-            android:screenOrientation="landscape"/>
+            android:screenOrientation="landscape" />
         <activity
             android:name=".activity.LoginActivity"
             android:screenOrientation="landscape"
             android:windowSoftInputMode="adjustResize|stateHidden" />
-
         <activity
             android:name=".activity.activityEvent.ImageActivity"
             android:windowSoftInputMode="stateAlwaysHidden" />
-
     </application>
 
 </manifest>

+ 5 - 8
app/src/main/java/com/dbs/mplus/knuh/activity/ConsentActivity.java

@@ -6,31 +6,25 @@ import androidx.core.content.ContextCompat;
 import androidx.recyclerview.widget.RecyclerView;
 import androidx.viewpager.widget.ViewPager;
 
-import android.app.Service;
 import android.content.Context;
 import android.content.Intent;
 import android.graphics.PorterDuff;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.util.Log;
-import android.view.Gravity;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.inputmethod.InputMethodManager;
-import android.widget.Button;
 import android.widget.CheckBox;
 import android.widget.EditText;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
-import android.widget.RadioButton;
-import android.widget.RadioGroup;
 import android.widget.RelativeLayout;
 import android.widget.Spinner;
 import android.widget.TextView;
 import android.widget.Toast;
 
 import com.dbs.mplus.knuh.BuildConfig;
-import com.dbs.mplus.knuh.MainActivity;
 import com.dbs.mplus.knuh.R;
 import com.dbs.mplus.knuh.activity.activityEvent.CenterMenu;
 import com.dbs.mplus.knuh.activity.activityEvent.LeftMenu;
@@ -45,12 +39,10 @@ import com.dbs.mplus.knuh.consent.sign.SignWrapper;
 import com.dbs.mplus.knuh.customView.CustomAlertDialog;
 import com.dbs.mplus.knuh.customView.CustomRadioGroup;
 import com.dbs.mplus.knuh.customView.LoadingProgress;
-import com.dbs.mplus.knuh.customView.SoftKeyboard;
 import com.dbs.mplus.knuh.fragment.HistoryFragment;
 import com.dbs.mplus.knuh.fragment.MarkerFragment;
 import com.dbs.mplus.knuh.fragment.SearchFragment;
 import com.dbs.mplus.knuh.httpTask.HttpCallBack;
-import com.dbs.mplus.knuh.model.PatientInfoVO;
 import com.dbs.mplus.knuh.util.ConsentConfig;
 import com.dbs.mplus.knuh.util.Util;
 
@@ -87,9 +79,11 @@ public class ConsentActivity extends AppCompatActivity {
   private TextView tvConsent;
   private TextView tvDoctor;
   private TextView tvDept;
+  private TextView tvUpdateSign;
   private LinearLayout settingLayout;
   private LinearLayout logoutLayout;
   /** 상단 메뉴 **/
+
   /** 탭 메뉴 **/
   public LinearLayout tabAdmission;
   public ImageView ivInPatient;
@@ -448,6 +442,8 @@ public class ConsentActivity extends AppCompatActivity {
     tvDept        = (TextView) findViewById(R.id.tvDept);
     settingLayout = (LinearLayout) findViewById(R.id.settingLayout);
     logoutLayout  = (LinearLayout) findViewById(R.id.logoutLayout);
+    tvUpdateSign  = (TextView) findViewById(R.id.tvUpdateSign);
+
 
 
     int logo = 0;
@@ -476,6 +472,7 @@ public class ConsentActivity extends AppCompatActivity {
   private void setTopMenuEvent() {
     settingLayout.setOnClickListener(topMenu.settingClickListener);
     logoutLayout.setOnClickListener(topMenu.logoutClickListener);
+    tvUpdateSign.setOnClickListener(topMenu.signClickListener);
   }
 
   private void setTapMenuLayout() {

+ 3 - 5
app/src/main/java/com/dbs/mplus/knuh/activity/LoginActivity.java

@@ -2,10 +2,8 @@ package com.dbs.mplus.knuh.activity;
 
 import androidx.appcompat.app.AppCompatActivity;
 
-import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
-import android.os.Build;
 import android.os.Bundle;
 import android.util.Log;
 import android.view.KeyEvent;
@@ -95,10 +93,10 @@ public class LoginActivity extends AppCompatActivity {
       logo = R.drawable.knuh_logo;
     }
     ivLogo.setImageResource(logo);
-    certCheck.setChecked(true);
+//    certCheck.setChecked(true);
 
-//    etId.setText("EMR");
-//    etPasswd.setText("wjstkstlf1!");
+    etId.setText("EMR");
+    etPasswd.setText("dmlfywjdqh3#");
 
     // 의사
 //    etId.setText("96070");

+ 60 - 0
app/src/main/java/com/dbs/mplus/knuh/activity/activityEvent/TopMenu.java

@@ -7,13 +7,25 @@ import android.view.View;
 
 import androidx.appcompat.app.AppCompatActivity;
 
+import com.dbs.mplus.knuh.BuildConfig;
 import com.dbs.mplus.knuh.R;
+import com.dbs.mplus.knuh.activity.ConsentActivity;
 import com.dbs.mplus.knuh.activity.LoginActivity;
 import com.dbs.mplus.knuh.consent.sign.SignWrapper;
 import com.dbs.mplus.knuh.customView.CustomAlertDialog;
 import com.dbs.mplus.knuh.customView.CustomSettingAlertDialog;
+import com.dbs.mplus.knuh.customView.CustomSignDialog;
+import com.dbs.mplus.knuh.httpTask.HttpSoapConnection;
+import com.dbs.mplus.knuh.httpTask.SoapParser;
+import com.dbs.mplus.knuh.model.UserSignDataInfoVO;
+import com.dbs.mplus.knuh.util.ConsentConfig;
 import com.dbs.mplus.knuh.util.Util;
 
+import org.ksoap2.serialization.SoapObject;
+
+import java.util.HashMap;
+import java.util.concurrent.ExecutionException;
+
 public class TopMenu {
 
   private static final String TAG = "TopMenu";
@@ -21,11 +33,13 @@ public class TopMenu {
   private Context mContext;
 
   private CustomAlertDialog csAlert;
+  private ConsentActivity instance;
 
   public TopMenu(Context context, AppCompatActivity activity) {
     this.mContext  = context;
     this.mActivity = activity;
     this.csAlert = new CustomAlertDialog(mContext);
+    this.instance = (ConsentActivity) mContext;
   }
 
   public View.OnClickListener settingClickListener = new View.OnClickListener() {
@@ -65,4 +79,50 @@ public class TopMenu {
 
     }
   };
+
+  // 서명이미지 신청 버튼 클릭 이벤트
+  public View.OnClickListener signClickListener = new View.OnClickListener() {
+    @Override
+    public void onClick(View v) {
+
+      instance.showProgress();
+
+      UserSignDataInfoVO userSignDataInfoVO = new UserSignDataInfoVO();
+      HashMap<String, String> mData = new HashMap<String, String>();
+      mData.put("instCd", BuildConfig.INST_CD);
+      mData.put("userId", instance.userId);
+
+      userSignDataInfoVO = getUserSignDataInfo(mData);
+
+      if (userSignDataInfoVO == null || userSignDataInfoVO.getUserNm().equals("")) {
+        instance.dismissProgress();
+        instance.showSingButtonDialog(mContext.getString(R.string.signDataError));
+      } else {
+        instance.dismissProgress();
+        CustomSignDialog customSignDialog = new CustomSignDialog(mContext, mActivity, userSignDataInfoVO);
+        customSignDialog.show();
+      }
+    }
+  };
+
+  private UserSignDataInfoVO getUserSignDataInfo(HashMap<String, String> mData) {
+
+    UserSignDataInfoVO userSignDataInfoVO = null;
+    HttpSoapConnection connection = new HttpSoapConnection(ConsentConfig.HOST_HOSPITAL, ConsentConfig.GET_USER_SIGN_DATA_INFO, mData);
+
+    try {
+      SoapObject object = connection.execute().get();
+      userSignDataInfoVO = SoapParser.getUserSignDataInfo(object);
+
+    } catch (ExecutionException e) {
+      e.printStackTrace();
+    } catch (InterruptedException e) {
+      e.printStackTrace();
+    }
+
+    return userSignDataInfoVO;
+  }
+
+
+
 }

+ 339 - 0
app/src/main/java/com/dbs/mplus/knuh/customView/CustomSignDialog.java

@@ -0,0 +1,339 @@
+package com.dbs.mplus.knuh.customView;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.content.ContextCompat;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Color;
+import android.graphics.PorterDuff;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.util.Base64;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.inputmethod.EditorInfo;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.dbs.mplus.knuh.BuildConfig;
+import com.dbs.mplus.knuh.R;
+import com.dbs.mplus.knuh.activity.ConsentActivity;
+import com.dbs.mplus.knuh.httpTask.CallBack;
+import com.dbs.mplus.knuh.httpTask.HttpSoapConnection;
+import com.dbs.mplus.knuh.httpTask.SoapParser;
+import com.dbs.mplus.knuh.model.UserSignDataInfoVO;
+import com.dbs.mplus.knuh.util.ConsentConfig;
+import com.dbs.mplus.knuh.util.Util;
+
+import org.ksoap2.serialization.SoapObject;
+
+import java.io.ByteArrayOutputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.HashMap;
+import java.util.concurrent.ExecutionException;
+
+public class CustomSignDialog extends Dialog {
+
+  private static final String TAG = "CustomSignDialog";
+
+  private Context            mContext;
+  private ConsentActivity    instance;
+  private AppCompatActivity  mActivity;
+  private UserSignDataInfoVO userSignDataInfoVO;
+
+  private String userId         = "";
+  private String userNm         = "";
+  private String loginDeptCd    = "";
+  private String signImageSeqNo = "";
+  private String signImage      = "";
+
+  private Bitmap signPadImg;
+
+  private LinearLayout  startSignLayout;
+
+  private TextView tvUserNm;
+  private EditText etUserId;
+  private ImageView ivSignImage;
+  private Button btnCancel;
+  private Button btnConfirm;
+
+  public CustomSignDialog(@NonNull Context context, AppCompatActivity activity, UserSignDataInfoVO userSignDataInfoVO) {
+    super(context);
+    mContext                = context;
+    mActivity               = activity;
+    this.instance           = (ConsentActivity) mContext;
+    this.userSignDataInfoVO = userSignDataInfoVO;
+  }
+
+  @Override
+  protected void onCreate(Bundle savedInstanceState) {
+    super.onCreate(savedInstanceState);
+    getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
+    setCanceledOnTouchOutside(false);
+    setContentView(R.layout.activity_custom_sign_dialog);
+
+    init();
+  }
+
+  private void init() {
+
+    setLayout();
+    setEvent();
+  }
+
+  private void setLayout() {
+    startSignLayout = (LinearLayout) findViewById(R.id.startSignLayout);
+    tvUserNm        = (TextView) findViewById(R.id.tvUserNm);
+    etUserId        = (EditText) findViewById(R.id.etUserId);
+    ivSignImage     = (ImageView) findViewById(R.id.ivSignImage);
+    btnConfirm      = (Button) findViewById(R.id.btnConfirm);
+    btnCancel       = (Button) findViewById(R.id.btnCancel);
+
+    Drawable btnCancelBackground = (Drawable) btnCancel.getBackground();
+    btnCancelBackground.setColorFilter(ContextCompat.getColor(mContext, R.color.alertCancelColor), PorterDuff.Mode.SRC_ATOP);
+
+
+    setUserSignInfo();
+  }
+
+  private void setUserSignInfo() {
+    loginDeptCd     = Util.getStringPreference(mContext, "userInfo", "deptCd").trim();
+    userId          = userSignDataInfoVO.getUserId();
+    userNm          = userSignDataInfoVO.getUserNm();
+    signImageSeqNo  = userSignDataInfoVO.getSignImageSeqNo();
+    signImage       = userSignDataInfoVO.getSignData();
+
+    tvUserNm.setText(userNm);
+    etUserId.setText(userId);
+
+    if (!signImage.equals("")) {
+      signPadImg = StringToBitmap(signImage);
+      ivSignImage.setImageBitmap(signPadImg);
+    }
+
+    // 보건의료정보팀일 경우 환자조회가 가능하도록
+    if (loginDeptCd.equals("3230000000")) {
+      etUserId.setEnabled(true);
+    }
+  }
+
+  private void setEvent() {
+    startSignLayout.setOnClickListener(onClickListener);
+    btnConfirm.setOnClickListener(onClickListener);
+    btnCancel.setOnClickListener(onClickListener);
+    etUserId.setOnEditorActionListener(onEditorActionListener);
+  }
+
+  private View.OnClickListener onClickListener = new View.OnClickListener() {
+    @Override
+    public void onClick(View v) {
+      if (v == startSignLayout) {
+        CustomSignPad customSignPad = new CustomSignPad(mContext, signPadImg);
+        customSignPad.setDialogListener(new CustomSignPad.CustomSignPadListener() {
+          @Override
+          public void onConfirmClicked(Bitmap signPadImage) {
+            signPadImg = signPadImage;
+            ivSignImage.setImageBitmap(signPadImg);
+          }
+
+          @Override
+          public void onCancelClicked() { }
+        });
+        customSignPad.show();
+      } else if (v == btnConfirm) {
+        setSignImage();
+      } else if (v == btnCancel) {
+        dismiss();
+      }
+    }
+  };
+
+  private void setSignImage() {
+
+    final CallBack callBack = new CallBack() {
+      @Override
+      public void result(SoapObject result) {
+
+        instance.dismissProgress();
+
+        Log.e(TAG, "setSignImage -- > " + result);
+        if (result == null || result.toString().indexOf("null") > 0 || result.getPropertyCount() == 0) {
+          stop();
+        } else {
+          String rts = result.getProperty("setSignImage").toString().trim();
+          int res = Integer.parseInt(rts);
+
+          if (res == 0) {
+            stop();
+          } else {
+            mActivity.runOnUiThread(new Runnable() {
+              @Override
+              public void run() {
+                Toast.makeText(mContext, mContext.getString(R.string.okSignImgSet), Toast.LENGTH_LONG).show();
+                instance.csAlert.dismiss();
+                dismiss();
+              }
+            });
+          }
+        }
+      }
+      @Override
+      public void stop() {
+        mActivity.runOnUiThread(new Runnable() {
+          @Override
+          public void run() {
+            instance.showSingButtonDialog(mContext.getString(R.string.setSignImageError));
+          }
+        });
+      }
+
+      @Override
+      public void error() {
+      }
+    };
+    instance.csAlert.show();
+    instance.csAlert.setContent(mContext.getString(R.string.setSignImage), "");
+
+    instance.csAlert.btnConfirm.setOnClickListener(new View.OnClickListener() {
+      @Override
+      public void onClick(View v) {
+
+        instance.showProgress();
+
+        Bitmap drawable = ((BitmapDrawable) ivSignImage.getDrawable()).getBitmap();
+        ByteArrayOutputStream stream = new ByteArrayOutputStream() ;
+
+        drawable.compress(Bitmap.CompressFormat.PNG, 90, stream) ;
+        byte[] signArr = stream.toByteArray() ;
+        String strSignImg = "";
+        try {
+          strSignImg = Util.base64Encode(signArr);
+        } catch (UnsupportedEncodingException e) {
+          e.printStackTrace();
+        }
+
+        HashMap<String, String> mData = new HashMap<String, String>();
+        mData.put("instCd", BuildConfig.INST_CD);
+        mData.put("userId", userId);
+        mData.put("signSeq", signImageSeqNo);
+        mData.put("inptId", instance.userId);
+        mData.put("signImage", strSignImg);
+
+        Util.callHttp(mContext, ConsentConfig.HOST_HOSPITAL, ConsentConfig.SET_SIGN_IMAGE, mData, callBack);
+      }
+    });
+
+    instance.csAlert.btnCancel.setOnClickListener(new View.OnClickListener() {
+      @Override
+      public void onClick(View v) {
+        instance.csAlert.dismiss();
+      }
+    });
+  }
+
+
+  private EditText.OnEditorActionListener onEditorActionListener = new EditText.OnEditorActionListener() {
+    @Override
+    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
+      if (actionId == EditorInfo.IME_ACTION_DONE || event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
+
+        instance.showProgress();
+
+        String userId = etUserId.getText().toString().trim();
+        HashMap<String, String> mData = new HashMap<String, String>();
+        mData.put("userId", userId);
+        mData.put("instCd", BuildConfig.INST_CD);
+
+        userSignDataInfoVO = getUserSignDataInfo(mData);
+
+        if (userSignDataInfoVO == null || userSignDataInfoVO.getUserNm().equals("")) {
+          instance.dismissProgress();
+          instance.showSingButtonDialog(mContext.getString(R.string.signDataError));
+        } else {
+          instance.dismissProgress();
+          setNewUserSignInfo();
+        }
+      }
+      return false;
+    }
+  };
+
+  private void setNewUserSignInfo() {
+    userId          = userSignDataInfoVO.getUserId();
+    userNm          = userSignDataInfoVO.getUserNm();
+    signImageSeqNo  = userSignDataInfoVO.getSignImageSeqNo();
+    signImage       = userSignDataInfoVO.getSignData();
+
+    tvUserNm.setText(userNm);
+    etUserId.setText(userId);
+
+    if (!signImage.equals("")) {
+      signPadImg = StringToBitmap(signImage);
+      ivSignImage.setImageBitmap(signPadImg);
+    }
+  }
+
+  private UserSignDataInfoVO getUserSignDataInfo(HashMap<String, String> mData) {
+
+    UserSignDataInfoVO userSignDataInfoVO = null;
+    HttpSoapConnection connection = new HttpSoapConnection(ConsentConfig.HOST_HOSPITAL, ConsentConfig.GET_USER_SIGN_DATA_INFO, mData);
+
+    try {
+      SoapObject object = connection.execute().get();
+      userSignDataInfoVO = SoapParser.getUserSignDataInfo(object);
+
+    } catch (ExecutionException e) {
+      e.printStackTrace();
+    } catch (InterruptedException e) {
+      e.printStackTrace();
+    }
+
+    return userSignDataInfoVO;
+  }
+
+
+  /**
+   * String 을 Bitmap 으로 변환
+   * 2020.12.08
+   * jmRyu
+   * @param encodedString : 받아올 때, Base64 Encoding Image String 을 받아옴
+   * @return
+   */
+  private Bitmap StringToBitmap(String encodedString) {
+    try {
+      byte[] encodeByte = Base64.decode(encodedString, Base64.DEFAULT);
+      Bitmap bitmap = BitmapFactory.decodeByteArray(encodeByte, 0, encodeByte.length);
+      return bitmap;
+    } catch (Exception e) {
+      e.getMessage();
+      return null;
+    }
+  }
+
+
+  @Override
+  public void show() {
+    super.show();
+  }
+
+  @Override
+  public void dismiss() {
+    super.dismiss();
+  }
+
+  @Override
+  public void onBackPressed() {
+    return;
+  }
+}

+ 128 - 0
app/src/main/java/com/dbs/mplus/knuh/customView/CustomSignPad.java

@@ -0,0 +1,128 @@
+package com.dbs.mplus.knuh.customView;
+
+import androidx.annotation.NonNull;
+import androidx.core.content.ContextCompat;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.PorterDuff;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+import android.widget.LinearLayout;
+
+import com.dbs.mplus.knuh.R;
+import com.github.gcacace.signaturepad.views.SignaturePad;
+
+public class CustomSignPad extends Dialog {
+
+  private static final String TAG = "CustomSignDialog";
+
+  private Context mContext;
+  private SignaturePad signPad;
+
+  private Button btnConfirm;
+  private Button btnInit;
+
+  private LinearLayout signPadLayout;
+  private CustomSignPadListener customSignPadListener;
+
+  private Bitmap signImage;
+
+  public CustomSignPad(@NonNull Context context, Bitmap signImage) {
+    super(context);
+    mContext = context;
+    this.signImage = signImage;
+  }
+
+  /**
+   * 서명이미지 전달을 위한 interface 정의 시작
+   * 확인버튼을 클릭했을 때, Alert 생성 시 호출된 리스너로 해당 사인이미지 전달
+   * 2020.12.07
+   * jmRyu
+   */
+  interface CustomSignPadListener {
+    void onConfirmClicked(Bitmap signImage);
+    void onCancelClicked();
+  }
+
+  /**
+   * Alert 호출 시 생성
+   * @param signPadListener
+   */
+  public void setDialogListener(CustomSignPadListener signPadListener) {
+    customSignPadListener = signPadListener;
+  }
+
+  @Override
+  protected void onCreate(Bundle savedInstanceState) {
+    super.onCreate(savedInstanceState);
+    getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
+    setCanceledOnTouchOutside(false);
+    setContentView(R.layout.activity_custom_sign_pad);
+
+    init();
+  }
+
+  private void init() {
+
+    setLayout();
+    setEvent();
+  }
+
+  private void setLayout() {
+    signPad    = (SignaturePad) findViewById(R.id.signPad);
+    btnConfirm = (Button) findViewById(R.id.btnConfirm);
+    btnInit    = (Button) findViewById(R.id.btnInit);
+
+    Drawable btnInitBackGround   = (Drawable) btnInit.getBackground();
+    btnInitBackGround.setColorFilter(ContextCompat.getColor(mContext, R.color.alertCancelColor), PorterDuff.Mode.SRC_ATOP);
+
+    signPadLayout = (LinearLayout) findViewById(R.id.signPadLayout);
+
+    if (signImage != null) {
+      signPad.setSignatureBitmap(signImage);
+      signPad.setEnabled(false);
+    } else {
+      signPad.setEnabled(true);
+    }
+  }
+
+
+  private void setEvent() {
+    btnConfirm.setOnClickListener(onClickListener);
+    btnInit.setOnClickListener(onClickListener);
+  }
+
+  private View.OnClickListener onClickListener = new View.OnClickListener() {
+    @Override
+    public void onClick(View v) {
+      if (v == btnConfirm) {
+        Bitmap signImage = signPad.getTransparentSignatureBitmap();
+        customSignPadListener.onConfirmClicked(signImage);
+        dismiss();
+      } else if (v == btnInit) {
+        signPad.setEnabled(true);
+        signPad.clear();
+      }
+    }
+  };
+
+  @Override
+  public void show() {
+    super.show();
+  }
+
+  @Override
+  public void dismiss() {
+    super.dismiss();
+  }
+
+  @Override
+  public void onBackPressed() {
+    return;
+  }
+}

+ 1 - 1
app/src/main/java/com/dbs/mplus/knuh/httpTask/HttpRunnable.java

@@ -21,7 +21,7 @@ public class HttpRunnable implements Runnable {
     this.mData      = mData;
     this.callBack   = callBack;
   }
-  
+
   @Override
   public void run() {
     

+ 2 - 2
app/src/main/java/com/dbs/mplus/knuh/httpTask/HttpSoapConnection.java

@@ -25,13 +25,13 @@ public class HttpSoapConnection extends AsyncTask<Void, Void, SoapObject> {
   private HashMap<String, String> mData;
   private String soapAction  = "";
   private String callMethod = "";
-  
+
   public HttpSoapConnection(String soapAction, String callMethod, HashMap<String, String> mData) {
     this.soapAction  = soapAction;
     this.callMethod = callMethod;
     this.mData       = mData;
   }
-  
+
   @Override
   protected void onPreExecute() {
   }

+ 44 - 3
app/src/main/java/com/dbs/mplus/knuh/httpTask/SoapParser.java

@@ -1,8 +1,5 @@
 package com.dbs.mplus.knuh.httpTask;
 
-import android.util.Log;
-
-import com.dbs.mplus.knuh.BuildConfig;
 import com.dbs.mplus.knuh.model.CategoryVO;
 import com.dbs.mplus.knuh.model.ConsentFormListVO;
 import com.dbs.mplus.knuh.model.ConsentImageVO;
@@ -11,6 +8,7 @@ import com.dbs.mplus.knuh.model.DoctorListVO;
 import com.dbs.mplus.knuh.model.PatientInfoVO;
 import com.dbs.mplus.knuh.model.PatientListVO;
 import com.dbs.mplus.knuh.model.UserLoginDeptList;
+import com.dbs.mplus.knuh.model.UserSignDataInfoVO;
 import com.dbs.mplus.knuh.util.ConsentConfig;
 
 import org.ksoap2.serialization.SoapObject;
@@ -557,5 +555,48 @@ public class SoapParser {
     return arrayList;
   }
 
+  public static UserSignDataInfoVO getUserSignDataInfo(SoapObject object) {
+
+    UserSignDataInfoVO userSignDataInfoVO = null;
+
+    int total = 0;
+    if (object != null) {
+      total = object.getPropertyCount();
+      if(total == 1) {
+        if(object.getProperty(0) == null) {
+          total = 0;
+        }
+      }
+    }
+
+    if(total == 0) {
+    } else {
+      userSignDataInfoVO = new UserSignDataInfoVO();
+
+      String instCd          = object.getPrimitivePropertyAsString("instCd").trim();
+      String userId          = object.getPrimitivePropertyAsString("userId").trim();
+      String userNm          = object.getPrimitivePropertyAsString("userNm").trim();
+      String signData        = object.getPrimitivePropertyAsString("signData").trim();
+      String signImageFromDd = object.getPrimitivePropertyAsString("signImgeFromDd").trim();
+      String signImageSeqNo  = object.getPrimitivePropertyAsString("signImgeSeqNo").trim();
+
+      instCd = instCd.equals(ConsentConfig.RETURN_NULL) ? "" : instCd;
+      userId = userId.equals(ConsentConfig.RETURN_NULL) ? "" : userId;
+      userNm = userNm.equals(ConsentConfig.RETURN_NULL) ? "" : userNm;
+      signData = signData.equals(ConsentConfig.RETURN_NULL) ? "" : signData;
+      signImageFromDd = signImageFromDd.equals(ConsentConfig.RETURN_NULL) ? "" : signImageFromDd;
+      signImageSeqNo = signImageSeqNo.equals(ConsentConfig.RETURN_NULL) ? "" : signImageSeqNo;
+
+      userSignDataInfoVO.setInstCd(instCd);
+      userSignDataInfoVO.setUserId(userId);
+      userSignDataInfoVO.setUserNm(userNm);
+      userSignDataInfoVO.setSignData(signData);
+      userSignDataInfoVO.setSignImageFromDd(signImageFromDd);
+      userSignDataInfoVO.setSignImageSeqNo(signImageSeqNo);
+
+
+    }
+    return userSignDataInfoVO;
+  }
 }
 

+ 59 - 0
app/src/main/java/com/dbs/mplus/knuh/model/UserSignDataInfoVO.java

@@ -0,0 +1,59 @@
+package com.dbs.mplus.knuh.model;
+
+public class UserSignDataInfoVO {
+
+  private String instCd         = "";
+  private String userId         = "";
+  private String userNm         = "";
+  private String signData       = "";
+  private String signImageFromDd = "";
+  private String signImageSeqNo  = "";
+
+  public String getInstCd() {
+    return instCd;
+  }
+
+  public void setInstCd(String instCd) {
+    this.instCd = instCd;
+  }
+
+  public String getUserId() {
+    return userId;
+  }
+
+  public void setUserId(String userId) {
+    this.userId = userId;
+  }
+
+  public String getUserNm() {
+    return userNm;
+  }
+
+  public void setUserNm(String userNm) {
+    this.userNm = userNm;
+  }
+
+  public String getSignData() {
+    return signData;
+  }
+
+  public void setSignData(String signData) {
+    this.signData = signData;
+  }
+
+  public String getSignImageFromDd() {
+    return signImageFromDd;
+  }
+
+  public void setSignImageFromDd(String signImageFromDd) {
+    this.signImageFromDd = signImageFromDd;
+  }
+
+  public String getSignImageSeqNo() {
+    return signImageSeqNo;
+  }
+
+  public void setSignImageSeqNo(String signImageSeqNo) {
+    this.signImageSeqNo = signImageSeqNo;
+  }
+}

+ 17 - 15
app/src/main/java/com/dbs/mplus/knuh/util/ConsentConfig.java

@@ -9,21 +9,23 @@ public class ConsentConfig {
   public static final String RETURN_NULL      = "anyType{}";
   public static final String CLIENT_TYPE      = "M";
 
-  public static final String HOST_HOSPITAL    = BuildConfig.CONSENT_SERVER_URL + "HospitalSvc.asmx";
-  public static final String DO_LOGIN         = "doLogin"; // 모바일 로그인 api
-  public static final String GET_WARD_LIST    = "GetWardList"; // 병동 리스트
-  public static final String GET_DEPT_LIST    = "GetDeptList"; // 진료과 리스트
-  public static final String GET_DOCTOR_LIST  = "GetDoctorList"; // 진료의 리스트
-  public static final String GET_PATIENT_LIST = "GetPatientList"; // 환자 리스트 조회
-  public static final String GET_PATIENT_INFO = "GetPatientInfo"; // 환자 상세정보 조회
-  public static final String GET_CONSENT_SET_LIST  = "GetConsentSetList"; // 사용자 동의서 즐겨찾기
-  public static final String SET_USER_FORM_SET     = "SetUserFormSetList"; // 즐겨찾기 추가
-  public static final String DEL_USER_FORM_SET     = "DelUserFormSetList"; // 즐겨찾기 삭제
-  public static final String UPDATE_USER_SETUP     = "UpdateUserSetup";    // 사용자 기본 화면 설정 외래 O 입원 I 응급 E 수술 OP 검색 SR
-  public static final String GET_SIGN_DATA         = "GetSignImage";       // 서명 이미지
-  public static final String GET_USER_INFO         = "GetUserInfo";        // 사용자 정보
-  public static final String GET_OCR_TAG           = "GetOcrTag";          // ocrTag 채번
-  public static final String GET_BASE_DATA         = "GetBaseData";
+  public static final String HOST_HOSPITAL           = BuildConfig.CONSENT_SERVER_URL + "HospitalSvc.asmx";
+  public static final String DO_LOGIN                = "doLogin"; // 모바일 로그인 api
+  public static final String GET_WARD_LIST           = "GetWardList"; // 병동 리스트
+  public static final String GET_DEPT_LIST           = "GetDeptList"; // 진료과 리스트
+  public static final String GET_DOCTOR_LIST         = "GetDoctorList"; // 진료의 리스트
+  public static final String GET_PATIENT_LIST        = "GetPatientList"; // 환자 리스트 조회
+  public static final String GET_PATIENT_INFO        = "GetPatientInfo"; // 환자 상세정보 조회
+  public static final String GET_CONSENT_SET_LIST    = "GetConsentSetList"; // 사용자 동의서 즐겨찾기
+  public static final String SET_USER_FORM_SET       = "SetUserFormSetList"; // 즐겨찾기 추가
+  public static final String DEL_USER_FORM_SET       = "DelUserFormSetList"; // 즐겨찾기 삭제
+  public static final String UPDATE_USER_SETUP       = "UpdateUserSetup";    // 사용자 기본 화면 설정 외래 O 입원 I 응급 E 수술 OP 검색 SR
+  public static final String GET_SIGN_DATA           = "GetSignImage";       // 서명 이미지
+  public static final String GET_USER_INFO           = "GetUserInfo";        // 사용자 정보
+  public static final String GET_OCR_TAG             = "GetOcrTag";          // ocrTag 채번
+  public static final String GET_BASE_DATA           = "GetBaseData";
+  public static final String GET_USER_SIGN_DATA_INFO = "getUserSignDataInfo"; // 서명이미지 설정을 위한 기초정보 호출
+  public static final String SET_SIGN_IMAGE          = "setSignImage";        // 사용자 서명이미지 설정
 
   public static final String HOST_CONSENT = BuildConfig.CONSENT_SERVER_URL + "ConsentSvc.asmx";
   public static final String GET_CONSENT_CATEGORYY   = "GetCategoryForDropdown";  // 동의서 찾기시 카테고리 리스트

+ 6 - 8
app/src/main/java/com/dbs/mplus/knuh/util/Util.java

@@ -8,6 +8,8 @@ import android.content.SharedPreferences;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
 import android.graphics.PorterDuff;
 import android.graphics.drawable.Drawable;
 import android.net.ConnectivityManager;
@@ -40,9 +42,6 @@ import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
 import org.kobjects.base64.Base64;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-import org.xmlpull.v1.XmlPullParserFactory;
 
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
@@ -52,7 +51,6 @@ import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStreamReader;
-import java.io.StringReader;
 import java.io.UnsupportedEncodingException;
 import java.lang.reflect.Field;
 import java.net.NetworkInterface;
@@ -72,10 +70,6 @@ import java.util.Locale;
 import java.util.zip.GZIPInputStream;
 import java.util.zip.GZIPOutputStream;
 
-import static java.lang.Thread.MAX_PRIORITY;
-import static java.lang.Thread.MIN_PRIORITY;
-import static java.lang.Thread.NORM_PRIORITY;
-
 public class Util {
   private static final String TAG = "Util";
 
@@ -717,6 +711,10 @@ public class Util {
     //return Base64.encodeToString(data, Base64.NO_WRAP);     //Android에서 Base64 인코딩 시에 개행문자를 삽입하지 않는 옵션은 NO_WRAP입니다.
   }
 
+  public static String base64Decode(String text) {
+    return new String(Base64.decode(text));
+  }
+
   /**
    * base64Encode
    * @author jksong

+ 10 - 0
app/src/main/res/drawable/layout_edge.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item>
+        <shape android:shape="rectangle">
+            <stroke
+                android:color="@color/black"
+                android:width="1dp"/>
+        </shape>
+    </item>
+</selector>

+ 10 - 0
app/src/main/res/drawable/sign_edge.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item>
+        <shape android:shape="rectangle">
+            <stroke
+                android:color="@color/alertColor"
+                android:width="1dp"/>
+        </shape>
+    </item>
+</selector>

+ 13 - 0
app/src/main/res/layout/activity_consent.xml

@@ -145,6 +145,19 @@
             android:textColor="@color/white"
             android:textSize="20sp" />
 
+        <TextView
+            android:id="@+id/tvUpdateSign"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="16dp"
+            android:background="@drawable/shape_btn"
+            android:gravity="center"
+            android:paddingLeft="16dp"
+            android:paddingRight="16dp"
+            android:text="@string/updateSign"
+            android:textColor="@color/white"
+            android:textSize="20sp" />
+
     </LinearLayout>
 
     <!--전체레이아웃-->

+ 208 - 0
app/src/main/res/layout/activity_custom_sign_dialog.xml

@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:layout_marginVertical="200dp"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:background="@drawable/department_layer">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_centerInParent="true"
+        android:background="@drawable/department_layer"
+        android:orientation="vertical">
+        <RelativeLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_margin="2dp"
+            android:background="@color/commonColor">
+            <TextView
+                android:id="@+id/tvTitle"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_margin="12dp"
+                android:text="@string/signDialog"
+                android:textColor="@color/white"
+                android:textSize="20sp"
+                android:textStyle="bold" />
+        </RelativeLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:orientation="vertical"
+            android:layout_marginTop="12dp"
+            android:layout_marginLeft="14dp"
+            android:layout_marginRight="14dp"
+            android:weightSum="1">
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:background="@drawable/layout_edge"
+                android:layout_weight="0.25"
+                android:layout_marginBottom="14dp"
+                android:weightSum="4"
+                android:orientation="vertical">
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_weight="3"
+                    android:gravity="center"
+                    android:weightSum="1"
+                    android:orientation="horizontal" >
+                    <TextView
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_weight="0.25"
+                        android:gravity="center"
+                        android:text="@string/userId"
+                        android:textSize="20sp"
+                        android:textStyle="bold"
+                        android:textColor="@color/black" />
+                    <View
+                        android:layout_width="1dp"
+                        android:layout_height="match_parent"
+                        android:background="@color/black" />
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_weight="0.25"
+                        android:weightSum="1"
+                        android:orientation="horizontal">
+                        <EditText
+                            android:id="@+id/etUserId"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_weight="0.2"
+                            android:enabled="false"
+                            android:gravity="center"
+                            android:textSize="20sp"
+                            android:singleLine="true"
+                            app:theme="@style/EditTextStyle"/>
+                        <!-- ImageView
+                            android:layout_width="match_parent"
+                            android:layout_height="match_parent"
+                            android:layout_margin="4dp"
+                            android:layout_weight="0.8"
+                            android:src="@drawable/ic_search_black_24dp"/ -->
+                    </LinearLayout>
+
+                    <View
+                        android:layout_width="1dp"
+                        android:layout_height="match_parent"
+                        android:background="@color/black" />
+                    <TextView
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_weight="0.25"
+                        android:gravity="center"
+                        android:text="@string/userNm"
+                        android:textStyle="bold"
+                        android:textSize="20sp"
+                        android:textColor="@color/black" />
+                    <View
+                        android:layout_width="1dp"
+                        android:layout_height="match_parent"
+                        android:background="@color/black" />
+                    <TextView
+                        android:id="@+id/tvUserNm"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_weight="0.25"
+                        android:gravity="center"
+                        android:textSize="20sp"
+                        android:autoSizeMaxTextSize="20sp"
+                        android:autoSizeMinTextSize="8sp"
+                        android:autoSizeStepGranularity="2sp"
+                        android:autoSizeTextType="uniform"
+                        android:singleLine="false"
+                        android:textColor="@color/black" />
+                </LinearLayout>
+
+                <View
+                    android:layout_width="match_parent"
+                    android:layout_height="1dp"
+                    android:background="@color/black" />
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:gravity="center"
+                    android:layout_weight="1"
+                    android:weightSum="1"
+                    android:orientation="horizontal" >
+                    <TextView
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:layout_weight="0.75"
+                        android:gravity="center"
+                        android:text="@string/signImage"
+                        android:textStyle="bold"
+                        android:textSize="20sp"
+                        android:textColor="@color/black" />
+                    <View
+                        android:layout_width="1dp"
+                        android:layout_height="match_parent"
+                        android:background="@color/black" />
+
+                    <LinearLayout
+                        android:id="@+id/startSignLayout"
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:orientation="horizontal"
+                        android:layout_weight="0.25" >
+
+                        <ImageView
+                            android:id="@+id/ivSignImage"
+                            android:layout_width="match_parent"
+                            android:layout_height="match_parent"
+                            android:layout_margin="16dp"/>
+                    </LinearLayout>
+                </LinearLayout>
+            </LinearLayout>
+            <LinearLayout
+                android:id="@+id/btnLayout"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:orientation="horizontal"
+                android:layout_weight="0.75"
+                android:layout_marginBottom="2dp"
+                android:gravity="center"
+                android:background="@xml/border_top">
+                <Button
+                    android:id="@+id/btnConfirm"
+                    style="?android:attr/borderlessButtonStyle"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:layout_marginTop="14dp"
+                    android:layout_marginBottom="12dp"
+                    android:layout_marginLeft="48dp"
+                    android:layout_marginRight="10dp"
+                    android:background="@drawable/shape2"
+                    android:textColor="@color/white"
+                    android:textSize="16sp"
+                    android:text="@string/confirm"/>
+
+                <Button
+                    android:id="@+id/btnCancel"
+                    style="?android:attr/borderlessButtonStyle"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:layout_marginTop="14dp"
+                    android:layout_marginBottom="12dp"
+                    android:layout_marginLeft="10dp"
+                    android:layout_marginRight="48dp"
+                    android:text="@string/cancel"
+                    android:textColor="@color/white"
+                    android:textSize="16sp"
+                    android:background="@drawable/shape2" />
+
+            </LinearLayout>
+        </LinearLayout>
+    </LinearLayout>
+</RelativeLayout>

+ 97 - 0
app/src/main/res/layout/activity_custom_sign_pad.xml

@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:layout_marginVertical="200dp"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:background="@drawable/department_layer">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_centerInParent="true"
+        android:background="@drawable/department_layer"
+        android:orientation="vertical">
+        <RelativeLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_margin="2dp"
+            android:background="@color/commonColor">
+            <TextView
+                android:id="@+id/tvTitle"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_margin="12dp"
+                android:text="@string/createSign"
+                android:textColor="@color/white"
+                android:textSize="20sp"
+                android:textStyle="bold" />
+        </RelativeLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:orientation="vertical"
+            android:layout_marginTop="12dp"
+            android:layout_marginLeft="14dp"
+            android:layout_marginRight="14dp"
+            android:weightSum="1">
+            <LinearLayout
+                android:id="@+id/signPadLayout"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:background="@drawable/sign_edge"
+                android:layout_weight="0.25"
+                android:layout_marginBottom="14dp"
+                android:weightSum="4"
+                android:orientation="vertical">
+                <com.github.gcacace.signaturepad.views.SignaturePad
+                    android:id="@+id/signPad"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_margin="12dp"
+                    app:penColor="@color/black" />
+            </LinearLayout>
+            <LinearLayout
+                android:id="@+id/btnLayout"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:orientation="horizontal"
+                android:layout_weight="0.75"
+                android:layout_marginBottom="2dp"
+                android:gravity="center"
+                android:background="@xml/border_top">
+                <Button
+                    android:id="@+id/btnConfirm"
+                    style="?android:attr/borderlessButtonStyle"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:layout_marginTop="14dp"
+                    android:layout_marginBottom="12dp"
+                    android:layout_marginLeft="48dp"
+                    android:layout_marginRight="10dp"
+                    android:background="@drawable/shape2"
+                    android:textColor="@color/white"
+                    android:textSize="16sp"
+                    android:text="@string/confirm"/>
+
+                <Button
+                    android:id="@+id/btnInit"
+                    style="?android:attr/borderlessButtonStyle"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:layout_marginTop="14dp"
+                    android:layout_marginBottom="12dp"
+                    android:layout_marginLeft="10dp"
+                    android:layout_marginRight="48dp"
+                    android:text="@string/initialize"
+                    android:textColor="@color/white"
+                    android:textSize="16sp"
+                    android:background="@drawable/shape2" />
+
+            </LinearLayout>
+        </LinearLayout>
+    </LinearLayout>
+</RelativeLayout>

+ 14 - 1
app/src/main/res/values/strings.xml

@@ -166,7 +166,20 @@
     <string name="ERROR_001">뷰어를 설치해주세요.</string>
     <string name="ERROR_002">뷰어 버전 정보가 일치하지 않습니다 앱 업데이트가 필요합니다.</string>
     <string name="ERROR_006">뷰어 실행 권한이 불충분합니다 </string>
-    
+
     <string name="whiteList">동의서 저장을 위해서 \"배터리 사용량 최적화 중지\" 허용이 필요합니다.</string>
 
+    <!-- 전자 서명이미지 수정 및 추가에 대한 string -->
+    <string name="updateSign">서명 수정</string>
+    <string name="signDialog">서명 이미지 설정</string>
+    <string name="userId">사원번호</string>
+    <string name="userNm">성명</string>
+    <string name="signImage">서명 이미지</string>
+    <string name="createSign">서명 이미지 작성</string>
+    <string name="initialize">초기화</string>
+    <string name="signDataError">사용자 정보 조회에 실패하였습니다 \n문의: 의료정보팀</string>
+    <string name="okSignImgSet">서명이미지를 저장하였습니다</string>
+    <string name="setSignImage">서명이미지를 저장하시겠습니까?</string>
+    <string name="setSignImageError">서명이미지 저장에 실패하였습니다 \n문의: 의료정보팀</string>
+
 </resources>