Skip to content

Commit

Permalink
feat: updater changelogs (#48)
Browse files Browse the repository at this point in the history

---------

Co-authored-by: Aunali321 <aunvakil.aa@gmail.com>
  • Loading branch information
Axelen123 and Aunali321 committed Jul 7, 2023
1 parent 62e2937 commit d611ae7
Show file tree
Hide file tree
Showing 21 changed files with 528 additions and 155 deletions.
3 changes: 3 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ dependencies {
//implementation("com.google.accompanist:accompanist-systemuicontroller:$accompanistVersion")
//implementation("com.google.accompanist:accompanist-placeholder-material:$accompanistVersion")
implementation("com.google.accompanist:accompanist-drawablepainter:$accompanistVersion")
implementation("com.google.accompanist:accompanist-webview:$accompanistVersion")
//implementation("com.google.accompanist:accompanist-flowlayout:$accompanistVersion")
//implementation("com.google.accompanist:accompanist-permissions:$accompanistVersion")

Expand Down Expand Up @@ -128,4 +129,6 @@ dependencies {
implementation("io.ktor:ktor-client-content-negotiation:$ktorVersion")
implementation("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion")

// Markdown to HTML
implementation("org.jetbrains:markdown:0.4.1")
}
6 changes: 2 additions & 4 deletions app/src/main/java/app/revanced/manager/di/RepositoryModule.kt
Original file line number Diff line number Diff line change
@@ -1,17 +1,15 @@
package app.revanced.manager.di

import app.revanced.manager.data.platform.FileSystem
import app.revanced.manager.domain.repository.PatchSelectionRepository
import app.revanced.manager.domain.repository.ReVancedRepository
import app.revanced.manager.domain.repository.*
import app.revanced.manager.network.api.ManagerAPI
import app.revanced.manager.domain.repository.SourcePersistenceRepository
import app.revanced.manager.domain.repository.SourceRepository
import app.revanced.manager.domain.worker.WorkerRepository
import org.koin.core.module.dsl.singleOf
import org.koin.dsl.module

val repositoryModule = module {
singleOf(::ReVancedRepository)
singleOf(::GithubRepository)
singleOf(::ManagerAPI)
singleOf(::FileSystem)
singleOf(::SourcePersistenceRepository)
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/java/app/revanced/manager/di/ServiceModule.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package app.revanced.manager.di

import app.revanced.manager.network.service.GithubService
import app.revanced.manager.network.service.HttpService
import app.revanced.manager.network.service.ReVancedService
import org.koin.core.module.dsl.singleOf
Expand All @@ -16,4 +17,5 @@ val serviceModule = module {

single { provideReVancedService(get()) }
singleOf(::HttpService)
singleOf(::GithubService)
}
3 changes: 2 additions & 1 deletion app/src/main/java/app/revanced/manager/di/ViewModelModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ val viewModelModule = module {
viewModelOf(::AppSelectorViewModel)
viewModelOf(::SourcesViewModel)
viewModelOf(::InstallerViewModel)
viewModelOf(::UpdateSettingsViewModel)
viewModelOf(::UpdateProgressViewModel)
viewModelOf(::ManagerUpdateChangelogViewModel)
viewModelOf(::ImportExportViewModel)
viewModelOf(::ContributorViewModel)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package app.revanced.manager.domain.repository

import app.revanced.manager.network.service.GithubService

class GithubRepository(private val service: GithubService) {
suspend fun getChangelog(repo: String) = service.getChangelog(repo)
}
19 changes: 4 additions & 15 deletions app/src/main/java/app/revanced/manager/network/api/ManagerAPI.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import io.ktor.utils.io.*
import java.io.File

class ManagerAPI(
private val app: Application,
private val client: HttpClient,
private val revancedRepository: ReVancedRepository
) {
Expand All @@ -27,7 +26,7 @@ class ManagerAPI(

private suspend fun downloadAsset(downloadUrl: String, saveLocation: File) {
client.get(downloadUrl) {
onDownload { bytesSentTotal, contentLength, ->
onDownload { bytesSentTotal, contentLength ->
downloadProgress = (bytesSentTotal.toFloat() / contentLength.toFloat())
downloadedSize = bytesSentTotal
totalSize = contentLength
Expand All @@ -51,19 +50,9 @@ class ManagerAPI(
return patchBundleAsset.version to integrationsAsset.version
}

suspend fun downloadManager(): File? {
try {
val managerAsset = revancedRepository.findAsset(ghManager, ".apk")
val managerFile = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).also { it.mkdirs() }
.resolve("revanced-manager.apk")
downloadAsset(managerAsset.downloadUrl, managerFile)
println("Downloaded manager at ${managerFile.absolutePath}")
return managerFile
} catch (e: Exception) {
Log.e(tag, "Failed to download manager", e)
app.toast("Failed to download manager")
}
return null
suspend fun downloadManager(location: File) {
val managerAsset = revancedRepository.findAsset(ghManager, ".apk")
downloadAsset(managerAsset.downloadUrl, location)
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package app.revanced.manager.network.dto

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class GithubChangelog(
@SerialName("tag_name") val version: String,
@SerialName("body") val body: String,
@SerialName("assets") val assets: List<GithubAsset>
)

@Serializable
data class GithubAsset(
@SerialName("download_count") val downloadCount: Int,
)
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ import kotlinx.serialization.Serializable

@Serializable
class ReVancedReleases(
@SerialName("tools") val tools: List<Assets>,
@SerialName("tools") val tools: List<Asset>,
)

@Serializable
class Assets(
class Asset(
@SerialName("repository") val repository: String,
@SerialName("version") val version: String,
@SerialName("timestamp") val timestamp: String,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package app.revanced.manager.network.service

import app.revanced.manager.network.dto.GithubChangelog
import app.revanced.manager.network.utils.APIResponse
import io.ktor.client.request.url
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext

class GithubService(private val client: HttpService) {
suspend fun getChangelog(repo: String): APIResponse<GithubChangelog> = withContext(Dispatchers.IO) {
client.request {
url("https://api.github.com/repos/revanced/$repo/releases/latest")
}
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package app.revanced.manager.network.service

import app.revanced.manager.network.api.MissingAssetException
import app.revanced.manager.network.dto.Assets
import app.revanced.manager.network.dto.Asset
import app.revanced.manager.network.dto.ReVancedReleases
import app.revanced.manager.network.dto.ReVancedRepositories
import app.revanced.manager.network.utils.APIResponse
Expand Down Expand Up @@ -30,14 +30,14 @@ class ReVancedService(
}
}

suspend fun findAsset(repo: String, file: String): Assets {
suspend fun findAsset(repo: String, file: String): Asset {
val releases = getAssets().getOrThrow()

val asset = releases.tools.find { asset ->
(asset.name.contains(file) && asset.repository.contains(repo))
} ?: throw MissingAssetException()

return Assets(asset.repository, asset.version, asset.timestamp, asset.name,asset.size, asset.downloadUrl, asset.content_type)
return asset
}

private companion object {
Expand Down
112 changes: 112 additions & 0 deletions app/src/main/java/app/revanced/manager/ui/component/Markdown.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
package app.revanced.manager.ui.component

import android.annotation.SuppressLint
import android.view.MotionEvent
import android.view.ViewGroup
import android.webkit.WebResourceRequest
import android.webkit.WebView
import androidx.compose.foundation.background
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import app.revanced.manager.util.hexCode
import app.revanced.manager.util.openUrl
import com.google.accompanist.web.AccompanistWebViewClient
import com.google.accompanist.web.WebView
import com.google.accompanist.web.rememberWebViewStateWithHTMLData

@Composable
@SuppressLint("ClickableViewAccessibility")
fun Markdown(
text: String,
modifier: Modifier = Modifier
) {
val ctx = LocalContext.current
val state = rememberWebViewStateWithHTMLData(data = generateMdHtml(source = text))
val client = remember {
object : AccompanistWebViewClient() {
override fun shouldOverrideUrlLoading(
view: WebView?,
request: WebResourceRequest?
): Boolean {
if (request != null) ctx.openUrl(request.url.toString())
return true
}
}
}

WebView(
state,
modifier = Modifier
.background(Color.Transparent)
.then(modifier),
client = client,
onCreated = {
it.setBackgroundColor(android.graphics.Color.TRANSPARENT)
it.isVerticalScrollBarEnabled = false
it.isHorizontalScrollBarEnabled = false
it.setOnTouchListener { _, event -> event.action == MotionEvent.ACTION_MOVE }
it.layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
}
)
}

@Composable
fun generateMdHtml(
source: String,
wrap: Boolean = false,
headingColor: Color = MaterialTheme.colorScheme.onSurface,
textColor: Color = MaterialTheme.colorScheme.onSurfaceVariant,
linkColor: Color = MaterialTheme.colorScheme.primary
) = remember(source, wrap, headingColor, textColor, linkColor) {
"""<html>
<head>
<meta charset="utf-8" />
<title>Markdown</title>
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"/>
<style>
body {
color: #${textColor.hexCode};
}
a {
color: #${linkColor.hexCode}!important;
}
a.anchor {
display: none;
}
.highlight pre, pre {
word-wrap: ${if (wrap) "break-word" else "normal"};
white-space: ${if (wrap) "pre-wrap" else "pre"};
}
h2 {
color: #${headingColor.hexCode};
font-size: 18px;
font-weight: 500;
line-height: 24px;
letter-spacing: 0.15px;
}
ul {
margin-left: 0px;
padding-left: 18px;
}
li {
margin-left: 2px;
}
::marker {
font-size: 16px;
margin-right: 8px;
color: #${textColor.hexCode};
}
</style>
</head>
<body>
$source
</body>
</html>"""
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ sealed interface SettingsDestination : Parcelable {
@Parcelize
object UpdateProgress : SettingsDestination

@Parcelize
object UpdateChangelog : SettingsDestination

@Parcelize
object Contributors: SettingsDestination

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ import app.revanced.manager.R
import app.revanced.manager.ui.component.AppTopBar
import app.revanced.manager.ui.destination.SettingsDestination
import app.revanced.manager.ui.screen.settings.*
import app.revanced.manager.ui.screen.settings.update.ManagerUpdateChangelog
import app.revanced.manager.ui.screen.settings.update.UpdateProgressScreen
import app.revanced.manager.ui.screen.settings.update.UpdatesSettingsScreen
import app.revanced.manager.ui.viewmodel.SettingsViewModel
import dev.olshevski.navigation.reimagined.*
import org.koin.androidx.compose.getViewModel
Expand Down Expand Up @@ -98,7 +101,8 @@ fun SettingsScreen(

is SettingsDestination.Updates -> UpdatesSettingsScreen(
onBackClick = { navController.pop() },
navController = navController
onChangelogClick = { navController.navigate(SettingsDestination.UpdateChangelog) },
onUpdateClick = { navController.navigate(SettingsDestination.UpdateProgress) }
)

is SettingsDestination.Downloads -> DownloadsSettingsScreen(
Expand All @@ -119,6 +123,10 @@ fun SettingsScreen(
{ navController.pop() },
)

is SettingsDestination.UpdateChangelog -> ManagerUpdateChangelog(
onBackClick = { navController.pop() },
)

is SettingsDestination.Contributors -> ContributorScreen(
onBackClick = { navController.pop() },
)
Expand Down
Loading

0 comments on commit d611ae7

Please sign in to comment.