build: move RemoteService to extension-runtime.

This commit is contained in:
oxy-macmini
2025-04-06 16:23:01 +08:00
parent 5ee02bac82
commit a663616c94
14 changed files with 51 additions and 56 deletions

View File

@ -79,7 +79,7 @@
android:launchMode="singleInstance"
android:theme="@style/Theme.M3U" />
<service
android:name="com.m3u.extension.api.RemoteService"
android:name="com.m3u.extension.runtime.RemoteService"
android:exported="true"
android:foregroundServiceType="mediaPlayback"
android:permission="${applicationId}.permission.CONNECT_EXTENSION_PLUGIN">

View File

@ -5,7 +5,7 @@ import androidx.hilt.work.HiltWorkerFactory
import androidx.work.Configuration
import com.m3u.core.architecture.logger.Logger
import com.m3u.core.architecture.preferences.Preferences
import com.m3u.core.util.context.ContextUtils
import com.m3u.extension.runtime.Utils
import com.m3u.smartphone.ui.business.crash.CrashHandler
import dagger.hilt.android.HiltAndroidApp
import javax.inject.Inject
@ -29,7 +29,7 @@ class M3UApplication : Application(), Configuration.Provider {
override fun onCreate() {
super.onCreate()
ContextUtils.init(this)
Utils.init(this)
Thread.setDefaultUncaughtExceptionHandler(handler)
// ResponseBodies.WebPage
// .onEach {

View File

@ -3,12 +3,11 @@ package com.m3u.tv
import android.app.Application
import androidx.hilt.work.HiltWorkerFactory
import androidx.work.Configuration
import com.m3u.core.util.context.ContextUtils
import dagger.hilt.android.HiltAndroidApp
import javax.inject.Inject
@HiltAndroidApp
class M3UApplication: Application(), Configuration.Provider {
class M3UApplication : Application(), Configuration.Provider {
@Inject
lateinit var workerFactory: HiltWorkerFactory
@ -20,6 +19,5 @@ class M3UApplication: Application(), Configuration.Provider {
override fun onCreate() {
super.onCreate()
ContextUtils.init(this)
}
}

View File

@ -1,14 +0,0 @@
package com.m3u.core.util.context
import android.app.Application
import android.content.Context
object ContextUtils {
private lateinit var context: Application
fun init(applicationContext: Application) {
this.context = applicationContext
}
fun getContext(): Context {
return context
}
}

View File

@ -8,7 +8,6 @@ import android.os.IBinder
import android.util.Log
import com.m3u.data.extension.IRemoteCallback
import com.m3u.data.extension.IRemoteService
import com.m3u.extension.api.Utils.getAdapter
import com.m3u.extension.api.Utils.getRealParameterizedType
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
@ -56,7 +55,7 @@ class RemoteClient {
accessKey: String
) {
Log.d(TAG, "connect")
val intent = Intent(context, RemoteService::class.java).apply {
val intent = Intent().apply {
action = targetPermission
component = ComponentName(targetPackageName, targetClassName)
putExtra(CallTokenConst.ACCESS_KEY, accessKey)
@ -83,6 +82,7 @@ class RemoteClient {
Log.d(TAG, "onSuccess: $method, $param")
cont.resume(param)
}
override fun onError(
module: String,
method: String,
@ -121,13 +121,14 @@ class RemoteClient {
} else {
// param type
val adapter = adapters.getOrPut(args[0]::class.java.typeName) {
getAdapter(args[0]::class.java.typeName)
Utils.getAdapter(args[0]::class.java.typeName)
}
Utils.encode(adapter, args[0])
}
val returnType = (parameters.last().getRealParameterizedType() as Class<*>).name
val returnType =
(parameters.last().getRealParameterizedType() as Class<*>).name
val adapter = adapters.getOrPut(returnType) {
getAdapter(returnType)
Utils.getAdapter(returnType)
}
val response = call(moduleName, methodName, bytes)
Utils.decode(adapter, response)
@ -141,13 +142,13 @@ class RemoteClient {
} else {
// param type
val adapter = adapters.getOrPut(args[0]::class.java.typeName) {
getAdapter(args[0]::class.java.typeName)
Utils.getAdapter(args[0]::class.java.typeName)
}
Utils.encode(adapter, args[0])
}
val returnType = (parameters.last().getRealParameterizedType() as Class<*>).name
val adapter = adapters.getOrPut(returnType) {
getAdapter(returnType)
Utils.getAdapter(returnType)
}
val response = runBlocking { call(moduleName, methodName, bytes) }
Utils.decode(adapter, response)

View File

@ -1,6 +0,0 @@
package com.m3u.extension.api
interface RemoteServiceDependencies {
val playlistDao: Any
val channelDao: Any
}

View File

@ -1,4 +1,4 @@
package com.m3u.extension.api
package com.m3u.extension.runtime
import com.m3u.data.extension.IRemoteCallback

View File

@ -4,9 +4,6 @@ import com.google.auto.service.AutoService
import com.m3u.data.extension.IRemoteCallback
import com.m3u.extension.api.Method
import com.m3u.extension.api.Module
import com.m3u.extension.api.OnRemoteCall
import com.m3u.extension.api.RemoteCallException
import com.m3u.extension.api.RemoteServiceDependencies
import com.m3u.extension.api.Samplings
import com.m3u.extension.api.Utils
import com.m3u.extension.api.Utils.getAdapter
@ -29,9 +26,7 @@ class OnRemoteCallImpl : OnRemoteCall {
modules = { remoteModules.keys.toList() },
methods = { module -> remoteMethods[module]?.map { it.key }.orEmpty() }
),
SubscribeModule(
dependencies = dependencies
)
SubscribeModule(dependencies)
)
.associateBy {
checkNotNull(it::class.findAnnotation<Module>()) {

View File

@ -1,4 +1,4 @@
package com.m3u.extension.api
package com.m3u.extension.runtime
import android.app.NotificationChannel
import android.app.NotificationManager

View File

@ -0,0 +1,9 @@
package com.m3u.extension.runtime
import com.m3u.data.database.dao.ChannelDao
import com.m3u.data.database.dao.PlaylistDao
interface RemoteServiceDependencies {
val playlistDao: PlaylistDao
val channelDao: ChannelDao
}

View File

@ -1,10 +1,8 @@
package com.m3u.data
package com.m3u.extension.runtime
import com.google.auto.service.AutoService
import com.m3u.core.util.context.ContextUtils
import com.m3u.data.database.dao.ChannelDao
import com.m3u.data.database.dao.PlaylistDao
import com.m3u.extension.api.RemoteServiceDependencies
import dagger.hilt.InstallIn
import dagger.hilt.android.EntryPointAccessors
import dagger.hilt.components.SingletonComponent
@ -20,11 +18,11 @@ class RemoteServiceDependenciesImpl : RemoteServiceDependencies {
private val entryPoint: EntryPoint by lazy {
EntryPointAccessors.fromApplication(
ContextUtils.getContext(),
Utils.getContext(),
EntryPoint::class.java
)
}
override val playlistDao: Any = entryPoint.playlistDao
override val channelDao: Any = entryPoint.channelDao
override val playlistDao: PlaylistDao = entryPoint.playlistDao
override val channelDao: ChannelDao = entryPoint.channelDao
}

View File

@ -1,16 +1,29 @@
package com.m3u.extension.runtime
internal object Utils {
fun Result<*>.asProtoResult(): com.m3u.extension.api.model.Result {
import android.app.Application
import android.content.Context
import com.m3u.extension.api.model.Result as ProtoResult
object Utils {
internal fun Result<*>.asProtoResult(): ProtoResult {
return if (isSuccess) {
com.m3u.extension.api.model.Result(
ProtoResult(
success = true
)
} else {
com.m3u.extension.api.model.Result(
ProtoResult(
success = false,
message = this.exceptionOrNull()?.message
)
}
}
private lateinit var context: Application
fun init(applicationContext: Application) {
this.context = applicationContext
}
fun getContext(): Context {
return context
}
}

View File

@ -16,10 +16,11 @@ class InfoModule(
@Method("getAppInfo")
override suspend fun getAppInfo(): GetAppInfoResponse {
return GetAppInfoResponse(
app_id = "com.m3u.extension.runtime",
app_id = "com.m3u.smartphone",
app_version = "InfoModule",
app_name = "M3U",
app_description = "Powerful Media Player"
app_description = "Powerful Media Player",
app_package_name = "com.m3u.smartphone"
)
}

View File

@ -6,19 +6,19 @@ import com.m3u.data.database.model.Channel
import com.m3u.data.database.model.Playlist
import com.m3u.extension.api.Method
import com.m3u.extension.api.Module
import com.m3u.extension.api.RemoteServiceDependencies
import com.m3u.extension.api.business.SubscribeApi
import com.m3u.extension.api.model.AddChannelRequest
import com.m3u.extension.api.model.AddPlaylistRequest
import com.m3u.extension.api.model.Result
import com.m3u.extension.runtime.RemoteServiceDependencies
import kotlinx.coroutines.Dispatchers
@Module("subscribe")
class SubscribeModule(
dependencies: RemoteServiceDependencies
) : RemoteModule(Dispatchers.IO), SubscribeApi {
private val playlistDao: PlaylistDao = dependencies.playlistDao as PlaylistDao
private val channelDao: ChannelDao = dependencies.channelDao as ChannelDao
private val playlistDao: PlaylistDao = dependencies.playlistDao
private val channelDao: ChannelDao = dependencies.channelDao
@Method("addPlaylist")
override suspend fun addPlaylist(req: AddPlaylistRequest): Result = result {