mirror of https://git.sr.ht/~oppen/ariane
functional mp3 p[layer
This commit is contained in:
parent
eb169f8c8e
commit
130bd5d641
|
@ -10,8 +10,8 @@ android {
|
|||
applicationId "oppen.tva"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 30
|
||||
versionCode 5
|
||||
versionName "0.2.0 Beta"
|
||||
versionCode 6
|
||||
versionName "0.3.0 Beta"
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
|
|
Binary file not shown.
|
@ -11,8 +11,8 @@
|
|||
"type": "SINGLE",
|
||||
"filters": [],
|
||||
"properties": [],
|
||||
"versionCode": 5,
|
||||
"versionName": "0.2.0 Beta",
|
||||
"versionCode": 6,
|
||||
"versionName": "0.3.0 Beta",
|
||||
"enabled": true,
|
||||
"outputFile": "app-release.apk"
|
||||
}
|
||||
|
|
|
@ -6,6 +6,6 @@ class Tva: Application() {
|
|||
|
||||
companion object{
|
||||
const val DEFAULT_HOME_CAPSULE = "gemini://gemini.circumlunar.space/~oppen/tva/index.gmi"
|
||||
const val GEMINI_USER_SEARCH_BASE = "gemini://gus.guru/search/2?"
|
||||
const val GEMINI_USER_SEARCH_BASE = "gemini://gus.guru/search?"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,66 @@
|
|||
package oppen.tva.ui
|
||||
|
||||
import android.content.Context
|
||||
import android.media.MediaMetadataRetriever
|
||||
import android.media.MediaPlayer
|
||||
import oppen.tva.R
|
||||
import oppen.tva.databinding.ActivityTvaBinding
|
||||
import oppen.tva.io.TvaState
|
||||
import oppen.visible
|
||||
|
||||
object AudioPlayer {
|
||||
|
||||
fun play(context: Context, binding: ActivityTvaBinding, mediaPlayer: MediaPlayer, state: TvaState.ResponseAudio){
|
||||
val metadataRetriever = MediaMetadataRetriever()
|
||||
metadataRetriever.setDataSource(context, state.cacheUri)
|
||||
|
||||
val artist = metadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST)
|
||||
val trackName = metadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE)
|
||||
|
||||
binding.audioTitle.text = "$trackName - $artist"
|
||||
|
||||
mediaPlayer.setDataSource(context, state.cacheUri)
|
||||
mediaPlayer.prepare()
|
||||
|
||||
binding.audioPlayButton.setImageResource(R.drawable.vector_pause)
|
||||
|
||||
mediaPlayer.setOnCompletionListener { player ->
|
||||
binding.audioPlayButton.setImageResource(R.drawable.vector_play)
|
||||
}
|
||||
|
||||
binding.audioPlayButton.setOnClickListener {
|
||||
if(mediaPlayer.isPlaying){
|
||||
binding.audioPlayButton.setImageResource(R.drawable.vector_play)
|
||||
mediaPlayer.pause()
|
||||
}else{
|
||||
binding.audioPlayButton.setImageResource(R.drawable.vector_pause)
|
||||
mediaPlayer.start()
|
||||
}
|
||||
}
|
||||
|
||||
mediaPlayer.setOnInfoListener { _, what, extra ->
|
||||
when(what){
|
||||
MediaPlayer.MEDIA_INFO_UNKNOWN -> println("MEDIA_INFO_UNKNOWN")
|
||||
MediaPlayer.MEDIA_INFO_VIDEO_TRACK_LAGGING-> println("MEDIA_INFO_VIDEO_TRACK_LAGGING")
|
||||
MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START-> println("MEDIA_INFO_VIDEO_RENDERING_START")
|
||||
MediaPlayer.MEDIA_INFO_BUFFERING_START-> println("MEDIA_INFO_BUFFERING_START")
|
||||
MediaPlayer.MEDIA_INFO_BUFFERING_END-> println("MEDIA_INFO_BUFFERING_END")
|
||||
MediaPlayer.MEDIA_INFO_BAD_INTERLEAVING-> println("MEDIA_INFO_BAD_INTERLEAVING")
|
||||
MediaPlayer.MEDIA_INFO_NOT_SEEKABLE-> println("MEDIA_INFO_NOT_SEEKABLE")
|
||||
MediaPlayer.MEDIA_INFO_METADATA_UPDATE-> println("MEDIA_INFO_METADATA_UPDATE")
|
||||
MediaPlayer.MEDIA_INFO_UNSUPPORTED_SUBTITLE-> println("MEDIA_INFO_UNSUPPORTED_SUBTITLE")
|
||||
MediaPlayer.MEDIA_INFO_SUBTITLE_TIMED_OUT-> println("MEDIA_INFO_SUBTITLE_TIMED_OUT")
|
||||
}
|
||||
|
||||
true
|
||||
}
|
||||
|
||||
mediaPlayer.setOnErrorListener{ _, i: Int, i1: Int ->
|
||||
println("Error Listener.... $i, $i1")
|
||||
true
|
||||
}
|
||||
|
||||
binding.audioPlayer.visible(true)
|
||||
mediaPlayer.start()
|
||||
}
|
||||
}
|
|
@ -4,12 +4,17 @@ import android.content.ClipData
|
|||
import android.content.ClipboardManager
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.media.MediaMetadataRetriever
|
||||
import android.media.MediaPlayer
|
||||
import android.net.Uri
|
||||
import android.os.Bundle
|
||||
import android.text.SpannableString
|
||||
import android.text.style.ForegroundColorSpan
|
||||
import android.view.inputmethod.EditorInfo
|
||||
import androidx.activity.viewModels
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.core.text.set
|
||||
import androidx.databinding.DataBindingUtil
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
|
@ -32,8 +37,8 @@ import oppen.tva.ui.modals_menus.overflow.OverflowPopup
|
|||
import oppen.tva.ui.modals_menus.set_home.SetHomeDialog
|
||||
import oppen.tva.ui.modals_menus.tabs.NewTabPopup
|
||||
import oppen.tva.ui.modals_menus.tabs.TabsDialog
|
||||
import oppen.visible
|
||||
import oppen.visibleRetainingSpace
|
||||
import java.io.ByteArrayOutputStream
|
||||
import java.io.File
|
||||
import java.io.FileInputStream
|
||||
import java.io.FileOutputStream
|
||||
|
@ -46,6 +51,8 @@ class TvaActivity : AppCompatActivity() {
|
|||
|
||||
private var inSearch = false
|
||||
|
||||
private val mediaPlayer = MediaPlayer()
|
||||
|
||||
private val model by viewModels<TvaViewModel>()
|
||||
private lateinit var binding: ActivityTvaBinding
|
||||
private lateinit var history: HistoryInterface
|
||||
|
@ -204,7 +211,9 @@ class TvaActivity : AppCompatActivity() {
|
|||
|
||||
private fun renderGemtext(state: TvaState.ResponseGemtext) = runOnUiThread {
|
||||
loadingView(false)
|
||||
binding.addressEdit.setText(state.uri.toString())
|
||||
val addressSpan = SpannableString(state.uri.toString())
|
||||
addressSpan.set(0, 9, ForegroundColorSpan(resources.getColor(R.color.protocol_address)))
|
||||
binding.addressEdit.setText(addressSpan)
|
||||
adapter.render(state.lines)
|
||||
|
||||
history.add(state.uri.toString())
|
||||
|
@ -218,7 +227,8 @@ class TvaActivity : AppCompatActivity() {
|
|||
var imageState: TvaState.ResponseImage? = null
|
||||
|
||||
private fun renderAudio(state: TvaState.ResponseAudio) = runOnUiThread {
|
||||
//todo - display audio player
|
||||
loadingView(false)
|
||||
AudioPlayer.play(this, binding, mediaPlayer, state)
|
||||
}
|
||||
|
||||
private fun renderImage(state: TvaState.ResponseImage) = runOnUiThread{
|
||||
|
|
|
@ -6,6 +6,7 @@ import androidx.appcompat.app.AppCompatDialog
|
|||
import kotlinx.android.synthetic.main.dialog_input_query.view.*
|
||||
import oppen.tva.R
|
||||
import oppen.tva.io.TvaState
|
||||
import java.net.URLEncoder
|
||||
|
||||
object InputDialog {
|
||||
|
||||
|
@ -22,7 +23,8 @@ object InputDialog {
|
|||
view.query_text.text = state.header.meta
|
||||
|
||||
view.query_submit_button.setOnClickListener {
|
||||
onQuery("${state.uri}?${view.query_input.text.toString()}")
|
||||
val encoded = URLEncoder.encode(view.query_input.text.toString(), "UTF-8")
|
||||
onQuery("${state.uri}?$encoded")
|
||||
dialog.dismiss()
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
<inset xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:insetBottom="0dp"
|
||||
android:insetLeft="0dp"
|
||||
android:insetRight="0dp"
|
||||
android:insetTop="0dp">
|
||||
<shape
|
||||
android:shape="rectangle" android:tint="@color/address_background">
|
||||
<stroke android:color="?attr/colorControlNormal" android:width="1dp" />
|
||||
<corners android:radius="22dp" />
|
||||
</shape>
|
||||
</inset>
|
|
@ -1,5 +0,0 @@
|
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
<stroke android:color="?attr/colorControlNormal" android:width="1dp" />
|
||||
<corners android:radius="5dp" />
|
||||
</shape>
|
|
@ -0,0 +1,11 @@
|
|||
<inset xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:insetBottom="3dp"
|
||||
android:insetLeft="3dp"
|
||||
android:insetRight="3dp"
|
||||
android:insetTop="3dp">
|
||||
<shape
|
||||
android:shape="rectangle">
|
||||
<stroke android:color="?attr/colorControlNormal" android:width="1dp" />
|
||||
<corners android:radius="5dp" />
|
||||
</shape>
|
||||
</inset>
|
|
@ -0,0 +1,10 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24"
|
||||
android:tint="?attr/colorControlNormal">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M6,19h4L10,5L6,5v14zM14,5v14h4L18,5h-4z"/>
|
||||
</vector>
|
|
@ -0,0 +1,10 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24"
|
||||
android:tint="?attr/colorControlNormal">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M8,5v14l11,-7z"/>
|
||||
</vector>
|
|
@ -0,0 +1,10 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24"
|
||||
android:tint="?attr/colorControlNormal">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M19,12v7L5,19v-7L3,12v7c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2v-7h-2zM13,12.67l2.59,-2.58L17,11.5l-5,5 -5,-5 1.41,-1.41L11,12.67L11,3h2z"/>
|
||||
</vector>
|
|
@ -15,6 +15,7 @@
|
|||
android:id="@+id/app_bar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@color/colorPrimaryDark"
|
||||
android:fitsSystemWindows="true">
|
||||
|
||||
<com.google.android.material.appbar.CollapsingToolbarLayout
|
||||
|
@ -22,24 +23,26 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:fitsSystemWindows="true"
|
||||
app:contentScrim="?attr/colorPrimary"
|
||||
app:contentScrim="?attr/colorPrimaryDark"
|
||||
app:layout_scrollFlags="scroll|enterAlways"
|
||||
app:toolbarId="@+id/toolbar">
|
||||
|
||||
<RelativeLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
<RelativeLayout
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/default_margin">
|
||||
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/address_bar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="@dimen/default_margin"
|
||||
android:paddingBottom="@dimen/default_margin">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageButton
|
||||
android:id="@+id/home"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="@dimen/button_size"
|
||||
android:layout_height="@dimen/button_size"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_margin="@dimen/button_margin"
|
||||
android:background="?android:attr/selectableItemBackgroundBorderless"
|
||||
|
@ -47,43 +50,49 @@
|
|||
|
||||
<androidx.appcompat.widget.AppCompatEditText
|
||||
android:id="@+id/address_edit"
|
||||
android:background="@drawable/drawable_filled_rounded_rect"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_toRightOf="@+id/home"
|
||||
android:layout_toLeftOf="@+id/tabs"
|
||||
android:paddingTop="12dp"
|
||||
android:paddingBottom="12dp"
|
||||
android:paddingLeft="12dp"
|
||||
android:paddingRight="12dp"
|
||||
android:layout_toEndOf="@+id/home"
|
||||
android:layout_toStartOf="@+id/tabs"
|
||||
android:inputType="textNoSuggestions|textUri"
|
||||
android:singleLine="true"
|
||||
android:textSize="14sp"
|
||||
android:textSize="12sp"
|
||||
android:imeOptions="actionGo"
|
||||
android:hint="@string/main_input_hint"/>
|
||||
android:hint="@string/main_input_hint" />
|
||||
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/tabs"
|
||||
android:layout_width="20dp"
|
||||
android:layout_height="20dp"
|
||||
android:layout_width="28dp"
|
||||
android:layout_height="28dp"
|
||||
android:layout_toLeftOf="@+id/more"
|
||||
android:layout_marginStart="@dimen/default_margin"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_margin="@dimen/button_margin"
|
||||
android:background="@drawable/drawable_rounded_rect"
|
||||
android:background="@drawable/drawable_stroke_rounded_rect"
|
||||
android:foreground="?android:attr/selectableItemBackgroundBorderless">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/tab_count"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
android:layout_gravity="center"
|
||||
android:textColor="?attr/colorControlNormal"
|
||||
android:textSize="12dp"
|
||||
android:text="1"/>
|
||||
android:text="1" />
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageButton
|
||||
android:id="@+id/more"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="@dimen/button_size"
|
||||
android:layout_height="@dimen/button_size"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_margin="@dimen/button_margin"
|
||||
|
@ -102,6 +111,49 @@
|
|||
android:layout_below="@+id/address_bar"
|
||||
android:indeterminate="true" />
|
||||
|
||||
<RelativeLayout
|
||||
android:id="@+id/audio_player"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/bar_height"
|
||||
android:layout_below="@+id/progress_bar"
|
||||
android:background="@color/player_background"
|
||||
android:paddingLeft="@dimen/default_margin"
|
||||
android:paddingRight="@dimen/default_margin"
|
||||
android:visibility="gone">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageButton
|
||||
android:id="@+id/audio_play_button"
|
||||
android:layout_width="@dimen/button_size"
|
||||
android:layout_height="@dimen/button_size"
|
||||
android:layout_centerVertical="true"
|
||||
android:background="?android:attr/selectableItemBackgroundBorderless"
|
||||
android:padding="@dimen/button_margin"
|
||||
android:src="@drawable/vector_play" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/audio_title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_toLeftOf="@+id/audio_overflow"
|
||||
android:paddingLeft="@dimen/default_margin"
|
||||
android:ellipsize="marquee"
|
||||
android:text="Aphex Twin - Flim"
|
||||
android:layout_toRightOf="@+id/audio_play_button" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageButton
|
||||
android:id="@+id/audio_overflow"
|
||||
android:layout_width="@dimen/button_size"
|
||||
android:layout_height="@dimen/button_size"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_alignParentRight="true"
|
||||
android:background="?android:attr/selectableItemBackgroundBorderless"
|
||||
android:padding="@dimen/button_margin"
|
||||
android:src="@drawable/vector_overflow" />
|
||||
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="150dp"
|
||||
android:layout_margin="@dimen/button_margin"
|
||||
android:background="@drawable/drawable_rounded_rect"
|
||||
android:background="@drawable/drawable_stroke_rounded_rect"
|
||||
android:padding="@dimen/default_margin"
|
||||
android:clickable="true"
|
||||
android:focusable="true"
|
||||
|
|
|
@ -1,7 +1,10 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="colorPrimary">#ffffff</color>
|
||||
<color name="colorPrimaryDark">#B8B8B8</color>
|
||||
<color name="colorPrimaryDark">#1d1d1d</color>
|
||||
<color name="colorAccent">#03DAC5</color>
|
||||
<color name="code_background">#000000</color>
|
||||
<color name="player_background">#1d1d1d</color>
|
||||
<color name="protocol_address">#ffdede</color>
|
||||
<color name="address_background">#2e2e2e</color>
|
||||
</resources>
|
|
@ -1,7 +1,10 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="colorPrimary">#ffffff</color>
|
||||
<color name="colorPrimaryDark">#1d1d1d</color>
|
||||
<color name="colorPrimaryDark">#efefef</color>
|
||||
<color name="colorAccent">#03DAC5</color>
|
||||
<color name="code_background">#efefef</color>
|
||||
<color name="player_background">#efefef</color>
|
||||
<color name="protocol_address">#002121</color>
|
||||
<color name="address_background">#dfdfdf</color>
|
||||
</resources>
|
|
@ -8,4 +8,6 @@
|
|||
<dimen name="h1_text_size">28sp</dimen>
|
||||
<dimen name="h2_text_size">22sp</dimen>
|
||||
<dimen name="h3_text_size">18sp</dimen>
|
||||
<dimen name="button_size">32dp</dimen>
|
||||
<dimen name="bar_height">50dp</dimen>
|
||||
</resources>
|
|
@ -4,7 +4,7 @@
|
|||
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
|
||||
<item name="colorAccent">@color/colorAccent</item>
|
||||
<item name="android:windowTranslucentStatus">false</item>
|
||||
<item name="android:statusBarColor">#1d1d1d</item>
|
||||
<item name="android:statusBarColor">@color/colorPrimaryDark</item>
|
||||
<item name="windowActionBar">false</item>
|
||||
<item name="windowNoTitle">true</item>
|
||||
</style>
|
||||
|
|
Loading…
Reference in New Issue