Laptop push
|
@ -0,0 +1,9 @@
|
|||
*.iml
|
||||
.gradle
|
||||
/local.properties
|
||||
/.idea/workspace.xml
|
||||
/.idea/libraries
|
||||
.DS_Store
|
||||
/build
|
||||
/captures
|
||||
.externalNativeBuild
|
|
@ -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>
|
|
@ -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>
|
|
@ -0,0 +1,3 @@
|
|||
<component name="CopyrightManager">
|
||||
<settings default="" />
|
||||
</component>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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
|
|
@ -0,0 +1 @@
|
|||
/build
|
|
@ -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'
|
||||
}
|
|
@ -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
|
|
@ -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());
|
||||
}
|
||||
}
|
|
@ -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>
|
After Width: | Height: | Size: 68 KiB |
After Width: | Height: | Size: 68 KiB |
After Width: | Height: | Size: 5.3 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 8.9 KiB |
|
@ -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; }
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 1.3 KiB |
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
After Width: | Height: | Size: 97 KiB |
After Width: | Height: | Size: 1.5 KiB |
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
After Width: | Height: | Size: 3.9 KiB |
After Width: | Height: | Size: 3.9 KiB |
After Width: | Height: | Size: 450 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 272 B |
After Width: | Height: | Size: 761 B |
After Width: | Height: | Size: 5.8 KiB |
After Width: | Height: | Size: 5.8 KiB |
After Width: | Height: | Size: 538 B |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 933 B |
After Width: | Height: | Size: 2.5 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 16 KiB |