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"
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.

View File

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

View File

@ -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?"
}
}

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.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{

View File

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

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

View File

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

View File

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

View File

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

View File

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

View File

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