mirror of
https://github.com/Michatec/Radio.git
synced 2026-03-31 23:46:28 +02:00
Compare commits
2 Commits
ae16b12d28
...
c62c61f2f1
| Author | SHA1 | Date | |
|---|---|---|---|
| c62c61f2f1 | |||
| 5ca2b9b7ef |
@@ -13,7 +13,7 @@
|
|||||||
<details>
|
<details>
|
||||||
<summary>⚙️ Install Radio</summary>
|
<summary>⚙️ Install Radio</summary>
|
||||||
<br>
|
<br>
|
||||||
<a href="https://github.com/michatec/Radio/releases/latest"><img src="https://user-images.githubusercontent.com/15986930/229208526-e5a63be5-0d0b-48ab-a222-9f2f2faf0ee4.png" height="80px"></a>
|
<a href="https://github.com/michatec/Radio/releases/latest"><img src="https://user-images.githubusercontent.com/15986930/229208526-e5a63be5-0d0b-48ab-a222-9f2f2faf0ee4.png" alt="Preview" height="80px"></a>
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
----------------------------------------
|
----------------------------------------
|
||||||
|
|||||||
@@ -60,17 +60,17 @@ dependencies {
|
|||||||
|
|
||||||
// AndroidX Stuff //
|
// AndroidX Stuff //
|
||||||
implementation 'androidx.core:core-ktx:1.17.0'
|
implementation 'androidx.core:core-ktx:1.17.0'
|
||||||
implementation 'androidx.activity:activity-ktx:1.12.2'
|
implementation 'androidx.activity:activity-ktx:1.12.4'
|
||||||
implementation 'androidx.palette:palette-ktx:1.0.0'
|
implementation 'androidx.palette:palette-ktx:1.0.0'
|
||||||
implementation 'androidx.preference:preference-ktx:1.2.1'
|
implementation 'androidx.preference:preference-ktx:1.2.1'
|
||||||
implementation 'androidx.media:media:1.7.1'
|
implementation 'androidx.media:media:1.7.1'
|
||||||
implementation 'androidx.media3:media3-exoplayer:1.9.0'
|
implementation 'androidx.media3:media3-exoplayer:1.9.2'
|
||||||
implementation 'androidx.media3:media3-exoplayer-hls:1.9.0'
|
implementation 'androidx.media3:media3-exoplayer-hls:1.9.2'
|
||||||
implementation 'androidx.media3:media3-session:1.9.0'
|
implementation 'androidx.media3:media3-session:1.9.2'
|
||||||
implementation 'androidx.media3:media3-datasource-okhttp:1.9.0'
|
implementation 'androidx.media3:media3-datasource-okhttp:1.9.2'
|
||||||
implementation 'androidx.navigation:navigation-fragment-ktx:2.9.6'
|
implementation 'androidx.navigation:navigation-fragment-ktx:2.9.7'
|
||||||
implementation 'androidx.navigation:navigation-ui-ktx:2.9.6'
|
implementation 'androidx.navigation:navigation-ui-ktx:2.9.7'
|
||||||
implementation 'androidx.work:work-runtime-ktx:2.11.0'
|
implementation 'androidx.work:work-runtime-ktx:2.11.1'
|
||||||
|
|
||||||
// Volley HTTP request //
|
// Volley HTTP request //
|
||||||
implementation 'com.android.volley:volley:1.2.1'
|
implementation 'com.android.volley:volley:1.2.1'
|
||||||
|
|||||||
@@ -58,7 +58,7 @@
|
|||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
<!-- react to playlist-links based on file extension -->
|
<!-- react to playlist-links based on file extension -->
|
||||||
<intent-filter>
|
<intent-filter android:autoVerify="true">
|
||||||
<action android:name="android.intent.action.VIEW" />
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
|
||||||
<category android:name="android.intent.category.BROWSABLE" />
|
<category android:name="android.intent.category.BROWSABLE" />
|
||||||
@@ -73,7 +73,7 @@
|
|||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
<!-- react to playlist-links based on mimetype -->
|
<!-- react to playlist-links based on mimetype -->
|
||||||
<intent-filter>
|
<intent-filter android:autoVerify="true">
|
||||||
<action android:name="android.intent.action.VIEW" />
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
|
||||||
<category android:name="android.intent.category.BROWSABLE" />
|
<category android:name="android.intent.category.BROWSABLE" />
|
||||||
@@ -81,7 +81,8 @@
|
|||||||
|
|
||||||
<data android:scheme="http" />
|
<data android:scheme="http" />
|
||||||
<data android:scheme="https" />
|
<data android:scheme="https" />
|
||||||
<data android:host="*" />
|
<data android:host="*"
|
||||||
|
tools:ignore="AppLinkUrlError" />
|
||||||
<data android:mimeType="audio/x-scpls" />
|
<data android:mimeType="audio/x-scpls" />
|
||||||
<data android:mimeType="audio/mpegurl" />
|
<data android:mimeType="audio/mpegurl" />
|
||||||
<data android:mimeType="audio/x-mpegurl" />
|
<data android:mimeType="audio/x-mpegurl" />
|
||||||
|
|||||||
@@ -34,7 +34,6 @@ class Radio : Application() {
|
|||||||
AppThemeHelper.setTheme(PreferencesHelper.loadThemeSelection())
|
AppThemeHelper.setTheme(PreferencesHelper.loadThemeSelection())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Implements onTerminate */
|
/* Implements onTerminate */
|
||||||
override fun onTerminate() {
|
override fun onTerminate() {
|
||||||
super.onTerminate()
|
super.onTerminate()
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import com.michatec.radio.R
|
|||||||
import java.io.ByteArrayOutputStream
|
import java.io.ByteArrayOutputStream
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
import java.io.InputStream
|
import java.io.InputStream
|
||||||
|
import androidx.core.graphics.createBitmap
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -98,7 +99,7 @@ object ImageHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// create empty bitmap and canvas
|
// create empty bitmap and canvas
|
||||||
val outputImage: Bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888)
|
val outputImage: Bitmap = createBitmap(size, size, Bitmap.Config.ARGB_8888)
|
||||||
val imageCanvas = Canvas(outputImage)
|
val imageCanvas = Canvas(outputImage)
|
||||||
|
|
||||||
// draw square background
|
// draw square background
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
/*
|
|
||||||
* ImportHelper.kt
|
|
||||||
* Implements the ImportHelper object
|
|
||||||
* A ImportHelper provides methods for integrating station files from Radio v3
|
|
||||||
*
|
|
||||||
* This file is part of
|
|
||||||
* TRANSISTOR - Radio App for Android
|
|
||||||
*
|
|
||||||
* Copyright (c) 2015-22 - Y20K.org
|
|
||||||
* Licensed under the MIT-License
|
|
||||||
* http://opensource.org/licenses/MIT
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
package com.michatec.radio.helpers
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import com.michatec.radio.Keys
|
|
||||||
import com.michatec.radio.core.Collection
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ImportHelper object
|
|
||||||
*/
|
|
||||||
object ImportHelper {
|
|
||||||
|
|
||||||
|
|
||||||
/* */
|
|
||||||
fun removeDefaultStationImageUris(context: Context) {
|
|
||||||
val collection: Collection = FileHelper.readCollection(context)
|
|
||||||
collection.stations.forEach { station ->
|
|
||||||
if (station.image == Keys.LOCATION_DEFAULT_STATION_IMAGE) {
|
|
||||||
station.image = String()
|
|
||||||
}
|
|
||||||
if (station.smallImage == Keys.LOCATION_DEFAULT_STATION_IMAGE) {
|
|
||||||
station.smallImage = String()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
CollectionHelper.saveCollection(context, collection, async = false)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -213,20 +213,6 @@ object PreferencesHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Checks if housekeeping work needs to be done - used usually in DownloadWorker "REQUEST_UPDATE_COLLECTION" */
|
|
||||||
fun isHouseKeepingNecessary(): Boolean {
|
|
||||||
return sharedPreferences.getBoolean(Keys.PREF_ONE_TIME_HOUSEKEEPING_NECESSARY, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Saves state of housekeeping */
|
|
||||||
fun saveHouseKeepingNecessaryState(state: Boolean = false) {
|
|
||||||
sharedPreferences.edit {
|
|
||||||
putBoolean(Keys.PREF_ONE_TIME_HOUSEKEEPING_NECESSARY, state)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Load currently selected app theme */
|
/* Load currently selected app theme */
|
||||||
fun loadThemeSelection(): String {
|
fun loadThemeSelection(): String {
|
||||||
return sharedPreferences.getString(
|
return sharedPreferences.getString(
|
||||||
@@ -241,15 +227,6 @@ object PreferencesHelper {
|
|||||||
return sharedPreferences.getBoolean(Keys.PREF_EDIT_STATIONS, true)
|
return sharedPreferences.getBoolean(Keys.PREF_EDIT_STATIONS, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Saves value of the option: Edit Stations (only needed for migration) */
|
|
||||||
fun saveEditStationsEnabled(enabled: Boolean = false) {
|
|
||||||
sharedPreferences.edit {
|
|
||||||
putBoolean(Keys.PREF_EDIT_STATIONS, enabled)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Loads value of the option: Edit Station Streams */
|
/* Loads value of the option: Edit Station Streams */
|
||||||
fun loadEditStreamUrisEnabled(): Boolean {
|
fun loadEditStreamUrisEnabled(): Boolean {
|
||||||
return sharedPreferences.getBoolean(Keys.PREF_EDIT_STREAMS_URIS, true)
|
return sharedPreferences.getBoolean(Keys.PREF_EDIT_STREAMS_URIS, true)
|
||||||
@@ -276,7 +253,7 @@ object PreferencesHelper {
|
|||||||
fun downloadOverMobile(): Boolean {
|
fun downloadOverMobile(): Boolean {
|
||||||
return sharedPreferences.getBoolean(
|
return sharedPreferences.getBoolean(
|
||||||
Keys.PREF_DOWNLOAD_OVER_MOBILE,
|
Keys.PREF_DOWNLOAD_OVER_MOBILE,
|
||||||
Keys.DEFAULT_DOWNLOAD_OVER_MOBILE
|
false
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ class RadioBrowserSearch(private var radioBrowserSearchListener: RadioBrowserSea
|
|||||||
|
|
||||||
|
|
||||||
/* Listens for (positive) server responses to search requests */
|
/* Listens for (positive) server responses to search requests */
|
||||||
private val responseListener: Response.Listener<JSONArray> = Response.Listener<JSONArray> { response ->
|
private val responseListener: Response.Listener<JSONArray> = Response.Listener { response ->
|
||||||
if (response != null) {
|
if (response != null) {
|
||||||
radioBrowserSearchListener.onRadioBrowserSearchResults(createRadioBrowserResult(response.toString()))
|
radioBrowserSearchListener.onRadioBrowserSearchResults(createRadioBrowserResult(response.toString()))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ import android.content.Context
|
|||||||
import android.media.AudioAttributes
|
import android.media.AudioAttributes
|
||||||
import android.media.AudioFocusRequest
|
import android.media.AudioFocusRequest
|
||||||
import android.media.AudioManager
|
import android.media.AudioManager
|
||||||
import android.os.Build
|
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
@@ -240,7 +239,7 @@ class SearchResultAdapter(
|
|||||||
/*
|
/*
|
||||||
* Inner class: ViewHolder for a radio station search result
|
* Inner class: ViewHolder for a radio station search result
|
||||||
*/
|
*/
|
||||||
private inner class SearchResultViewHolder(var searchResultLayout: View) :
|
private class SearchResultViewHolder(var searchResultLayout: View) :
|
||||||
RecyclerView.ViewHolder(searchResultLayout) {
|
RecyclerView.ViewHolder(searchResultLayout) {
|
||||||
val nameView: MaterialTextView = searchResultLayout.findViewById(R.id.station_name)
|
val nameView: MaterialTextView = searchResultLayout.findViewById(R.id.station_name)
|
||||||
val streamView: MaterialTextView = searchResultLayout.findViewById(R.id.station_url)
|
val streamView: MaterialTextView = searchResultLayout.findViewById(R.id.station_url)
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:width="24dp"
|
|
||||||
android:height="24dp"
|
|
||||||
android:viewportWidth="24.0"
|
|
||||||
android:viewportHeight="24.0">
|
|
||||||
<path
|
|
||||||
android:fillColor="@color/icon_default"
|
|
||||||
android:pathData="m11.999,2.623c-5.54,0 -9.999,4.462 -9.999,10.001 -0,1.878 0.529,3.721 1.528,5.313l8.336,-10.778c0.06,-0.077 0.209,-0.077 0.27,0l3.482,4.502h-2.494l0.054,0.199h2.594l0.736,0.949h-3.062l0.086,0.311h3.217l0.647,0.836h-3.631l0.113,0.402h3.827l0.579,0.745h-4.198l0.137,0.49h4.438l0.508,0.655h-4.764l0.152,0.542h5.031l0.468,0.606h-5.33l0.152,0.542h5.598c0.998,-1.592 1.528,-3.435 1.528,-5.313 0,-5.54 -4.462,-10.001 -10.001,-10.001zM15.044,18.543 L15.196,19.085h4.438c0.145,-0.171 0.294,-0.361 0.428,-0.542zM15.365,19.69 L15.515,20.232h2.969c0.194,-0.166 0.405,-0.357 0.594,-0.542zM15.684,20.838 L15.836,21.377h1.003c0.296,-0.17 0.571,-0.343 0.868,-0.539z" />
|
|
||||||
</vector>
|
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
id 'com.android.application' version '9.0.0' apply false
|
id 'com.android.application' version '9.0.1' apply false
|
||||||
id 'com.android.library' version '9.0.0' apply false
|
id 'com.android.library' version '9.0.1' apply false
|
||||||
id 'org.jetbrains.kotlin.android' version "2.3.0" apply false
|
id 'org.jetbrains.kotlin.android' version "2.3.10" apply false
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.register('clean', Delete) {
|
tasks.register('clean', Delete) {
|
||||||
|
|||||||
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,6 +1,6 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip
|
||||||
networkTimeout=10000
|
networkTimeout=10000
|
||||||
validateDistributionUrl=true
|
validateDistributionUrl=true
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
|||||||
Reference in New Issue
Block a user