Add contribution templates
Add contribution templates for this project.
This commit is contained in:
parent
953e1291b6
commit
f85bd85c92
15 changed files with 103 additions and 40 deletions
8
.github/CONTRIBUTING.md
vendored
8
.github/CONTRIBUTING.md
vendored
|
@ -10,9 +10,9 @@ Please keep in mind when reporting an issue:
|
||||||
- **Is it still relevant in the latest version?** Make sure to test it in the latest version.
|
- **Is it still relevant in the latest version?** Make sure to test it in the latest version.
|
||||||
|
|
||||||
If you do make an issue, Make sure to provide:
|
If you do make an issue, Make sure to provide:
|
||||||
- A summary of what you were doing before the bug/crash
|
- A description of the bug/crash
|
||||||
- What do you did that caused the bug/crash
|
- A summary of the steps to create the bug/crash
|
||||||
- A trace/logcat if possible, the longer the better.
|
- A stack trace/logcat if possible, the longer the better.
|
||||||
|
|
||||||
If you have knowledge of Android/Kotlin in general, you could also go about fixing the bug yourself and opening a [Pull Request](https://github.com/OxygenCobalt/Auxio/pulls).
|
If you have knowledge of Android/Kotlin in general, you could also go about fixing the bug yourself and opening a [Pull Request](https://github.com/OxygenCobalt/Auxio/pulls).
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ These should also be logged in the [Issues](https://github.com/OxygenCobalt/Aux
|
||||||
Please keep in mind when requesting a feature:
|
Please keep in mind when requesting a feature:
|
||||||
- **Has it already been requested?** Make sure request for this feature is not already here.
|
- **Has it already been requested?** Make sure request for this feature is not already here.
|
||||||
- **Has it been already added?** Make sure this feature has not already been added in the most recent release.
|
- **Has it been already added?** Make sure this feature has not already been added in the most recent release.
|
||||||
- **Will it be accepted?** Read the [Accepted Additions and Requests](../info/ADDITIONS.md) in order to see the likelihood that your request will be accepted.
|
- **Will it be accepted?** Read the [Accepted Additions and Requests](../info/ADDITIONS.md) in order to see the likelihood that your request will be implemented.
|
||||||
|
|
||||||
If you do make a request, provide the following:
|
If you do make a request, provide the following:
|
||||||
- What kind of addition is this? (A Full Feature? A new customization option? A UI Change?)
|
- What kind of addition is this? (A Full Feature? A new customization option? A UI Change?)
|
||||||
|
|
32
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
32
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
---
|
||||||
|
name: Bug/Crash Report
|
||||||
|
about: Report an issue with Auxio
|
||||||
|
labels: bug
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Describe the bug/crash**
|
||||||
|
<!-- A clear and concise description of what the bug or crash is. -->
|
||||||
|
|
||||||
|
**To Reproduce**
|
||||||
|
<!--
|
||||||
|
Steps to reproduce the bug/crash:
|
||||||
|
1. Go to X
|
||||||
|
2. Click on Y
|
||||||
|
3. Scroll down to Z
|
||||||
|
4. See error
|
||||||
|
-->
|
||||||
|
|
||||||
|
**Logs/Stack Traces**
|
||||||
|
<!-- If possible, provide a stack trace or a Logcat. This can help identify the issue. -->
|
||||||
|
|
||||||
|
**Screenshots**
|
||||||
|
<!-- If applicable, add screenshots to help explain your problem. -->
|
||||||
|
|
||||||
|
**Phone Information**
|
||||||
|
<!-- Please provide information about your phone's android version/model. -->
|
||||||
|
|
||||||
|
**Due Diligence**
|
||||||
|
|
||||||
|
- [ ] I have read the [Contribution Guidelines](../CONTRIBUTING.md).
|
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
---
|
||||||
|
name: Bug/Crash Report
|
||||||
|
about: Propose an idea for Auxio
|
||||||
|
labels: enhancement
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Describe the feature you want to implement**
|
||||||
|
<!-- A clear and concise description of what you want to be added. -->
|
||||||
|
|
||||||
|
**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 [...] -->
|
||||||
|
|
||||||
|
**Why do you think this will improve everyone's usage of Auxio?**
|
||||||
|
<!-- Provide a rationale here -->
|
||||||
|
|
||||||
|
**Due Diligence**
|
||||||
|
|
||||||
|
- [ ] I have read the [Accepted Additions and Requests](../../info/ADDITIONS.md), and the [Contribution Guidelines](../CONTRIBUTING.md).
|
28
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
28
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
<!-- Please fill out all this information. -->
|
||||||
|
|
||||||
|
**What is it?**
|
||||||
|
- [ ] Bugfix (user facing)
|
||||||
|
- [ ] Feature (user facing)
|
||||||
|
- [ ] Codebase improvement (dev facing)
|
||||||
|
- [ ] Meta improvement to the project (dev facing)
|
||||||
|
|
||||||
|
**Description of changes**
|
||||||
|
<!-- Bullet points or free-form text -->
|
||||||
|
- Do this
|
||||||
|
- Fix that
|
||||||
|
- Listen to music
|
||||||
|
|
||||||
|
**Fixes the following issues**
|
||||||
|
<!-- Also add any other links relevant to your change. -->
|
||||||
|
-
|
||||||
|
|
||||||
|
**Any additional information**
|
||||||
|
<!-- Also add any information relevant to this PR -->
|
||||||
|
|
||||||
|
**APK testing**
|
||||||
|
<!-- Please create a debug APK for your changes. -->
|
||||||
|
debug.zip
|
||||||
|
|
||||||
|
**Due Diligence**
|
||||||
|
|
||||||
|
- [ ] I have read the [Contribution Guidelines](CONTRIBUTING.md) and [Accepted additions & Requests](../info/ADDITIONS.md).
|
|
@ -16,7 +16,10 @@
|
||||||
|
|
||||||
Auxio is a local music player for android that I primarily built for myself.
|
Auxio is a local music player for android that I primarily built for myself.
|
||||||
|
|
||||||
It only has the features that I use out of a music player and nothing more, with a UI/UX mostly derived from [Spotify](https://spotify.com), but with elements from [Phonograph](https://github.com/kabouzeid/Phonograph) and [Music Player GO](https://github.com/OxygenCobalt/Auxio). Its meant to be consistent and reliable, while still being customizable and extendable if one wants to add their own features that I (Personally) don't need.
|
It only has the features that I use out of a music player and nothing more, with a Spotify-Like UI/UX combined with elements from [Phonograph](https://github.com/kabouzeid/Phonograph) and [Music Player GO](https://github.com/enricocid/Music-Player-GO).
|
||||||
|
Its meant to be consistent and reliable, while still being customizable and extendable if one wants to add their own features that I (Personally) don't need.
|
||||||
|
|
||||||
|
**Note:** Auxio is still early in development, meaning that some things may change as time passes.
|
||||||
|
|
||||||
## Screenshots
|
## Screenshots
|
||||||
|
|
||||||
|
@ -40,6 +43,7 @@ It only has the features that I use out of a music player and nothing more, with
|
||||||
- Full playback persistence system
|
- Full playback persistence system
|
||||||
- Embedded covers support
|
- Embedded covers support
|
||||||
- Search Functionality
|
- Search Functionality
|
||||||
|
- Audio Focus / Headset Management
|
||||||
- No internet connectivity whatsoever
|
- No internet connectivity whatsoever
|
||||||
- Kotlin from the ground-up
|
- Kotlin from the ground-up
|
||||||
- Modular, feature-based architecture
|
- Modular, feature-based architecture
|
||||||
|
|
|
@ -121,7 +121,7 @@ class PlaybackStateDatabase(context: Context) :
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read the stored [PlaybackState] from the database, if there is one.
|
* Read the stored [PlaybackState] from the database, if there is one.
|
||||||
* @return The stored [PlaybackState], null if there isn't one,.
|
* @return The stored [PlaybackState], null if there isn't one.
|
||||||
*/
|
*/
|
||||||
fun readState(): PlaybackState? {
|
fun readState(): PlaybackState? {
|
||||||
val database = writableDatabase
|
val database = writableDatabase
|
||||||
|
|
|
@ -27,13 +27,9 @@ class LibraryViewModel : ViewModel(), SettingsManager.Callback {
|
||||||
private var mDisplayMode = DisplayMode.SHOW_ARTISTS
|
private var mDisplayMode = DisplayMode.SHOW_ARTISTS
|
||||||
private var mIsNavigating = false
|
private var mIsNavigating = false
|
||||||
|
|
||||||
/** The current [SortMode] */
|
|
||||||
val sortMode: LiveData<SortMode> get() = mSortMode
|
val sortMode: LiveData<SortMode> get() = mSortMode
|
||||||
/** The current library data */
|
|
||||||
val libraryData: LiveData<List<BaseModel>> get() = mLibraryData
|
val libraryData: LiveData<List<BaseModel>> get() = mLibraryData
|
||||||
/** The results from the last search query */
|
|
||||||
val searchResults: LiveData<List<BaseModel>> get() = mSearchResults
|
val searchResults: LiveData<List<BaseModel>> get() = mSearchResults
|
||||||
/** If LibraryFragment is already navigating */
|
|
||||||
val isNavigating: Boolean get() = mIsNavigating
|
val isNavigating: Boolean get() = mIsNavigating
|
||||||
|
|
||||||
private val settingsManager = SettingsManager.getInstance()
|
private val settingsManager = SettingsManager.getInstance()
|
||||||
|
@ -110,9 +106,6 @@ class LibraryViewModel : ViewModel(), SettingsManager.Callback {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Reset the search query.
|
|
||||||
*/
|
|
||||||
fun resetQuery() {
|
fun resetQuery() {
|
||||||
mSearchResults.value = listOf()
|
mSearchResults.value = listOf()
|
||||||
}
|
}
|
||||||
|
@ -120,7 +113,7 @@ class LibraryViewModel : ViewModel(), SettingsManager.Callback {
|
||||||
// --- LIBRARY FUNCTIONS ---
|
// --- LIBRARY FUNCTIONS ---
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update the current [SortMode].
|
* Update the current [SortMode] with a menu id.
|
||||||
* @param itemId The id of the menu item selected.
|
* @param itemId The id of the menu item selected.
|
||||||
*/
|
*/
|
||||||
fun updateSortMode(@IdRes itemId: Int) {
|
fun updateSortMode(@IdRes itemId: Int) {
|
||||||
|
|
|
@ -28,7 +28,7 @@ class MusicStore private constructor() {
|
||||||
private var mSongs = listOf<Song>()
|
private var mSongs = listOf<Song>()
|
||||||
val songs: List<Song> get() = mSongs
|
val songs: List<Song> get() = mSongs
|
||||||
|
|
||||||
/** All parent models loaded by Auxio */
|
/** All parent models (ex Albums, Artists) loaded by Auxio */
|
||||||
val parents: MutableList<BaseModel> by lazy {
|
val parents: MutableList<BaseModel> by lazy {
|
||||||
val parents = mutableListOf<BaseModel>()
|
val parents = mutableListOf<BaseModel>()
|
||||||
parents.addAll(mGenres)
|
parents.addAll(mGenres)
|
||||||
|
|
|
@ -100,7 +100,7 @@ fun ImageView.bindArtistImage(artist: Artist) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Bind the genre image for an artist.
|
* Bind the genre image for a genre.
|
||||||
*/
|
*/
|
||||||
@BindingAdapter("genreImage")
|
@BindingAdapter("genreImage")
|
||||||
fun ImageView.bindGenreImage(genre: Genre) {
|
fun ImageView.bindGenreImage(genre: Genre) {
|
||||||
|
|
|
@ -53,23 +53,20 @@ class PlaybackViewModel : ViewModel(), PlaybackStateManager.Callback {
|
||||||
val parent: LiveData<BaseModel?> get() = mParent
|
val parent: LiveData<BaseModel?> get() = mParent
|
||||||
/** The current playback position, in seconds */
|
/** The current playback position, in seconds */
|
||||||
val position: LiveData<Long> get() = mPosition
|
val position: LiveData<Long> get() = mPosition
|
||||||
/** The current queue determined my [mode] and [parent] */
|
|
||||||
|
/** The current queue determined by [mode] and [parent] */
|
||||||
val queue: LiveData<MutableList<Song>> get() = mQueue
|
val queue: LiveData<MutableList<Song>> get() = mQueue
|
||||||
/** The queue created by the user. */
|
/** The queue created by the user. */
|
||||||
val userQueue: LiveData<MutableList<Song>> get() = mUserQueue
|
val userQueue: LiveData<MutableList<Song>> get() = mUserQueue
|
||||||
/** The current [PlaybackMode] that also determines the queue */
|
/** The current [PlaybackMode] that also determines the queue */
|
||||||
val mode: LiveData<PlaybackMode> get() = mMode
|
val mode: LiveData<PlaybackMode> get() = mMode
|
||||||
/** Whether the playback is paused or played. */
|
|
||||||
val isPlaying: LiveData<Boolean> get() = mIsPlaying
|
val isPlaying: LiveData<Boolean> get() = mIsPlaying
|
||||||
/** Whether the queue is shuffled or not. */
|
|
||||||
val isShuffling: LiveData<Boolean> get() = mIsShuffling
|
val isShuffling: LiveData<Boolean> get() = mIsShuffling
|
||||||
/** The current [LoopMode] */
|
/** The current repeat mode */
|
||||||
val loopMode: LiveData<LoopMode> get() = mLoopMode
|
val loopMode: LiveData<LoopMode> get() = mLoopMode
|
||||||
/** Whether the user is seeking or not */
|
|
||||||
val isSeeking: LiveData<Boolean> get() = mIsSeeking
|
val isSeeking: LiveData<Boolean> get() = mIsSeeking
|
||||||
/** Whether to nav to an item or not */
|
|
||||||
val navToItem: LiveData<BaseModel?> get() = mNavToItem
|
val navToItem: LiveData<BaseModel?> get() = mNavToItem
|
||||||
/** Whether the play/pause button on CompactPlaybackFragment can animate */
|
|
||||||
val canAnimate: Boolean get() = mCanAnimate
|
val canAnimate: Boolean get() = mCanAnimate
|
||||||
|
|
||||||
/** The position as a duration string. */
|
/** The position as a duration string. */
|
||||||
|
|
|
@ -156,7 +156,7 @@ class QueueAdapter(
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generic ViewHolder for the **user queue header**. Has the clear queue button.
|
* ViewHolder for the **user queue header**. Has the clear queue button.
|
||||||
*/
|
*/
|
||||||
inner class UserQueueHeaderViewHolder(
|
inner class UserQueueHeaderViewHolder(
|
||||||
context: Context,
|
context: Context,
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
package org.oxycblt.auxio.playback.state
|
package org.oxycblt.auxio.playback.state
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enum that determines the playback repeat mode.
|
||||||
|
*/
|
||||||
enum class LoopMode {
|
enum class LoopMode {
|
||||||
NONE, ONCE, INFINITE;
|
NONE, ONCE, INFINITE;
|
||||||
|
|
||||||
|
|
|
@ -851,7 +851,6 @@ class PlaybackStateManager private constructor() {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an ordered queue based on an [Artist].
|
* Create an ordered queue based on an [Artist].
|
||||||
* @return A list of the songs in the [Artist], ordered.
|
|
||||||
*/
|
*/
|
||||||
private fun orderSongsInArtist(artist: Artist): MutableList<Song> {
|
private fun orderSongsInArtist(artist: Artist): MutableList<Song> {
|
||||||
val final = mutableListOf<Song>()
|
val final = mutableListOf<Song>()
|
||||||
|
@ -865,7 +864,6 @@ class PlaybackStateManager private constructor() {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an ordered queue based on a [Genre].
|
* Create an ordered queue based on a [Genre].
|
||||||
* @return A list of the songs in the [Genre], ordered.
|
|
||||||
*/
|
*/
|
||||||
private fun orderSongsInGenre(genre: Genre): MutableList<Song> {
|
private fun orderSongsInGenre(genre: Genre): MutableList<Song> {
|
||||||
val final = mutableListOf<Song>()
|
val final = mutableListOf<Song>()
|
||||||
|
@ -887,29 +885,17 @@ class PlaybackStateManager private constructor() {
|
||||||
* remove them on destruction with [removeCallback].
|
* remove them on destruction with [removeCallback].
|
||||||
*/
|
*/
|
||||||
interface Callback {
|
interface Callback {
|
||||||
/** Called when the song updates */
|
|
||||||
fun onSongUpdate(song: Song?) {}
|
fun onSongUpdate(song: Song?) {}
|
||||||
/** Called when the parent updates */
|
|
||||||
fun onParentUpdate(parent: BaseModel?) {}
|
fun onParentUpdate(parent: BaseModel?) {}
|
||||||
/** Called when the position updates */
|
|
||||||
fun onPositionUpdate(position: Long) {}
|
fun onPositionUpdate(position: Long) {}
|
||||||
/** Called when the queue updates */
|
|
||||||
fun onQueueUpdate(queue: MutableList<Song>) {}
|
fun onQueueUpdate(queue: MutableList<Song>) {}
|
||||||
/** Called when the user queue updates */
|
|
||||||
fun onUserQueueUpdate(userQueue: MutableList<Song>) {}
|
fun onUserQueueUpdate(userQueue: MutableList<Song>) {}
|
||||||
/** Called when the mode updates */
|
|
||||||
fun onModeUpdate(mode: PlaybackMode) {}
|
fun onModeUpdate(mode: PlaybackMode) {}
|
||||||
/** Called when the index updates */
|
|
||||||
fun onIndexUpdate(index: Int) {}
|
fun onIndexUpdate(index: Int) {}
|
||||||
/** Called when the playing status changes */
|
|
||||||
fun onPlayingUpdate(isPlaying: Boolean) {}
|
fun onPlayingUpdate(isPlaying: Boolean) {}
|
||||||
/** Called when the shuffle status changes */
|
|
||||||
fun onShuffleUpdate(isShuffling: Boolean) {}
|
fun onShuffleUpdate(isShuffling: Boolean) {}
|
||||||
/** Called when the loop mode changes */
|
|
||||||
fun onLoopUpdate(mode: LoopMode) {}
|
fun onLoopUpdate(mode: LoopMode) {}
|
||||||
/** Called when a seek is confirmed */
|
|
||||||
fun onSeekConfirm(position: Long) {}
|
fun onSeekConfirm(position: Long) {}
|
||||||
/** Called when the restore process is finished */
|
|
||||||
fun onRestoreFinish() {}
|
fun onRestoreFinish() {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -96,7 +96,7 @@ class SongsFragment : Fragment() {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Go through the fast scroller process.
|
* Go through the fast scroller setup process.
|
||||||
* @param binding Binding required
|
* @param binding Binding required
|
||||||
*/
|
*/
|
||||||
private fun setupFastScroller(binding: FragmentSongsBinding) {
|
private fun setupFastScroller(binding: FragmentSongsBinding) {
|
||||||
|
|
|
@ -18,7 +18,7 @@ These will be accepted/added if I see the value in the addition of those options
|
||||||
|
|
||||||
## Feature Additions and UI Changes
|
## Feature Additions and UI Changes
|
||||||
|
|
||||||
These are far less likely to be accepted/added. As I said, I want to avoid Auxio from becoming overly bloated with features I do not use, and therefore **I will only accept features/UI changes that directly benefit my own usage.** If they do not, then I will reject/ignore them.
|
These are far less likely to be accepted/added. As I said, I want to avoid Auxio from becoming overly bloated with features I do not use, and therefore **I will only accept features/UI changes that directly benefit my own usage.** If they do not, then I will reject/ignore them. This does not rule out certain additions, but I am generally less likely to accept these kinds of requests.
|
||||||
|
|
||||||
Feel free to fork Auxio to add your own features however.
|
Feel free to fork Auxio to add your own features however.
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue