Skip to content

Commit

Permalink
修正viewmodel实例导致的错误.
Browse files Browse the repository at this point in the history
添加DownloadReceiver, 由于hilt编译问题, 暂时注释.
恢复检查更新功能

Signed-off-by: 子斗子 <[email protected]>
  • Loading branch information
ZIDOUZI committed Nov 23, 2023
1 parent fcf4fcc commit b47a5be
Show file tree
Hide file tree
Showing 17 changed files with 135 additions and 78 deletions.
13 changes: 13 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -112,8 +112,21 @@ dependencies {
kapt(libs.bundles.hilt.kapt)

testImplementation(libs.bundles.test)
kaptTest(libs.bundles.hilt.kapt)

androidTestImplementation(libs.bundles.android.test)
androidTestImplementation(platform(libs.compose.bom))
androidTestImplementation(libs.ui.test.junit4)
kaptAndroidTest(libs.bundles.hilt.kapt)

debugImplementation(libs.bundles.compose.debug)
kaptDebug(libs.bundles.hilt.kapt)
}

kapt {
correctErrorTypes = true
}

hilt {
enableAggregatingTask = true
}
32 changes: 19 additions & 13 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,16 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<!--获取网络访问权限-->
<uses-permission-sdk-23 android:name="android.permission.INTERNET" />
<!--获取安装软件权限-->
<uses-permission-sdk-23 android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

<!--获取图像数据权限-->
<!-- 获取网络访问权限 -->
<uses-permission-sdk-23 android:name="android.permission.INTERNET" /> <!-- 获取安装软件权限 -->
<uses-permission-sdk-23 android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> <!-- 获取图像数据权限 -->
<permission
android:name="${applicationId}.permission.GET_IMAGE_DATE"
android:description="@string/permission_get_image_date"
android:protectionLevel="normal" />

<application
android:name="zdz.imageURL.App"
android:name=".App"
android:allowBackup="true"
android:allowTaskReparenting="false"
android:dataExtractionRules="@xml/data_extraction_rules"
Expand All @@ -26,22 +23,27 @@
android:supportsRtl="true"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
tools:targetApi="31">
<!--<receiver
android:name=".receive.DownloadReceiver"
android:enabled="true"
android:exported="false" />-->

<activity
android:name="zdz.imageURL.activity.main.MainActivity"
android:name=".activity.main.MainActivity"
android:exported="true"
android:theme="@android:style/Theme.Translucent.NoTitleBar">
<tools:validation testUrl="https://i.pximg.net/img-original/img/2022/08/24/19/28/12/100731043_p0.jpg" />

<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

<intent-filter>
<action android:name="android.intent.action.APPLICATION_PREFERENCES" />

<category android:name="android.intent.category.DEFAULT" />
</intent-filter>

<intent-filter>
<action android:name="android.intent.action.VIEW" />

Expand All @@ -53,19 +55,20 @@
<data android:host="i.pximg.net" />
<data android:host="mp.weixin.qq.com" />
</intent-filter>

<intent-filter>
<action android:name="android.intent.action.SEND" />

<category android:name="android.intent.category.DEFAULT" />

<data android:mimeType="text/plain" />
</intent-filter>

<intent-filter>
<action android:name="android.intent.action.PROCESS_TEXT" />

<category android:name="android.intent.category.DEFAULT" />

<data android:mimeType="text/plain" />
</intent-filter>

<intent-filter>
<action android:name="android.intent.action.PASTE" />
</intent-filter>
Expand All @@ -74,6 +77,7 @@
android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
</activity>

<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileProvider"
Expand All @@ -83,6 +87,7 @@
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_path" />
</provider>

<service
android:name=".service.PasteTileService"
android:exported="true"
Expand All @@ -92,6 +97,7 @@
<intent-filter>
<action android:name="android.service.quicksettings.action.QS_TILE" />
</intent-filter>

<meta-data
android:name="android.service.quicksettings.ACTIVE_TILE"
android:value="true" />
Expand Down
45 changes: 25 additions & 20 deletions app/src/main/java/zdz/imageURL/activity/main/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import androidx.lifecycle.lifecycleScope
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import zdz.imageURL.R
import zdz.imageURL.ui.MainNav
import zdz.imageURL.ui.main.Main
import zdz.imageURL.ui.theme.ImageURLTheme
import zdz.imageURL.utils.toast
Expand All @@ -26,41 +25,47 @@ class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

val startDestination = if (handleLaunchIntent() == null) MainNav.SETTINGS else MainNav.MAIN
lifecycleScope.launch {
vm.run {
process(this@MainActivity)
if (imgUrl == null && pf.autoJump.current() && pf.closeAfterProcess.current()) {
toast(getString(R.string.redirect_toast, sourceUrl))
finishAndRemoveTask()
}
}
}
val startDestination =
if (vm.handleLaunchIntent() == null) MainNav.SETTINGS else MainNav.MAIN

setContent {
ImageURLTheme(
darkTheme = vm.pf.darkTheme.state,
alpha = vm.pf.alpha.state,
) {
Main(startDestination = startDestination)
Main(vm = vm, startDestination = startDestination)
}
}

vm.getRootDir(this)
lifecycleScope.launch {
if (intent.action != Intent.ACTION_MAIN && intent.action != Intent.ACTION_APPLICATION_PREFERENCES)
vm.onLaunch()
if (vm.pf.autoCheck.current()) vm.checkUpdate()
}
}

private suspend fun MainViewModel.onLaunch() {
process(this@MainActivity)
if (imgUrl == null && pf.autoJump.current() && pf.closeAfterProcess.current()) {
toast(getString(R.string.redirect_toast, sourceUrl))
finishAndRemoveTask()
}
}

private fun handleLaunchIntent(): Unit? = intent.run l@{
private fun MainViewModel.handleLaunchIntent(): Unit? = intent.run l@{
// Debug.waitForDebugger()
when (action) {
Intent.ACTION_SEND -> getStringExtra(Intent.EXTRA_TEXT)?.takeIf { type == "text/plain" }
?.let { vm.text = it } ?: toast(shareError)
?.let { text = it } ?: toast(shareError)

Intent.ACTION_PROCESS_TEXT -> getStringExtra(Intent.EXTRA_PROCESS_TEXT)
?.let { vm.text = it } ?: toast(shareError)
Intent.ACTION_PROCESS_TEXT -> getStringExtra(Intent.EXTRA_PROCESS_TEXT)?.let {
text = it
} ?: toast(shareError)

Intent.ACTION_VIEW -> data?.toString()?.takeUnless { it.isBlank() }
?.let { vm.text = it } ?: toast(shareError)
Intent.ACTION_VIEW -> data?.toString()?.takeUnless { it.isBlank() }?.let { text = it }
?: toast(shareError)

Intent.ACTION_PASTE -> vm.processClipboard() ?: toast(shareError)
Intent.ACTION_PASTE -> processClipboard() ?: toast(shareError)

Intent.ACTION_APPLICATION_PREFERENCES -> return null

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package zdz.imageURL.ui
package zdz.imageURL.activity.main

import androidx.annotation.DrawableRes
import androidx.annotation.StringRes
Expand Down
15 changes: 14 additions & 1 deletion app/src/main/java/zdz/imageURL/activity/main/MainViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,20 @@ class MainViewModel @Inject constructor(

var error by mutableStateOf(true)

suspend fun getData(): Data = client.get(updateUrl).body<Data>()
var data: Data? by mutableStateOf(null)

suspend fun checkUpdate() = try {
logger.measureTimeMillis("get remove info in %d millis time") {
getData().also { data = it }
}.run {
isOutOfData()
}
} catch (e: Throwable) {
logger.e(e)
null
}

private suspend fun getData(): Data = client.get(updateUrl).body<Data>()

private var rootDir: DocumentFile? = null

Expand Down
6 changes: 4 additions & 2 deletions app/src/main/java/zdz/imageURL/model/data/Prefer.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import javax.inject.Singleton
@Singleton
class Prefer @Inject constructor(
@ApplicationContext context: Context,
private val ds: DataStore<Preferences>,
ds: DataStore<Preferences>,
) {
val darkTheme by ds.boolean()
val alpha by ds[1f]
Expand All @@ -32,12 +32,14 @@ class Prefer @Inject constructor(
val imageChooser by ds[false]
val urlChooser by ds[false]
val jumpChooser by ds[true]
val installerChooser by ds[false]

// 缓存图片查看, url打开, 自动跳转打开
val chooseOpener = listOf(
imageChooser to context.getString(R.string.image_chooser),
urlChooser to context.getString(R.string.url_chooser),
jumpChooser to context.getString(R.string.jump_chooser)
jumpChooser to context.getString(R.string.jump_chooser),
installerChooser to context.getString(R.string.installer_chooser),
)
val preferredMimeType by ds.enum<Bitmap.CompressFormat>()

Expand Down
27 changes: 27 additions & 0 deletions app/src/main/java/zdz/imageURL/receive/DownloadReceiver.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package zdz.imageURL.receive

/*
@AndroidEntryPoint
class DownloadReceiver @Inject constructor(
private val downloader: DownloadManager,
private val pf: Prefer,
) : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action != DownloadManager.ACTION_DOWNLOAD_COMPLETE) return
val id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1)
if (id == -1L) return
val cursor = downloader.query(DownloadManager.Query().setFilterById(id))
val status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS))
if (status != DownloadManager.STATUS_SUCCESSFUL) return
val uri = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI))
context.viewContent(
Uri.parse(uri),
mimeType = "application/vnd.android.package-archive",
choose = pf.installerChooser.value
)
cursor.close()
}
}*/
// TODO: cannot compile
3 changes: 1 addition & 2 deletions app/src/main/java/zdz/imageURL/ui/main/Home.kt
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.hilt.navigation.compose.hiltViewModel
import coil.compose.AsyncImage
import com.google.accompanist.adaptive.SplitResult
import com.google.accompanist.adaptive.TwoPane
Expand All @@ -56,7 +55,7 @@ import kotlin.random.Random

@Composable
fun Home(
vm: MainViewModel = hiltViewModel(),
vm: MainViewModel,
ctx: Context = LocalContext.current,
queryRoot: () -> Unit = {},
) {
Expand Down
3 changes: 1 addition & 2 deletions app/src/main/java/zdz/imageURL/ui/main/Logs.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,14 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import zdz.imageURL.R
import zdz.imageURL.activity.main.MainViewModel
import zdz.libs.compose.ex.Heading
import zdz.libs.compose.ex.Title
import zdz.libs.compose.ex.str

@Composable
fun Logs(vm: MainViewModel = hiltViewModel()) {
fun Logs(vm: MainViewModel) {
Title(
modifier = Modifier.padding(12.dp),
heading = { Heading(title = R.string.log.str) }
Expand Down
36 changes: 10 additions & 26 deletions app/src/main/java/zdz/imageURL/ui/main/Main.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,10 @@ import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.sp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState
Expand All @@ -27,43 +23,31 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import zdz.imageURL.BuildConfig
import zdz.imageURL.R
import zdz.imageURL.activity.main.MainNav
import zdz.imageURL.activity.main.MainViewModel
import zdz.imageURL.model.data.Data
import zdz.imageURL.ui.MainNav
import zdz.imageURL.utils.OpenDocumentTree
import zdz.libs.compose.ex.AlertDialog
import zdz.libs.compose.ex.icon
import zdz.libs.compose.ex.str

@Composable
fun Main(vm: MainViewModel = hiltViewModel(), startDestination: MainNav, ctx: Context = LocalContext.current) {
fun Main(vm: MainViewModel, startDestination: MainNav, ctx: Context = LocalContext.current) {

val launcher = rememberLauncherForActivityResult(contract = OpenDocumentTree) { closure ->
vm.getRootDir(ctx)?.uri.let { closure(ctx, it) }
}

val scope = rememberCoroutineScope()
var data: Data? by remember { mutableStateOf(null) }

suspend fun checkUpdate() = try {
vm.logger.measureTimeMillis("get remove info in %d millis time") {
vm.getData()
}.run {
isOutOfData().also { if (it) data = this }
}
} catch (e: Throwable) {
vm.logger.e(e)
null
}

data?.let {
AlertDialog(confirmLabel = R.string.confirm.str,
vm.data?.let {
AlertDialog(
confirmLabel = R.string.confirm.str,
onConfirm = {
scope.launch(Dispatchers.IO) { vm.downloadUpdate(it, ctx = ctx) }
data = null
vm.data = null
},
dismissLabel = R.string.cancel.str,
onDismiss = { data = null },
onDismiss = { vm.data = null },
title = R.string.find_update.str,
content = {
Text(R.string.dialog_text.str.format(BuildConfig.VERSION, it.tagName, it.name))
Expand Down Expand Up @@ -91,12 +75,12 @@ fun Main(vm: MainViewModel = hiltViewModel(), startDestination: MainNav, ctx: Co
navController = navCtrl,
startDestination = startDestination.name
) {
composable(MainNav.MAIN.name) { Home(queryRoot = launcher::launch) }
composable(MainNav.MAIN.name) { Home(vm = vm, queryRoot = launcher::launch) }
composable(MainNav.HELP.name) { Help() }
composable(MainNav.SETTINGS.name) {
Settings(launcher::launch, checkUpdate = ::checkUpdate)
Settings(queryRoot = launcher::launch, vm = vm, checkUpdate = vm::checkUpdate)
}
composable(MainNav.LOG.name) { Logs() }
composable(MainNav.LOG.name) { Logs(vm = vm) }
}
}
}
Loading

0 comments on commit b47a5be

Please sign in to comment.