Skip to content

Commit d44746a

Browse files
author
sungbin5304
committed
🐦 success 🐦
1 parent d4b260a commit d44746a

File tree

15 files changed

+477
-162
lines changed

15 files changed

+477
-162
lines changed

app/src/main/AndroidManifest.xml

+4-1
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@
77
<uses-permission
88
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
99
tools:ignore="ScopedStorage" />
10+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
1011
<uses-permission android:name="android.permission.INTERNET" />
1112
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
12-
<uses-permission android:name="android.permission.VIBRATE" />
13+
<uses-permission android:name="android.permission.WAKE_LOCK" />
1314

1415
<application
1516
android:allowBackup="true"
@@ -63,6 +64,8 @@
6364
</intent-filter>
6465
</service>
6566

67+
<service android:name=".service.ForgroundService" />
68+
6669
</application>
6770

6871
</manifest>

app/src/main/kotlin/com/sungbin/gitkakaobot/GitKakaoBot.kt

+7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.sungbin.gitkakaobot
22

33
import android.app.Application
4+
import com.sungbin.androidutils.util.NotificationUtil
45
import com.sungbin.gitkakaobot.bot.ApiClass
56
import com.sungbin.gitkakaobot.bot.Bot
67
import com.sungbin.gitkakaobot.util.BotUtil
@@ -20,6 +21,12 @@ class GitKakaoBot : Application() {
2021
Bot.init(applicationContext)
2122
ApiClass.init(applicationContext)
2223
BotUtil.init(applicationContext)
24+
25+
NotificationUtil.createChannel(
26+
applicationContext,
27+
getString(R.string.app_name),
28+
getString(R.string.foregroundservice_running_bot)
29+
)
2330
}
2431

2532
}

app/src/main/kotlin/com/sungbin/gitkakaobot/adapter/BotAdapter.kt

+15-18
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,9 @@ import androidx.annotation.NonNull
77
import androidx.core.content.ContextCompat
88
import androidx.databinding.DataBindingUtil
99
import androidx.recyclerview.widget.RecyclerView
10-
import com.sungbin.androidutils.extensions.hide
1110
import com.sungbin.androidutils.extensions.setTint
12-
import com.sungbin.androidutils.extensions.show
1311
import com.sungbin.gitkakaobot.R
1412
import com.sungbin.gitkakaobot.databinding.LayoutBotBinding
15-
import com.sungbin.gitkakaobot.listener.MessageListener
1613
import com.sungbin.gitkakaobot.model.Bot
1714
import com.sungbin.gitkakaobot.model.BotType
1815
import com.sungbin.gitkakaobot.ui.activity.CodeEditActivity
@@ -48,26 +45,26 @@ class BotAdapter(
4845
item = bot
4946
tvName.isSelected = true
5047
ivReload.setOnClickListener {
51-
ivReload.hide(true)
52-
pbReloading.show()
48+
// AnimationUtil.rotateOnce(ivReload)
5349
CoroutineScope(Dispatchers.Default).launch {
5450
val ms = System.currentTimeMillis()
55-
val status = async { MessageListener.compileJavaScript(bot) }
51+
val status =
52+
async { com.sungbin.gitkakaobot.bot.Bot.compileJavaScript(bot) }
5653
status.await().let {
5754
val ms2 = System.currentTimeMillis()
5855
val reloadTime = ms2 - ms
59-
ivReload.show()
60-
pbReloading.hide(true)
61-
if (it.isCompiled) {
62-
UiUtil.snackbar(
63-
activity.window.decorView,
64-
activity.getString(R.string.bot_reload_done, reloadTime)
65-
)
66-
} else {
67-
loadingDialog.setError(
68-
Exception("${it.exception}\n\n리로드 시간 : $reloadTime ms")
69-
)
70-
loadingDialog.show()
56+
activity.runOnUiThread {
57+
if (it.isCompiled) {
58+
UiUtil.snackbar(
59+
activity.window.decorView,
60+
activity.getString(R.string.bot_reload_done, reloadTime)
61+
)
62+
} else {
63+
loadingDialog.setError(
64+
Exception("${it.exception}\n\n리로드 시간: $reloadTime ms")
65+
)
66+
loadingDialog.show()
67+
}
7168
}
7269
}
7370
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
package com.sungbin.gitkakaobot.bot
2+
3+
import android.content.Context
4+
import com.sungbin.androidutils.util.StorageUtil
5+
import com.sungbin.gitkakaobot.util.manager.StackManager
6+
import org.mozilla.javascript.ScriptableObject
7+
import org.mozilla.javascript.annotations.JSStaticFunction
8+
import java.text.SimpleDateFormat
9+
import java.util.*
10+
11+
object ApiClass {
12+
13+
private lateinit var context: Context
14+
fun init(context: Context) {
15+
ApiClass.context = context
16+
}
17+
18+
class Log : ScriptableObject() {
19+
override fun getClassName() = "Log"
20+
21+
companion object {
22+
@JvmStatic
23+
@JSStaticFunction
24+
fun e(name: String, content: String) {
25+
val now = System.currentTimeMillis()
26+
val date = Date(now)
27+
val sdf = SimpleDateFormat("hh:mm:ss", Locale.getDefault())
28+
val time = sdf.format(date)
29+
30+
// LogUtils.save(name, content, time, LogUtils.Type.ERROR)
31+
}
32+
33+
@JvmStatic
34+
@JSStaticFunction
35+
fun i(name: String, content: String) {
36+
val now = System.currentTimeMillis()
37+
val date = Date(now)
38+
val sdf = SimpleDateFormat("hh:mm:ss", Locale.getDefault())
39+
val time = sdf.format(date)
40+
41+
// LogUtils.save(name, content, time, LogUtils.Type.INFO)
42+
}
43+
44+
@JvmStatic
45+
@JSStaticFunction
46+
fun s(name: String, content: String) {
47+
val now = System.currentTimeMillis()
48+
val date = Date(now)
49+
val sdf = SimpleDateFormat("hh:mm:ss", Locale.getDefault())
50+
val time = sdf.format(date)
51+
52+
// LogUtils.save(name, content, time, LogUtils.Type.SUCCESS)
53+
}
54+
55+
}
56+
}
57+
58+
class Api : ScriptableObject() {
59+
override fun getClassName() = "Api"
60+
61+
companion object {
62+
@JvmStatic
63+
@JSStaticFunction
64+
fun getContext(): Context {
65+
return context
66+
}
67+
68+
/*@JvmStatic
69+
@JSStaticFunction
70+
fun replyRoom(room: String, msg: String): Boolean {
71+
return com.sungbin.autoreply.bot.three.api.Api.replyRoom(room, msg)
72+
}
73+
74+
@JvmStatic
75+
@JSStaticFunction
76+
fun replyRoomShowAll(room: String, msg1: String, msg2: String): Boolean {
77+
return com.sungbin.autoreply.bot.three.api.Api.replyRoomShowAll(room, msg1, msg2)
78+
}*/
79+
}
80+
}
81+
82+
class Scope : ScriptableObject() {
83+
override fun getClassName() = "Scope"
84+
85+
companion object {
86+
@JvmStatic
87+
@JSStaticFunction
88+
fun get(name: String) = StackManager.scopes[name]
89+
}
90+
}
91+
92+
class File : ScriptableObject() {
93+
override fun getClassName() = "File"
94+
95+
companion object {
96+
@JvmStatic
97+
@JSStaticFunction
98+
fun read(path: String, _null: String?) = StorageUtil.read(path, _null)
99+
100+
@JvmStatic
101+
@JSStaticFunction
102+
fun save(path: String, content: String) = StorageUtil.save(path, content)
103+
104+
@JvmStatic
105+
@JSStaticFunction
106+
fun append(path: String, content: String): Boolean {
107+
val string = "${StorageUtil.read(path, "")}$content"
108+
return save(path, string)
109+
}
110+
111+
@JvmStatic
112+
@JSStaticFunction
113+
fun delete(path: String) = StorageUtil.delete(path)
114+
115+
@JvmStatic
116+
@JSStaticFunction
117+
fun deleteAll(path: String) = StorageUtil.deleteAll(path)
118+
}
119+
}
120+
121+
// todo: Api, UiUtil
122+
}

app/src/main/kotlin/com/sungbin/gitkakaobot/bot/Bot.kt

+3
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.sungbin.gitkakaobot.model.BotCompile
1313
import com.sungbin.gitkakaobot.util.BotUtil
1414
import com.sungbin.gitkakaobot.util.UiUtil
1515
import com.sungbin.gitkakaobot.util.manager.StackManager
16+
import org.mozilla.javascript.Function
1617
import org.mozilla.javascript.ImporterTopLevel
1718
import org.mozilla.javascript.ScriptableObject
1819

@@ -59,7 +60,9 @@ object Bot {
5960
ScriptableObject.defineClass(scope, ApiClass.Scope::class.java, false, true)
6061
ScriptableObject.defineClass(scope, ApiClass.File::class.java, false, true)
6162
rhino.compileString(BotUtil.getBotCode(bot), bot.name, 1, null).exec(rhino, scope)
63+
val function = scope["response", scope] as Function
6264
StackManager.scopes[bot.uuid] = scope
65+
StackManager.functions[bot.uuid] = function
6366
org.mozilla.javascript.Context.exit()
6467
BotCompile(true, null)
6568
} catch (exception: Exception) {

app/src/main/kotlin/com/sungbin/gitkakaobot/bot/Replier.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.sungbin.gitkakaobot.bot
22

33
import android.app.Notification
4-
import com.sungbin.gitkakaobot.listener.MessageListener.Companion.replyToSession
4+
import com.sungbin.gitkakaobot.bot.Bot.replyToSession
55
import com.sungbin.gitkakaobot.util.BotUtil.showAll
66
import com.sungbin.gitkakaobot.util.manager.StackManager.sessions
77

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.sungbin.gitkakaobot.service
2+
3+
import android.annotation.SuppressLint
4+
import android.app.Service
5+
import android.content.Context
6+
import android.content.Intent
7+
import android.os.IBinder
8+
import android.os.PowerManager
9+
import com.sungbin.androidutils.util.NotificationUtil
10+
import com.sungbin.gitkakaobot.R
11+
12+
13+
/**
14+
* Created by SungBin on 2020-12-14.
15+
*/
16+
17+
class ForgroundService : Service() {
18+
19+
private val pm by lazy { getSystemService(Context.POWER_SERVICE) as PowerManager }
20+
private val wakeLock by lazy { pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, wakeLockLabel) }
21+
private val wakeLockLabel = "WakeLock"
22+
private val notificationId = 1000
23+
private val notification by lazy {
24+
NotificationUtil.getNormalNotification(
25+
applicationContext,
26+
getString(R.string.app_name),
27+
getString(R.string.foregroundservice_running_bot),
28+
R.mipmap.ic_launcher,
29+
true
30+
)
31+
}
32+
33+
override fun onBind(intent: Intent?): IBinder? = null
34+
35+
@SuppressLint("WakelockTimeout")
36+
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
37+
startForeground(notificationId, notification.build())
38+
wakeLock.acquire()
39+
return START_STICKY
40+
}
41+
42+
override fun onDestroy() {
43+
stopForeground(true)
44+
wakeLock.release()
45+
}
46+
47+
}

app/src/main/kotlin/com/sungbin/gitkakaobot/ui/activity/CodeEditActivity.kt

+2
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ class CodeEditActivity : AppCompatActivity() {
4949
super.onCreate(savedInstanceState)
5050
setContentView(binding.root)
5151

52+
supportActionBar?.hide()
53+
5254
val botJsonString = intent.getStringExtra("bot").toString()
5355
val bot = BotUtil.createBotItem(JSONObject(botJsonString))
5456

app/src/main/kotlin/com/sungbin/gitkakaobot/ui/activity/JoinActivity.kt

+19-6
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import androidx.appcompat.app.AppCompatActivity
1010
import androidx.browser.customtabs.CustomTabsIntent
1111
import androidx.core.app.ActivityCompat
1212
import androidx.core.app.NotificationManagerCompat
13+
import com.sungbin.androidutils.util.BatteryUtil
1314
import com.sungbin.androidutils.util.DataUtil
1415
import com.sungbin.androidutils.util.PermissionUtil
1516
import com.sungbin.gitkakaobot.R
@@ -32,6 +33,7 @@ import javax.inject.Inject
3233
@AndroidEntryPoint
3334
class JoinActivity : AppCompatActivity() {
3435

36+
private var isBatteryButtonClicked = false
3537
private val codeRequestNotificationRead = 3000
3638
private val codeRequestAccessStorage = 4000
3739

@@ -67,7 +69,19 @@ class JoinActivity : AppCompatActivity() {
6769
)
6870
}
6971

70-
checkAllGrantPermissions()
72+
binding.btnRequestBatteryIgnoreOptimization.setOnClickListener {
73+
BatteryUtil.requestIgnoreBatteryOptimization(applicationContext)
74+
isBatteryButtonClicked = true
75+
checkAllPermissionsGrant()
76+
77+
binding.btnRequestBatteryIgnoreOptimization.apply {
78+
text = getString(R.string.join_permission_grant)
79+
alpha = 0.5f
80+
setOnClickListener { }
81+
}
82+
}
83+
84+
checkAllPermissionsGrant()
7185
}
7286

7387
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
@@ -81,7 +95,7 @@ class JoinActivity : AppCompatActivity() {
8195
alpha = 0.5f
8296
}
8397
}
84-
checkAllGrantPermissions()
98+
checkAllPermissionsGrant()
8599
}
86100
}
87101
}
@@ -100,7 +114,7 @@ class JoinActivity : AppCompatActivity() {
100114
setOnClickListener { }
101115
alpha = 0.5f
102116
}
103-
checkAllGrantPermissions()
117+
checkAllPermissionsGrant()
104118
}
105119
}
106120

@@ -114,14 +128,13 @@ class JoinActivity : AppCompatActivity() {
114128
)
115129
}
116130

117-
private fun checkAllGrantPermissions() {
131+
private fun checkAllPermissionsGrant() {
118132
if (PermissionUtil.checkPermissionsAllGrant(
119133
applicationContext, arrayOf(
120134
Manifest.permission.READ_EXTERNAL_STORAGE,
121135
Manifest.permission.WRITE_EXTERNAL_STORAGE
122136
)
123-
) &&
124-
getNotificationListenerPermission()
137+
) && getNotificationListenerPermission() && isBatteryButtonClicked
125138
) {
126139
binding.btnRequestNotificationRead.apply {
127140
text = getString(R.string.join_permission_grant)

0 commit comments

Comments
 (0)