commit
81d4d82d5c
@ -0,0 +1,55 @@ |
|||||||
|
package io.legado.app.base |
||||||
|
|
||||||
|
import android.os.Bundle |
||||||
|
import android.view.MenuItem |
||||||
|
import androidx.annotation.LayoutRes |
||||||
|
import androidx.appcompat.app.AppCompatActivity |
||||||
|
|
||||||
|
abstract class BaseActivity : AppCompatActivity() { |
||||||
|
|
||||||
|
@LayoutRes |
||||||
|
abstract fun getLayoutID(): Int |
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) { |
||||||
|
super.onCreate(savedInstanceState) |
||||||
|
setContentView(getLayoutID()) |
||||||
|
} |
||||||
|
|
||||||
|
override fun onOptionsItemSelected(item: MenuItem?): Boolean { |
||||||
|
item?.let { |
||||||
|
if (it.itemId == android.R.id.home) { |
||||||
|
supportFinishAfterTransition() |
||||||
|
return true |
||||||
|
} |
||||||
|
} |
||||||
|
return if (item == null) true else onCompatOptionsItemSelected(item) |
||||||
|
} |
||||||
|
|
||||||
|
open fun onCompatOptionsItemSelected(item: MenuItem): Boolean { |
||||||
|
return true |
||||||
|
} |
||||||
|
|
||||||
|
override fun setTitle(title: CharSequence?) { |
||||||
|
supportActionBar?.let { |
||||||
|
it.title = title |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
override fun setTitle(titleId: Int) { |
||||||
|
supportActionBar?.let { |
||||||
|
it.setTitle(titleId) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
fun setSubTitle(subtitle: CharSequence?){ |
||||||
|
supportActionBar?.let { |
||||||
|
it.subtitle = subtitle; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
fun setSubTitle(subtitleId: Int){ |
||||||
|
supportActionBar?.let { |
||||||
|
it.setSubtitle(subtitleId) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1 @@ |
|||||||
|
## 基类 |
@ -0,0 +1,52 @@ |
|||||||
|
package io.legado.app.data |
||||||
|
|
||||||
|
import android.content.Context |
||||||
|
import androidx.room.Database |
||||||
|
import androidx.room.Room |
||||||
|
import androidx.room.RoomDatabase |
||||||
|
import androidx.room.migration.Migration |
||||||
|
import androidx.sqlite.db.SupportSQLiteDatabase |
||||||
|
import io.legado.app.data.dao.BookDao |
||||||
|
import io.legado.app.data.entities.Book |
||||||
|
|
||||||
|
|
||||||
|
@Database(entities = [Book::class], version = 1, exportSchema = true) |
||||||
|
// @TypeConverters(Converters::class) |
||||||
|
abstract class AppDatabase : RoomDatabase() { |
||||||
|
|
||||||
|
companion object { |
||||||
|
private const val DATABASE_NAME = "legado.db" |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private val MIGRATION_1_2: Migration = object : Migration(1, 2) { |
||||||
|
override fun migrate(database: SupportSQLiteDatabase) { |
||||||
|
database.run { |
||||||
|
// execSQL("ALTER TABLE parsers ADD COLUMN fulltextScript TEXT") |
||||||
|
// execSQL("ALTER TABLE feeds ADD COLUMN lastUpdateTime INTEGER NOT NULL DEFAULT 0") |
||||||
|
// execSQL("DELETE FROM entries WHERE rowid NOT IN (SELECT MIN(rowid) FROM entries GROUP BY link)") |
||||||
|
// execSQL("CREATE UNIQUE INDEX index_entries_link ON entries(link)") |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
fun createDatabase(context: Context): AppDatabase { |
||||||
|
return Room.databaseBuilder(context.applicationContext, AppDatabase::class.java, DATABASE_NAME) |
||||||
|
// .addMigrations(MIGRATION_1_2) |
||||||
|
// .addMigrations(MIGRATION_2_3) |
||||||
|
// .addMigrations(MIGRATION_3_4) |
||||||
|
// .addMigrations(MIGRATION_4_5) |
||||||
|
// .addMigrations(MIGRATION_5_6) |
||||||
|
.addCallback(object : Callback() { |
||||||
|
override fun onCreate(db: SupportSQLiteDatabase) { |
||||||
|
super.onCreate(db) |
||||||
|
} |
||||||
|
}) |
||||||
|
.build() |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
abstract fun bookDao(): BookDao |
||||||
|
|
||||||
|
} |
@ -0,0 +1,19 @@ |
|||||||
|
package io.legado.app.data.dao |
||||||
|
|
||||||
|
import androidx.lifecycle.LiveData |
||||||
|
import androidx.paging.DataSource |
||||||
|
import androidx.room.Dao |
||||||
|
import androidx.room.Query |
||||||
|
import io.legado.app.data.entities.Book |
||||||
|
|
||||||
|
|
||||||
|
@Dao |
||||||
|
interface BookDao { |
||||||
|
|
||||||
|
@Query("SELECT * FROM books WHERE `group` = :group") |
||||||
|
fun observeByGroup(group: Int): DataSource.Factory<Int, Book> |
||||||
|
|
||||||
|
@Query("SELECT url FROM books WHERE `group` = :group") |
||||||
|
fun observeUrlsByGroup(group: Int): LiveData<List<String>> |
||||||
|
|
||||||
|
} |
@ -0,0 +1,34 @@ |
|||||||
|
package io.legado.app.data.entities |
||||||
|
|
||||||
|
import android.annotation.SuppressLint |
||||||
|
import android.os.Parcelable |
||||||
|
import androidx.room.* |
||||||
|
import kotlinx.android.parcel.Parcelize |
||||||
|
|
||||||
|
@Parcelize |
||||||
|
@Entity(tableName = "books", |
||||||
|
indices = [(Index(value = ["url"]))]) |
||||||
|
data class Book(@PrimaryKey |
||||||
|
var url: String = "", |
||||||
|
var name: String = "", |
||||||
|
var tag: String = "", |
||||||
|
var author: String? = null, |
||||||
|
var coverUrl: String? = null, |
||||||
|
var customCoverUrl: String? = null, |
||||||
|
var introduction: String? = null, |
||||||
|
var charset: String? = null, |
||||||
|
var type: Int = 0, // 0: text, 1: audio |
||||||
|
var group: Int = 0, // fenqu |
||||||
|
var latestChapterName: String? = null, |
||||||
|
var lastUpdateTime: Long? = null, |
||||||
|
var latestChapterTime: Long? = null, |
||||||
|
var durChapterIndex: Int = 0, |
||||||
|
var durChapterPage: Int = 0, |
||||||
|
var totalChapterNum: Int = 0, |
||||||
|
var hasNewChapter: Boolean = false, |
||||||
|
var allowUpdate: Boolean = true |
||||||
|
) : Parcelable { |
||||||
|
|
||||||
|
fun getUnreadChapterNum() = Math.max(totalChapterNum - durChapterIndex - 1, 0) |
||||||
|
|
||||||
|
} |
@ -0,0 +1,40 @@ |
|||||||
|
package io.legado.app.ui.widget |
||||||
|
|
||||||
|
import android.content.Context |
||||||
|
import android.util.AttributeSet |
||||||
|
import android.widget.FrameLayout |
||||||
|
import androidx.appcompat.app.AppCompatActivity |
||||||
|
import io.legado.app.R |
||||||
|
import kotlinx.android.synthetic.main.view_titlebar.view.* |
||||||
|
|
||||||
|
class TitleBar(context: Context, attrs: AttributeSet?) : FrameLayout(context, attrs) { |
||||||
|
|
||||||
|
init { |
||||||
|
inflate(context, R.layout.view_titlebar, this) |
||||||
|
} |
||||||
|
|
||||||
|
override fun onAttachedToWindow() { |
||||||
|
super.onAttachedToWindow() |
||||||
|
attachToActivity() |
||||||
|
} |
||||||
|
|
||||||
|
private fun attachToActivity(){ |
||||||
|
val activity = getCompatActivity(context) |
||||||
|
activity?.let { |
||||||
|
activity.setSupportActionBar(toolbar) |
||||||
|
activity.supportActionBar?.let { |
||||||
|
it.setDisplayHomeAsUpEnabled(true) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private fun getCompatActivity(context: Context?): AppCompatActivity? { |
||||||
|
if (context == null) return null |
||||||
|
return when (context) { |
||||||
|
is AppCompatActivity -> context |
||||||
|
is androidx.appcompat.view.ContextThemeWrapper -> getCompatActivity(context.baseContext) |
||||||
|
is android.view.ContextThemeWrapper -> getCompatActivity(context.baseContext) |
||||||
|
else -> null |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,16 @@ |
|||||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||||
|
<com.google.android.material.appbar.AppBarLayout |
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android" |
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto" |
||||||
|
android:id="@+id/appBar" |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:theme="@style/AppTheme.AppBarOverlay"> |
||||||
|
|
||||||
|
<androidx.appcompat.widget.Toolbar |
||||||
|
android:id="@+id/toolbar" |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
app:popupTheme="@style/AppTheme.PopupOverlay"/> |
||||||
|
|
||||||
|
</com.google.android.material.appbar.AppBarLayout> |
Loading…
Reference in new issue