Add contribution templates

Add contribution templates for this project.
This commit is contained in:
OxygenCobalt 2020-12-19 12:23:10 -07:00
parent 953e1291b6
commit f85bd85c92
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
15 changed files with 103 additions and 40 deletions

View file

@ -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
View 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).

View 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
View 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).

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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. */

View file

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

View file

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

View file

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

View file

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

View file

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