Skip to content

Instantly share code, notes, and snippets.

View nazmulidris's full-sized avatar
🤙
❯ Write Rust 🦀 for r3bl-open-core ❯ rec 📹 live code vids developerlife YT chan

Nazmul Idris nazmulidris

🤙
❯ Write Rust 🦀 for r3bl-open-core ❯ rec 📹 live code vids developerlife YT chan
View GitHub Profile
@nazmulidris
nazmulidris / turfUtils.ts
Created August 29, 2021 16:42
working w/ turf.js
/*
* turf docs:
* - https://turfjs.org/docs/#nearestPoint
* - https://turfjs.org/docs/#feature
*
* mapbox sample w/ turf:
* - https://docs.mapbox.com/help/tutorials/analysis-with-turf/
*/
import { MapboxGeoJSONFeature } from "mapbox-gl"
override fun onPictureInPictureModeChanged(
isInPIPMode: Boolean, newConfig: Configuration?) {
exoplayerview_activity_video.useController = !isInPictureInPictureMode
}
override fun onUserLeaveHint() {
enterPictureInPictureMode(
with(PictureInPictureParams.Builder()) {
val width = 16
val height = 9
setAspectRatio(Rational(width, height))
build()
})
}
<application>
<activity
android:name="com.example.android.videoplayersample.VideoActivity"
android:supportsPictureInPicture="true"
...>
</activity>
...
</application>
class AudioFocusWrapper(private val audioAttributes: AudioAttributesCompat,
private val audioManager: AudioManager,
private val player: SimpleExoPlayer) : ExoPlayer by player, AnkoLogger {
private var shouldPlayWhenReady = false
private val audioFocusListener =
AudioManager.OnAudioFocusChangeListener { focusChange ->
when (focusChange) {
AudioManager.AUDIOFOCUS_GAIN -> {
if (shouldPlayWhenReady || player.playWhenReady) {
val audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
val audioAttributes = AudioAttributesCompat.Builder()
.setContentType(AudioAttributesCompat.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributesCompat.USAGE_MEDIA)
.build()
player = ExoPlayerFactory.newSimpleInstance(context, DefaultTrackSelector())
.apply {
...
}
fun buildMediaSource(): MediaSource {
val uriList = mutableListOf<MediaSource>()
MediaCatalog.list.forEach {
uriList.add(createExtractorMediaSource(it.mediaUri!!))
}
override fun onCreate(savedInstanceState: Bundle?) {
...
mediaSession = MediaSessionCompat(this, packageName)
connector = MediaSessionConnector(mediaSession)
// If QueueNavigator isn't set, then mediaSessionConnector won’t handle
// MediaSession actions (they won't show up in the minimized PIP activity):
// [ACTION_SKIP_PREVIOUS], [ACTION_SKIP_NEXT], [ACTION_SKIP_TO_QUEUE_ITEM]
connector.setQueueNavigator(object : TimelineQueueNavigator(mMediaSession) {
override fun getMediaDescription(idx: Int): MediaDescriptionCompat {
return MediaCatalog.list.get(idx)
override fun onCreate(savedInstanceState: Bundle?) {
...
playerHolder = PlayerHolder(this, exoplayerview_activity_video, state)
mediaSession = MediaSessionCompat(this, packageName)
connector = MediaSessionConnector(mediaSession)
}
override fun onStart() {
...
playerHolder.start()
<LinearLayout
...
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_gravity="center"
android:background="@#CC000000"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"