forked from recloudstream/cloudstream
fixed stuff
This commit is contained in:
parent
67ade4d0b4
commit
ebc0485233
5 changed files with 95 additions and 33 deletions
|
@ -35,8 +35,8 @@ android {
|
||||||
minSdkVersion 21
|
minSdkVersion 21
|
||||||
targetSdkVersion 30
|
targetSdkVersion 30
|
||||||
|
|
||||||
versionCode 37
|
versionCode 38
|
||||||
versionName "2.4.5"
|
versionName "2.4.6"
|
||||||
|
|
||||||
resValue "string", "app_version",
|
resValue "string", "app_version",
|
||||||
"${defaultConfig.versionName}${versionNameSuffix ?: ""}"
|
"${defaultConfig.versionName}${versionNameSuffix ?: ""}"
|
||||||
|
@ -91,8 +91,8 @@ dependencies {
|
||||||
implementation 'androidx.appcompat:appcompat:1.4.0'
|
implementation 'androidx.appcompat:appcompat:1.4.0'
|
||||||
implementation 'com.google.android.material:material:1.4.0'
|
implementation 'com.google.android.material:material:1.4.0'
|
||||||
implementation 'androidx.constraintlayout:constraintlayout:2.1.2'
|
implementation 'androidx.constraintlayout:constraintlayout:2.1.2'
|
||||||
implementation 'androidx.navigation:navigation-fragment-ktx:2.4.0-beta02'
|
implementation 'androidx.navigation:navigation-fragment-ktx:2.4.0-rc01'
|
||||||
implementation 'androidx.navigation:navigation-ui-ktx:2.4.0-beta02'
|
implementation 'androidx.navigation:navigation-ui-ktx:2.4.0-rc01'
|
||||||
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.4.0'
|
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.4.0'
|
||||||
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0'
|
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0'
|
||||||
testImplementation 'junit:junit:4.13.2'
|
testImplementation 'junit:junit:4.13.2'
|
||||||
|
|
|
@ -9,6 +9,7 @@ import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import java.net.SocketTimeoutException
|
import java.net.SocketTimeoutException
|
||||||
import java.net.UnknownHostException
|
import java.net.UnknownHostException
|
||||||
|
import javax.net.ssl.SSLHandshakeException
|
||||||
|
|
||||||
fun <T> LifecycleOwner.observe(liveData: LiveData<T>, action: (t: T) -> Unit) {
|
fun <T> LifecycleOwner.observe(liveData: LiveData<T>, action: (t: T) -> Unit) {
|
||||||
liveData.observe(this) { it?.let { t -> action(t) } }
|
liveData.observe(this) { it?.let { t -> action(t) } }
|
||||||
|
@ -50,6 +51,15 @@ fun <T> normalSafeApiCall(apiCall: () -> T): T? {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun <T> safeFail(throwable: Throwable): Resource<T> {
|
||||||
|
val stackTraceMsg = (throwable.localizedMessage ?: "") + "\n\n" + throwable.stackTrace.joinToString(
|
||||||
|
separator = "\n"
|
||||||
|
) {
|
||||||
|
"${it.fileName} ${it.lineNumber}"
|
||||||
|
}
|
||||||
|
return Resource.Failure(false, null, null, stackTraceMsg)
|
||||||
|
}
|
||||||
|
|
||||||
suspend fun <T> safeApiCall(
|
suspend fun <T> safeApiCall(
|
||||||
apiCall: suspend () -> T,
|
apiCall: suspend () -> T,
|
||||||
): Resource<T> {
|
): Resource<T> {
|
||||||
|
@ -59,11 +69,24 @@ suspend fun <T> safeApiCall(
|
||||||
} catch (throwable: Throwable) {
|
} catch (throwable: Throwable) {
|
||||||
logError(throwable)
|
logError(throwable)
|
||||||
when (throwable) {
|
when (throwable) {
|
||||||
|
is NullPointerException -> {
|
||||||
|
for (line in throwable.stackTrace) {
|
||||||
|
if (line.fileName.endsWith("provider.kt", ignoreCase = true)) {
|
||||||
|
return@withContext Resource.Failure(
|
||||||
|
false,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
"NullPointerException at ${line.fileName} ${line.lineNumber}\nSite might have updated or added Cloudflare/DDOS protection"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
safeFail(throwable)
|
||||||
|
}
|
||||||
is SocketTimeoutException -> {
|
is SocketTimeoutException -> {
|
||||||
Resource.Failure(true, null, null, "Please try again later.")
|
Resource.Failure(true, null, null, "Connection Timeout\nPlease try again later.")
|
||||||
}
|
}
|
||||||
is HttpException -> {
|
is HttpException -> {
|
||||||
Resource.Failure(false, throwable.statusCode, null, throwable.localizedMessage ?: "")
|
Resource.Failure(false, throwable.statusCode, null, throwable.message ?: "HttpException")
|
||||||
}
|
}
|
||||||
is UnknownHostException -> {
|
is UnknownHostException -> {
|
||||||
Resource.Failure(true, null, null, "Cannot connect to server, try again later.")
|
Resource.Failure(true, null, null, "Cannot connect to server, try again later.")
|
||||||
|
@ -74,14 +97,15 @@ suspend fun <T> safeApiCall(
|
||||||
is NotImplementedError -> {
|
is NotImplementedError -> {
|
||||||
Resource.Failure(false, null, null, "This operation is not implemented.")
|
Resource.Failure(false, null, null, "This operation is not implemented.")
|
||||||
}
|
}
|
||||||
else -> {
|
is SSLHandshakeException -> {
|
||||||
val stackTraceMsg = (throwable.localizedMessage ?: "") + "\n\n" + throwable.stackTrace.joinToString(
|
Resource.Failure(
|
||||||
separator = "\n"
|
true,
|
||||||
) {
|
null,
|
||||||
"${it.fileName} ${it.lineNumber}"
|
null,
|
||||||
}
|
(throwable.message ?: "SSLHandshakeException") + "\nTry again later."
|
||||||
Resource.Failure(false, null, null, stackTraceMsg) //
|
)
|
||||||
}
|
}
|
||||||
|
else -> safeFail(throwable)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -533,13 +533,12 @@ class PlayerFragment : Fragment() {
|
||||||
// https://exoplayer.dev/doc/reference/constant-values.html
|
// https://exoplayer.dev/doc/reference/constant-values.html
|
||||||
if (isLocked || exoPlayer.duration == TIME_UNSET || (!swipeEnabled && !swipeVerticalEnabled)) return
|
if (isLocked || exoPlayer.duration == TIME_UNSET || (!swipeEnabled && !swipeVerticalEnabled)) return
|
||||||
|
|
||||||
|
|
||||||
val audioManager = activity?.getSystemService(AUDIO_SERVICE) as? AudioManager
|
val audioManager = activity?.getSystemService(AUDIO_SERVICE) as? AudioManager
|
||||||
|
|
||||||
when (motionEvent.action) {
|
when (motionEvent.action) {
|
||||||
MotionEvent.ACTION_DOWN -> {
|
MotionEvent.ACTION_DOWN -> {
|
||||||
// SO YOU CAN PULL DOWN STATUSBAR OR NAVBAR
|
// SO YOU CAN PULL DOWN STATUSBAR OR NAVBAR
|
||||||
if (motionEvent.rawY > statusBarHeight && motionEvent.rawX < width - navigationBarHeight) {
|
if (motionEvent.rawY > statusBarHeight && motionEvent.rawX < max(width, height) - navigationBarHeight) {
|
||||||
currentX = motionEvent.rawX
|
currentX = motionEvent.rawX
|
||||||
currentY = motionEvent.rawY
|
currentY = motionEvent.rawY
|
||||||
isValidTouch = true
|
isValidTouch = true
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
<vector
|
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:name="vector"
|
|
||||||
android:width="850dp"
|
|
||||||
android:height="850dp"
|
|
||||||
android:viewportWidth="850"
|
|
||||||
android:viewportHeight="850">
|
|
||||||
<group android:name="group_6">
|
|
||||||
<path
|
|
||||||
android:name="path_2"
|
|
||||||
android:pathData="M 698.92 450.33 C 697.92 440.99 690.27 432.74 679.92 430.25 L 653.67 430.75 C 655.17 407.75 636.67 386.63 618.79 384 C 611.804 381.871 604.367 381.698 597.29 383.5 C 597.91 379.77 602.74 347.16 578.79 322 C 558.72 300.92 532.54 299.13 517.67 299.31 L 500.37 298.92 C 494.76 293.4 460.65 262.47 412.62 266.67 C 382.23 269.32 354.96 277.67 334.79 302.67 C 333.11 304.74 327.6 311.81 321.17 320.81 C 318.82 323.81 316.91 327.43 314.79 330.5 C 314.63 330.74 288.79 326.44 272.79 331 C 247.52 338.2 224.79 358.54 217.29 385.5 C 215.44 392.18 209.08 415.09 219.79 435 C 222.101 439.202 223.081 444.009 222.6 448.78 C 219.48 450.41 205.02 450.94 182.29 450 C 164.43 449.27 149.83 463.6 149.79 480 C 149.74 497.17 165.23 510.58 184.29 510 C 205.93 510.23 605.96 510.67 637.04 510.56 C 650.12 510.56 656.79 499.17 656.79 499.17 C 661.24 493.35 661.09 486.09 661.04 481.5 L 661.04 477 L 664.79 477 L 675.96 476.33 C 690.35 474.78 700.21 462.36 698.92 450.33 Z M 407.54 456 L 407.54 349.25 L 483.75 402.63 Z"
|
|
||||||
android:fillColor="#ffffff"
|
|
||||||
android:strokeWidth="1"/>
|
|
||||||
</group>
|
|
||||||
</vector>
|
|
|
@ -43,52 +43,100 @@
|
||||||
</FrameLayout>
|
</FrameLayout>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
|
android:nextFocusDown="@id/subs_font_size"
|
||||||
|
android:nextFocusLeft="@id/apply_btt"
|
||||||
|
android:nextFocusRight="@id/cancel_btt"
|
||||||
|
|
||||||
android:id="@+id/subs_font"
|
android:id="@+id/subs_font"
|
||||||
android:text="@string/subs_font"
|
android:text="@string/subs_font"
|
||||||
style="@style/SettingsItem">
|
style="@style/SettingsItem">
|
||||||
<requestFocus/>
|
|
||||||
</TextView>
|
</TextView>
|
||||||
<TextView
|
<TextView
|
||||||
|
android:nextFocusUp="@id/subs_font"
|
||||||
|
android:nextFocusDown="@id/subs_text_color"
|
||||||
|
android:nextFocusLeft="@id/apply_btt"
|
||||||
|
android:nextFocusRight="@id/cancel_btt"
|
||||||
|
|
||||||
android:id="@+id/subs_font_size"
|
android:id="@+id/subs_font_size"
|
||||||
android:text="@string/subs_font_size"
|
android:text="@string/subs_font_size"
|
||||||
style="@style/SettingsItem"
|
style="@style/SettingsItem"
|
||||||
/>
|
/>
|
||||||
<TextView
|
<TextView
|
||||||
|
android:nextFocusUp="@id/subs_font_size"
|
||||||
|
android:nextFocusDown="@id/subs_outline_color"
|
||||||
|
android:nextFocusLeft="@id/apply_btt"
|
||||||
|
android:nextFocusRight="@id/cancel_btt"
|
||||||
|
|
||||||
android:id="@+id/subs_text_color"
|
android:id="@+id/subs_text_color"
|
||||||
android:text="@string/subs_text_color"
|
android:text="@string/subs_text_color"
|
||||||
style="@style/SettingsItem"
|
style="@style/SettingsItem"
|
||||||
/>
|
/>
|
||||||
<TextView
|
<TextView
|
||||||
|
android:nextFocusUp="@id/subs_text_color"
|
||||||
|
android:nextFocusDown="@id/subs_background_color"
|
||||||
|
android:nextFocusLeft="@id/apply_btt"
|
||||||
|
android:nextFocusRight="@id/cancel_btt"
|
||||||
|
|
||||||
android:id="@+id/subs_outline_color"
|
android:id="@+id/subs_outline_color"
|
||||||
android:text="@string/subs_outline_color"
|
android:text="@string/subs_outline_color"
|
||||||
style="@style/SettingsItem"
|
style="@style/SettingsItem"
|
||||||
/>
|
/>
|
||||||
<TextView
|
<TextView
|
||||||
|
android:nextFocusUp="@id/subs_outline_color"
|
||||||
|
android:nextFocusDown="@id/subs_window_color"
|
||||||
|
android:nextFocusLeft="@id/apply_btt"
|
||||||
|
android:nextFocusRight="@id/cancel_btt"
|
||||||
|
|
||||||
android:id="@+id/subs_background_color"
|
android:id="@+id/subs_background_color"
|
||||||
android:text="@string/subs_background_color"
|
android:text="@string/subs_background_color"
|
||||||
style="@style/SettingsItem"
|
style="@style/SettingsItem"
|
||||||
/>
|
/>
|
||||||
<TextView
|
<TextView
|
||||||
|
android:nextFocusUp="@id/subs_background_color"
|
||||||
|
android:nextFocusDown="@id/subs_edge_type"
|
||||||
|
android:nextFocusLeft="@id/apply_btt"
|
||||||
|
android:nextFocusRight="@id/cancel_btt"
|
||||||
|
|
||||||
android:id="@+id/subs_window_color"
|
android:id="@+id/subs_window_color"
|
||||||
android:text="@string/subs_window_color"
|
android:text="@string/subs_window_color"
|
||||||
style="@style/SettingsItem"
|
style="@style/SettingsItem"
|
||||||
/>
|
/>
|
||||||
<TextView
|
<TextView
|
||||||
|
android:nextFocusUp="@id/subs_window_color"
|
||||||
|
android:nextFocusDown="@id/subs_subtitle_elevation"
|
||||||
|
android:nextFocusLeft="@id/apply_btt"
|
||||||
|
android:nextFocusRight="@id/cancel_btt"
|
||||||
|
|
||||||
android:id="@+id/subs_edge_type"
|
android:id="@+id/subs_edge_type"
|
||||||
android:text="@string/subs_edge_type"
|
android:text="@string/subs_edge_type"
|
||||||
style="@style/SettingsItem"
|
style="@style/SettingsItem"
|
||||||
/>
|
/>
|
||||||
<TextView
|
<TextView
|
||||||
|
android:nextFocusUp="@id/subs_edge_type"
|
||||||
|
android:nextFocusDown="@id/subs_auto_select_language"
|
||||||
|
android:nextFocusLeft="@id/apply_btt"
|
||||||
|
android:nextFocusRight="@id/cancel_btt"
|
||||||
|
|
||||||
android:id="@+id/subs_subtitle_elevation"
|
android:id="@+id/subs_subtitle_elevation"
|
||||||
android:text="@string/subs_subtitle_elevation"
|
android:text="@string/subs_subtitle_elevation"
|
||||||
style="@style/SettingsItem"
|
style="@style/SettingsItem"
|
||||||
/>
|
/>
|
||||||
<TextView
|
<TextView
|
||||||
|
android:nextFocusUp="@id/subs_subtitle_elevation"
|
||||||
|
android:nextFocusDown="@id/subs_download_languages"
|
||||||
|
android:nextFocusLeft="@id/apply_btt"
|
||||||
|
android:nextFocusRight="@id/cancel_btt"
|
||||||
|
|
||||||
android:id="@+id/subs_auto_select_language"
|
android:id="@+id/subs_auto_select_language"
|
||||||
android:text="@string/subs_auto_select_language"
|
android:text="@string/subs_auto_select_language"
|
||||||
style="@style/SettingsItem"
|
style="@style/SettingsItem"
|
||||||
/>
|
/>
|
||||||
<TextView
|
<TextView
|
||||||
|
android:nextFocusUp="@id/subs_auto_select_language"
|
||||||
|
android:nextFocusDown="@id/apply_btt"
|
||||||
|
android:nextFocusLeft="@id/apply_btt"
|
||||||
|
android:nextFocusRight="@id/cancel_btt"
|
||||||
|
|
||||||
android:id="@+id/subs_download_languages"
|
android:id="@+id/subs_download_languages"
|
||||||
android:text="@string/subs_download_languages"
|
android:text="@string/subs_download_languages"
|
||||||
style="@style/SettingsItem"
|
style="@style/SettingsItem"
|
||||||
|
@ -112,14 +160,20 @@
|
||||||
android:layout_height="60dp">
|
android:layout_height="60dp">
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:nextFocusUp="@id/subs_download_languages"
|
||||||
|
android:nextFocusRight="@id/cancel_btt"
|
||||||
style="@style/WhiteButton"
|
style="@style/WhiteButton"
|
||||||
android:layout_gravity="center_vertical|end"
|
android:layout_gravity="center_vertical|end"
|
||||||
android:visibility="visible"
|
android:visibility="visible"
|
||||||
android:text="@string/sort_apply"
|
android:text="@string/sort_apply"
|
||||||
android:id="@+id/apply_btt"
|
android:id="@+id/apply_btt"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content">
|
||||||
/>
|
<requestFocus/>
|
||||||
|
</com.google.android.material.button.MaterialButton>
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:nextFocusUp="@id/subs_download_languages"
|
||||||
|
android:nextFocusLeft="@id/apply_btt"
|
||||||
style="@style/BlackButton"
|
style="@style/BlackButton"
|
||||||
android:layout_gravity="center_vertical|end"
|
android:layout_gravity="center_vertical|end"
|
||||||
android:text="@string/sort_cancel"
|
android:text="@string/sort_cancel"
|
||||||
|
|
Loading…
Reference in a new issue