diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml
index 1212686..50ec8fe 100644
--- a/.github/workflows/android.yml
+++ b/.github/workflows/android.yml
@@ -2,7 +2,7 @@ name: Android CI
on:
push:
- branches: [ main ]
+ branches: [ main, rewrite/clean-code-arc-mvvm+i ]
pull_request:
branches: [ main ]
@@ -13,14 +13,20 @@ jobs:
steps:
- uses: actions/checkout@v2
- - name: set up JDK 11
+ - name: set up JDK 17
uses: actions/setup-java@v2
with:
- java-version: '11'
+ java-version: '17'
distribution: 'temurin'
cache: gradle
- name: Grant execute permission for gradlew
run: chmod +x gradlew
+ - name: Create file
+ run: cat ./app/google-services.json | base64
+ - name: Putting data
+ env:
+ DATA: ${{ secrets.GOOGLE_SERVICES_JSON }}
+ run: echo $DATA > ./app/google-services.json
- name: Build with Gradle
run: ./gradlew build
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index fb7f4a8..7f31de5 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -1,6 +1,8 @@
-
+
+
+
\ No newline at end of file
diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml
new file mode 100644
index 0000000..ede973d
--- /dev/null
+++ b/.idea/deploymentTargetDropDown.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml
new file mode 100644
index 0000000..8e2041c
--- /dev/null
+++ b/.idea/deploymentTargetSelector.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index a2d7c21..7b3006b 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -4,15 +4,16 @@
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..44ca2d9
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml
new file mode 100644
index 0000000..07ebd13
--- /dev/null
+++ b/.idea/kotlinc.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/material_theme_project_new.xml b/.idea/material_theme_project_new.xml
new file mode 100644
index 0000000..4c8fb51
--- /dev/null
+++ b/.idea/material_theme_project_new.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/migrations.xml b/.idea/migrations.xml
new file mode 100644
index 0000000..f8051a6
--- /dev/null
+++ b/.idea/migrations.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index c3f8a1c..5b7cfaa 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -46,7 +46,7 @@
-
+
diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml
new file mode 100644
index 0000000..931b96c
--- /dev/null
+++ b/.idea/runConfigurations.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/.gitignore b/app/.gitignore
index 0d892dc..e6e1d63 100644
--- a/app/.gitignore
+++ b/app/.gitignore
@@ -1,3 +1,4 @@
/build
/release
-/playstation
\ No newline at end of file
+/playstation
+google-services.json
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
deleted file mode 100644
index 292b08e..0000000
--- a/app/build.gradle
+++ /dev/null
@@ -1,143 +0,0 @@
-plugins {
- id 'com.android.application'
- id 'kotlin-android'
- id 'kotlin-kapt'
- id 'kotlin-parcelize'
- id 'dagger.hilt.android.plugin'
- id "androidx.navigation.safeargs"
-}
-
-android {
- compileSdk 33
- ndkVersion '25.0.8775105'
- defaultConfig {
- applicationId "io.vonley.mi"
- minSdk 21
- targetSdk 33
- versionCode 7
- versionName "1.1.0"
- testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
- javaCompileOptions {
- annotationProcessorOptions {
- arguments += [
- "room.schemaLocation" : "$projectDir/schemas".toString(),
- "room.incremental" : "true",
- "room.expandProjection": "true"
- ]
- }
- }
- }
-
- externalNativeBuild {
- ndkBuild {
- path 'src/main/jni/Android.mk'
- }
- }
- flavorDimensions 'playstation'
- productFlavors {
- playstation {
- dimension 'playstation'
- applicationId "io.vonley.mi"
- externalNativeBuild.cmake {
- cppFlags '-DPROD'
- }
-
- }
- playstationTest {
- dimension 'playstation'
- applicationId "io.vonley.mi"
- externalNativeBuild.cmake {
- cppFlags '-DDEBUG'
- }
- }
- }
-
- buildTypes {
- release {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
- signingConfig signingConfigs.debug
- }
- }
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_8
- targetCompatibility JavaVersion.VERSION_1_8
- }
- kotlinOptions {
- jvmTarget = '1.8'
- freeCompilerArgs = ['-Xjvm-default=compatibility']
- }
- buildFeatures {
- viewBinding true
- }
- lint {
- abortOnError false
- }
- buildToolsVersion '33.0.0'
-}
-
-dependencies {
-
- implementation 'androidx.core:core-ktx:1.8.0'
- implementation 'androidx.appcompat:appcompat:1.4.2'
- implementation 'com.google.android.material:material:1.6.1'
- implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
-
- implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4'
-
- implementation 'androidx.recyclerview:recyclerview:1.2.1'
- implementation 'androidx.preference:preference-ktx:1.2.0'
- implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
- implementation 'org.nanohttpd:nanohttpd:2.3.1'
-
- def navigation = "2.5.0"
-
- implementation "androidx.navigation:navigation-testing:$navigation"
- implementation "androidx.navigation:navigation-ui:$navigation"
- implementation "androidx.navigation:navigation-ui-ktx:$navigation"
- implementation "androidx.navigation:navigation-fragment:$navigation"
- implementation "androidx.navigation:navigation-fragment-ktx:$navigation"
-
- implementation "commons-net:commons-net:3.6"
-
- implementation 'com.google.code.gson:gson:2.9.0'
-
- kapt 'com.github.bumptech.glide:compiler:4.13.2'
- implementation 'com.github.bumptech.glide:glide:4.13.2'
- implementation 'com.github.bumptech.glide:okhttp3-integration:4.13.2'
-
- implementation 'org.jsoup:jsoup:1.15.2'
- implementation 'de.hdodenhof:circleimageview:3.1.0'
- implementation 'javax.inject:javax.inject:1'
- implementation 'net.danlew:android.joda:2.10.14'
-
- kapt 'androidx.room:room-compiler:2.4.2'
- annotationProcessor 'androidx.room:room-compiler:2.4.2'
- implementation("androidx.room:room-runtime:2.4.2")
- implementation 'androidx.room:room-ktx:2.4.2'
-
- implementation 'org.nanohttpd:nanohttpd-webserver:2.3.1'
- implementation 'com.squareup.picasso:picasso:2.71828'
- implementation 'com.squareup.retrofit2:retrofit:2.9.0'
- implementation "com.squareup.retrofit2:converter-gson:2.9.0"
- implementation "com.squareup.retrofit2:retrofit-converters:2.8.1"
- implementation('com.squareup.okhttp3:okhttp:5.0.0-alpha.10')
- implementation('com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.10')
-
- implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
- implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.5.0"
- implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.0"
- implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0"
-
- kapt "com.google.dagger:hilt-android-compiler:$hilt_version"
- kaptTest "com.google.dagger:hilt-android-compiler:$hilt_version"
- kaptAndroidTest "com.google.dagger:hilt-android-compiler:$hilt_version"
- implementation "com.google.dagger:hilt-android:$hilt_version"
- testImplementation "com.google.dagger:hilt-android-testing:$hilt_version"
- androidTestImplementation "com.google.dagger:hilt-android-testing:$hilt_version"
-
- implementation 'io.noties.markwon:core:4.6.2'
- testImplementation 'junit:junit:4.13.2'
- androidTestImplementation 'androidx.test.ext:junit:1.1.3'
- androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
-}
\ No newline at end of file
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
new file mode 100644
index 0000000..11012f2
--- /dev/null
+++ b/app/build.gradle.kts
@@ -0,0 +1,249 @@
+fun getInt(provider: Provider): Int {
+ return getString(provider).toInt()
+}
+
+fun getString(provider: Provider): String {
+ return provider.get()
+}
+plugins {
+ //id("kotlin-android")
+ alias(libs.plugins.android.application)
+ alias(libs.plugins.jetbrains.kotlin.android)
+ alias(libs.plugins.ksp)
+ alias(libs.plugins.nav.safe.args)
+ alias(libs.plugins.dagger.hilt)
+ id("kotlin-parcelize")
+
+ alias(libs.plugins.compose.compiler)
+
+
+ alias(libs.plugins.gms.google.services)
+ alias(libs.plugins.firebase.crashlytics)
+}
+
+android {
+ namespace = "io.vonley.mi"
+ compileSdk = 35
+ ndkVersion = "25.1.8937393"
+ buildToolsVersion = "35.0.0"
+ defaultConfig {
+ applicationId = "io.vonley.mi"
+ minSdk = 21
+ targetSdk = 35
+ versionCode = 7
+ versionName = "1.1.1-alpha"
+ testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
+ javaCompileOptions {
+ annotationProcessorOptions {
+ arguments += arrayOf(
+ "room.schemaLocation" to "${projectDir}/schemas",
+ "room.incremental" to "true",
+ "room.expandProjection" to "true"
+ )
+ }
+ }
+
+ }
+ externalNativeBuild {
+ ndkBuild {
+ path = File("src/main/jni/Android.mk")
+ }
+ }
+ flavorDimensions.add("playstation")
+ productFlavors {
+ create("playstation") {
+ dimension = "playstation"
+ applicationId = "io.vonley.mi"
+ externalNativeBuild {
+ cmake {
+ cppFlags += "-DPROD"
+ }
+ }
+
+ }
+ create("playstationTest") {
+ dimension = "playstation"
+ applicationId = "io.vonley.mi"
+ externalNativeBuild {
+ cmake {
+ cppFlags += "-DDEBUG"
+ }
+ }
+ }
+ }
+ buildTypes {
+ getByName("release") {
+ isMinifyEnabled = false
+ proguardFiles(
+ getDefaultProguardFile("proguard-android-optimize.txt"),
+ "proguard-rules.pro"
+ )
+ signingConfig = signingConfigs.getByName("debug")
+ }
+ }
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_11
+ targetCompatibility = JavaVersion.VERSION_11
+ }
+ kotlinOptions {
+ jvmTarget = "1.8"
+ freeCompilerArgs = listOf("-Xjvm-default=all-compatibility")
+ }
+
+ composeCompiler {
+ enableStrongSkippingMode = true
+ reportsDestination = layout.buildDirectory.dir("compose_compiler")
+ stabilityConfigurationFile = rootProject.layout.projectDirectory.file("stability_config.conf")
+ }
+
+ kotlinOptions {
+ jvmTarget = getString(libs.versions.jvm)
+ val composeReportsDir = "compose_reports"
+ val path = project.layout.buildDirectory.get().dir(composeReportsDir).asFile.absolutePath
+ println(path)
+ freeCompilerArgs += listOf(
+ "-P",
+ "plugin:androidx.compose.compiler.plugins.kotlin:stabilityConfigurationPath=$rootDir/stability_config.conf"
+ )
+ /*freeCompilerArgs += listOf(
+ "-P",
+ "plugin:androidx.compose.compiler.plugins.kotlin:reportsDestination=${path}"
+ )*/
+ freeCompilerArgs += listOf(
+ "-P",
+ "plugin:androidx.compose.compiler.plugins.kotlin:metricsDestination=${path}"
+ )
+ }
+ buildFeatures {
+ compose = true
+ viewBinding = true
+ buildConfig = true
+ }
+ lint {
+ abortOnError = false
+ }
+ composeOptions {
+ kotlinCompilerExtensionVersion = "1.5.14"
+ }
+ packaging {
+ resources {
+ excludes += "/META-INF/{AL2.0,LGPL2.1}"
+ }
+ }
+ /*
+ androidComponents {
+ onVariants(selector().all()) { variant ->
+ afterEvaluate {
+ val capName = variant.name.capitalize()
+ tasks.getByName("ksp${capName}Kotlin") {
+ (this as AbstractKotlinCompileTool<*>).setSource(tasks.getByName("compile${capName}Aidl").outputs)
+ }
+ }
+ }
+ }*/
+}
+
+dependencies {
+
+ // Accompanist
+
+ implementation(libs.nanohttpd)
+ implementation(libs.nanohttpd.webserver)
+ implementation(libs.commons.net)
+ implementation(libs.circleimageview)
+ implementation(libs.picasso)
+ implementation(libs.coil.compose)
+ implementation(libs.markwon.core)
+ implementation(libs.kotlinx.coroutines.android)
+
+ implementation(libs.javax.inject)
+ implementation(libs.android.joda)
+
+ implementation(platform(libs.firebase.bom))
+ implementation(libs.firebase.crashlytics.ktx)
+ implementation(libs.firebase.analytics.ktx)
+
+ implementation(libs.androidx.core.ktx)
+ implementation(libs.androidx.appcompat)
+ implementation(libs.androidx.constraint)
+ implementation(libs.androidx.recyclerview)
+ implementation(libs.androidx.preference.ktx)
+ implementation(libs.androidx.swiperefreshlayout)
+
+ implementation(libs.gson)
+ implementation(libs.jsoup)
+ implementation(libs.accompanist.pager)
+ implementation(libs.accompanist.pager.indicators)
+ implementation(libs.accompanist.themeadapter)
+ implementation(libs.androidx.animation.graphics.android)
+
+ ksp(libs.glide.ksp)
+ implementation(libs.glide)
+ implementation(libs.glide.okhttp3)
+
+ implementation(platform(libs.androidx.compose.bom))
+ androidTestImplementation(platform(libs.androidx.compose.bom))
+
+ implementation(libs.androidx.activity.compose)
+ implementation(libs.androidx.compose.material)
+ implementation(libs.androidx.compose.material3)
+ implementation(libs.androidx.compose.material3.window.size.cls)
+ implementation(libs.androidx.compose.material.icon.core)
+ implementation(libs.androidx.compose.material.icon.extended)
+
+ implementation(libs.androidx.compose.runtime.livedata)
+ implementation(libs.androidx.compose.ui)
+ implementation(libs.androidx.compose.ui.graphics)
+ implementation(libs.androidx.compose.ui.viewbinding)
+ implementation(libs.androidx.compose.ui.tooling.preview)
+ debugImplementation(libs.androidx.compose.ui.tooling)
+ debugImplementation(libs.androidx.compose.ui.test.manifest)
+ //TODO: Fix - androidTestImplementation(libs.androidx.compose.ui.test.junit4)
+
+ implementation(libs.androidx.lifecycle.extensions)
+ implementation(libs.androidx.lifecycle.runtime.ktx)
+ implementation(libs.androidx.lifecycle.runtime.compose)
+ implementation(libs.androidx.lifecycle.livedata.ktx)
+ implementation(libs.androidx.lifecycle.viewmodel.ktx)
+ implementation(libs.androidx.lifecycle.viewmodel.compose)
+
+ // Optional - Integration with activities
+
+
+ implementation(libs.hilt.android)
+ testImplementation(libs.hilt.android.testing)
+ androidTestImplementation(libs.hilt.android.testing)
+ implementation(libs.hilt.navigation.compose)
+
+ ksp(libs.hilt.android.compiler)
+ kspTest(libs.hilt.android.compiler)
+ kspAndroidTest(libs.hilt.android.compiler)
+
+
+ implementation(libs.androidx.navigation.compose)
+ implementation(libs.androidx.navigation.testing)
+ implementation(libs.androidx.navigation.ui)
+ implementation(libs.androidx.navigation.ui.ktx)
+ implementation(libs.androidx.navigation.runtime.ktx)
+ implementation(libs.androidx.navigation.fragment)
+ implementation(libs.androidx.navigation.fragment.ktx)
+ androidTestImplementation(libs.androidx.navigation.testing)
+
+ ksp(libs.androidx.room)
+ implementation(libs.androidx.room.runtime)
+ implementation(libs.androidx.room.ktx)
+ implementation(libs.androidx.room.paging)
+
+
+ implementation(libs.retrofit)
+ implementation(libs.retrofit.gson.converter)
+ implementation(libs.retrofit.converters)
+
+ implementation(libs.okhttp3)
+ implementation(libs.okhttp3.intecepter)
+
+
+ testImplementation(libs.junit)
+ androidTestImplementation(libs.androidx.junit)
+ androidTestImplementation(libs.androidx.espresso.core)
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
index 26eb93b..280e206 100644
--- a/app/proguard-rules.pro
+++ b/app/proguard-rules.pro
@@ -1,6 +1,6 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
-# proguardFiles setting in build.gradle.
+# proguardFiles setting in build.gradle.kts.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
diff --git a/app/schemas/io.vonley.mi.di.persistence.AppDatabase/4.json b/app/schemas/io.vonley.mi.di.persistence.AppDatabase/4.json
new file mode 100644
index 0000000..1e15e80
--- /dev/null
+++ b/app/schemas/io.vonley.mi.di.persistence.AppDatabase/4.json
@@ -0,0 +1,182 @@
+{
+ "formatVersion": 1,
+ "database": {
+ "version": 4,
+ "identityHash": "e05b88cca625132e72945a0901bd3e5f",
+ "entities": [
+ {
+ "tableName": "Console",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`ip` TEXT NOT NULL, `name` TEXT NOT NULL, `type` INTEGER NOT NULL, `features` TEXT NOT NULL, `lastKnownReachable` INTEGER NOT NULL, `wifi` TEXT NOT NULL, `pinned` INTEGER NOT NULL, PRIMARY KEY(`ip`))",
+ "fields": [
+ {
+ "fieldPath": "ip",
+ "columnName": "ip",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "name",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "type",
+ "columnName": "type",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "features",
+ "columnName": "features",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "lastKnownReachable",
+ "columnName": "lastKnownReachable",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "wifi",
+ "columnName": "wifi",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "pinned",
+ "columnName": "pinned",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "ip"
+ ],
+ "autoGenerate": false
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "Repo",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`link` TEXT NOT NULL, `title` TEXT NOT NULL, `author` TEXT NOT NULL, `banner` TEXT NOT NULL, `description` TEXT NOT NULL, `packages` TEXT NOT NULL, PRIMARY KEY(`link`))",
+ "fields": [
+ {
+ "fieldPath": "link",
+ "columnName": "link",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "title",
+ "columnName": "title",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "author",
+ "columnName": "author",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "banner",
+ "columnName": "banner",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "description",
+ "columnName": "description",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "packages",
+ "columnName": "packages",
+ "affinity": "TEXT",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "link"
+ ],
+ "autoGenerate": false
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "Package",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`link` TEXT NOT NULL, `name` TEXT NOT NULL, `author` TEXT NOT NULL, `version` TEXT NOT NULL, `type` INTEGER NOT NULL, `icon` TEXT NOT NULL, `dl` TEXT NOT NULL, `repo` TEXT NOT NULL, PRIMARY KEY(`repo`))",
+ "fields": [
+ {
+ "fieldPath": "link",
+ "columnName": "link",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "name",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "author",
+ "columnName": "author",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "version",
+ "columnName": "version",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "type",
+ "columnName": "type",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "icon",
+ "columnName": "icon",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "dl",
+ "columnName": "dl",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "repo",
+ "columnName": "repo",
+ "affinity": "TEXT",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "repo"
+ ],
+ "autoGenerate": false
+ },
+ "indices": [],
+ "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, 'e05b88cca625132e72945a0901bd3e5f')"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/app/schemas/io.vonley.mi.persistence.AppDatabase/3.json b/app/schemas/io.vonley.mi.persistence.AppDatabase/3.json
index f3eecae..7eb59bc 100644
--- a/app/schemas/io.vonley.mi.persistence.AppDatabase/3.json
+++ b/app/schemas/io.vonley.mi.persistence.AppDatabase/3.json
@@ -2,7 +2,7 @@
"formatVersion": 1,
"database": {
"version": 3,
- "identityHash": "c9dc10c87dd600ee3dc962fb9a5d476b",
+ "identityHash": "e05b88cca625132e72945a0901bd3e5f",
"entities": [
{
"tableName": "Console",
@@ -59,12 +59,124 @@
},
"indices": [],
"foreignKeys": []
+ },
+ {
+ "tableName": "Repo",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`link` TEXT NOT NULL, `title` TEXT NOT NULL, `author` TEXT NOT NULL, `banner` TEXT NOT NULL, `description` TEXT NOT NULL, `packages` TEXT NOT NULL, PRIMARY KEY(`link`))",
+ "fields": [
+ {
+ "fieldPath": "link",
+ "columnName": "link",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "title",
+ "columnName": "title",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "author",
+ "columnName": "author",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "banner",
+ "columnName": "banner",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "description",
+ "columnName": "description",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "packages",
+ "columnName": "packages",
+ "affinity": "TEXT",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "link"
+ ],
+ "autoGenerate": false
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "Package",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`link` TEXT NOT NULL, `name` TEXT NOT NULL, `author` TEXT NOT NULL, `version` TEXT NOT NULL, `type` INTEGER NOT NULL, `icon` TEXT NOT NULL, `dl` TEXT NOT NULL, `repo` TEXT NOT NULL, PRIMARY KEY(`repo`))",
+ "fields": [
+ {
+ "fieldPath": "link",
+ "columnName": "link",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "name",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "author",
+ "columnName": "author",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "version",
+ "columnName": "version",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "type",
+ "columnName": "type",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "icon",
+ "columnName": "icon",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "dl",
+ "columnName": "dl",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "repo",
+ "columnName": "repo",
+ "affinity": "TEXT",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "repo"
+ ],
+ "autoGenerate": false
+ },
+ "indices": [],
+ "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, 'c9dc10c87dd600ee3dc962fb9a5d476b')"
+ "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'e05b88cca625132e72945a0901bd3e5f')"
]
}
}
\ No newline at end of file
diff --git a/app/schemas/io.vonley.mi.persistence.AppDatabase/4.json b/app/schemas/io.vonley.mi.persistence.AppDatabase/4.json
new file mode 100644
index 0000000..1e15e80
--- /dev/null
+++ b/app/schemas/io.vonley.mi.persistence.AppDatabase/4.json
@@ -0,0 +1,182 @@
+{
+ "formatVersion": 1,
+ "database": {
+ "version": 4,
+ "identityHash": "e05b88cca625132e72945a0901bd3e5f",
+ "entities": [
+ {
+ "tableName": "Console",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`ip` TEXT NOT NULL, `name` TEXT NOT NULL, `type` INTEGER NOT NULL, `features` TEXT NOT NULL, `lastKnownReachable` INTEGER NOT NULL, `wifi` TEXT NOT NULL, `pinned` INTEGER NOT NULL, PRIMARY KEY(`ip`))",
+ "fields": [
+ {
+ "fieldPath": "ip",
+ "columnName": "ip",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "name",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "type",
+ "columnName": "type",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "features",
+ "columnName": "features",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "lastKnownReachable",
+ "columnName": "lastKnownReachable",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "wifi",
+ "columnName": "wifi",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "pinned",
+ "columnName": "pinned",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "ip"
+ ],
+ "autoGenerate": false
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "Repo",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`link` TEXT NOT NULL, `title` TEXT NOT NULL, `author` TEXT NOT NULL, `banner` TEXT NOT NULL, `description` TEXT NOT NULL, `packages` TEXT NOT NULL, PRIMARY KEY(`link`))",
+ "fields": [
+ {
+ "fieldPath": "link",
+ "columnName": "link",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "title",
+ "columnName": "title",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "author",
+ "columnName": "author",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "banner",
+ "columnName": "banner",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "description",
+ "columnName": "description",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "packages",
+ "columnName": "packages",
+ "affinity": "TEXT",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "link"
+ ],
+ "autoGenerate": false
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "Package",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`link` TEXT NOT NULL, `name` TEXT NOT NULL, `author` TEXT NOT NULL, `version` TEXT NOT NULL, `type` INTEGER NOT NULL, `icon` TEXT NOT NULL, `dl` TEXT NOT NULL, `repo` TEXT NOT NULL, PRIMARY KEY(`repo`))",
+ "fields": [
+ {
+ "fieldPath": "link",
+ "columnName": "link",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "name",
+ "columnName": "name",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "author",
+ "columnName": "author",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "version",
+ "columnName": "version",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "type",
+ "columnName": "type",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "icon",
+ "columnName": "icon",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "dl",
+ "columnName": "dl",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "repo",
+ "columnName": "repo",
+ "affinity": "TEXT",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "repo"
+ ],
+ "autoGenerate": false
+ },
+ "indices": [],
+ "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, 'e05b88cca625132e72945a0901bd3e5f')"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 1012891..4a8c387 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,18 +1,18 @@
-
+
+
-
-
+
+
+
+
+
+
@@ -33,6 +41,13 @@
+
+
+
-
-
-
-
-JB+FTP
-JB+FAKEUSB
-JB+NETCAT (LEGACY)
-JB+NETCAT
-
-
-MIRA
-
-
-
-
-
-FTP
-FAKEUSB
-NETCAT (LEGACY)
-NETCAT w/ ミ.js helper
-