MainWebViewActivity

주요 화면들을 보여주는 WebView, CommonWebViewController를 상속받음

Handler

로딩시 보여지는 progress 바를 컨트롤 하기 위한 handler 객체

private val progressHandler : Handler by lazy {
    object: Handler(Looper.getMainLooper()){
        override fun handleMessage(msg: Message?) {
            super.handleMessage(msg)

            if(msg?.what == LOADING_BAR_SHOW){
                layout_loading_bar?.visibility = View.VISIBLE
            }else if(msg?.what == LOADING_BAR_HIDE){
                layout_loading_bar?.visibility = View.GONE
            }

        }
    }
}

CommonWebViewInterface

History 관리

override var historyList: MutableList<WebHistory> = mutableListOf()//arrayList

FaceBook Login

override var facebookLogin: FaceBookLogin? = null

KaKao Login

override var kakaoLogin: KaKaoLogin? = null

Reload 관리

override var isEnabledReload: Boolean = false

LodingBar 보이기/ 숨기기

override fun showLoadingBar() {
    val msg = progressHandler.obtainMessage(LOADING_BAR_SHOW)
    progressHandler.sendMessage(msg)
}

override fun hideLoadingBar() {
    val msg = progressHandler.obtainMessage(LOADING_BAR_HIDE)
    progressHandler.sendMessage(msg)
}

뒤로가기

override fun backAction(){
    hideLoadingBar()
        if(layout_dummy_webview?.visibility == View.VISIBLE){
            targetWebView?.clearCache(true)
            targetWebView?.clearHistory()
            layout_dummy_webview?.visibility = View.GONE

            return
}

GNB메뉴 색상변경

fun setBottomMenuTextColor(menu: TextView){
    btn_menu1?.setTypeface(null, Typeface.NORMAL)
    btn_menu2?.setTypeface(null, Typeface.NORMAL)
    btn_menu3?.setTypeface(null, Typeface.NORMAL)
    btn_menu4?.setTypeface(null, Typeface.NORMAL)
    btn_menu5?.setTypeface(null, Typeface.NORMAL)

    menu.setTypeface(null, Typeface.BOLD)
}

새창열기 동작 / url 리다이레팅 판단

fun loadUrlWebviewOrNewActivity(url:String, btnView:TextView){
    if(rootView){//rootview 일경우는 (1depth) 새로 화면을 오픈한다.
        movePageWithUrl("N-RTB",
            url,
            "WHITE")
    }else{ //rootview가 아닐때 (2depth)의 경우 자체 화면에서 로드
        webview_view?.loadUrl(url)
        setBottomMenuTextColor(btnView)
    }
}

새창으로 열린 웹뷰를 보이거나 숨김

fun showHideWidnowWebView(showhide:Boolean){
    if(showhide){
        layout_dummy_webview.visibility = View.VISIBLE
    }else{
        layout_dummy_webview.visibility = View.GONE
    }
}

새창으로 열리는 동작

fun createNewWindowWebView(){
    targetWebView = NewWindowWebView(this)
    layout_dummy_webview?.addView(targetWebView)
}//createNewWindowWebView end

sildeDownMainMenu

  • 화면스크롤에 따라 GNB를 보이고 숨긴다.

private fun slideDownMainMenu(type: Int){
    val inTrans = TranslateAnimation(0F,0F, layout_bottom_menu.height.toFloat(), 0F)
    val outTrans = TranslateAnimation(0F,0F, 0F, layout_bottom_menu.height.toFloat())
    inTrans.duration = 300
    outTrans.duration = 300

    if(type == WEBVIEW_BOTTOM_MENU_HIDE){
        layout_bottom_menu.visibility = View.GONE
        layout_bottom_menu.startAnimation(outTrans)
    }else{ //SHOW
        layout_bottom_menu.visibility = View.VISIBLE
        layout_bottom_menu.startAnimation(inTrans)

    }
}

movePageWithUrl

  • 해당 url 페이지로 이동한다.

 fun movePageWithUrl(type:String, url:String, color:String){
        val intent = Intent(this, MainWebViewActivity::class.java)
        intent.putExtra("url", url)
        intent.putExtra("param", "")
        intent.putExtra("viewType", type)
        intent.putExtra("viewColor", color)
        startActivity(intent)
    }

onActivityResult

  • RequestCode로 요청한 Acitivity 의 결과값을 받아 처리한다.

  • REQUEST_NEW_WEBVIEW_CALLBACK_OPEN : 화면을 이동하지 않고 로직처리 후 스크립트 호출

  • FILE_CHOOSER_REQUEST_CODE : 카메라, 갤러리에서 사진 호출

  • SNS 로그인 관련

override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) {
    super.onActivityResult(requestCode, resultCode, intent)

    when(requestCode){
        REQUEST_NEW_WEBVIEW_CALLBACK_OPEN ->{

            //new open webview 관련
            if(resultCode == Activity.RESULT_OK){
                val bund :Bundle? = intent?.extras
                bund?.let{
                    val func:String = bund["function"]!!.toString()
                    val param:String = bund["param"]!!.toString()
                    val jsonParam:JsonObject = Gson().fromJson(param, JsonObject::class.java)

                    val resultCallJs = "javascript:$func( ${jsonParam.toString()} )"
                    webview_debug_view?.loadUrl(resultCallJs)

                    Log.i(TAG, "resultCallJs: $resultCallJs")

                }
            }
        }
        FILE_CHOOSER_REQUEST_CODE ->{
            //camera, image pick 관련
            if (Build.VERSION.SDK_INT >= 21) {
                var results: Array<Uri?>? = null
                //Check if response is positive
                if (resultCode == Activity.RESULT_OK) {
                    if (requestCode == FILE_CHOOSER_REQUEST_CODE) {
                        if (webview_debug_view?.mUploadMessage2 == null) {
                            return
                        }
                        if (intent == null) {//카메라 캡쳐시
                            //Capture Photo if no image available
                            if (webview_debug_view?.mCM != null) {
                                results = arrayOf(Uri.parse(webview_debug_view?.mCM))
                            }
                        } else { //이미지선택시
                            val dataString = intent.dataString
                            val clipData = intent.clipData

                            //멀티선택
                            if (clipData != null) {
                                results = arrayOfNulls(clipData.itemCount)
                                for (i in 0 until clipData.itemCount) {
                                    val item = clipData.getItemAt(i)
                                    results[i] = item.uri
                                }
                            }

                            //단일선택
                            if (dataString != null) {
                                results = arrayOf(Uri.parse(dataString))
                            }

                        }
                    }
                }
                webview_debug_view?.mUploadMessage2!!.onReceiveValue(results)
                webview_debug_view?.mUploadMessage2 = null
            } else {
                if (requestCode == FILE_CHOOSER_REQUEST_CODE) {
                    if (null == webview_debug_view?.mUploadMessage) return
                    val result = if (intent == null || resultCode != Activity.RESULT_OK) null else intent.data
                    webview_debug_view?.mUploadMessage!!.onReceiveValue(result)
                    webview_debug_view?.mUploadMessage = null
                }
            }
        }else -> {
            //...
            //로그인관련
            //kakao
            if (Session.getCurrentSession().handleActivityResult(requestCode, resultCode, intent)) {
                return
            }else{ //facebook
                facebookLogin?.onActivityResult(requestCode, resultCode, intent)
            }

        }
    } //when end

}

onRequestPermissioResult

  • 권한 동의창 콜백 함수

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)

    when (requestCode) {
        PERM_REQUEST_CODE ->
        if (grantResults.isNotEmpty()) {
            //위치권한동의 여부 확인
            val locationAgree: Boolean = grantResults[0] == PackageManager.PERMISSION_GRANTED
            val fileWriteAgree: Boolean = grantResults[1] == PackageManager.PERMISSION_GRANTED
            val fileReadAgree: Boolean = grantResults[2] == PackageManager.PERMISSION_GRANTED
            //...

            if (locationAgree && fileWriteAgree && fileReadAgree) { //동의했다면
                //동의했을때 작업
            }else { // 하나라도 하지않았다면
                //TODO 거부했을때 로직 확인, 다시보지않기 등등

                //다시보지않기...거부 처리
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    if (!shouldShowRequestPermissionRationale(ACCESS_FINE_LOCATION)) {
                        Log.i(TAG,"ACCESS_FINE_LOCATION Permission denied - don't ask again")
                        return
                    }
                    if (!shouldShowRequestPermissionRationale(READ_EXTERNAL_STORAGE)) {
                        Log.i(TAG,"READ_EXTERNAL_STORAGE Permission denied - don't ask again")
                        return
                    }
                    if (!shouldShowRequestPermissionRationale(WRITE_EXTERNAL_STORAGE)) {
                        Log.i(TAG,"WRITE_EXTERNAL_STORAGE Permission denied - don't ask again")
                        return
                    }
                    //...
                }

                //그냥 거부했다면
                Toast.makeText(this, "권한 체크 거부", Toast.LENGTH_SHORT).show()

            }
        }
    }//when end
}

onDestory

  • 로그인 세션을 만료시킨다.

override fun onDestroy() {
    super.onDestroy()

    kakaoLogin?.Logout()
    facebookLogin?.Logout()
}

onPause

  • activity가 정지되었을 때의 동작을 지정한다.

  • Lollipop 이하 버전의 쿠키를 sync 한다.

override fun onPause() {
    super.onPause()

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        CookieSyncManager.getInstance().stopSync()
    }
}

onResume

  • 화면에 재진입할때 동작 정의

  • 새로고침이 가능한 페이지면 새로고침한다.

  • Lollipop 이하 버전에서 쿠키를 sync한다.

override fun onResume() {
    super.onResume()

    //화면에 재 진입할때는 새로고침작업이 일어난다.
    if(isEnabledReload){
        webview_view?.loadUrl("javascript:reload();")
    }
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        CookieSyncManager.getInstance().startSync()
    }
}

onCreate

  • layout을 정의한다.

  • listener를 등록한다.

  • 상단의 타이틀을 지정한다.

  • intent로 받아온 bundle 값의 타입에 따라 하단 GNB의 동작을 정의한다. (숨기기/보이기/색바꾸)

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main_web_view)

    //click 막기 (내부영역)
    layout_bottom_menu?.setOnTouchListener { _, _ ->
        true
    }
    layout_loading_bar?.setOnTouchListener { _, _ ->
        true
    }
    
     btn_menu1?.setOnClickListener {
            val url:String = SharedPreferenceManager.getBaseUrl() + MENU1_PAGE_URL
            loadUrlWebviewOrNewActivity(url, btn_menu1)
        }
        btn_menu2?.setOnClickListener {
            val url:String = SharedPreferenceManager.getBaseUrl() + MENU2_PAGE_URL
            loadUrlWebviewOrNewActivity(url, btn_menu2)
        }
        btn_menu3?.setOnClickListener {
            val url:String = SharedPreferenceManager.getBaseUrl() + MENU3_PAGE_URL
            loadUrlWebviewOrNewActivity(url, btn_menu3)
        }
        btn_menu4?.setOnClickListener {
            val url:String = SharedPreferenceManager.getBaseUrl() + MENU4_PAGE_URL
            loadUrlWebviewOrNewActivity(url, btn_menu4)
        }
        btn_menu5?.setOnClickListener {
            val url:String = SharedPreferenceManager.getBaseUrl() + MENU5_PAGE_URL
            loadUrlWebviewOrNewActivity(url, btn_menu5)
        }
        btn_menu6?.setOnClickListener {
            val url:String = SharedPreferenceManager.getBaseUrl() + MENU6_PAGE_URL
            loadUrlWebviewOrNewActivity(url, btn_menu6)
        }

    //mypage menu
    menu_center?.setOnClickListener{
        val intent = Intent(this, MyPageMenuActivity::class.java)
        startActivityForResult(intent, REQUEST_MY_PAGE_MENU)
        overridePendingTransition(R.anim.slide_up, R.anim.no_anim)
    }

    //top 타이틀 지정
    top_title?.text = ""

    //top back버튼 정의
    top_back?.setOnClickListener {
        backAction()
    }

    //URL 로드
    var baseUrl: String? = ""
    var param: String? = ""
    val bundle = intent.extras
    var isActiveBottom = false

    if (bundle != null) {
        baseUrl = bundle.getString("url")?:""
        param = bundle.getString("param")?:""
        viewType = bundle.getString("viewType")?:"D" //D: default
        rootView = bundle.getBoolean("rootView")?:false
    }

    //bar type 체크후 show/hide
    when(viewType){
        "N-RT" -> {
            layout_top_bar?.visibility = View.VISIBLE
            layout_bottom_menu?.visibility = View.GONE
        }
        "N-RB" -> {
            layout_top_bar?.visibility = View.GONE
            layout_bottom_menu?.visibility = View.VISIBLE
            isActiveBottom = true
        }
        "N-RTB" -> {
            //color 설정
            bottom_main_gnb?.setBackgroundResource(R.drawable.bg_gnb_w)
            menu_center?.setBackgroundResource(R.drawable.btn_gnb_menu_w)
            btn_menu1?.setTextColor(Color.parseColor("#999999"))
            btn_menu2?.setTextColor(Color.parseColor("#999999"))
            btn_menu3?.setTextColor(Color.parseColor("#999999"))
            btn_menu4?.setTextColor(Color.parseColor("#999999"))
            btn_menu5?.setTextColor(Color.parseColor("#999999"))
            btn_menu6?.setTextColor(Color.parseColor("#999999"))

            layout_top_bar?.visibility = View.VISIBLE
            layout_bottom_menu?.visibility = View.VISIBLE
            isActiveBottom = true
        }
        "P" -> {
            layout_top_bar?.visibility = View.VISIBLE
            layout_bottom_menu?.visibility = View.GONE
        }
    }

    //스크롤 event 리스너
    webview_view?.setScrollChangelistener = {
            l:Int, t:Int, oldl:Int, oldt:Int ->
        Log.i(TAG, "$l, $t, $oldl, $oldt")

        if(isActiveBottom) {
            if (t > oldt) { //scroll down (up swipe)
                if (layout_bottom_menu.visibility == View.VISIBLE) {
                    slideDownMainMenu(WEBVIEW_BOTTOM_MENU_HIDE)
                }
            } else {
                if (layout_bottom_menu.visibility == View.GONE) {
                    slideDownMainMenu(WEBVIEW_BOTTOM_MENU_SHOW)
                }
            }
        }
    }//listener end

    webview_view?.loadUrl(baseUrl)
    //lollipop 이하 버전에서는 수동으로 쿠키 싱크
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        CookieSyncManager.createInstance(this)
    }
    
      createNewWindowWebView()

}

Last updated

Was this helpful?