투케이2K

41. (TWOK/UTIL) [Android/Java] A_CookieWebview - 쿠키 설정 및 웹뷰 로드 수행 실시 클래스 본문

투케이2K 유틸파일

41. (TWOK/UTIL) [Android/Java] A_CookieWebview - 쿠키 설정 및 웹뷰 로드 수행 실시 클래스

투케이2K 2022. 5. 9. 16:29

[설 명]

프로그램 : Android / Java

설 명 : 쿠키 설정 및 웹뷰 로드 수행 실시 클래스

 

[소스 코드]

 

package com.app.test;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
import android.content.ClipData;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.net.Uri;
import android.net.http.SslError;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Display;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.webkit.ConsoleMessage;
import android.webkit.CookieManager;
import android.webkit.CookieSyncManager;
import android.webkit.HttpAuthHandler;
import android.webkit.JavascriptInterface;
import android.webkit.SslErrorHandler;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebStorage;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.Toast;

import org.json.JSONArray;
import org.json.JSONObject;

import java.io.IOException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class A_CookieWebview extends AppCompatActivity {


    /**
     * TODO [클래스 설명]
     * // -----------------------------------------
     * 1. 사용하는 레이아웃 : a_cookie
     * 2. 쿠키 삽입 및 웹뷰 화면 호출 액티비티 화면
     * // -----------------------------------------
     * */





    // TODO [쿠키 웹뷰 로직 설명 실시]
    /**
     * // -----------------------------------------
     * 1. A_Main 클래스 에서 setCookieSettings 자바스크립트 브릿지 명령 받으면 쿠키 삽입 및 웹뷰 호출 수행 실시
     * 2. 자바스크립트에서 내려받은 데이터에서 헤더 값이 있는 경우 헤더 값을 추가하는 로직 / 없으면 일반 웹뷰 호출 로직 수행
     * 3. 쿠키 설정 로직 설정
     *   - [1]. 웹뷰 설정 및 최초 로드 (init_WebView) 시 쿠키 값이 있으면 쿠키 매니저를 사용해 쿠키 삽입 실시
     *   - [2]. 웹뷰 설정 및 최초 로드 (init_WebView) 시 헤더 값이 있으면 헤더 값 설정 후 웹뷰 로드 실시
     * // -----------------------------------------
     * */





    // TODO [빠른 로직 찾기 : 주석 로직 찾기]
    /**
     * // -----------------------------------------
     * // [SEARCH FAST] : [웹뷰 설정]
     * // [SEARCH FAST] : [자바스크립트 통신]
     * // [SEARCH FAST] : [동적 헤더 추가 실시]
     * // [SEARCH FAST] : [쿠키 설정 실시]
     * // [SEARCH FAST] : [실시간 쿠키 값 확인 실시]
     * // -----------------------------------------
     */





    // TODO [자바스크립트에서 전달 받은 쿠키 설정 데이터 형식]
    /*
    // -----------------------------------------
    [쿠키 설정 방식]
    {
        "header" : [
              {"Cookie" : "JSESSIONID=61f0aa76ad66d12300000000; domain=m.test.ac.kr; path=/;"}, // [쿠키 스트링 값]
              {"Autholization" : "1234"} // [헤더 권한 설정]
        ],
        "url" : "https://m.test.ac.kr/v3/app", // [웹뷰 주소 로드 수행]
        "domain" : "https://m.test.ac.kr" // [쿠키 설정 도메인]
    }
    // -----------------------------------------
    [일반 주소 호출]
    {
        "url" : "https://www.naver.com"
    }
    // -----------------------------------------
    */





    // TODO [웹뷰 전역 변수 선언 부분]
    WebView main_webview; // [웹뷰 컴포넌트]
    Handler js_handler = new Handler(); // [자바스크립트 통신 사용 핸들러]
    boolean webViewKeyEvent = false;





    // TODO [전역 변수 선언 부분]
    private static final String ACTIVITY_NAME = "A_CookieWebview"; // [액티비티 명칭 지정]

    String saveData = ""; // [프리퍼런스에 저장된 데이터]
    String loadUrl = ""; // [웹뷰 로드 주소]

    String cookieDomain = ""; // [쿠키 설정 도메인 주소]
    String cookieString = ""; // [쿠키 스트링 문자열 저장 값]

    boolean headerExist = false; // [자바스크립트로 넘어온 헤더 데이터 있는지 체크 실시]
    JSONArray headerArray = null; // [헤더 정보를 담는 배열]

    boolean errorExist = false; // [에러 발생 여부 값]





    // TODO [액티비티 생명 주기 상태 체크 메소드]
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        try {
            // [타이틀바 없애기 : FEATURE_NO_TITLE]
            requestWindowFeature(Window.FEATURE_NO_TITLE);
        }
        catch (Exception e){
            e.printStackTrace();
        }
        // [액티비티 레이아웃 지정 실시]
        setContentView(R.layout.a_cookie);
        Log.i("---","---");
        Log.d("//===========//","================================================");
        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: 액티비티 수행 실시]");
        Log.d("//===========//","================================================");
        Log.i("---","---");


        // -----------------------------------------
        // TODO [자바스크립트에서 전달 받은 웹뷰 초기 로드 데이터 확인 실시]
        saveData = S_Preference.getString(getApplication(), S_FinalData.PRE_WV_COOKIE_DATA);

        if (C_Util.stringNotNull(saveData) == true) { // [널 데이터가 아닌 경우]
            Log.i("---","---");
            Log.d("//===========//","================================================");
            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: 웹뷰 로드 정보 확인 실시]");
            Log.i("","\n"+"[saveData :: "+String.valueOf(saveData)+"]");
            Log.d("//===========//","================================================");
            Log.i("---","---");

            // -----------------------------------------
            // [프리퍼런스 데이터 초기화 수행 실시]
            S_Preference.setString(getApplication(), S_FinalData.PRE_WV_COOKIE_DATA, "");
            S_Preference.setString(getApplication(), S_FinalData.PRE_WV_COOKIE_DATA, "");
            // -----------------------------------------


            // -----------------------------------------
            // [데이터 파싱 수행 실시]
            try {
                if (C_Util.stringJsonObjectEnable(saveData) == true){ // [json 데이터 변경 가능 한 경우]
                    JSONObject totalJSON = new JSONObject(String.valueOf(saveData));

                    // TODO [1]. url 데이터가 포함되어 있는지 확인 실시 (웹뷰 로드 주소)
                    if (totalJSON.has("url") == true){
                        loadUrl = String.valueOf(totalJSON.get("url"));
                    }

                    // TODO [2]. 도메인 주소가 포함되어 있는지 확인 실시 (쿠키 설정 도메인 주소)
                    if (totalJSON.has("domain") == true){
                        cookieDomain = String.valueOf(totalJSON.get("domain"));
                    }

                    // TODO [3]. 웹뷰 로드에 필요한 헤더 값이 포함되어있는지 확인 실시 (헤더 , 쿠키 값)
                    if (totalJSON.has("header") == true){
                        headerArray = new JSONArray(String.valueOf(totalJSON.get("header")));
                    }

                    // TODO [4]. 파싱한 데이터 검증 수행 실시
                    if (C_Util.stringNotNull(loadUrl) == true){ // [웹뷰 로드 주소가 널이 아닌 경우]

                        // [도메인 주소와 헤더 값이 널이 아닌 지 확인]
                        if (C_Util.stringNotNull(cookieDomain) == true
                                && headerArray != null && headerArray.length()>0){

                            // [헤더 배열을 돌면서 세부적인 설정 값 파싱 실시]
                            for (int i=0; i<headerArray.length(); i++){
                                JSONObject jsonObj = new JSONObject(String.valueOf(headerArray.get(i)));
                                Iterator keyList = jsonObj.keys();
                                while(keyList.hasNext()){
                                    String key = (String) keyList.next();
                                    String keyData = String.valueOf(key); // [key]
                                    String valueData = String.valueOf(jsonObj.get(key)); // [value]
                                    /*
                                    Log.i("---","---");
                                    Log.d("//===========//","================================================");
                                    Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: [헤더] 배열 값 파싱 수행 실시]");
                                    Log.i("","\n"+"[array :: "+String.valueOf("headerArray")+"]");
                                    Log.i("","\n"+"[key :: "+String.valueOf(keyData)+"]");
                                    Log.i("","\n"+"[value :: "+String.valueOf(valueData)+"]");
                                    Log.d("//===========//","================================================");
                                    Log.i("---","---");
                                    // */

                                    // TODO [실제 헤더가 포함된 경우임]
                                    headerExist = true;

                                    // TODO [쿠키 스트링 값 저장 실시]
                                    if (keyData.trim().toLowerCase().contains("cookie")){ // [key 값이 쿠키 인 경우]

                                        // [쿠키 스트링 값 데이터 지정]
                                        cookieString = String.valueOf(valueData);

                                        // [쿠키 스트링 값 포맷 수행 실시]
                                        if (cookieString.endsWith(";") == false){
                                            cookieString += ";";
                                        }
                                        cookieString = cookieString.replaceAll(" ", "");


                                        /**
                                         // -----------------------------------------
                                         TODO : [쿠키 스트링 형태 설명]
                                         // -----------------------------------------
                                         1. 쿠키 스트링 형태 : JSESSIONID=61f0aa76ad66d12308000000;domain=m.test.ac.kr;path=/;
                                         // -----------------------------------------
                                         2. 주요 사항 : 쿠키 스트링은 각 데이터 별로 [;] 세미콜론 구분이 필요하다
                                         // -----------------------------------------
                                         */


                                        // [for 문을 돌면서 = [등호] 와 [;] 세미 콜론 개수 카운트 실시 >> 쿠키 스트링 형식 문자열 검사]
                                        int check_1 = 0; // 특수문자 [=] 개수
                                        int check_2 = 0; // 특수문자 [;] 개수
                                        for (int k=0; k<cookieString.length(); k++){
                                            if (cookieString.charAt(k) == '='){
                                                check_1 += 1;
                                            }
                                            if (cookieString.charAt(k) == ';'){
                                                check_2 += 1;
                                            }
                                        }


                                        // [정상적인 쿠키 스트링 값이 아닌 경우]
                                        if (check_1 != check_2){
                                            Log.i("---","---");
                                            Log.e("//===========//","================================================");
                                            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: 쿠키 설정 데이터 포맷 양식 확인 에러]");
                                            Log.i("","\n"+"[error :: "+String.valueOf("쿠키 설정에 필요한 데이터 확인 중 문제가 발생했습니다. [cookie data format check error]")+"]");
                                            Log.e("//===========//","================================================");
                                            Log.i("---","---");

                                            // [쿠키 스트링 값 데이터 지정]
                                            cookieString = "";

                                            // [액티비티 종료 팝업창 알림 표시 수행]
                                            showAlertFinish(
                                                    "[알림]",
                                                    "쿠키 설정에 필요한 데이터 확인 중 문제가 발생했습니다. [cookie data format check error]",
                                                    "확인",
                                                    ""
                                            );
                                        }
                                        else {
                                            // [정상적으로 포맷을 수행한 쿠키 값을 배열에 삽입 실시]
                                            jsonObj.put(keyData, cookieString);
                                            headerArray.put(i, jsonObj); // [배열 데이터 수정]
                                        }
                                    }
                                }
                            }
                            Log.i("---","---");
                            Log.w("//===========//","================================================");
                            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: 웹뷰 로드 [쿠키] 설정 데이터 [검증] 수행]");
                            Log.i("","\n"+"--------------------------------");
                            Log.i("","\n"+"[url :: "+String.valueOf(loadUrl)+"]");
                            Log.i("","\n"+"--------------------------------");
                            Log.i("","\n"+"[domain :: "+String.valueOf(cookieDomain)+"]");
                            Log.i("","\n"+"--------------------------------");
                            Log.i("","\n"+"[header :: "+String.valueOf(headerArray.toString())+"]");
                            Log.i("","\n"+"--------------------------------");
                            Log.i("","\n"+"[cookieString :: "+String.valueOf(cookieString)+"]");
                            Log.w("//===========//","================================================");
                            Log.i("---","---");

                            // [SEARCH FAST] : [웹뷰 설정]
                            init_WebView(1, loadUrl);
                        }
                        else { // [일반 주소 로드 실시]
                            Log.i("---","---");
                            Log.w("//===========//","================================================");
                            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: 웹뷰 로드 [일반] 설정 데이터 [검증] 수행]");
                            Log.i("","\n"+"[url :: "+String.valueOf(loadUrl)+"]");
                            Log.w("//===========//","================================================");
                            Log.i("---","---");

                            // [SEARCH FAST] : [웹뷰 설정]
                            init_WebView(0, loadUrl);
                        }
                    }
                    else { // [웹뷰 로드 주소가 널 인 경우]
                        Log.i("---","---");
                        Log.e("//===========//","================================================");
                        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: 웹뷰 로드 주소 확인 에러]");
                        Log.i("","\n"+"[error :: "+String.valueOf("웹뷰 로드에 필요한 주소 데이터를 다시 확인해주세요. [url data is null]")+"]");
                        Log.e("//===========//","================================================");
                        Log.i("---","---");

                        // [액티비티 종료 팝업창 알림 표시 수행]
                        showAlertFinish(
                                "[알림]",
                                "웹뷰 로드에 필요한 주소 데이터를 다시 확인해주세요. [url data is null]",
                                "확인",
                                ""
                        );
                    }
                }
                else { // [json 데이터로 변경 불가능 한 경우]
                    Log.i("---","---");
                    Log.e("//===========//","================================================");
                    Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: 웹뷰 로드 정보 확인 에러]");
                    Log.i("","\n"+"[error :: "+String.valueOf("데이터 json 형식 여부를 다시 확인해주세요. [data parsing error]")+"]");
                    Log.e("//===========//","================================================");
                    Log.i("---","---");

                    // [액티비티 종료 팝업창 알림 표시 수행]
                    showAlertFinish(
                            "[알림]",
                            "데이터 json 형식 여부를 다시 확인해주세요. [data parsing error]",
                            "확인",
                            ""
                    );
                }
            }
            catch (Exception e){
                e.printStackTrace();
            }
            // -----------------------------------------
        }
        else { // [널 데이터 인 경우]
            Log.i("---","---");
            Log.e("//===========//","================================================");
            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: 웹뷰 로드 정보 확인 실패]");
            Log.i("","\n"+"[error :: "+String.valueOf("웹뷰 로드에 필요한 데이터를 다시 확인해주세요. [data is null]")+"]");
            Log.e("//===========//","================================================");
            Log.i("---","---");

            // [액티비티 종료 팝업창 알림 표시 수행]
            showAlertFinish(
                    "[알림]",
                    "웹뷰 로드에 필요한 데이터를 다시 확인해주세요. [data is null]",
                    "확인",
                    ""
            );
        }
        // -----------------------------------------


    } // TODO [메인 종료]





    // TODO [웹뷰 초기값 설정 및 최초 웹뷰 로드 수행 부분]
    public void init_WebView(int _loadType, String _loadUrl) {
        Log.i("---","---");
        Log.d("//===========//","================================================");
        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> init_WebView() :: 웹뷰 초기값 설정 및 최초 웹뷰 로드 수행 실시]");
        Log.i("","\n"+"[_loadType :: "+String.valueOf(_loadType)+"]");
        Log.i("","\n"+"[_loadUrl :: "+String.valueOf(_loadUrl)+"]");
        Log.d("//===========//","================================================");
        Log.i("---","---");

        // -----------------------------------------
        // [SEARCH FAST] : [웹뷰 설정]
        // -----------------------------------------

        try {
            // -----------------------------------------
            // TODO [웹뷰 컴포넌트 매칭 실시]
            main_webview = (WebView)findViewById(R.id.main_webview);
            // -----------------------------------------


            // -----------------------------------------
            // TODO [웹뷰 쿠키 및 세션 관리를 위한 쿠키 매니저 선언]
            CookieManager cookieManager = CookieManager.getInstance();
            cookieManager.setAcceptCookie(true);
            cookieManager.setAcceptThirdPartyCookies(main_webview, true);
            // -----------------------------------------


            // -----------------------------------------
            // TODO [WebView 캐시 초기화 설정]
            try {
                main_webview.clearHistory();
                main_webview.clearCache(true);
                main_webview.clearView();
            }
            catch (Exception e){
                //e.printStackTrace();
            }
            // -----------------------------------------


            // -----------------------------------------
            // TODO [웹뷰 CONTENT 허용 설정]
            main_webview.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
            // -----------------------------------------


            // -----------------------------------------
            // TODO [JavaScript 허용]
            main_webview.getSettings().setJavaScriptEnabled(true);
            // -----------------------------------------


            // -----------------------------------------
            // TODO [JavaScript의 window.open 허용]
            main_webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
            main_webview.getSettings().setSupportMultipleWindows(true); // [새창 띄우기 허용]
            // -----------------------------------------


            // -----------------------------------------
            // TODO [자바스크립트 웹 스토리지 사용]
            main_webview.getSettings().setDomStorageEnabled(true);
            // -----------------------------------------


            // -----------------------------------------
            // TODO [HTTPS 페이지내 이미지 표시 설정]
            if(Build.VERSION.SDK_INT >= 21) {
                main_webview.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
            }
            // -----------------------------------------


            // -----------------------------------------
            // TODO [뷰 포트 스케일 관련]
            main_webview.setInitialScale(8);
            main_webview.scrollTo(0,0);
            // -----------------------------------------


            // -----------------------------------------
            // TODO [뷰 포트 핀줌 관련]
            main_webview.getSettings().setLoadWithOverviewMode(true);
            main_webview.getSettings().setUseWideViewPort(true);
            main_webview.getSettings().setBuiltInZoomControls(true);
            main_webview.getSettings().setSupportZoom(true);
            main_webview.getSettings().setDisplayZoomControls(false);
            // -----------------------------------------


            // -----------------------------------------
            // TODO [웹뷰 크롬 브라우저에서 디버깅 모드 설정 허용]
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                try {
                    //main_webview.setWebContentsDebuggingEnabled(true); // TODO [디버깅 테스트 APK 생성 용도]
                }
                catch (Exception e){
                    //e.printStackTrace();
                }
            }
            // -----------------------------------------


            // -----------------------------------------
            // TODO [web client 설정]
            main_webview.setWebViewClient(new MainWeb());
            // -----------------------------------------


            // -----------------------------------------
            // TODO [웹뷰가 띄어질 브라우저 선택 및 크롬 클라이언트 정의]
            main_webview.setWebChromeClient(new WebChromeClient()); // [크롬으로 설정]
            // -----------------------------------------


            // -----------------------------------------
            // TODO [크롬 클라이언트 설정 실시]
            main_webview.setWebChromeClient(new WebChromeClient() {

                // TODO [웹 브라우저 콘솔 로그 확인]
                @Override
                public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
                    Log.i("---","---");
                    Log.e("//===========//","================================================");
                    Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onConsoleMessage() :: 웹 브라우저 콘솔 로그 확인 실시]");
                    Log.i("","\n"+"--------------------------------");
                    Log.i("","\n"+"[getUrl :: "+String.valueOf(main_webview.getUrl())+"]");
                    Log.i("","\n"+"--------------------------------");
                    Log.i("","\n"+"[getOriginalUrl :: "+String.valueOf(main_webview.getOriginalUrl())+"]");
                    Log.i("","\n"+"--------------------------------");
                    Log.i("","\n"+"[message [1] :: "+String.valueOf(consoleMessage.message())+"]");
                    Log.i("","\n"+"--------------------------------");
                    Log.i("","\n"+"[message [2] :: "+String.valueOf(consoleMessage.toString())+"]");
                    Log.e("//===========//","================================================");
                    Log.i("---","---");
                    return super.onConsoleMessage(consoleMessage);
                }

                // TODO [실시간 웹뷰 로드 상태 확인]
                @Override
                public void onProgressChanged(WebView view, int progress) {
                    Log.i("---","---");
                    Log.d("//===========//","================================================");
                    Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onProgressChanged() :: 실시간 웹뷰 호출 상황 확인 실시]");
                    Log.i("","\n"+"[getUrl :: "+String.valueOf(main_webview.getUrl())+"]");
                    Log.i("","\n"+"[getOriginalUrl :: "+String.valueOf(main_webview.getOriginalUrl())+"]");
                    Log.i("","\n"+"[호출 상황 :: "+String.valueOf(progress)+"]");
                    Log.d("//===========//","================================================");
                    Log.i("---","---");

                    // [웹뷰 로드 완료 상태 : 웹뷰의 호출 상황이 100 인 경우]
                    if(progress >= 100){
                        Log.i("---","---");
                        Log.w("//===========//","================================================");
                        Log.i("","\n"+"[A_ChildWebview >> onProgressChanged() :: 실시간 웹뷰 호출 완료 상태]");
                        Log.i("","\n"+"--------------------------------");
                        Log.i("","\n"+"[getUrl :: "+String.valueOf(main_webview.getUrl())+"]");
                        Log.i("","\n"+"--------------------------------");
                        Log.i("","\n"+"[getOriginalUrl :: "+String.valueOf(main_webview.getOriginalUrl())+"]");
                        Log.i("","\n"+"--------------------------------");
                        //Log.i("","\n"+"[저장된 쿠키 값 :: "+String.valueOf(cookieManager.getCookie(_loadUrl))+"]");
                        Log.i("","\n"+"[저장된 쿠키 값 :: "+String.valueOf(cookieManager.getCookie(main_webview.getUrl()))+"]");
                        Log.w("//===========//","================================================");
                        Log.i("---","---");

                        // ----------------------------------
                        // [SEARCH FAST] : [실시간 쿠키 값 확인 실시]
                        // ----------------------------------
                    }
                }
            });
            // -----------------------------------------


            // -----------------------------------------
            // TODO [자바스크립트에서 안드로이드를 호출하는 [window.클래스.메소드] 부분에서 클래스 경로 정의]
            // [SEARCH FAST] : [자바스크립트 통신]
            Javascript_To_Android_Bridge(); // [자바스크립트 통신 모든 경로 추가]
            // -----------------------------------------


            // -----------------------------------------
            // TODO [웹뷰 리소스 초기화 관련]
            main_webview.getSettings().setAppCacheEnabled(false); // [앱 내부 캐시 사용 여부 설정]
            main_webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); // [웹뷰 캐시 모드 설정 [캐시 모드 사용 않고 네트워크 사용해 로드]]
            // -----------------------------------------


            // -----------------------------------------
            // TODO [SEARCH FAST] : [동적 헤더 추가 실시]
            if (_loadType == 1 && headerArray != null && headerArray.length()>0){
                // [동적 헤더 값을 담을 맵 선언 실시]
                Map<String, String> extraHeaders = new HashMap<String, String>();

                for (int i=0; i<headerArray.length(); i++){
                    JSONObject jsonObj = new JSONObject(String.valueOf(headerArray.get(i)));
                    Iterator keyList = jsonObj.keys();
                    while(keyList.hasNext()){
                        String key = (String) keyList.next();
                        String keyData = String.valueOf(key); // [key]
                        String valueData = String.valueOf(jsonObj.get(key)); // [value]

                        Log.i("---","---");
                        Log.d("//===========//","================================================");
                        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> init_WebView() :: 동적 [헤더] 값 추가 실시]");
                        Log.i("","\n"+"[key :: "+String.valueOf(keyData)+"]");
                        Log.i("","\n"+"[value :: "+String.valueOf(valueData)+"]");
                        Log.d("//===========//","================================================");
                        Log.i("---","---");

                        // [SEARCH FAST] : [쿠키 설정 실시]
                        if (keyData.trim().toLowerCase().contains("cookie")) { // TODO [쿠키가 포함된 경우]
                            Log.i("---","---");
                            Log.w("//===========//","================================================");
                            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> init_WebView() :: 동적 [헤더] 값 추가 실시]");
                            Log.i("","\n"+"--------------------------------");
                            Log.i("","\n"+"[설 명 :: "+String.valueOf("쿠키 추가 로직 처리 실시")+"]");
                            Log.i("","\n"+"--------------------------------");
                            Log.i("","\n"+"[cookieDomain :: "+String.valueOf(cookieDomain)+"]");
                            Log.i("","\n"+"--------------------------------");
                            Log.i("","\n"+"[valueData :: "+String.valueOf(valueData)+"]");
                            Log.w("//===========//","================================================");
                            Log.i("---","---");

                            /**
                             // -----------------------------------------
                             TODO : [쿠키 스트링 형태 설명]
                             // -----------------------------------------
                             1. 쿠키 스트링 형태 [valueData] : JSESSIONID=61f0aa76ad66d12308000000;domain=m.test.ac.kr;path=/;
                             // -----------------------------------------
                             2. 주요 사항 : 쿠키 스트링은 각 데이터 별로 [;] 세미콜론 구분이 필요하다
                             // -----------------------------------------
                             */

                            // TODO [쿠키 매니저에 추가 실시]
                            cookieManager.setCookie(cookieDomain, valueData);
                            cookieManager.getInstance().flush();
                        }
                        else { // TODO [쿠키가 포함되지 않는 경우]

                            // [헤더에 추가 실시]
                            extraHeaders.put(keyData, valueData);
                        }
                    }
                }
                // -----------------------------------------
                // [헤더 지정 및 쿠키 설정 웹뷰 호출 실시]
                main_webview.loadUrl(_loadUrl, extraHeaders);
                // -----------------------------------------
            }
            else {
                // TODO [일반 웹뷰 설정으로 로드 수행]
                main_webview.loadUrl(_loadUrl);
            }
            // -----------------------------------------
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }





    // TODO [WebViewClient 는 웹뷰에서 자유롭게 기능을 사용하기 위함]
    class MainWeb extends WebViewClient {
        // [로딩이 시작될 때]
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            Log.i("---","---");
            Log.d("//===========//","================================================");
            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onPageStarted() :: [웹 클라이언트]]");
            Log.i("","\n"+"[설 명 :: "+String.valueOf("로딩 시작")+"]");
            Log.d("//===========//","================================================");
            Log.i("---","---");
        }
        // [리소스를 로드하는 중 여러번 호출]
        @Override
        public void onLoadResource(WebView view, String url) {
            super.onLoadResource(view, url);
            Log.i("---","---");
            Log.d("//===========//","================================================");
            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onLoadResource() :: [웹 클라이언트]]");
            Log.i("","\n"+"[주 소 :: "+String.valueOf(url)+"]");
            Log.i("","\n"+"[설 명 :: "+String.valueOf("로드 중")+"]");
            Log.d("//===========//","================================================");
            Log.i("---","---");
        }
        // [방문 내역을 히스토리에 업데이트 할 때]
        @Override
        public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) {
            super.doUpdateVisitedHistory(view, url, isReload);
            Log.i("---","---");
            Log.d("//===========//","================================================");
            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> doUpdateVisitedHistory() :: [웹 클라이언트]]");
            Log.i("","\n"+"[설 명 :: "+String.valueOf("방문내역 업데이트")+"]");
            Log.d("//===========//","================================================");
            Log.i("---","---");
        }
        // [로딩이 완료됐을 때 한번 호출]
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            Log.i("---","---");
            Log.w("//===========//","================================================");
            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onPageFinished() :: [웹 클라이언트]]");
            Log.i("","\n"+"--------------------------------");
            Log.i("","\n"+"[로드 완료 주소 :: "+String.valueOf(url)+"]");
            Log.i("","\n"+"--------------------------------");
            Log.i("","\n"+"[getUrl 주소 :: "+String.valueOf(main_webview.getUrl())+"]");
            Log.i("","\n"+"--------------------------------");
            Log.i("","\n"+"[getOriginalUrl 주소 :: "+String.valueOf(main_webview.getOriginalUrl())+"]");
            Log.i("","\n"+"--------------------------------");
            Log.i("","\n"+"[설 명 :: "+String.valueOf("로드 완료")+"]");
            Log.w("//===========//","================================================");
            Log.i("---","---");
        }
        // [오류가 났을 경우, 오류는 복수할 수 없음]
        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            super.onReceivedError(view, errorCode, description, failingUrl);
            switch (errorCode) {
                case ERROR_AUTHENTICATION:
                    Log.i("---","---");
                    Log.e("//===========//","================================================");
                    Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
                    Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_AUTHENTICATION")+"]");
                    Log.i("","\n"+"[설 명 :: "+String.valueOf("서버에서 사용자 인증 실패")+"]");
                    Log.e("//===========//","================================================");
                    Log.i("---","---");
                    break;
                case ERROR_BAD_URL:
                    Log.i("---","---");
                    Log.e("//===========//","================================================");
                    Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
                    Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_BAD_URL")+"]");
                    Log.i("","\n"+"[설 명 :: "+String.valueOf("잘못된 URL")+"]");
                    Log.e("//===========//","================================================");
                    Log.i("---","---");
                    break;
                case ERROR_CONNECT:
                    Log.i("---","---");
                    Log.e("//===========//","================================================");
                    Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
                    Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_CONNECT")+"]");
                    Log.i("","\n"+"[설 명 :: "+String.valueOf("서버로 연결 실패")+"]");
                    Log.e("//===========//","================================================");
                    Log.i("---","---");
                    break;
                case ERROR_FAILED_SSL_HANDSHAKE:
                    Log.i("---","---");
                    Log.e("//===========//","================================================");
                    Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
                    Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_FAILED_SSL_HANDSHAKE")+"]");
                    Log.i("","\n"+"[설 명 :: "+String.valueOf("SSL handshake 수행 실패")+"]");
                    Log.e("//===========//","================================================");
                    Log.i("---","---");
                    break;
                case ERROR_FILE:
                    Log.i("---","---");
                    Log.e("//===========//","================================================");
                    Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
                    Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_FILE")+"]");
                    Log.i("","\n"+"[설 명 :: "+String.valueOf("일반 파일 오류")+"]");
                    Log.e("//===========//","================================================");
                    Log.i("---","---");
                    break;
                case ERROR_FILE_NOT_FOUND:
                    Log.i("---","---");
                    Log.e("//===========//","================================================");
                    Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
                    Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_FILE_NOT_FOUND")+"]");
                    Log.i("","\n"+"[설 명 :: "+String.valueOf("파일을 찾을 수 없습니다")+"]");
                    Log.e("//===========//","================================================");
                    Log.i("---","---");
                    break;
                case ERROR_HOST_LOOKUP:
                    Log.i("---","---");
                    Log.e("//===========//","================================================");
                    Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
                    Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_HOST_LOOKUP")+"]");
                    Log.i("","\n"+"[설 명 :: "+String.valueOf("서버 또는 프록시 호스트 이름 조회 실패")+"]");
                    Log.e("//===========//","================================================");
                    Log.i("---","---");
                    break;
                case ERROR_IO:
                    Log.i("---","---");
                    Log.e("//===========//","================================================");
                    Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
                    Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_IO")+"]");
                    Log.i("","\n"+"[설 명 :: "+String.valueOf("서버에서 읽거나 서버로 쓰기 실패")+"]");
                    Log.e("//===========//","================================================");
                    Log.i("---","---");
                    break;
                case ERROR_PROXY_AUTHENTICATION:
                    Log.i("---","---");
                    Log.e("//===========//","================================================");
                    Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
                    Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_PROXY_AUTHENTICATION")+"]");
                    Log.i("","\n"+"[설 명 :: "+String.valueOf("프록시에서 사용자 인증 실패")+"]");
                    Log.e("//===========//","================================================");
                    Log.i("---","---");
                    break;
                case ERROR_REDIRECT_LOOP:
                    Log.d("---","---");
                    Log.e("//===========//","================================================");
                    Log.d("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
                    Log.d("","\n"+"[타 입 :: "+String.valueOf("ERROR_REDIRECT_LOOP")+"]");
                    Log.d("","\n"+"[설 명 :: "+String.valueOf("너무 많은 리디렉션")+"]");
                    Log.e("//===========//","================================================");
                    Log.d("---","---");
                    break;
                case ERROR_TIMEOUT:
                    Log.i("---","---");
                    Log.e("//===========//","================================================");
                    Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
                    Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_TIMEOUT")+"]");
                    Log.i("","\n"+"[설 명 :: "+String.valueOf("연결 시간 초과")+"]");
                    Log.e("//===========//","================================================");
                    Log.i("---","---");
                    break;
                case ERROR_TOO_MANY_REQUESTS:
                    Log.i("---","---");
                    Log.e("//===========//","================================================");
                    Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
                    Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_TOO_MANY_REQUESTS")+"]");
                    Log.i("","\n"+"[설 명 :: "+String.valueOf("페이지 로드중 너무 많은 요청 발생")+"]");
                    Log.e("//===========//","================================================");
                    Log.i("---","---");
                    break;
                case ERROR_UNKNOWN:
                    Log.i("---","---");
                    Log.e("//===========//","================================================");
                    Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
                    Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_UNKNOWN")+"]");
                    Log.i("","\n"+"[설 명 :: "+String.valueOf("일반 오류")+"]");
                    Log.e("//===========//","================================================");
                    Log.i("---","---");
                    break;
                case ERROR_UNSUPPORTED_AUTH_SCHEME:
                    Log.d("---","---");
                    Log.e("//===========//","================================================");
                    Log.d("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
                    Log.d("","\n"+"[타 입 :: "+String.valueOf("ERROR_UNSUPPORTED_AUTH_SCHEME")+"]");
                    Log.d("","\n"+"[설 명 :: "+String.valueOf("지원되지 않는 인증 체계")+"]");
                    Log.e("//===========//","================================================");
                    Log.d("---","---");
                    break;
                case ERROR_UNSUPPORTED_SCHEME:
                    Log.i("---","---");
                    Log.e("//===========//","================================================");
                    Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedError() :: [웹 클라이언트]]");
                    Log.i("","\n"+"[타 입 :: "+String.valueOf("ERROR_UNSUPPORTED_SCHEME")+"]");
                    Log.i("","\n"+"[설 명 :: "+String.valueOf("URI가 지원되지 않는 방식")+"]");
                    Log.e("//===========//","================================================");
                    Log.i("---","---");
                    break;
            }
        }
        @Override
        public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
            // [E/chromium: [ERROR:ssl_client_socket_impl.cc 에러 해결 위함]
            try {
                Log.i("---","---");
                Log.e("//===========//","================================================");
                Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedSslError() :: [웹 클라이언트]]");
                Log.i("","\n"+"--------------------------------");
                Log.i("","\n"+"[설 명 :: "+String.valueOf("사이트 인증서 문제 발생")+"]");
                Log.i("","\n"+"--------------------------------");
                Log.i("","\n"+"[getUrl 주소 :: "+String.valueOf(main_webview.getUrl())+"]");
                Log.i("","\n"+"--------------------------------");
                Log.i("","\n"+"[getOriginalUrl 주소 :: "+String.valueOf(main_webview.getOriginalUrl())+"]");
                Log.e("//===========//","================================================");
                Log.i("---","---");

                // TODO [ssl 접속 에러가 발생한 경우 경고 팝업창 처리 실시]
                final AlertDialog.Builder builder = new AlertDialog.Builder(A_CookieWebview.this);
                builder.setMessage("이 사이트의 보안 인증서는 신뢰하는 보안 인증서가 아닙니다. 계속하시겠습니까?");
                builder.setPositiveButton("계속하기", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        handler.proceed();
                    }
                });
                builder.setNegativeButton("취소", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        handler.cancel();
                    }
                });
                final AlertDialog dialog = builder.create();
                dialog.show();
            }
            catch (Exception e){
                e.printStackTrace();
            }
            // [SSL 에러 타입 확인 실시]
            switch (error.getPrimaryError()) {
                case SslError.SSL_UNTRUSTED:
                    Log.i("---","---");
                    Log.e("//===========//","================================================");
                    Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedSslError() :: [웹 클라이언트]]");
                    Log.i("","\n"+"[타 입 :: "+String.valueOf("SSL_UNTRUSTED")+"]");
                    Log.i("","\n"+"[설 명 :: "+String.valueOf("이 사이트의 보안 인증서는 신뢰할 수 없습니다")+"]");
                    Log.e("//===========//","================================================");
                    Log.i("---","---");
                    break;
                case SslError.SSL_EXPIRED:
                    Log.i("---","---");
                    Log.e("//===========//","================================================");
                    Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedSslError() :: [웹 클라이언트]]");
                    Log.i("","\n"+"[타 입 :: "+String.valueOf("SSL_EXPIRED")+"]");
                    Log.i("","\n"+"[설 명 :: "+String.valueOf("보안 인증서가 만료되었습니다")+"]");
                    Log.e("//===========//","================================================");
                    Log.i("---","---");
                    break;
                case SslError.SSL_IDMISMATCH:
                    Log.i("---","---");
                    Log.e("//===========//","================================================");
                    Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedSslError() :: [웹 클라이언트]]");
                    Log.i("","\n"+"[타 입 :: "+String.valueOf("SSL_IDMISMATCH")+"]");
                    Log.i("","\n"+"[설 명 :: "+String.valueOf("보안 인증서가 ID 일치하지 않습니다")+"]");
                    Log.e("//===========//","================================================");
                    Log.i("---","---");
                    break;
                case SslError.SSL_NOTYETVALID:
                    Log.i("---","---");
                    Log.e("//===========//","================================================");
                    Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedSslError() :: [웹 클라이언트]]");
                    Log.i("","\n"+"[타 입 :: "+String.valueOf("SSL_NOTYETVALID")+"]");
                    Log.i("","\n"+"[설 명 :: "+String.valueOf("보안 인증서가 유효하지 않습니다")+"]");
                    Log.e("//===========//","================================================");
                    Log.i("---","---");
                    break;
            }
        }
        // [http 인증 요청이 있는 경우, 기본 동작은 요청 취소]
        @Override
        public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {
            super.onReceivedHttpAuthRequest(view, handler, host, realm);
            Log.i("---","---");
            Log.d("//===========//","================================================");
            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedHttpAuthRequest() :: [웹 클라이언트]]");
            Log.i("","\n"+"[설 명 :: "+String.valueOf("http 인증 요청")+"]");
            Log.d("//===========//","================================================");
            Log.i("---","---");
        }
        // [확대나 크기 등의 변화가 있는 경우]
        @Override
        public void onScaleChanged(WebView view, float oldScale, float newScale) {
            super.onScaleChanged(view, oldScale, newScale);
            Log.i("---","---");
            Log.d("//===========//","================================================");
            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onScaleChanged() :: [웹 클라이언트]]");
            Log.i("","\n"+"[설 명 :: "+String.valueOf("화면 크기 변화")+"]");
            Log.d("//===========//","================================================");
            Log.i("---","---");
        }
        // [웹 페이지 내에서 페이지 이동 key 이벤트 발생]
        @Override
        public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
            Log.i("---","---");
            Log.d("//===========//","================================================");
            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideKeyEvent() :: [웹 클라이언트]]");
            Log.i("","\n"+"[설 명 :: "+String.valueOf("웹 페이지 내에서 페이지 이동 key 이벤트 발생")+"]");
            Log.d("//===========//","================================================");
            Log.i("---","---");
            return super.shouldOverrideKeyEvent(view, event);
        }
        // [새로운 URL이 webview에 로드되려 할 경우 컨트롤을 대신할 기회를 줌]
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            Log.i("---","---");
            Log.w("//===========//","================================================");
            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
            Log.i("","\n"+"--------------------------------");
            Log.i("","\n"+"[로딩 주소 :: "+String.valueOf(url)+"]");
            Log.i("","\n"+"--------------------------------");
            Log.i("","\n"+"[getUrl 주소 :: "+String.valueOf(main_webview.getUrl())+"]");
            Log.i("","\n"+"--------------------------------");
            Log.i("","\n"+"[getOriginalUrl 주소 :: "+String.valueOf(main_webview.getOriginalUrl())+"]");
            Log.i("","\n"+"--------------------------------");
            Log.i("","\n"+"[설 명 :: "+String.valueOf("새로운 URL이 webview에 로드")+"]");
            Log.w("//===========//","================================================");
            Log.i("---","---");

            // TODO [intent 딥링크 스키마 확인 실시]
            if (url.startsWith("intent") && url.toLowerCase().contains("package")){
                Intent intent = null;
                try {
                    intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME); // 딥링크 스키마 확인
                    String packgeName = String.valueOf(intent.getPackage()); // 스키마에 포함된 패키지명 확인

                    // [스키마에 포함된 패키지 명이 널이 아닌 경우]
                    if (C_Util.stringNotNull(packgeName) == true) {

                        Intent existPackage = getPackageManager().getLaunchIntentForPackage(intent.getPackage());
                        if (existPackage != null) {
                            Log.i("---","---");
                            Log.w("//===========//","================================================");
                            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
                            Log.i("","\n"+"--------------------------------");
                            Log.i("","\n"+"[타 입 :: "+String.valueOf("intent / package")+"]");
                            Log.i("","\n"+"--------------------------------");
                            Log.i("","\n"+"[전체 데이터 :: "+String.valueOf(url.toString())+"]");
                            Log.i("","\n"+"--------------------------------");
                            Log.i("","\n"+"[패키지 명 :: "+String.valueOf(packgeName)+"]");
                            Log.i("","\n"+"--------------------------------");
                            Log.i("","\n"+"[success [성공] :: 스키마 외부 앱 이동 수행 실시]");
                            Log.w("//===========//","================================================");
                            Log.i("---","---");

                            // [스키마 사용해 외부앱 이동 수행 실시]
                            intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                            startActivity(intent);

                        } else {
                            Log.i("---","---");
                            Log.e("//===========//","================================================");
                            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
                            Log.i("","\n"+"--------------------------------");
                            Log.i("","\n"+"[타 입 :: "+String.valueOf("intent / package")+"]");
                            Log.i("","\n"+"--------------------------------");
                            Log.i("","\n"+"[패키지 명 :: "+String.valueOf(packgeName)+"]");
                            Log.i("","\n"+"--------------------------------");
                            Log.i("","\n"+"[error [에러] :: existPackage is null]");
                            Log.i("","\n"+"--------------------------------");
                            Log.i("","\n"+"[로 직 :: 마켓 이동 수행 실시]");
                            Log.e("//===========//","================================================");
                            Log.i("---","---");

                            // [마켓 이동 수행 실시]
                            C_MoveApp.goMarketRun(A_CookieWebview.this, packgeName);
                        }
                    }
                    else {
                        Log.i("---","---");
                        Log.e("//===========//","================================================");
                        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
                        Log.i("","\n"+"--------------------------------");
                        Log.i("","\n"+"[타 입 :: "+String.valueOf("intent / package")+"]");
                        Log.i("","\n"+"--------------------------------");
                        Log.i("","\n"+"[패키지 명 :: "+String.valueOf(packgeName)+"]");
                        Log.i("","\n"+"--------------------------------");
                        Log.i("","\n"+"[error [에러] :: PackageName Error]");
                        Log.e("//===========//","================================================");
                        Log.i("---","---");
                    }
                }
                catch (URISyntaxException e){
                    // [URI 문법 오류 시 처리 구간]
                    Log.i("---","---");
                    Log.e("//===========//","================================================");
                    Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
                    Log.i("","\n"+"--------------------------------");
                    Log.i("","\n"+"[타 입 :: "+String.valueOf("intent / package")+"]");
                    Log.i("","\n"+"--------------------------------");
                    Log.i("","\n"+"[catch [URISyntaxException] :: Intent URL Scheme 문법 오류 발생]");
                    Log.e("//===========//","================================================");
                    Log.i("---","---");
                }
                catch (ActivityNotFoundException e){
                    // [인텐트 이동을 수행할 앱을 발견하지 못한 경우]
                    String packageName = String.valueOf(intent.getPackage());

                    // [패키지 명이 널이 아닌 경우]
                    if (C_Util.stringNotNull(packageName) == true){
                        Log.i("---","---");
                        Log.e("//===========//","================================================");
                        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
                        Log.i("","\n"+"--------------------------------");
                        Log.i("","\n"+"[타 입 :: "+String.valueOf("intent / package")+"]");
                        Log.i("","\n"+"--------------------------------");
                        Log.i("","\n"+"[패키지명 :: "+String.valueOf(packageName)+"]");
                        Log.i("","\n"+"--------------------------------");
                        Log.i("","\n"+"[catch [ActivityNotFoundException] :: 외부 앱 설치 진행 실시]");
                        Log.e("//===========//","================================================");
                        Log.i("---","---");

                        // [마켓 이동 수행 실시]
                        C_MoveApp.goMarketRun(A_CookieWebview.this, packageName);
                    }
                    else {
                        Log.i("---","---");
                        Log.e("//===========//","================================================");
                        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
                        Log.i("","\n"+"--------------------------------");
                        Log.i("","\n"+"[타 입 :: "+String.valueOf("intent / package")+"]");
                        Log.i("","\n"+"--------------------------------");
                        Log.i("","\n"+"[catch [ActivityNotFoundException] :: 외부 앱 설치 실패]");
                        Log.i("","\n"+"--------------------------------");
                        Log.i("","\n"+"[error :: PackgeName Error]");
                        Log.e("//===========//","================================================");
                        Log.i("---","---");
                    }
                }
                // ----------------------------------
                // [return  값을 반드시 true 설정]
                return true;
                // ----------------------------------
            }


            // TODO [SMS 인텐트 이동 실시 : if(url.startsWith("sms:010-5678-1234")]
            if (url.startsWith("sms:")) {
                Log.i("---","---");
                Log.w("//===========//","================================================");
                Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
                Log.i("","\n"+"--------------------------------");
                Log.i("","\n"+"[타 입 :: "+String.valueOf("sms")+"]");
                Log.i("","\n"+"--------------------------------");
                Log.i("","\n"+"[정 보 :: "+String.valueOf(url)+"]");
                Log.i("","\n"+"--------------------------------");
                Log.i("","\n"+"[로 직 :: "+String.valueOf("문자 이동 수행 실시")+"]");
                Log.w("//===========//","================================================");
                Log.i("---","---");
                // ----------------------------------
                // [sms 이동 메소드 호출]
                C_Intent.goSmsIntent(A_CookieWebview.this, url);
                // ----------------------------------
                // [return  값을 반드시 true 설정]
                return true;
                // ----------------------------------
            }


            // TODO [전화 다이얼 인텐트 이동 실시 : if(url.startsWith("tel:010-1234-5678")]
            if(url.startsWith("tel:")){
                Log.i("---","---");
                Log.w("//===========//","================================================");
                Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
                Log.i("","\n"+"--------------------------------");
                Log.i("","\n"+"[타 입 :: "+String.valueOf("tel")+"]");
                Log.i("","\n"+"--------------------------------");
                Log.i("","\n"+"[정 보 :: "+String.valueOf(url)+"]");
                Log.i("","\n"+"--------------------------------");
                Log.i("","\n"+"[로 직 :: "+String.valueOf("전화 다이얼 이동 수행 실시")+"]");
                Log.w("//===========//","================================================");
                Log.i("---","---");
                // ----------------------------------
                // [전화 다이얼 이동 메소드 호출]
                C_Intent.goTelIntent(A_CookieWebview.this, url);
                // ----------------------------------
                // [return  값을 반드시 true 설정]
                return true;
                // ----------------------------------
            }


            // TODO [Mail (Gmail) 인텐트 이동 실시 : if(url.startsWith("mailto:honggildung@test.com?subject=tittle&body=content")]
            if(url.startsWith("mailto:")){
                Log.i("---","---");
                Log.w("//===========//","================================================");
                Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
                Log.i("","\n"+"--------------------------------");
                Log.i("","\n"+"[타 입 :: "+String.valueOf("mailto")+"]");
                Log.i("","\n"+"--------------------------------");
                Log.i("","\n"+"[정 보 :: "+String.valueOf(url)+"]");
                Log.i("","\n"+"--------------------------------");
                Log.i("","\n"+"[로 직 :: "+String.valueOf("메일 이동 수행 실시")+"]");
                Log.w("//===========//","================================================");
                Log.i("---","---");
                // ----------------------------------
                // [메일 이동 메소드 호출]
                C_Intent.goMailIntent(A_CookieWebview.this, url);
                // ----------------------------------
                // [return  값을 반드시 true 설정]
                return true;
                // ----------------------------------
            }


            // TODO [하이퍼링크 이동 실시 : if(url.startsWith("l:https://naver.com")]
            if(url.startsWith("l:")){
                Log.i("---","---");
                Log.w("//===========//","================================================");
                Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shouldOverrideUrlLoading() :: [웹 클라이언트]]");
                Log.i("","\n"+"--------------------------------");
                Log.i("","\n"+"[타 입 :: "+String.valueOf("하이퍼링크")+"]");
                Log.i("","\n"+"--------------------------------");
                Log.i("","\n"+"[정 보 :: "+String.valueOf(url)+"]");
                Log.i("","\n"+"--------------------------------");
                Log.i("","\n"+"[로 직 :: "+String.valueOf("외부 링크 이동 수행 실시")+"]");
                Log.w("//===========//","================================================");
                Log.i("---","---");
                // ----------------------------------
                // [하이퍼링크 이동 메소드 호출]
                C_Intent.goLinkIntent(A_CookieWebview.this, url);
                // ----------------------------------
                // [return  값을 반드시 true 설정]
                return true;
                // ----------------------------------
            }


            // ----------------------------------
            // [새로운 웹뷰 로드 수행]
            view.loadUrl(url);
            // ----------------------------------


            // ----------------------------------
            // [return  값을 반드시 false 설정]
            return false;
            // ----------------------------------
        }
    }





    // TODO [자바스크립트 >> 안드로이드 - 경로 지정 : 브릿지 경로에 location 추가 시 웹뷰 무한 로딩 현상 발생]
    public void Javascript_To_Android_Bridge(){
        Log.i("---","---");
        Log.w("//===========//","================================================");
        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> Javascript_To_Android_Bridge() :: 자바스크립트 통신 브릿지 경로 추가 실시]");
        Log.i("","\n"+"--------------------------------");
        Log.i("","\n"+"[경로 [1] :: "+String.valueOf("android")+"]");
        Log.i("","\n"+"--------------------------------");
        Log.i("","\n"+"[경로 [2] :: "+String.valueOf("main")+"]");
        Log.i("","\n"+"--------------------------------");
        Log.i("","\n"+"[경로 [3] :: "+String.valueOf("media")+"]");
        Log.w("//===========//","================================================");
        Log.i("---","---");

        // -----------------------------------------
        // [SEARCH FAST] : [자바스크립트 통신]
        // -----------------------------------------
        // [서버 : window.android.함수(); : 임시]
        main_webview.addJavascriptInterface(new AndroidBridge(), "android"); // [자바스크립트에 대응할 함수를 정의한 클래스 붙여줌]
        // -----------------------------------------
        // [서버 : window.main.함수(); : 임시]
        main_webview.addJavascriptInterface(new AndroidBridge(), "main"); // [자바스크립트에 대응할 함수를 정의한 클래스 붙여줌]
        // -----------------------------------------
        // [서버 : window.media.함수(); : 임시]
        main_webview.addJavascriptInterface(new AndroidBridge(), "media"); // [자바스크립트에 대응할 함수를 정의한 클래스 붙여줌]
        // -----------------------------------------
    }





    // TODO [자바스크립트 >> 안드로이드 - 함수 지정]
    // [SEARCH FAST] : [자바스크립트 통신]
    class AndroidBridge {
        // -----------------------------------------
        // [자바스크립트에서 호출하는 안드로이드 메소드]
        @JavascriptInterface
        public void setMarket(final String arg) {
            js_handler.post(new Runnable() {
                public void run() {
                    try {
                        String value = String.valueOf(arg);
                        Log.i("---","---");
                        Log.w("//===========//","================================================");
                        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> AndroidBridge :: setMarket() :: JS >> Android]");
                        Log.i("","\n"+"--------------------------------");
                        Log.i("","\n"+"[전달받은 데이터 :: "+String.valueOf(value)+"]");
                        Log.i("","\n"+"--------------------------------");
                        Log.i("","\n"+"[설 명 :: "+String.valueOf("마켓 이동 정보 전달 받음")+"]");
                        Log.i("","\n"+"--------------------------------");
                        Log.i("","\n"+"[로 직 :: "+"마켓 이동 수행 실시"+"]");
                        Log.w("//===========//","================================================");
                        Log.i("---","---");

                        // -----------------------------------------

                        // [자바스크립트 데이터 방어 로직 추가 실시 : 데이터 널 체크]
                        if (C_Util.stringNotNull(value.trim()) == true){
                        }
                        else {
                            Log.i("---","---");
                            Log.e("//===========//","================================================");
                            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> AndroidBridge :: setMarket() :: JS >> Android]");
                            Log.i("","\n"+"--------------------------------");
                            Log.i("","\n"+"[전달받은 데이터 :: "+String.valueOf(value)+"]");
                            Log.i("","\n"+"--------------------------------");
                            Log.i("","\n"+"[error [에러] :: "+String.valueOf(S_FinalData.ERROR_DATA_NULL)+"]");
                            Log.e("//===========//","================================================");
                            Log.i("---","---");

                            // [에러 팝업창 알림 표시]
                            C_Ui_View.showAlert(
                                    A_CookieWebview.this,
                                    0,
                                    S_FinalData.AL_TITLE,
                                    S_FinalData.ERROR_DATA_NULL + " [setMarket]",
                                    S_FinalData.AL_OK, "", "");

                            // [리턴 종료 실시]
                            return;
                        }

                        // -----------------------------------------

                        // [자바스크립트 데이터 방어 로직 추가 실시 : key 값 체크]
                        if (C_Util.stringMultiContains(value.toLowerCase().trim(), new String [] {"android", "package"}) == true){
                        }
                        else {
                            Log.i("---","---");
                            Log.e("//===========//","================================================");
                            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> AndroidBridge :: setMarket() :: JS >> Android]");
                            Log.i("","\n"+"--------------------------------");
                            Log.i("","\n"+"[전달받은 데이터 :: "+String.valueOf(value)+"]");
                            Log.i("","\n"+"--------------------------------");
                            Log.i("","\n"+"[error [에러] :: "+String.valueOf(S_FinalData.ERROR_PARSING_KEY)+"]");
                            Log.e("//===========//","================================================");
                            Log.i("---","---");

                            // [에러 팝업창 알림 표시]
                            C_Ui_View.showAlert(
                                    A_CookieWebview.this,
                                    0,
                                    S_FinalData.AL_TITLE,
                                    S_FinalData.ERROR_PARSING_KEY + " [setMarket]",
                                    S_FinalData.AL_OK, "", "");

                            // [리턴 종료 실시]
                            return;
                        }

                        // -----------------------------------------

                        // [자바스크립트 데이터 방어 로직 추가 실시 : json 데이터 형식 체크 실시]
                        if (C_Util.stringJsonObjectEnable(value) == true){ // [Json 파싱 가능한 경우]

                            // [json 객체 생성]
                            JSONObject responseJson = new JSONObject(value);

                            // [특정 key 포함 여부 확인]
                            if (responseJson.has("android")){

                                JSONObject packgesJson =  new JSONObject(String.valueOf(responseJson.get("android")));
                                String packageName = String.valueOf(packgesJson.get("package"));

                                // [자바스크립트 데이터 방어 로직 추가 실시 : 파싱 data 값 체크]
                                if (C_Util.stringNotNull(packageName) == true){
                                }
                                else {
                                    Log.i("---","---");
                                    Log.e("//===========//","================================================");
                                    Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> AndroidBridge :: setMarket() :: JS >> Android]");
                                    Log.i("","\n"+"--------------------------------");
                                    Log.i("","\n"+"[전달받은 데이터 :: "+String.valueOf(value)+"]");
                                    Log.i("","\n"+"--------------------------------");
                                    Log.i("","\n"+"[error [에러] :: "+String.valueOf(S_FinalData.ERROR_PARSING_DATA)+"]");
                                    Log.e("//===========//","================================================");
                                    Log.i("---","---");

                                    // [에러 팝업창 알림 표시]
                                    C_Ui_View.showAlert(
                                            A_CookieWebview.this,
                                            0,
                                            S_FinalData.AL_TITLE,
                                            S_FinalData.ERROR_PARSING_DATA + " [setMarket]",
                                            S_FinalData.AL_OK, "", "");

                                    // [리턴 종료 실시]
                                    return;
                                }

                                // TODO [앱 스토어 이동 실시]
                                C_MoveApp.goMarketRun(A_CookieWebview.this, packageName);
                            }
                        }
                        else { // [Json 파싱 불가능한 경우]
                            Log.i("---","---");
                            Log.e("//===========//","================================================");
                            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> AndroidBridge :: setMarket() :: JS >> Android]");
                            Log.i("","\n"+"--------------------------------");
                            Log.i("","\n"+"[전달받은 데이터 :: "+String.valueOf(value)+"]");
                            Log.i("","\n"+"--------------------------------");
                            Log.i("","\n"+"[error [에러] :: "+String.valueOf(S_FinalData.ERROR_JSON_PARSING)+"]");
                            Log.e("//===========//","================================================");
                            Log.i("---","---");

                            // [에러 팝업창 알림 표시]
                            C_Ui_View.showAlert(
                                    A_CookieWebview.this,
                                    0,
                                    S_FinalData.AL_TITLE,
                                    S_FinalData.ERROR_JSON_PARSING + " [setMarket]",
                                    S_FinalData.AL_OK, "", "");

                            // [리턴 종료 실시]
                            return;
                        }

                        // -----------------------------------------
                    }
                    catch (Exception e){
                        e.printStackTrace();
                    }
                }
            });
        }
        // -----------------------------------------
    }





    // TODO [안드로이드 >> 자바스크립트]
    // [SEARCH FAST] : [자바스크립트 통신]
    class Android_To_Javascript{
        // -----------------------------------------
        // [안드로이드에서 자바스크립트 호출]
        public void shakeResult(){
            try {
                Log.i("---","---");
                Log.w("//===========//","================================================");
                Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> shakeResult() :: Android >> JS]");
                Log.i("","\n"+"--------------------------------");
                Log.i("","\n"+"[JS 함수 :: "+String.valueOf("shakeResult")+"]");
                Log.i("","\n"+"--------------------------------");
                Log.i("","\n"+"[설 명 :: "+String.valueOf("디바이스 흔들기 이벤트 발생 전달")+"]");
                Log.w("//===========//","================================================");
                Log.i("---","---");


                // -----------------------------------------
                // TODO [함수 호출]
                main_webview.loadUrl("javascript:shakeResult('"+String.valueOf("")+"')");
                // -----------------------------------------
            }
            catch (Exception e){
                //e.printStackTrace();
            }
        }
        // -----------------------------------------
    }





    // TODO [액티비티 인텐트 수행 결과 받기]
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.i("---","---");
        Log.w("//===========//","================================================");
        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onActivityResult() :: 액티비티 리턴 값 확인 수행]");
        Log.i("","\n"+"[requestCode :: "+String.valueOf(requestCode)+"]");
        Log.i("","\n"+"[resultCode :: "+String.valueOf(resultCode)+"]");
        Log.w("//===========//","================================================");
        Log.i("---","---");
    }





    // TODO [모바일 키 이벤트 발생 체크 부분]
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // [모바일 디바이스의 뒤로가기 키 이벤트가 발생한 경우]
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            try {
                Log.i("---","---");
                Log.d("//===========//","================================================");
                Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onKeyDown() :: 백버튼 터치시 뒤로 가기 이벤트 실시]");
                Log.i("","\n"+"--------------------------------");
                Log.i("","\n"+"[loadUrl :: "+String.valueOf(loadUrl)+"]");
                Log.i("","\n"+"--------------------------------");
                Log.i("","\n"+"[getUrl :: "+String.valueOf(main_webview.getUrl())+"]");
                Log.i("","\n"+"--------------------------------");
                Log.i("","\n"+"[getOriginalUrl :: "+String.valueOf(main_webview.getOriginalUrl())+"]");
                Log.i("","\n"+"--------------------------------");
                Log.i("","\n"+"[canGoBack :: "+String.valueOf(main_webview.canGoBack())+"]");
                Log.d("//===========//","================================================");
                Log.i("---","---");

                // [더이상 웹뷰에서 뒤로갈 페이지가 없을 경우 이거나 메인 로드 주소인 경우]
                if (main_webview.canGoBack() == false
                        || String.valueOf(main_webview.getUrl()).equals(String.valueOf(loadUrl))
                        || String.valueOf(main_webview.getOriginalUrl()).equals(String.valueOf(loadUrl))){

                    Log.i("---","---");
                    Log.e("//===========//","================================================");
                    Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onKeyDown() :: 백버튼 터치시 뒤로 가기 이벤트 실시]");
                    Log.i("","\n"+"[로 직 :: "+String.valueOf("액티비티 종료 수행 실시")+"]");
                    Log.e("//===========//","================================================");
                    Log.i("---","---");

                    // [앱 종료 수행 실시]
                    existsAPP();
                }
                // [뒤로 갈 페이지가 있는 경우]
                else {
                    Log.i("---","---");
                    Log.w("//===========//","================================================");
                    Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onKeyDown() :: 백버튼 터치시 뒤로 가기 이벤트 실시]");
                    Log.i("","\n"+"[로 직 :: "+String.valueOf("웹뷰 뒤로가기 수행 실시")+"]");
                    Log.w("//===========//","================================================");
                    Log.i("---","---");

                    // [웹뷰 뒤로가기]
                    main_webview.goBack();
                }
            }
            catch (Exception e){
                //e.printStackTrace();
            }
        }
        return true;
    }





    // TODO [바깥 레이아웃 클릭 시 키보드 내림]
    @Override
    public boolean dispatchTouchEvent(MotionEvent event){
        int action = event.getAction();
        switch(action){
            case(MotionEvent.ACTION_DOWN):
                try {
                    //TODO [창 내리는 용도]
                }
                catch (Exception e){
                    //e.printStackTrace();
                }
                break;
            case(MotionEvent.ACTION_MOVE):
                break;
            default:
                break;
        }
        return super.dispatchTouchEvent(event);
    }





    // TODO [액티비티 생명 주기 상태 체크 메소드]
    @Override
    public void onResume(){
        super.onResume();
        Log.i("---","---");
        Log.w("//===========//","================================================");
        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onResume() :: 액티비티 실행 준비]");
        Log.w("//===========//","================================================");
        Log.i("---","---");

        // -----------------------------------------
        // [외부 브라우저 복귀 시 화면 전환 애니메이션 없애기 위함]
        try {
            overridePendingTransition(0,0);
        }
        catch (Exception e){
            //e.printStackTrace();
        }
        // -----------------------------------------
    }





    // TODO [액티비티 생명 주기 상태 체크 메소드]
    @Override
    public void onPause(){
        super.onPause();
        Log.i("---","---");
        Log.e("//===========//","================================================");
        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onPause() :: 액티비티 중단 상태]");
        Log.e("//===========//","================================================");
        Log.i("---","---");
    }





    // TODO [액티비티 생명 주기 상태 체크 메소드]
    @Override
    public void onStop(){
        super.onStop();
        Log.i("---","---");
        Log.e("//===========//","================================================");
        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onStop() :: 액티비티 정지 상태]");
        Log.e("//===========//","================================================");
        Log.i("---","---");
    }





    // TODO [액티비티 생명 주기 상태 체크 메소드]
    @Override
    public void onDestroy(){
        super.onDestroy();
        Log.i("---","---");
        Log.e("//===========//","================================================");
        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onDestroy() :: 액티비티 종료 상태]");
        Log.e("//===========//","================================================");
        Log.i("---","---");
    }





    // TODO [액티비티 종료 메소드]
    public void existsAPP(){
        Log.i("---","---");
        Log.e("//===========//","================================================");
        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> existsAPP() :: 액티비티 종료 수행 실시]");
        Log.e("//===========//","================================================");
        Log.i("---","---");

        // [액티비티 종료 수행 실시]
        finish();
        overridePendingTransition(0, 0);
    }





    // TODO [액티비티 종료 팝업창 메소드]
    public void showAlertFinish(String header, String content, String ok, String no){
        Log.i("---","---");
        Log.d("//===========//","================================================");
        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> showAlertFinish() :: 액티비티 종료 팝업창 수행 실시]");
        Log.i("","\n"+"[header :: "+String.valueOf(header)+"]");
        Log.i("","\n"+"[content :: "+String.valueOf(content)+"]");
        Log.d("//===========//","================================================");
        Log.i("---","---");

        // -----------------------------------------
        // [타이틀 및 내용 표시]
        final String Tittle = String.valueOf(header);
        final String Message = String.valueOf(content);
        // -----------------------------------------
        // [버튼 이름 정의]
        String buttonYes = String.valueOf(ok);
        String buttonNo = String.valueOf(no);
        // -----------------------------------------
        try {
            // [AlertDialog 팝업창 생성]
            new AlertDialog.Builder(A_CookieWebview.this)
                    .setTitle(Tittle) //[팝업창 타이틀 지정]
                    //.setIcon(R.drawable.app_icon) //[팝업창 아이콘 지정]
                    .setMessage(Message) //[팝업창 내용 지정]
                    .setCancelable(false) //[외부 레이아웃 클릭시도 팝업창이 사라지지않게 설정]
                    .setPositiveButton(buttonYes, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // TODO Auto-generated method stub
                            // -----------------------------------------
                            // TODO [확인 버튼 클릭 이벤트 처리]
                            existsAPP(); // [액티비티 종료 실시]
                            // -----------------------------------------
                        }
                    })
                    .setNegativeButton(buttonNo, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // TODO Auto-generated method stub
                            // -----------------------------------------
                            // TODO [취소 버튼 클릭 이벤트 처리]
                            // -----------------------------------------
                        }
                    })
                    .show();
        }
        catch (Exception e){
            //Toast.makeText(mContext, Tittle+"\n"+Message,Toast.LENGTH_SHORT).show();
            e.printStackTrace();
        }
    }


} // TODO [클래스 종료]

 

반응형
Comments