Rename RY component

This commit is contained in:
Ash 2022-05-21 18:42:27 +08:00
parent efdff0e49c
commit 647ef7a0bd
42 changed files with 427 additions and 107 deletions

View File

@ -0,0 +1,321 @@
{
"formatVersion": 1,
"database": {
"version": 2,
"identityHash": "98462c2e9c32394054102313366e7262",
"entities": [
{
"tableName": "account",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT NOT NULL, `type` INTEGER NOT NULL, `updateAt` INTEGER)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "type",
"columnName": "type",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "updateAt",
"columnName": "updateAt",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "feed",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `icon` TEXT, `url` TEXT NOT NULL, `groupId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `isNotification` INTEGER NOT NULL DEFAULT false, `isFullContent` INTEGER NOT NULL DEFAULT false, PRIMARY KEY(`id`), FOREIGN KEY(`groupId`) REFERENCES `group`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "icon",
"columnName": "icon",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "url",
"columnName": "url",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "groupId",
"columnName": "groupId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "accountId",
"columnName": "accountId",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isNotification",
"columnName": "isNotification",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "false"
},
{
"fieldPath": "isFullContent",
"columnName": "isFullContent",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "false"
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
},
"indices": [
{
"name": "index_feed_groupId",
"unique": false,
"columnNames": [
"groupId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_feed_groupId` ON `${TABLE_NAME}` (`groupId`)"
},
{
"name": "index_feed_accountId",
"unique": false,
"columnNames": [
"accountId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_feed_accountId` ON `${TABLE_NAME}` (`accountId`)"
}
],
"foreignKeys": [
{
"table": "group",
"onDelete": "CASCADE",
"onUpdate": "CASCADE",
"columns": [
"groupId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "article",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `date` INTEGER NOT NULL, `title` TEXT NOT NULL, `author` TEXT, `rawDescription` TEXT NOT NULL, `shortDescription` TEXT NOT NULL, `fullContent` TEXT, `img` TEXT, `link` TEXT NOT NULL, `feedId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `isUnread` INTEGER NOT NULL DEFAULT true, `isStarred` INTEGER NOT NULL DEFAULT false, `isReadLater` INTEGER NOT NULL DEFAULT false, PRIMARY KEY(`id`), FOREIGN KEY(`feedId`) REFERENCES `feed`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "date",
"columnName": "date",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "title",
"columnName": "title",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "author",
"columnName": "author",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "rawDescription",
"columnName": "rawDescription",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "shortDescription",
"columnName": "shortDescription",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "fullContent",
"columnName": "fullContent",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "img",
"columnName": "img",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "link",
"columnName": "link",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "feedId",
"columnName": "feedId",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "accountId",
"columnName": "accountId",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "isUnread",
"columnName": "isUnread",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "true"
},
{
"fieldPath": "isStarred",
"columnName": "isStarred",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "false"
},
{
"fieldPath": "isReadLater",
"columnName": "isReadLater",
"affinity": "INTEGER",
"notNull": true,
"defaultValue": "false"
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
},
"indices": [
{
"name": "index_article_feedId",
"unique": false,
"columnNames": [
"feedId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_article_feedId` ON `${TABLE_NAME}` (`feedId`)"
},
{
"name": "index_article_accountId",
"unique": false,
"columnNames": [
"accountId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_article_accountId` ON `${TABLE_NAME}` (`accountId`)"
}
],
"foreignKeys": [
{
"table": "feed",
"onDelete": "CASCADE",
"onUpdate": "CASCADE",
"columns": [
"feedId"
],
"referencedColumns": [
"id"
]
}
]
},
{
"tableName": "group",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `accountId` INTEGER NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "accountId",
"columnName": "accountId",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": false,
"columnNames": [
"id"
]
},
"indices": [
{
"name": "index_group_accountId",
"unique": false,
"columnNames": [
"accountId"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_group_accountId` ON `${TABLE_NAME}` (`accountId`)"
}
],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '98462c2e9c32394054102313366e7262')"
]
}
}

View File

@ -6,7 +6,7 @@
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<application <application
android:name=".App" android:name=".RYApp"
android:allowBackup="true" android:allowBackup="true"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
android:label="@string/read_you" android:label="@string/read_you"

View File

@ -12,9 +12,9 @@ import kotlinx.coroutines.launch
import me.ash.reader.data.module.ApplicationScope import me.ash.reader.data.module.ApplicationScope
import me.ash.reader.data.module.DispatcherDefault import me.ash.reader.data.module.DispatcherDefault
import me.ash.reader.data.repository.* import me.ash.reader.data.repository.*
import me.ash.reader.data.source.AppNetworkDataSource
import me.ash.reader.data.source.OpmlLocalDataSource import me.ash.reader.data.source.OpmlLocalDataSource
import me.ash.reader.data.source.ReaderDatabase import me.ash.reader.data.source.RYDatabase
import me.ash.reader.data.source.RYNetworkDataSource
import me.ash.reader.ui.ext.* import me.ash.reader.ui.ext.*
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import org.conscrypt.Conscrypt import org.conscrypt.Conscrypt
@ -22,7 +22,7 @@ import java.security.Security
import javax.inject.Inject import javax.inject.Inject
@HiltAndroidApp @HiltAndroidApp
class App : Application(), Configuration.Provider { class RYApp : Application(), Configuration.Provider {
init { init {
// From: https://gitlab.com/spacecowboy/Feeder // From: https://gitlab.com/spacecowboy/Feeder
// Install Conscrypt to handle TLSv1.3 pre Android10 // Install Conscrypt to handle TLSv1.3 pre Android10
@ -30,7 +30,7 @@ class App : Application(), Configuration.Provider {
} }
@Inject @Inject
lateinit var readerDatabase: ReaderDatabase lateinit var RYDatabase: RYDatabase
@Inject @Inject
lateinit var workerFactory: HiltWorkerFactory lateinit var workerFactory: HiltWorkerFactory
@ -39,7 +39,7 @@ class App : Application(), Configuration.Provider {
lateinit var workManager: WorkManager lateinit var workManager: WorkManager
@Inject @Inject
lateinit var appNetworkDataSource: AppNetworkDataSource lateinit var RYNetworkDataSource: RYNetworkDataSource
@Inject @Inject
lateinit var opmlLocalDataSource: OpmlLocalDataSource lateinit var opmlLocalDataSource: OpmlLocalDataSource
@ -51,7 +51,7 @@ class App : Application(), Configuration.Provider {
lateinit var notificationHelper: NotificationHelper lateinit var notificationHelper: NotificationHelper
@Inject @Inject
lateinit var appRepository: AppRepository lateinit var ryRepository: RYRepository
@Inject @Inject
lateinit var stringsRepository: StringsRepository lateinit var stringsRepository: StringsRepository
@ -116,7 +116,7 @@ class App : Application(), Configuration.Provider {
it.del() it.del()
} }
} }
appRepository.checkUpdate(showToast = false) ryRepository.checkUpdate(showToast = false)
} }
override fun getWorkManagerConfiguration(): Configuration = override fun getWorkManagerConfiguration(): Configuration =

View File

@ -10,7 +10,7 @@ import me.ash.reader.data.dao.AccountDao
import me.ash.reader.data.dao.ArticleDao import me.ash.reader.data.dao.ArticleDao
import me.ash.reader.data.dao.FeedDao import me.ash.reader.data.dao.FeedDao
import me.ash.reader.data.dao.GroupDao import me.ash.reader.data.dao.GroupDao
import me.ash.reader.data.source.ReaderDatabase import me.ash.reader.data.source.RYDatabase
import javax.inject.Singleton import javax.inject.Singleton
@Module @Module
@ -19,26 +19,26 @@ object DatabaseModule {
@Provides @Provides
@Singleton @Singleton
fun provideArticleDao(readerDatabase: ReaderDatabase): ArticleDao = fun provideArticleDao(RYDatabase: RYDatabase): ArticleDao =
readerDatabase.articleDao() RYDatabase.articleDao()
@Provides @Provides
@Singleton @Singleton
fun provideFeedDao(readerDatabase: ReaderDatabase): FeedDao = fun provideFeedDao(RYDatabase: RYDatabase): FeedDao =
readerDatabase.feedDao() RYDatabase.feedDao()
@Provides @Provides
@Singleton @Singleton
fun provideGroupDao(readerDatabase: ReaderDatabase): GroupDao = fun provideGroupDao(RYDatabase: RYDatabase): GroupDao =
readerDatabase.groupDao() RYDatabase.groupDao()
@Provides @Provides
@Singleton @Singleton
fun provideAccountDao(readerDatabase: ReaderDatabase): AccountDao = fun provideAccountDao(RYDatabase: RYDatabase): AccountDao =
readerDatabase.accountDao() RYDatabase.accountDao()
@Provides @Provides
@Singleton @Singleton
fun provideReaderDatabase(@ApplicationContext context: Context): ReaderDatabase = fun provideReaderDatabase(@ApplicationContext context: Context): RYDatabase =
ReaderDatabase.getInstance(context) RYDatabase.getInstance(context)
} }

View File

@ -4,7 +4,7 @@ import dagger.Module
import dagger.Provides import dagger.Provides
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import me.ash.reader.data.source.AppNetworkDataSource import me.ash.reader.data.source.RYNetworkDataSource
import me.ash.reader.data.source.FeverApiDataSource import me.ash.reader.data.source.FeverApiDataSource
import me.ash.reader.data.source.GoogleReaderApiDataSource import me.ash.reader.data.source.GoogleReaderApiDataSource
import javax.inject.Singleton import javax.inject.Singleton
@ -15,8 +15,8 @@ object RetrofitModule {
@Provides @Provides
@Singleton @Singleton
fun provideAppNetworkDataSource(): AppNetworkDataSource = fun provideAppNetworkDataSource(): RYNetworkDataSource =
AppNetworkDataSource.getInstance() RYNetworkDataSource.getInstance()
@Provides @Provides
@Singleton @Singleton

View File

@ -13,8 +13,8 @@ import me.ash.reader.data.module.DispatcherIO
import me.ash.reader.data.module.DispatcherMain import me.ash.reader.data.module.DispatcherMain
import me.ash.reader.data.preference.* import me.ash.reader.data.preference.*
import me.ash.reader.data.preference.NewVersionSizePreference.formatSize import me.ash.reader.data.preference.NewVersionSizePreference.formatSize
import me.ash.reader.data.source.AppNetworkDataSource
import me.ash.reader.data.source.Download import me.ash.reader.data.source.Download
import me.ash.reader.data.source.RYNetworkDataSource
import me.ash.reader.data.source.downloadToFileWithProgress import me.ash.reader.data.source.downloadToFileWithProgress
import me.ash.reader.ui.ext.getCurrentVersion import me.ash.reader.ui.ext.getCurrentVersion
import me.ash.reader.ui.ext.getLatestApk import me.ash.reader.ui.ext.getLatestApk
@ -22,10 +22,10 @@ import me.ash.reader.ui.ext.showToast
import me.ash.reader.ui.ext.skipVersionNumber import me.ash.reader.ui.ext.skipVersionNumber
import javax.inject.Inject import javax.inject.Inject
class AppRepository @Inject constructor( class RYRepository @Inject constructor(
@ApplicationContext @ApplicationContext
private val context: Context, private val context: Context,
private val appNetworkDataSource: AppNetworkDataSource, private val RYNetworkDataSource: RYNetworkDataSource,
@DispatcherIO @DispatcherIO
private val dispatcherIO: CoroutineDispatcher, private val dispatcherIO: CoroutineDispatcher,
@DispatcherMain @DispatcherMain
@ -34,7 +34,7 @@ class AppRepository @Inject constructor(
suspend fun checkUpdate(showToast: Boolean = true): Boolean? = withContext(dispatcherIO) { suspend fun checkUpdate(showToast: Boolean = true): Boolean? = withContext(dispatcherIO) {
try { try {
val response = val response =
appNetworkDataSource.getReleaseLatest(context.getString(R.string.update_link)) RYNetworkDataSource.getReleaseLatest(context.getString(R.string.update_link))
when { when {
response.code() == 403 -> { response.code() == 403 -> {
withContext(dispatcherMain) { withContext(dispatcherMain) {
@ -85,7 +85,7 @@ class AppRepository @Inject constructor(
withContext(dispatcherIO) { withContext(dispatcherIO) {
Log.i("RLog", "downloadFile start: $url") Log.i("RLog", "downloadFile start: $url")
try { try {
return@withContext appNetworkDataSource.downloadFile(url) return@withContext RYNetworkDataSource.downloadFile(url)
.downloadToFileWithProgress(context.getLatestApk()) .downloadToFileWithProgress(context.getLatestApk())
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()

View File

@ -18,21 +18,21 @@ import java.util.*
entities = [Account::class, Feed::class, Article::class, Group::class], entities = [Account::class, Feed::class, Article::class, Group::class],
version = 2, version = 2,
) )
@TypeConverters(ReaderDatabase.Converters::class) @TypeConverters(RYDatabase.Converters::class)
abstract class ReaderDatabase : RoomDatabase() { abstract class RYDatabase : RoomDatabase() {
abstract fun accountDao(): AccountDao abstract fun accountDao(): AccountDao
abstract fun feedDao(): FeedDao abstract fun feedDao(): FeedDao
abstract fun articleDao(): ArticleDao abstract fun articleDao(): ArticleDao
abstract fun groupDao(): GroupDao abstract fun groupDao(): GroupDao
companion object { companion object {
private var instance: ReaderDatabase? = null private var instance: RYDatabase? = null
fun getInstance(context: Context): ReaderDatabase { fun getInstance(context: Context): RYDatabase {
return instance ?: synchronized(this) { return instance ?: synchronized(this) {
instance ?: Room.databaseBuilder( instance ?: Room.databaseBuilder(
context.applicationContext, context.applicationContext,
ReaderDatabase::class.java, RYDatabase::class.java,
"Reader" "Reader"
).addMigrations(*allMigrations).build().also { ).addMigrations(*allMigrations).build().also {
instance = it instance = it

View File

@ -14,7 +14,7 @@ import retrofit2.http.Streaming
import retrofit2.http.Url import retrofit2.http.Url
import java.io.File import java.io.File
interface AppNetworkDataSource { interface RYNetworkDataSource {
@GET @GET
suspend fun getReleaseLatest(@Url url: String): Response<LatestRelease> suspend fun getReleaseLatest(@Url url: String): Response<LatestRelease>
@ -23,14 +23,14 @@ interface AppNetworkDataSource {
suspend fun downloadFile(@Url url: String): ResponseBody suspend fun downloadFile(@Url url: String): ResponseBody
companion object { companion object {
private var instance: AppNetworkDataSource? = null private var instance: RYNetworkDataSource? = null
fun getInstance(): AppNetworkDataSource { fun getInstance(): RYNetworkDataSource {
return instance ?: synchronized(this) { return instance ?: synchronized(this) {
instance ?: Retrofit.Builder() instance ?: Retrofit.Builder()
.baseUrl("https://api.github.com/") .baseUrl("https://api.github.com/")
.addConverterFactory(GsonConverterFactory.create()) .addConverterFactory(GsonConverterFactory.create())
.build().create(AppNetworkDataSource::class.java).also { .build().create(RYNetworkDataSource::class.java).also {
instance = it instance = it
} }
} }

View File

@ -7,7 +7,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
@Composable @Composable
fun BlockRadioGroupButton( fun BlockRadioButton(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
selected: Int = 0, selected: Int = 0,
onSelected: (Int) -> Unit, onSelected: (Int) -> Unit,

View File

@ -32,7 +32,7 @@ fun ClipboardTextField(
) { ) {
Column(modifier = modifier) { Column(modifier = modifier) {
Spacer(modifier = Modifier.height(10.dp)) Spacer(modifier = Modifier.height(10.dp))
TextField( RYTextField(
readOnly = readOnly, readOnly = readOnly,
value = value, value = value,
onValueChange = onValueChange, onValueChange = onValueChange,

View File

@ -41,7 +41,7 @@ fun DynamicSVGImage(
}, },
) { ) {
Crossfade(targetState = pic) { Crossfade(targetState = pic) {
AsyncImage( RYAsyncImage(
contentDescription = contentDescription, contentDescription = contentDescription,
data = it, data = it,
placeholder = null, placeholder = null,

View File

@ -22,7 +22,7 @@ import me.ash.reader.R
val Size_1000 = Size(1000, 1000) val Size_1000 = Size(1000, 1000)
@Composable @Composable
fun AsyncImage( fun RYAsyncImage(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
data: Any? = null, data: Any? = null,
size: Size = Size.ORIGINAL, size: Size = Size.ORIGINAL,

View File

@ -6,7 +6,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.window.DialogProperties import androidx.compose.ui.window.DialogProperties
@Composable @Composable
fun Dialog( fun RYDialog(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
visible: Boolean, visible: Boolean,
properties: DialogProperties = DialogProperties(), properties: DialogProperties = DialogProperties(),

View File

@ -18,7 +18,7 @@ import me.ash.reader.ui.theme.palette.onDark
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun Scaffold( fun RYScaffold(
containerColor: Color = MaterialTheme.colorScheme.surface, containerColor: Color = MaterialTheme.colorScheme.surface,
topBarTonalElevation: Dp = 0.dp, topBarTonalElevation: Dp = 0.dp,
containerTonalElevation: Dp = 0.dp, containerTonalElevation: Dp = 0.dp,

View File

@ -31,7 +31,7 @@ import me.ash.reader.ui.theme.palette.onDark
// TODO: ripple & swipe // TODO: ripple & swipe
@Composable @Composable
fun Switch( fun RYSwitch(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
activated: Boolean, activated: Boolean,
enable: Boolean = true, enable: Boolean = true,
@ -101,7 +101,7 @@ fun SwitchHeadline(
) )
} }
Box(Modifier.padding(start = 20.dp)) { Box(Modifier.padding(start = 20.dp)) {
Switch(activated = activated) RYSwitch(activated = activated)
} }
} }
} }

View File

@ -19,7 +19,7 @@ import kotlinx.coroutines.delay
import me.ash.reader.R import me.ash.reader.R
@Composable @Composable
fun TextField( fun RYTextField(
readOnly: Boolean, readOnly: Boolean,
value: String, value: String,
onValueChange: (String) -> Unit, onValueChange: (String) -> Unit,

View File

@ -29,7 +29,7 @@ fun RadioDialog(
options: List<RadioDialogOption> = emptyList(), options: List<RadioDialogOption> = emptyList(),
onDismissRequest: () -> Unit = {}, onDismissRequest: () -> Unit = {},
) { ) {
Dialog( RYDialog(
modifier = modifier, modifier = modifier,
visible = visible, visible = visible,
onDismissRequest = onDismissRequest, onDismissRequest = onDismissRequest,

View File

@ -35,7 +35,7 @@ fun TextFieldDialog(
) { ) {
val focusManager = LocalFocusManager.current val focusManager = LocalFocusManager.current
Dialog( RYDialog(
modifier = modifier, modifier = modifier,
visible = visible, visible = visible,
onDismissRequest = onDismissRequest, onDismissRequest = onDismissRequest,

View File

@ -51,7 +51,7 @@ import coil.size.Precision
import coil.size.Size import coil.size.Size
import coil.size.pxOrElse import coil.size.pxOrElse
import me.ash.reader.R import me.ash.reader.R
import me.ash.reader.ui.component.base.AsyncImage import me.ash.reader.ui.component.base.RYAsyncImage
import org.jsoup.Jsoup import org.jsoup.Jsoup
import org.jsoup.helper.StringUtil import org.jsoup.helper.StringUtil
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
@ -465,7 +465,7 @@ private fun TextComposer.appendTextChildren(
// } // }
) { ) {
val imageSize = maxImageSize() val imageSize = maxImageSize()
AsyncImage( RYAsyncImage(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
data = imageCandidates.getBestImageForMaxSize( data = imageCandidates.getBestImageForMaxSize(
pixelDensity = pixelDensity(), pixelDensity = pixelDensity(),
@ -591,7 +591,7 @@ private fun TextComposer.appendTextChildren(
BoxWithConstraints( BoxWithConstraints(
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
AsyncImage( RYAsyncImage(
modifier = Modifier modifier = Modifier
.clickable { .clickable {
onLinkClick(video.link) onLinkClick(video.link)

View File

@ -30,10 +30,7 @@ import me.ash.reader.data.model.getName
import me.ash.reader.data.preference.* import me.ash.reader.data.preference.*
import me.ash.reader.data.repository.SyncWorker.Companion.getIsSyncing import me.ash.reader.data.repository.SyncWorker.Companion.getIsSyncing
import me.ash.reader.ui.component.FilterBar import me.ash.reader.ui.component.FilterBar
import me.ash.reader.ui.component.base.Banner import me.ash.reader.ui.component.base.*
import me.ash.reader.ui.component.base.DisplayText
import me.ash.reader.ui.component.base.FeedbackIconButton
import me.ash.reader.ui.component.base.Subtitle
import me.ash.reader.ui.ext.collectAsStateValue import me.ash.reader.ui.ext.collectAsStateValue
import me.ash.reader.ui.ext.findActivity import me.ash.reader.ui.ext.findActivity
import me.ash.reader.ui.ext.getCurrentVersion import me.ash.reader.ui.ext.getCurrentVersion
@ -113,7 +110,7 @@ fun FeedsPage(
context.findActivity()?.moveTaskToBack(false) context.findActivity()?.moveTaskToBack(false)
} }
me.ash.reader.ui.component.base.Scaffold( RYScaffold(
topBarTonalElevation = topBarTonalElevation.value.dp, topBarTonalElevation = topBarTonalElevation.value.dp,
containerTonalElevation = groupListTonalElevation.value.dp, containerTonalElevation = groupListTonalElevation.value.dp,
navigationIcon = { navigationIcon = {

View File

@ -11,7 +11,7 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import me.ash.reader.R import me.ash.reader.R
import me.ash.reader.ui.component.base.Dialog import me.ash.reader.ui.component.base.RYDialog
import me.ash.reader.ui.ext.collectAsStateValue import me.ash.reader.ui.ext.collectAsStateValue
import me.ash.reader.ui.ext.showToast import me.ash.reader.ui.ext.showToast
@ -25,7 +25,7 @@ fun ClearFeedDialog(
val scope = rememberCoroutineScope() val scope = rememberCoroutineScope()
val toastString = stringResource(R.string.clear_articles_in_feed_toast, feedName) val toastString = stringResource(R.string.clear_articles_in_feed_toast, feedName)
Dialog( RYDialog(
visible = feedOptionUiState.clearDialogVisible, visible = feedOptionUiState.clearDialogVisible,
onDismissRequest = { onDismissRequest = {
feedOptionViewModel.hideClearDialog() feedOptionViewModel.hideClearDialog()

View File

@ -11,7 +11,7 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import me.ash.reader.R import me.ash.reader.R
import me.ash.reader.ui.component.base.Dialog import me.ash.reader.ui.component.base.RYDialog
import me.ash.reader.ui.ext.collectAsStateValue import me.ash.reader.ui.ext.collectAsStateValue
import me.ash.reader.ui.ext.showToast import me.ash.reader.ui.ext.showToast
@ -25,7 +25,7 @@ fun DeleteFeedDialog(
val scope = rememberCoroutineScope() val scope = rememberCoroutineScope()
val toastString = stringResource(R.string.delete_toast, feedName) val toastString = stringResource(R.string.delete_toast, feedName)
Dialog( RYDialog(
visible = feedOptionUiState.deleteDialogVisible, visible = feedOptionUiState.deleteDialogVisible,
onDismissRequest = { onDismissRequest = {
feedOptionViewModel.hideDeleteDialog() feedOptionViewModel.hideDeleteDialog()

View File

@ -11,7 +11,7 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import me.ash.reader.R import me.ash.reader.R
import me.ash.reader.ui.component.base.Dialog import me.ash.reader.ui.component.base.RYDialog
import me.ash.reader.ui.ext.collectAsStateValue import me.ash.reader.ui.ext.collectAsStateValue
import me.ash.reader.ui.ext.showToast import me.ash.reader.ui.ext.showToast
@ -26,7 +26,7 @@ fun AllAllowNotificationDialog(
val allowToastString = stringResource(R.string.all_allow_notification_toast, groupName) val allowToastString = stringResource(R.string.all_allow_notification_toast, groupName)
val denyToastString = stringResource(R.string.all_deny_notification_toast, groupName) val denyToastString = stringResource(R.string.all_deny_notification_toast, groupName)
Dialog( RYDialog(
visible = groupOptionUiState.allAllowNotificationDialogVisible, visible = groupOptionUiState.allAllowNotificationDialogVisible,
onDismissRequest = { onDismissRequest = {
groupOptionViewModel.hideAllAllowNotificationDialog() groupOptionViewModel.hideAllAllowNotificationDialog()

View File

@ -11,7 +11,7 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import me.ash.reader.R import me.ash.reader.R
import me.ash.reader.ui.component.base.Dialog import me.ash.reader.ui.component.base.RYDialog
import me.ash.reader.ui.ext.collectAsStateValue import me.ash.reader.ui.ext.collectAsStateValue
import me.ash.reader.ui.ext.showToast import me.ash.reader.ui.ext.showToast
@ -28,7 +28,7 @@ fun AllMoveToGroupDialog(
groupOptionUiState.targetGroup?.name ?: "" groupOptionUiState.targetGroup?.name ?: ""
) )
Dialog( RYDialog(
visible = groupOptionUiState.allMoveToGroupDialogVisible, visible = groupOptionUiState.allMoveToGroupDialogVisible,
onDismissRequest = { onDismissRequest = {
groupOptionViewModel.hideAllMoveToGroupDialog() groupOptionViewModel.hideAllMoveToGroupDialog()

View File

@ -11,7 +11,7 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import me.ash.reader.R import me.ash.reader.R
import me.ash.reader.ui.component.base.Dialog import me.ash.reader.ui.component.base.RYDialog
import me.ash.reader.ui.ext.collectAsStateValue import me.ash.reader.ui.ext.collectAsStateValue
import me.ash.reader.ui.ext.showToast import me.ash.reader.ui.ext.showToast
@ -26,7 +26,7 @@ fun AllParseFullContentDialog(
val allowToastString = stringResource(R.string.all_parse_full_content_toast, groupName) val allowToastString = stringResource(R.string.all_parse_full_content_toast, groupName)
val denyToastString = stringResource(R.string.all_deny_parse_full_content_toast, groupName) val denyToastString = stringResource(R.string.all_deny_parse_full_content_toast, groupName)
Dialog( RYDialog(
visible = groupOptionUiState.allParseFullContentDialogVisible, visible = groupOptionUiState.allParseFullContentDialogVisible,
onDismissRequest = { onDismissRequest = {
groupOptionViewModel.hideAllParseFullContentDialog() groupOptionViewModel.hideAllParseFullContentDialog()

View File

@ -11,7 +11,7 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import me.ash.reader.R import me.ash.reader.R
import me.ash.reader.ui.component.base.Dialog import me.ash.reader.ui.component.base.RYDialog
import me.ash.reader.ui.ext.collectAsStateValue import me.ash.reader.ui.ext.collectAsStateValue
import me.ash.reader.ui.ext.showToast import me.ash.reader.ui.ext.showToast
@ -25,7 +25,7 @@ fun ClearGroupDialog(
val scope = rememberCoroutineScope() val scope = rememberCoroutineScope()
val toastString = stringResource(R.string.clear_articles_in_group_toast, groupName) val toastString = stringResource(R.string.clear_articles_in_group_toast, groupName)
Dialog( RYDialog(
visible = groupOptionUiState.clearDialogVisible, visible = groupOptionUiState.clearDialogVisible,
onDismissRequest = { onDismissRequest = {
groupOptionViewModel.hideClearDialog() groupOptionViewModel.hideClearDialog()

View File

@ -11,7 +11,7 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import me.ash.reader.R import me.ash.reader.R
import me.ash.reader.ui.component.base.Dialog import me.ash.reader.ui.component.base.RYDialog
import me.ash.reader.ui.ext.collectAsStateValue import me.ash.reader.ui.ext.collectAsStateValue
import me.ash.reader.ui.ext.showToast import me.ash.reader.ui.ext.showToast
@ -25,7 +25,7 @@ fun DeleteGroupDialog(
val scope = rememberCoroutineScope() val scope = rememberCoroutineScope()
val toastString = stringResource(R.string.delete_toast, groupName) val toastString = stringResource(R.string.delete_toast, groupName)
Dialog( RYDialog(
visible = groupOptionUiState.deleteDialogVisible, visible = groupOptionUiState.deleteDialogVisible,
onDismissRequest = { onDismissRequest = {
groupOptionViewModel.hideDeleteDialog() groupOptionViewModel.hideDeleteDialog()

View File

@ -26,7 +26,7 @@ import androidx.compose.ui.window.DialogProperties
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import me.ash.reader.R import me.ash.reader.R
import me.ash.reader.ui.component.base.ClipboardTextField import me.ash.reader.ui.component.base.ClipboardTextField
import me.ash.reader.ui.component.base.Dialog import me.ash.reader.ui.component.base.RYDialog
import me.ash.reader.ui.component.base.TextFieldDialog import me.ash.reader.ui.component.base.TextFieldDialog
import me.ash.reader.ui.ext.collectAsStateValue import me.ash.reader.ui.ext.collectAsStateValue
@ -60,7 +60,7 @@ fun SubscribeDialog(
} }
} }
Dialog( RYDialog(
modifier = Modifier.padding(horizontal = 44.dp), modifier = Modifier.padding(horizontal = 44.dp),
visible = subscribeUiState.visible, visible = subscribeUiState.visible,
properties = DialogProperties(usePlatformDefaultWidth = false), properties = DialogProperties(usePlatformDefaultWidth = false),

View File

@ -23,7 +23,7 @@ import coil.size.Scale
import me.ash.reader.R import me.ash.reader.R
import me.ash.reader.data.entity.ArticleWithFeed import me.ash.reader.data.entity.ArticleWithFeed
import me.ash.reader.data.preference.* import me.ash.reader.data.preference.*
import me.ash.reader.ui.component.base.AsyncImage import me.ash.reader.ui.component.base.RYAsyncImage
import me.ash.reader.ui.ext.formatAsString import me.ash.reader.ui.ext.formatAsString
import me.ash.reader.ui.component.FeedIcon import me.ash.reader.ui.component.FeedIcon
import me.ash.reader.ui.component.base.Size_1000 import me.ash.reader.ui.component.base.Size_1000
@ -139,7 +139,7 @@ fun ArticleItem(
// Image // Image
if (articleWithFeed.article.img != null && articleListImage.value) { if (articleWithFeed.article.img != null && articleListImage.value) {
AsyncImage( RYAsyncImage(
modifier = Modifier modifier = Modifier
.padding(start = 10.dp) .padding(start = 10.dp)
.size(80.dp) .size(80.dp)

View File

@ -30,6 +30,7 @@ import me.ash.reader.data.repository.SyncWorker.Companion.getIsSyncing
import me.ash.reader.ui.component.FilterBar import me.ash.reader.ui.component.FilterBar
import me.ash.reader.ui.component.base.DisplayText import me.ash.reader.ui.component.base.DisplayText
import me.ash.reader.ui.component.base.FeedbackIconButton import me.ash.reader.ui.component.base.FeedbackIconButton
import me.ash.reader.ui.component.base.RYScaffold
import me.ash.reader.ui.component.base.SwipeRefresh import me.ash.reader.ui.component.base.SwipeRefresh
import me.ash.reader.ui.ext.collectAsStateValue import me.ash.reader.ui.ext.collectAsStateValue
import me.ash.reader.ui.page.common.RouteName import me.ash.reader.ui.page.common.RouteName
@ -100,7 +101,7 @@ fun FlowPage(
onSearch = false onSearch = false
} }
me.ash.reader.ui.component.base.Scaffold( RYScaffold(
topBarTonalElevation = topBarTonalElevation.value.dp, topBarTonalElevation = topBarTonalElevation.value.dp,
containerTonalElevation = articleListTonalElevation.value.dp, containerTonalElevation = articleListTonalElevation.value.dp,
navigationIcon = { navigationIcon = {

View File

@ -27,6 +27,7 @@ import androidx.navigation.NavHostController
import me.ash.reader.R import me.ash.reader.R
import me.ash.reader.data.entity.ArticleWithFeed import me.ash.reader.data.entity.ArticleWithFeed
import me.ash.reader.ui.component.base.FeedbackIconButton import me.ash.reader.ui.component.base.FeedbackIconButton
import me.ash.reader.ui.component.base.RYScaffold
import me.ash.reader.ui.component.reader.reader import me.ash.reader.ui.component.reader.reader
import me.ash.reader.ui.ext.collectAsStateValue import me.ash.reader.ui.ext.collectAsStateValue
import me.ash.reader.ui.ext.drawVerticalScrollbar import me.ash.reader.ui.ext.drawVerticalScrollbar
@ -56,7 +57,7 @@ fun ReadingPage(
} }
} }
me.ash.reader.ui.component.base.Scaffold( RYScaffold(
content = { content = {
Box(Modifier.fillMaxSize()) { Box(Modifier.fillMaxSize()) {
Box( Box(

View File

@ -25,6 +25,7 @@ import me.ash.reader.data.preference.LocalSkipVersionNumber
import me.ash.reader.ui.component.base.Banner import me.ash.reader.ui.component.base.Banner
import me.ash.reader.ui.component.base.DisplayText import me.ash.reader.ui.component.base.DisplayText
import me.ash.reader.ui.component.base.FeedbackIconButton import me.ash.reader.ui.component.base.FeedbackIconButton
import me.ash.reader.ui.component.base.RYScaffold
import me.ash.reader.ui.ext.getCurrentVersion import me.ash.reader.ui.ext.getCurrentVersion
import me.ash.reader.ui.page.common.RouteName import me.ash.reader.ui.page.common.RouteName
import me.ash.reader.ui.page.settings.tips.UpdateDialog import me.ash.reader.ui.page.settings.tips.UpdateDialog
@ -41,7 +42,7 @@ fun SettingsPage(
val skipVersion = LocalSkipVersionNumber.current val skipVersion = LocalSkipVersionNumber.current
val currentVersion by remember { mutableStateOf(context.getCurrentVersion()) } val currentVersion by remember { mutableStateOf(context.getCurrentVersion()) }
me.ash.reader.ui.component.base.Scaffold( RYScaffold(
containerColor = MaterialTheme.colorScheme.surface onLight MaterialTheme.colorScheme.inverseOnSurface, containerColor = MaterialTheme.colorScheme.surface onLight MaterialTheme.colorScheme.inverseOnSurface,
navigationIcon = { navigationIcon = {
FeedbackIconButton( FeedbackIconButton(

View File

@ -50,7 +50,7 @@ fun ColorAndStylePage(
val wallpaperTonalPalettes = extractTonalPalettesFromUserWallpaper() val wallpaperTonalPalettes = extractTonalPalettesFromUserWallpaper()
var radioButtonSelected by remember { mutableStateOf(if (themeIndex > 4) 0 else 1) } var radioButtonSelected by remember { mutableStateOf(if (themeIndex > 4) 0 else 1) }
me.ash.reader.ui.component.base.Scaffold( RYScaffold(
containerColor = MaterialTheme.colorScheme.surface onLight MaterialTheme.colorScheme.inverseOnSurface, containerColor = MaterialTheme.colorScheme.surface onLight MaterialTheme.colorScheme.inverseOnSurface,
navigationIcon = { navigationIcon = {
FeedbackIconButton( FeedbackIconButton(
@ -90,7 +90,7 @@ fun ColorAndStylePage(
Spacer(modifier = Modifier.height(24.dp)) Spacer(modifier = Modifier.height(24.dp))
} }
item { item {
BlockRadioGroupButton( BlockRadioButton(
selected = radioButtonSelected, selected = radioButtonSelected,
onSelected = { radioButtonSelected = it }, onSelected = { radioButtonSelected = it },
itemRadioGroups = listOf( itemRadioGroups = listOf(
@ -142,7 +142,7 @@ fun ColorAndStylePage(
} }
}, },
) { ) {
me.ash.reader.ui.component.base.Switch( RYSwitch(
activated = darkTheme.isDarkTheme() activated = darkTheme.isDarkTheme()
) { ) {
darkThemeNot.put(context, scope) darkThemeNot.put(context, scope)

View File

@ -19,10 +19,7 @@ import me.ash.reader.data.preference.DarkThemePreference
import me.ash.reader.data.preference.LocalAmoledDarkTheme import me.ash.reader.data.preference.LocalAmoledDarkTheme
import me.ash.reader.data.preference.LocalDarkTheme import me.ash.reader.data.preference.LocalDarkTheme
import me.ash.reader.data.preference.not import me.ash.reader.data.preference.not
import me.ash.reader.ui.component.base.DisplayText import me.ash.reader.ui.component.base.*
import me.ash.reader.ui.component.base.FeedbackIconButton
import me.ash.reader.ui.component.base.Subtitle
import me.ash.reader.ui.component.base.Switch
import me.ash.reader.ui.page.settings.SettingItem import me.ash.reader.ui.page.settings.SettingItem
import me.ash.reader.ui.theme.palette.onLight import me.ash.reader.ui.theme.palette.onLight
@ -36,7 +33,7 @@ fun DarkThemePage(
val amoledDarkTheme = LocalAmoledDarkTheme.current val amoledDarkTheme = LocalAmoledDarkTheme.current
val scope = rememberCoroutineScope() val scope = rememberCoroutineScope()
me.ash.reader.ui.component.base.Scaffold( RYScaffold(
containerColor = MaterialTheme.colorScheme.surface onLight MaterialTheme.colorScheme.inverseOnSurface, containerColor = MaterialTheme.colorScheme.surface onLight MaterialTheme.colorScheme.inverseOnSurface,
navigationIcon = { navigationIcon = {
FeedbackIconButton( FeedbackIconButton(
@ -75,7 +72,7 @@ fun DarkThemePage(
(!amoledDarkTheme).put(context, scope) (!amoledDarkTheme).put(context, scope)
}, },
) { ) {
Switch(activated = amoledDarkTheme.value) { RYSwitch(activated = amoledDarkTheme.value) {
(!amoledDarkTheme).put(context, scope) (!amoledDarkTheme).put(context, scope)
} }
} }

View File

@ -58,7 +58,7 @@ fun FeedsPageStylePage(
var filterBarPaddingValue: Int? by remember { mutableStateOf(filterBarPadding) } var filterBarPaddingValue: Int? by remember { mutableStateOf(filterBarPadding) }
me.ash.reader.ui.component.base.Scaffold( RYScaffold(
containerColor = MaterialTheme.colorScheme.surface onLight MaterialTheme.colorScheme.inverseOnSurface, containerColor = MaterialTheme.colorScheme.surface onLight MaterialTheme.colorScheme.inverseOnSurface,
navigationIcon = { navigationIcon = {
FeedbackIconButton( FeedbackIconButton(
@ -132,7 +132,7 @@ fun FeedsPageStylePage(
(!groupListExpand).put(context, scope) (!groupListExpand).put(context, scope)
}, },
) { ) {
Switch(activated = groupListExpand.value) { RYSwitch(activated = groupListExpand.value) {
(!groupListExpand).put(context, scope) (!groupListExpand).put(context, scope)
} }
} }
@ -166,7 +166,7 @@ fun FeedsPageStylePage(
(!filterBarFilled).put(context, scope) (!filterBarFilled).put(context, scope)
}, },
) { ) {
Switch(activated = filterBarFilled.value) { RYSwitch(activated = filterBarFilled.value) {
(!filterBarFilled).put(context, scope) (!filterBarFilled).put(context, scope)
} }
} }

View File

@ -10,7 +10,6 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.ArrowBack import androidx.compose.material.icons.rounded.ArrowBack
import androidx.compose.material.icons.rounded.DoneAll import androidx.compose.material.icons.rounded.DoneAll
import androidx.compose.material.icons.rounded.Search import androidx.compose.material.icons.rounded.Search
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.SmallTopAppBar import androidx.compose.material3.SmallTopAppBar
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
@ -66,7 +65,7 @@ fun FlowPageStylePage(
var filterBarPaddingValue: Int? by remember { mutableStateOf(filterBarPadding) } var filterBarPaddingValue: Int? by remember { mutableStateOf(filterBarPadding) }
me.ash.reader.ui.component.base.Scaffold( RYScaffold(
containerColor = MaterialTheme.colorScheme.surface onLight MaterialTheme.colorScheme.inverseOnSurface, containerColor = MaterialTheme.colorScheme.surface onLight MaterialTheme.colorScheme.inverseOnSurface,
navigationIcon = { navigationIcon = {
FeedbackIconButton( FeedbackIconButton(
@ -145,7 +144,7 @@ fun FlowPageStylePage(
(!articleListFeedIcon).put(context, scope) (!articleListFeedIcon).put(context, scope)
}, },
) { ) {
me.ash.reader.ui.component.base.Switch(activated = articleListFeedIcon.value) { RYSwitch(activated = articleListFeedIcon.value) {
(!articleListFeedIcon).put(context, scope) (!articleListFeedIcon).put(context, scope)
} }
} }
@ -155,7 +154,7 @@ fun FlowPageStylePage(
(!articleListFeedName).put(context, scope) (!articleListFeedName).put(context, scope)
}, },
) { ) {
me.ash.reader.ui.component.base.Switch(activated = articleListFeedName.value) { RYSwitch(activated = articleListFeedName.value) {
(!articleListFeedName).put(context, scope) (!articleListFeedName).put(context, scope)
} }
} }
@ -165,7 +164,7 @@ fun FlowPageStylePage(
(!articleListImage).put(context, scope) (!articleListImage).put(context, scope)
}, },
) { ) {
me.ash.reader.ui.component.base.Switch(activated = articleListImage.value) { RYSwitch(activated = articleListImage.value) {
(!articleListImage).put(context, scope) (!articleListImage).put(context, scope)
} }
} }
@ -175,7 +174,7 @@ fun FlowPageStylePage(
(!articleListDesc).put(context, scope) (!articleListDesc).put(context, scope)
}, },
) { ) {
me.ash.reader.ui.component.base.Switch(activated = articleListDesc.value) { RYSwitch(activated = articleListDesc.value) {
(!articleListDesc).put(context, scope) (!articleListDesc).put(context, scope)
} }
} }
@ -185,7 +184,7 @@ fun FlowPageStylePage(
(!articleListTime).put(context, scope) (!articleListTime).put(context, scope)
}, },
) { ) {
me.ash.reader.ui.component.base.Switch(activated = articleListTime.value) { RYSwitch(activated = articleListTime.value) {
(!articleListTime).put(context, scope) (!articleListTime).put(context, scope)
} }
} }
@ -195,7 +194,7 @@ fun FlowPageStylePage(
(!articleListStickyDate).put(context, scope) (!articleListStickyDate).put(context, scope)
}, },
) { ) {
me.ash.reader.ui.component.base.Switch(activated = articleListStickyDate.value) { RYSwitch(activated = articleListStickyDate.value) {
(!articleListStickyDate).put(context, scope) (!articleListStickyDate).put(context, scope)
} }
} }
@ -229,7 +228,7 @@ fun FlowPageStylePage(
(!filterBarFilled).put(context, scope) (!filterBarFilled).put(context, scope)
}, },
) { ) {
me.ash.reader.ui.component.base.Switch(activated = filterBarFilled.value) { RYSwitch(activated = filterBarFilled.value) {
(!filterBarFilled).put(context, scope) (!filterBarFilled).put(context, scope)
} }
} }

View File

@ -33,7 +33,7 @@ fun InteractionPage(
var initialPageDialogVisible by remember { mutableStateOf(false) } var initialPageDialogVisible by remember { mutableStateOf(false) }
var initialFilterDialogVisible by remember { mutableStateOf(false) } var initialFilterDialogVisible by remember { mutableStateOf(false) }
me.ash.reader.ui.component.base.Scaffold( RYScaffold(
containerColor = MaterialTheme.colorScheme.surface onLight MaterialTheme.colorScheme.inverseOnSurface, containerColor = MaterialTheme.colorScheme.surface onLight MaterialTheme.colorScheme.inverseOnSurface,
navigationIcon = { navigationIcon = {
FeedbackIconButton( FeedbackIconButton(

View File

@ -26,6 +26,7 @@ import me.ash.reader.data.preference.LocalLanguages
import me.ash.reader.ui.component.base.Banner import me.ash.reader.ui.component.base.Banner
import me.ash.reader.ui.component.base.DisplayText import me.ash.reader.ui.component.base.DisplayText
import me.ash.reader.ui.component.base.FeedbackIconButton import me.ash.reader.ui.component.base.FeedbackIconButton
import me.ash.reader.ui.component.base.RYScaffold
import me.ash.reader.ui.page.settings.SettingItem import me.ash.reader.ui.page.settings.SettingItem
import me.ash.reader.ui.theme.palette.onLight import me.ash.reader.ui.theme.palette.onLight
@ -38,7 +39,7 @@ fun LanguagesPage(
val languages = LocalLanguages.current val languages = LocalLanguages.current
val scope = rememberCoroutineScope() val scope = rememberCoroutineScope()
me.ash.reader.ui.component.base.Scaffold( RYScaffold(
containerColor = MaterialTheme.colorScheme.surface onLight MaterialTheme.colorScheme.inverseOnSurface, containerColor = MaterialTheme.colorScheme.surface onLight MaterialTheme.colorScheme.inverseOnSurface,
navigationIcon = { navigationIcon = {
FeedbackIconButton( FeedbackIconButton(

View File

@ -38,6 +38,7 @@ import androidx.navigation.NavHostController
import me.ash.reader.R import me.ash.reader.R
import me.ash.reader.ui.component.base.CurlyCornerShape import me.ash.reader.ui.component.base.CurlyCornerShape
import me.ash.reader.ui.component.base.FeedbackIconButton import me.ash.reader.ui.component.base.FeedbackIconButton
import me.ash.reader.ui.component.base.RYScaffold
import me.ash.reader.ui.ext.* import me.ash.reader.ui.ext.*
import me.ash.reader.ui.theme.palette.alwaysLight import me.ash.reader.ui.theme.palette.alwaysLight
import me.ash.reader.ui.theme.palette.onLight import me.ash.reader.ui.theme.palette.onLight
@ -61,7 +62,7 @@ fun TipsAndSupportPage(
currentVersion = context.getCurrentVersion().toString() currentVersion = context.getCurrentVersion().toString()
} }
me.ash.reader.ui.component.base.Scaffold( RYScaffold(
containerColor = MaterialTheme.colorScheme.surface onLight MaterialTheme.colorScheme.inverseOnSurface, containerColor = MaterialTheme.colorScheme.surface onLight MaterialTheme.colorScheme.inverseOnSurface,
navigationIcon = { navigationIcon = {
FeedbackIconButton( FeedbackIconButton(

View File

@ -33,7 +33,7 @@ import kotlinx.coroutines.Dispatchers
import me.ash.reader.R import me.ash.reader.R
import me.ash.reader.data.preference.* import me.ash.reader.data.preference.*
import me.ash.reader.data.source.Download import me.ash.reader.data.source.Download
import me.ash.reader.ui.component.base.Dialog import me.ash.reader.ui.component.base.RYDialog
import me.ash.reader.ui.ext.collectAsStateValue import me.ash.reader.ui.ext.collectAsStateValue
import me.ash.reader.ui.ext.installLatestApk import me.ash.reader.ui.ext.installLatestApk
@ -71,7 +71,7 @@ fun UpdateDialog(
} }
} }
Dialog( RYDialog(
modifier = Modifier.heightIn(max = 400.dp), modifier = Modifier.heightIn(max = 400.dp),
visible = updateUiState.updateDialogVisible, visible = updateUiState.updateDialogVisible,
onDismissRequest = { updateViewModel.hideDialog() }, onDismissRequest = { updateViewModel.hideDialog() },

View File

@ -5,14 +5,14 @@ import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.* import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import me.ash.reader.data.repository.AppRepository import me.ash.reader.data.repository.RYRepository
import me.ash.reader.data.source.Download import me.ash.reader.data.source.Download
import me.ash.reader.ui.ext.notFdroid import me.ash.reader.ui.ext.notFdroid
import javax.inject.Inject import javax.inject.Inject
@HiltViewModel @HiltViewModel
class UpdateViewModel @Inject constructor( class UpdateViewModel @Inject constructor(
private val appRepository: AppRepository, private val ryRepository: RYRepository,
) : ViewModel() { ) : ViewModel() {
private val _updateUiState = MutableStateFlow(UpdateUiState()) private val _updateUiState = MutableStateFlow(UpdateUiState())
val updateUiState: StateFlow<UpdateUiState> = _updateUiState.asStateFlow() val updateUiState: StateFlow<UpdateUiState> = _updateUiState.asStateFlow()
@ -24,7 +24,7 @@ class UpdateViewModel @Inject constructor(
if (notFdroid) { if (notFdroid) {
viewModelScope.launch { viewModelScope.launch {
preProcessor() preProcessor()
appRepository.checkUpdate().let { ryRepository.checkUpdate().let {
it?.let { it?.let {
if (it) { if (it) {
showDialog() showDialog()
@ -63,7 +63,7 @@ class UpdateViewModel @Inject constructor(
} }
_updateUiState.update { _updateUiState.update {
it.copy( it.copy(
downloadFlow = appRepository.downloadFile(url) downloadFlow = ryRepository.downloadFile(url)
) )
} }
} }

View File

@ -21,6 +21,7 @@ import kotlinx.coroutines.launch
import me.ash.reader.R import me.ash.reader.R
import me.ash.reader.ui.component.base.DisplayText import me.ash.reader.ui.component.base.DisplayText
import me.ash.reader.ui.component.base.DynamicSVGImage import me.ash.reader.ui.component.base.DynamicSVGImage
import me.ash.reader.ui.component.base.RYScaffold
import me.ash.reader.ui.component.base.Tips import me.ash.reader.ui.component.base.Tips
import me.ash.reader.ui.ext.DataStoreKeys import me.ash.reader.ui.ext.DataStoreKeys
import me.ash.reader.ui.ext.dataStore import me.ash.reader.ui.ext.dataStore
@ -36,7 +37,7 @@ fun StartupPage(
val context = LocalContext.current val context = LocalContext.current
val scope = rememberCoroutineScope() val scope = rememberCoroutineScope()
me.ash.reader.ui.component.base.Scaffold( RYScaffold(
content = { content = {
LazyColumn { LazyColumn {
item { item {