투케이2K

14. (TWOK/UTIL) [Android/Java] A_Main - 웹뷰 로드 화면 관련 클래스 정리 본문

투케이2K 유틸파일

14. (TWOK/UTIL) [Android/Java] A_Main - 웹뷰 로드 화면 관련 클래스 정리

투케이2K 2022. 3. 23. 13:08

[설 명]

프로그램 : Android / Java

설 명 : 웹뷰 로드 화면 관련 클래스 정리

 

[A_Main : 소스 코드]

 

package com.example.testapp;

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

import android.app.Activity;
import android.app.AlertDialog;
import android.content.ActivityNotFoundException;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.http.SslError;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.RemoteException;
import android.os.SystemClock;
import android.provider.MediaStore;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
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.WebResourceRequest;
import android.webkit.WebResourceResponse;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;

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

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

public class A_Main extends AppCompatActivity {


    /**
     * TODO [클래스 설명]
     * // -----------------------------------------
     * 1. 사용하는 레이아웃 : a_main_layout
     * 2. 메인 웹뷰 화면 호출 액티비티 화면
     * // -----------------------------------------
     * */





    // TODO [빠른 로직 찾기 : 주석 로직 찾기]
    /**
     * // -----------------------------------------
     * // [SEARCH FAST] : [프로세스 종료 이벤트 감지]
     * // [SEARCH FAST] : [메인 웹뷰 포그라운드 푸시 알림 JS 전달]
     * // [SEARCH FAST] : [퍼미션 권한 부여 확인 실시]
     * // [SEARCH FAST] : [저장된 프리퍼런스 데이터 확인]
     * // [SEARCH FAST] : [네트워크 활성 상태 체크 실시]
     * // [SEARCH FAST] : [웹뷰 로드 수행 실시]
     * // [SEARCH FAST] : [인트로 화면 처리]
     * // [SEARCH FAST] : [자바스크립트 통신]
     * // [SEARCH FAST] : [프리퍼런스 데이터 초기화]
     * // [SEARCH FAST] : [파이어베이스 토큰 값 저장]
     * // [SEARCH FAST] : [앱 라이프 사이클 시간 저장]
     * // -----------------------------------------
     */





    // TODO [웹뷰 전역 변수 선언 부분]
    static WebView main_webview; // [웹뷰 컴포넌트]
    Handler js_handler = new Handler(); // [자바스크립트 통신 사용 핸들러]
    ValueCallback mFilePathCallback; // [파일 업로드 수행]





    // TODO [일반 전역 변수 선언 부분]
    ImageView introBgImageView; // [웹뷰 로딩 동안 표시할 이미지]
    private static final String ACTIVITY_NAME = "A_Main";
    private long backTime = 0; // [뒤로가기 버튼 클릭 시간 저장]





    // 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_main_layout);
        Log.i("---","---");
        Log.d("//===========//","================================================");
        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: 액티비티 수행 실시]");
        Log.d("//===========//","================================================");
        Log.i("---","---");

        // -----------------------------------------
        // TODO [SEARCH FAST] : [파이어베이스 토큰 값 저장]
        /*
        try {
            // [파이어베이스 토큰 확인]
            FirebaseInstanceId.getInstance().getInstanceId()
                    .addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() {
                        @Override
                        public void onSuccess(InstanceIdResult instanceIdResult) {
                            String deviceToken = String.valueOf(instanceIdResult.getToken());
                            if (deviceToken != null && deviceToken.length()>0
                                    && !deviceToken.trim().equals("") && !deviceToken.trim().contains("null")){
                                Log.i("---","---");
                                Log.w("//===========//","================================================");
                                Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: FirebaseInstanceId :: 파이어베이스 토큰 확인 실시]");
                                Log.i("","\n"+"[타 입 :: onSuccess]");
                                Log.i("","\n"+"[토 큰 :: "+String.valueOf(deviceToken)+"]");
                                Log.i("","\n"+"[결 과 :: 푸시 토큰 값 확인 성공]");
                                Log.w("//===========//","================================================");
                                Log.i("---","---");

                                // [프리퍼런스에 토큰값 저장 수행 실시]
                                S_Preference.setString(getApplication(), S_FinalData.PRE_PUSH_TOKEN, String.valueOf(deviceToken));
                                S_Preference.setString(getApplication(), S_FinalData.PRE_PUSH_TOKEN, String.valueOf(deviceToken));
                            }
                            else {
                                Log.i("---","---");
                                Log.e("//===========//","================================================");
                                Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: FirebaseInstanceId :: 파이어베이스 토큰 확인 실시]");
                                Log.i("","\n"+"[타 입 :: onSuccess]");
                                Log.i("","\n"+"[토 큰 :: "+String.valueOf(deviceToken)+"]");
                                Log.i("","\n"+"[결 과 :: 푸시 토큰 값 확인 에러]");
                                Log.e("//===========//","================================================");
                                Log.i("---","---");
                            }
                        }
                    })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Log.i("---","---");
                            Log.e("//===========//","================================================");
                            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: FirebaseInstanceId :: 파이어베이스 토큰 확인 실시]");
                            Log.i("","\n"+"[타 입 :: onFailure]");
                            Log.i("","\n"+"[토 큰 :: "+String.valueOf(e.getMessage())+"]");
                            Log.i("","\n"+"[결 과 :: 푸시 토큰 값 확인 에러]");
                            Log.e("//===========//","================================================");
                            Log.i("---","---");
                        }
                    })
                    .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
                        @Override
                        public void onComplete(@NonNull Task<InstanceIdResult> task) {
                            Log.i("---","---");
                            Log.d("//===========//","================================================");
                            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: FirebaseInstanceId :: 파이어베이스 토큰 확인 실시]");
                            Log.i("","\n"+"[타 입 :: onComplete]");
                            Log.i("","\n"+"[성공 여부 :: "+String.valueOf(task.isSuccessful())+"]");
                            Log.d("//===========//","================================================");
                            Log.i("---","---");
                        }
                    });
        }
        catch (Exception e){
            e.printStackTrace();
        }
        // */
        // -----------------------------------------


        // -----------------------------------------
        // TODO [SEARCH FAST] : [프로세스 종료 이벤트 감지]

        try {
            // [사용자가 최근 앱 작업 목록에서 지우기 및 날림 감지]
            startService(new Intent(getApplication(), S_ProgramTaskService.class));
        }
        catch (Exception e){
            //e.printStackTrace();
        }
        // -----------------------------------------


        // -----------------------------------------
        // TODO [SEARCH FAST] : [메인 웹뷰 포그라운드 푸시 알림 JS 전달]

        S_Preference.setString(getApplication(), S_FinalData.PRE_ROOT_ACTIVITY, "RUN");
        // -----------------------------------------


        // -----------------------------------------
        // TODO [이미지 뷰 : 로딩 화면 : 컴포넌트 객체 선언 실시]

        introBgImageView = (ImageView) findViewById(R.id.introBgImageView);
        // -----------------------------------------


        // -----------------------------------------
        // TODO [SEARCH FAST] : [저장된 프리퍼런스 데이터 확인]
        String deviceMoco = String.valueOf(S_DeviceID.getDeviceID(A_Main.this));
        S_Preference.setString(getApplication(), S_FinalData.PRE_MOBILE_MOCO, deviceMoco); // [디바이스 고유값 저장]
        S_Preference.setString(getApplication(), S_FinalData.PRE_MOBILE_MOCO, deviceMoco); // [디바이스 고유값 저장]
        Log.i("---","---");
        Log.w("//===========//","================================================");
        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onCreate() :: 사전 저장된 프리퍼런스 데이터 확인]");
        Log.i("","\n"+"--------------------------------");
        Log.i("","\n"+"[univ :: [학교 구분] :: "+String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_USER_UNIV))+"]");
        Log.i("","\n"+"--------------------------------");
        Log.i("","\n"+"[uid :: [사용자 학번] :: "+String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_USER_UID))+"]");
        Log.i("","\n"+"--------------------------------");
        Log.i("","\n"+"[upw :: [사용자 비번] :: "+String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_USER_UPW))+"]");
        Log.i("","\n"+"--------------------------------");
        Log.i("","\n"+"[iddi :: [사용자 신분] :: "+String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_USER_IDDI))+"]");
        Log.i("","\n"+"--------------------------------");
        Log.i("","\n"+"[autoLogin :: [자동 로그인] :: "+String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_AUTO_LOGIN))+"]");
        Log.i("","\n"+"--------------------------------");
        Log.i("","\n"+"[picture :: [사용자 사진 표시] :: "+String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_USER_PICTURE))+"]");
        Log.i("","\n"+"--------------------------------");
        Log.i("","\n"+"[shake :: [흔들기 이벤트] :: "+String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_MOBILE_SHAKE))+"]");
        Log.i("","\n"+"--------------------------------");
        Log.i("","\n"+"[plat :: [플랫폼] :: "+String.valueOf(S_FinalData.PRE_MOBILE_PLAT)+"]");
        Log.i("","\n"+"--------------------------------");
        Log.i("","\n"+"[moco :: [디바이스 고유값] :: "+String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_MOBILE_MOCO))+"]");
        Log.i("","\n"+"--------------------------------");
        Log.i("","\n"+"[version :: [앱 버전] :: "+String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_MOBILE_VERSION))+"]");
        Log.i("","\n"+"--------------------------------");
        Log.i("","\n"+"[code :: [앱 코드] :: "+String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_MOBILE_CODE))+"]");
        Log.i("","\n"+"--------------------------------");
        Log.i("","\n"+"[token [푸시 토큰] :: "+String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_PUSH_TOKEN))+"]");
        Log.i("","\n"+"--------------------------------");
        Log.i("","\n"+"[loginScheme :: [로그인 스키마 데이터] :: "+String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_SCHEME_DATA_LOGIN))+"]");
        Log.i("","\n"+"--------------------------------");
        Log.i("","\n"+"[callScheme :: [일반 스키마 데이터] :: "+String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_SCHEME_DATA_CALL))+"]");
        Log.i("","\n"+"--------------------------------");
        Log.i("","\n"+"[PRE_APP_UPDT_TIME :: [앱 재구동 시간 [분 단위]] :: "+String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_APP_UPDT_TIME))+"]");
        Log.w("//===========//","================================================");
        Log.i("---","---");


        /*
        // TODO [스키마 데이터 확인]
        C_Ui_View.showAlert(
                A_Main.this,
                0,
                "[스키마 및 숏컷 접속 확인]",
                "로그인 스키마 데이터 : " + S_Preference.getString(getApplication(), S_FinalData.PRE_SCHEME_DATA_LOGIN) + "\n"
                        + "일반 스키마 데이터 : " + S_Preference.getString(getApplication(), S_FinalData.PRE_SCHEME_DATA_CALL) + "\n",
                "확인",
                "",
                ""
                );
        // */
        // -----------------------------------------


        // -----------------------------------------
        // TODO [SEARCH FAST] : [네트워크 활성 상태 체크 실시]

        if (C_StateCheck.getWhatOfNetwork(A_Main.this)){ // [네트워크가 연결된 경우]

            // [SEARCH FAST] : [웹뷰 로드 수행 실시]
            init_WebView(S_FinalData.WV_LOAD_MAIN_ENZ_URL);
        }
        else { // [네트워크가 연결 되지 않은 경우]

            // [팝업창 호출 실시 및 와이파이 설정창 이동]
            C_Ui_View.showAlert(
                    A_Main.this,
                    1, // [와이파이 설정창 이동 코드]
                    S_FinalData.AL_TITLE,
                    S_FinalData.AL_NET + " [" +String.valueOf(ACTIVITY_NAME)+ "]",
                    S_FinalData.AL_SET,
                    S_FinalData.AL_NO,
                    "");
        }
        // -----------------------------------------

        // -----------------------------------------
        // TODO [퍼미션 권한 부여 확인 실시]

        C_Permission.checkPermission(A_Main.this);
        // -----------------------------------------


    } // TODO [메인 종료]





    // TODO [SEARCH FAST] : [웹뷰 로드 수행 실시]
    public void init_WebView(String url) {
        Log.i("---","---");
        Log.w("//===========//","================================================");
        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> init_WebView() :: 웹뷰 초기 값 설정 및 웹뷰 로드 수행 실시]");
        Log.i("","\n"+"[url :: "+String.valueOf(url)+"]");
        Log.w("//===========//","================================================");
        Log.i("---","---");

        try {
            // -----------------------------------------
            // TODO [WebView 컴포넌트 매핑 설정]
            main_webview = (WebView)findViewById(R.id.main_webview);
            // -----------------------------------------


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


            // -----------------------------------------
            // TODO [웹뷰의 캐시를 초기화 실시 : 일반 적용 방법]
            try {
                main_webview.clearCache(true);
                main_webview.clearHistory();
                main_webview.clearView();
            }
            catch (Exception e){
                //e.printStackTrace();
            }
            // -----------------------------------------


            // -----------------------------------------
            ///*
            // TODO [웹뷰의 캐시를 초기화 실시 : 쿠키 매니저를 통한 캐시 제거]
            try {
                cookieManager.removeSessionCookies(new ValueCallback<Boolean>() {
                    @Override
                    public void onReceiveValue(Boolean aBoolean) {
                        Log.i("---","---");
                        Log.d("//===========//","================================================");
                        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> init_WebView() :: 사전 쿠키 및 세션 데이터 삭제]");
                        Log.i("","\n"+"[session :: "+String.valueOf(aBoolean)+"]");
                        Log.d("//===========//","================================================");
                        Log.i("---","---");
                    }
                });
                cookieManager.removeAllCookies(new ValueCallback() {
                    @Override
                    public void onReceiveValue(Object value) {
                        Log.i("---","---");
                        Log.d("//===========//","================================================");
                        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> init_WebView() :: 사전 쿠키 및 세션 데이터 삭제]");
                        Log.i("","\n"+"[cookies :: "+String.valueOf(value)+"]");
                        Log.d("//===========//","================================================");
                        Log.i("---","---");
                    }
                });
                cookieManager.getInstance().flush();
            }
            catch (Exception e){
                //e.printStackTrace();
            }
            // */
            // -----------------------------------------


            // -----------------------------------------
            ///*
            // TODO [웹뷰의 캐시를 초기화 실시 : deleteDatebase 를 이용한 직접 제거]
            try {
                A_Main.this.deleteDatabase("webview.db");
                A_Main.this.deleteDatabase("webviewCache.db");

                Log.i("---","---");
                Log.d("//===========//","================================================");
                Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> init_WebView() :: 사전 쿠키 및 세션 데이터 삭제]");
                Log.i("","\n"+"[로 직 :: 웹뷰 deleteDatabase 수행]");
                Log.d("//===========//","================================================");
                Log.i("---","---");
            }
            catch (Exception e){
                //e.printStackTrace();
            }
            // */
            // -----------------------------------------

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


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


            // -----------------------------------------
            // 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 [웹뷰 크롬 브라우저에서 디버깅 모드 설정 허용]
            // main_webview.setWebContentsDebuggingEnabled(true);
            // -----------------------------------------


            // -----------------------------------------
            // 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"+"[주 소 :: "+String.valueOf(main_webview.getUrl())+"]");
                    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.i("","\n"+"--------------------------------");
                    Log.i("","\n"+"[sourceId :: "+String.valueOf(consoleMessage.sourceId())+"]");
                    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"+"[주 소 :: "+String.valueOf(main_webview.getUrl())+"]");
                    Log.i("","\n"+"[호출 상황 :: "+String.valueOf(progress)+"]");
                    Log.d("//===========//","================================================");
                    Log.i("---","---");

                    // [웹뷰 로드 완료 상태 : 웹뷰의 호출 상황이 100 인 경우]
                    if(progress >= 100){
                        Log.i("---","---");
                        Log.w("//===========//","================================================");
                        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onProgressChanged() :: 실시간 웹뷰 호출 상황 확인 실시]");
                        Log.i("","\n"+"[주 소 :: "+String.valueOf(main_webview.getUrl())+"]");
                        Log.i("","\n"+"[호출 상황 :: "+String.valueOf(progress)+"]");
                        Log.i("","\n"+"[상 태 :: "+"웹뷰 로드 완료 상태"+"]");
                        Log.w("//===========//","================================================");
                        Log.i("---","---");
                        // ----------------------------------
                        try {
                            // [SEARCH FAST] : [인트로 화면 처리]
                            introBgImageView.setVisibility(View.GONE);
                            main_webview.setVisibility(View.VISIBLE);
                        }
                        catch (Exception e){
                            e.printStackTrace();
                        }
                        // ----------------------------------
                        try {
                            if (cookieManager.hasCookies() == true){
                                Log.i("---","---");
                                Log.w("//===========//","================================================");
                                Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onProgressChanged() :: 실시간 웹뷰 호출 상황 확인 실시]");
                                Log.i("","\n"+"--------------------------------");
                                Log.i("","\n"+"[주 소 :: "+String.valueOf(main_webview.getUrl())+"]");
                                Log.i("","\n"+"--------------------------------");
                                Log.i("","\n"+"[상 태 :: "+"웹뷰 로드 완료 상태"+"]");
                                Log.i("","\n"+"--------------------------------");
                                Log.i("","\n"+"[저장된 쿠키 확인 :: "+"쿠키 있음"+"]");
                                Log.i("","\n"+"--------------------------------");
                                Log.i("","\n"+"[쿠 키 :: "+String.valueOf(cookieManager.getCookie(main_webview.getUrl()))+"]");
                                Log.w("//===========//","================================================");
                                Log.i("---","---");
                            }
                            else {
                                Log.i("---","---");
                                Log.e("//===========//","================================================");
                                Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onProgressChanged() :: 실시간 웹뷰 호출 상황 확인 실시]");
                                Log.i("","\n"+"--------------------------------");
                                Log.i("","\n"+"[주 소 :: "+String.valueOf(main_webview.getUrl())+"]");
                                Log.i("","\n"+"--------------------------------");
                                Log.i("","\n"+"[상 태 :: "+"웹뷰 로드 완료 상태"+"]");
                                Log.i("","\n"+"--------------------------------");
                                Log.i("","\n"+"[저장된 쿠키 확인 :: "+"쿠키 없음"+"]");
                                Log.e("//===========//","================================================");
                                Log.i("---","---");
                            }
                        }
                        catch (Exception e){
                            //e.printStackTrace();
                        }
                        // ----------------------------------
                    }
                }
            });
            // -----------------------------------------


            // -----------------------------------------
            // TODO [SEARCH FAST] : [자바스크립트 통신]
            Javascript_To_Android_Bridge();
            // -----------------------------------------


            // -----------------------------------------
            // TODO [웹뷰 리소스 초기화 관련]
            try {
                main_webview.getSettings().setAppCacheEnabled(false); // [앱 내부 캐시 사용 여부 설정]
                main_webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); // [웹뷰 캐시 모드 설정 [캐시 모드 사용 않고 네트워크 사용해 로드]]
                //WebStorage.getInstance().deleteAllData(); // [웹 스토리지 데이터 지우기]
            }
            catch (Exception e){
                //e.printStackTrace();
            }
            // -----------------------------------------


            // -----------------------------------------
            // TODO [웹뷰 인코딩 설정]
            try {
                main_webview.getSettings().setDefaultTextEncodingName("UTF-8");
            }
            catch (Exception e){
                //e.printStackTrace();
            }
            // -----------------------------------------


            // -----------------------------------------
            // TODO [웹뷰 로드 수행 실시 부분 : 내부 웹뷰 이동]
            main_webview.loadUrl(url);
            // -----------------------------------------


            // -----------------------------------------
            // TODO [테스트 html 파일 로드 : 로컬 assets 파일에 저장된 html 파일]
            /*
            String htmlJsUrl = "file:///android_asset/javaScriptTest.html";
            main_webview.loadUrl(htmlJsUrl);
            // */
            // -----------------------------------------
        }
        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 onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
            Log.i("---","---");
            Log.e("//===========//","================================================");
            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onReceivedHttpError() :: [웹 클라이언트]]");
            Log.i("","\n"+"[설 명 :: "+String.valueOf("웹뷰 로드 수행 에러 발생")+"]");
            Log.i("","\n"+"[errorUrl :: "+String.valueOf(request.getUrl())+"]");
            Log.i("","\n"+"[errorCode :: "+String.valueOf(errorResponse.getStatusCode())+"]");
            Log.i("","\n"+"[errorResponseHeader :: "+String.valueOf(errorResponse.getResponseHeaders())+"]");
            Log.i("","\n"+"[errorResponseData :: "+String.valueOf(errorResponse.getData())+"]");
            Log.e("//===========//","================================================");
            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_Main.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_Main.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_Main.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_Main.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_Main.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_Main.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_Main.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 system() {
            js_handler.post(new Runnable() {
                public void run() {
                    try {
                        Log.i("---","---");
                        Log.w("//===========//","================================================");
                        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> AndroidBridge :: system() :: JS >> Android]");
                        Log.i("","\n"+"--------------------------------");
                        Log.i("","\n"+"[전달받은 데이터 :: "+String.valueOf("")+"]");
                        Log.i("","\n"+"--------------------------------");
                        Log.i("","\n"+"[설 명 :: "+String.valueOf("사용자 전체 계정 정보 요청")+"]");
                        Log.i("","\n"+"--------------------------------");
                        Log.i("","\n"+"[로 직 :: "+"setSystem() 메소드 호출 수행 실시"+"]");
                        Log.w("//===========//","================================================");
                        Log.i("---","---");

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

                        // [로그인 스키마 데이터 json 변환 실시]
                        JSONObject loginJson = null;
                        String loginData = S_Preference.getString(getApplication(), S_FinalData.PRE_SCHEME_DATA_LOGIN);
                        boolean loginFlag = false;

                        if (C_Util.stringNotNull(loginData) == true){ // [널 값이 아닌 경우]
                            try {
                                // [json 객체에 데이터 삽입 실시]
                                loginJson = new JSONObject(String.valueOf(loginData));

                                // [플래그 값 변경]
                                loginFlag = true;
                            }
                            catch (Exception e){
                                // [플래그 값 변경]
                                loginFlag = false;
                            }
                        }
                        Log.i("---","---");
                        Log.w("//===========//","================================================");
                        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> AndroidBridge :: system() :: JS >> Android]");
                        Log.i("","\n"+"--------------------------------");
                        Log.i("","\n"+"[설 명 :: "+String.valueOf("[사전] 로그인 스키마 데이터 값 체크 실시")+"]");
                        Log.i("","\n"+"--------------------------------");
                        Log.i("","\n"+"[스키마 데이터 :: "+String.valueOf(loginData)+"]");
                        Log.w("//===========//","================================================");
                        Log.i("---","---");

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

                        // [일반 스키마 데이터 json 변환 실시]
                        JSONObject callJson = null;
                        String callData = S_Preference.getString(getApplication(), S_FinalData.PRE_SCHEME_DATA_CALL);
                        boolean callFlag = false;

                        if (C_Util.stringNotNull(callData) == true){ // [널 값이 아닌 경우]
                            try {
                                // [json 객체에 데이터 삽입 실시]
                                callJson = new JSONObject(String.valueOf(callData));

                                // [플래그 값 변경]
                                callFlag = true;
                            }
                            catch (Exception e){
                                // [플래그 값 변경]
                                callFlag = false;
                            }
                        }
                        Log.i("---","---");
                        Log.w("//===========//","================================================");
                        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> AndroidBridge :: system() :: JS >> Android]");
                        Log.i("","\n"+"--------------------------------");
                        Log.i("","\n"+"[설 명 :: "+String.valueOf("[사전] 일반 스키마 데이터 값 체크 실시")+"]");
                        Log.i("","\n"+"--------------------------------");
                        Log.i("","\n"+"[스키마 데이터 :: "+String.valueOf(callData)+"]");
                        Log.w("//===========//","================================================");
                        Log.i("---","---");

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

                        // [전체 자바스크립트로 전송할 데이터 생성 실시]
                        JSONObject setSystemJson = new JSONObject();

                        // [디바이스 고유 값]
                        setSystemJson.put("moco", S_DeviceID.getDeviceID(A_Main.this));

                        // [앱 버전 (ex : 1.0.0)]
                        setSystemJson.put("version", S_Preference.getString(getApplication(), S_FinalData.PRE_MOBILE_VERSION));

                        // [앱 버전 코드 (ex : 1)]
                        setSystemJson.put("code", S_Preference.getString(getApplication(), S_FinalData.PRE_MOBILE_CODE));

                        // [모바일 플랫폼]
                        setSystemJson.put("plat", S_FinalData.PRE_MOBILE_PLAT);

                        // [파이어베이스 푸시 토큰]
                        setSystemJson.put("token", S_Preference.getString(getApplication(), S_FinalData.PRE_PUSH_TOKEN));

                        // [로그인 스키마 데이터]
                        if (loginFlag == true){
                            setSystemJson.put("loginScheme", loginJson);
                        }
                        else {
                            setSystemJson.put("loginScheme", "");
                        }

                        // [일반 스키마 데이터]
                        if (callFlag == true){
                            setSystemJson.put("callScheme", callJson);
                        }
                        else {
                            setSystemJson.put("callScheme", "");
                        }

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

                        // [Android >> JS 호출 수행 실시]
                        new Android_To_Javascript().setSystem(String.valueOf(setSystemJson.toString()));

                        // -----------------------------------------
                    }
                    catch (Exception e){
                        e.printStackTrace();
                    }
                }
            });
        }
        // -----------------------------------------
        // [자바스크립트에서 호출하는 안드로이드 메소드]
        @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_Main.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_Main.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_Main.this,
                                            0,
                                            S_FinalData.AL_TITLE,
                                            S_FinalData.ERROR_PARSING_DATA + " [setMarket]",
                                            S_FinalData.AL_OK, "", "");

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

                                // TODO [앱 스토어 이동 실시]
                                C_MoveApp.goMarketRun(A_Main.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_Main.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 setSystem(String value){
            try {
                Log.i("---","---");
                Log.w("//===========//","================================================");
                Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> setSystem() :: Android >> JS]");
                Log.i("","\n"+"--------------------------------");
                Log.i("","\n"+"[JS 함수 :: "+String.valueOf("setSystem")+"]");
                Log.i("","\n"+"--------------------------------");
                Log.i("","\n"+"[전달할 데이터 :: "+String.valueOf(value)+"]");
                Log.i("","\n"+"--------------------------------");
                Log.i("","\n"+"[설 명 :: "+String.valueOf("사용자 전체 계정 정보 전송")+"]");
                Log.w("//===========//","================================================");
                Log.i("---","---");

                // -----------------------------------------
                // TODO [json 형식 데이터 전송 실시 : 주의 세부 json 은 object 로 담아야함]
                main_webview.loadUrl("javascript:setSystem('"+String.valueOf(value)+"')");
                // -----------------------------------------
            }
            catch (Exception e){
                //e.printStackTrace();
            }
        }
        // -----------------------------------------
        // [안드로이드에서 자바스크립트 호출]
        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
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // [모바일 디바이스의 뒤로가기 키 이벤트가 발생한 경우]
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            try {
                Log.i("---","---");
                Log.w("//===========//","================================================");
                Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onKeyDown() :: 백버튼 터치시 뒤로 가기 이벤트 실시]");
                Log.i("","\n"+"--------------------------------");
                Log.i("","\n"+"[MAIN_URL :: "+String.valueOf(S_FinalData.WV_LOAD_MAIN_ENZ_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"+"[canGoBack() :: "+String.valueOf(main_webview.canGoBack())+"]");
                Log.w("//===========//","================================================");
                Log.i("---","---");

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

                        || String.valueOf(main_webview.getUrl()).contains(S_FinalData.WV_BACK_URL_LOGIN)
                        || String.valueOf(main_webview.getUrl()).contains(S_FinalData.WV_BACK_URL_SCHOOL)
                        || String.valueOf(main_webview.getUrl()).contains(S_FinalData.WV_BACK_URL_MAIN)){

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

                    //TODO [2초 내에 다시 버튼을 중복 클릭한 경우]
                    if (SystemClock.elapsedRealtime() - backTime < 2000){

                        // [앱 종료 수행 실시]
                        finishApp();
                        return true;
                    }
                    backTime = SystemClock.elapsedRealtime();

                    //TODO [처음 버튼 클릭 이벤트가 발생한 경우]
                    Toast.makeText(getApplication(),"한번 더 뒤로가기를 클릭하시면 앱을 종료합니다",Toast.LENGTH_SHORT).show();
                }
                // [뒤로 갈 페이지가 있는 경우]
                else {
                    Log.i("---","---");
                    Log.w("//===========//","================================================");
                    Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onKeyDown() :: 백버튼 터치시 뒤로 가기 이벤트 실시]");
                    Log.i("","\n"+"[로 직 :: "+"웹뷰 뒤로가기 수행 실시"+"]");
                    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.d("//===========//","================================================");
        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onResume() :: 액티비티 실행 준비]");
        Log.d("//===========//","================================================");
        Log.i("---","---");

        // -----------------------------------------
        // [액티비티 정지 상태 일 경우 로직 처리 실시]
        // -----------------------------------------


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


        // -----------------------------------------
        // [SEARCH FAST] : [앱 라이프 사이클 시간 저장]
        String foreTime = "";
        try {
            foreTime = String.valueOf(C_Util.getNowDateTime24Number());
            S_Preference.setString(getApplication(), S_FinalData.PRE_WV_RESUME_TIME, foreTime);
            S_Preference.setString(getApplication(), S_FinalData.PRE_WV_RESUME_TIME, foreTime);

            Log.i("---","---");
            Log.w("//===========//","================================================");
            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onResume() :: 앱 포그라운드 라이프 사이클 시간 저장]");
            Log.i("","\n"+"[foreTime :: "+String.valueOf(foreTime)+"]");
            Log.w("//===========//","================================================");
            Log.i("---","---");
        }
        catch (Exception e){
            e.printStackTrace();
        }
        // -----------------------------------------


        // -----------------------------------------
        try {
            // [앱 포그라운드 및 백그라운드 상태 체크 앱 리로드 수행]
            String appCycleSave = String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_APP_UPDT_TIME));
            String pauseTime = String.valueOf(S_Preference.getString(getApplication(), S_FinalData.PRE_WV_PAUSE_TIME));

            int appCycleTime = C_Util.getDateMinus(foreTime, pauseTime);

            Log.i("---","---");
            Log.w("//===========//","================================================");
            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onResume() :: 앱 포그라운드 라이프 사이클 시간 차이 확인]");
            Log.i("","\n"+"[저장된 앱 라이프 사이클 갱신 시간 [분 단위] :: "+String.valueOf(appCycleSave)+"]");
            Log.i("","\n"+"[앱 포그라운드 및 백그라운드 시간 차이 :: "+String.valueOf(appCycleTime)+"]");
            Log.w("//===========//","================================================");
            Log.i("---","---");

            if (C_Util.stringNotNull(appCycleSave) == true && appCycleTime >= Integer.parseInt(appCycleSave)){

                ///*
                // -----------------------------------------
                // [프리퍼런스 데이터 초기화]
                S_Preference.webViewReloadClear(getApplication());
                // -----------------------------------------
                // [화면 전환 수행]
                Intent goPage = new Intent(A_Main.this, A_Intro.class);
                goPage.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
                startActivity(goPage);
                // -----------------------------------------
                // [기존 화면 종료]
                finish();
                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("---","---");

        // -----------------------------------------
        // [액티비티 정지 상태 일 경우 로직 처리 실시]
        // -----------------------------------------


        // -----------------------------------------
        // [SEARCH FAST] : [앱 라이프 사이클 시간 저장]
        try {
            String pauseTime = String.valueOf(C_Util.getNowDateTime24Number());
            S_Preference.setString(getApplication(), S_FinalData.PRE_WV_PAUSE_TIME, pauseTime);
            S_Preference.setString(getApplication(), S_FinalData.PRE_WV_PAUSE_TIME, pauseTime);

            Log.i("---","---");
            Log.e("//===========//","================================================");
            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onPause() :: 앱 백그라운드 라이프 사이클 시간 저장]");
            Log.i("","\n"+"[pauseTime :: "+String.valueOf(pauseTime)+"]");
            Log.e("//===========//","================================================");
            Log.i("---","---");
        }
        catch (Exception e){
            e.printStackTrace();
        }
        // -----------------------------------------
    }





    // 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("---","---");

        // -----------------------------------------
        // [액티비티 종료 상태 일 경우 로직 처리 실시]
        // -----------------------------------------


        // -----------------------------------------
        // [SEARCH FAST] : [프리퍼런스 데이터 초기화]
        S_Preference.mainFinishClear(A_Main.this);
        // -----------------------------------------


        // -----------------------------------------
        super.onDestroy();
        // -----------------------------------------
    }





    // TODO [액티비티 종료 코드]
    public void finishApp(){
        Log.i("---","---");
        Log.e("//===========//","================================================");
        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> finishApp() :: 액티비티 종료 수행 실시]");
        Log.i("","\n"+"[로 직 :: "+"finish() 호출"+"]");
        Log.e("//===========//","================================================");
        Log.i("---","---");

        try {
            // [앱 종료 수행 실시]
            finish(); // [현재 액티비티 정리]
            finishAffinity(); // [모든 액티비티 정리]
            overridePendingTransition(0, 0);
        }
        catch (Exception e){
            //e.printStackTrace();
        }
    }


} // TODO [클래스 종료]

[a_main_layout.xml : 소스 코드]

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <!--
    [레이아웃 설명]
    1. 사용하는 클래스 : A_Main
    2. 메인 화면으로 웹뷰를 호출하는 레이아웃
     -->


    <!-- 컴포넌트 : 이미지 뷰 (웹뷰 로딩) -->
    <ImageView
        android:id="@+id/introBgImageView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"

        android:src="@drawable/newintrobg"

        android:scaleType="fitXY"
        android:visibility="visible"
        android:layout_gravity="center"
        android:gravity="center"/>


    <!-- 컴포넌트 : 웹뷰 -->
    <WebView
        android:id="@+id/main_webview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#343d46"
        android:visibility="gone"/>

</LinearLayout>

 

반응형
Comments