diff --git a/app/app.iml b/app/app.iml
index 8b4c814..7dff500 100644
--- a/app/app.iml
+++ b/app/app.iml
@@ -17,7 +17,7 @@
-
+
@@ -26,7 +26,7 @@
-
+
@@ -151,6 +151,7 @@
+
diff --git a/app/build.gradle b/app/build.gradle
index 9be88c6..60132c3 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -39,4 +39,5 @@ dependencies {
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
+ implementation 'com.android.support:cardview-v7:28.0.0'
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index abc50de..f3a3a4c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -11,6 +11,15 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
+
+
+ ): Boolean {
+ val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
+
+ for (service in activityManager.getRunningServices(Integer.MAX_VALUE)) {
+ if (serviceClass.name == service.service.className) {
+ return true
+ }
+ }
+ return false
+ }
+ protected val mConnection = object : ServiceConnection {
+ override fun onServiceConnected(className: ComponentName, service: IBinder) {
+ resetControls()
+
+ runBlocking {
+ val demo = launch {
+ musicService = (service as MusicService.LocalBinder).service
+ initializeChangeListeners()
+ updateTrackProgress()
+ }
+ demo.start()
+ }
+ if (musicService != null) {
+ if (musicService!!.isPlaying()) {
+ configureTrackDisplay()
+ }
+ }
+ }
+
+ override fun onServiceDisconnected(className: ComponentName) {
+ resetControls()
+ Toast.makeText(
+ this@BaseServiceActivity, "Music Service Stopped",
+ Toast.LENGTH_SHORT
+ ).show()
+ }
+ }
+ protected fun doBindService() {
+ val intent = Intent(this, MusicService::class.java)
+ if (isServiceRunning(MusicService::class.java)) {
+ val suc = "Service is already running"
+ }
+ else {
+ startService(intent)
+ }
+
+ var result = bindService(intent, mConnection, Context.BIND_AUTO_CREATE)
+ if (result) {
+ }
+ else {
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/mear/activities/MainActivity.kt b/app/src/main/java/com/example/mear/activities/MainActivity.kt
index a05fc01..5056c82 100644
--- a/app/src/main/java/com/example/mear/activities/MainActivity.kt
+++ b/app/src/main/java/com/example/mear/activities/MainActivity.kt
@@ -1,24 +1,15 @@
package com.example.mear.activities
-import android.app.ActivityManager
-import android.content.ComponentName
-import android.content.Context
import android.content.Intent
-import android.content.ServiceConnection
import android.graphics.BitmapFactory
import android.graphics.Color
import android.media.MediaMetadataRetriever
import android.os.Bundle
import android.os.Handler
-import android.os.IBinder
-import android.support.v7.app.AppCompatActivity
-import android.widget.Toast
import java.lang.Exception
import java.lang.Runnable
import java.util.concurrent.TimeUnit
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.runBlocking
import kotlin.io.*
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.fragment_play_controls.*
@@ -27,21 +18,18 @@ import kotlinx.android.synthetic.main.fragment_track_details.*
import kotlinx.android.synthetic.main.fragment_track_elapsing.*
import kotlinx.android.synthetic.main.fragment_track_flow.*
-import org.jetbrains.anko.image
import org.jetbrains.anko.imageBitmap
+import com.example.mear.constants.ControlTypes
import com.example.mear.listeners.TrackElaspingChange
-import com.example.mear.playback.service.MusicService
import com.example.mear.models.PlayControls
import com.example.mear.R
-import com.example.mear.constants.ControlTypes
import com.example.mear.repositories.RepeatRepository
import com.example.mear.repositories.ShuffleRepository
-class MainActivity : AppCompatActivity() {
+class MainActivity : BaseServiceActivity() {
- private var musicService: MusicService? = null
private var musicHandler: Handler? = Handler()
private var serviceBinded: Boolean? = false
private var repeatOn: Boolean? = false
@@ -97,7 +85,7 @@ class MainActivity : AppCompatActivity() {
val exMsg = ex.message
}
}
- private fun initializeChangeListeners() {
+ override fun initializeChangeListeners() {
val newListener = TrackElaspingChange(TrackElapsing)
if (musicService != null) {
newListener.musicService = musicService
@@ -121,6 +109,9 @@ class MainActivity : AppCompatActivity() {
RepeatTrack.setOnClickListener {
toggleRepeat()
}
+ SongView.setOnClickListener {
+ startActivity(Intent(this, SongViewActivity::class.java))
+ }
SettingsLink.setOnClickListener {
val intent = Intent(this, SettingsActivity::class.java)
startActivity(intent)
@@ -236,7 +227,7 @@ class MainActivity : AppCompatActivity() {
}
PreviousTrack.isEnabled = true
}
- private fun configureTrackDisplay() {
+ override fun configureTrackDisplay() {
try {
runOnUiThread {
configurePlayControlsDisplay()
@@ -275,14 +266,14 @@ class MainActivity : AppCompatActivity() {
val msg = ex.message
}
}
- private fun resetControls() {
+ override fun resetControls() {
TrackTitle!!.text = null
ArtistTitle!!.text = null
AlbumTitle!!.text = null
CurrentPosition!!.text = null
TrackCover!!.imageBitmap = null
}
- private fun updateTrackProgress() {
+ override fun updateTrackProgress() {
musicHandler!!.postDelayed(musicTrackTimeUpdateTask, 100)
}
private fun configurePlayControlsDisplay() {
@@ -300,17 +291,6 @@ class MainActivity : AppCompatActivity() {
}
- private fun isServiceRunning(serviceClass: Class<*>): Boolean {
- val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
-
- for (service in activityManager.getRunningServices(Integer.MAX_VALUE)) {
- if (serviceClass.name == service.service.className) {
- return true
- }
- }
- return false
- }
-
private var musicTrackTimeUpdateTask = object: Runnable {
override fun run() {
try {
@@ -332,49 +312,4 @@ class MainActivity : AppCompatActivity() {
}
}
}
-
- private val mConnection = object : ServiceConnection {
- override fun onServiceConnected(className: ComponentName, service: IBinder) {
- resetControls()
-
- runBlocking {
- val demo = launch {
- musicService = (service as MusicService.LocalBinder).service
- initializeChangeListeners()
- updateTrackProgress()
- }
- demo.start()
- }
- if (musicService != null) {
- if (musicService!!.isPlaying()) {
- configureTrackDisplay()
- }
- }
- }
-
- override fun onServiceDisconnected(className: ComponentName) {
- resetControls()
- Toast.makeText(
- this@MainActivity, "Music Service Stopped",
- Toast.LENGTH_SHORT
- ).show()
- }
- }
-
-
- fun doBindService() {
- val intent = Intent(this, MusicService::class.java)
- if (isServiceRunning(MusicService::class.java)) {
- val suc = "Service is already running"
- }
- else {
- startService(intent)
- }
-
- var result = bindService(intent, mConnection, Context.BIND_AUTO_CREATE)
- if (result) {
- }
- else {
- }
- }
}
diff --git a/app/src/main/java/com/example/mear/activities/SongViewActivity.kt b/app/src/main/java/com/example/mear/activities/SongViewActivity.kt
new file mode 100644
index 0000000..030a00e
--- /dev/null
+++ b/app/src/main/java/com/example/mear/activities/SongViewActivity.kt
@@ -0,0 +1,21 @@
+package com.example.mear.activities
+
+import android.os.Bundle
+import android.support.v7.app.AppCompatActivity
+import android.widget.LinearLayout
+
+import kotlinx.android.synthetic.main.activity_song_view.*
+import kotlinx.android.synthetic.main.content_song_view.*
+
+import com.example.mear.R
+import com.example.mear.repositories.TrackRepository
+
+class SongViewActivity : AppCompatActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_song_view)
+ setSupportActionBar(toolbar)
+ supportActionBar?.setDisplayHomeAsUpEnabled(true)
+ }
+}
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index fd0c707..7cc41a1 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -21,12 +21,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/content_song_view.xml b/app/src/main/res/layout/content_song_view.xml
new file mode 100644
index 0000000..0c49437
--- /dev/null
+++ b/app/src/main/res/layout/content_song_view.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu_song_view.xml b/app/src/main/res/menu/menu_song_view.xml
new file mode 100644
index 0000000..8c3346b
--- /dev/null
+++ b/app/src/main/res/menu/menu_song_view.xml
@@ -0,0 +1,10 @@
+
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 4ab4520..5a6277c 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -5,4 +5,6 @@
8dp176dp16dp
+ 180dp
+ 16dp
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index d031cf3..f04cd5a 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -98,4 +98,94 @@
SilentVibrate
+ SongViewActivity
+
+ "Material is the metaphor.\n\n"
+
+ "A material metaphor is the unifying theory of a rationalized space and a system of motion."
+ "The material is grounded in tactile reality, inspired by the study of paper and ink, yet "
+ "technologically advanced and open to imagination and magic.\n"
+ "Surfaces and edges of the material provide visual cues that are grounded in reality. The "
+ "use of familiar tactile attributes helps users quickly understand affordances. Yet the "
+ "flexibility of the material creates new affordances that supercede those in the physical "
+ "world, without breaking the rules of physics.\n"
+ "The fundamentals of light, surface, and movement are key to conveying how objects move, "
+ "interact, and exist in space and in relation to each other. Realistic lighting shows "
+ "seams, divides space, and indicates moving parts.\n\n"
+
+ "Bold, graphic, intentional.\n\n"
+
+ "The foundational elements of print based design typography, grids, space, scale, color, "
+ "and use of imagery guide visual treatments. These elements do far more than please the "
+ "eye. They create hierarchy, meaning, and focus. Deliberate color choices, edge to edge "
+ "imagery, large scale typography, and intentional white space create a bold and graphic "
+ "interface that immerse the user in the experience.\n"
+ "An emphasis on user actions makes core functionality immediately apparent and provides "
+ "waypoints for the user.\n\n"
+
+ "Motion provides meaning.\n\n"
+
+ "Motion respects and reinforces the user as the prime mover. Primary user actions are "
+ "inflection points that initiate motion, transforming the whole design.\n"
+ "All action takes place in a single environment. Objects are presented to the user without "
+ "breaking the continuity of experience even as they transform and reorganize.\n"
+ "Motion is meaningful and appropriate, serving to focus attention and maintain continuity. "
+ "Feedback is subtle yet clear. Transitions are efficient yet coherent.\n\n"
+
+ "3D world.\n\n"
+
+ "The material environment is a 3D space, which means all objects have x, y, and z "
+ "dimensions. The z-axis is perpendicularly aligned to the plane of the display, with the "
+ "positive z-axis extending towards the viewer. Every sheet of material occupies a single "
+ "position along the z-axis and has a standard 1dp thickness.\n"
+ "On the web, the z-axis is used for layering and not for perspective. The 3D world is "
+ "emulated by manipulating the y-axis.\n\n"
+
+ "Light and shadow.\n\n"
+
+ "Within the material environment, virtual lights illuminate the scene. Key lights create "
+ "directional shadows, while ambient light creates soft shadows from all angles.\n"
+ "Shadows in the material environment are cast by these two light sources. In Android "
+ "development, shadows occur when light sources are blocked by sheets of material at "
+ "various positions along the z-axis. On the web, shadows are depicted by manipulating the "
+ "y-axis only. The following example shows the card with a height of 6dp.\n\n"
+
+ "Resting elevation.\n\n"
+
+ "All material objects, regardless of size, have a resting elevation, or default elevation "
+ "that does not change. If an object changes elevation, it should return to its resting "
+ "elevation as soon as possible.\n\n"
+
+ "Component elevations.\n\n"
+
+ "The resting elevation for a component type is consistent across apps (e.g., FAB elevation "
+ "does not vary from 6dp in one app to 16dp in another app).\n"
+ "Components may have different resting elevations across platforms, depending on the depth "
+ "of the environment (e.g., TV has a greater depth than mobile or desktop).\n\n"
+
+ "Responsive elevation and dynamic elevation offsets.\n\n"
+
+ "Some component types have responsive elevation, meaning they change elevation in response "
+ "to user input (e.g., normal, focused, and pressed) or system events. These elevation "
+ "changes are consistently implemented using dynamic elevation offsets.\n"
+ "Dynamic elevation offsets are the goal elevation that a component moves towards, relative "
+ "to the component’s resting state. They ensure that elevation changes are consistent "
+ "across actions and component types. For example, all components that lift on press have "
+ "the same elevation change relative to their resting elevation.\n"
+ "Once the input event is completed or cancelled, the component will return to its resting "
+ "elevation.\n\n"
+
+ "Avoiding elevation interference.\n\n"
+
+ "Components with responsive elevations may encounter other components as they move between "
+ "their resting elevations and dynamic elevation offsets. Because material cannot pass "
+ "through other material, components avoid interfering with one another any number of ways, "
+ "whether on a per component basis or using the entire app layout.\n"
+ "On a component level, components can move or be removed before they cause interference. "
+ "For example, a floating action button (FAB) can disappear or move off screen before a "
+ "user picks up a card, or it can move if a snackbar appears.\n"
+ "On the layout level, design your app layout to minimize opportunities for interference. "
+ "For example, position the FAB to one side of stream of a cards so the FAB won’t interfere "
+ "when a user tries to pick up one of cards.\n\n"
+
diff --git a/build.gradle b/build.gradle
index 7f692ed..d506b75 100644
--- a/build.gradle
+++ b/build.gradle
@@ -8,7 +8,7 @@ buildscript {
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.3.1'
+ classpath 'com.android.tools.build:gradle:3.3.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
diff --git a/mear.iml b/mear.iml
index 3b96d13..10919fe 100644
--- a/mear.iml
+++ b/mear.iml
@@ -8,7 +8,7 @@
-
+