Laptop push

master
Aurailus 2017-05-09 19:27:25 -07:00
commit 0519aba5d9
114 changed files with 9964 additions and 0 deletions

9
.gitignore vendored Normal file
View File

@ -0,0 +1,9 @@
*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures
.externalNativeBuild

228
.idea/codeStyleSettings.xml Normal file
View File

@ -0,0 +1,228 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectCodeStyleSettingsManager">
<option name="PER_PROJECT_SETTINGS">
<value>
<option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="99" />
<option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="99" />
<option name="PACKAGES_TO_USE_IMPORT_ON_DEMAND">
<value />
</option>
<option name="IMPORT_LAYOUT_TABLE">
<value>
<package name="android" withSubpackages="true" static="false" />
<emptyLine />
<package name="com" withSubpackages="true" static="false" />
<emptyLine />
<package name="junit" withSubpackages="true" static="false" />
<emptyLine />
<package name="net" withSubpackages="true" static="false" />
<emptyLine />
<package name="org" withSubpackages="true" static="false" />
<emptyLine />
<package name="java" withSubpackages="true" static="false" />
<emptyLine />
<package name="javax" withSubpackages="true" static="false" />
<emptyLine />
<package name="" withSubpackages="true" static="false" />
<emptyLine />
<package name="" withSubpackages="true" static="true" />
<emptyLine />
</value>
</option>
<option name="RIGHT_MARGIN" value="100" />
<AndroidXmlCodeStyleSettings>
<option name="USE_CUSTOM_SETTINGS" value="true" />
</AndroidXmlCodeStyleSettings>
<Objective-C-extensions>
<file>
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Import" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Macro" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Typedef" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Enum" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Constant" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Global" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Struct" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="FunctionPredecl" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Function" />
</file>
<class>
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Property" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Synthesize" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InitMethod" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="StaticMethod" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InstanceMethod" />
<option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="DeallocMethod" />
</class>
<extensions>
<pair source="cpp" header="h" />
<pair source="c" header="h" />
</extensions>
</Objective-C-extensions>
<XML>
<option name="XML_KEEP_LINE_BREAKS" value="false" />
<option name="XML_ALIGN_ATTRIBUTES" value="false" />
<option name="XML_SPACE_INSIDE_EMPTY_TAG" value="true" />
</XML>
<codeStyleSettings language="XML">
<option name="FORCE_REARRANGE_MODE" value="1" />
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4" />
</indentOptions>
<arrangement>
<rules>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:android</NAME>
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:.*</NAME>
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:id</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:name</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>name</NAME>
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>style</NAME>
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:layout_width</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:layout_height</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:layout_.*</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:width</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:height</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_NAMESPACE>.*</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
</rules>
</arrangement>
</codeStyleSettings>
</value>
</option>
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default (1)" />
</component>
</project>

22
.idea/compiler.xml Normal file
View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<resourceExtensions />
<wildcardResourcePatterns>
<entry name="!?*.java" />
<entry name="!?*.form" />
<entry name="!?*.class" />
<entry name="!?*.groovy" />
<entry name="!?*.scala" />
<entry name="!?*.flex" />
<entry name="!?*.kt" />
<entry name="!?*.clj" />
<entry name="!?*.aj" />
</wildcardResourcePatterns>
<annotationProcessing>
<profile default="true" name="Default" enabled="false">
<processorPath useClasspath="true" />
</profile>
</annotationProcessing>
</component>
</project>

View File

@ -0,0 +1,3 @@
<component name="CopyrightManager">
<settings default="" />
</component>

18
.idea/gradle.xml Normal file
View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />
</GradleProjectSettings>
</option>
</component>
</project>

View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="EntryPointsManager">
<entry_points version="2.0" />
</component>
<component name="NullableNotNullManager">
<option name="myDefaultNullable" value="android.support.annotation.Nullable" />
<option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
<option name="myNullables">
<value>
<list size="4">
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
</list>
</value>
</option>
<option name="myNotNulls">
<value>
<list size="4">
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
</list>
</value>
</option>
</component>
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
<OptionsSetting value="true" id="Add" />
<OptionsSetting value="true" id="Remove" />
<OptionsSetting value="true" id="Checkout" />
<OptionsSetting value="true" id="Update" />
<OptionsSetting value="true" id="Status" />
<OptionsSetting value="true" id="Edit" />
<ConfirmationsSetting value="0" id="Add" />
<ConfirmationsSetting value="0" id="Remove" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>

31
.idea/misc.xml Normal file
View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="EntryPointsManager">
<entry_points version="2.0" />
</component>
<component name="NullableNotNullManager">
<option name="myDefaultNullable" value="android.support.annotation.Nullable" />
<option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
<option name="myNullables">
<value>
<list size="4">
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
</list>
</value>
</option>
<option name="myNotNulls">
<value>
<list size="4">
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
</list>
</value>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK" />
</project>

9
.idea/modules.xml Normal file
View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/CanineMusic.iml" filepath="$PROJECT_DIR$/CanineMusic.iml" />
<module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
</modules>
</component>
</project>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
</set>
</option>
</component>
</project>

6
.idea/vcs.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

27
README.md Normal file
View File

@ -0,0 +1,27 @@
# [Canine Music Player](http://canine.woofbark.dog)
[![Canine Music Logo](https://github.com/Aurailus/CanineMusic/blob/master/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png)](http://canine.woofbark.dog)
A clean, lightweight Music Player for Android.
## What is Canine Music?
Canine Music is a Java App made by [@Aurailus](https://github.com/Aurailus) for Android Devices, with help from [@delta1512](https://github.com/delta1512). The app aims to achieve everything that we've wanted that other music apps have omitted. The app is being built in Android Studio for API 21 (Android Lollipop) and up.
## What needs to be done:
- [x] Music Playback
- [ ] Album Arts
- [ ] Shuffle
- [ ] Jumble
- [ ] Playlists
- [ ] Web integration (Soundcloud, Youtube??)
- [ ] ID3 Editor
- [ ] Volume button jacking
## Will it cost money?
No, Canine Music will be provided free of charge.
## How can I help?
I don't know how Github works, Don't ask me!
## Credit where Credit is due
- [@delta1512](https://github.com/Aurailus) - Icon Design \([link](https://github.com/delta1512/open_icon_set)\)
- [@Aurailus](https://github.com/delta1512) - Programming and Design

1
app/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/build

36
app/build.gradle Normal file
View File

@ -0,0 +1,36 @@
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.aurailus.caninemusic"
minSdkVersion 21
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
productFlavors {
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
compile 'com.android.support:design:25.3.1'
compile 'com.android.support:support-vector-drawable:25.3.1'
compile 'com.android.support:support-v4:25.3.1'
testCompile 'junit:junit:4.12'
}

25
app/proguard-rules.pro vendored Normal file
View File

@ -0,0 +1,25 @@
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in C:\Users\ben\AppData\Local\Android\Sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

View File

@ -0,0 +1,26 @@
package com.aurailus.caninemusic;
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumentation test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() throws Exception {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getTargetContext();
assertEquals("com.aurailus.caninemusic", appContext.getPackageName());
}
}

View File

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.aurailus.caninemusic">
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:launchMode="singleTop"
android:screenOrientation="user">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name=".PlayerActivity"
android:label="Player"
android:launchMode="singleTop"
android:screenOrientation="user"/>
<service android:name=".MusicService"/>
<uses-library
android:name="com.sec.android.app.multiwindow"
android:required="false"/>
<meta-data
android:name="com.sec.android.support.multiwindow"
android:value="true"/>
<activity
android:name=".QueueActivity"
android:label="@string/title_activity_queue"
android:theme="@style/AppTheme">
</activity>
</application>
</manifest>

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

View File

@ -0,0 +1,73 @@
package com.aurailus.caninemusic;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.provider.MediaStore;
import android.support.v4.graphics.drawable.RoundedBitmapDrawable;
import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory;
import java.io.File;
public class Album {
private String id, title, artist;
private RoundedBitmapDrawable albumArt;
private boolean empty = false;
public Album(String id, String title, String artist, Context context) {
this.id = id;
this.title = title;
this.artist = artist;
getAlbumArt(context);
}
public Album(String id, Context context) {
this.id = id;
getAlbumArt(context);
}
public void getAlbumArt(Context context) {
ContentResolver albumResolver = context.getContentResolver();
Cursor albumCursor = albumResolver.query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, //Location to grab from
new String[] {MediaStore.Audio.Albums._ID, MediaStore.Audio.Albums.ALBUM_ART}, //Columns to grab
MediaStore.Audio.Albums._ID+ "=?", //Selection filter... question marks substitute 4th row args
new String[] {String.valueOf(id)}, //Args for filter
null);
if (albumCursor.moveToFirst()) {
String albumString = albumCursor.getString(albumCursor.getColumnIndex(android.provider.MediaStore.Audio.Albums.ALBUM_ART));
File file = new File(albumString);
if (file.exists()) {
Bitmap albumBmp = Bitmap.createScaledBitmap(BitmapFactory.decodeFile(albumString), 128, 128, false);
albumArt = RoundedBitmapDrawableFactory.create(null, albumBmp);
albumArt.setCornerRadius(1000.0f);
albumArt.setAntiAlias(true);
}
else empty = true;
}
else empty = true;
}
/*Getters and setters*/
public String getId() {
return id;
}
public String getTitle() {
return title;
}
public String getArtist() {
return artist;
}
public Drawable getImage() {
return albumArt;
}
public boolean getEmpty() { return empty; }
}

View File

@ -0,0 +1,71 @@
package com.aurailus.caninemusic;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.support.constraint.ConstraintLayout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
public class AlbumAdapter extends BaseAdapter {
private ArrayList<Album> albums;
private LayoutInflater albumInf;
private boolean moredetails;
private ConstraintLayout albumLay;
@Override
public int getCount() {
return albums.size();
}
@Override
public Object getItem(int arg0) {
return null;
}
@Override
public long getItemId(int arg0) {
return 0;
}
@Override
public View getView(int ind, View convertView, ViewGroup parent) {
if (!moredetails) albumLay = (ConstraintLayout)albumInf.inflate(R.layout.album_grid, parent, false);
else albumLay = (ConstraintLayout)albumInf.inflate(R.layout.album_list, parent, false);
TextView albumView = (TextView)albumLay.findViewById(R.id.album_title);
TextView artistView = (TextView)albumLay.findViewById(R.id.album_artist);
ImageView albumArtView = (ImageView) albumLay.findViewById(R.id.album_art);
Album curAlbum = albums.get(ind);
albumView.setText(curAlbum.getTitle());
if (!curAlbum.getEmpty()) {
Drawable img = curAlbum.getImage();
albumArtView.setImageDrawable(img);
}
if (moredetails) {
TextView playsView = (TextView) albumLay.findViewById(R.id.album_plays);
TextView lengthView = (TextView) albumLay.findViewById(R.id.album_length);
artistView.setText(curAlbum.getArtist());
playsView.setText(" Plays");
//lengthView.setText(curAlbum.getLength());
}
albumLay.setTag(curAlbum.getId());
return albumLay;
}
public AlbumAdapter(Context c, ArrayList<Album> albums, boolean list) {
this.albums = albums;
this.moredetails = list;
albumInf = LayoutInflater.from(c);
}
}

View File

@ -0,0 +1,415 @@
package com.aurailus.caninemusic;
import android.Manifest;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.Image;
import android.os.Build;
import android.os.IBinder;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.constraint.ConstraintLayout;
import android.support.design.widget.BottomNavigationView;
import android.support.design.widget.NavigationView;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v4.graphics.drawable.RoundedBitmapDrawable;
import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.MenuItem;
import android.view.View;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ListView;
import android.net.Uri;
import android.content.ContentResolver;
import android.database.Cursor;
import android.widget.TextView;
import android.widget.ViewFlipper;
import android.widget.ViewSwitcher;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import com.aurailus.caninemusic.MusicService.*;
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
private ArrayList<Song> songList;
private ArrayList<Song> playList;
private ArrayList<Album> albumList;
private GridView albumGridView;
private ListView albumListView;
private ViewSwitcher albumSwitcher;
private MusicService musicSrv;
private Intent playIntent;
private boolean playbackPaused = false;
private boolean albumIsGrid = true;
private boolean musicBound = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
//Basic stuffs
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Request Permission at Runtime because Android Sucks
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},1);
return;
}
}
//Initialize Songs
songList = new ArrayList<>();
playList = new ArrayList<>();
getSongs();
Collections.sort(songList, new Comparator<Song>() {
public int compare(Song a, Song b) {
return a.getTitle().toLowerCase().compareTo(b.getTitle().toLowerCase());
}
});
playList.addAll(songList);
ListView songView = (ListView)findViewById(R.id.song_list);
SongAdapter songAdt = new SongAdapter(this, songList);
songView.setAdapter(songAdt);
//Initialize Albums
albumList = new ArrayList<>();
getAlbums();
Collections.sort(albumList, new Comparator<Album>() {
public int compare(Album a, Album b) {
return a.getTitle().toLowerCase().compareTo(b.getTitle().toLowerCase());
}
});
albumGridView = (GridView)findViewById(R.id.album_grid);
AlbumAdapter albumAdt = new AlbumAdapter(this, albumList, false);
albumGridView.setAdapter(albumAdt);
albumListView = (ListView)findViewById(R.id.album_list);
albumAdt = new AlbumAdapter(this, albumList, true);
albumListView.setAdapter(albumAdt);
albumSwitcher = (ViewSwitcher)findViewById(R.id.album_switcher);
//Navigation
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
BottomNavigationView bottomNav = (BottomNavigationView) findViewById(R.id.navigation);
bottomNav.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
selectSection(item);
return true;
}
});
//Receive Broadcasts for Toolbar Song Details
LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter("musicPrepared"));
}
void selectSection(MenuItem item) {
ViewFlipper flipper = (ViewFlipper)findViewById(R.id.flipper);
switch (item.getItemId()) {
case (R.id.nav_album):
flipper.setDisplayedChild(0);
break;
case (R.id.nav_playlist):
flipper.setDisplayedChild(1);
break;
case (R.id.nav_track):
flipper.setDisplayedChild(2);
break;
case (R.id.nav_artist):
flipper.setDisplayedChild(3);
break;
case (R.id.nav_genre):
flipper.setDisplayedChild(4);
break;
}
}
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
TextView appTitle = (TextView)findViewById(R.id.app_title);
ConstraintLayout songDetails = (ConstraintLayout)findViewById(R.id.playing_details);
appTitle.setVisibility(View.INVISIBLE);
songDetails.setVisibility(View.VISIBLE);
TextView mainTitle = (TextView)findViewById(R.id.current_title);
TextView mainArtist = (TextView)findViewById(R.id.current_artist);
mainTitle.setText(musicSrv.getTitle());
mainArtist.setText(musicSrv.getArtist());
ImageView albumView = (ImageView)findViewById(R.id.current_albumart);
String albumId = musicSrv.getAlbumId();
ContentResolver albumResolver = getContentResolver();
Cursor albumCursor = albumResolver.query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, //Location to grab from
new String[] {MediaStore.Audio.Albums._ID, MediaStore.Audio.Albums.ALBUM_ART}, //Columns to grab
MediaStore.Audio.Albums._ID + "=?", //Selection filter... question marks substitute 4th row args
new String[] {String.valueOf(albumId)}, //Args for filter
null);
if (albumCursor.moveToFirst()) {
String albumString = albumCursor.getString(albumCursor.getColumnIndex(android.provider.MediaStore.Audio.Albums.ALBUM_ART));
File file = new File(albumString);
if (file.exists()) {
Bitmap albumBmp = Bitmap.createScaledBitmap(BitmapFactory.decodeFile(albumString), 128, 128, false);
RoundedBitmapDrawable albumArt = RoundedBitmapDrawableFactory.create(null, albumBmp);
albumArt.setCornerRadius(1000.0f);
albumArt.setAntiAlias(true);
albumView.setImageDrawable(albumArt);
}
}
}
};
//Set the musicBound variable
private ServiceConnection musicConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
MusicBinder binder = (MusicBinder)service;
musicSrv = binder.getService();
musicSrv.setList(playList);
musicBound = true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
musicBound = false;
}
};
@Override
protected void onStart() {
super.onStart();
if (playIntent == null) {
playIntent = new Intent(this, MusicService.class);
bindService(playIntent, musicConnection, Context.BIND_AUTO_CREATE);
startService(playIntent);
}
}
@Override
protected void onDestroy() {
//finish();
//stopService(playIntent);
//musicSrv = null;
LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
super.onDestroy();
}
public void getSongs() {
ContentResolver musicResolver = getContentResolver();
Uri musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null);
if (musicCursor != null && musicCursor.moveToFirst()) {
int idList = musicCursor.getColumnIndex(android.provider.MediaStore.Audio.Media._ID);
int titleList = musicCursor.getColumnIndex(android.provider.MediaStore.Audio.Media.TITLE);
int artistList = musicCursor.getColumnIndex(android.provider.MediaStore.Audio.Media.ARTIST);
int albumList = musicCursor.getColumnIndex(android.provider.MediaStore.Audio.Media.ALBUM_ID);
int durationList = musicCursor.getColumnIndex(android.provider.MediaStore.Audio.Media.DURATION);
boolean next = true;
while (next) {
long thisId = musicCursor.getLong(idList);
String thisTitle = musicCursor.getString(titleList);
String thisArtist = musicCursor.getString(artistList);
String albumId = musicCursor.getString(albumList);
long thisDuration = musicCursor.getLong(durationList);
songList.add(new Song(thisId, thisTitle, thisArtist, albumId, thisDuration));
next = musicCursor.moveToNext();
}
musicCursor.close();
}
}
public void getAlbums() {
ContentResolver albumResolver = getContentResolver();
Uri albumUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String[]columns = {android.provider.MediaStore.Audio.Albums._ID, android.provider.MediaStore.Audio.Albums.ALBUM_ID,
android.provider.MediaStore.Audio.Albums.ALBUM, android.provider.MediaStore.Audio.Albums.ARTIST};
Cursor albumCursor = albumResolver.query(albumUri, columns, null, null, null);
if (albumCursor != null && albumCursor.moveToFirst()) {
int titleList = albumCursor.getColumnIndex(android.provider.MediaStore.Audio.Albums.ALBUM);
int albumIdList = albumCursor.getColumnIndex(android.provider.MediaStore.Audio.Albums.ALBUM_ID);
int artistList = albumCursor.getColumnIndex(android.provider.MediaStore.Audio.Albums.ARTIST);
boolean next = true;
while (next) {
String albumId = albumCursor.getString(albumIdList);
String thisTitle = albumCursor.getString(titleList);
String thisArtist = albumCursor.getString(artistList);
boolean exists = false;
for (Album album : albumList) {
if (album.getId().equals(albumId)) {
exists = true;
break;
}
}
if (!exists) albumList.add(new Album(albumId, thisTitle, thisArtist, this.getBaseContext()));
next = albumCursor.moveToNext();
}
albumCursor.close();
}
}
public void chooseSong(View view) {
musicSrv.setSong(Integer.parseInt(view.getTag().toString()));
musicSrv.playSong();
if (playbackPaused) {
playbackPaused = false;
}
openPlayer();
}
public void chooseAlbum(View view) {
if (musicBound) {
if (playbackPaused) {
playbackPaused = false;
}
playList.clear();
System.out.println(view.getTag());
for (Song song : songList) {
if (song.getAlbumId().equals(view.getTag())) {
playList.add(song);
}
}
musicSrv.setList(playList);
musicSrv.setSong((int) Math.floor(Math.random() * playList.size()));
musicSrv.playSong();
openPlayer();
}
}
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch(item.getItemId()) {
case (R.id.add_pin):
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
MenuItem it = navigationView.getMenu().findItem(R.id.pinned_items);
it.getSubMenu().add(0, 0, 0, "C418").setIcon(R.drawable.ic_jumble);
break;
case (R.id.nav_rate):
String appPck = getPackageName();
try {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPck)));
} catch (android.content.ActivityNotFoundException anfe) {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPck)));
}
break;
case (R.id.nav_about):
//go to about page
break;
default:
break;
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
public void switchAlbumView(View view) {
if (albumIsGrid) {
albumListView.setSelection(0);
albumSwitcher.setDisplayedChild(1);
TextView v = (TextView)findViewById(R.id.album_view_mode);
v.setText(R.string.list_mode);
albumIsGrid = false;
}
else {
albumGridView.setSelection(0);
TextView v = (TextView)findViewById(R.id.album_view_mode);
v.setText(R.string.grid_mode);
albumSwitcher.setDisplayedChild(0);
albumIsGrid = true;
}
}
public void openDrawer(View view) {
DrawerLayout nav = (DrawerLayout)findViewById(R.id.drawer_layout);
nav.openDrawer(Gravity.START);
}
public void shuffleAll(View view) {
if (musicBound) {
musicSrv.setShuffle(true);
playList.addAll(songList);
musicSrv.setList(playList);
musicSrv.setSong((int) Math.floor(Math.random() * playList.size()));
musicSrv.playSong();
if (playbackPaused) {
playbackPaused = false;
}
openPlayer();
}
}
public void shuffleAll() {
if (musicBound) {
musicSrv.setShuffle(true);
playList.addAll(songList);
musicSrv.setList(playList);
musicSrv.setSong((int) Math.floor(Math.random() * playList.size()));
musicSrv.playSong();
if (playbackPaused) {
playbackPaused = false;
}
openPlayer();
}
}
public void openPlayer() {
Intent intent = new Intent(MainActivity.this, PlayerActivity.class);
startActivity(intent);
}
public void openPlayer(View view) {
Intent intent = new Intent(MainActivity.this, PlayerActivity.class);
startActivity(intent);
}
}

View File

@ -0,0 +1,15 @@
package com.aurailus.caninemusic;
import android.content.Context;
import android.view.View;
import android.widget.MediaController;
public class MusicController extends MediaController {
public MusicController(Context c) {
super(c);
}
public void hide() {
//prevent popup from hiding
}
}

View File

@ -0,0 +1,195 @@
package com.aurailus.caninemusic;
import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.content.ContentUris;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.os.PowerManager;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import java.util.ArrayList;
import java.util.Random;
public class MusicService extends Service implements
MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener, MediaPlayer.OnCompletionListener, AudioManager.OnAudioFocusChangeListener {
private MediaPlayer player;
private ArrayList<Song> songs;
private int ind;
private final IBinder musicBind = new MusicBinder();
private String songTitle, songArtist;
private static final int NOTIFY_ID = 1;
private boolean shuffle = true;
private Random rand;
private Runnable playerStart;
private Handler h;
@Override
public void onCreate() {
super.onCreate();
ind = 0;
player = new MediaPlayer();
rand = new Random();
initMusicPlayer();
h = new Handler();
playerStart = new Runnable(){
public void run(){
System.out.println("Playback started");
player.start();
}
};
}
@Override
public IBinder onBind(Intent intent) {
return musicBind;
}
@Override
public boolean onUnbind(Intent intent){
player.stop();
player.release();
return false;
}
@Override
public void onCompletion(MediaPlayer player) {
playNext();
}
@Override
public void onDestroy() {
stopForeground(true);
}
@Override
public boolean onError(MediaPlayer player, int what, int extra) {
player.reset();
return false;
}
@Override
public void onPrepared(MediaPlayer player) {
h.removeCallbacks(playerStart);
int delay = 250;
h.postDelayed(playerStart, delay);
Intent notIntent = new Intent(this, MainActivity.class);
notIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendInt = PendingIntent.getActivity(this, 0, notIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Notification.Builder builder = new Notification.Builder(this);
builder.setContentIntent(pendInt)
.setSmallIcon(R.drawable.play)
.setTicker(songTitle)
.setOngoing(true)
.setContentTitle("Playing")
.setContentText(songTitle);
Notification not = builder.build();
startForeground(NOTIFY_ID, not);
Intent intent = new Intent("musicPrepared");
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
public void setList(ArrayList<Song> songs) {
this.songs = songs;
}
public void initMusicPlayer() {
player.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.setOnPreparedListener(this);
player.setOnCompletionListener(this);
player.setOnErrorListener(this);
}
@Override
public void onAudioFocusChange(int focusChange) {
}
public class MusicBinder extends Binder {
MusicService getService() {
return MusicService.this;
}
}
public void playSong(){
player.reset();
Song playSong = songs.get(ind);
songTitle = playSong.getTitle();
songArtist = playSong.getArtist();
long curSong = playSong.getId();
Uri trackUri = ContentUris.withAppendedId(android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, curSong);
try {
player.setDataSource(getApplicationContext(), trackUri);
}
catch(Exception e) {
Log.e("MUSIC SERVICE", "Error setting data source", e);
}
player.prepareAsync();
}
public void playPrev() {
ind--;
if (ind < 0) ind = songs.size() - 1;
playSong();
}
public void playNext() {
if (shuffle) {
ind = rand.nextInt(songs.size());
}
else {
ind++;
if (ind >= songs.size()) ind = 0;
}
playSong();
}
public void setSong(int songInd) {
ind = songInd;
}
public int getTime() {
return player.getCurrentPosition();
}
public int getLength() {
return player.getDuration();
}
public String getTitle() { return songTitle; }
public String getArtist() { return songArtist; }
public String getAlbumId() { return songs.get(ind).getAlbumId(); }
public boolean getShuffle() {
return shuffle;
}
public boolean isPlaying() {
return player.isPlaying();
}
public void pausePlayer() {
player.pause();
}
public void seek(int pos) {
player.seekTo(pos);
}
public void go() {
player.start();
}
public void setShuffle(boolean shuffle) {
this.shuffle = shuffle;
}
}

View File

@ -0,0 +1,226 @@
package com.aurailus.caninemusic;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.provider.MediaStore;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;
import java.io.File;
import java.util.Locale;
public class PlayerActivity extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener {
private SeekBar seek;
private TextView titleView;
private TextView artistView;
private TextView lengthView;
private TextView timeView;
private Bitmap albumArt;
private ImageView albumView;
private ImageButton playPauseButton;
private boolean seekInteracting = false;
private MusicService musicSrv;
private boolean musicBound = false;
private Intent playIntent;
private Handler h;
private Runnable r;
private int updateDelay;
@Override
protected void onDestroy() {
super.onDestroy();
if (isFinishing()) {
h.removeCallbacks(r);
System.out.println("destroy");
LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
stopService(playIntent);
unbindService(musicConnection);
musicSrv = null;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_player);
seek = (SeekBar) findViewById(R.id.song_seekbar);
titleView = (TextView) findViewById(R.id.song_title);
artistView = (TextView) findViewById(R.id.song_artist);
timeView = (TextView) findViewById(R.id.current_time);
lengthView = (TextView) findViewById(R.id.song_duration);
albumView = (ImageView) findViewById(R.id.album_cover);
playPauseButton = (ImageButton) findViewById(R.id.button_playpause);
seek.setOnSeekBarChangeListener(this);
if (playIntent == null) {
playIntent = new Intent(this, MusicService.class);
bindService(playIntent, musicConnection, Context.BIND_AUTO_CREATE);
startService(playIntent);
}
LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
new IntentFilter("musicPrepared"));
h = new Handler();
r = new Runnable(){
public void run(){
updatePlayer();
h.postDelayed(this, updateDelay);
}
};
}
private ServiceConnection musicConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
MusicService.MusicBinder binder = (MusicService.MusicBinder)service;
musicSrv = binder.getService();
musicBound = true;
initPlayer();
updatePlayer();
if (!musicSrv.isPlaying()) {
playPauseButton.setBackgroundResource(R.drawable.ic_playcircle);
}
updateDelay = 250;
h.postDelayed(r, updateDelay);
}
@Override
public void onServiceDisconnected(ComponentName name) {
musicBound = false;
}
};
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
initPlayer();
}
};
private void initPlayer() {
seek.setMax(Math.round(musicSrv.getLength()));
int x = musicSrv.getLength() / 1000;
int seconds = x % 60;
x /= 60;
int minutes = x % 60;
lengthView.setText(minutes + ":" + String.format(Locale.CANADA, "%02d", seconds));
titleView.setText(musicSrv.getTitle());
artistView.setText(musicSrv.getArtist());
String albumId = musicSrv.getAlbumId();
ContentResolver albumResolver = getContentResolver();
Cursor albumCursor = albumResolver.query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, //Location to grab from
new String[] {MediaStore.Audio.Albums._ID, MediaStore.Audio.Albums.ALBUM_ART}, //Columns to grab
MediaStore.Audio.Albums._ID+ "=?", //Selection filter... question marks substitute 4th row args
new String[] {String.valueOf(albumId)}, //Args for filter
null);
if (albumCursor.moveToFirst()) {
String albumString = albumCursor.getString(albumCursor.getColumnIndex(android.provider.MediaStore.Audio.Albums.ALBUM_ART));
File file = new File(albumString);
if (file.exists()) {
albumArt = Bitmap.createBitmap(BitmapFactory.decodeFile(albumString));
albumView.setImageBitmap(albumArt);
}
}
}
private void updatePlayer() {
if (musicBound) {
if (!seekInteracting) {
seek.setProgress(Math.round(musicSrv.getTime()));
int x = musicSrv.getTime() / 1000;
int seconds = x % 60;
x /= 60;
int minutes = x % 60;
timeView.setText(minutes + ":" + String.format(Locale.CANADA, "%02d", seconds));
}
}
}
@Override
public void onProgressChanged(SeekBar seek, int progress, boolean fromUser) {
if (seekInteracting && fromUser) {
int x = seek.getProgress() / 1000;
int seconds = x % 60;
x /= 60;
int minutes = x % 60;
timeView.setText(minutes + ":" + String.format(Locale.CANADA, "%02d", seconds));
}
}
public void togglePlaying(View view) {
if (musicSrv.isPlaying()) {
musicSrv.pausePlayer();
view.setBackgroundResource(R.drawable.ic_playcircle);
}
else {
musicSrv.go();
view.setBackgroundResource(R.drawable.ic_pausecircle);
}
}
public void nextSong(View view) {
musicSrv.playNext();
playPauseButton.setBackgroundResource(R.drawable.ic_pausecircle);
}
public void previousSong(View view) {
if (musicSrv.getTime() > 3000) {
musicSrv.seek(0);
}
else {
musicSrv.playPrev();
playPauseButton.setBackgroundResource(R.drawable.ic_pausecircle);
}
}
public void back(View view) {
this.finish();
}
@Override
public void onStartTrackingTouch(SeekBar seek) {
seekInteracting = true;
}
@Override
public void onStopTrackingTouch(SeekBar seek) {
musicSrv.seek(seek.getProgress());
seekInteracting = false;
}
}

View File

@ -0,0 +1,24 @@
package com.aurailus.caninemusic;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
public class QueueActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_queue);
}
public void back(View view) {
this.finish();
}
@Override
public void onBackPressed() {
this.finish();
}
}

View File

@ -0,0 +1,47 @@
package com.aurailus.caninemusic;
import java.util.Locale;
public class Song {
private long id, duration;
private String title, artist, albumId, humanLength;
public Song(long id, String title, String artist, String albumId, long duration) {
this.id = id;
this.title = title;
this.artist = artist;
this.albumId = albumId;
this.duration = duration;
int x = (int)this.duration/1000;
int seconds = x % 60;
x /= 60;
int minutes = x % 60;
this.humanLength = minutes + ":" + String.format(Locale.CANADA, "%02d", seconds);
}
/*Getters and setters*/
public long getId() {
return id;
}
public String getTitle() {
return title;
}
public String getArtist() {
return artist;
}
public String getAlbumId() {
return albumId;
}
public long getDuration() {
return duration;
}
public String getHumanLength() {
return humanLength;
}
}

View File

@ -0,0 +1,84 @@
package com.aurailus.caninemusic;
import android.graphics.drawable.Drawable;
import android.support.constraint.ConstraintLayout;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import java.util.ArrayList;
import android.content.Context;
import android.view.LayoutInflater;
import android.widget.ImageView;
import android.widget.TextView;
public class SongAdapter extends BaseAdapter {
private ArrayList<Song> songs;
private ArrayList<Album> albumart;
private LayoutInflater songInf;
@Override
public int getCount() {
return songs.size();
}
@Override
public Object getItem(int arg0) {
return null;
}
@Override
public long getItemId(int arg0) {
return 0;
}
@Override
public View getView(int ind, View convertView, ViewGroup parent) {
ConstraintLayout songLay = (ConstraintLayout)songInf.inflate(R.layout.song, parent, false);
TextView songView = (TextView)songLay.findViewById(R.id.song_title);
TextView artistView = (TextView)songLay.findViewById(R.id.song_artist);
ImageView albumArtView = (ImageView)songLay.findViewById(R.id.album_art);
TextView songDuration = (TextView)songLay.findViewById(R.id.song_duration);
Song curSong = songs.get(ind);
songView.setText(curSong.getTitle());
artistView.setText(curSong.getArtist());
songDuration.setText(curSong.getHumanLength());
for(Album curAlbum : albumart) {
if (curAlbum.getId().equals(curSong.getAlbumId())) {
if (!curAlbum.getEmpty()) {
Drawable img = curAlbum.getImage();
albumArtView.setImageDrawable(img);
break;
}
}
}
songLay.setTag(ind);
return songLay;
}
public SongAdapter(Context c, ArrayList<Song> songs) {
this.songs = songs;
albumart = new ArrayList<>();
for(int i = 0; i < songs.size(); i++) {
Song curSong = songs.get(i);
boolean exists = false;
for(int j = 0; j < albumart.size(); j++) {
Album curAlbum = albumart.get(j);
if (curSong.getAlbumId().equals(curAlbum.getId())) {
exists = true;
break;
}
}
if (!exists) {
albumart.add(new Album(curSong.getAlbumId(), c));
}
}
songInf = LayoutInflater.from(c);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM17,13h-4v4h-2v-4L7,13v-2h4L11,7h2v4h4v2z"/>
</vector>

View File

@ -0,0 +1,10 @@
<vector android:height="24dp" android:viewportHeight="150.0"
android:viewportWidth="150.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillAlpha="1" android:fillColor="@color/categoryColor"
android:pathData="M13.26,51.77h87.74v87.74h-87.74z"
android:strokeAlpha="1" android:strokeColor="@color/categoryColor" android:strokeWidth="0"/>
<path android:fillAlpha="0" android:fillColor="#00000000"
android:pathData="M64.54,59.78a31.07,31.6 0,1 0,62.13 0a31.07,31.6 0,1 0,-62.13 0z"
android:strokeAlpha="1" android:strokeColor="@color/categoryColor"
android:strokeLineJoin="round" android:strokeWidth="31.97900009"/>
</vector>

View File

@ -0,0 +1,6 @@
<vector android:height="24dp" android:viewportHeight="256.0"
android:viewportWidth="256.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillAlpha="1" android:fillColor="#ffffff"
android:pathData="m153.37,61.16 l5.42,5.48c3.57,3.61 2.61,8.33 -0.72,11.69l-49.17,49.7 43.03,43.49 6.15,6.21c3.67,3.71 4.13,8.25 0.72,11.69l-5.42,5.48c-3.65,3.69 -8.54,2.33 -11.93,-1.1l-6.51,-6.58 -45.56,-46.05 -6.51,-6.58c-4.09,-4.13 -3.81,-9.3 -0,-13.16l6.51,-6.58 45.56,-46.05 6.51,-6.58c3.79,-3.83 8.42,-4.65 11.93,-1.1z"
android:strokeAlpha="1" android:strokeColor="#00000000" android:strokeWidth="0.86386615"/>
</vector>

View File

@ -0,0 +1,6 @@
<vector android:height="24dp" android:viewportHeight="256.0"
android:viewportWidth="256.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillAlpha="1" android:fillColor="#ffffff"
android:pathData="m102.63,61.16 l-5.42,5.48c-3.57,3.61 -2.61,8.33 0.72,11.69l49.17,49.7 -43.03,43.49 -6.15,6.21c-3.67,3.71 -4.13,8.25 -0.72,11.69l5.42,5.48c3.65,3.69 8.54,2.33 11.93,-1.1l6.51,-6.58 45.56,-46.05 6.51,-6.58c4.09,-4.13 3.81,-9.3 0,-13.16l-6.51,-6.58 -45.56,-46.05 -6.51,-6.58c-3.79,-3.83 -8.42,-4.65 -11.93,-1.1z"
android:strokeAlpha="1" android:strokeColor="#00000000" android:strokeWidth="0.86386615"/>
</vector>

View File

@ -0,0 +1,11 @@
<vector android:height="24dp" android:viewportHeight="150.0"
android:viewportWidth="150.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillAlpha="1" android:fillColor="@color/categoryColor"
android:pathData="m13.36,144.25a68.49,62.61 90,0 1,31.3 -59.31,68.49 62.61,90 0,1 62.61,0 68.49,62.61 90,0 1,31.3 59.31"
android:strokeAlpha="0" android:strokeColor="#000000"
android:strokeLineJoin="miter" android:strokeWidth="0"/>
<path android:fillAlpha="1" android:fillColor="@color/categoryColor"
android:pathData="M76.71,43.63m-36.35,0a36.35,36.35 0,1 1,72.7 0a36.35,36.35 0,1 1,-72.7 0"
android:strokeAlpha="0" android:strokeColor="#000000"
android:strokeLineJoin="miter" android:strokeWidth="0"/>
</vector>

View File

@ -0,0 +1,7 @@
<vector android:height="24dp" android:viewportHeight="150.0"
android:viewportWidth="150.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillAlpha="1" android:fillColor="@color/categoryColor"
android:pathData="m86.19,38.04v78.8c0,0 -14.78,28.76 -31.49,20.18 -16.71,-8.57 -8.03,-22.67 -1.29,-25.16 6.75,-2.49 13.5,-3.32 19.92,-1.66v-98.99c0,0 18.64,30.42 35.67,31.52 0,0 -17.07,1.75 -22.81,-4.7z"
android:strokeAlpha="1" android:strokeColor="@color/categoryColor"
android:strokeLineCap="butt" android:strokeLineJoin="miter" android:strokeWidth="0.29499999"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M3,18h18v-2L3,16v2zM3,13h18v-2L3,11v2zM3,6v2h18L21,6L3,6z"/>
</vector>

View File

@ -0,0 +1,15 @@
<vector android:height="24dp" android:viewportHeight="256.0"
android:viewportWidth="256.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillAlpha="1" android:fillColor="#4a4a4a"
android:pathData="m217,110.73c-0,-0.01 -0,-0.02 -0,-0.04 0,-0.01 0,-0.03 0,-0.04l-38.36,0C178.34,51.51 89.18,56.38 89.13,20.5l-27.45,0c0.09,58.25 89.22,50.64 89.52,90.16l-0.01,0c-0.06,35.89 -89.32,31.01 -89.51,90.24l27.43,0c0.14,-39.59 89.33,-31.96 89.53,-90.16"
android:strokeAlpha="1" android:strokeColor="#00000000" android:strokeWidth="1.36488235"/>
<path android:fillAlpha="1" android:fillColor="#4a4a4a"
android:pathData="m39,199 l72.55,-0 -36.28,36.5z"
android:strokeAlpha="1" android:strokeColor="#00000000"/>
<path android:fillAlpha="1" android:fillColor="#4a4a4a"
android:pathData="m39,110.66 l33.25,0c0.3,-59.14 94.57,-54.28 94.63,-90.16l27.45,0c-0.09,58.25 -94.33,50.64 -94.64,90.16l0.01,0c0.06,35.89 94.44,31.01 94.63,90.24l-27.43,0C166.75,161.31 72.45,168.93 72.25,110.73l-33.25,0 0,-0.04c-0,-0.01 33.25,-0.03 33.25,-0.04z"
android:strokeAlpha="1" android:strokeColor="#00000000" android:strokeWidth="1.36488235"/>
<path android:fillAlpha="1" android:fillColor="#4a4a4a"
android:pathData="m217,199 l-72.55,-0 36.28,36.5z"
android:strokeAlpha="1" android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,0.81 4.5,2.09C13.09,3.81 14.76,3 16.5,3 19.58,3 22,5.42 22,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M6.62,10.79c1.44,2.83 3.76,5.14 6.59,6.59l2.2,-2.2c0.27,-0.27 0.67,-0.36 1.02,-0.24 1.12,0.37 2.33,0.57 3.57,0.57 0.55,0 1,0.45 1,1V20c0,0.55 -0.45,1 -1,1 -9.39,0 -17,-7.61 -17,-17 0,-0.55 0.45,-1 1,-1h3.5c0.55,0 1,0.45 1,1 0,1.25 0.2,2.45 0.57,3.57 0.11,0.35 0.03,0.74 -0.25,1.02l-2.2,2.2z"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M19.43,12.98c0.04,-0.32 0.07,-0.64 0.07,-0.98s-0.03,-0.66 -0.07,-0.98l2.11,-1.65c0.19,-0.15 0.24,-0.42 0.12,-0.64l-2,-3.46c-0.12,-0.22 -0.39,-0.3 -0.61,-0.22l-2.49,1c-0.52,-0.4 -1.08,-0.73 -1.69,-0.98l-0.38,-2.65C14.46,2.18 14.25,2 14,2h-4c-0.25,0 -0.46,0.18 -0.49,0.42l-0.38,2.65c-0.61,0.25 -1.17,0.59 -1.69,0.98l-2.49,-1c-0.23,-0.09 -0.49,0 -0.61,0.22l-2,3.46c-0.13,0.22 -0.07,0.49 0.12,0.64l2.11,1.65c-0.04,0.32 -0.07,0.65 -0.07,0.98s0.03,0.66 0.07,0.98l-2.11,1.65c-0.19,0.15 -0.24,0.42 -0.12,0.64l2,3.46c0.12,0.22 0.39,0.3 0.61,0.22l2.49,-1c0.52,0.4 1.08,0.73 1.69,0.98l0.38,2.65c0.03,0.24 0.24,0.42 0.49,0.42h4c0.25,0 0.46,-0.18 0.49,-0.42l0.38,-2.65c0.61,-0.25 1.17,-0.59 1.69,-0.98l2.49,1c0.23,0.09 0.49,0 0.61,-0.22l2,-3.46c0.12,-0.22 0.07,-0.49 -0.12,-0.64l-2.11,-1.65zM12,15.5c-1.93,0 -3.5,-1.57 -3.5,-3.5s1.57,-3.5 3.5,-3.5 3.5,1.57 3.5,3.5 -1.57,3.5 -3.5,3.5z"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92 1.61,0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z" />
</vector>

View File

@ -0,0 +1,11 @@
<vector android:height="24dp" android:viewportHeight="150.0"
android:viewportWidth="150.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillAlpha="1" android:fillColor="#ffffff"
android:pathData="M33.96,24.63h29.44v101.09h-29.44z"
android:strokeAlpha="1" android:strokeColor="#ffffff"
android:strokeLineJoin="miter" android:strokeWidth="0"/>
<path android:fillAlpha="1" android:fillColor="#ffffff"
android:pathData="M87.78,24.63h29.44v101.09h-29.44z"
android:strokeAlpha="1" android:strokeColor="#ffffff"
android:strokeLineJoin="miter" android:strokeWidth="0"/>
</vector>

View File

@ -0,0 +1,15 @@
<vector android:height="24dp" android:viewportHeight="150.0"
android:viewportWidth="150.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillAlpha="1" android:fillColor="@color/colorPrimary"
android:pathData="M74.93,74.95m-72.97,0a72.97,72.97 0,1 1,145.95 0a72.97,72.97 0,1 1,-145.95 0"
android:strokeAlpha="0" android:strokeColor="#00000000"
android:strokeLineJoin="miter" android:strokeWidth="0"/>
<path android:fillAlpha="1" android:fillColor="#ffffff"
android:pathData="M46.67,43.52h19.64v67.45h-19.64z"
android:strokeAlpha="1" android:strokeColor="#00000000"
android:strokeLineJoin="miter" android:strokeWidth="0"/>
<path android:fillAlpha="1" android:fillColor="#ffffff"
android:pathData="M83.71,43.52h19.64v67.45h-19.64z"
android:strokeAlpha="1" android:strokeColor="#00000000"
android:strokeLineJoin="miter" android:strokeWidth="0"/>
</vector>

View File

@ -0,0 +1,7 @@
<vector android:height="24dp" android:viewportHeight="150.0"
android:viewportWidth="150.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillAlpha="1" android:fillColor="#ffffff"
android:pathData="M36.58,4.86 L129.37,75.18 36.58,145.5Z"
android:strokeAlpha="1" android:strokeColor="#ffffff"
android:strokeLineCap="butt" android:strokeLineJoin="miter" android:strokeWidth="0"/>
</vector>

View File

@ -0,0 +1,10 @@
<vector android:height="24dp" android:viewportHeight="150.0"
android:viewportWidth="150.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillAlpha="1" android:fillColor="#646464"
android:pathData="M41.88,108.56 L94.25,75.05C76.8,63.89 59.35,52.72 41.89,41.56Z"
android:strokeAlpha="1" android:strokeColor="#00000000"
android:strokeLineCap="butt" android:strokeLineJoin="miter" android:strokeWidth="0.21653356"/>
<path android:fillAlpha="1" android:fillColor="#646464"
android:pathData="M95.16,41.56h14.53v67h-14.53z"
android:strokeAlpha="1" android:strokeColor="#00000000" android:strokeWidth="5.24107981"/>
</vector>

View File

@ -0,0 +1,10 @@
<vector android:height="24dp" android:viewportHeight="150.0"
android:viewportWidth="150.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillAlpha="1" android:fillColor="#646464"
android:pathData="M108.52,109.15 L56.15,75.65C73.6,64.48 91.06,53.32 108.51,42.15Z"
android:strokeAlpha="1" android:strokeColor="#00000000"
android:strokeLineCap="butt" android:strokeLineJoin="miter" android:strokeWidth="0.43306711"/>
<path android:fillAlpha="1" android:fillColor="#646464"
android:pathData="M55.24,42.15l-14.53,0l0,67l14.53,0z"
android:strokeAlpha="1" android:strokeColor="#00000000" android:strokeWidth="10.48215961"/>
</vector>

View File

@ -0,0 +1,11 @@
<vector android:height="24dp" android:viewportHeight="150.0"
android:viewportWidth="150.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillAlpha="1" android:fillColor="@color/colorAccent"
android:pathData="M74.93,74.95m-72.97,0a72.97,72.97 0,1 1,145.95 0a72.97,72.97 0,1 1,-145.95 0"
android:strokeAlpha="0" android:strokeColor="#00000000"
android:strokeLineJoin="miter" android:strokeWidth="0"/>
<path android:fillAlpha="1" android:fillColor="#ffffff"
android:pathData="m56.61,38.54 l52.93,38.47 -52.93,38.47z"
android:strokeAlpha="0" android:strokeColor="#00000000"
android:strokeLineCap="butt" android:strokeLineJoin="miter" android:strokeWidth="0"/>
</vector>

View File

@ -0,0 +1,27 @@
<vector android:height="24dp" android:viewportHeight="150.0"
android:viewportWidth="150.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillAlpha="1" android:fillColor="@color/categoryColor"
android:pathData="M43.36,24.63h97.69v15.64h-97.69z"
android:strokeAlpha="1" android:strokeColor="@color/categoryColor"
android:strokeLineJoin="miter" android:strokeWidth="8.33329391"/>
<path android:fillAlpha="1" android:fillColor="@color/categoryColor"
android:pathData="M7.89,22.45h18.81v19.85h-18.81z"
android:strokeAlpha="1" android:strokeColor="@color/categoryColor"
android:strokeLineJoin="miter" android:strokeWidth="4.12018204"/>
<path android:fillAlpha="1" android:fillColor="@color/categoryColor"
android:pathData="M43.36,68.21h97.69v15.64h-97.69z"
android:strokeAlpha="1" android:strokeColor="@color/categoryColor"
android:strokeLineJoin="miter" android:strokeWidth="8.33329391"/>
<path android:fillAlpha="1" android:fillColor="@color/categoryColor"
android:pathData="M7.89,66.03h18.81v19.85h-18.81z"
android:strokeAlpha="1" android:strokeColor="@color/categoryColor"
android:strokeLineJoin="miter" android:strokeWidth="4.12018204"/>
<path android:fillAlpha="1" android:fillColor="@color/categoryColor"
android:pathData="M43.34,111.42h97.69v15.64h-97.69z"
android:strokeAlpha="1" android:strokeColor="@color/categoryColor"
android:strokeLineJoin="miter" android:strokeWidth="8.33329391"/>
<path android:fillAlpha="1" android:fillColor="@color/categoryColor"
android:pathData="M7.88,109.24h18.81v19.85h-18.81z"
android:strokeAlpha="1" android:strokeColor="@color/categoryColor"
android:strokeLineJoin="miter" android:strokeWidth="4.12018204"/>
</vector>

View File

@ -0,0 +1,17 @@
<vector android:height="24dp" android:viewportHeight="256.0"
android:viewportWidth="256.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillAlpha="1" android:fillColor="#646464"
android:pathData="m169.36,10.14 l76.83,75.69v-75.69z"
android:strokeAlpha="1" android:strokeColor="#00000000" android:strokeWidth="1.88971829"/>
<path android:fillAlpha="1" android:fillColor="#646464"
android:pathData="m244.24,166.01 l-78.3,79.48h78.3z"
android:strokeAlpha="1" android:strokeColor="#00000000" android:strokeWidth="1.95493877"/>
<path android:fillAlpha="1" android:fillColor="#f9f9f9"
android:pathData="M231.98,232.02 L23.65,23.69"
android:strokeAlpha="1" android:strokeColor="#646464"
android:strokeLineCap="butt" android:strokeLineJoin="miter" android:strokeWidth="24.74979401"/>
<path android:fillColor="#00000000"
android:pathData="M231.32,23.69 L22.99,232.02"
android:strokeAlpha="1" android:strokeColor="#646464"
android:strokeLineCap="butt" android:strokeLineJoin="miter" android:strokeWidth="24.74999871"/>
</vector>

View File

@ -0,0 +1,17 @@
<vector android:height="24dp" android:viewportHeight="256.0"
android:viewportWidth="256.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillAlpha="1" android:fillColor="#ffffff"
android:pathData="m169.36,10.14 l76.83,75.69v-75.69z"
android:strokeAlpha="1" android:strokeColor="#00000000" android:strokeWidth="1.88971829"/>
<path android:fillAlpha="1" android:fillColor="#ffffff"
android:pathData="m244.24,166.01 l-78.3,79.48h78.3z"
android:strokeAlpha="1" android:strokeColor="#00000000" android:strokeWidth="1.95493877"/>
<path android:fillAlpha="1" android:fillColor="#ffffff"
android:pathData="M231.98,232.02 L23.65,23.69"
android:strokeAlpha="1" android:strokeColor="#ffffff"
android:strokeLineCap="butt" android:strokeLineJoin="miter" android:strokeWidth="24.74979401"/>
<path android:fillColor="#00000000"
android:pathData="M231.32,23.69 L22.99,232.02"
android:strokeAlpha="1" android:strokeColor="#ffffff"
android:strokeLineCap="butt" android:strokeLineJoin="miter" android:strokeWidth="24.74999871"/>
</vector>

View File

@ -0,0 +1,19 @@
<vector android:height="24dp" android:viewportHeight="150.0"
android:viewportWidth="150.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillAlpha="1" android:fillColor="#646464"
android:pathData="M79.92,28.82h41.26v41.26h-41.26z"
android:strokeAlpha="0" android:strokeColor="#00000000"
android:strokeLineJoin="miter" android:strokeWidth="0"/>
<path android:fillAlpha="1" android:fillColor="#646464"
android:pathData="M28.82,28.82h41.26v41.26h-41.26z"
android:strokeAlpha="0" android:strokeColor="#00000000"
android:strokeLineJoin="miter" android:strokeWidth="0"/>
<path android:fillAlpha="1" android:fillColor="#646464"
android:pathData="M79.92,79.92h41.26v41.26h-41.26z"
android:strokeAlpha="0" android:strokeColor="#00000000"
android:strokeLineJoin="miter" android:strokeWidth="0"/>
<path android:fillAlpha="1" android:fillColor="#646464"
android:pathData="M28.82,79.92h41.26v41.26h-41.26z"
android:strokeAlpha="0" android:strokeColor="#00000000"
android:strokeLineJoin="miter" android:strokeWidth="0"/>
</vector>

View File

@ -0,0 +1,13 @@
<vector android:height="24dp" android:viewportHeight="150.0"
android:viewportWidth="150.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillAlpha="1" android:fillColor="@color/categoryColor"
android:pathData="m37.89,1.95 l-25.82,70.92h9.57l6.95,-19.77h30.68l6.96,19.77L76.28,72.87L50.46,1.95ZM43.94,10.19 L56.37,45L31.46,45Z"
android:strokeColor="#00000000" android:strokeWidth="0.29265663"/>
<path android:fillAlpha="1" android:fillColor="@color/categoryColor"
android:pathData="m76.29,79.73v8.07h40.31l-41.87,51.77v8.44h53.29v-8.07L84.73,139.94l42.28,-52v-8.21z"
android:strokeColor="#00000000" android:strokeWidth="0.28173923"/>
<path android:fillAlpha="1" android:fillColor="@color/categoryColor"
android:pathData="m29.39,78.56c0,0 0.66,38.74 31.28,37.89v11.62L78.34,110.41 60.71,92.78v14.22c0,0 -22.16,1.04 -23.58,-28.44z"
android:strokeAlpha="0" android:strokeColor="#252525"
android:strokeLineCap="butt" android:strokeLineJoin="miter" android:strokeWidth="0.26458332"/>
</vector>

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#AAFFFFFF">
<item android:id="@android:id/mask">
<shape android:shape="oval">
<solid android:color="#AAFFFFFF" />
</shape>
</item>
</ripple>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="?android:colorControlHighlight">
<item android:id="@android:id/mask">
<shape android:shape="oval">
<solid android:color="#CC000000" />
</shape>
</item>
</ripple>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="?android:colorControlHighlight">
<item android:id="@android:id/mask">
<shape android:shape="rectangle">
<solid android:color="#CC000000" />
</shape>
</item>
</ripple>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#AAFFFFFF">
<item android:id="@android:id/mask">
<shape android:shape="rectangle">
<solid android:color="#AAFFFFFF" />
</shape>
</item>
</ripple>

View File

@ -0,0 +1,8 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:angle="135"
android:endColor="#55BBBB"
android:startColor="#116A6A"
android:type="linear" />
</shape>

View File

@ -0,0 +1,105 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false">
<android.support.constraint.ConstraintLayout
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@+id/navigation"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginTop="0dp"
app:layout_constraintTop_toBottomOf="@+id/include"
android:clipChildren="true"
android:id="@+id/constraintLayout">
<ViewFlipper
android:id="@+id/flipper"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.49">
<include layout="@layout/view_albums"/>
<include layout="@layout/view_playlists"/>
<include layout="@layout/view_tracks"/>
<include layout="@layout/view_artists"/>
<include layout="@layout/view_genres"/>
</ViewFlipper>
</android.support.constraint.ConstraintLayout>
<android.support.design.widget.BottomNavigationView
android:id="@+id/navigation"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="?android:attr/windowBackground"
android:clipChildren="true"
app:elevation="4dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.985"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_editor_absoluteX="0dp"
app:layout_editor_absoluteY="0dp"
app:menu="@menu/navigation">
</android.support.design.widget.BottomNavigationView>
<include
layout="@layout/main_toolbar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:clipChildren="false"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:id="@+id/include"/>
<android.support.design.widget.FloatingActionButton
android:id="@+id/floatingActionButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginRight="8dp"
android:clickable="true"
app:elevation="4dp"
app:fabSize="normal"
android:onClick="shuffleAll"
app:layout_constraintBottom_toBottomOf="@+id/constraintLayout"
app:layout_constraintRight_toRightOf="parent"
app:srcCompat="@drawable/ic_shuffle_white"/>
</android.support.constraint.ConstraintLayout>
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:headerLayout="@layout/activity_main_drawer_header"
app:menu="@menu/activity_main_drawer"/>
</android.support.v4.widget.DrawerLayout>

View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/side_nav_bar"
android:gravity="bottom"
android:orientation="vertical"
android:paddingBottom="4dp"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:paddingTop="4dp"
android:theme="@style/ThemeOverlay.AppCompat.Dark"
android:weightSum="1">
<ImageView
android:id="@+id/imageView"
android:layout_width="110dp"
android:layout_height="110dp"
android:layout_gravity="center"
android:layout_marginTop="8dp"
android:layout_marginBottom="6dp"
app:srcCompat="@drawable/logo_hires"
android:antialias="true"
android:contentDescription="@string/title_activity_main"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:layout_gravity="center"
android:text="@string/title_activity_main"
android:textAppearance="@style/TextAppearance.AppCompat.Body1" />
</LinearLayout>

View File

@ -0,0 +1,179 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".PlayerActivity"
android:clipChildren="false">
<include
layout="@layout/player_toolbar"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:id="@+id/toolbar"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="0dp"
/>
<ImageView
android:id="@+id/album_cover"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginLeft="0dp"
android:layout_marginRight="0dp"
android:layout_marginTop="0dp"
android:backgroundTint="?android:colorBackground"
android:contentDescription="@string/album_art"
android:scaleType="centerCrop"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/toolbar"
app:srcCompat="@drawable/ic_album"
android:layout_marginBottom="0dp"
app:layout_constraintBottom_toTopOf="@+id/constraintLayout2"
app:layout_constraintVertical_bias="0.0"/>
<android.support.constraint.ConstraintLayout
android:id="@+id/constraintLayout2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="-1dp"
android:layout_marginEnd="0dp"
android:layout_marginStart="0dp"
android:background="#FFFFFF"
android:clipChildren="true"
android:elevation="12dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent">
<ImageButton
android:id="@+id/button_shuffle"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginBottom="20dp"
android:layout_marginEnd="12dp"
android:background="@drawable/ripple_oval_dark"
android:contentDescription="@string/shuffle_state"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="w,1:1"
app:layout_constraintRight_toLeftOf="@+id/button_previous"
app:srcCompat="@drawable/ic_shuffle_flat"/>
<ImageButton
android:id="@+id/button_previous"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_marginBottom="16dp"
android:layout_marginEnd="16dp"
android:layout_marginStart="8dp"
android:background="@drawable/ic_play_prev"
android:clickable="true"
android:contentDescription="@string/previous_song"
android:elevation="4dp"
android:onClick="previousSong"
android:scaleType="fitCenter"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="w,1:1"
app:layout_constraintRight_toLeftOf="@+id/button_playpause"
app:srcCompat="@drawable/ripple_oval_dark"/>
<ImageButton
android:id="@+id/button_playpause"
android:layout_width="76dp"
android:layout_height="76dp"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:background="@drawable/ic_pausecircle"
android:clickable="true"
android:contentDescription="@string/play_pause"
android:elevation="4dp"
android:onClick="togglePlaying"
android:scaleType="centerCrop"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="w,1:1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:srcCompat="@drawable/ripple_oval"/>
<ImageButton
android:id="@+id/button_next"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_marginBottom="16dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="16dp"
android:background="@drawable/ic_play_next"
android:clickable="true"
android:contentDescription="@string/next_song"
android:elevation="4dp"
android:onClick="nextSong"
android:scaleType="fitCenter"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="w,1:1"
app:layout_constraintLeft_toRightOf="@+id/button_playpause"
app:srcCompat="@drawable/ripple_oval_dark"/>
<ImageButton
android:id="@+id/button_repeat"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginBottom="20dp"
android:layout_marginStart="12dp"
android:background="@drawable/ripple_oval_dark"
android:contentDescription="@string/repeat_state"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="w,1:1"
app:layout_constraintLeft_toRightOf="@+id/button_next"
app:srcCompat="@mipmap/ic_repeat"/>
<TextView
android:id="@+id/current_time"
android:layout_width="36dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="11dp"
android:text="@string/no_time"
app:layout_constraintDimensionRatio="w,1:1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<SeekBar
android:id="@+id/song_seekbar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="0dp"
android:layout_marginLeft="0dp"
android:layout_marginRight="0dp"
android:layout_marginTop="4dp"
android:paddingBottom="10dp"
android:paddingTop="10dp"
app:layout_constraintBottom_toTopOf="@+id/button_playpause"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toRightOf="@+id/current_time"
app:layout_constraintRight_toLeftOf="@+id/song_duration"
app:layout_constraintTop_toTopOf="parent"/>
<TextView
android:id="@+id/song_duration"
android:layout_width="36dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginTop="11dp"
android:text="@string/no_time"
app:layout_constraintDimensionRatio="w,1:1"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
</android.support.constraint.ConstraintLayout>
</android.support.constraint.ConstraintLayout>

View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.aurailus.caninemusic.QueueActivity">
<include
android:id="@+id/toolbar"
layout="@layout/queue_toolbar"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
<ListView
android:id="@+id/song_list"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:clipChildren="true"
android:dividerHeight="1sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintVertical_bias="0.0"
android:layout_marginTop="0dp"
app:layout_constraintTop_toBottomOf="@+id/toolbar"/>
</android.support.constraint.ConstraintLayout>

View File

@ -0,0 +1,73 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/ripple_rectangle"
android:clickable="true"
android:clipChildren="false"
android:onClick="chooseAlbum"
android:orientation="vertical"
android:weightSum="1">
<android.support.constraint.ConstraintLayout
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintDimensionRatio="w,1:1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintBottom_toTopOf="@+id/album_title"
android:layout_marginTop="12dp"
android:layout_marginStart="12dp"
android:layout_marginEnd="12dp"
android:layout_marginBottom="6dp">
<ImageView
android:id="@+id/album_art"
android:layout_width="0dp"
android:layout_height="0dp"
android:adjustViewBounds="true"
android:contentDescription="@string/album_art"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_album"/>
<!--<ImageButton
android:id="@+id/overflow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@mipmap/ic_overflow"
android:clickable="true"
android:contentDescription="Overflow"
android:cropToPadding="false"
android:elevation="0dp"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ripple_oval_dark"
/>-->
</android.support.constraint.ConstraintLayout>
<TextView
android:id="@+id/album_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:maxLines="1"
android:minLines="1"
android:text="@string/unknown_data"
android:textColor="#333333"
android:textAlignment="center"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="12dp"/>
</android.support.constraint.ConstraintLayout>

View File

@ -0,0 +1,125 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/ripple_rectangle"
android:clickable="true"
android:onClick="chooseAlbum"
android:orientation="vertical"
android:weightSum="1">
<ImageView
android:id="@+id/album_art"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginBottom="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_weight="2.70"
android:adjustViewBounds="true"
android:contentDescription="@string/album_art"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"
app:srcCompat="@drawable/ic_album" />
<TextView
android:id="@+id/album_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:maxLines="1"
android:minLines="1"
android:text="@string/unknown_data"
android:textColor="#333333"
android:textSize="20sp"
app:layout_constraintLeft_toRightOf="@+id/album_art"
app:layout_constraintRight_toLeftOf="@+id/album_length"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/album_artist"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginStart="8dp"
android:ellipsize="end"
android:maxLines="1"
android:minLines="1"
android:scrollHorizontally="true"
android:text="@string/unknown_data"
android:textColor="#333333"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toLeftOf="@+id/album_plays"
app:layout_constraintLeft_toRightOf="@+id/album_art"
app:layout_constraintTop_toBottomOf="@+id/album_title"
app:layout_constraintVertical_bias="0.0"
android:layout_marginLeft="8dp"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintHorizontal_chainStyle="packed"/>
<TextView
android:id="@+id/album_plays"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="0dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="16dp"
android:layout_marginTop="0dp"
android:ellipsize="end"
android:maxLines="1"
android:minLines="1"
android:scrollHorizontally="true"
android:text="@string/unknown_data"
android:textColor="#333333"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toRightOf="@+id/album_artist"
app:layout_constraintRight_toLeftOf="@+id/album_length"
app:layout_constraintTop_toBottomOf="@+id/album_title"
app:layout_constraintVertical_bias="0.0"/>
<TextView
android:id="@+id/album_length"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginEnd="0dp"
android:layout_marginStart="4dp"
android:layout_marginTop="8dp"
android:maxLines="1"
android:minLines="1"
android:text="@string/no_time"
android:textAppearance="@style/TextAppearance.AppCompat.SearchResult.Subtitle"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toLeftOf="@+id/overflow"
app:layout_constraintTop_toTopOf="parent" />
<ImageButton
android:id="@+id/overflow"
android:layout_width="44dp"
android:layout_height="0dp"
android:layout_marginBottom="8dp"
android:layout_marginEnd="0dp"
android:layout_marginTop="8dp"
android:background="@mipmap/ic_overflow"
android:clickable="true"
android:contentDescription="@string/overflow"
android:cropToPadding="false"
android:elevation="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.5"
app:srcCompat="@drawable/ripple_oval_dark" />
</android.support.constraint.ConstraintLayout>

View File

@ -0,0 +1,124 @@
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="?attr/colorPrimary"
android:id="@+id/toolbar"
android:elevation="4dp"
android:clipChildren="false">
<android.support.constraint.ConstraintLayout
android:id="@+id/main_toolbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:minHeight="?attr/actionBarSize"
android:background="@drawable/ripple_rectangle_light"
android:clickable="true"
android:onClick="openPlayer"
android:elevation="4dp"
app:srcCompat="@drawable/ripple_rectangle_light">
<ImageButton
android:id="@+id/open_drawer"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginBottom="8dp"
android:layout_marginStart="4dp"
android:layout_marginTop="8dp"
android:background="@drawable/ripple_oval"
android:onClick="openDrawer"
android:padding="5dp"
android:scaleType="fitXY"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="w,1:1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"
app:srcCompat="@drawable/ic_hamburger"/>
<ImageView
android:id="@+id/current_albumart"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginBottom="4dp"
android:layout_marginTop="4dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="w,1:1"
app:layout_constraintLeft_toRightOf="@+id/open_drawer"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/logo_hires"/>
<android.support.constraint.ConstraintLayout
android:id="@+id/playing_details"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginBottom="4dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="4dp"
android:layout_marginTop="4dp"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toRightOf="@+id/current_albumart"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0">
<TextView
android:id="@+id/current_artist"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="6dp"
android:layout_marginEnd="0dp"
android:layout_marginStart="0dp"
android:maxLines="1"
android:minLines="1"
android:text="@string/unknown_data"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
android:textColor="#ffffff"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/current_title"
app:layout_constraintVertical_bias="0.0"/>
<TextView
android:id="@+id/current_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="0dp"
android:layout_marginStart="0dp"
android:layout_marginTop="0dp"
android:maxLines="1"
android:minLines="1"
android:text="@string/unknown_data"
android:textAppearance="@style/TextAppearance.AppCompat.Headline"
android:textColor="#ffffff"
android:textSize="22sp"
android:visibility="visible"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
</android.support.constraint.ConstraintLayout>
<TextView
android:id="@+id/app_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="4dp"
android:text="@string/title_activity_main"
android:textAppearance="@style/TextAppearance.AppCompat.Headline"
android:textColor="#ffffff"
android:textSize="26sp"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@+id/current_albumart"
app:layout_constraintTop_toTopOf="parent"/>
</android.support.constraint.ConstraintLayout>
</LinearLayout>

View File

@ -0,0 +1,81 @@
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:elevation="5dp"
android:id="@+id/layout" >
<android.support.constraint.ConstraintLayout
android:id="@+id/player_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="0dp"
android:layout_marginRight="0dp"
android:layout_marginTop="0dp"
android:background="?attr/colorPrimary"
android:elevation="5dp"
android:minHeight="?attr/actionBarSize"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
android:weightSum="1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageButton
android:id="@+id/open_drawer"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginBottom="8dp"
android:layout_marginStart="4dp"
android:layout_marginTop="8dp"
android:background="@drawable/ic_arrow_back"
android:contentDescription="@string/back"
android:onClick="back"
android:title="@string/back"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="w,1:1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ripple_oval" />
<TextView
android:id="@+id/song_title"
android:minLines="1"
android:maxLines="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="4dp"
android:layout_marginEnd="8dp"
android:layout_marginTop="4dp"
android:text="@string/unknown_data"
android:textAppearance="@style/TextAppearance.AppCompat.Headline"
android:textSize="22sp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toRightOf="@+id/open_drawer"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintHorizontal_bias="0.502" />
<TextView
android:id="@+id/song_artist"
android:minLines="1"
android:maxLines="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:layout_marginStart="4dp"
android:layout_marginEnd="8dp"
android:text="@string/unknown_data"
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@+id/open_drawer"
android:layout_marginTop="0dp"
app:layout_constraintTop_toBottomOf="@+id/song_title"
app:layout_constraintVertical_bias="0.0"
app:layout_constraintRight_toRightOf="parent" />
</android.support.constraint.ConstraintLayout>
</LinearLayout>

View File

@ -0,0 +1,60 @@
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:elevation="5dp"
android:id="@+id/layout" >
<android.support.constraint.ConstraintLayout
android:id="@+id/player_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="0dp"
android:layout_marginRight="0dp"
android:layout_marginTop="0dp"
android:background="?attr/colorPrimary"
android:elevation="5dp"
android:minHeight="?attr/actionBarSize"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
android:weightSum="1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageButton
android:id="@+id/back_button"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginBottom="8dp"
android:layout_marginStart="4dp"
android:layout_marginTop="8dp"
android:background="@drawable/ic_arrow_back"
android:contentDescription="@string/back"
android:onClick="back"
android:title="@string/back"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="w,1:1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ripple_oval"/>
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:text="@string/title_activity_queue"
android:textAppearance="@style/TextAppearance.AppCompat.Headline"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toRightOf="@+id/back_button"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
</android.support.constraint.ConstraintLayout>
</LinearLayout>

View File

@ -0,0 +1,103 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/ripple_rectangle"
android:clickable="true"
android:onClick="chooseSong"
android:orientation="vertical"
android:weightSum="1">
<ImageView
android:id="@+id/album_art"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginBottom="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_weight="2.70"
android:adjustViewBounds="true"
android:contentDescription="@string/album_art"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"
app:srcCompat="@drawable/ic_album" />
<TextView
android:id="@+id/song_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:maxLines="1"
android:minLines="1"
android:text="@string/unknown_data"
android:textColor="#333333"
android:textSize="20sp"
app:layout_constraintLeft_toRightOf="@+id/album_art"
app:layout_constraintRight_toLeftOf="@+id/song_duration"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/song_artist"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginStart="8dp"
android:ellipsize="end"
android:maxLines="1"
android:minLines="1"
android:scrollHorizontally="true"
android:text="@string/unknown_data"
android:textColor="#333333"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@+id/album_art"
app:layout_constraintRight_toLeftOf="@+id/song_duration"
app:layout_constraintTop_toBottomOf="@+id/song_title"
app:layout_constraintVertical_bias="0.0" />
<TextView
android:id="@+id/song_duration"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginEnd="0dp"
android:layout_marginStart="4dp"
android:layout_marginTop="8dp"
android:maxLines="1"
android:minLines="1"
android:text="@string/no_time"
android:textAppearance="@style/TextAppearance.AppCompat.SearchResult.Subtitle"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toLeftOf="@+id/overflow"
app:layout_constraintTop_toTopOf="parent" />
<ImageButton
android:id="@+id/overflow"
android:layout_width="44dp"
android:layout_height="0dp"
android:layout_marginBottom="8dp"
android:layout_marginEnd="0dp"
android:layout_marginTop="8dp"
android:background="@mipmap/ic_overflow"
android:clickable="true"
android:contentDescription="@string/overflow"
android:cropToPadding="false"
android:elevation="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.5"
app:srcCompat="@drawable/ripple_oval_dark" />
</android.support.constraint.ConstraintLayout>

View File

@ -0,0 +1,106 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false">
<ViewSwitcher
android:id="@+id/album_switcher"
android:layout_width="0dp"
android:layout_height="0dp"
android:clipChildren="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/constraintLayout3">
<GridView
android:id="@+id/album_grid"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipChildren="false"
android:columnWidth="120dp"
android:horizontalSpacing="0dp"
android:numColumns="auto_fit"
android:stretchMode="columnWidth"
android:verticalSpacing="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"/>
<ListView
android:id="@+id/album_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="0dp"
android:layout_marginLeft="0dp"
android:layout_marginRight="0dp"
android:layout_marginTop="0dp"
android:clipChildren="true"
android:dividerHeight="1sp"/>
</ViewSwitcher>
<android.support.constraint.ConstraintLayout
android:id="@+id/constraintLayout3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="?android:colorBackground"
android:clipChildren="false"
android:elevation="4dp"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/albums"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:layout_marginLeft="16dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginBottom="8dp"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="8dp"/>
<TextView
android:id="@+id/album_view_mode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
android:layout_marginTop="8dp"
android:text="@string/grid_mode"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toLeftOf="@+id/albumViewSwitch"
app:layout_constraintTop_toTopOf="parent"/>
<ImageButton
android:id="@+id/albumViewSwitch"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
android:layout_marginTop="8dp"
android:background="@drawable/ripple_oval_dark"
android:elevation="0dp"
android:onClick="switchAlbumView"
android:scaleType="fitXY"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_switchviews"/>
</android.support.constraint.ConstraintLayout>
</android.support.constraint.ConstraintLayout>

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginTop="8dp"
android:text="@string/artists"
android:textAppearance="@style/TextAppearance.AppCompat.Display1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
</android.support.constraint.ConstraintLayout>

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginTop="8dp"
android:text="@string/genres"
android:textAppearance="@style/TextAppearance.AppCompat.Display1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
</android.support.constraint.ConstraintLayout>

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginTop="8dp"
android:text="@string/playlists"
android:textAppearance="@style/TextAppearance.AppCompat.Display1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
</android.support.constraint.ConstraintLayout>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/song_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="0dp"
android:layout_marginLeft="0dp"
android:layout_marginRight="0dp"
android:layout_marginTop="0dp"
android:clipChildren="true"
android:dividerHeight="1sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
</android.support.constraint.ConstraintLayout>

View File

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/nav_id3"
android:icon="@drawable/ic_menu_edit"
android:title="@string/nav_id3" />
<item android:id="@+id/nav_settings"
android:icon="@drawable/ic_menu_settings"
android:title="@string/nav_settings" />
<item android:id="@+id/nav_ringtone"
android:icon="@drawable/ic_menu_ringtone"
android:title="@string/nav_ringtone" />
<item android:id="@+id/nav_import"
android:icon="@drawable/ic_arrow_right"
android:title="@string/nav_import" />
<item android:id="@+id/nav_share"
android:icon="@drawable/ic_menu_share"
android:title="@string/nav_share" />
<item android:title="@string/pinned_items"
android:id="@+id/pinned_items">
<menu android:id="@+id/pinned_group">
<item
android:id="@+id/add_pin"
android:icon="@drawable/ic_add_circle"
android:title="@string/add_pin" />
</menu>
</item>
<item android:title="@string/extra_items">
<menu>
<item android:id="@+id/nav_rate"
android:icon="@drawable/ic_menu_rate"
android:title="@string/nav_rate" />
<item android:id="@+id/nav_about"
android:icon="@drawable/ic_artist"
android:title="@string/nav_about" />
</menu>
</item>
</menu>

View File

@ -0,0 +1,10 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.aurailus.caninemusic.QueueActivity">
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:title="@string/action_settings"
app:showAsAction="never"/>
</menu>

View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/nav_album"
android:icon="@drawable/ic_album"
android:title="@string/albums" />
<item
android:id="@+id/nav_playlist"
android:icon="@drawable/ic_playlist"
android:title="@string/playlists" />
<item
android:id="@+id/nav_track"
android:icon="@drawable/ic_track"
android:title="@string/tracks" />
<item
android:id="@+id/nav_artist"
android:icon="@drawable/ic_artist"
android:title="@string/artists" />
<item
android:id="@+id/nav_genre"
android:icon="@drawable/ic_genre"
android:title="@string/genres" />
</menu>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 450 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 761 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 538 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 933 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Some files were not shown because too many files have changed in this diff Show More