1
- package com.runnect.runnect.developer
1
+ package com.runnect.runnect.developer.presentation
2
2
3
3
import android.content.ClipData
4
4
import android.content.ClipboardManager
5
5
import android.content.Context
6
+ import android.content.Intent
7
+ import android.content.pm.PackageManager
6
8
import android.os.Build
7
9
import android.os.Bundle
8
10
import android.util.DisplayMetrics
9
11
import android.view.WindowInsets
10
12
import android.view.WindowManager
11
13
import androidx.appcompat.app.AppCompatActivity
14
+ import androidx.fragment.app.activityViewModels
12
15
import androidx.lifecycle.lifecycleScope
13
16
import androidx.preference.ListPreference
14
17
import androidx.preference.Preference
@@ -17,40 +20,88 @@ import com.runnect.runnect.R
17
20
import com.runnect.runnect.application.ApiMode
18
21
import com.runnect.runnect.application.ApplicationClass
19
22
import com.runnect.runnect.application.PreferenceManager
23
+ import com.runnect.runnect.developer.enum.ServerStatus
24
+ import com.runnect.runnect.developer.presentation.custom.ServerStatusPreference
20
25
import com.runnect.runnect.util.custom.toast.RunnectToast
21
26
import com.runnect.runnect.util.preference.AuthUtil.getAccessToken
22
27
import com.runnect.runnect.util.preference.AuthUtil.getNewToken
23
28
import com.runnect.runnect.util.preference.AuthUtil.saveToken
24
29
import com.runnect.runnect.util.preference.StatusType.LoginStatus
30
+ import com.runnect.runnect.util.extension.repeatOnStarted
31
+ import com.runnect.runnect.util.extension.setStatusBarColor
32
+ import dagger.hilt.android.AndroidEntryPoint
25
33
import kotlinx.coroutines.Dispatchers
26
34
import kotlinx.coroutines.delay
27
35
import kotlinx.coroutines.launch
28
36
import kotlin.system.exitProcess
29
37
38
+ @AndroidEntryPoint
30
39
class RunnectDeveloperActivity : AppCompatActivity (R .layout.activity_runnect_developer) {
31
40
32
41
class RunnectDeveloperFragment : PreferenceFragmentCompat () {
33
42
43
+ private val viewModel: RunnectDeveloperViewModel by activityViewModels()
44
+
34
45
private val clipboardManager: ClipboardManager ? by lazy {
35
46
context?.getSystemService(Context .CLIPBOARD_SERVICE ) as ? ClipboardManager
36
47
}
37
48
38
49
override fun onCreatePreferences (savedInstanceState : Bundle ? , rootKey : String? ) {
39
50
setPreferencesFromResource(R .xml.preferences_developer_menu, rootKey)
51
+ activity?.apply {
52
+ setStatusBarColor(window = window, isLightColor = true , colorResource = R .color.white)
53
+ }
40
54
41
55
initUserInfo()
42
56
initApiMode()
43
57
initDeviceInfo()
44
58
initDisplayInfo()
59
+ initObserve()
60
+ requestApi()
61
+ }
62
+
63
+ private fun requestApi () {
64
+ with (viewModel) {
65
+ checkProdServerStatus()
66
+ checkTestServerStatus()
67
+ }
68
+ }
69
+
70
+ private fun initObserve () {
71
+ val prodPref = findPreference<ServerStatusPreference >(" dev_pref_prod_server_status" )
72
+ val testPref = findPreference<ServerStatusPreference >(" dev_pref_test_server_status" )
73
+
74
+ repeatOnStarted(
75
+ {
76
+ viewModel.prodStatus.collect {
77
+ prodPref?.setServerStatus(ServerStatus .getStatus(it))
78
+ }
79
+ },
80
+ {
81
+ viewModel.testStatus.collect {
82
+ testPref?.setServerStatus(ServerStatus .getStatus(it))
83
+ }
84
+ }
85
+ )
45
86
}
46
87
47
88
private fun initUserInfo () {
48
89
val ctx: Context = context ? : return
49
90
val accessToken = ctx.getAccessToken()
50
91
val refreshToken = ctx.getNewToken()
92
+ val combinedToken = " ${ApiMode .getCurrentApiMode(ctx).name} 서버\n [Access Token]: $accessToken \n\n ---\n\n [Refresh Token]: $refreshToken "
51
93
52
94
setPreferenceSummary(" dev_pref_key_access_token" , accessToken)
53
95
setPreferenceSummary(" dev_pref_key_refresh_token" , refreshToken)
96
+ setPreferenceClickListener(" dev_pref_key_share_tokens" ) {
97
+ Intent ().apply {
98
+ action = Intent .ACTION_SEND
99
+ type = " text/plain"
100
+ putExtra(Intent .EXTRA_TEXT , combinedToken)
101
+ }.let {
102
+ startActivity(Intent .createChooser(it, " Share tokens via:" ))
103
+ }
104
+ }
54
105
}
55
106
56
107
private fun initApiMode () {
@@ -66,18 +117,20 @@ class RunnectDeveloperActivity : AppCompatActivity(R.layout.activity_runnect_dev
66
117
67
118
title = currentApi.name
68
119
setValueIndex(selectIndex)
69
- setOnPreferenceChangeListener { preference , newValue ->
120
+ setOnPreferenceChangeListener { _ , newValue ->
70
121
val selectItem = newValue.toString()
71
122
this .title = selectItem
72
123
73
- PreferenceManager .apply {
74
- setString(ctx, ApplicationClass .API_MODE , selectItem)
124
+ with (ctx) {
125
+ PreferenceManager .setString(this , ApplicationClass .API_MODE , selectItem)
126
+ saveToken(
127
+ accessToken = LoginStatus .NONE .value,
128
+ refreshToken = LoginStatus .NONE .value
129
+ )
130
+
131
+ restartApplication(this )
75
132
}
76
- ctx.saveToken(
77
- accessToken = LoginStatus .NONE .value,
78
- refreshToken = LoginStatus .NONE .value
79
- )
80
- destroyApp(ctx)
133
+
81
134
true
82
135
}
83
136
}
@@ -96,15 +149,9 @@ class RunnectDeveloperActivity : AppCompatActivity(R.layout.activity_runnect_dev
96
149
val naviBarHeight = getNaviBarHeight(windowManager)
97
150
98
151
with (metrics) {
99
- setPreferenceSummary(
100
- " dev_pref_display_ratio" ,
101
- " $widthPixels x ${heightPixels + statusBarHeight + naviBarHeight} "
102
- )
152
+ setPreferenceSummary(" dev_pref_display_ratio" , " $widthPixels x ${heightPixels + statusBarHeight + naviBarHeight} " )
103
153
setPreferenceSummary(" dev_pref_display_density" , " ${densityDpi} dp" )
104
- setPreferenceSummary(
105
- " dev_pref_display_resource_bucket" ,
106
- getDeviceResourseBucket(this )
107
- )
154
+ setPreferenceSummary(" dev_pref_display_resource_bucket" , getDeviceResourseBucket(this ))
108
155
}
109
156
}
110
157
@@ -125,8 +172,7 @@ class RunnectDeveloperActivity : AppCompatActivity(R.layout.activity_runnect_dev
125
172
private fun getStatusBarHeight (windowManager : WindowManager ): Int {
126
173
return if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .R ) {
127
174
val windowMetrics = windowManager.currentWindowMetrics
128
- val insets =
129
- windowMetrics.windowInsets.getInsetsIgnoringVisibility(WindowInsets .Type .statusBars())
175
+ val insets = windowMetrics.windowInsets.getInsetsIgnoringVisibility(WindowInsets .Type .statusBars())
130
176
insets.top
131
177
} else {
132
178
0
@@ -136,8 +182,7 @@ class RunnectDeveloperActivity : AppCompatActivity(R.layout.activity_runnect_dev
136
182
private fun getNaviBarHeight (windowManager : WindowManager ): Int {
137
183
return if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .R ) {
138
184
val windowMetrics = windowManager.currentWindowMetrics
139
- val insets =
140
- windowMetrics.windowInsets.getInsetsIgnoringVisibility(WindowInsets .Type .navigationBars())
185
+ val insets = windowMetrics.windowInsets.getInsetsIgnoringVisibility(WindowInsets .Type .navigationBars())
141
186
insets.bottom
142
187
} else {
143
188
0
@@ -153,6 +198,15 @@ class RunnectDeveloperActivity : AppCompatActivity(R.layout.activity_runnect_dev
153
198
}
154
199
}
155
200
201
+ private fun setPreferenceClickListener (key : String , onClick : () -> Unit ) {
202
+ findPreference<Preference >(key)?.let { pref ->
203
+ pref.setOnPreferenceClickListener {
204
+ onClick.invoke()
205
+ true
206
+ }
207
+ }
208
+ }
209
+
156
210
private fun copyToText (text : String ): Boolean {
157
211
val clipData = ClipData .newPlainText(CLIPBOARD_LABEL , text)
158
212
clipboardManager?.setPrimaryClip(clipData)
@@ -166,14 +220,19 @@ class RunnectDeveloperActivity : AppCompatActivity(R.layout.activity_runnect_dev
166
220
return true
167
221
}
168
222
169
- private fun destroyApp (context : Context ) {
223
+ private fun restartApplication (context : Context ) {
224
+ val packageManager: PackageManager = context.packageManager
225
+ val packageName = packageManager.getLaunchIntentForPackage(context.packageName)
226
+ val component = packageName?.component
227
+
170
228
lifecycleScope.launch(Dispatchers .Main ) {
171
- RunnectToast .createToast(context, getString(R .string.dev_mode_require_restart))
172
- .show()
173
- delay(3000 )
229
+ RunnectToast .createToast(context, getString(R .string.dev_mode_require_restart)).show()
230
+ delay(2000 )
174
231
175
- activity?.finishAffinity() // 루트액티비티 종료
176
- exitProcess(0 )
232
+ Intent .makeRestartActivityTask(component).apply {
233
+ startActivity(this )
234
+ exitProcess(0 )
235
+ }
177
236
}
178
237
}
179
238
0 commit comments