tgyuuAn / BaekyoungE

์ž์—ฐ์–ด ์ฒ˜๋ฆฌ ๊ธฐ๋ฐ˜ ์ง„๋กœ ์ƒ๋‹ด chat bot ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜
5 stars 0 forks source link

Feature/#52 #53

Closed tgyuuAn closed 2 weeks ago

tgyuuAn commented 2 weeks ago

1. ๐Ÿ“„ ๊ด€๋ จ๋œ ์ด์Šˆ ๋ฐ ์†Œ๊ฐœ

2. ๐Ÿ”ฅ๋ณ€๊ฒฝ๋œ ์ 

3. ๐Ÿ“ธ ์Šคํฌ๋ฆฐ์ƒท(์„ ํƒ)

4. ๐Ÿ’ก์•Œ๊ฒŒ๋œ ํ˜น์€ ๊ถ๊ธˆํ•œ ์‚ฌํ•ญ๋“ค

๋ชจ๋“  ํ™”๋ฉด์—์„œ ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋„คํŠธ์›Œํฌ ๊ฐ์ง€๋ฅผ ๋ชจ๋“  ํ™”๋ฉด์—์„œ ํ•  ์ˆ˜ ์žˆ๋„๋ก,

์•„๋ž˜์™€ ๊ฐ™์€ NetworkObserver๋ฅผ ๋งŒ๋“  ๋’ค,

class NetworkObserver @Inject constructor(context: Context) {
    private val _networkState = MutableStateFlow<NetworkState>(NetworkState.NONE)
    val networkState = _networkState.asStateFlow()

    private val connectivityManager =
        context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

    private val networkCallback = object : ConnectivityManager.NetworkCallback() {
        override fun onAvailable(network: Network) {
            super.onAvailable(network)
            _networkState.value = NetworkState.CONNECTED
        }

        override fun onLost(network: Network) {
            super.onLost(network)
            _networkState.value = NetworkState.NOT_CONNECTED
        }
    }

    init {
        checkNetworkState()
        subscribeNetworkCallback()
    }

    fun checkNetworkState() {
        val caps = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)

        if (caps == null) {
            _networkState.value = NetworkState.NOT_CONNECTED
            return
        }

        _networkState.value =
            if (caps.hasTransport(TRANSPORT_WIFI) || caps.hasTransport(TRANSPORT_CELLULAR)) {
                NetworkState.CONNECTED
            } else {
                NetworkState.NOT_CONNECTED
            }
    }

    private fun subscribeNetworkCallback() {
        val networkRequest = NetworkRequest.Builder()
            .addTransportType(TRANSPORT_WIFI)
            .addTransportType(TRANSPORT_CELLULAR)
            .build()

        connectivityManager.registerNetworkCallback(networkRequest, networkCallback)
    }

    fun unsubscribeNetworkCallback() =
        connectivityManager.unregisterNetworkCallback(networkCallback)
}

enum class NetworkState {
    NONE, CONNECTED, NOT_CONNECTED
}




์•„๋ž˜์™€ ๊ฐ™์ด MainActivity์— ์‹ฌ์–ด์ฃผ์—ˆ์Œ. ์ด ๋•Œ, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ฒŒ ์œ„ํ•ด onDestroy()์—์„œ ๋„คํŠธ์›Œํฌ ๊ตฌ๋… ํ•ด์ œ ์žŠ์ง€ ์•Š๊ธฐ!

@AndroidEntryPoint
class MainActivity : ComponentActivity() {

    @Inject
    lateinit var networkObserver: NetworkObserver

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

        // ...

        setContent {
            BaekyoungTheme {
                val networkState by networkObserver.networkState.collectAsStateWithLifecycle()

                if (networkState == NetworkState.NOT_CONNECTED) {
                    BaekyoungDialog(
                        title = "๋„คํŠธ์›Œํฌ ์ƒํƒœ๋ฅผ ํ™•์ธ ํ•ด์ฃผ์„ธ์š”.",
                        description = "๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์— ์‹คํŒจํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‹œ๋„ํ•˜์‹œ๊ฒ ์–ด์š”?",
                        leftButtonText = stringResource(R.string.cancel),
                        rightButtonText = "์„ค์ •",
                        onLeftButtonClick = { finish() },
                        onRightButtonClick = {
                            val intent = Intent(ACTION_WIFI_SETTINGS)
                            startActivity(intent)
                        },
                    )
                }

        // ...

    }

    override fun onResume() {
        super.onResume()
        networkObserver.checkNetworkState()
    }

    override fun onDestroy() {
        super.onDestroy()
        networkObserver.unsubscribeNetworkCallback()
    }
}




Compose์—์„œ ์•ฑ ์ข…๋ฃŒ ๋ฐฉ๋ฒ•

BaekyoungDialog(
    title = stringResource(id = string.network_dialog_title),
    description = stringResource(id = string.network_dialog_description),
    leftButtonText = stringResource(R.string.cancel),
    rightButtonText = stringResource(id = string.setting),
    onLeftButtonClick = { finish() },  // <-- MainAcitivty ์—์„œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๋ผ ๋ฐ”๋กœ finish() ํ˜ธ์ถœ ๊ฐ€๋Šฅ.
    onRightButtonClick = {
        val intent = Intent(ACTION_WIFI_SETTINGS)
        startActivity(intent)
    },
)

๊ทผ๋ฐ, finish() ๋ง๊ณ ๋„ finishAffinity() ๋„ ์žˆ๊ณ , finishAndRemoveTask() ๋„ ์žˆ๋‹ค.

์•ž์—๊ฑฐ ๋‘ ๊ฐœ์˜ ์ฐจ์ด๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ๊ณ ,

2๋ฒˆ์งธ๋Š” ์•ฑ ์ข…๋ฃŒ ํ›„์— ์•ฑ ์„œ๋ž(์ตœ๊ทผ ์‹คํ–‰ ์•ฑ)์—์„œ ์•ฑ์ด ์œ ์ง€,

3 ๋ฒˆ์งธ๋Š” ์•ฑ ์„œ๋ž์—์„œ๋„ ์•ฑ์ด ์—†์–ด์ง.

๋ ˆํผ๋Ÿฐ์Šค