diff --git a/.github/debug.keystore b/.github/debug.keystore new file mode 100644 index 00000000000..f6267753054 Binary files /dev/null and b/.github/debug.keystore differ diff --git a/.github/workflows/build_fork.yml b/.github/workflows/build_fork.yml new file mode 100644 index 00000000000..9915001c167 --- /dev/null +++ b/.github/workflows/build_fork.yml @@ -0,0 +1,49 @@ +name: Build APK (fork) + +# Builds an installable debug APK for this fork. +# Runs on every push to a branch other than master, or manually from the Actions tab. +on: + push: + branches-ignore: [ master ] + paths-ignore: + - '*.md' + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: build-fork-${{ github.ref }} + cancel-in-progress: true + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + + - name: Set up JDK 17 + uses: actions/setup-java@v5 + with: + distribution: temurin + java-version: 17 + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v5 + + # Use the same debug key on every build so new APKs install over old ones + - name: Install debug keystore + run: | + mkdir -p ~/.android + cp .github/debug.keystore ~/.android/debug.keystore + + - name: Build APK + run: | + chmod +x gradlew + ./gradlew assemblePrereleaseDebug + + - name: Upload APK + uses: actions/upload-artifact@v7 + with: + name: cloudstream-apk + path: "app/build/outputs/apk/prerelease/debug/*.apk" diff --git a/app/src/main/java/com/lagradost/cloudstream3/CommonActivity.kt b/app/src/main/java/com/lagradost/cloudstream3/CommonActivity.kt index 8daf168c1c1..bd1d086a0dc 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/CommonActivity.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/CommonActivity.kt @@ -356,6 +356,7 @@ object CommonActivity { "Dracula" -> R.style.DraculaMode "Lavender" -> R.style.LavenderMode "SilentBlue" -> R.style.SilentBlueMode + "Cinema" -> R.style.CinemaMode else -> R.style.AppTheme } @@ -377,6 +378,7 @@ object CommonActivity { "Green" -> R.style.OverlayPrimaryColorGreen "GreenApple" -> R.style.OverlayPrimaryColorGreenApple "Red" -> R.style.OverlayPrimaryColorRed + "CinemaRed" -> R.style.OverlayPrimaryColorCinemaRed "Banana" -> R.style.OverlayPrimaryColorBanana "Party" -> R.style.OverlayPrimaryColorParty "Pink" -> R.style.OverlayPrimaryColorPink diff --git a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt index c13b2600c13..eb420811a4d 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt @@ -119,7 +119,6 @@ import com.lagradost.cloudstream3.ui.search.SearchResultBuilder import com.lagradost.cloudstream3.ui.settings.Globals.EMULATOR import com.lagradost.cloudstream3.ui.settings.Globals.PHONE import com.lagradost.cloudstream3.ui.settings.Globals.TV -import com.lagradost.cloudstream3.ui.settings.Globals.isLandscape import com.lagradost.cloudstream3.ui.settings.Globals.isLayout import com.lagradost.cloudstream3.ui.settings.Globals.updateTv import com.lagradost.cloudstream3.ui.settings.SettingsGeneral @@ -557,14 +556,16 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener, BiometricCa }*/ binding?.apply { - navRailView.isVisible = isNavVisible && isLandscape() - navView.isVisible = isNavVisible && !isLandscape() + // Side rail on TV, bottom bar on phones and tablets + val useRail = isLayout(TV or EMULATOR) + navRailView.isVisible = isNavVisible && useRail + navView.isVisible = isNavVisible && !useRail navHostFragment.apply { val marginPx = resources.getDimensionPixelSize(R.dimen.nav_rail_view_width) layoutParams = (navHostFragment.layoutParams as ViewGroup.MarginLayoutParams).apply { marginStart = - if (isNavVisible && isLandscape() && isLayout(TV or EMULATOR)) marginPx else 0 + if (isNavVisible && useRail) marginPx else 0 } } diff --git a/app/src/main/java/com/lagradost/cloudstream3/network/DohProviders.kt b/app/src/main/java/com/lagradost/cloudstream3/network/DohProviders.kt index 4127799e8f4..d406f8c17e6 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/network/DohProviders.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/network/DohProviders.kt @@ -20,6 +20,15 @@ fun OkHttpClient.Builder.addGenericDns(url: String, ips: List) = dns( .build() ) +/** User supplied DNS-over-HTTPS server, resolved using the system DNS */ +fun OkHttpClient.Builder.addCustomDns(url: String) = dns( + DnsOverHttps + .Builder() + .client(build()) + .url(url.trim().toHttpUrl()) + .build() +) + fun OkHttpClient.Builder.addGoogleDns() = ( addGenericDns( "https://dns.google/dns-query", diff --git a/app/src/main/java/com/lagradost/cloudstream3/network/RequestsHelper.kt b/app/src/main/java/com/lagradost/cloudstream3/network/RequestsHelper.kt index e4924590458..6e83709ae49 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/network/RequestsHelper.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/network/RequestsHelper.kt @@ -63,6 +63,11 @@ fun buildDefaultClient(context: Context, ignoreSSL: Boolean = false): OkHttpClie 6 -> addQuad9Dns() 7 -> addDnsSbDns() 8 -> addCanadianShieldDns() + 9 -> settingsManager.getString( + context.getString(R.string.custom_dns_url_key), null + )?.takeIf { it.isNotBlank() }?.let { url -> + safe { addCustomDns(url) } + } } } // Needs to be build as otherwise the other builders will change this object diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt index 04f8b0b26ff..1a6c8f0329f 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt @@ -699,7 +699,8 @@ class HomeFragment : BaseFragment( homeMasterRecycler.setRecycledViewPool(ParentItemAdapter.sharedPool) homeMasterRecycler.adapter = homeMasterAdapter - homeApiFab.isVisible = isLayout(PHONE) + // The extension switch lives in the home top bar instead + homeApiFab.isVisible = false homePreviewReloadProvider.setOnClickListener { homeViewModel.loadAndCancel( diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeParentItemAdapterPreview.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeParentItemAdapterPreview.kt index 1d1a88fe998..c9c4ce877fd 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeParentItemAdapterPreview.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeParentItemAdapterPreview.kt @@ -3,6 +3,7 @@ package com.lagradost.cloudstream3.ui.home import android.content.Context import android.os.Bundle import android.os.Parcelable +import android.view.Gravity import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -28,6 +29,8 @@ import com.lagradost.cloudstream3.MainActivity import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.SearchResponse import com.lagradost.cloudstream3.databinding.FragmentHomeHeadBinding +import com.lagradost.cloudstream3.ui.home.HomeFragment.Companion.getDisplayName +import com.lagradost.cloudstream3.ui.home.HomeFragment.Companion.selectHomepage import com.lagradost.cloudstream3.databinding.FragmentHomeHeadTvBinding import com.lagradost.cloudstream3.mvvm.Resource import com.lagradost.cloudstream3.mvvm.debugException @@ -58,6 +61,7 @@ import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showOptionSelectStringRes import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbarMargin import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbarView +import com.lagradost.cloudstream3.utils.UIHelper.toPx import com.lagradost.cloudstream3.utils.UIHelper.populateChips import androidx.core.graphics.toColorInt import com.lagradost.cloudstream3.ui.setRecycledViewPool @@ -529,6 +533,29 @@ class HomeParentItemAdapterPreview( fixPaddingStatusbarMargin(topPadding) + (binding as? FragmentHomeHeadBinding)?.apply { + // The hero cards start below the top bar, so they need the same status bar offset + fixPaddingStatusbarMargin(previewViewpager) + fixPaddingStatusbarMargin(homePreviewShimmer) + + // Tablets align the hero buttons with the left aligned title + if (root.resources.configuration.smallestScreenWidthDp >= 600) { + homePreviewTitleHolder.gravity = Gravity.START or Gravity.CENTER_VERTICAL + homePreviewTitleHolder.setPaddingRelative( + root.resources.getDimensionPixelSize(R.dimen.home_hero_margin) + 24.toPx, + 0, 0, 0 + ) + } + + val changeApiListener = View.OnClickListener { view -> + view.context.selectHomepage(viewModel.apiName.value) { api -> + viewModel.loadAndCancel(api, forceReload = true, fromUI = true) + } + } + homeHeadChangeApi.setOnClickListener(changeApiListener) + alternateHomeHeadChangeApi.setOnClickListener(changeApiListener) + } + for ((chip, watch) in toggleList) { chip.isChecked = false chip.setOnCheckedChangeListener { _, isChecked -> @@ -797,6 +824,13 @@ class HomeParentItemAdapterPreview( binding.homePreviewReloadProvider.isGone = (name == noneApi.name) } }*/ + (binding as? FragmentHomeHeadBinding)?.apply { + observe(viewModel.apiName) { name -> + val displayName = homeHeadChangeApi.context.getDisplayName(name) ?: name + homeHeadChangeApi.text = displayName + alternateHomeHeadChangeApi.text = displayName + } + } observe(viewModel.resumeWatching) { updateResume(it) } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsGeneralScreen.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsGeneralScreen.kt index 6aa94fa883c..cb58df4348f 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsGeneralScreen.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsGeneralScreen.kt @@ -4,11 +4,16 @@ import android.content.Intent import android.net.Uri import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.integerArrayResource import androidx.compose.ui.res.painterResource @@ -34,6 +39,9 @@ import com.lagradost.cloudstream3.utils.SubtitleHelper.fromTagToLanguageName import com.lagradost.cloudstream3.utils.SubtitleHelper.getNameNextToFlagEmoji import com.lagradost.cloudstream4.AppSettings import com.lagradost.cloudstream4.compose.ActionDialog +import com.lagradost.cloudstream4.compose.BlackButton +import com.lagradost.cloudstream4.compose.BlackTextField +import com.lagradost.cloudstream4.compose.WhiteButton import com.lagradost.cloudstream4.compose.PHONE import com.lagradost.cloudstream4.compose.isLayout import com.lagradost.cloudstream4.rememberAppSettings @@ -44,6 +52,10 @@ import com.mihon.presentation.settings.SearchableSettings import com.mihon.presentation.settings.collectAsState import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toPersistentMap +import okhttp3.HttpUrl.Companion.toHttpUrlOrNull + +/** Value of the custom entry in R.array.dns_pref_values */ +private const val CUSTOM_DNS = 9 object SettingsGeneralScreen : SearchableSettings { @Composable @@ -108,6 +120,54 @@ object SettingsGeneralScreen : SearchableSettings { ) } + val customDnsUrl by settings.general.customDnsUrl.collectAsState() + var isCustomDnsShown by remember { mutableStateOf(false) } + + fun reloadClients() { + (CloudStreamApp.context)?.let { ctx -> + app.initClient(ctx, ignoreSSL = false) + @OptIn(UnsafeSSL::class) + insecureApp.initClient(ctx, ignoreSSL = true) + } + } + + if (isCustomDnsShown) { + var input by remember { mutableStateOf(customDnsUrl) } + AlertDialog( + containerColor = MaterialTheme.colorScheme.background, + onDismissRequest = { isCustomDnsShown = false }, + title = { Text(text = stringResource(R.string.custom_dns_pref)) }, + text = { + BlackTextField( + modifier = Modifier.fillMaxWidth(), + value = input, + placeHolder = stringResource(R.string.custom_dns_hint), + singleLine = true, + onValueChange = { input = it.trim() } + ) + }, + confirmButton = { + WhiteButton(text = stringResource(R.string.ok), onClick = { + val url = input.toHttpUrlOrNull() + if (url == null || !url.isHttps) { + showToast(R.string.custom_dns_invalid) + return@WhiteButton + } + isCustomDnsShown = false + // Must set the value before initClient is called + settings.general.customDnsUrl.set(input) + settings.general.dns.set(CUSTOM_DNS) + reloadClients() + }) + }, + dismissButton = { + BlackButton(text = stringResource(R.string.cancel), onClick = { + isCustomDnsShown = false + }) + } + ) + } + val default = AllLanguagesName to stringResource(R.string.all_languages_preference) val languages = APIHolder.apis.withLock { APIHolder.apis.map { api -> api.lang }.distinct() @@ -223,15 +283,21 @@ object SettingsGeneralScreen : SearchableSettings { stringArrayResource(R.array.dns_pref) ).toMap(), onValueChanged = { newValue -> - settings.general.dns.set(newValue) // Must set the value before initClient is called - (CloudStreamApp.context)?.let { ctx -> - app.initClient(ctx, ignoreSSL = false) - @OptIn(UnsafeSSL::class) - insecureApp.initClient(ctx, ignoreSSL = true) + if (newValue == CUSTOM_DNS && customDnsUrl.isBlank()) { + isCustomDnsShown = true + return@ListPreference false } + settings.general.dns.set(newValue) // Must set the value before initClient is called + reloadClients() return@ListPreference true }, ), + Preference.PreferenceItem.TextPreference( + title = stringResource(R.string.custom_dns_pref), + subtitle = customDnsUrl.ifBlank { stringResource(R.string.custom_dns_pref_summary) }, + icon = painterResource(R.drawable.dns_24px), + onClick = { isCustomDnsShown = true } + ), Preference.PreferenceItem.SwitchPreference( title = stringResource(R.string.jsdelivr_proxy), subtitle = stringResource(R.string.jsdelivr_proxy_summary), diff --git a/app/src/main/res/drawable/home_pill_background.xml b/app/src/main/res/drawable/home_pill_background.xml new file mode 100644 index 00000000000..1dece881003 --- /dev/null +++ b/app/src/main/res/drawable/home_pill_background.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/app/src/main/res/layout-sw600dp/home_scroll_view.xml b/app/src/main/res/layout-sw600dp/home_scroll_view.xml new file mode 100644 index 00000000000..9fb6e445d44 --- /dev/null +++ b/app/src/main/res/layout-sw600dp/home_scroll_view.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index eb7c67145b3..1258e3affa4 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -38,8 +38,8 @@ android:id="@+id/nav_view" android:layout_height="@dimen/nav_view_height" android:layout_width="0dp" - app:labelVisibilityMode="unlabeled" - android:background="?attr/primaryGrayBackground" + app:labelVisibilityMode="labeled" + android:background="?attr/primaryBlackBackground" app:itemIconTint="@color/item_select_color" app:itemTextColor="@color/item_select_color" diff --git a/app/src/main/res/layout/fragment_home_head.xml b/app/src/main/res/layout/fragment_home_head.xml index b62173edea3..ef8c2bbd76b 100644 --- a/app/src/main/res/layout/fragment_home_head.xml +++ b/app/src/main/res/layout/fragment_home_head.xml @@ -16,37 +16,60 @@ + android:layout_height="@dimen/home_hero_height"> + - - + android:layout_marginTop="@dimen/home_top_bar_height" + android:orientation="horizontal" /> - + + + android:paddingHorizontal="12dp"> + + + + + + + app:cardCornerRadius="6dp"> - - + @@ -135,23 +168,28 @@ style="@style/WhiteButton" android:layout_width="wrap_content" android:layout_gravity="center" + android:minWidth="120dp" android:text="@string/home_play" + app:cornerRadius="24dp" app:icon="@drawable/ic_baseline_play_arrow_24" /> + android:textStyle="bold" + app:drawableStartCompat="@drawable/ic_outline_info_24" + app:drawableTint="?attr/white" /> @@ -161,10 +199,32 @@ android:id="@+id/alternative_account_padding" android:layout_width="match_parent" android:layout_height="50dp" - android:gravity="end" + android:gravity="end|center_vertical" android:orientation="horizontal" android:paddingHorizontal="0dp"> + + + diff --git a/app/src/main/res/layout/home_scroll_view.xml b/app/src/main/res/layout/home_scroll_view.xml index 3291b9b7b56..2947d6f28e8 100644 --- a/app/src/main/res/layout/home_scroll_view.xml +++ b/app/src/main/res/layout/home_scroll_view.xml @@ -1,83 +1,87 @@ + - - - - - - - + android:layout_marginHorizontal="@dimen/home_hero_margin" + android:layout_marginBottom="8dp" + app:cardBackgroundColor="?attr/primaryGrayBackground" + app:cardCornerRadius="18dp" + app:cardElevation="0dp" + app:strokeColor="#33FFFFFF" + app:strokeWidth="1dp"> + + + android:layout_gravity="top" + android:alpha="0.6" + android:background="@drawable/background_shadow" + android:rotation="180" + android:visibility="visible" /> - - - - + android:layout_gravity="bottom|center_horizontal" + android:layout_marginBottom="84dp" + android:orientation="vertical" + android:paddingHorizontal="24dp"> + + + + + + + + - \ No newline at end of file + diff --git a/app/src/main/res/layout/homepage_parent.xml b/app/src/main/res/layout/homepage_parent.xml index 9c5dc84d45c..6d63e321176 100644 --- a/app/src/main/res/layout/homepage_parent.xml +++ b/app/src/main/res/layout/homepage_parent.xml @@ -12,7 +12,11 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginEnd="0dp" - android:padding="12dp" + android:paddingStart="14dp" + android:paddingEnd="12dp" + android:paddingTop="16dp" + android:paddingBottom="6dp" + android:textSize="19sp" tools:text="@string/continue_watching" app:drawableRightCompat="@drawable/ic_baseline_arrow_forward_24" app:drawableTint="?attr/white" diff --git a/app/src/main/res/values-b+es/array.xml b/app/src/main/res/values-b+es/array.xml index 5456d03e235..66b1fa38f90 100644 --- a/app/src/main/res/values-b+es/array.xml +++ b/app/src/main/res/values-b+es/array.xml @@ -192,6 +192,7 @@ Lavanda Material You Material You (Secondary) + Cinema Red Normal @@ -229,6 +230,7 @@ Dracula Sueños De Lavanda Azul Silencioso + Cinema Black AmoledLight diff --git a/app/src/main/res/values-b+pl/array.xml b/app/src/main/res/values-b+pl/array.xml index 13297219c93..5a2ff5cb42f 100644 --- a/app/src/main/res/values-b+pl/array.xml +++ b/app/src/main/res/values-b+pl/array.xml @@ -202,6 +202,7 @@ Lawenda Material You Material You (drugorzędny) + Cinema Red Normal @@ -239,6 +240,7 @@ Dracula Lawendowe Marzenia Cichy Błękit + Cinema Black AmoledLight diff --git a/app/src/main/res/values-b+tr/array.xml b/app/src/main/res/values-b+tr/array.xml index 5a7901ea97e..2e55f15309e 100644 --- a/app/src/main/res/values-b+tr/array.xml +++ b/app/src/main/res/values-b+tr/array.xml @@ -214,6 +214,7 @@ Lavanta Material You Material You (İkincil) + Cinema Red Normal @@ -250,6 +251,7 @@ Dracula Lavanta Rüyası Sessiz Mavi + Cinema Black AmoledLight diff --git a/app/src/main/res/values-b+vi/array.xml b/app/src/main/res/values-b+vi/array.xml index 848ff014bd1..c312ecd1a59 100644 --- a/app/src/main/res/values-b+vi/array.xml +++ b/app/src/main/res/values-b+vi/array.xml @@ -193,6 +193,7 @@ Hoa oải hương Material You Material You (Secondary) + Cinema Red Normal @@ -230,6 +231,7 @@ Dracula Giấc Mơ Oải Hương Xanh Lam Tĩnh Lặng + Cinema Black AmoledLight diff --git a/app/src/main/res/values-sw600dp/dimens.xml b/app/src/main/res/values-sw600dp/dimens.xml new file mode 100644 index 00000000000..ba8e7e27e62 --- /dev/null +++ b/app/src/main/res/values-sw600dp/dimens.xml @@ -0,0 +1,5 @@ + + + 600dp + 24dp + diff --git a/app/src/main/res/values/array.xml b/app/src/main/res/values/array.xml index d14dca768c5..ebbce1ea879 100644 --- a/app/src/main/res/values/array.xml +++ b/app/src/main/res/values/array.xml @@ -24,6 +24,7 @@ Quad9 DNS.SB Canadian Shield + @string/custom_dns 0 @@ -35,6 +36,7 @@ 6 7 8 + 9 @@ -277,6 +279,7 @@ Lavender Material You Material You (Secondary) + Cinema Red Normal @@ -301,6 +304,7 @@ Lavender Monet Monet2 + CinemaRed @@ -313,6 +317,7 @@ Dracula Lavender Dreams Silent Blue + Cinema Black AmoledLight @@ -324,6 +329,7 @@ Dracula Lavender SilentBlue + Cinema diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 48b69232abe..9506d1a8ba7 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -99,6 +99,15 @@ #5664B7 #D50000 + #E50914 + + + #181818 + #000000 + #222222 + #141414 + #FFFFFF + #B3B3B3 #6200EA #00BFA5 #48E484 diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index b0c150000b5..32f46f8963c 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -2,7 +2,10 @@ 16dp 16dp - 10dp + 6dp + 56dp + 560dp + 16dp 4dp 0dp diff --git a/app/src/main/res/values/donottranslate-strings.xml b/app/src/main/res/values/donottranslate-strings.xml index bf1566cdb98..4ab02581f4d 100644 --- a/app/src/main/res/values/donottranslate-strings.xml +++ b/app/src/main/res/values/donottranslate-strings.xml @@ -48,6 +48,7 @@ random_button_key provider_lang_key dns_key + custom_dns_url_key jsdelivr_proxy_key download_path_key download_parallel_key diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6c429519967..e16c6597a06 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -347,6 +347,11 @@ Causes problems if set too high on devices with low storage space, such as Android TV. DNS over HTTPS Useful for bypassing ISP blocks + Custom + Custom DNS server + Enter your own DNS-over-HTTPS address + https://dns.example.com/dns-query + Enter a valid https:// DNS-over-HTTPS address GitHub Proxy Could not reach GitHub. Turning on jsDelivr proxy… Bypass blocking of raw github URLs using jsDelivr. May cause updates to be delayed by few days. diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index a5f8492dc9d..222b135e031 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -224,6 +224,19 @@ true + + + +