├── README.md ├── api ├── pom.xml └── src │ ├── main │ └── java │ │ └── org │ │ └── musicbrainz │ │ └── android │ │ └── api │ │ ├── MusicBrainz.java │ │ ├── SimpleUser.java │ │ ├── User.java │ │ ├── data │ │ ├── Artist.java │ │ ├── ArtistSearchResult.java │ │ ├── Label.java │ │ ├── LabelSearchResult.java │ │ ├── Recording.java │ │ ├── RecordingInfo.java │ │ ├── Release.java │ │ ├── ReleaseArtist.java │ │ ├── ReleaseGroup.java │ │ ├── ReleaseGroupInfo.java │ │ ├── ReleaseInfo.java │ │ ├── Tag.java │ │ ├── Track.java │ │ ├── UserCollection.java │ │ ├── UserCollectionInfo.java │ │ ├── UserData.java │ │ └── WebLink.java │ │ ├── handler │ │ ├── ArtistLookupHandler.java │ │ ├── ArtistSearchHandler.java │ │ ├── BarcodeSearchHandler.java │ │ ├── CollectionHandler.java │ │ ├── CollectionListHandler.java │ │ ├── LabelLookupHandler.java │ │ ├── LabelSearchHandler.java │ │ ├── MBHandler.java │ │ ├── RatingHandler.java │ │ ├── RecordingLookupHandler.java │ │ ├── RecordingSearchHandler.java │ │ ├── ReleaseGroupBrowseHandler.java │ │ ├── ReleaseGroupLookupHandler.java │ │ ├── ReleaseGroupSearchHandler.java │ │ ├── ReleaseInfoHandler.java │ │ ├── ReleaseLookupHandler.java │ │ ├── TagHandler.java │ │ └── UserDataHandler.java │ │ ├── util │ │ ├── StringFormat.java │ │ └── WebServiceUtils.java │ │ └── webservice │ │ ├── BarcodeNotFoundException.java │ │ ├── Entity.java │ │ ├── HttpClient.java │ │ ├── MusicBrainzWebClient.java │ │ ├── QueryBuilder.java │ │ ├── ResponseParser.java │ │ └── XmlBuilder.java │ └── test │ ├── java │ └── org │ │ └── musicbrainz │ │ └── mobile │ │ └── test │ │ ├── TestProjectSetup.java │ │ ├── handler │ │ ├── ArtistLookupTest.java │ │ ├── ArtistSearchTest.java │ │ ├── BarcodeSearchTest.java │ │ ├── BaseXmlParsingTestCase.java │ │ ├── CollectionListLookupTest.java │ │ ├── CollectionLookupTest.java │ │ ├── LabelLookupTest.java │ │ ├── LabelSearchTest.java │ │ ├── RatingLookupTest.java │ │ ├── RecordingLookupTest.java │ │ ├── RecordingSearchTest.java │ │ ├── ReleaseGroupBrowseTest.java │ │ ├── ReleaseGroupLookupTest.java │ │ ├── ReleaseGroupReleaseBrowseTest.java │ │ ├── ReleaseGroupSearchTest.java │ │ ├── ReleaseLookupTest.java │ │ ├── ReleaseSearchTest.java │ │ ├── ReleaseWithRelationshipsTest.java │ │ └── TagLookupTest.java │ │ └── webservice │ │ └── QueryBuilderTest.java │ └── resources │ ├── artistLookup_b10bbbfc-cf9e-42e0-be17-e2c3e1d2600d.xml │ ├── artistSearch_owen.xml │ ├── barcodeSearch_792258106329.xml │ ├── collectionListLookup.xml │ ├── collectionLookup_c6f9fb72-e233-47f4-a2f6-19f16442d93a.xml │ ├── labelLookup_a4f904e0-f048-4c13-88ec-f9f31f3e6109.xml │ ├── labelSearch_count your lucky stars.xml │ ├── ratingLookup_artist_b10bbbfc-cf9e-42e0-be17-e2c3e1d2600d.xml │ ├── ratingLookup_release-group_bc7630eb-521a-3312-a281-adfb8c5aac7d.xml │ ├── recordingLookup_470d06f8-6c0c-443d-b521-4c4eed9f0e7e.xml │ ├── recordingSearch_pleaser.xml │ ├── releaseGroupBrowse_b10bbbfc-cf9e-42e0-be17-e2c3e1d2600d.xml │ ├── releaseGroupLookup_60089b39-412b-326c-afc7-aaa47113d84f.xml │ ├── releaseGroupReleaseBrowse_dca03435-8adb-30a5-ba82-5a162267ff38.xml │ ├── releaseGroupSearch_songs about leaving.xml │ ├── releaseLookup_77c85384-c846-34b1-b576-63bc00644a28.xml │ ├── releaseLookup_ade577f6-6087-4a4f-8e87-38b0f8169814.xml │ ├── releaseSearch_songs about leaving.xml │ ├── tagLookup_artist_b10bbbfc-cf9e-42e0-be17-e2c3e1d2600d.xml │ └── tagLookup_release-group_bc7630eb-521a-3312-a281-adfb8c5aac7d.xml ├── app ├── AndroidManifest.xml ├── assets │ ├── Roboto-Light.ttf │ ├── Roboto-Regular.ttf │ └── about.html ├── lint.xml ├── pom.xml ├── res │ ├── anim │ │ ├── linear_interpolator.xml │ │ └── main_progress.xml │ ├── drawable-hdpi │ │ ├── action_delete.png │ │ ├── action_feedback.png │ │ ├── action_refresh.png │ │ ├── action_search.png │ │ ├── action_settings.png │ │ ├── actionbar.9.png │ │ ├── launcher.png │ │ ├── tab_selected.9.png │ │ ├── tab_selected_focused.9.png │ │ ├── tab_selected_pressed.9.png │ │ ├── tab_unselected.9.png │ │ ├── tab_unselected_focused.9.png │ │ └── tab_unselected_pressed.9.png │ ├── drawable-mdpi │ │ ├── action_delete.png │ │ ├── action_feedback.png │ │ ├── action_refresh.png │ │ ├── action_search.png │ │ ├── action_settings.png │ │ ├── actionbar.9.png │ │ ├── launcher.png │ │ ├── tab_selected.9.png │ │ ├── tab_selected_focused.9.png │ │ ├── tab_selected_pressed.9.png │ │ ├── tab_unselected.9.png │ │ ├── tab_unselected_focused.9.png │ │ ├── tab_unselected_pressed.9.png │ │ └── tag_background.9.png │ ├── drawable-xhdpi │ │ ├── action_add_collection.png │ │ ├── action_delete.png │ │ ├── action_feedback.png │ │ ├── action_refresh.png │ │ ├── action_search.png │ │ ├── action_settings.png │ │ ├── actionbar.9.png │ │ ├── btn_search.png │ │ ├── btn_tag.png │ │ ├── dash_about_default.png │ │ ├── dash_about_pressed.png │ │ ├── dash_collections_default.png │ │ ├── dash_collections_pressed.png │ │ ├── dash_donate_default.png │ │ ├── dash_donate_pressed.png │ │ ├── dash_scan_default.png │ │ ├── dash_scan_pressed.png │ │ ├── launcher.png │ │ ├── link_buy.png │ │ ├── link_community.png │ │ ├── link_discog.png │ │ ├── link_download.png │ │ ├── link_facebook.png │ │ ├── link_film.png │ │ ├── link_generic.png │ │ ├── link_home.png │ │ ├── link_info.png │ │ ├── link_lyrics.png │ │ ├── link_soundcloud.png │ │ ├── link_streaming.png │ │ ├── link_twitter.png │ │ ├── link_vimeo.png │ │ ├── link_youtube.png │ │ ├── logo_lastfm.png │ │ ├── logo_wikipedia.png │ │ ├── tab_selected.9.png │ │ ├── tab_selected_focus.9.png │ │ ├── tab_selected_pressed.9.png │ │ ├── tab_unselected.9.png │ │ ├── tab_unselected_focused.9.png │ │ ├── tab_unselected_pressed.9.png │ │ ├── tile_bg_default.9.png │ │ ├── tile_bg_focused.9.png │ │ └── tile_bg_pressed.9.png │ ├── drawable-xxhdpi │ │ └── actionbar.9.png │ ├── drawable │ │ ├── background.xml │ │ ├── dash_about.xml │ │ ├── dash_collections.xml │ │ ├── dash_donate.xml │ │ ├── dash_grid.xml │ │ ├── dash_scan.xml │ │ ├── link_button.xml │ │ ├── link_button_default.xml │ │ ├── link_button_pressed.xml │ │ ├── link_button_selected.xml │ │ ├── list_divider.xml │ │ ├── progress_spinner.xml │ │ └── tab_indicator.xml │ ├── layout-land │ │ ├── activity_dash.xml │ │ ├── activity_donate.xml │ │ ├── fragment_cover_art.xml │ │ └── fragment_login.xml │ ├── layout-small-port │ │ └── activity_dash.xml │ ├── layout │ │ ├── activity_about.xml │ │ ├── activity_artist.xml │ │ ├── activity_barcode.xml │ │ ├── activity_collection.xml │ │ ├── activity_collections.xml │ │ ├── activity_dash.xml │ │ ├── activity_donate.xml │ │ ├── activity_login.xml │ │ ├── activity_preferences.xml │ │ ├── activity_release.xml │ │ ├── activity_search.xml │ │ ├── activity_search_all.xml │ │ ├── activity_webview.xml │ │ ├── dialog_add_collection.xml │ │ ├── dialog_barcode_submit.xml │ │ ├── dialog_release_group.xml │ │ ├── dropdown_item.xml │ │ ├── fragment_about.xml │ │ ├── fragment_artist_release_groups.xml │ │ ├── fragment_barcode_search.xml │ │ ├── fragment_bio.xml │ │ ├── fragment_collection.xml │ │ ├── fragment_collections.xml │ │ ├── fragment_cover_art.xml │ │ ├── fragment_dash_buttons.xml │ │ ├── fragment_dash_search.xml │ │ ├── fragment_dash_welcome.xml │ │ ├── fragment_donate.xml │ │ ├── fragment_donate_text.xml │ │ ├── fragment_edit.xml │ │ ├── fragment_links.xml │ │ ├── fragment_login.xml │ │ ├── fragment_tracklist.xml │ │ ├── fragment_webview.xml │ │ ├── layout_loading.xml │ │ ├── layout_login.xml │ │ ├── layout_retry.xml │ │ ├── layout_search_artists.xml │ │ ├── layout_search_release_groups.xml │ │ ├── layout_tags_rating.xml │ │ ├── list_collection.xml │ │ ├── list_collection_release.xml │ │ ├── list_link.xml │ │ ├── list_release.xml │ │ ├── list_release_group.xml │ │ ├── list_search_artist.xml │ │ ├── list_search_release_group.xml │ │ ├── list_track.xml │ │ └── view_dash_tile.xml │ ├── menu-v11 │ │ └── fragment_about.xml │ ├── menu │ │ ├── about.xml │ │ ├── artist.xml │ │ ├── context_collection.xml │ │ ├── dash.xml │ │ ├── fragment_about.xml │ │ ├── fragment_collection.xml │ │ ├── fragment_web.xml │ │ ├── release.xml │ │ ├── release_logged_in.xml │ │ └── search.xml │ ├── values-h720dp │ │ └── dimensions.xml │ ├── values-large │ │ └── dimensions.xml │ ├── values │ │ ├── arrays.xml │ │ ├── colours.xml │ │ ├── dimensions.xml │ │ ├── strings.xml │ │ ├── style.xml │ │ ├── style_base.xml │ │ └── theme.xml │ └── xml │ │ ├── preferences.xml │ │ └── searchable.xml └── src │ └── org │ └── musicbrainz │ └── mobile │ ├── App.java │ ├── activity │ ├── AboutActivity.java │ ├── ArtistActivity.java │ ├── BarcodeSearchActivity.java │ ├── CollectionActivity.java │ ├── CollectionListActivity.java │ ├── DashboardActivity.java │ ├── DonateActivity.java │ ├── IncomingActivity.java │ ├── LoginActivity.java │ ├── MusicBrainzActivity.java │ ├── ReleaseActivity.java │ ├── SearchActivity.java │ ├── SettingsActivity.java │ └── WebActivity.java │ ├── adapter │ ├── list │ │ ├── ArtistRGAdapter.java │ │ ├── ArtistSearchAdapter.java │ │ ├── CollectionListAdapter.java │ │ ├── RGSearchAdapter.java │ │ ├── ReleaseInfoAdapter.java │ │ ├── ReleaseTrackAdapter.java │ │ └── WeblinkAdapter.java │ └── pager │ │ ├── ArtistPagerAdapter.java │ │ ├── ReleasePagerAdapter.java │ │ └── SearchPagerAdapter.java │ ├── async │ ├── ArtistLoader.java │ ├── BarcodeReleaseLoader.java │ ├── CollectionEditLoader.java │ ├── CollectionListLoader.java │ ├── CollectionLoader.java │ ├── LoadPayPalTask.java │ ├── LoginLoader.java │ ├── PersistingAsyncTaskLoader.java │ ├── ReleaseGroupReleasesLoader.java │ ├── ReleaseLoader.java │ ├── SearchArtistLoader.java │ ├── SearchLoader.java │ ├── SearchReleaseGroupLoader.java │ ├── SearchReleaseLoader.java │ ├── SubmitBarcodeLoader.java │ ├── SubmitRatingLoader.java │ ├── SubmitTagsLoader.java │ ├── external │ │ ├── ArtistBioLoader.java │ │ ├── LastFmClient.java │ │ ├── SimpleWebClient.java │ │ ├── WikipediaClient.java │ │ └── result │ │ │ ├── ArtistBio.java │ │ │ ├── LastFmArtist.java │ │ │ └── WikipediaBio.java │ └── result │ │ ├── AsyncEntityResult.java │ │ ├── AsyncResult.java │ │ ├── LoaderStatus.java │ │ └── SearchResults.java │ ├── backup │ └── MusicBrainzBackupAgent.java │ ├── config │ ├── Configuration.java │ └── Secrets.java │ ├── dialog │ ├── AuthenticatingDialog.java │ ├── BarcodeNotFoundDialog.java │ ├── CollectionAddDialog.java │ ├── ConfirmBarcodeDialog.java │ └── ReleaseSelectionDialog.java │ ├── fragment │ ├── AboutFragment.java │ ├── ArtistBioFragment.java │ ├── ArtistReleaseGroupsFragment.java │ ├── BarcodeSearchFragment.java │ ├── CollectionFragment.java │ ├── CollectionListFragment.java │ ├── ContextFragment.java │ ├── CoverArtFragment.java │ ├── DashButtonsFragment.java │ ├── DonateFragment.java │ ├── DonateTextFragment.java │ ├── EditFragment.java │ ├── LinksFragment.java │ ├── LoginFragment.java │ ├── SearchFragment.java │ ├── TracksFragment.java │ ├── WebFragment.java │ ├── WelcomeFragment.java │ └── contracts │ │ ├── ContractFragment.java │ │ └── EntityTab.java │ ├── intent │ ├── IntentFactory.java │ └── zxing │ │ ├── IntentIntegrator.java │ │ └── IntentResult.java │ ├── string │ ├── StringFormat.java │ └── StringMapper.java │ ├── suggestion │ ├── SuggestionHelper.java │ └── SuggestionProvider.java │ ├── user │ ├── AppUser.java │ └── UserPreferences.java │ ├── util │ ├── Base64.java │ ├── CoverArt.java │ ├── DonationBuilder.java │ ├── Log.java │ ├── SimpleEncrypt.java │ └── Utils.java │ └── view │ ├── DashTileView.java │ ├── FadeImageView.java │ ├── HeightRelativeLayout.java │ ├── HtmlAssetTextView.java │ ├── RobotoLightTextView.java │ └── WidthRelativeLayout.java ├── clean_code_formatter.xml ├── deployer ├── PayPal_MPL-1.5.6.46.jar └── pom.xml ├── gpl-3.0.txt ├── instrumentation ├── AndroidManifest.xml ├── lint.xml ├── pom.xml └── src │ └── org │ └── musicbrainz │ └── mobile │ └── test │ ├── TestProjectSetup.java │ ├── application │ ├── ApplicationTest.java │ ├── RenamingContext.java │ └── UserDataTest.java │ └── robotium │ ├── Account.java │ ├── login │ └── LoginTest.java │ ├── navigation │ └── DashboardNavigationTest.java │ └── search │ ├── ArtistSearchTest.java │ └── ReleseGroupSearchTest.java └── pom.xml /README.md: -------------------------------------------------------------------------------- 1 | ## MusicBrainz Android 2 | 3 | This is the official [MusicBrainz](http://www.musicbrainz.org) Android app. It was created as a Google Summer of Code project in 2010. Here is the [product page](http://musicbrainz.org/doc/MusicBrainz_for_Android). 4 | 5 | **NOTE:** This project is not actively maintained, so updates are small and infrequent. 6 | 7 | ### Download 8 | 9 | Get the latest release from [Google Play](https://play.google.com/store/apps/details?id=org.musicbrainz.mobile). 10 | 11 | ## Licenses 12 | 13 | Copyright © 2010-2013 Jamie McDonald. Licensed under the GNU General Public License Version 3. 14 | ZXing barcode scanner integration code and miscellaneous helper classes are licensed under the Apache License, Version 2. 15 | 16 | ## Contributing 17 | 18 | Please submit issues and feature requests on GitHub. 19 | 20 | Code contributions are welcomed in the form of [pull requests](https://help.github.com/articles/using-pull-requests). Please use the following code formatting and style guidelines: 21 | 22 | * Tabs are 4 spaces in Java code and 2 spaces in XML 23 | * 120 character line width 24 | * Use descriptive names and comment as a last resort 25 | 26 | A code formatting configuration file is included in the repo. 27 | 28 | ### Building with Maven 29 | 30 | If you have Maven 3, the Android SDK and an ```ANDROID_HOME``` environment variable, you can simply build with: 31 | 32 | $mvn clean install 33 | 34 | This expects an Android device to be attached for running instrumentation tests. Alternatively, use the ```-DskipTests``` option. 35 | 36 | ### IntelliJ project setup 37 | 38 | Import as existing Maven project. Just works. 39 | 40 | ### Can I skip all this Maven stuff? 41 | 42 | Yes. However, you'll need to look at the dependencies in the POMs and go hunting for the dependencies yourself. 43 | -------------------------------------------------------------------------------- /api/pom.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 4.0.0 7 | 8 | 9 | org.musicbrainz.mobile 10 | aggregator 11 | 1.0-SNAPSHOT 12 | 13 | 14 | api 15 | api 16 | jar 17 | 18 | 19 | 20 | junit 21 | junit 22 | 4.11 23 | test 24 | 25 | 26 | org.apache.httpcomponents 27 | httpclient 28 | 4.0.3 29 | provided 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /api/src/main/java/org/musicbrainz/android/api/SimpleUser.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.android.api; 2 | 3 | public class SimpleUser implements User { 4 | 5 | private String username; 6 | private String password; 7 | 8 | public SimpleUser(String username, String password) { 9 | this.username = username; 10 | this.password = password; 11 | } 12 | 13 | @Override 14 | public String getUsername() { 15 | return username; 16 | } 17 | 18 | @Override 19 | public String getPassword() { 20 | return password; 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /api/src/main/java/org/musicbrainz/android/api/User.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.android.api; 2 | 3 | public interface User { 4 | 5 | String getUsername(); 6 | 7 | String getPassword(); 8 | 9 | } 10 | -------------------------------------------------------------------------------- /api/src/main/java/org/musicbrainz/android/api/data/ArtistSearchResult.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.android.api.data; 2 | 3 | /** 4 | * Partial artist data to select between similar artists in a list of search 5 | * results. 6 | */ 7 | public class ArtistSearchResult { 8 | 9 | private String mbid; 10 | private String name; 11 | private String disambiguation; 12 | 13 | public String getMbid() { 14 | return mbid; 15 | } 16 | 17 | public void setMbid(String mbid) { 18 | this.mbid = mbid; 19 | } 20 | 21 | public String getName() { 22 | return name; 23 | } 24 | 25 | public void setName(String name) { 26 | this.name = name; 27 | } 28 | 29 | public String getDisambiguation() { 30 | return disambiguation; 31 | } 32 | 33 | public void setDisambiguation(String disambiguation) { 34 | this.disambiguation = disambiguation; 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /api/src/main/java/org/musicbrainz/android/api/data/LabelSearchResult.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.android.api.data; 2 | 3 | /** 4 | * Record label info for search results. 5 | */ 6 | public class LabelSearchResult { 7 | 8 | private String mbid; 9 | private String name; 10 | private String country; 11 | 12 | public String getMbid() { 13 | return mbid; 14 | } 15 | 16 | public void setMbid(String mbid) { 17 | this.mbid = mbid; 18 | } 19 | 20 | public String getName() { 21 | return name; 22 | } 23 | 24 | public void setName(String name) { 25 | this.name = name; 26 | } 27 | 28 | public String getCountry() { 29 | return country; 30 | } 31 | 32 | public void setCountry(String country) { 33 | this.country = country; 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /api/src/main/java/org/musicbrainz/android/api/data/RecordingInfo.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.android.api.data; 2 | 3 | public class RecordingInfo { 4 | 5 | private String mbid; 6 | private String title; 7 | private ReleaseArtist artist; 8 | private int length; 9 | 10 | public String getMbid() { 11 | return mbid; 12 | } 13 | 14 | public void setMbid(String mbid) { 15 | this.mbid = mbid; 16 | } 17 | 18 | public String getTitle() { 19 | return title; 20 | } 21 | 22 | public void setTitle(String title) { 23 | this.title = title; 24 | } 25 | 26 | public ReleaseArtist getArtist() { 27 | return artist; 28 | } 29 | 30 | public void setArtist(ReleaseArtist artist) { 31 | this.artist = artist; 32 | } 33 | 34 | public int getLength() { 35 | return length; 36 | } 37 | 38 | public void setLength(int length) { 39 | this.length = length; 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /api/src/main/java/org/musicbrainz/android/api/data/ReleaseArtist.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.android.api.data; 2 | 3 | /** 4 | * Artist name and MBID pair for release. 5 | */ 6 | public class ReleaseArtist implements Comparable { 7 | 8 | private String mbid; 9 | private String name; 10 | private String sortName; 11 | 12 | public String getMbid() { 13 | return mbid; 14 | } 15 | 16 | public void setMbid(String mbid) { 17 | this.mbid = mbid; 18 | } 19 | 20 | public String getName() { 21 | return name; 22 | } 23 | 24 | public void setName(String name) { 25 | this.name = name; 26 | } 27 | 28 | public String getSortName() { 29 | return sortName; 30 | } 31 | 32 | public void setSortName(String sortName) { 33 | this.sortName = sortName; 34 | } 35 | 36 | @Override 37 | public int compareTo(ReleaseArtist another) { 38 | return getSortName().compareTo(another.getSortName()); 39 | } 40 | 41 | } -------------------------------------------------------------------------------- /api/src/main/java/org/musicbrainz/android/api/data/Tag.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.android.api.data; 2 | 3 | /** 4 | * Tag name and count pair. Count can be used for weighting. 5 | */ 6 | public class Tag implements Comparable { 7 | 8 | private String text; 9 | private int count; 10 | 11 | public String getText() { 12 | return text; 13 | } 14 | 15 | public void setText(String name) { 16 | this.text = name; 17 | } 18 | 19 | public int getCount() { 20 | return count; 21 | } 22 | 23 | public void setCount(int count) { 24 | this.count = count; 25 | } 26 | 27 | public int compareTo(Tag another) { 28 | Integer a = (Integer) getCount(); 29 | Integer b = (Integer) another.getCount(); 30 | return a.compareTo(b) * -1; 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /api/src/main/java/org/musicbrainz/android/api/data/Track.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.android.api.data; 2 | 3 | import org.musicbrainz.android.api.util.StringFormat; 4 | 5 | public class Track { 6 | 7 | private String title; 8 | private String recordingMbid; 9 | private int position; 10 | private int duration; 11 | 12 | public String getTitle() { 13 | return title; 14 | } 15 | 16 | public void setTitle(String title) { 17 | this.title = title; 18 | } 19 | 20 | public String getRecordingMbid() { 21 | return recordingMbid; 22 | } 23 | 24 | public void setRecordingMbid(String recordingMbid) { 25 | this.recordingMbid = recordingMbid; 26 | } 27 | 28 | public int getPosition() { 29 | return position; 30 | } 31 | 32 | public void setPosition(int position) { 33 | this.position = position; 34 | } 35 | 36 | public int getDuration() { 37 | return duration; 38 | } 39 | 40 | public String getFormattedDuration() { 41 | return StringFormat.formatDuration(duration); 42 | } 43 | 44 | public void setDuration(int duration) { 45 | this.duration = duration; 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /api/src/main/java/org/musicbrainz/android/api/data/UserCollection.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.android.api.data; 2 | 3 | import java.util.Collections; 4 | import java.util.LinkedList; 5 | 6 | public class UserCollection extends UserCollectionInfo { 7 | 8 | private LinkedList releases = new LinkedList(); 9 | 10 | public LinkedList getReleases() { 11 | Collections.sort(releases); 12 | return releases; 13 | } 14 | 15 | public void setReleases(LinkedList releases) { 16 | this.releases = releases; 17 | } 18 | 19 | public void addRelease(ReleaseInfo release) { 20 | releases.add(release); 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /api/src/main/java/org/musicbrainz/android/api/data/UserCollectionInfo.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.android.api.data; 2 | 3 | public class UserCollectionInfo implements Comparable{ 4 | 5 | private String mbid; 6 | private String name; 7 | private String editor; 8 | private int count; 9 | 10 | public String getMbid() { 11 | return mbid; 12 | } 13 | 14 | public void setMbid(String mbid) { 15 | this.mbid = mbid; 16 | } 17 | 18 | public String getName() { 19 | return name; 20 | } 21 | 22 | public void setName(String name) { 23 | this.name = name; 24 | } 25 | 26 | public String getEditor() { 27 | return editor; 28 | } 29 | 30 | public void setEditor(String editor) { 31 | this.editor = editor; 32 | } 33 | 34 | public int getCount() { 35 | return count; 36 | } 37 | 38 | public void setCount(int count) { 39 | this.count = count; 40 | } 41 | 42 | @Override 43 | public int compareTo(UserCollectionInfo another) { 44 | return getName().compareTo(another.getName()); 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /api/src/main/java/org/musicbrainz/android/api/data/UserData.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.android.api.data; 2 | 3 | import java.util.LinkedList; 4 | 5 | /** 6 | * User tags and rating data for a MusicBrainz entity. 7 | */ 8 | public class UserData { 9 | 10 | private LinkedList tags = new LinkedList(); 11 | private float rating; 12 | 13 | public LinkedList getTags() { 14 | return tags; 15 | } 16 | 17 | public void addTag(String tag) { 18 | tags.add(tag); 19 | } 20 | 21 | public float getRating() { 22 | return rating; 23 | } 24 | 25 | public void setRating(float rating) { 26 | this.rating = rating; 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /api/src/main/java/org/musicbrainz/android/api/data/WebLink.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.android.api.data; 2 | 3 | import org.musicbrainz.android.api.util.StringFormat; 4 | 5 | /** 6 | * Link URL and type description pair. 7 | */ 8 | public class WebLink implements Comparable { 9 | 10 | private String target; 11 | private String type; 12 | 13 | public String getUrl() { 14 | return target; 15 | } 16 | 17 | public String getPrettyUrl() { 18 | // Remove http:// and trailing / 19 | String url = target.replace("http://", ""); 20 | url = url.replace("https://", ""); 21 | if (url.endsWith("/")) { 22 | url = url.substring(0, url.length() - 1); 23 | } 24 | return url; 25 | } 26 | 27 | public void setUrl(String url) { 28 | this.target = url; 29 | } 30 | 31 | public String getType() { 32 | return type; 33 | } 34 | 35 | public String getPrettyType() { 36 | type = type.replace('_', ' '); 37 | return StringFormat.initialCaps(type); 38 | } 39 | 40 | public void setType(String type) { 41 | this.type = type; 42 | } 43 | 44 | public int compareTo(WebLink another) { 45 | return getPrettyType().compareTo(another.getPrettyType()); 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /api/src/main/java/org/musicbrainz/android/api/handler/BarcodeSearchHandler.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.android.api.handler; 2 | 3 | import org.xml.sax.Attributes; 4 | import org.xml.sax.SAXException; 5 | 6 | public class BarcodeSearchHandler extends MBHandler { 7 | 8 | private String mbid; 9 | 10 | public String getMbid() { 11 | return mbid; 12 | } 13 | 14 | public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { 15 | 16 | if (localName.equals("release")) { 17 | mbid = atts.getValue("id"); 18 | } 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /api/src/main/java/org/musicbrainz/android/api/handler/CollectionListHandler.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.android.api.handler; 2 | 3 | import java.util.LinkedList; 4 | 5 | import org.musicbrainz.android.api.data.UserCollectionInfo; 6 | import org.xml.sax.Attributes; 7 | import org.xml.sax.SAXException; 8 | 9 | public class CollectionListHandler extends MBHandler { 10 | 11 | private LinkedList collections = new LinkedList(); 12 | private UserCollectionInfo editorCollection; 13 | 14 | public LinkedList getResults() { 15 | return collections; 16 | } 17 | 18 | public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { 19 | 20 | if (localName.equals("collection")) { 21 | editorCollection = new UserCollectionInfo(); 22 | editorCollection.setMbid(atts.getValue("id")); 23 | } else if (localName.equals("name")) { 24 | buildString(); 25 | } else if (localName.equals("editor")) { 26 | buildString(); 27 | } else if (localName.equals("release-list")) { 28 | editorCollection.setCount(Integer.parseInt(atts.getValue("count"))); 29 | } 30 | } 31 | 32 | public void endElement(String namespaceURI, String localName, String qName) throws SAXException { 33 | 34 | if (localName.equals("name")) { 35 | editorCollection.setName(getString()); 36 | } else if (localName.equals("editor")) { 37 | editorCollection.setEditor(getString()); 38 | } else if (localName.equals("collection")) { 39 | collections.add(editorCollection); 40 | } 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /api/src/main/java/org/musicbrainz/android/api/handler/LabelSearchHandler.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.android.api.handler; 2 | 3 | import java.util.LinkedList; 4 | 5 | import org.musicbrainz.android.api.data.LabelSearchResult; 6 | import org.xml.sax.Attributes; 7 | import org.xml.sax.SAXException; 8 | 9 | public class LabelSearchHandler extends MBHandler { 10 | 11 | private LinkedList results = new LinkedList(); 12 | private LabelSearchResult result; 13 | 14 | private boolean inTag; 15 | 16 | public LinkedList getResults() { 17 | return results; 18 | } 19 | 20 | public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { 21 | 22 | if (localName.equals("label")) { 23 | result = new LabelSearchResult(); 24 | result.setMbid(atts.getValue("id")); 25 | } else if (localName.equals("name") && !inTag) { 26 | buildString(); 27 | } else if (localName.equals("country")) { 28 | buildString(); 29 | } else if (localName.equals("tag")) { 30 | inTag = true; 31 | } 32 | } 33 | 34 | public void endElement(String namespaceURI, String localName, String qName) throws SAXException { 35 | 36 | if (localName.equals("label")) { 37 | results.add(result); 38 | } else if (localName.equals("name") && !inTag) { 39 | result.setName(getString()); 40 | } else if (localName.equals("country")) { 41 | result.setCountry(getString()); 42 | } else if (localName.equals("tag")) { 43 | inTag = true; 44 | } 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /api/src/main/java/org/musicbrainz/android/api/handler/MBHandler.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.android.api.handler; 2 | 3 | import org.xml.sax.helpers.DefaultHandler; 4 | 5 | public class MBHandler extends DefaultHandler { 6 | 7 | private StringBuilder sb; 8 | 9 | public void characters(char ch[], int start, int length) { 10 | 11 | if (sb != null) { 12 | for (int i = start; i < start + length; i++) { 13 | sb.append(ch[i]); 14 | } 15 | } 16 | } 17 | 18 | protected void buildString() { 19 | sb = new StringBuilder(); 20 | } 21 | 22 | protected String getString() { 23 | return sb.toString(); 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /api/src/main/java/org/musicbrainz/android/api/handler/RatingHandler.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.android.api.handler; 2 | 3 | import org.xml.sax.Attributes; 4 | import org.xml.sax.SAXException; 5 | 6 | public class RatingHandler extends MBHandler { 7 | 8 | private float rating = 0; 9 | 10 | public float getRating() { 11 | return rating; 12 | } 13 | 14 | public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { 15 | 16 | if (localName.equals("rating")) { 17 | buildString(); 18 | } 19 | } 20 | 21 | public void endElement(String namespaceURI, String localName, String qName) throws SAXException { 22 | 23 | if (localName.equals("rating")) { 24 | float value = Float.parseFloat(getString()); 25 | rating = value; 26 | } 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /api/src/main/java/org/musicbrainz/android/api/handler/TagHandler.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.android.api.handler; 2 | 3 | import java.util.LinkedList; 4 | 5 | import org.musicbrainz.android.api.data.Tag; 6 | import org.xml.sax.Attributes; 7 | import org.xml.sax.SAXException; 8 | 9 | public class TagHandler extends MBHandler { 10 | 11 | private LinkedList tags = new LinkedList(); 12 | private Tag tag; 13 | 14 | public LinkedList getTags() { 15 | return tags; 16 | } 17 | 18 | public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { 19 | if (localName.equals("tag")) { 20 | buildString(); 21 | tag = new Tag(); 22 | tag.setCount(Integer.parseInt(atts.getValue("count"))); 23 | } 24 | } 25 | 26 | public void endElement(String namespaceURI, String localName, String qName) throws SAXException { 27 | 28 | if (localName.equals("tag")) { 29 | tag.setText(getString()); 30 | tags.add(tag); 31 | } 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /api/src/main/java/org/musicbrainz/android/api/handler/UserDataHandler.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.android.api.handler; 2 | 3 | import org.musicbrainz.android.api.data.UserData; 4 | import org.xml.sax.Attributes; 5 | import org.xml.sax.SAXException; 6 | 7 | public class UserDataHandler extends MBHandler { 8 | 9 | private UserData data = new UserData(); 10 | 11 | public UserData getResult() { 12 | return data; 13 | } 14 | 15 | public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { 16 | 17 | if (localName.equals("user-tag")) { 18 | buildString(); 19 | } else if (localName.equals("user-rating")) { 20 | buildString(); 21 | } 22 | } 23 | 24 | public void endElement(String namespaceURI, String localName, String qName) throws SAXException { 25 | 26 | if (localName.equals("user-tag")) { 27 | data.addTag(getString()); 28 | } else if (localName.equals("user-rating")) { 29 | float rating = Float.parseFloat(getString()); 30 | data.setRating(rating); 31 | } 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /api/src/main/java/org/musicbrainz/android/api/util/StringFormat.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.android.api.util; 2 | 3 | import java.util.StringTokenizer; 4 | 5 | public class StringFormat { 6 | 7 | public static String initialCaps(String text) { 8 | StringTokenizer tokenizer = new StringTokenizer(text, " ", true); 9 | StringBuilder sb = new StringBuilder(); 10 | while (tokenizer.hasMoreTokens()) { 11 | String token = tokenizer.nextToken(); 12 | token = String.format("%s%s", Character.toUpperCase(token.charAt(0)), token.substring(1)); 13 | sb.append(token); 14 | } 15 | return sb.toString(); 16 | } 17 | 18 | public static String formatDuration(int durationSeconds) { 19 | 20 | // TODO: Would be much cleaner using String.format(). 21 | if (durationSeconds == 0) { 22 | return ""; 23 | } 24 | 25 | int s = durationSeconds / 1000; 26 | int secs = s % 60; 27 | int mins = (s % 3600) / 60; 28 | int hrs = s / 3600; 29 | 30 | String mS = "" + mins; 31 | String sS = "" + secs; 32 | if (secs < 10) 33 | sS = "0" + secs; 34 | 35 | if (hrs == 0) { 36 | return mS + ':' + sS; 37 | } else { 38 | if (mins < 10) 39 | mS = "0" + mins; 40 | return hrs + ":" + mS + ":" + sS; 41 | } 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /api/src/main/java/org/musicbrainz/android/api/util/WebServiceUtils.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.android.api.util; 2 | 3 | import java.io.UnsupportedEncodingException; 4 | import java.net.URLEncoder; 5 | import java.util.LinkedList; 6 | 7 | import org.musicbrainz.android.api.webservice.Entity; 8 | 9 | public class WebServiceUtils { 10 | 11 | public static String sanitise(String input) { 12 | try { 13 | return URLEncoder.encode(input, "UTF-8"); 14 | } catch (UnsupportedEncodingException e) { 15 | return input; 16 | } 17 | } 18 | 19 | public static String entityString(Entity entity) { 20 | switch (entity) { 21 | case ARTIST: 22 | return "artist"; 23 | case RELEASE_GROUP: 24 | return "release-group"; 25 | case LABEL: 26 | return "label"; 27 | case RECORDING: 28 | return "recording"; 29 | default: 30 | return "artist"; 31 | } 32 | } 33 | 34 | public static LinkedList sanitiseCommaSeparatedTags(String tags) { 35 | 36 | LinkedList tagList = new LinkedList(); 37 | String[] split = tags.split(","); 38 | 39 | for (String tag : split) { 40 | tag = tag.toLowerCase(); 41 | tag = tag.trim(); 42 | tagList.add(tag); 43 | } 44 | return tagList; 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /api/src/main/java/org/musicbrainz/android/api/webservice/BarcodeNotFoundException.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.android.api.webservice; 2 | 3 | public class BarcodeNotFoundException extends RuntimeException { 4 | 5 | private static final long serialVersionUID = 118690723271061260L; 6 | private static final String MESSAGE = "Barcode not found in the MusicBrainz database: "; 7 | 8 | private String barcode; 9 | 10 | public BarcodeNotFoundException() { 11 | barcode = "unknown"; 12 | } 13 | 14 | public BarcodeNotFoundException(String barcode) { 15 | this.barcode = barcode; 16 | } 17 | 18 | public String getBarcode() { 19 | return barcode; 20 | } 21 | 22 | @Override 23 | public String getMessage() { 24 | return MESSAGE + barcode; 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /api/src/main/java/org/musicbrainz/android/api/webservice/Entity.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.android.api.webservice; 2 | 3 | public enum Entity { 4 | ARTIST, RELEASE_GROUP, LABEL, RECORDING; 5 | } 6 | -------------------------------------------------------------------------------- /api/src/test/java/org/musicbrainz/mobile/test/TestProjectSetup.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.mobile.test; 2 | 3 | import static org.junit.Assert.assertTrue; 4 | 5 | import org.junit.Test; 6 | 7 | public class TestProjectSetup { 8 | 9 | @Test 10 | public void testTheTruth() { 11 | assertTrue(true); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /api/src/test/java/org/musicbrainz/mobile/test/handler/ArtistLookupTest.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.mobile.test.handler; 2 | 3 | import static org.junit.Assert.assertEquals; 4 | import static org.junit.Assert.assertNotNull; 5 | 6 | import java.io.IOException; 7 | import java.io.InputStream; 8 | 9 | import org.junit.Before; 10 | import org.junit.Test; 11 | import org.musicbrainz.android.api.data.Artist; 12 | import org.musicbrainz.android.api.webservice.ResponseParser; 13 | 14 | public class ArtistLookupTest extends BaseXmlParsingTestCase { 15 | 16 | private static final String ARTIST_LOOKUP_FIXTURE = "artistLookup_b10bbbfc-cf9e-42e0-be17-e2c3e1d2600d.xml"; 17 | private Artist artist; 18 | 19 | @Before 20 | public void doParsing() throws IOException { 21 | InputStream stream = getFileStream(ARTIST_LOOKUP_FIXTURE); 22 | assertNotNull(stream); 23 | artist = new ResponseParser().parseArtist(stream); 24 | stream.close(); 25 | } 26 | 27 | @Test 28 | public void testArtistData() { 29 | assertEquals("b10bbbfc-cf9e-42e0-be17-e2c3e1d2600d", artist.getMbid()); 30 | assertEquals("The Beatles", artist.getName()); 31 | assertEquals("Group", artist.getType()); 32 | assertEquals("GB", artist.getCountry()); 33 | assertEquals("1957", artist.getStart()); 34 | assertEquals("1970-04-10", artist.getEnd()); 35 | } 36 | 37 | @Test 38 | public void testArtistTags() { 39 | assertEquals(40, artist.getTags().size()); 40 | } 41 | 42 | @Test 43 | public void testArtistRatings() { 44 | assertEquals(4.8f, artist.getRating(), 0.01); 45 | assertEquals(59, artist.getRatingCount()); 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /api/src/test/java/org/musicbrainz/mobile/test/handler/ArtistSearchTest.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.mobile.test.handler; 2 | 3 | import static org.junit.Assert.*; 4 | 5 | import java.io.IOException; 6 | import java.io.InputStream; 7 | import java.util.LinkedList; 8 | 9 | import org.junit.Before; 10 | import org.junit.Test; 11 | import org.musicbrainz.android.api.data.ArtistSearchResult; 12 | import org.musicbrainz.android.api.webservice.ResponseParser; 13 | 14 | public class ArtistSearchTest extends BaseXmlParsingTestCase { 15 | 16 | private static final String ARTIST_SEARCH_FIXTURE = "artistSearch_owen.xml"; 17 | private LinkedList artists; 18 | 19 | @Before 20 | public void doParsing() throws IOException { 21 | InputStream stream = getFileStream(ARTIST_SEARCH_FIXTURE); 22 | assertNotNull(stream); 23 | artists = new ResponseParser().parseArtistSearch(stream); 24 | stream.close(); 25 | } 26 | 27 | @Test 28 | public void testArtistSearchSize() { 29 | assertEquals(25, artists.size()); 30 | } 31 | 32 | @Test 33 | public void testArtistSearchName() { 34 | assertEquals("Owen", artists.getFirst().getName()); 35 | } 36 | 37 | @Test 38 | public void testArtistSearchDisambiguation() { 39 | assertEquals("Mike Kinsella solo project", artists.getFirst().getDisambiguation()); 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /api/src/test/java/org/musicbrainz/mobile/test/handler/BarcodeSearchTest.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.mobile.test.handler; 2 | 3 | import static org.junit.Assert.*; 4 | 5 | import java.io.IOException; 6 | import java.io.InputStream; 7 | 8 | import org.junit.Before; 9 | import org.junit.Test; 10 | import org.musicbrainz.android.api.webservice.ResponseParser; 11 | 12 | public class BarcodeSearchTest extends BaseXmlParsingTestCase { 13 | 14 | private static final String BARCODE_SEARCH_FIXTURE = "barcodeSearch_792258106329.xml"; 15 | private String mbid; 16 | 17 | @Before 18 | public void doParsing() throws IOException { 19 | InputStream stream = getFileStream(BARCODE_SEARCH_FIXTURE); 20 | assertNotNull(stream); 21 | mbid = new ResponseParser().parseMbidFromBarcode(stream); 22 | stream.close(); 23 | } 24 | 25 | @Test 26 | public void testBarcodeSearch() { 27 | assertEquals("7fe8ee44-68bb-31da-befc-bda6da88c379", mbid); 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /api/src/test/java/org/musicbrainz/mobile/test/handler/BaseXmlParsingTestCase.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.mobile.test.handler; 2 | 3 | import java.io.InputStream; 4 | 5 | import junit.framework.Assert; 6 | 7 | public abstract class BaseXmlParsingTestCase { 8 | 9 | protected InputStream getFileStream(String fileName) { 10 | try { 11 | return getClass().getResourceAsStream("/" + fileName); 12 | } catch (Exception e) { 13 | Assert.fail("Problem loading file : " + fileName + " " + e.getMessage()); 14 | throw new RuntimeException(); 15 | } 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /api/src/test/java/org/musicbrainz/mobile/test/handler/LabelLookupTest.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.mobile.test.handler; 2 | 3 | import static org.junit.Assert.assertEquals; 4 | import static org.junit.Assert.assertNotNull; 5 | import static org.junit.Assert.assertNull; 6 | 7 | import java.io.IOException; 8 | import java.io.InputStream; 9 | 10 | import org.junit.Before; 11 | import org.junit.Test; 12 | import org.musicbrainz.android.api.data.Label; 13 | import org.musicbrainz.android.api.webservice.ResponseParser; 14 | 15 | public class LabelLookupTest extends BaseXmlParsingTestCase { 16 | 17 | private static final String LABEL_LOOKUP_FIXTURE = "labelLookup_a4f904e0-f048-4c13-88ec-f9f31f3e6109.xml"; 18 | private Label label; 19 | 20 | @Before 21 | public void doParsing() throws IOException { 22 | InputStream stream = getFileStream(LABEL_LOOKUP_FIXTURE); 23 | assertNotNull(stream); 24 | label = new ResponseParser().parseLabel(stream); 25 | stream.close(); 26 | } 27 | 28 | @Test 29 | public void testLabelData() { 30 | assertEquals("a4f904e0-f048-4c13-88ec-f9f31f3e6109", label.getMbid()); 31 | assertEquals("Barsuk Records", label.getName()); 32 | assertEquals("US", label.getCountry()); 33 | assertEquals("1994", label.getStart()); 34 | assertNull(label.getEnd()); 35 | } 36 | 37 | @Test 38 | public void testTags() { 39 | assertEquals(4, label.getTags().size()); 40 | } 41 | 42 | @Test 43 | public void testRatings() { 44 | assertEquals(1, label.getRatingCount()); 45 | assertEquals(5f, label.getRating(), 0.01); 46 | } 47 | 48 | @Test 49 | public void testLinks() { 50 | assertEquals(4, label.getLinks().size()); 51 | } 52 | 53 | } 54 | -------------------------------------------------------------------------------- /api/src/test/java/org/musicbrainz/mobile/test/handler/LabelSearchTest.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.mobile.test.handler; 2 | 3 | import static org.junit.Assert.assertEquals; 4 | import static org.junit.Assert.assertNotNull; 5 | 6 | import java.io.IOException; 7 | import java.io.InputStream; 8 | import java.util.LinkedList; 9 | 10 | import org.junit.Before; 11 | import org.junit.Test; 12 | import org.musicbrainz.android.api.data.LabelSearchResult; 13 | import org.musicbrainz.android.api.webservice.ResponseParser; 14 | 15 | public class LabelSearchTest extends BaseXmlParsingTestCase { 16 | 17 | private static final String LABEL_SEARCH_FIXTURE = "labelSearch_count your lucky stars.xml"; 18 | private LinkedList labels; 19 | 20 | @Before 21 | public void doParsing() throws IOException { 22 | InputStream stream = getFileStream(LABEL_SEARCH_FIXTURE); 23 | assertNotNull(stream); 24 | labels = new ResponseParser().parseLabelSearch(stream); 25 | stream.close(); 26 | } 27 | 28 | @Test 29 | public void testLabelSearch() { 30 | assertEquals(25, labels.size()); 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /api/src/test/java/org/musicbrainz/mobile/test/handler/RatingLookupTest.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.mobile.test.handler; 2 | 3 | import static org.junit.Assert.assertEquals; 4 | import static org.junit.Assert.assertNotNull; 5 | 6 | import java.io.IOException; 7 | import java.io.InputStream; 8 | 9 | import org.junit.Before; 10 | import org.junit.Test; 11 | import org.musicbrainz.android.api.webservice.ResponseParser; 12 | 13 | public class RatingLookupTest extends BaseXmlParsingTestCase { 14 | 15 | private static final String RG_RATING_FIXTURE = "ratingLookup_release-group_bc7630eb-521a-3312-a281-adfb8c5aac7d.xml"; 16 | private static final String ARTIST_RATING_FIXTURE = "ratingLookup_artist_b10bbbfc-cf9e-42e0-be17-e2c3e1d2600d.xml"; 17 | private float releaseGroupRating; 18 | private float artistRating; 19 | 20 | @Before 21 | public void doParsing() throws IOException { 22 | artistRating = parseRating(ARTIST_RATING_FIXTURE); 23 | releaseGroupRating = parseRating(RG_RATING_FIXTURE); 24 | } 25 | 26 | private float parseRating(String xmlFile) throws IOException { 27 | InputStream stream = getFileStream(xmlFile); 28 | assertNotNull(stream); 29 | ResponseParser responseParser = new ResponseParser(); 30 | float rating = responseParser.parseRatingLookup(stream); 31 | stream.close(); 32 | return rating; 33 | } 34 | 35 | @Test 36 | public void testArtistRatings() { 37 | assertEquals(artistRating, 4.7f, 0.01); 38 | } 39 | 40 | @Test 41 | public void testReleaseGroupRatings() { 42 | assertEquals(releaseGroupRating, 4f, 0.01); 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /api/src/test/java/org/musicbrainz/mobile/test/handler/RecordingSearchTest.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.mobile.test.handler; 2 | 3 | import static org.junit.Assert.assertEquals; 4 | import static org.junit.Assert.assertNotNull; 5 | 6 | import java.io.IOException; 7 | import java.io.InputStream; 8 | import java.util.LinkedList; 9 | 10 | import org.junit.Before; 11 | import org.junit.Test; 12 | import org.musicbrainz.android.api.data.ReleaseArtist; 13 | import org.musicbrainz.android.api.data.RecordingInfo; 14 | import org.musicbrainz.android.api.webservice.ResponseParser; 15 | 16 | public class RecordingSearchTest extends BaseXmlParsingTestCase { 17 | 18 | private static final String RECORDING_SEARCH_FIXTURE = "recordingSearch_pleaser.xml"; 19 | private LinkedList recordings; 20 | 21 | @Before 22 | public void doParsing() throws IOException { 23 | InputStream stream = getFileStream(RECORDING_SEARCH_FIXTURE); 24 | assertNotNull(stream); 25 | recordings = new ResponseParser().parseRecordingSearch(stream); 26 | stream.close(); 27 | } 28 | 29 | @Test 30 | public void testRecordingSearch() { 31 | assertEquals(25, recordings.size()); 32 | } 33 | 34 | @Test 35 | public void testSearchResult() { 36 | RecordingInfo searchResult = recordings.get(2); 37 | assertEquals("1003744a-48eb-4839-bac6-a43a2b09d09b", searchResult.getMbid()); 38 | assertEquals("Pleaser", searchResult.getTitle()); 39 | ReleaseArtist artist = searchResult.getArtist(); 40 | assertEquals("a459df95-6a50-4b22-8df8-076642ce62a7", artist.getMbid()); 41 | assertEquals("Lemuria", artist.getName()); 42 | assertEquals(236000, searchResult.getLength()); 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /api/src/test/java/org/musicbrainz/mobile/test/handler/ReleaseGroupBrowseTest.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.mobile.test.handler; 2 | 3 | import static org.junit.Assert.*; 4 | 5 | import java.io.IOException; 6 | import java.io.InputStream; 7 | import java.util.ArrayList; 8 | 9 | import org.junit.Before; 10 | import org.junit.Test; 11 | import org.musicbrainz.android.api.data.ReleaseGroupInfo; 12 | import org.musicbrainz.android.api.webservice.ResponseParser; 13 | 14 | public class ReleaseGroupBrowseTest extends BaseXmlParsingTestCase { 15 | 16 | private static final String RG_BROWSE_FIXTURE = "releaseGroupBrowse_b10bbbfc-cf9e-42e0-be17-e2c3e1d2600d.xml"; 17 | private ArrayList releaseGroups; 18 | 19 | @Before 20 | public void doParsing() throws IOException { 21 | InputStream stream = getFileStream(RG_BROWSE_FIXTURE); 22 | assertNotNull(stream); 23 | releaseGroups = new ResponseParser().parseReleaseGroupBrowse(stream); 24 | stream.close(); 25 | } 26 | 27 | @Test 28 | public void testReleaseGroupBrowse() { 29 | assertEquals(100, releaseGroups.size()); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /api/src/test/java/org/musicbrainz/mobile/test/handler/ReleaseGroupSearchTest.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.mobile.test.handler; 2 | 3 | import static org.junit.Assert.*; 4 | 5 | import java.io.IOException; 6 | import java.io.InputStream; 7 | import java.util.LinkedList; 8 | 9 | import org.junit.Before; 10 | import org.junit.Test; 11 | import org.musicbrainz.android.api.data.ReleaseGroupInfo; 12 | import org.musicbrainz.android.api.webservice.ResponseParser; 13 | 14 | public class ReleaseGroupSearchTest extends BaseXmlParsingTestCase { 15 | 16 | private static final String RG_SEARCH_FIXTURE = "releaseGroupSearch_songs about leaving.xml"; 17 | private LinkedList releaseGroups; 18 | 19 | @Before 20 | public void doParsing() throws IOException { 21 | InputStream stream = getFileStream(RG_SEARCH_FIXTURE); 22 | assertNotNull(stream); 23 | releaseGroups = new ResponseParser().parseReleaseGroupSearch(stream); 24 | stream.close(); 25 | } 26 | 27 | @Test 28 | public void testReleaseGroupSearch() { 29 | assertEquals(25, releaseGroups.size()); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /api/src/test/java/org/musicbrainz/mobile/test/handler/ReleaseSearchTest.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.mobile.test.handler; 2 | 3 | import static org.junit.Assert.*; 4 | 5 | import java.io.IOException; 6 | import java.io.InputStream; 7 | import java.util.LinkedList; 8 | 9 | import org.junit.Before; 10 | import org.junit.Test; 11 | import org.musicbrainz.android.api.data.ReleaseInfo; 12 | import org.musicbrainz.android.api.webservice.ResponseParser; 13 | 14 | public class ReleaseSearchTest extends BaseXmlParsingTestCase { 15 | 16 | private static final String RELEASE_SEARCH_FIXTURE = "releaseSearch_songs about leaving.xml"; 17 | private LinkedList releases; 18 | 19 | @Before 20 | public void doParsing() throws IOException { 21 | InputStream stream = getFileStream(RELEASE_SEARCH_FIXTURE); 22 | assertNotNull(stream); 23 | releases = new ResponseParser().parseReleaseSearch(stream); 24 | stream.close(); 25 | } 26 | 27 | @Test 28 | public void testReleaseSearch() { 29 | assertEquals(25, releases.size()); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /api/src/test/java/org/musicbrainz/mobile/test/handler/ReleaseWithRelationshipsTest.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.mobile.test.handler; 2 | 3 | import static org.junit.Assert.assertEquals; 4 | import static org.junit.Assert.assertNotNull; 5 | 6 | import java.io.IOException; 7 | import java.io.InputStream; 8 | 9 | import org.junit.Before; 10 | import org.junit.Test; 11 | import org.musicbrainz.android.api.data.Release; 12 | import org.musicbrainz.android.api.webservice.ResponseParser; 13 | 14 | public class ReleaseWithRelationshipsTest extends BaseXmlParsingTestCase { 15 | 16 | private static final String RELEASE_LOOKUP_FIXTURE = "releaseLookup_ade577f6-6087-4a4f-8e87-38b0f8169814.xml"; 17 | private Release release; 18 | 19 | @Before 20 | public void doParsing() throws IOException { 21 | InputStream stream = getFileStream(RELEASE_LOOKUP_FIXTURE); 22 | assertNotNull(stream); 23 | release = new ResponseParser().parseRelease(stream); 24 | stream.close(); 25 | } 26 | 27 | @Test 28 | public void testArtistName() { 29 | assertEquals(1, release.getArtists().size()); 30 | assertEquals("The Beatles", release.getArtists().get(0).getName()); 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /api/src/test/java/org/musicbrainz/mobile/test/handler/TagLookupTest.java: -------------------------------------------------------------------------------- 1 | package org.musicbrainz.mobile.test.handler; 2 | 3 | import static org.junit.Assert.assertEquals; 4 | import static org.junit.Assert.assertNotNull; 5 | 6 | import java.io.IOException; 7 | import java.io.InputStream; 8 | import java.util.LinkedList; 9 | 10 | import org.junit.Before; 11 | import org.junit.Test; 12 | import org.musicbrainz.android.api.data.Tag; 13 | import org.musicbrainz.android.api.webservice.ResponseParser; 14 | 15 | public class TagLookupTest extends BaseXmlParsingTestCase { 16 | 17 | private static final String ARTIST_TAG_FIXTURE = "tagLookup_artist_b10bbbfc-cf9e-42e0-be17-e2c3e1d2600d.xml"; 18 | private static final String RG_TAG_FIXTURE = "tagLookup_release-group_bc7630eb-521a-3312-a281-adfb8c5aac7d.xml"; 19 | private LinkedList artistTags; 20 | private LinkedList releaseGroupTags; 21 | 22 | @Before 23 | public void doParsing() throws IOException { 24 | artistTags = parseTags(ARTIST_TAG_FIXTURE); 25 | releaseGroupTags = parseTags(RG_TAG_FIXTURE); 26 | } 27 | 28 | private LinkedList parseTags(String xmlFile) throws IOException { 29 | InputStream stream = getFileStream(xmlFile); 30 | assertNotNull(stream); 31 | LinkedList tags = new ResponseParser().parseTagLookup(stream); 32 | stream.close(); 33 | return tags; 34 | } 35 | 36 | @Test 37 | public void testArtistTags() { 38 | assertEquals(artistTags.size(), 34); 39 | } 40 | 41 | @Test 42 | public void testReleaseGroupTags() { 43 | assertEquals(releaseGroupTags.size(), 7); 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /api/src/test/resources/barcodeSearch_792258106329.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 11 | It's Hard to Find a Friend 12 | Official 13 | 14 | eng 15 | 16 | 17 | 18 | 19 | 20 | Pedro the Lion 21 | Pedro the Lion 22 | 23 | 24 | 25 | 28 | 2001-10-16 29 | US 30 | 792258106329 31 | B00005O7SN 32 | 33 | 34 | JT1063 35 | 38 | 39 | 40 | 41 | 12 42 | 43 | CD 44 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /api/src/test/resources/collectionListLookup.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Want list 5 | jdamcd 6 | 7 | 8 | 9 | My Collection 10 | jdamcd 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /api/src/test/resources/labelLookup_a4f904e0-f048-4c13-88ec-f9f31f3e6109.xml: -------------------------------------------------------------------------------- 1 | 2 | 41 | -------------------------------------------------------------------------------- /api/src/test/resources/ratingLookup_artist_b10bbbfc-cf9e-42e0-be17-e2c3e1d2600d.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | The Beatles 7 | Beatles, The 8 | GB 9 | 10 | 1957 11 | 1970-04-10 12 | 13 | 4.7 14 | 15 | -------------------------------------------------------------------------------- /api/src/test/resources/ratingLookup_release-group_bc7630eb-521a-3312-a281-adfb8c5aac7d.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | Plans 7 | 2005-08-29 8 | 4 9 | 10 | -------------------------------------------------------------------------------- /api/src/test/resources/releaseGroupLookup_60089b39-412b-326c-afc7-aaa47113d84f.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | Miss Machine 6 | 2004-07-20 7 | 8 | 9 | 10 | The Dillinger Escape Plan 11 | Dillinger Escape Plan, The 12 | 13 | 14 | 15 | 16 | 17 | http://en.wikipedia.org/wiki/Miss_Machine 18 | 19 | 20 | http://www.discogs.com/master/2681 21 | 22 | 23 | 24 | 25 | experimental rock 26 | 27 | 28 | mathcore 29 | 30 | 31 | 4.5 32 | 33 | -------------------------------------------------------------------------------- /api/src/test/resources/tagLookup_release-group_bc7630eb-521a-3312-a281-adfb8c5aac7d.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | Plans 7 | 2005-08-29 8 | 9 | 10 | alternative 11 | 12 | 13 | alternative and punk 14 | 15 | 16 | alternative punk 17 | 18 | 19 | indie 20 | 21 | 22 | indie pop 23 | 24 | 25 | indie rock 26 | 27 | 28 | rock 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /app/assets/Roboto-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/assets/Roboto-Light.ttf -------------------------------------------------------------------------------- /app/assets/Roboto-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/assets/Roboto-Regular.ttf -------------------------------------------------------------------------------- /app/assets/about.html: -------------------------------------------------------------------------------- 1 |

2 | MusicBrainz is an open music encyclopedia that collects music metadata and makes it available to the public. 3 |

4 |
What does it do?
5 |

6 | This app gives you easy access to MusicBrainz data on your Android device. Scan a barcode to look up release information or search for artists and releases. Registered users can submit tags, ratings, barcodes and manage their collections. 7 |

8 |
Development
9 |

10 | The app is developed by Jamie McDonald. It began as a Google Summer of Code project in 2010. The source code is available on GitHub. Bug reports and comments are welcomed, just tap 'Feedback' in the menu. 11 |

12 |
Bugs
13 |

14 | You should be aware that error logs are sent from this app in the event of a crash. Personally identifiable information is not included. You can disable this in the settings menu if you like. 15 |

-------------------------------------------------------------------------------- /app/lint.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/res/anim/linear_interpolator.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /app/res/anim/main_progress.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | -------------------------------------------------------------------------------- /app/res/drawable-hdpi/action_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-hdpi/action_delete.png -------------------------------------------------------------------------------- /app/res/drawable-hdpi/action_feedback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-hdpi/action_feedback.png -------------------------------------------------------------------------------- /app/res/drawable-hdpi/action_refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-hdpi/action_refresh.png -------------------------------------------------------------------------------- /app/res/drawable-hdpi/action_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-hdpi/action_search.png -------------------------------------------------------------------------------- /app/res/drawable-hdpi/action_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-hdpi/action_settings.png -------------------------------------------------------------------------------- /app/res/drawable-hdpi/actionbar.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-hdpi/actionbar.9.png -------------------------------------------------------------------------------- /app/res/drawable-hdpi/launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-hdpi/launcher.png -------------------------------------------------------------------------------- /app/res/drawable-hdpi/tab_selected.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-hdpi/tab_selected.9.png -------------------------------------------------------------------------------- /app/res/drawable-hdpi/tab_selected_focused.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-hdpi/tab_selected_focused.9.png -------------------------------------------------------------------------------- /app/res/drawable-hdpi/tab_selected_pressed.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-hdpi/tab_selected_pressed.9.png -------------------------------------------------------------------------------- /app/res/drawable-hdpi/tab_unselected.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-hdpi/tab_unselected.9.png -------------------------------------------------------------------------------- /app/res/drawable-hdpi/tab_unselected_focused.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-hdpi/tab_unselected_focused.9.png -------------------------------------------------------------------------------- /app/res/drawable-hdpi/tab_unselected_pressed.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-hdpi/tab_unselected_pressed.9.png -------------------------------------------------------------------------------- /app/res/drawable-mdpi/action_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-mdpi/action_delete.png -------------------------------------------------------------------------------- /app/res/drawable-mdpi/action_feedback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-mdpi/action_feedback.png -------------------------------------------------------------------------------- /app/res/drawable-mdpi/action_refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-mdpi/action_refresh.png -------------------------------------------------------------------------------- /app/res/drawable-mdpi/action_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-mdpi/action_search.png -------------------------------------------------------------------------------- /app/res/drawable-mdpi/action_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-mdpi/action_settings.png -------------------------------------------------------------------------------- /app/res/drawable-mdpi/actionbar.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-mdpi/actionbar.9.png -------------------------------------------------------------------------------- /app/res/drawable-mdpi/launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-mdpi/launcher.png -------------------------------------------------------------------------------- /app/res/drawable-mdpi/tab_selected.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-mdpi/tab_selected.9.png -------------------------------------------------------------------------------- /app/res/drawable-mdpi/tab_selected_focused.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-mdpi/tab_selected_focused.9.png -------------------------------------------------------------------------------- /app/res/drawable-mdpi/tab_selected_pressed.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-mdpi/tab_selected_pressed.9.png -------------------------------------------------------------------------------- /app/res/drawable-mdpi/tab_unselected.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-mdpi/tab_unselected.9.png -------------------------------------------------------------------------------- /app/res/drawable-mdpi/tab_unselected_focused.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-mdpi/tab_unselected_focused.9.png -------------------------------------------------------------------------------- /app/res/drawable-mdpi/tab_unselected_pressed.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-mdpi/tab_unselected_pressed.9.png -------------------------------------------------------------------------------- /app/res/drawable-mdpi/tag_background.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-mdpi/tag_background.9.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/action_add_collection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/action_add_collection.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/action_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/action_delete.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/action_feedback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/action_feedback.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/action_refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/action_refresh.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/action_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/action_search.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/action_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/action_settings.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/actionbar.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/actionbar.9.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/btn_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/btn_search.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/btn_tag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/btn_tag.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/dash_about_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/dash_about_default.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/dash_about_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/dash_about_pressed.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/dash_collections_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/dash_collections_default.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/dash_collections_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/dash_collections_pressed.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/dash_donate_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/dash_donate_default.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/dash_donate_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/dash_donate_pressed.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/dash_scan_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/dash_scan_default.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/dash_scan_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/dash_scan_pressed.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/launcher.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/link_buy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/link_buy.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/link_community.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/link_community.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/link_discog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/link_discog.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/link_download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/link_download.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/link_facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/link_facebook.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/link_film.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/link_film.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/link_generic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/link_generic.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/link_home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/link_home.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/link_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/link_info.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/link_lyrics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/link_lyrics.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/link_soundcloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/link_soundcloud.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/link_streaming.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/link_streaming.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/link_twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/link_twitter.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/link_vimeo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/link_vimeo.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/link_youtube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/link_youtube.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/logo_lastfm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/logo_lastfm.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/logo_wikipedia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/logo_wikipedia.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/tab_selected.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/tab_selected.9.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/tab_selected_focus.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/tab_selected_focus.9.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/tab_selected_pressed.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/tab_selected_pressed.9.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/tab_unselected.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/tab_unselected.9.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/tab_unselected_focused.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/tab_unselected_focused.9.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/tab_unselected_pressed.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/tab_unselected_pressed.9.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/tile_bg_default.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/tile_bg_default.9.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/tile_bg_focused.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/tile_bg_focused.9.png -------------------------------------------------------------------------------- /app/res/drawable-xhdpi/tile_bg_pressed.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xhdpi/tile_bg_pressed.9.png -------------------------------------------------------------------------------- /app/res/drawable-xxhdpi/actionbar.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jdamcd/musicbrainz-android/fc6f518a0067b27cb28316a0d7d441086559f6bd/app/res/drawable-xxhdpi/actionbar.9.png -------------------------------------------------------------------------------- /app/res/drawable/background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/res/drawable/dash_about.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 14 | 15 | 18 | 19 | 23 | 24 | -------------------------------------------------------------------------------- /app/res/drawable/dash_collections.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 14 | 15 | 18 | 19 | 23 | 24 | -------------------------------------------------------------------------------- /app/res/drawable/dash_donate.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 14 | 15 | 18 | 19 | 23 | 24 | -------------------------------------------------------------------------------- /app/res/drawable/dash_grid.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 14 | 15 | 18 | 19 | 23 | 24 | -------------------------------------------------------------------------------- /app/res/drawable/dash_scan.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 14 | 15 | 18 | 19 | 23 | 24 | -------------------------------------------------------------------------------- /app/res/drawable/link_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | 14 | 15 | 20 | 21 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /app/res/drawable/link_button_default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 12 | 13 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/res/drawable/link_button_pressed.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 12 | 13 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/res/drawable/link_button_selected.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 12 | 13 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/res/drawable/list_divider.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/res/drawable/progress_spinner.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/res/drawable/tab_indicator.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 11 | 16 | 17 | 18 | 23 | 28 | 29 | 30 | 35 | 40 | 41 | 42 | 47 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /app/res/layout-land/activity_dash.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 12 | 13 | 18 | 19 | 24 | 25 | 28 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 40 | 41 | 44 | 45 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /app/res/layout-land/activity_donate.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 15 | 16 | 22 | 23 | -------------------------------------------------------------------------------- /app/res/layout-land/fragment_cover_art.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 14 | 15 | 18 | 19 | 24 | 25 | 26 | 27 | 28 | 32 | 33 | 36 | 37 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /app/res/layout-land/fragment_login.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 11 | 12 | 16 | 17 | 22 | 23 |