Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[feat] 웹뷰 브릿지 기초 구현 #11

Merged
merged 6 commits into from
Feb 3, 2025
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,8 @@ plugins {

android {
namespace = "com.nexters.misik"
}
}

dependencies {
implementation(projects.feature.webview)
}

This file was deleted.

2 changes: 1 addition & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
android:theme="@style/Theme.MisikAndroid"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:name="com.nexters.misik.webview.MainActivity"
android:exported="true"
android:label="@string/app_name"
android:theme="@style/Theme.MisikAndroid">
Expand Down
50 changes: 0 additions & 50 deletions app/src/main/java/com/nexters/misik/MainActivity.kt

This file was deleted.

16 changes: 0 additions & 16 deletions app/src/test/java/com/nexters/misik/ExampleUnitTest.kt

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.nexters.misik.domain

interface WebBridgeContract {
fun openCamera()
fun openGallery()
fun share(content: String)
fun createReview(ocrText: String, hashTags: List<String>, reviewStyle: String)
fun copy(review: String)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.nexters.misik.webview

import android.os.Bundle
import android.webkit.WebChromeClient
import android.webkit.WebView
import android.webkit.WebViewClient
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Scaffold
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.viewinterop.AndroidView
import com.nexters.misik.webview.MainActivity.Companion.WEB_URL
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject

@AndroidEntryPoint
class MainActivity : ComponentActivity() {

@Inject
lateinit var webAppInterface: WebInterface

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()

setContent {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
WebViewScreen(webAppInterface, modifier = Modifier.padding(innerPadding))
}
}
}

companion object {
const val WEB_URL = "https://misik-web.vercel.app/"
}
}

@Composable
fun WebViewScreen(
webAppInterface: WebInterface,
modifier: Modifier = Modifier,
) {
AndroidView(
modifier = modifier,
factory = { context ->
WebView(context).apply {
settings.javaScriptEnabled = true
webViewClient = WebViewClient()
webChromeClient = WebChromeClient()
addJavascriptInterface(webAppInterface, "AndroidBridge")
loadUrl(WEB_URL)
}
},
)
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.nexters.misik.webview

import android.content.Context
import com.nexters.misik.domain.WebBridgeContract
import javax.inject.Inject

class WebBridgeImpl @Inject constructor(
private val context: Context,
) : WebBridgeContract {
override fun openCamera() {
// 카메라 실행
}

override fun openGallery() {
// 갤러리 실행
}

override fun share(content: String) {
// 공유
}

override fun createReview(ocrText: String, hashTags: List<String>, reviewStyle: String) {
// 리뷰 생성
}

override fun copy(review: String) {
// 텍스트 복사
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.nexters.misik.webview

import android.app.Application
import android.content.Context
import com.nexters.misik.domain.WebBridgeContract
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent

@Module
@InstallIn(SingletonComponent::class)
object WebBridgeModule {

@Provides
fun provideWebBridgeImpl(context: Context): WebBridgeContract {
return WebBridgeImpl(context)
}

@Provides
fun provideContext(application: Application): Context {
return application.applicationContext
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.nexters.misik.webview

import android.webkit.JavascriptInterface
import com.nexters.misik.domain.WebBridgeContract
import org.json.JSONObject
import javax.inject.Inject

class WebInterface @Inject constructor(
private val bridge: WebBridgeContract,
) {

@JavascriptInterface
fun openCamera() {
bridge.openCamera()
}

@JavascriptInterface
fun openGallery() {
bridge.openGallery()
}

@JavascriptInterface
fun share(content: String) {
bridge.share(content)
}

@JavascriptInterface
fun createReview(json: String) {
val jsonObject = JSONObject(json)
val ocrText = jsonObject.getString("ocrText")
val hashTags = jsonObject.getJSONArray("hashTag").let { array ->
List(array.length()) { array.getString(it) }
}
val reviewStyle = jsonObject.getString("reviewStyle")
bridge.createReview(ocrText, hashTags, reviewStyle)
}

@JavascriptInterface
fun copy(json: String) {
val jsonObject = JSONObject(json)
val review = jsonObject.getString("review")
bridge.copy(review)
}
}
Loading