functional mp3 p[layer

This commit is contained in:
Öppen 2020-08-25 12:57:35 +01:00
parent eb169f8c8e
commit 130bd5d641
19 changed files with 222 additions and 37 deletions

View File

@ -10,8 +10,8 @@ android {
applicationId "oppen.tva" applicationId "oppen.tva"
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 30 targetSdkVersion 30
versionCode 5 versionCode 6
versionName "0.2.0 Beta" versionName "0.3.0 Beta"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
} }

Binary file not shown.

View File

@ -11,8 +11,8 @@
"type": "SINGLE", "type": "SINGLE",
"filters": [], "filters": [],
"properties": [], "properties": [],
"versionCode": 5, "versionCode": 6,
"versionName": "0.2.0 Beta", "versionName": "0.3.0 Beta",
"enabled": true, "enabled": true,
"outputFile": "app-release.apk" "outputFile": "app-release.apk"
} }

View File

@ -6,6 +6,6 @@ class Tva: Application() {
companion object{ companion object{
const val DEFAULT_HOME_CAPSULE = "gemini://gemini.circumlunar.space/~oppen/tva/index.gmi" 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?"
} }
} }

View File

@ -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()
}
}

View File

@ -4,12 +4,17 @@ import android.content.ClipData
import android.content.ClipboardManager import android.content.ClipboardManager
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.media.MediaMetadataRetriever
import android.media.MediaPlayer
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.text.SpannableString
import android.text.style.ForegroundColorSpan
import android.view.inputmethod.EditorInfo import android.view.inputmethod.EditorInfo
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.text.set
import androidx.databinding.DataBindingUtil import androidx.databinding.DataBindingUtil
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.snackbar.Snackbar 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.set_home.SetHomeDialog
import oppen.tva.ui.modals_menus.tabs.NewTabPopup import oppen.tva.ui.modals_menus.tabs.NewTabPopup
import oppen.tva.ui.modals_menus.tabs.TabsDialog import oppen.tva.ui.modals_menus.tabs.TabsDialog
import oppen.visible
import oppen.visibleRetainingSpace import oppen.visibleRetainingSpace
import java.io.ByteArrayOutputStream
import java.io.File import java.io.File
import java.io.FileInputStream import java.io.FileInputStream
import java.io.FileOutputStream import java.io.FileOutputStream
@ -46,6 +51,8 @@ class TvaActivity : AppCompatActivity() {
private var inSearch = false private var inSearch = false
private val mediaPlayer = MediaPlayer()
private val model by viewModels<TvaViewModel>() private val model by viewModels<TvaViewModel>()
private lateinit var binding: ActivityTvaBinding private lateinit var binding: ActivityTvaBinding
private lateinit var history: HistoryInterface private lateinit var history: HistoryInterface
@ -204,7 +211,9 @@ class TvaActivity : AppCompatActivity() {
private fun renderGemtext(state: TvaState.ResponseGemtext) = runOnUiThread { private fun renderGemtext(state: TvaState.ResponseGemtext) = runOnUiThread {
loadingView(false) 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) adapter.render(state.lines)
history.add(state.uri.toString()) history.add(state.uri.toString())
@ -218,7 +227,8 @@ class TvaActivity : AppCompatActivity() {
var imageState: TvaState.ResponseImage? = null var imageState: TvaState.ResponseImage? = null
private fun renderAudio(state: TvaState.ResponseAudio) = runOnUiThread { 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{ private fun renderImage(state: TvaState.ResponseImage) = runOnUiThread{

View File

@ -6,6 +6,7 @@ import androidx.appcompat.app.AppCompatDialog
import kotlinx.android.synthetic.main.dialog_input_query.view.* import kotlinx.android.synthetic.main.dialog_input_query.view.*
import oppen.tva.R import oppen.tva.R
import oppen.tva.io.TvaState import oppen.tva.io.TvaState
import java.net.URLEncoder
object InputDialog { object InputDialog {
@ -22,7 +23,8 @@ object InputDialog {
view.query_text.text = state.header.meta view.query_text.text = state.header.meta
view.query_submit_button.setOnClickListener { 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() dialog.dismiss()
} }

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -15,6 +15,7 @@
android:id="@+id/app_bar" android:id="@+id/app_bar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@color/colorPrimaryDark"
android:fitsSystemWindows="true"> android:fitsSystemWindows="true">
<com.google.android.material.appbar.CollapsingToolbarLayout <com.google.android.material.appbar.CollapsingToolbarLayout
@ -22,24 +23,26 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
app:contentScrim="?attr/colorPrimary" app:contentScrim="?attr/colorPrimaryDark"
app:layout_scrollFlags="scroll|enterAlways" app:layout_scrollFlags="scroll|enterAlways"
app:toolbarId="@+id/toolbar"> app:toolbarId="@+id/toolbar">
<RelativeLayout <RelativeLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
<RelativeLayout 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:id="@+id/address_bar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingTop="@dimen/default_margin"
android:paddingBottom="@dimen/default_margin"> android:paddingBottom="@dimen/default_margin">
<androidx.appcompat.widget.AppCompatImageButton <androidx.appcompat.widget.AppCompatImageButton
android:id="@+id/home" android:id="@+id/home"
android:layout_width="wrap_content" android:layout_width="@dimen/button_size"
android:layout_height="wrap_content" android:layout_height="@dimen/button_size"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_margin="@dimen/button_margin" android:layout_margin="@dimen/button_margin"
android:background="?android:attr/selectableItemBackgroundBorderless" android:background="?android:attr/selectableItemBackgroundBorderless"
@ -47,43 +50,49 @@
<androidx.appcompat.widget.AppCompatEditText <androidx.appcompat.widget.AppCompatEditText
android:id="@+id/address_edit" android:id="@+id/address_edit"
android:background="@drawable/drawable_filled_rounded_rect"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_toRightOf="@+id/home" android:paddingTop="12dp"
android:layout_toLeftOf="@+id/tabs" android:paddingBottom="12dp"
android:paddingLeft="12dp"
android:paddingRight="12dp"
android:layout_toEndOf="@+id/home"
android:layout_toStartOf="@+id/tabs"
android:inputType="textNoSuggestions|textUri" android:inputType="textNoSuggestions|textUri"
android:singleLine="true" android:singleLine="true"
android:textSize="14sp" android:textSize="12sp"
android:imeOptions="actionGo" android:imeOptions="actionGo"
android:hint="@string/main_input_hint"/> android:hint="@string/main_input_hint" />
<FrameLayout <FrameLayout
android:id="@+id/tabs" android:id="@+id/tabs"
android:layout_width="20dp" android:layout_width="28dp"
android:layout_height="20dp" android:layout_height="28dp"
android:layout_toLeftOf="@+id/more" android:layout_toLeftOf="@+id/more"
android:layout_marginStart="@dimen/default_margin"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_margin="@dimen/button_margin" android:background="@drawable/drawable_stroke_rounded_rect"
android:background="@drawable/drawable_rounded_rect"
android:foreground="?android:attr/selectableItemBackgroundBorderless"> android:foreground="?android:attr/selectableItemBackgroundBorderless">
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tab_count" android:id="@+id/tab_count"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:gravity="center" android:gravity="center"
android:layout_gravity="center"
android:textColor="?attr/colorControlNormal" android:textColor="?attr/colorControlNormal"
android:textSize="12dp" android:textSize="12dp"
android:text="1"/> android:text="1" />
</FrameLayout> </FrameLayout>
<androidx.appcompat.widget.AppCompatImageButton <androidx.appcompat.widget.AppCompatImageButton
android:id="@+id/more" android:id="@+id/more"
android:layout_width="wrap_content" android:layout_width="@dimen/button_size"
android:layout_height="wrap_content" android:layout_height="@dimen/button_size"
android:layout_alignParentRight="true" android:layout_alignParentRight="true"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_margin="@dimen/button_margin" android:layout_margin="@dimen/button_margin"
@ -102,6 +111,49 @@
android:layout_below="@+id/address_bar" android:layout_below="@+id/address_bar"
android:indeterminate="true" /> 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> </RelativeLayout>

View File

@ -6,7 +6,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="150dp" android:layout_height="150dp"
android:layout_margin="@dimen/button_margin" 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:padding="@dimen/default_margin"
android:clickable="true" android:clickable="true"
android:focusable="true" android:focusable="true"

View File

@ -1,7 +1,10 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<color name="colorPrimary">#ffffff</color> <color name="colorPrimary">#ffffff</color>
<color name="colorPrimaryDark">#B8B8B8</color> <color name="colorPrimaryDark">#1d1d1d</color>
<color name="colorAccent">#03DAC5</color> <color name="colorAccent">#03DAC5</color>
<color name="code_background">#000000</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> </resources>

View File

@ -1,7 +1,10 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<color name="colorPrimary">#ffffff</color> <color name="colorPrimary">#ffffff</color>
<color name="colorPrimaryDark">#1d1d1d</color> <color name="colorPrimaryDark">#efefef</color>
<color name="colorAccent">#03DAC5</color> <color name="colorAccent">#03DAC5</color>
<color name="code_background">#efefef</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> </resources>

View File

@ -8,4 +8,6 @@
<dimen name="h1_text_size">28sp</dimen> <dimen name="h1_text_size">28sp</dimen>
<dimen name="h2_text_size">22sp</dimen> <dimen name="h2_text_size">22sp</dimen>
<dimen name="h3_text_size">18sp</dimen> <dimen name="h3_text_size">18sp</dimen>
<dimen name="button_size">32dp</dimen>
<dimen name="bar_height">50dp</dimen>
</resources> </resources>

View File

@ -4,7 +4,7 @@
<item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item> <item name="colorAccent">@color/colorAccent</item>
<item name="android:windowTranslucentStatus">false</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="windowActionBar">false</item>
<item name="windowNoTitle">true</item> <item name="windowNoTitle">true</item>
</style> </style>