add profile notification intent & detect is modified
This commit is contained in:
10 files changed
+77
-29
No files matched your search
@@ -51,7 +51,13 @@ class CreateProfileActivity : BaseActivity() {
|
||||
}
|
||||
|
||||
startActivityForResult(
|
||||
ProfileEditActivity::class.intent.putExtra("id", id),
|
||||
ProfileEditActivity::class.intent.setData(
|
||||
Uri.fromParts(
|
||||
"id",
|
||||
id.toString(),
|
||||
null
|
||||
)
|
||||
),
|
||||
REQUEST_CODE
|
||||
)
|
||||
}
|
||||
|
||||
@@ -2,7 +2,10 @@ package com.github.kr328.clash
|
||||
|
||||
import android.app.Application
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import com.github.kr328.clash.common.Global
|
||||
import com.github.kr328.clash.common.util.componentName
|
||||
import com.github.kr328.clash.dump.LogcatDumper
|
||||
import com.github.kr328.clash.remote.Broadcasts
|
||||
import com.github.kr328.clash.remote.Remote
|
||||
@@ -48,6 +51,20 @@ class MainApplication : Application() {
|
||||
})
|
||||
}
|
||||
|
||||
Global.openMainIntent = {
|
||||
Intent(Intent.ACTION_MAIN).apply {
|
||||
component = MainActivity::class.componentName
|
||||
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
|
||||
}
|
||||
}
|
||||
Global.openProfileIntent = {
|
||||
Intent(Intent.ACTION_MAIN).apply {
|
||||
component = ProfileEditActivity::class.componentName
|
||||
data = Uri.fromParts("id", it.toString(), null)
|
||||
flags = Intent.FLAG_ACTIVITY_NEW_TASK
|
||||
}
|
||||
}
|
||||
|
||||
Remote.init(this)
|
||||
Broadcasts.init(this)
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.runBlocking
|
||||
|
||||
class ProfileEditActivity : BaseActivity() {
|
||||
private var editor: ProfileEditFragment? = null
|
||||
private var processing = false
|
||||
set(value) {
|
||||
field = value
|
||||
@@ -34,7 +35,7 @@ class ProfileEditActivity : BaseActivity() {
|
||||
toolbar.setTitle(R.string.loading)
|
||||
|
||||
launch {
|
||||
val id = intent.getLongExtra("id", -1)
|
||||
val id = intent.data?.schemeSpecificPart?.toLongOrNull() ?: return@launch finish()
|
||||
|
||||
val metadata = withProfile {
|
||||
queryById(id)
|
||||
@@ -50,10 +51,13 @@ class ProfileEditActivity : BaseActivity() {
|
||||
}
|
||||
|
||||
val fragment = ProfileEditFragment(
|
||||
metadata.id,
|
||||
metadata.name, metadata.uri, metadata.interval,
|
||||
metadata.type, metadata.source
|
||||
)
|
||||
|
||||
editor = fragment
|
||||
|
||||
supportFragmentManager.beginTransaction()
|
||||
.replace(R.id.fragment, fragment)
|
||||
.commit()
|
||||
@@ -87,6 +91,9 @@ class ProfileEditActivity : BaseActivity() {
|
||||
return
|
||||
}
|
||||
|
||||
if ( editor?.isModified != true)
|
||||
return finish()
|
||||
|
||||
AlertDialog.Builder(this)
|
||||
.setTitle(R.string.exit_without_save)
|
||||
.setMessage(R.string.exit_without_save_warning)
|
||||
@@ -98,7 +105,9 @@ class ProfileEditActivity : BaseActivity() {
|
||||
override fun onDestroy() {
|
||||
runBlocking {
|
||||
withProfile {
|
||||
release(intent.getLongExtra("id", -1))
|
||||
val id = editor?.id ?: return@withProfile
|
||||
|
||||
release(id)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -112,13 +112,10 @@ class ProfilesActivity : BaseActivity(), ProfileAdapter.Callback, ProfilesMenu.C
|
||||
}
|
||||
|
||||
private fun openProperties(id: Long) {
|
||||
if (id < 0) {
|
||||
Snackbar.make(rootView, getText(R.string.profile_not_found), Snackbar.LENGTH_LONG)
|
||||
.show()
|
||||
return
|
||||
}
|
||||
|
||||
startActivity(ProfileEditActivity::class.intent.putExtra("id", id))
|
||||
startActivity(
|
||||
ProfileEditActivity::class.intent
|
||||
.setData(Uri.fromParts("id", id.toString(), null))
|
||||
)
|
||||
}
|
||||
|
||||
private fun openEditor(profile: Profile) = launch {
|
||||
|
||||
@@ -20,12 +20,15 @@ import com.github.kr328.clash.service.model.Profile.Type
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
|
||||
class ProfileEditFragment(
|
||||
val id: Long,
|
||||
var name: String,
|
||||
var uri: Uri,
|
||||
var interval: Long,
|
||||
private val type: Type,
|
||||
private val source: Uri?
|
||||
) : Fragment() {
|
||||
var isModified = false
|
||||
|
||||
companion object {
|
||||
private const val REQUEST_CODE = 10000
|
||||
|
||||
@@ -60,6 +63,7 @@ class ProfileEditFragment(
|
||||
) {
|
||||
onTextChanged {
|
||||
name = content.toString()
|
||||
isModified = true
|
||||
}
|
||||
}
|
||||
textInput(
|
||||
@@ -84,6 +88,7 @@ class ProfileEditFragment(
|
||||
}
|
||||
|
||||
uri = Uri.parse(content.toString())
|
||||
isModified = true
|
||||
}
|
||||
}
|
||||
textInput(
|
||||
@@ -118,6 +123,7 @@ class ProfileEditFragment(
|
||||
}
|
||||
|
||||
interval = content.toString().toLong() * 1000 * 60
|
||||
isModified = true
|
||||
}
|
||||
|
||||
if ( type == Type.FILE )
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
package com.github.kr328.clash.common
|
||||
|
||||
import android.app.Application
|
||||
import android.content.Intent
|
||||
|
||||
object Global {
|
||||
var openMainIntent: () -> Intent = { Intent() }
|
||||
var openProfileIntent: (Long) -> Intent = { Intent() }
|
||||
|
||||
lateinit var application: Application
|
||||
private set
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.github.kr328.clash.service
|
||||
|
||||
import android.app.NotificationChannel
|
||||
import android.app.NotificationManager
|
||||
import android.app.PendingIntent
|
||||
import android.content.ComponentName
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
@@ -12,9 +13,11 @@ import android.os.IBinder
|
||||
import android.os.RemoteException
|
||||
import androidx.core.app.NotificationCompat
|
||||
import androidx.core.app.NotificationManagerCompat
|
||||
import com.github.kr328.clash.common.Global
|
||||
import com.github.kr328.clash.common.ids.Intents
|
||||
import com.github.kr328.clash.common.ids.NotificationChannels
|
||||
import com.github.kr328.clash.common.ids.NotificationIds
|
||||
import com.github.kr328.clash.common.ids.PendingIds
|
||||
import com.github.kr328.clash.common.util.intent
|
||||
import com.github.kr328.clash.service.data.ProfileDao
|
||||
import com.github.kr328.clash.service.transact.IStreamCallback
|
||||
@@ -157,6 +160,7 @@ class ProfileBackgroundService : BaseService() {
|
||||
.setContentText(content)
|
||||
.setColor(getColor(R.color.colorAccentService))
|
||||
.setSmallIcon(R.drawable.ic_notification)
|
||||
.setOngoing(true)
|
||||
.setOnlyAlertOnce(true)
|
||||
.setGroup(NotificationChannels.PROFILE_STATUS)
|
||||
.build()
|
||||
@@ -167,6 +171,13 @@ class ProfileBackgroundService : BaseService() {
|
||||
private suspend fun sendUpdateCompleted(id: Long) {
|
||||
val entity = ProfileDao.queryById(id) ?: return
|
||||
|
||||
val intent = PendingIntent.getActivity(
|
||||
this,
|
||||
PendingIds.generateProfileResultId(id),
|
||||
Global.openProfileIntent(id),
|
||||
PendingIntent.FLAG_UPDATE_CURRENT
|
||||
)
|
||||
|
||||
val notification = NotificationCompat.Builder(this, NotificationChannels.PROFILE_RESULT)
|
||||
.setContentTitle(getText(R.string.process_result))
|
||||
.setContentText(getString(R.string.format_update_complete, entity.name))
|
||||
@@ -174,6 +185,8 @@ class ProfileBackgroundService : BaseService() {
|
||||
.setSmallIcon(R.drawable.ic_notification)
|
||||
.setOnlyAlertOnce(true)
|
||||
.setGroup(NotificationChannels.PROFILE_RESULT)
|
||||
.setAutoCancel(true)
|
||||
.setContentIntent(intent)
|
||||
.build()
|
||||
|
||||
NotificationManagerCompat.from(this)
|
||||
@@ -183,6 +196,13 @@ class ProfileBackgroundService : BaseService() {
|
||||
private suspend fun sendUpdateFailed(id: Long, reason: String) {
|
||||
val entity = ProfileDao.queryById(id) ?: return
|
||||
|
||||
val intent = PendingIntent.getActivity(
|
||||
this,
|
||||
PendingIds.generateProfileResultId(id),
|
||||
Global.openProfileIntent(id),
|
||||
PendingIntent.FLAG_UPDATE_CURRENT
|
||||
)
|
||||
|
||||
val notification = NotificationCompat.Builder(this, NotificationChannels.PROFILE_RESULT)
|
||||
.setContentTitle(getString(R.string.format_update_failure, entity.name))
|
||||
.setColor(getColor(R.color.colorAccentService))
|
||||
@@ -190,6 +210,8 @@ class ProfileBackgroundService : BaseService() {
|
||||
.setStyle(NotificationCompat.BigTextStyle().bigText(reason))
|
||||
.setOnlyAlertOnce(true)
|
||||
.setGroup(NotificationChannels.PROFILE_RESULT)
|
||||
.setAutoCancel(true)
|
||||
.setContentIntent(intent)
|
||||
.build()
|
||||
|
||||
NotificationManagerCompat.from(this)
|
||||
|
||||
+2
-6
@@ -5,6 +5,7 @@ import android.app.Service
|
||||
import android.content.Intent
|
||||
import android.os.PowerManager
|
||||
import androidx.core.app.NotificationCompat
|
||||
import com.github.kr328.clash.common.Global
|
||||
import com.github.kr328.clash.common.ids.Intents
|
||||
import com.github.kr328.clash.common.ids.NotificationChannels
|
||||
import com.github.kr328.clash.common.ids.NotificationIds
|
||||
@@ -23,11 +24,6 @@ class DynamicNotificationModule(private val service: Service) : Module() {
|
||||
Intent.ACTION_SCREEN_OFF,
|
||||
Intents.INTENT_ACTION_PROFILE_LOADED
|
||||
)
|
||||
private val contentIntent = Intent(Intent.ACTION_MAIN)
|
||||
.addCategory(Intent.CATEGORY_DEFAULT)
|
||||
.addCategory(Intent.CATEGORY_LAUNCHER)
|
||||
.setPackage(service.packageName)
|
||||
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
|
||||
private val builder = NotificationCompat.Builder(service, NotificationChannels.CLASH_STATUS)
|
||||
.setSmallIcon(R.drawable.ic_notification)
|
||||
.setOngoing(true)
|
||||
@@ -39,7 +35,7 @@ class DynamicNotificationModule(private val service: Service) : Module() {
|
||||
PendingIntent.getActivity(
|
||||
service,
|
||||
NotificationIds.CLASH_STATUS,
|
||||
contentIntent,
|
||||
Global.openMainIntent(),
|
||||
PendingIntent.FLAG_UPDATE_CURRENT
|
||||
)
|
||||
)
|
||||
|
||||
+2
-6
@@ -8,6 +8,7 @@ import android.content.Intent
|
||||
import android.os.Build
|
||||
import androidx.core.app.NotificationCompat
|
||||
import androidx.core.app.NotificationManagerCompat
|
||||
import com.github.kr328.clash.common.Global
|
||||
import com.github.kr328.clash.common.ids.Intents
|
||||
import com.github.kr328.clash.common.ids.NotificationChannels
|
||||
import com.github.kr328.clash.common.ids.NotificationIds
|
||||
@@ -17,11 +18,6 @@ import com.github.kr328.clash.service.ServiceStatusProvider
|
||||
class StaticNotificationModule(private val service: Service) : Module() {
|
||||
override val receiveBroadcasts: Set<String>
|
||||
get() = setOf(Intents.INTENT_ACTION_PROFILE_LOADED)
|
||||
private val contentIntent = Intent(Intent.ACTION_MAIN)
|
||||
.addCategory(Intent.CATEGORY_DEFAULT)
|
||||
.addCategory(Intent.CATEGORY_LAUNCHER)
|
||||
.setPackage(service.packageName)
|
||||
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
|
||||
private val builder = NotificationCompat.Builder(service, NotificationChannels.CLASH_STATUS)
|
||||
.setSmallIcon(R.drawable.ic_notification)
|
||||
.setOngoing(true)
|
||||
@@ -33,7 +29,7 @@ class StaticNotificationModule(private val service: Service) : Module() {
|
||||
PendingIntent.getActivity(
|
||||
service,
|
||||
NotificationIds.CLASH_STATUS,
|
||||
contentIntent,
|
||||
Global.openMainIntent(),
|
||||
PendingIntent.FLAG_UPDATE_CURRENT
|
||||
)
|
||||
)
|
||||
|
||||
@@ -4,6 +4,7 @@ import android.app.PendingIntent
|
||||
import android.content.Intent
|
||||
import android.net.VpnService
|
||||
import android.os.Build
|
||||
import com.github.kr328.clash.common.Global
|
||||
import com.github.kr328.clash.common.ids.PendingIds
|
||||
import com.github.kr328.clash.core.Clash
|
||||
import com.github.kr328.clash.service.util.parseCIDR
|
||||
@@ -23,12 +24,6 @@ class TunModule(private val service: VpnService) : Module() {
|
||||
val disallowApplication: List<String>
|
||||
}
|
||||
|
||||
private val contentIntent = Intent(Intent.ACTION_MAIN)
|
||||
.addCategory(Intent.CATEGORY_DEFAULT)
|
||||
.addCategory(Intent.CATEGORY_LAUNCHER)
|
||||
.setPackage(service.packageName)
|
||||
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
|
||||
|
||||
var configure: Configure? = null
|
||||
|
||||
override suspend fun onStart() {
|
||||
@@ -58,7 +53,7 @@ class TunModule(private val service: VpnService) : Module() {
|
||||
PendingIntent.getActivity(
|
||||
service,
|
||||
PendingIds.CLASH_VPN,
|
||||
contentIntent,
|
||||
Global.openMainIntent(),
|
||||
PendingIntent.FLAG_UPDATE_CURRENT
|
||||
)
|
||||
)
|
||||
|
||||
Reference in new issue
Block a user