mirror of
https://github.com/Michatec/Radio.git
synced 2026-04-01 16:06:27 +02:00
Compare commits
18 Commits
14.2
...
2c1913896d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2c1913896d | ||
|
|
026e18ae22 | ||
|
|
3b6ebe5e1b | ||
|
|
26eab4c64c | ||
|
|
75b3deb210 | ||
|
|
96389a5c81 | ||
|
|
1544c07938 | ||
|
|
65e9d1fed4 | ||
|
|
9bfc1661b8 | ||
|
|
9a379675bf | ||
|
|
529e359f7f | ||
|
|
fc3a1f767a | ||
|
|
9197e5c2a9 | ||
|
|
5920327283 | ||
|
|
769cbb505f | ||
|
|
1f5d61759c | ||
|
|
5b1d6d96c7 | ||
|
|
606154cfb3 |
38
.github/ISSUE_TEMPLATE/bug_report.md
vendored
38
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -1,38 +0,0 @@
|
|||||||
---
|
|
||||||
name: Bug report
|
|
||||||
about: Create a report to help us improve
|
|
||||||
title: ''
|
|
||||||
labels: ''
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Describe the bug**
|
|
||||||
A clear and concise description of what the bug is.
|
|
||||||
|
|
||||||
**To Reproduce**
|
|
||||||
Steps to reproduce the behavior:
|
|
||||||
1. Go to '...'
|
|
||||||
2. Click on '....'
|
|
||||||
3. Scroll down to '....'
|
|
||||||
4. See error
|
|
||||||
|
|
||||||
**Expected behavior**
|
|
||||||
A clear and concise description of what you expected to happen.
|
|
||||||
|
|
||||||
**Screenshots**
|
|
||||||
If applicable, add screenshots to help explain your problem.
|
|
||||||
|
|
||||||
**Desktop (please complete the following information):**
|
|
||||||
- OS: [e.g. iOS]
|
|
||||||
- Browser [e.g. chrome, safari]
|
|
||||||
- Version [e.g. 22]
|
|
||||||
|
|
||||||
**Smartphone (please complete the following information):**
|
|
||||||
- Device: [e.g. iPhone6]
|
|
||||||
- OS: [e.g. iOS8.1]
|
|
||||||
- Browser [e.g. stock browser, safari]
|
|
||||||
- Version [e.g. 22]
|
|
||||||
|
|
||||||
**Additional context**
|
|
||||||
Add any other context about the problem here.
|
|
||||||
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@@ -1,20 +0,0 @@
|
|||||||
---
|
|
||||||
name: Feature request
|
|
||||||
about: Suggest an idea for this project
|
|
||||||
title: ''
|
|
||||||
labels: ''
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Is your feature request related to a problem? Please describe.**
|
|
||||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
|
||||||
|
|
||||||
**Describe the solution you'd like**
|
|
||||||
A clear and concise description of what you want to happen.
|
|
||||||
|
|
||||||
**Describe alternatives you've considered**
|
|
||||||
A clear and concise description of any alternative solutions or features you've considered.
|
|
||||||
|
|
||||||
**Additional context**
|
|
||||||
Add any other context or screenshots about the feature request here.
|
|
||||||
20
.github/workflows/gradle-publish.yml
vendored
20
.github/workflows/gradle-publish.yml
vendored
@@ -67,7 +67,25 @@ jobs:
|
|||||||
mv app-release-aligned.apk app-release.apk
|
mv app-release-aligned.apk app-release.apk
|
||||||
|
|
||||||
- name: Upload artifact
|
- name: Upload artifact
|
||||||
uses: actions/upload-artifact@v7
|
uses: actions/upload-artifact@v6
|
||||||
with:
|
with:
|
||||||
name: app-release
|
name: app-release
|
||||||
path: app-release.apk
|
path: app-release.apk
|
||||||
|
|
||||||
|
publish:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: build
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
steps:
|
||||||
|
- name: Download artifact
|
||||||
|
uses: actions/download-artifact@v7
|
||||||
|
with:
|
||||||
|
name: app-release
|
||||||
|
path: app-release.apk
|
||||||
|
|
||||||
|
- name: Create release
|
||||||
|
uses: ncipollo/release-action@v1
|
||||||
|
with:
|
||||||
|
artifacts: "app-release.apk"
|
||||||
|
draft: true
|
||||||
|
|||||||
@@ -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" alt="Preview" 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" height="80px"></a>
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
----------------------------------------
|
----------------------------------------
|
||||||
|
|||||||
@@ -19,8 +19,8 @@ android {
|
|||||||
applicationId 'com.michatec.radio'
|
applicationId 'com.michatec.radio'
|
||||||
minSdk 28
|
minSdk 28
|
||||||
targetSdk 36
|
targetSdk 36
|
||||||
versionCode 142
|
versionCode 141
|
||||||
versionName '14.2'
|
versionName '14.1'
|
||||||
resourceConfigurations += ['en', 'de', 'el', 'nl', 'pl', 'ru','uk', 'ja', 'da', 'fr']
|
resourceConfigurations += ['en', 'de', 'el', 'nl', 'pl', 'ru','uk', 'ja', 'da', 'fr']
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -60,14 +60,14 @@ 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.4'
|
implementation 'androidx.activity:activity-ktx:1.12.3'
|
||||||
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.2'
|
implementation 'androidx.media3:media3-exoplayer:1.9.1'
|
||||||
implementation 'androidx.media3:media3-exoplayer-hls:1.9.2'
|
implementation 'androidx.media3:media3-exoplayer-hls:1.9.1'
|
||||||
implementation 'androidx.media3:media3-session:1.9.2'
|
implementation 'androidx.media3:media3-session:1.9.1'
|
||||||
implementation 'androidx.media3:media3-datasource-okhttp:1.9.2'
|
implementation 'androidx.media3:media3-datasource-okhttp:1.9.1'
|
||||||
implementation 'androidx.navigation:navigation-fragment-ktx:2.9.7'
|
implementation 'androidx.navigation:navigation-fragment-ktx:2.9.7'
|
||||||
implementation 'androidx.navigation:navigation-ui-ktx:2.9.7'
|
implementation 'androidx.navigation:navigation-ui-ktx:2.9.7'
|
||||||
implementation 'androidx.work:work-runtime-ktx:2.11.1'
|
implementation 'androidx.work:work-runtime-ktx:2.11.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 android:autoVerify="true">
|
<intent-filter>
|
||||||
<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 android:autoVerify="true">
|
<intent-filter>
|
||||||
<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,8 +81,7 @@
|
|||||||
|
|
||||||
<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" />
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ object Keys {
|
|||||||
|
|
||||||
// preferences
|
// preferences
|
||||||
const val PREF_RADIO_BROWSER_API: String = "RADIO_BROWSER_API"
|
const val PREF_RADIO_BROWSER_API: String = "RADIO_BROWSER_API"
|
||||||
|
const val PREF_ONE_TIME_HOUSEKEEPING_NECESSARY: String = "ONE_TIME_HOUSEKEEPING_NECESSARY_VERSIONCODE_95" // increment to current app version code to trigger housekeeping that runs only once
|
||||||
const val PREF_THEME_SELECTION: String = "THEME_SELECTION"
|
const val PREF_THEME_SELECTION: String = "THEME_SELECTION"
|
||||||
const val PREF_LAST_UPDATE_COLLECTION: String = "LAST_UPDATE_COLLECTION"
|
const val PREF_LAST_UPDATE_COLLECTION: String = "LAST_UPDATE_COLLECTION"
|
||||||
const val PREF_COLLECTION_SIZE: String = "COLLECTION_SIZE"
|
const val PREF_COLLECTION_SIZE: String = "COLLECTION_SIZE"
|
||||||
@@ -137,7 +138,7 @@ object Keys {
|
|||||||
const val FOLDER_AUDIO: String = "audio"
|
const val FOLDER_AUDIO: String = "audio"
|
||||||
const val FOLDER_IMAGES: String = "images"
|
const val FOLDER_IMAGES: String = "images"
|
||||||
const val FOLDER_TEMP: String = "temp"
|
const val FOLDER_TEMP: String = "temp"
|
||||||
const val RADIO_LEGACY_FOLDER_COLLECTION: String = "Collection"
|
const val URLRADIO_LEGACY_FOLDER_COLLECTION: String = "Collection"
|
||||||
|
|
||||||
// file names and extensions
|
// file names and extensions
|
||||||
const val COLLECTION_FILE: String = "collection.json"
|
const val COLLECTION_FILE: String = "collection.json"
|
||||||
|
|||||||
@@ -60,16 +60,6 @@ class MainActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Overrides onResume from AppCompatActivity */
|
|
||||||
override fun onResume() {
|
|
||||||
try {
|
|
||||||
super.onResume()
|
|
||||||
} catch (_: ClassCastException) {
|
|
||||||
// Do nothing
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Overrides onSupportNavigateUp from AppCompatActivity */
|
/* Overrides onSupportNavigateUp from AppCompatActivity */
|
||||||
override fun onSupportNavigateUp(): Boolean {
|
override fun onSupportNavigateUp(): Boolean {
|
||||||
// Taken from: https://developer.android.com/guide/navigation/navigation-ui#action_bar
|
// Taken from: https://developer.android.com/guide/navigation/navigation-ui#action_bar
|
||||||
|
|||||||
@@ -265,7 +265,7 @@ class PlayerFragment : Fragment(),
|
|||||||
// handle navigation arguments
|
// handle navigation arguments
|
||||||
handleNavigationArguments()
|
handleNavigationArguments()
|
||||||
// // handle start intent - if started via tap on rss link
|
// // handle start intent - if started via tap on rss link
|
||||||
handleStartIntent()
|
// handleStartIntent()
|
||||||
// start watching for changes in shared preferences
|
// start watching for changes in shared preferences
|
||||||
PreferencesHelper.registerPreferenceChangeListener(this as SharedPreferences.OnSharedPreferenceChangeListener)
|
PreferencesHelper.registerPreferenceChangeListener(this as SharedPreferences.OnSharedPreferenceChangeListener)
|
||||||
}
|
}
|
||||||
@@ -636,16 +636,16 @@ class PlayerFragment : Fragment(),
|
|||||||
collectionViewModel.collectionLiveData.observe(this) {
|
collectionViewModel.collectionLiveData.observe(this) {
|
||||||
// update collection
|
// update collection
|
||||||
collection = it
|
collection = it
|
||||||
// updates current station in player views
|
//// // updates current station in player views
|
||||||
playerState = PreferencesHelper.loadPlayerState()
|
//// playerState = PreferencesHelper.loadPlayerState()
|
||||||
// // get station
|
// // get station
|
||||||
val station: Station = CollectionHelper.getStation(collection, playerState.stationUuid)
|
// val station: Station = CollectionHelper.getStation(collection, playerState.stationUuid)
|
||||||
// // update player views
|
// // update player views
|
||||||
layout.updatePlayerViews(activity as Context, station, playerState.isPlaying)
|
// layout.updatePlayerViews(activity as Context, station, playerState.isPlaying)
|
||||||
// handle start intent
|
//// // handle start intent
|
||||||
handleStartIntent()
|
//// handleStartIntent()
|
||||||
// handle navigation arguments
|
//// // handle navigation arguments
|
||||||
handleNavigationArguments()
|
//// handleNavigationArguments()
|
||||||
}
|
}
|
||||||
collectionViewModel.collectionSizeLiveData.observe(this) {
|
collectionViewModel.collectionSizeLiveData.observe(this) {
|
||||||
// size of collection changed
|
// size of collection changed
|
||||||
|
|||||||
@@ -280,8 +280,19 @@ class PlayerService : MediaLibraryService() {
|
|||||||
val updatedMediaItems: List<MediaItem> =
|
val updatedMediaItems: List<MediaItem> =
|
||||||
mediaItems.map { mediaItem ->
|
mediaItems.map { mediaItem ->
|
||||||
CollectionHelper.getItem(this@PlayerService, collection, mediaItem.mediaId)
|
CollectionHelper.getItem(this@PlayerService, collection, mediaItem.mediaId)
|
||||||
|
// if (mediaItem.requestMetadata.searchQuery != null)
|
||||||
|
// getMediaItemFromSearchQuery(mediaItem.requestMetadata.searchQuery!!)
|
||||||
|
// else MediaItemTree.getItem(mediaItem.mediaId) ?: mediaItem
|
||||||
}
|
}
|
||||||
return Futures.immediateFuture(updatedMediaItems)
|
return Futures.immediateFuture(updatedMediaItems)
|
||||||
|
|
||||||
|
|
||||||
|
// val updatedMediaItems = mediaItems.map { mediaItem ->
|
||||||
|
// mediaItem.buildUpon().apply {
|
||||||
|
// setUri(mediaItem.requestMetadata.mediaUri)
|
||||||
|
// }.build()
|
||||||
|
// }
|
||||||
|
// return Futures.immediateFuture(updatedMediaItems)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -400,19 +411,19 @@ class PlayerService : MediaLibraryService() {
|
|||||||
customLayout: ImmutableList<CommandButton>,
|
customLayout: ImmutableList<CommandButton>,
|
||||||
showPauseButton: Boolean
|
showPauseButton: Boolean
|
||||||
): ImmutableList<CommandButton> {
|
): ImmutableList<CommandButton> {
|
||||||
val seekToPreviousCommandButton = CommandButton.Builder(CommandButton.ICON_UNDEFINED)
|
val seekToPreviousCommandButton = CommandButton.Builder()
|
||||||
.setPlayerCommand(Player.COMMAND_SEEK_TO_PREVIOUS)
|
.setPlayerCommand(Player.COMMAND_SEEK_TO_PREVIOUS)
|
||||||
.setCustomIconResId(R.drawable.ic_notification_skip_to_previous_36dp)
|
.setIconResId(R.drawable.ic_notification_skip_to_previous_36dp)
|
||||||
.setEnabled(true)
|
.setEnabled(true)
|
||||||
.build()
|
.build()
|
||||||
val playCommandButton = CommandButton.Builder(CommandButton.ICON_UNDEFINED)
|
val playCommandButton = CommandButton.Builder()
|
||||||
.setPlayerCommand(Player.COMMAND_PLAY_PAUSE)
|
.setPlayerCommand(Player.COMMAND_PLAY_PAUSE)
|
||||||
.setCustomIconResId(if (player.isPlaying) R.drawable.ic_notification_stop_36dp else R.drawable.ic_notification_play_36dp)
|
.setIconResId(if (player.isPlaying) R.drawable.ic_notification_stop_36dp else R.drawable.ic_notification_play_36dp)
|
||||||
.setEnabled(true)
|
.setEnabled(true)
|
||||||
.build()
|
.build()
|
||||||
val seekToNextCommandButton = CommandButton.Builder(CommandButton.ICON_UNDEFINED)
|
val seekToNextCommandButton = CommandButton.Builder()
|
||||||
.setPlayerCommand(Player.COMMAND_SEEK_TO_NEXT)
|
.setPlayerCommand(Player.COMMAND_SEEK_TO_NEXT)
|
||||||
.setCustomIconResId(R.drawable.ic_notification_skip_to_next_36dp)
|
.setIconResId(R.drawable.ic_notification_skip_to_next_36dp)
|
||||||
.setEnabled(true)
|
.setEnabled(true)
|
||||||
.build()
|
.build()
|
||||||
val commandButtons: MutableList<CommandButton> = mutableListOf(
|
val commandButtons: MutableList<CommandButton> = mutableListOf(
|
||||||
@@ -487,10 +498,15 @@ class PlayerService : MediaLibraryService() {
|
|||||||
if (!playWhenReady) {
|
if (!playWhenReady) {
|
||||||
when (reason) {
|
when (reason) {
|
||||||
Player.PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM -> {
|
Player.PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM -> {
|
||||||
stopSelf()
|
// playback reached end: stop / end playback
|
||||||
}
|
}
|
||||||
else -> {
|
else -> {
|
||||||
stopSelf()
|
// playback has been paused by user or OS: update media session and save state
|
||||||
|
// PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST or
|
||||||
|
// PLAY_WHEN_READY_CHANGE_REASON_AUDIO_FOCUS_LOSS or
|
||||||
|
// PLAY_WHEN_READY_CHANGE_REASON_AUDIO_BECOMING_NOISY or
|
||||||
|
// PLAY_WHEN_READY_CHANGE_REASON_REMOTE
|
||||||
|
// handlePlaybackChange(PlaybackStateCompat.STATE_PAUSED)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -569,6 +585,7 @@ class PlayerService : MediaLibraryService() {
|
|||||||
intent.putExtra(AudioEffect.EXTRA_PACKAGE_NAME, packageName)
|
intent.putExtra(AudioEffect.EXTRA_PACKAGE_NAME, packageName)
|
||||||
intent.putExtra(AudioEffect.EXTRA_CONTENT_TYPE, AudioEffect.CONTENT_TYPE_MUSIC)
|
intent.putExtra(AudioEffect.EXTRA_CONTENT_TYPE, AudioEffect.CONTENT_TYPE_MUSIC)
|
||||||
sendBroadcast(intent)
|
sendBroadcast(intent)
|
||||||
|
// note: remember to broadcast AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION, when not needed anymore
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ 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()
|
||||||
|
|||||||
@@ -116,21 +116,16 @@ class SettingsFragment : PreferenceFragmentCompat(), YesNoDialog.YesNoDialogList
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// set up "Update Stations" preference
|
// // set up "Update Stations" preference
|
||||||
val preferenceUpdateCollection = Preference(activity as Context)
|
// val preferenceUpdateCollection: Preference = Preference(activity as Context)
|
||||||
preferenceUpdateCollection.title = getString(R.string.pref_update_collection_title)
|
// preferenceUpdateCollection.title = getString(R.string.pref_update_collection_title)
|
||||||
preferenceUpdateCollection.setIcon(R.drawable.ic_refresh_24dp)
|
// preferenceUpdateCollection.setIcon(R.drawable.ic_refresh_24dp)
|
||||||
preferenceUpdateCollection.summary = getString(R.string.pref_update_collection_summary)
|
// preferenceUpdateCollection.summary = getString(R.string.pref_update_collection_summary)
|
||||||
preferenceUpdateCollection.setOnPreferenceClickListener {
|
// preferenceUpdateCollection.setOnPreferenceClickListener {
|
||||||
// show dialog
|
// // show dialog
|
||||||
YesNoDialog(this).show(
|
// YesNoDialog(this).show(context = activity as Context, type = Keys.DIALOG_UPDATE_COLLECTION, message = R.string.dialog_yes_no_message_update_collection, yesButton = R.string.dialog_yes_no_positive_button_update_collection)
|
||||||
context = activity as Context,
|
// return@setOnPreferenceClickListener true
|
||||||
type = Keys.DIALOG_UPDATE_COLLECTION,
|
// }
|
||||||
message = R.string.dialog_yes_no_message_update_collection,
|
|
||||||
yesButton = R.string.dialog_yes_no_positive_button_update_collection,
|
|
||||||
)
|
|
||||||
return@setOnPreferenceClickListener true
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// set up "M3U Export" preference
|
// set up "M3U Export" preference
|
||||||
@@ -304,7 +299,7 @@ class SettingsFragment : PreferenceFragmentCompat(), YesNoDialog.YesNoDialogList
|
|||||||
screen.addPreference(preferenceThemeSelection)
|
screen.addPreference(preferenceThemeSelection)
|
||||||
screen.addPreference(preferenceCategoryMaintenance)
|
screen.addPreference(preferenceCategoryMaintenance)
|
||||||
screen.addPreference(preferenceUpdateStationImages)
|
screen.addPreference(preferenceUpdateStationImages)
|
||||||
screen.addPreference(preferenceUpdateCollection)
|
// screen.addPreference(preferenceUpdateCollection)
|
||||||
screen.addPreference(preferenceCategoryImportExport)
|
screen.addPreference(preferenceCategoryImportExport)
|
||||||
screen.addPreference(preferenceM3uExport)
|
screen.addPreference(preferenceM3uExport)
|
||||||
screen.addPreference(preferencePlsExport)
|
screen.addPreference(preferencePlsExport)
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ import android.text.method.ScrollingMovementMethod
|
|||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import android.widget.Toast
|
|
||||||
import androidx.core.view.isGone
|
import androidx.core.view.isGone
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
@@ -82,7 +81,8 @@ class ErrorDialog {
|
|||||||
|
|
||||||
// add okay button
|
// add okay button
|
||||||
builder.setPositiveButton(R.string.dialog_generic_button_okay) { _, _ ->
|
builder.setPositiveButton(R.string.dialog_generic_button_okay) { _, _ ->
|
||||||
Toast.makeText(context, R.string.dialog_generic_button_okay, Toast.LENGTH_SHORT).show()
|
// listen for click on okay button
|
||||||
|
// do nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
// display error dialog
|
// display error dialog
|
||||||
|
|||||||
@@ -644,6 +644,48 @@ object CollectionHelper {
|
|||||||
LocalBroadcastManager.getInstance(context).sendBroadcast(collectionChangedIntent)
|
LocalBroadcastManager.getInstance(context).sendBroadcast(collectionChangedIntent)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// /* Creates MediaMetadata for a single station - used in media session*/
|
||||||
|
// fun buildStationMediaMetadata(context: Context, station: Station, metadata: String): MediaMetadataCompat {
|
||||||
|
// return MediaMetadataCompat.Builder().apply {
|
||||||
|
// putString(MediaMetadataCompat.METADATA_KEY_ARTIST, station.name)
|
||||||
|
// putString(MediaMetadataCompat.METADATA_KEY_TITLE, metadata)
|
||||||
|
// putString(MediaMetadataCompat.METADATA_KEY_ALBUM, context.getString(R.string.app_name))
|
||||||
|
// putString(MediaMetadataCompat.METADATA_KEY_MEDIA_URI, station.getStreamUri())
|
||||||
|
// putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, ImageHelper.getScaledStationImage(context, station.image, Keys.SIZE_COVER_LOCK_SCREEN))
|
||||||
|
// //putString(MediaMetadataCompat.METADATA_KEY_ALBUM_ART_URI, station.image)
|
||||||
|
// }.build()
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /* Creates MediaItem for a station - used by collection provider */
|
||||||
|
// fun buildStationMediaMetaItem(context: Context, station: Station): MediaBrowserCompat.MediaItem {
|
||||||
|
// val mediaDescriptionBuilder = MediaDescriptionCompat.Builder()
|
||||||
|
// mediaDescriptionBuilder.setMediaId(station.uuid)
|
||||||
|
// mediaDescriptionBuilder.setTitle(station.name)
|
||||||
|
// mediaDescriptionBuilder.setIconBitmap(ImageHelper.getScaledStationImage(context, station.image, Keys.SIZE_COVER_LOCK_SCREEN))
|
||||||
|
// // mediaDescriptionBuilder.setIconUri(station.image.toUri())
|
||||||
|
// return MediaBrowserCompat.MediaItem(mediaDescriptionBuilder.build(), MediaBrowserCompat.MediaItem.FLAG_PLAYABLE)
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /* Creates description for a station - used in MediaSessionConnector */
|
||||||
|
// fun buildStationMediaDescription(context: Context, station: Station, metadata: String): MediaDescriptionCompat {
|
||||||
|
// val coverBitmap: Bitmap = ImageHelper.getScaledStationImage(context, station.image, Keys.SIZE_COVER_LOCK_SCREEN)
|
||||||
|
// val extras: Bundle = Bundle()
|
||||||
|
// extras.putParcelable(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, coverBitmap)
|
||||||
|
// extras.putParcelable(MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON, coverBitmap)
|
||||||
|
// return MediaDescriptionCompat.Builder().apply {
|
||||||
|
// setMediaId(station.uuid)
|
||||||
|
// setIconBitmap(coverBitmap)
|
||||||
|
// setIconUri(station.image.toUri())
|
||||||
|
// setTitle(metadata)
|
||||||
|
// setSubtitle(station.name)
|
||||||
|
// setExtras(extras)
|
||||||
|
// }.build()
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
/* Creates a MediaItem with MediaMetadata for a single radio station - used to prepare player */
|
/* Creates a MediaItem with MediaMetadata for a single radio station - used to prepare player */
|
||||||
fun buildMediaItem(context: Context, station: Station): MediaItem {
|
fun buildMediaItem(context: Context, station: Station): MediaItem {
|
||||||
// put uri in RequestMetadata - credit: https://stackoverflow.com/a/70103460
|
// put uri in RequestMetadata - credit: https://stackoverflow.com/a/70103460
|
||||||
|
|||||||
@@ -246,7 +246,7 @@ object FileHelper {
|
|||||||
File(activity.getExternalFilesDir(Keys.FOLDER_COLLECTION), Keys.COLLECTION_M3U_FILE)
|
File(activity.getExternalFilesDir(Keys.FOLDER_COLLECTION), Keys.COLLECTION_M3U_FILE)
|
||||||
if (!m3uFile.exists()) {
|
if (!m3uFile.exists()) {
|
||||||
m3uFile = File(
|
m3uFile = File(
|
||||||
activity.getExternalFilesDir(Keys.RADIO_LEGACY_FOLDER_COLLECTION),
|
activity.getExternalFilesDir(Keys.URLRADIO_LEGACY_FOLDER_COLLECTION),
|
||||||
Keys.COLLECTION_M3U_FILE
|
Keys.COLLECTION_M3U_FILE
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -270,7 +270,7 @@ object FileHelper {
|
|||||||
File(activity.getExternalFilesDir(Keys.FOLDER_COLLECTION), Keys.COLLECTION_PLS_FILE)
|
File(activity.getExternalFilesDir(Keys.FOLDER_COLLECTION), Keys.COLLECTION_PLS_FILE)
|
||||||
if (!plsFile.exists()) {
|
if (!plsFile.exists()) {
|
||||||
plsFile = File(
|
plsFile = File(
|
||||||
activity.getExternalFilesDir(Keys.RADIO_LEGACY_FOLDER_COLLECTION),
|
activity.getExternalFilesDir(Keys.URLRADIO_LEGACY_FOLDER_COLLECTION),
|
||||||
Keys.COLLECTION_PLS_FILE
|
Keys.COLLECTION_PLS_FILE
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ 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
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -99,7 +98,7 @@ object ImageHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// create empty bitmap and canvas
|
// create empty bitmap and canvas
|
||||||
val outputImage: Bitmap = createBitmap(size, size, Bitmap.Config.ARGB_8888)
|
val outputImage: Bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888)
|
||||||
val imageCanvas = Canvas(outputImage)
|
val imageCanvas = Canvas(outputImage)
|
||||||
|
|
||||||
// draw square background
|
// draw square background
|
||||||
|
|||||||
42
app/src/main/java/com/michatec/radio/helpers/ImportHelper.kt
Normal file
42
app/src/main/java/com/michatec/radio/helpers/ImportHelper.kt
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
* 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)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -120,7 +120,7 @@ object NetworkHelper {
|
|||||||
InetAddress.getAllByName(Keys.RADIO_BROWSER_API_BASE)
|
InetAddress.getAllByName(Keys.RADIO_BROWSER_API_BASE)
|
||||||
// select a random address
|
// select a random address
|
||||||
serverAddressList[Random().nextInt(serverAddressList.size)].canonicalHostName
|
serverAddressList[Random().nextInt(serverAddressList.size)].canonicalHostName
|
||||||
} catch (_: UnknownHostException) {
|
} catch (e: UnknownHostException) {
|
||||||
Keys.RADIO_BROWSER_API_DEFAULT
|
Keys.RADIO_BROWSER_API_DEFAULT
|
||||||
}
|
}
|
||||||
PreferencesHelper.saveRadioBrowserApiAddress(serverAddress)
|
PreferencesHelper.saveRadioBrowserApiAddress(serverAddress)
|
||||||
|
|||||||
@@ -213,6 +213,20 @@ 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(
|
||||||
@@ -227,6 +241,15 @@ 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)
|
||||||
@@ -253,7 +276,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,
|
||||||
false
|
Keys.DEFAULT_DOWNLOAD_OVER_MOBILE
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,17 @@
|
|||||||
|
/*
|
||||||
|
* UiHelper.kt
|
||||||
|
* Implements the UiHelper object
|
||||||
|
* A UiHelper provides helper methods for User Interface related tasks
|
||||||
|
*
|
||||||
|
* 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
|
package com.michatec.radio.helpers
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
|||||||
@@ -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 { response ->
|
private val responseListener: Response.Listener<JSONArray> = Response.Listener<JSONArray> { response ->
|
||||||
if (response != null) {
|
if (response != null) {
|
||||||
radioBrowserSearchListener.onRadioBrowserSearchResults(createRadioBrowserResult(response.toString()))
|
radioBrowserSearchListener.onRadioBrowserSearchResults(createRadioBrowserResult(response.toString()))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ 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
|
||||||
@@ -239,7 +240,7 @@ class SearchResultAdapter(
|
|||||||
/*
|
/*
|
||||||
* Inner class: ViewHolder for a radio station search result
|
* Inner class: ViewHolder for a radio station search result
|
||||||
*/
|
*/
|
||||||
private class SearchResultViewHolder(var searchResultLayout: View) :
|
private inner 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)
|
||||||
|
|||||||
@@ -313,6 +313,18 @@ data class LayoutHolder(var rootView: View) {
|
|||||||
isBuffering = buffering
|
isBuffering = buffering
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Toggles visibility of player depending on playback state - hiding it when playback is stopped (not paused or playing) */
|
||||||
|
// fun togglePlayerVisibility(context: Context, playbackState: Int): Boolean {
|
||||||
|
// when (playbackState) {
|
||||||
|
// PlaybackStateCompat.STATE_STOPPED -> return hidePlayer(context)
|
||||||
|
// PlaybackStateCompat.STATE_NONE -> return hidePlayer(context)
|
||||||
|
// PlaybackStateCompat.STATE_ERROR -> return hidePlayer(context)
|
||||||
|
// else -> return showPlayer(context)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
/* Toggles visibility of the download progress indicator */
|
/* Toggles visibility of the download progress indicator */
|
||||||
fun toggleDownloadProgressIndicator() {
|
fun toggleDownloadProgressIndicator() {
|
||||||
when (PreferencesHelper.loadActiveDownloads()) {
|
when (PreferencesHelper.loadActiveDownloads()) {
|
||||||
|
|||||||
9
app/src/main/res/drawable/ic_codeberg_24dp.xml
Normal file
9
app/src/main/res/drawable/ic_codeberg_24dp.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<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,17 +0,0 @@
|
|||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:width="24dp"
|
|
||||||
android:height="24dp"
|
|
||||||
android:viewportWidth="24"
|
|
||||||
android:viewportHeight="24">
|
|
||||||
|
|
||||||
<path
|
|
||||||
android:fillColor="@color/icon_default"
|
|
||||||
android:pathData="M17.65,6.35C16.2,4.9 14.21,4 12,4
|
|
||||||
7.58,4 4,7.58 4,12h2
|
|
||||||
c0,-3.31 2.69,-6 6,-6
|
|
||||||
1.66,0 3.14,0.69 4.22,1.78L13,11h7V4l-2.35,2.35z
|
|
||||||
M6.35,17.65C7.8,19.1 9.79,20 12,20
|
|
||||||
c4.42,0 8,-3.58 8,-8h-2
|
|
||||||
c0,3.31 -2.69,6 -6,6
|
|
||||||
-1.66,0 -3.14,-0.69 -4.22,-1.78L11,13H4v7l2.35,-2.35z"/>
|
|
||||||
</vector>
|
|
||||||
@@ -51,10 +51,6 @@
|
|||||||
<string name="player_sheet_h2_station_metadata">Momentan läuft</string>
|
<string name="player_sheet_h2_station_metadata">Momentan läuft</string>
|
||||||
<string name="player_sheet_h2_stream_url">Streaming-Adresse</string>
|
<string name="player_sheet_h2_stream_url">Streaming-Adresse</string>
|
||||||
<!-- Settings -->
|
<!-- Settings -->
|
||||||
<string name="pref_update_collection_title">Senderinformationnen aktualisieren</string>
|
|
||||||
<string name="pref_update_collection_summary">Die neueste Version aller Senderinformationen herunterladen.</string>
|
|
||||||
<string name="dialog_yes_no_message_update_collection">Die neueste Version aller Senderinformationen herunterladen?</string>
|
|
||||||
<string name="dialog_yes_no_positive_button_update_collection">Aktualisieren</string>
|
|
||||||
<string name="pref_advanced_title">Erweitert</string>
|
<string name="pref_advanced_title">Erweitert</string>
|
||||||
<string name="pref_app_version_summary">Version</string>
|
<string name="pref_app_version_summary">Version</string>
|
||||||
<string name="pref_app_version_title">App-Version</string>
|
<string name="pref_app_version_title">App-Version</string>
|
||||||
|
|||||||
@@ -59,10 +59,6 @@
|
|||||||
<string name="player_sheet_h2_stream_url">Streaming link</string>
|
<string name="player_sheet_h2_stream_url">Streaming link</string>
|
||||||
|
|
||||||
<!-- Settings -->
|
<!-- Settings -->
|
||||||
<string name="pref_update_collection_title">Update Stations</string>
|
|
||||||
<string name="pref_update_collection_summary">Download latest version of all station.</string>
|
|
||||||
<string name="dialog_yes_no_message_update_collection">Download latest version of all station?</string>
|
|
||||||
<string name="dialog_yes_no_positive_button_update_collection">Update</string>
|
|
||||||
<string name="pref_advanced_title">Advanced</string>
|
<string name="pref_advanced_title">Advanced</string>
|
||||||
<string name="pref_app_version_summary">Version</string>
|
<string name="pref_app_version_summary">Version</string>
|
||||||
<string name="pref_app_version_title">App Version</string>
|
<string name="pref_app_version_title">App Version</string>
|
||||||
|
|||||||
@@ -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.1.0' apply false
|
id 'com.android.application' version '9.0.0' apply false
|
||||||
id 'com.android.library' version '9.1.0' apply false
|
id 'com.android.library' version '9.0.0' apply false
|
||||||
id 'org.jetbrains.kotlin.android' version "2.3.10" apply false
|
id 'org.jetbrains.kotlin.android' version "2.3.0" apply false
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.register('clean', Delete) {
|
tasks.register('clean', Delete) {
|
||||||
|
|||||||
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
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.4.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
|
||||||
|
|||||||
2
gradlew
vendored
2
gradlew
vendored
@@ -57,7 +57,7 @@
|
|||||||
# Darwin, MinGW, and NonStop.
|
# Darwin, MinGW, and NonStop.
|
||||||
#
|
#
|
||||||
# (3) This script is generated from the Groovy template
|
# (3) This script is generated from the Groovy template
|
||||||
# https://github.com/gradle/gradle/blob/b631911858264c0b6e4d6603d677ff5218766cee/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||||
# within the Gradle project.
|
# within the Gradle project.
|
||||||
#
|
#
|
||||||
# You can find Gradle at https://github.com/gradle/gradle/.
|
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||||
|
|||||||
@@ -5,9 +5,6 @@ pluginManagement {
|
|||||||
gradlePluginPortal()
|
gradlePluginPortal()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
plugins {
|
|
||||||
id 'org.gradle.toolchains.foojay-resolver-convention' version '1.0.0'
|
|
||||||
}
|
|
||||||
dependencyResolutionManagement {
|
dependencyResolutionManagement {
|
||||||
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
|
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
|
||||||
repositories {
|
repositories {
|
||||||
|
|||||||
Reference in New Issue
Block a user