Merge branch 'dev'
This commit is contained in:
commit
0241b8cee3
25 changed files with 436 additions and 151 deletions
25
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
25
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
|
@ -7,16 +7,19 @@ body:
|
|||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
> [!WARNING]
|
||||
> ## ONLY OPEN AN ISSUE IF:
|
||||
> * You are using an up-to-date version of VendroidEnhanced
|
||||
> * You **did not** edit the Vencord location in app settings
|
||||
> * You are using Discord Stable, not PTB or Canary.
|
||||
> * You **could not** reproduce the issue on:
|
||||
> * Vencord Web, Vesktop, or ArmCord, on a computer
|
||||
> * The Discord mobile website (`discord.com/app`) on a mobile browser WITHOUT VENCORD
|
||||
>
|
||||
> **Your issue will get closed and you will possibly be blocked from the repository if you cannot read this!**
|
||||
## READ BEFORE SUBMITTING AN ISSUE
|
||||
![Flowchart](https://github.com/user-attachments/assets/36fe18ba-52c3-4a5d-a721-edd25af47381)
|
||||
<details>
|
||||
<summary>Flowchart but in text format</summary>
|
||||
|
||||
Only open an issue if:
|
||||
* You are using an up-to-date version of VendroidEnhanced
|
||||
* You did not edit the Vencord location in app settings
|
||||
* You are using Discord Stable, not PTB or Canary.
|
||||
* You could not reproduce the issue on:
|
||||
* Vencord Web, Vesktop, or ArmCord, on a computer
|
||||
* The Discord mobile website (discord.com/app) on a mobile browser WITHOUT VENCORD
|
||||
</details>
|
||||
|
||||
- type: input
|
||||
id: discord
|
||||
|
@ -67,4 +70,4 @@ body:
|
|||
- label: I am using Discord Stable or tried on Stable and this bug happens there as well
|
||||
required: true
|
||||
- label: I have read the requirements for opening an issue above
|
||||
required: true
|
||||
required: true
|
||||
|
|
3
.github/workflows/android.yml
vendored
3
.github/workflows/android.yml
vendored
|
@ -9,7 +9,8 @@ on:
|
|||
branches:
|
||||
- '*'
|
||||
- '!main'
|
||||
|
||||
pull_request:
|
||||
merge_group:
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
# VendroidEnhanced
|
||||
|
||||
<img src="https://waka.nin0.dev/api/badge/nin0/interval:any/project:Vendroid"/>
|
||||
|
||||
> [!CAUTION]
|
||||
> This app is still in beta. If you have an issue:
|
||||
|
|
|
@ -9,10 +9,10 @@ android {
|
|||
|
||||
defaultConfig {
|
||||
applicationId "com.nin0dev.vendroid"
|
||||
minSdk 21
|
||||
minSdk 25
|
||||
targetSdk 34
|
||||
versionCode 5
|
||||
versionName "1.2"
|
||||
versionCode 7
|
||||
versionName "1.4"
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
|
@ -32,11 +32,12 @@ android {
|
|||
|
||||
dependencies {
|
||||
|
||||
implementation 'androidx.annotation:annotation:1.8.1'
|
||||
implementation 'androidx.annotation:annotation:1.8.2'
|
||||
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.28'
|
||||
implementation 'com.google.android.material:material:1.12.0'
|
||||
implementation 'androidx.appcompat:appcompat:1.6.1'
|
||||
implementation 'androidx.activity:activity:1.9.1'
|
||||
implementation 'com.google.code.gson:gson:2.11.0'
|
||||
implementation 'com.android.volley:volley:1.2.1'
|
||||
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
|
||||
}
|
||||
|
|
13
app/src/debug/res/xml/shortcuts.xml
Normal file
13
app/src/debug/res/xml/shortcuts.xml
Normal file
|
@ -0,0 +1,13 @@
|
|||
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<shortcut
|
||||
android:shortcutId="recovery"
|
||||
android:enabled="true"
|
||||
android:icon="@drawable/reset"
|
||||
android:shortcutShortLabel="@string/recovery_shortcut_name"
|
||||
android:shortcutLongLabel="@string/recovery_shortcut_name">
|
||||
<intent
|
||||
android:action="android.intent.action.VIEW"
|
||||
android:targetPackage="com.nin0dev.vendroid.debug"
|
||||
android:targetClass="com.nin0dev.vendroid.RecoveryActivity" />
|
||||
</shortcut>
|
||||
</shortcuts>
|
|
@ -12,7 +12,13 @@
|
|||
android:roundIcon="@mipmap/ic_launcher_round"
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/AppTheme"
|
||||
android:usesCleartextTraffic="true"
|
||||
tools:targetApi="34">
|
||||
<activity
|
||||
android:name=".RecoveryActivity"
|
||||
android:exported="true"
|
||||
android:launchMode="singleTask"
|
||||
android:theme="@style/AppTheme" />
|
||||
<activity
|
||||
android:name=".SettingsActivity"
|
||||
android:exported="false" />
|
||||
|
@ -26,6 +32,10 @@
|
|||
android:exported="true"
|
||||
android:launchMode="singleTask"
|
||||
android:theme="@style/AppTheme">
|
||||
<meta-data
|
||||
android:name="android.app.shortcuts"
|
||||
android:resource="@xml/shortcuts" />
|
||||
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
|
@ -49,4 +59,4 @@
|
|||
</activity>
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
</manifest>
|
|
@ -3,6 +3,7 @@ package com.nin0dev.vendroid
|
|||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
import android.widget.Toast
|
||||
import java.io.ByteArrayOutputStream
|
||||
import java.io.File
|
||||
import java.io.IOException
|
||||
|
@ -24,7 +25,8 @@ object HttpClient {
|
|||
val res = activity.resources
|
||||
res.openRawResource(R.raw.vencord_mobile).use { `is` -> VencordMobileRuntime = readAsText(`is`) }
|
||||
if (VencordRuntime != null) return
|
||||
if (sPrefs.getString("vencordLocation", Constants.JS_BUNDLE_URL) == Constants.JS_BUNDLE_URL || BuildConfig.DEBUG) { // user is debugging vencord or app, always redownload
|
||||
if (sPrefs.getString("vencordLocation", Constants.JS_BUNDLE_URL) != Constants.JS_BUNDLE_URL || BuildConfig.DEBUG) { // user is debugging vencord or app, always redownload
|
||||
Toast.makeText(activity, "Debugging app or Vencord, bundle will be redownloaded. Avoid using on limited networks", Toast.LENGTH_LONG).show()
|
||||
vendroidFile.delete()
|
||||
}
|
||||
if (vendroidFile.exists()) {
|
||||
|
|
|
@ -11,6 +11,7 @@ import android.os.Bundle
|
|||
import android.os.StrictMode
|
||||
import android.os.StrictMode.ThreadPolicy
|
||||
import android.view.KeyEvent
|
||||
import android.view.View.VISIBLE
|
||||
import android.view.WindowManager
|
||||
import android.webkit.ValueCallback
|
||||
import android.webkit.WebView
|
||||
|
@ -19,42 +20,61 @@ import com.android.volley.Request
|
|||
import com.android.volley.toolbox.StringRequest
|
||||
import com.android.volley.toolbox.Volley
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import com.google.gson.Gson
|
||||
import com.nin0dev.vendroid.HttpClient.fetchVencord
|
||||
import com.nin0dev.vendroid.Logger.e
|
||||
import kotlinx.serialization.ExperimentalSerializationApi
|
||||
import kotlinx.serialization.Serializable
|
||||
import kotlinx.serialization.decodeFromString
|
||||
import kotlinx.serialization.json.Json
|
||||
import pl.droidsonroids.gif.GifImageView
|
||||
import java.io.IOException
|
||||
|
||||
|
||||
@Serializable
|
||||
data class UpdateData(val version: Int, val changelog: String)
|
||||
|
||||
class MainActivity : Activity() {
|
||||
private var wvInitialized = false
|
||||
private var wv: WebView? = null
|
||||
@JvmField
|
||||
var filePathCallback: ValueCallback<Array<Uri?>?>? = null
|
||||
|
||||
@OptIn(ExperimentalSerializationApi::class)
|
||||
fun checkUpdates(ignoreSetting: Boolean = false)
|
||||
{
|
||||
val sPrefs = getSharedPreferences("settings", Context.MODE_PRIVATE)
|
||||
if(sPrefs.getBoolean("checkVendroidUpdates", false) || ignoreSetting) {
|
||||
val queue = Volley.newRequestQueue(this)
|
||||
val url = "https://raw.githubusercontent.com/VendroidEnhanced/UpdateTracker/main/vendroid"
|
||||
val url = "https://vendroid.nin0.dev/api/updates"
|
||||
val stringRequest = StringRequest(
|
||||
Request.Method.GET, url,
|
||||
{ response ->
|
||||
if(Integer.parseInt(response.trim()) != BuildConfig.VERSION_CODE)
|
||||
{
|
||||
val madb = MaterialAlertDialogBuilder(this)
|
||||
madb.setTitle(getString(R.string.vendroid_update_available))
|
||||
madb.setMessage("To make sure that no unexpected bugs happen, it is recommended to update.")
|
||||
madb.setPositiveButton(getString(R.string.update), DialogInterface.OnClickListener { dialogInterface, i ->
|
||||
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/VendroidEnhanced/Vendroid/releases/latest/download/app-release.apk"))
|
||||
startActivity(browserIntent)
|
||||
})
|
||||
madb.setNegativeButton(getString(R.string.later), DialogInterface.OnClickListener { _, _ -> })
|
||||
madb.show()
|
||||
}
|
||||
if(ignoreSetting && Integer.parseInt(response.trim()) == BuildConfig.VERSION_CODE) {
|
||||
showDiscordToast("No updates available", "MESSAGE")
|
||||
}
|
||||
},
|
||||
{ })
|
||||
Request.Method.GET, url,
|
||||
{ response ->
|
||||
val gson = Gson()
|
||||
val updateData = gson.fromJson<UpdateData>(response, UpdateData::class.java)
|
||||
if(updateData.version != BuildConfig.VERSION_CODE)
|
||||
{
|
||||
val madb = MaterialAlertDialogBuilder(this)
|
||||
madb.setTitle(getString(R.string.vendroid_update_available))
|
||||
madb.setMessage("Changelog:\n" + updateData.changelog)
|
||||
madb.setPositiveButton(getString(R.string.update), DialogInterface.OnClickListener { dialogInterface, i ->
|
||||
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/VendroidEnhanced/Vendroid/releases/latest/download/app-release.apk"))
|
||||
startActivity(browserIntent)
|
||||
})
|
||||
madb.setNegativeButton(getString(R.string.later), DialogInterface.OnClickListener { _, _ -> })
|
||||
madb.show()
|
||||
}
|
||||
if(ignoreSetting && updateData.version == BuildConfig.VERSION_CODE) {
|
||||
showDiscordToast("No updates available", "MESSAGE")
|
||||
}
|
||||
},
|
||||
{ error ->
|
||||
if (BuildConfig.DEBUG) {
|
||||
e("Network error during update check", error)
|
||||
}
|
||||
Toast.makeText(this, "Failed to check for updates", Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
)
|
||||
stringRequest.setShouldCache(false);
|
||||
queue.add(stringRequest)
|
||||
}
|
||||
|
@ -69,9 +89,13 @@ class MainActivity : Activity() {
|
|||
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)
|
||||
window.navigationBarColor = Color.TRANSPARENT
|
||||
val sPrefs = getSharedPreferences("settings", Context.MODE_PRIVATE)
|
||||
val editor = sPrefs.edit()
|
||||
// https://developer.chrome.com/docs/devtools/remote-debugging/webviews/
|
||||
WebView.setWebContentsDebuggingEnabled(BuildConfig.DEBUG)
|
||||
setContentView(R.layout.activity_main)
|
||||
if (sPrefs.getString("splash", "viggy") == "viggy") findViewById<GifImageView>(R.id.viggy_gif).visibility = VISIBLE
|
||||
else if (sPrefs.getString("splash", "viggy") == "shiggy") findViewById<GifImageView>(R.id.shiggy_gif).visibility = VISIBLE
|
||||
else if (sPrefs.getString("splash", "viggy") == "oneko") findViewById<GifImageView>(R.id.oneko_gif).visibility = VISIBLE
|
||||
wv = findViewById(R.id.webview)!!
|
||||
explodeAndroid()
|
||||
wv!!.setWebViewClient(VWebviewClient())
|
||||
|
@ -80,11 +104,18 @@ class MainActivity : Activity() {
|
|||
s.javaScriptEnabled = true
|
||||
s.domStorageEnabled = true
|
||||
s.allowFileAccess = true
|
||||
wv?.addJavascriptInterface(VencordNative(this, wv!!), "VencordMobileNative")
|
||||
try {
|
||||
fetchVencord(this)
|
||||
} catch (ex: IOException) {
|
||||
if(!sPrefs.getBoolean("safeMode", false)) {
|
||||
wv?.addJavascriptInterface(VencordNative(this, wv!!), "VencordMobileNative")
|
||||
try {
|
||||
fetchVencord(this)
|
||||
} catch (ex: IOException) {
|
||||
|
||||
}
|
||||
}
|
||||
else {
|
||||
Toast.makeText(this, "Safe mode enabled, Vencord won't be loaded", Toast.LENGTH_SHORT).show()
|
||||
editor.putBoolean("safeMode", false)
|
||||
editor.apply()
|
||||
}
|
||||
val intent = intent
|
||||
if (intent.action == Intent.ACTION_VIEW) {
|
||||
|
@ -111,36 +142,44 @@ class MainActivity : Activity() {
|
|||
return super.onKeyDown(keyCode, event)
|
||||
}
|
||||
|
||||
override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent) {
|
||||
if (requestCode != FILECHOOSER_RESULTCODE || filePathCallback == null) return
|
||||
if (resultCode != RESULT_OK || intent == null) {
|
||||
filePathCallback!!.onReceiveValue(null)
|
||||
} else {
|
||||
var uris: Array<Uri?>?
|
||||
try {
|
||||
val clipData = intent.clipData
|
||||
if (clipData != null) { // multiple items
|
||||
uris = arrayOfNulls(clipData.itemCount)
|
||||
for (i in 0 until clipData.itemCount) {
|
||||
uris[i] = clipData.getItemAt(i).uri
|
||||
override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) {
|
||||
super.onActivityResult(requestCode, resultCode, intent)
|
||||
try {
|
||||
if(resultCode != RESULT_CANCELED) {
|
||||
if (requestCode != FILECHOOSER_RESULTCODE || filePathCallback == null) return
|
||||
if (resultCode != RESULT_OK || intent == null) {
|
||||
filePathCallback!!.onReceiveValue(null)
|
||||
} else {
|
||||
var uris: Array<Uri?>?
|
||||
try {
|
||||
val clipData = intent.clipData
|
||||
if (clipData != null) { // multiple items
|
||||
uris = arrayOfNulls(clipData.itemCount)
|
||||
for (i in 0 until clipData.itemCount) {
|
||||
uris[i] = clipData.getItemAt(i).uri
|
||||
}
|
||||
} else { // single item
|
||||
uris = arrayOf(intent.data)
|
||||
}
|
||||
} catch (ex: Exception) {
|
||||
e("Error during file upload", ex)
|
||||
uris = null
|
||||
}
|
||||
} else { // single item
|
||||
uris = arrayOf(intent.data)
|
||||
filePathCallback!!.onReceiveValue(uris)
|
||||
}
|
||||
} catch (ex: Exception) {
|
||||
e("Error during file upload", ex)
|
||||
uris = null
|
||||
filePathCallback = null
|
||||
}
|
||||
filePathCallback!!.onReceiveValue(uris)
|
||||
}
|
||||
filePathCallback = null
|
||||
catch (ex: Exception) {
|
||||
// it is well known that the best fix for the crash is to wrap the entire function in a try/catch block
|
||||
}
|
||||
}
|
||||
|
||||
private fun explodeAndroid() {
|
||||
StrictMode.setThreadPolicy(
|
||||
ThreadPolicy.Builder() // trolley
|
||||
.permitNetwork()
|
||||
.build()
|
||||
ThreadPolicy.Builder() // trolley
|
||||
.permitNetwork()
|
||||
.build()
|
||||
)
|
||||
}
|
||||
|
||||
|
|
51
app/src/main/java/com/nin0dev/vendroid/RecoveryActivity.kt
Normal file
51
app/src/main/java/com/nin0dev/vendroid/RecoveryActivity.kt
Normal file
|
@ -0,0 +1,51 @@
|
|||
package com.nin0dev.vendroid
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.graphics.Color
|
||||
import android.os.Bundle
|
||||
import android.view.WindowManager
|
||||
import android.webkit.CookieManager
|
||||
import android.webkit.CookieSyncManager
|
||||
import android.webkit.WebView
|
||||
import android.widget.Button
|
||||
import androidx.activity.enableEdgeToEdge
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.core.view.ViewCompat
|
||||
import androidx.core.view.WindowInsetsCompat
|
||||
import com.google.android.material.card.MaterialCardView
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
|
||||
class RecoveryActivity : AppCompatActivity() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
|
||||
window.statusBarColor = Color.TRANSPARENT
|
||||
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)
|
||||
window.navigationBarColor = Color.TRANSPARENT
|
||||
|
||||
setContentView(R.layout.activity_recovery)
|
||||
|
||||
findViewById<MaterialCardView>(R.id.start_normally).setOnClickListener {
|
||||
finish()
|
||||
startActivity(Intent(this, MainActivity::class.java))
|
||||
}
|
||||
findViewById<MaterialCardView>(R.id.safe_mode).setOnClickListener {
|
||||
val sPrefs = getSharedPreferences("settings", Context.MODE_PRIVATE)
|
||||
val e = sPrefs.edit()
|
||||
e.putBoolean("safeMode", true)
|
||||
e.apply()
|
||||
finish()
|
||||
startActivity(Intent(this, MainActivity::class.java))
|
||||
}
|
||||
findViewById<MaterialCardView>(R.id.settings).setOnClickListener {
|
||||
finish()
|
||||
startActivity(Intent(this, SettingsActivity::class.java))
|
||||
}
|
||||
|
||||
}
|
||||
override fun onNewIntent(intent: Intent) {
|
||||
super.onNewIntent(intent)
|
||||
}
|
||||
}
|
|
@ -37,6 +37,11 @@ class SettingsActivity : AppCompatActivity() {
|
|||
"ptb" -> findViewById<MaterialRadioButton>(R.id.ptb).isChecked = true
|
||||
"canary" -> findViewById<MaterialRadioButton>(R.id.canary).isChecked = true
|
||||
}
|
||||
when (sPrefs.getString("splash", "viggy")) {
|
||||
"viggy" -> findViewById<MaterialRadioButton>(R.id.viggy).isChecked = true
|
||||
"shiggy" -> findViewById<MaterialRadioButton>(R.id.shiggy).isChecked = true
|
||||
"oneko" -> findViewById<MaterialRadioButton>(R.id.oneko).isChecked = true
|
||||
}
|
||||
if(sPrefs.getString("vencordLocation", "")?.isNotBlank() == true) {
|
||||
findViewById<CheckBox>(R.id.allow_custom_location).isChecked = true
|
||||
val devbuildField = findViewById<TextInputEditText>(R.id.custom_location)
|
||||
|
@ -71,6 +76,9 @@ class SettingsActivity : AppCompatActivity() {
|
|||
if (findViewById<RadioButton>(R.id.stable).isChecked) editor.putString("discordBranch", "stable")
|
||||
if (findViewById<RadioButton>(R.id.ptb).isChecked) editor.putString("discordBranch", "ptb")
|
||||
if (findViewById<RadioButton>(R.id.canary).isChecked) editor.putString("discordBranch", "canary")
|
||||
if (findViewById<RadioButton>(R.id.viggy).isChecked) editor.putString("splash", "viggy")
|
||||
if (findViewById<RadioButton>(R.id.shiggy).isChecked) editor.putString("splash", "shiggy")
|
||||
if (findViewById<RadioButton>(R.id.oneko).isChecked) editor.putString("splash", "oneko")
|
||||
if (findViewById<CheckBox>(R.id.allow_custom_location).isChecked && findViewById<EditText>(R.id.custom_location).text.isNotBlank()) editor.putString("vencordLocation", findViewById<EditText>(R.id.custom_location).text.toString())
|
||||
|
||||
editor.apply()
|
||||
|
|
|
@ -8,9 +8,12 @@ import android.webkit.WebResourceRequest
|
|||
import android.webkit.WebResourceResponse
|
||||
import android.webkit.WebView
|
||||
import android.webkit.WebViewClient
|
||||
import android.widget.Toast
|
||||
import androidx.annotation.RequiresApi
|
||||
import com.nin0dev.vendroid.Logger.e
|
||||
import java.io.File
|
||||
import java.io.IOException
|
||||
import java.lang.Exception
|
||||
import java.net.HttpURLConnection
|
||||
import java.net.URL
|
||||
|
||||
|
@ -26,8 +29,13 @@ class VWebviewClient : WebViewClient() {
|
|||
}
|
||||
|
||||
override fun onPageStarted(view: WebView, url: String, favicon: Bitmap?) {
|
||||
view.evaluateJavascript(HttpClient.VencordRuntime!!, null)
|
||||
view.evaluateJavascript(HttpClient.VencordMobileRuntime!!, null)
|
||||
try {
|
||||
HttpClient.VencordRuntime?.let { view.evaluateJavascript(it, null) }
|
||||
HttpClient.VencordMobileRuntime?.let { view.evaluateJavascript(it, null) }
|
||||
}
|
||||
catch (e: Exception) {
|
||||
Toast.makeText(view.context, "Couldn't load Vencord, try restarting the app.", Toast.LENGTH_LONG).show()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onPageFinished(view: WebView, url: String) {
|
||||
|
|
|
@ -27,25 +27,6 @@ class WelcomeActivity : AppCompatActivity() {
|
|||
|
||||
setContentView(R.layout.activity_welcome)
|
||||
|
||||
val devbuildCheckbox = findViewById<CheckBox>(R.id.allow_custom_location)
|
||||
devbuildCheckbox.setOnClickListener {
|
||||
if (devbuildCheckbox.isChecked) {
|
||||
MaterialAlertDialogBuilder(this)
|
||||
.setTitle("Warning")
|
||||
.setMessage("If you set a custom location, you will be loading and injecting Vencord from a different location. This feature is meant for developers ONLY. Never edit this setting if someone else asked you to, or if you don't know what you're doing! If you do set a custom location, you will not be able to ask for support in the Vencord support channel or in this project's issues. Are you sure you want to continue?")
|
||||
.setNegativeButton(resources.getString(R.string.no)) { _, _ ->
|
||||
devbuildCheckbox.isChecked = false
|
||||
}
|
||||
.setPositiveButton(resources.getString(R.string.yes)) { _, _ ->
|
||||
findViewById<EditText>(R.id.custom_location).visibility = VISIBLE
|
||||
}
|
||||
.show()
|
||||
}
|
||||
else {
|
||||
findViewById<EditText>(R.id.custom_location).visibility = GONE
|
||||
}
|
||||
}
|
||||
|
||||
findViewById<ExtendedFloatingActionButton>(R.id.save_settings).setOnClickListener {
|
||||
val sPrefs = getSharedPreferences("settings", Context.MODE_PRIVATE)
|
||||
val editor = sPrefs.edit()
|
||||
|
@ -54,7 +35,6 @@ class WelcomeActivity : AppCompatActivity() {
|
|||
if (findViewById<RadioButton>(R.id.stable).isChecked) editor.putString("discordBranch", "stable")
|
||||
if (findViewById<RadioButton>(R.id.ptb).isChecked) editor.putString("discordBranch", "ptb")
|
||||
if (findViewById<RadioButton>(R.id.canary).isChecked) editor.putString("discordBranch", "canary")
|
||||
if (findViewById<CheckBox>(R.id.allow_custom_location).isChecked && findViewById<EditText>(R.id.custom_location).text.isNotBlank()) editor.putString("vencordLocation", findViewById<EditText>(R.id.custom_location).text.toString())
|
||||
|
||||
editor.apply()
|
||||
finish()
|
||||
|
|
BIN
app/src/main/res/drawable/oneko.gif
Normal file
BIN
app/src/main/res/drawable/oneko.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
7
app/src/main/res/drawable/reset.xml
Normal file
7
app/src/main/res/drawable/reset.xml
Normal file
|
@ -0,0 +1,7 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#000000" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
|
||||
|
||||
<path android:fillColor="@android:color/white" android:pathData="M12,5V2L8,6l4,4V7c3.31,0 6,2.69 6,6c0,2.97 -2.17,5.43 -5,5.91v2.02c3.95,-0.49 7,-3.85 7,-7.93C20,8.58 16.42,5 12,5z"/>
|
||||
|
||||
<path android:fillColor="@android:color/white" android:pathData="M6,13c0,-1.65 0.67,-3.15 1.76,-4.24L6.34,7.34C4.9,8.79 4,10.79 4,13c0,4.08 3.05,7.44 7,7.93v-2.02C8.17,18.43 6,15.97 6,13z"/>
|
||||
|
||||
</vector>
|
BIN
app/src/main/res/drawable/shiggy.gif
Normal file
BIN
app/src/main/res/drawable/shiggy.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 63 KiB |
|
@ -13,11 +13,31 @@
|
|||
android:orientation="vertical">
|
||||
|
||||
<pl.droidsonroids.gif.GifImageView
|
||||
android:id="@+id/viggy_gif"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="232dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:scaleX="1"
|
||||
android:scaleY="1"
|
||||
android:src="@drawable/viggy" />
|
||||
android:src="@drawable/viggy"
|
||||
android:visibility="gone" />
|
||||
|
||||
<pl.droidsonroids.gif.GifImageView
|
||||
android:id="@+id/shiggy_gif"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="228dp"
|
||||
android:scaleX="1"
|
||||
android:scaleY="1"
|
||||
android:src="@drawable/shiggy"
|
||||
android:visibility="gone" />
|
||||
|
||||
<pl.droidsonroids.gif.GifImageView
|
||||
android:id="@+id/oneko_gif"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:scaleX="1"
|
||||
android:scaleY="1"
|
||||
android:src="@drawable/oneko"
|
||||
android:visibility="gone" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
|
|
129
app/src/main/res/layout/activity_recovery.xml
Normal file
129
app/src/main/res/layout/activity_recovery.xml
Normal file
|
@ -0,0 +1,129 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/main_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:fitsSystemWindows="true">
|
||||
|
||||
<androidx.core.widget.NestedScrollView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:padding="20dp"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
|
||||
android:orientation="vertical">
|
||||
|
||||
<com.google.android.material.card.MaterialCardView
|
||||
android:id="@+id/start_normally"
|
||||
style="?attr/materialCardViewFilledStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:clickable="true">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
android:padding="16dp">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/start_normally"
|
||||
android:textAppearance="?attr/textAppearanceTitleMedium" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="8dp"
|
||||
android:text="@string/start_normally_desc"
|
||||
android:textAppearance="?attr/textAppearanceBodyMedium"
|
||||
android:textColor="?android:attr/textColorSecondary" />
|
||||
</LinearLayout>
|
||||
</com.google.android.material.card.MaterialCardView>
|
||||
|
||||
|
||||
<com.google.android.material.card.MaterialCardView
|
||||
android:id="@+id/safe_mode"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="10dp"
|
||||
android:clickable="true">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
android:padding="16dp">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/safe_mode"
|
||||
android:textAppearance="?attr/textAppearanceTitleMedium" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="8dp"
|
||||
android:text="@string/safe_mode_desc"
|
||||
android:textAppearance="?attr/textAppearanceBodyMedium"
|
||||
android:textColor="?android:attr/textColorSecondary" />
|
||||
</LinearLayout>
|
||||
</com.google.android.material.card.MaterialCardView>
|
||||
|
||||
|
||||
<com.google.android.material.card.MaterialCardView
|
||||
android:id="@+id/settings"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="10dp"
|
||||
android:clickable="true">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
android:padding="16dp">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/open_settings"
|
||||
android:textAppearance="?attr/textAppearanceTitleMedium" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="8dp"
|
||||
android:text="@string/open_settings_desc"
|
||||
android:textAppearance="?attr/textAppearanceBodyMedium"
|
||||
android:textColor="?android:attr/textColorSecondary" />
|
||||
</LinearLayout>
|
||||
</com.google.android.material.card.MaterialCardView>
|
||||
</LinearLayout>
|
||||
|
||||
</androidx.core.widget.NestedScrollView>
|
||||
|
||||
|
||||
<com.google.android.material.appbar.AppBarLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:elevation="0dp"
|
||||
app:layout_collapseMode="pin"
|
||||
app:title="@string/recovery_shortcut_name"
|
||||
app:titleTextColor="@color/text" />
|
||||
|
||||
</com.google.android.material.appbar.AppBarLayout>
|
||||
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
|
@ -40,6 +40,38 @@
|
|||
android:enabled="false"
|
||||
android:text="@string/autocheck_vencord" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/splashscreen"
|
||||
android:textColor="@color/text"
|
||||
android:textSize="18sp" />
|
||||
|
||||
<RadioGroup
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<RadioButton
|
||||
android:id="@+id/viggy"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:checked="true"
|
||||
android:text="@string/viggy" />
|
||||
|
||||
<RadioButton
|
||||
android:id="@+id/shiggy"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/shiggy" />
|
||||
|
||||
<RadioButton
|
||||
android:id="@+id/oneko"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/oneko" />
|
||||
|
||||
</RadioGroup>
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
|
@ -110,22 +142,13 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent">
|
||||
|
||||
<com.google.android.material.appbar.CollapsingToolbarLayout
|
||||
style="?attr/collapsingToolbarLayoutLargeStyle"
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/collapsingToolbarLayoutLargeSize"
|
||||
app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"
|
||||
app:contentScrim="?attr/colorSurfaceContainer">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:elevation="0dp"
|
||||
app:layout_collapseMode="pin"
|
||||
app:title="Vendroid Settings"
|
||||
app:titleTextColor="@color/text" />
|
||||
|
||||
</com.google.android.material.appbar.CollapsingToolbarLayout>
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:elevation="0dp"
|
||||
app:layout_collapseMode="pin"
|
||||
app:title="Vendroid Settings"
|
||||
app:titleTextColor="@color/text" />
|
||||
|
||||
</com.google.android.material.appbar.AppBarLayout>
|
||||
|
||||
|
|
|
@ -71,34 +71,6 @@
|
|||
android:text="@string/canary" />
|
||||
</RadioGroup>
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/vencord_location"
|
||||
android:textColor="@color/text"
|
||||
android:textSize="18sp" />
|
||||
|
||||
<CheckBox
|
||||
android:id="@+id/allow_custom_location"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/set_custom_location" />
|
||||
|
||||
<com.google.android.material.textfield.TextInputLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:fitsSystemWindows="true"
|
||||
android:hint="@string/custom_location_url">
|
||||
|
||||
<com.google.android.material.textfield.TextInputEditText
|
||||
android:id="@+id/custom_location"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible" />
|
||||
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</androidx.core.widget.NestedScrollView>
|
||||
|
@ -110,22 +82,13 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent">
|
||||
|
||||
<com.google.android.material.appbar.CollapsingToolbarLayout
|
||||
style="?attr/collapsingToolbarLayoutLargeStyle"
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/collapsingToolbarLayoutLargeSize"
|
||||
app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"
|
||||
app:contentScrim="?attr/colorSurfaceContainer">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:elevation="0dp"
|
||||
app:layout_collapseMode="pin"
|
||||
app:title="Welcome to Vendroid"
|
||||
app:titleTextColor="@color/text" />
|
||||
|
||||
</com.google.android.material.appbar.CollapsingToolbarLayout>
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
android:elevation="0dp"
|
||||
app:layout_collapseMode="pin"
|
||||
app:title="Welcome to Vendroid"
|
||||
app:titleTextColor="@color/text" />
|
||||
|
||||
</com.google.android.material.appbar.AppBarLayout>
|
||||
|
||||
|
|
|
@ -15,7 +15,19 @@
|
|||
<string name="custom_location_url">Custom location URL</string>
|
||||
<string name="no">No</string>
|
||||
<string name="yes">Yes</string>
|
||||
<string name="vendroid_update_available">Vendroid update available</string>
|
||||
<string name="vendroid_update_available">VendroidEnhanced update available</string>
|
||||
<string name="update">Update</string>
|
||||
<string name="later">Later</string>
|
||||
<string name="viggy">Viggy, by shoritsu</string>
|
||||
<string name="shiggy">Shiggy, by naga_U</string>
|
||||
<string name="oneko">Oneko</string>
|
||||
<string name="splashscreen">Splash screen</string>
|
||||
<string name="recovery_shortcut_name">Recovery mode</string>
|
||||
<string name="cleared_all">Cleared all cookies</string>
|
||||
<string name="start_normally">Start normally</string>
|
||||
<string name="start_normally_desc">Don\'t do anything and start the app normally.</string>
|
||||
<string name="safe_mode">Safe mode</string>
|
||||
<string name="safe_mode_desc">Use this option to launch the app and load Discord, but without Vencord or any VendroidEnhanced tweak injected.</string>
|
||||
<string name="open_settings">Open settings</string>
|
||||
<string name="open_settings_desc">Configure VendroidEnhanced.</string>
|
||||
</resources>
|
13
app/src/main/res/xml/shortcuts.xml
Normal file
13
app/src/main/res/xml/shortcuts.xml
Normal file
|
@ -0,0 +1,13 @@
|
|||
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<shortcut
|
||||
android:shortcutId="recovery"
|
||||
android:enabled="true"
|
||||
android:icon="@drawable/reset"
|
||||
android:shortcutShortLabel="@string/recovery_shortcut_name"
|
||||
android:shortcutLongLabel="@string/recovery_shortcut_name">
|
||||
<intent
|
||||
android:action="android.intent.action.VIEW"
|
||||
android:targetPackage="com.nin0dev.vendroid"
|
||||
android:targetClass="com.nin0dev.vendroid.RecoveryActivity" />
|
||||
</shortcut>
|
||||
</shortcuts>
|
|
@ -1,6 +1,6 @@
|
|||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||
plugins {
|
||||
id 'com.android.application' version '8.3.1' apply false
|
||||
id 'com.android.library' version '8.5.1' apply false
|
||||
id 'com.android.application' version '8.5.2' apply false
|
||||
id 'com.android.library' version '8.5.2' apply false
|
||||
id 'org.jetbrains.kotlin.android' version '1.9.25' apply false
|
||||
}
|
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
|
@ -1,6 +1,6 @@
|
|||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
|
|
@ -2,5 +2,6 @@
|
|||
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||
"extends": [
|
||||
"config:recommended"
|
||||
]
|
||||
],
|
||||
"baseBranches": ["dev"]
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue