forked from Ivasoft/mattermost-mobile
* Add Support for Android tablets & foldables * add tablet and book posture * Regenerate disposed observable on WindowInfoTracker
59 lines
2.3 KiB
Kotlin
59 lines
2.3 KiB
Kotlin
package com.mattermost.rnbeta
|
|
|
|
import android.app.Activity
|
|
import androidx.window.layout.FoldingFeature
|
|
import androidx.window.layout.WindowInfoTracker
|
|
import androidx.window.layout.WindowLayoutInfo
|
|
import androidx.window.rxjava3.layout.windowLayoutInfoObservable
|
|
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
|
|
import io.reactivex.rxjava3.core.Observable
|
|
import io.reactivex.rxjava3.disposables.Disposable
|
|
|
|
class FoldableObserver(private val activity: Activity) {
|
|
private var disposable: Disposable? = null
|
|
private lateinit var observable: Observable<WindowLayoutInfo>
|
|
|
|
public fun onCreate() {
|
|
observable = WindowInfoTracker.getOrCreate(activity)
|
|
.windowLayoutInfoObservable(activity)
|
|
}
|
|
|
|
public fun onStart() {
|
|
if (disposable?.isDisposed == true) {
|
|
onCreate()
|
|
}
|
|
disposable = observable.observeOn(AndroidSchedulers.mainThread())
|
|
.subscribe { layoutInfo ->
|
|
val splitViewModule = SplitViewModule.getInstance()
|
|
val foldingFeature = layoutInfo.displayFeatures
|
|
.filterIsInstance<FoldingFeature>()
|
|
.firstOrNull()
|
|
when {
|
|
foldingFeature?.state === FoldingFeature.State.FLAT ->
|
|
splitViewModule?.setDeviceFolded(false)
|
|
isTableTopPosture(foldingFeature) ->
|
|
splitViewModule?.setDeviceFolded(false)
|
|
isBookPosture(foldingFeature) ->
|
|
splitViewModule?.setDeviceFolded(false)
|
|
else -> {
|
|
splitViewModule?.setDeviceFolded(true)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public fun onStop() {
|
|
disposable?.dispose()
|
|
}
|
|
|
|
private fun isTableTopPosture(foldFeature : FoldingFeature?) : Boolean {
|
|
return foldFeature?.state == FoldingFeature.State.HALF_OPENED &&
|
|
foldFeature.orientation == FoldingFeature.Orientation.HORIZONTAL
|
|
}
|
|
|
|
private fun isBookPosture(foldFeature : FoldingFeature?) : Boolean {
|
|
return foldFeature?.state == FoldingFeature.State.HALF_OPENED &&
|
|
foldFeature.orientation == FoldingFeature.Orientation.VERTICAL
|
|
}
|
|
}
|