Skip to content

Instantly share code, notes, and snippets.

View hiking93's full-sized avatar

Hsingchien Cheng (工程師 Hiking) hiking93

View GitHub Profile
object YoutubeDlHelper {
enum class Selection(val value: Int) {
PREVIEW(0),
UNLOCKED(1)
}
private const val TAG = "youtube-dl"
fun download(url: String, selection: Selection, file: File, showDebugLogs: Boolean = true): Boolean {
import okhttp3.HttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
object EmbedResolver {
data class Result(
val url: String,
val dimensionRatio: String
)
import com.google.common.truth.Truth.assertThat
import org.junit.Test
class EmbedResolverTest {
@Test
fun `resolve youtube video regular`() {
val url = "https://www.youtube.com/watch?v=7jzSXyEln9o&feature=youtu.be"
assertThat(EmbedResolver.resolve(url)?.url)
.isEqualTo("https://www.youtube.com/embed/7jzSXyEln9o?feature=youtu.be")
@hiking93
hiking93 / themes.xml
Last active July 21, 2022 19:47
Edge-to-edge theme configuration with Material 3.
<style name="Theme.App" parent="Theme.Material3.DayNight.NoActionBar">
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
<item name="android:windowLightStatusBar">?isLightTheme</item>
<item name="android:windowLightNavigationBar">?isLightTheme</item>
</style>
@hiking93
hiking93 / EdgeToEdgeActivity.kt
Last active March 16, 2022 08:40
Setting decor to fit system windows.
class EdgeToEdgeActivity : ViewBindingActivity<ActivityMainBinding>() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setupWindow()
}
private fun setupWindow() {
WindowCompat.setDecorFitsSystemWindows(window, false)
}
@hiking93
hiking93 / EdgeToEdgeActivity.kt
Created March 16, 2022 08:41
Use `OnApplyWindowInsetsListener` to get window insets.
class EdgeToEdgeActivity : ViewBindingActivity<ActivityMainBinding>() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setupWindow()
}
private fun setupWindow() {
WindowCompat.setDecorFitsSystemWindows(window, false)
ViewCompat.setOnApplyWindowInsetsListener(binding.root) { v, insets ->
@hiking93
hiking93 / GetSystemWindowInsets.kt
Last active March 17, 2022 07:23
Getting system window insets.
val systemWindowInsets = insets.getInsets(
WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime()
)
@hiking93
hiking93 / HandleWindowInsets.kt
Last active March 17, 2022 07:23
Update padding with system window insets.
binding.root.updatePadding(
left = systemWindowInsets.left,
right = systemWindowInsets.right,
)
binding.appBarLayout.updatePadding(
top = systemWindowInsets.top,
)
binding.recyclerView.updatePadding(
bottom = systemWindowInsets.bottom + 8f.dpToPxSize(v.context),
)
@hiking93
hiking93 / ConsumeWindowInsets.kt
Created March 17, 2022 07:25
Return consumed insets in OnApplyWindowInsetsListener#onApplyWindowInsets.
val systemBarInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars())
val imeInsets = insets.getInsets(WindowInsetsCompat.Type.ime())
WindowInsetsCompat.Builder(insets)
.setInsets(
WindowInsetsCompat.Type.systemBars(),
Insets.of(0, 0, 0, systemBarInsets.bottom)
)
.setInsets(
WindowInsetsCompat.Type.ime(),
Insets.of(0, 0, 0, imeInsets.bottom)
ViewCompat.setOnApplyWindowInsetsListener(binding.root) { v, insets ->
val imeInsets = insets.getInsets(WindowInsetsCompat.Type.ime())
Log.d("Hiking", "onApplyWindowInsets, bottom = ${imeInsets.bottom}")
insets
}
ViewCompat.setWindowInsetsAnimationCallback(
binding.root,
object : WindowInsetsAnimationCompat.Callback(DISPATCH_MODE_STOP) {
override fun onPrepare(animation: WindowInsetsAnimationCompat) {