diff --git a/app/app.iml b/app/app.iml
index 7fbd7e2..d38a2b1 100644
--- a/app/app.iml
+++ b/app/app.iml
@@ -34,7 +34,7 @@
-
+
@@ -142,85 +142,96 @@
-
-
-
-
-
-
+
+
+
+
+
+
-
-
+
+
+
-
+
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 2b0ce57..52179fe 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -18,7 +18,7 @@ android {
targetSdkVersion 28
versionCode 1
versionName "1.0"
- testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
arguments "-DANDROID_STL=c++_shared", "-DANDROID=true"
@@ -47,23 +47,41 @@ android {
}
dependencies {
+ def work_version = "2.2.0"
+
implementation fileTree(dir: 'libs', include: ['*.jar'])
- implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.61'
- implementation 'com.android.support:appcompat-v7:28.0.0'
- implementation 'com.android.support:support-v4:28.0.0'
- implementation 'com.android.support:design:28.0.0'
- implementation 'com.android.support.constraint:constraint-layout:1.1.3'
- implementation "org.jetbrains.anko:anko:0.10.8"
+ // Kotlin + coroutines
+ implementation "androidx.work:work-runtime-ktx:$work_version"
+ implementation 'androidx.appcompat:appcompat:1.0.0'
+ implementation 'androidx.cardview:cardview:1.0.0'
+ implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+ implementation 'com.google.android.material:material:1.0.0'
+ implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'com.ealva:ealvatag:0.4.3'
implementation 'com.ealva:ealvalog:0.5.0'
implementation 'com.ealva:ealvalog-core:0.5.0'
implementation 'com.ealva:ealvalog-android:0.5.0'
- implementation 'com.google.guava:guava:23.0'
- implementation 'com.squareup.okio:okio:2.4.0'
- 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'
- implementation 'com.squareup.picasso:picasso:2.71828'
implementation 'com.github.XuDeveloper:XPopupWindow:1.0.1'
+ // implementation 'com.google.guava:guava:27.0'
+ implementation 'com.google.guava:guava:27.0.1-android'
+ implementation 'com.squareup.okio:okio:2.4.0'
+ implementation 'com.squareup.picasso:picasso:2.71828'
+ implementation "org.jetbrains.anko:anko:0.10.8"
+ implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.61'
+
+
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.1'
+ testImplementation 'junit:junit:4.12'
+}
+
+configurations.all {
+ resolutionStrategy.eachDependency { DependencyResolveDetails details ->
+ def requested = details.requested
+ if (requested.group == 'com.android.support') {
+ if (!requested.name.startsWith("multidex")) {
+ details.useVersion '27.0.0'
+ }
+ }
+ }
}
diff --git a/app/src/androidTest/java/com/example/mear/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/example/mear/ExampleInstrumentedTest.kt
index 32c793c..5d3ec3b 100644
--- a/app/src/androidTest/java/com/example/mear/ExampleInstrumentedTest.kt
+++ b/app/src/androidTest/java/com/example/mear/ExampleInstrumentedTest.kt
@@ -1,7 +1,7 @@
package com.example.mear
-import android.support.test.InstrumentationRegistry
-import android.support.test.runner.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Test
import org.junit.runner.RunWith
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6b4add1..d420886 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,5 +1,6 @@
diff --git a/app/src/main/cpp/Demo.hpp b/app/src/main/cpp/Demo.hpp
index 782d65a..a40af80 100644
--- a/app/src/main/cpp/Demo.hpp
+++ b/app/src/main/cpp/Demo.hpp
@@ -175,6 +175,24 @@ int retrieveShuffleMode(const std::string& path) {
}
+template
+B deleteSong(Song& song, const Str& path) {
+ manager::DirectoryManager dirMgr;
+ if (!dirMgr.doesSongExist(song, path)) {
+ return false;
+ }
+
+ auto result = dirMgr.deleteSong(song, path);
+ if (!result) {
+ return result;
+ }
+
+ repository::local::SongRepository songRepo(path);
+ songRepo.deleteSongFromTable(song, path);
+
+ return result;
+}
+
bool doesDatabaseExist(const std::string& dataPath) {
repository::local::UserRepository userRepo;
const auto result = userRepo.databaseExist(dataPath);
@@ -286,6 +304,7 @@ void downloadSong(Song& song, const Token& token, const Str& path) {
saveSong.close();
song.path = downloadedSong.path;
+ song.downloaded = true;
repository::local::SongRepository localSongRepo(path);
localSongRepo.saveSong(downloadedSong, path);
}
@@ -703,6 +722,24 @@ Java_com_example_mear_repositories_TokenRepository_isTokenTableEmpty(
return doesTokenExist(dataPath);
}
+extern "C"
+JNIEXPORT jboolean
+JNICALL
+Java_com_example_mear_repositories_TrackRepository_deleteSong(
+ JNIEnv *env,
+ jobject thisObj,
+ jobject songObj,
+ jstring pathStr
+) {
+ auto songClass = env->GetObjectClass(songObj);
+ auto path = env->GetStringUTFChars(pathStr, nullptr);
+ auto song = ObjToSong(env, songObj);
+
+ const auto result = deleteSong(song, path);
+
+ return result;
+}
+
extern "C"
JNIEXPORT jboolean
JNICALL
diff --git a/app/src/main/cpp/manager/DirectoryManager.h b/app/src/main/cpp/manager/DirectoryManager.h
index cc99895..65df494 100644
--- a/app/src/main/cpp/manager/DirectoryManager.h
+++ b/app/src/main/cpp/manager/DirectoryManager.h
@@ -22,7 +22,7 @@ namespace manager {
public:
template
std::string fullSongPath(const Song& song, const Str& path) {
- std::string s = utility::GeneralUtility::appendForwardSlashToUri(path);
+ std::string s = rootMusicDirectory(path);
s.append(song.albumArtist);
s.append("/");
s.append(song.album);
@@ -51,7 +51,7 @@ namespace manager {
template
Str albumPath(const Song& song, const Str& path) {
- std::string s = utility::GeneralUtility::appendForwardSlashToUri(path);
+ auto s = rootMusicDirectory(path);
s.append(song.albumArtist);
s.append("/");
s.append(song.album);
@@ -76,7 +76,7 @@ namespace manager {
template
Str artistPath(const Song& song, const Str& path) {
- Str s = utility::GeneralUtility::appendForwardSlashToUri(path);
+ Str s = rootMusicDirectory(path);
s.append(song.albumArtist);
return s.c_str();
@@ -101,6 +101,10 @@ namespace manager {
template
void createSongDirectory(const Song& song, const Str& path) {
+ if (!rootMusicDirectoryExists(path)) {
+ const std::string p(rootMusicDirectory(path));
+ auto status = mkdir(p.c_str(), 0777);
+ }
if (!artistDirectoryExists(song, path)) {
auto status = mkdir(artistPath(song, path).c_str(), 0777);
}
@@ -112,14 +116,20 @@ namespace manager {
}
}
- template
- void deleteSongDirectory(const Song& song, const Str& path) {
-
- }
private:
+ template
+ static auto rootMusicDirectory(const Str& path) {
+ auto rootPath = utility::GeneralUtility::appendForwardSlashToUri(path);
+ rootPath.append("music/");
+
+ return rootPath;
+ }
+
+
template
B albumDirectoryExists(const Song song, const Str& path) {
- auto albumPath = utility::GeneralUtility::appendForwardSlashToUri(path);
+ // auto albumPath = utility::GeneralUtility::appendForwardSlashToUri(path);
+ auto albumPath = rootMusicDirectory(path);
albumPath.append(song.albumArtist);
albumPath.append("/");
albumPath.append(song.album);
@@ -159,8 +169,9 @@ namespace manager {
}
template
- B artistDirectoryExists(const Song song, const Str& path) {
- auto artistPath = utility::GeneralUtility::appendForwardSlashToUri(path);
+ B artistDirectoryExists(const Song& song, const Str& path) {
+ // auto artistPath = utility::GeneralUtility::appendForwardSlashToUri(path);
+ auto artistPath = rootMusicDirectory(path);
artistPath.append(song.albumArtist);
DIR* dir = opendir(artistPath.c_str());
@@ -173,6 +184,21 @@ namespace manager {
return true;
}
+
+ template
+ B rootMusicDirectoryExists(const Str& path) {
+ auto rootPath = rootMusicDirectory(path);
+ DIR *dir = opendir(rootPath.c_str());
+
+ if (dir) {
+ closedir(dir);
+ return true;
+ } else if (ENOENT == errno) {
+ return false;
+ }
+
+ return true;
+ }
};
}
diff --git a/app/src/main/java/com/example/mear/AppCompatPreferenceActivity.kt b/app/src/main/java/com/example/mear/AppCompatPreferenceActivity.kt
index 42d1989..53dbb06 100644
--- a/app/src/main/java/com/example/mear/AppCompatPreferenceActivity.kt
+++ b/app/src/main/java/com/example/mear/AppCompatPreferenceActivity.kt
@@ -3,10 +3,10 @@ package com.example.mear
import android.content.res.Configuration
import android.os.Bundle
import android.preference.PreferenceActivity
-import android.support.annotation.LayoutRes
-import android.support.v7.app.ActionBar
-import android.support.v7.app.AppCompatDelegate
-import android.support.v7.widget.Toolbar
+import androidx.annotation.LayoutRes
+import androidx.appcompat.app.ActionBar
+import androidx.appcompat.app.AppCompatDelegate
+import androidx.appcompat.widget.Toolbar
import android.view.MenuInflater
import android.view.View
import android.view.ViewGroup
diff --git a/app/src/main/java/com/example/mear/activities/BaseServiceActivity.kt b/app/src/main/java/com/example/mear/activities/BaseServiceActivity.kt
index 674a41d..6f831ac 100644
--- a/app/src/main/java/com/example/mear/activities/BaseServiceActivity.kt
+++ b/app/src/main/java/com/example/mear/activities/BaseServiceActivity.kt
@@ -8,7 +8,7 @@ import android.content.ServiceConnection
import android.os.Bundle
import android.os.Environment
import android.os.IBinder
-import android.support.v7.app.AppCompatActivity
+import androidx.appcompat.app.AppCompatActivity
import android.widget.Toast
import com.example.mear.R
diff --git a/app/src/main/java/com/example/mear/activities/IcarusSongActivity.kt b/app/src/main/java/com/example/mear/activities/IcarusSongActivity.kt
index e8252e2..718fc59 100644
--- a/app/src/main/java/com/example/mear/activities/IcarusSongActivity.kt
+++ b/app/src/main/java/com/example/mear/activities/IcarusSongActivity.kt
@@ -1,8 +1,8 @@
package com.example.mear.activities
import android.os.Bundle
-import android.support.v7.widget.LinearLayoutManager
-import android.support.v7.widget.SearchView
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.appcompat.widget.SearchView
import kotlinx.android.synthetic.main.content_song_view.*
@@ -48,7 +48,8 @@ class IcarusSongActivity : BaseServiceActivity() {
private fun initializeAdapter() {
try {
- linearLayoutManager = LinearLayoutManager(this)
+ linearLayoutManager =
+ LinearLayoutManager(this)
trackList.layoutManager = linearLayoutManager
val pa = appDirectory()
@@ -57,7 +58,8 @@ class IcarusSongActivity : BaseServiceActivity() {
val apiRepo = APIRepository()
val token = tokenRepo.retrieveToken(pa)
val apiInfo = apiRepo.retrieveRecord(pa)
- val fetchedSongs = trackRepo.fetchSongsIncludingDownloaded(token, apiInfo.uri, pa).toCollection(ArrayList())
+ val fetchedSongs = trackRepo.fetchSongsIncludingDownloaded(token, apiInfo.uri, pa)
+ .toCollection(ArrayList())
songs = fetchedSongs
songs!!.sortedWith(compareBy{it.title})
diff --git a/app/src/main/java/com/example/mear/activities/LoginActivity.kt b/app/src/main/java/com/example/mear/activities/LoginActivity.kt
index 2624448..f9839d7 100644
--- a/app/src/main/java/com/example/mear/activities/LoginActivity.kt
+++ b/app/src/main/java/com/example/mear/activities/LoginActivity.kt
@@ -5,7 +5,7 @@ import kotlinx.android.synthetic.main.content_login.*
import android.content.Intent
import android.os.Bundle
-import android.support.design.widget.Snackbar
+import com.google.android.material.snackbar.Snackbar
import org.jetbrains.anko.toast
import com.example.mear.models.*
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 c85e4a9..15aa7d5 100644
--- a/app/src/main/java/com/example/mear/activities/MainActivity.kt
+++ b/app/src/main/java/com/example/mear/activities/MainActivity.kt
@@ -18,12 +18,19 @@ import android.content.pm.PackageManager
import android.graphics.Color
import android.os.Bundle
import android.os.Handler
-import android.support.v4.app.ActivityCompat
-import android.support.v4.content.ContextCompat
+import androidx.core.app.ActivityCompat
+import androidx.core.content.ContextCompat
import android.view.MenuItem
import android.view.View
import android.widget.PopupMenu
import android.widget.Toast
+/**
+import androidx.work.Data
+import androidx.work.NetworkType
+import androidx.work.OneTimeWorkRequest
+import androidx.work.WorkManager
+*/
+import org.jetbrains.anko.image
import org.jetbrains.anko.imageBitmap
import com.example.mear.listeners.TrackElaspingChange
@@ -32,7 +39,7 @@ import com.example.mear.repositories.*
import com.example.mear.repositories.RepeatRepository.RepeatTypes
import com.example.mear.repositories.ShuffleRepository.ShuffleTypes
import com.example.mear.util.ConvertByteArray
-import org.jetbrains.anko.image
+// import com.example.mear.workers.IcarusSyncManager
class MainActivity : BaseServiceActivity() {
@@ -51,6 +58,18 @@ class MainActivity : BaseServiceActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
try {
+ /**
+ val workManager = WorkManager.getInstance()
+
+ val constraints = androidx.work.Constraints.Builder()
+ .setRequiredNetworkType(NetworkType.CONNECTED).build()
+
+ val task = OneTimeWorkRequest.Builder(IcarusSyncManager::class.java)
+ .setConstraints(constraints).build()
+ workManager.enqueue(task)
+ */
+
+
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
@@ -377,7 +396,12 @@ class MainActivity : BaseServiceActivity() {
val trackRepo = TrackRepository()
// The method I am calling has not been implemented on the C++
// side
- trackRepo.delete(musicService!!.getCurrentSong(), appPath)
+ var currSong = musicService!!.getCurrentSong()
+ Toast.makeText(this, "Deleting song", Toast.LENGTH_SHORT).show()
+ val result = trackRepo.delete(currSong, appPath)
+ if (result) {
+ musicService!!.removeSongDownloadStatus(currSong)
+ }
}
R.id.action_song_download -> {
val appPath = appDirectory()
@@ -387,19 +411,43 @@ class MainActivity : BaseServiceActivity() {
var song = musicService!!.getCurrentSong()
val token = tokenRepo.retrieveToken(appPath)
- val apiInfo = apiRepo.retrieveRecord(appPath)
- song = trackRepo.download(token, song, appPath)
- musicService!!.changeSongDownloadStatus()
+ // val apiInfo = apiRepo.retrieveRecord(appPath)
+ // song = trackRepo.download(token, song, appPath)
+ // musicService!!.changeSongDownloadStatus(song)
// TODO: implement something to include the downloaded song into the songQueue
// essentially replacing the song that already exists, that way one can
// actually access the file without having to restart the app
+ Toast.makeText(this, "Downloading song", Toast.LENGTH_SHORT).show()
+
+ // val dMgr = IcarusSyncManager
+ musicService!!.downloadSong(token, song, appPath)
+
+
+ //val workManager = WorkManager.getInstance()
+ /**
+ val constraints = androidx.work.Constraints.Builder()
+ .setRequiredNetworkType(NetworkType.CONNECTED).build()
+
+ val task = OneTimeWorkRequest.Builder(IcarusSyncManager::class.java)
+ .setConstraints(constraints)
+ val data = Data.Builder()
+ data.putString("accessToken", token.accessToken)
+ data.putString("appPath", appPath)
+ data.putInt("songId", song.id)
+ task.setInputData(data.build())
+ */
+ //workManager.enqueue(task)
+ //WorkManager.getInstance().enqueue(task.build())
}
+ /**
R.id.action_song_play_count-> {
+ // TODO: not implemented
val trk = musicService!!.getCurrentSong()
- val pc = PlayCountRepository(this).getPlayCount(trk.id)
- val playCount = pc.playCount
+ // val pc = PlayCountRepository(this).getPlayCount(trk.id)
+ // val playCount = pc.playCount
Toast.makeText(this, "Song played $playCount times", Toast.LENGTH_LONG).show()
}
+ */
}
true
}
diff --git a/app/src/main/java/com/example/mear/activities/SettingsActivity.kt b/app/src/main/java/com/example/mear/activities/SettingsActivity.kt
index c0e6284..cef6d95 100644
--- a/app/src/main/java/com/example/mear/activities/SettingsActivity.kt
+++ b/app/src/main/java/com/example/mear/activities/SettingsActivity.kt
@@ -2,9 +2,7 @@ package com.example.mear.activities
import android.content.Context
import android.os.Bundle
-import android.os.Environment
-import android.support.v7.app.AppCompatActivity;
-import android.support.v7.widget.CardView
+import androidx.appcompat.app.AppCompatActivity;
import android.view.View
import android.widget.LinearLayout
import android.widget.Toast
@@ -13,11 +11,8 @@ import java.lang.Exception
import kotlinx.android.synthetic.main.activity_settings.*
import kotlinx.android.synthetic.main.content_settings.*
-import com.example.mear.adapters.SettingsAdapter
import com.example.mear.R
-import com.example.mear.management.MusicFiles
import com.example.mear.ui.popups.AboutPopup
-import com.example.mear.repositories.TrackRepository
import kotlinx.android.synthetic.main.popup_layout.*
@@ -47,16 +42,6 @@ class SettingsActivity : AppCompatActivity() {
window.statusBarColor = resources.getColor(R.color.track_seek)
}
- private fun loadSongPaths(): MutableList {
- val demoPath = Environment.getExternalStorageDirectory()
- val mfPaths = MusicFiles(demoPath)
- mfPaths.loadAllMusicPaths()
- val allSongs = mfPaths.allSongs
-
- return allSongs!!
- }
-
-
class AboutListener(var layout: LinearLayout?, val ctx: Context): View.OnClickListener {
override fun onClick(v: View?) {
diff --git a/app/src/main/java/com/example/mear/adapters/RecyclerAdapter.kt b/app/src/main/java/com/example/mear/adapters/RecyclerAdapter.kt
index 56d6621..4b99756 100644
--- a/app/src/main/java/com/example/mear/adapters/RecyclerAdapter.kt
+++ b/app/src/main/java/com/example/mear/adapters/RecyclerAdapter.kt
@@ -1,7 +1,7 @@
package com.example.mear.adapters
import android.app.Activity
-import android.support.v7.widget.RecyclerView
+import androidx.recyclerview.widget.RecyclerView
import android.view.View
import android.view.ViewGroup
import android.widget.Filter
diff --git a/app/src/main/java/com/example/mear/adapters/SettingsAdapter.kt b/app/src/main/java/com/example/mear/adapters/SettingsAdapter.kt
index 41613d9..c34959c 100644
--- a/app/src/main/java/com/example/mear/adapters/SettingsAdapter.kt
+++ b/app/src/main/java/com/example/mear/adapters/SettingsAdapter.kt
@@ -1,6 +1,6 @@
package com.example.mear.adapters
-import android.support.v7.widget.RecyclerView
+import androidx.recyclerview.widget.RecyclerView
import android.view.View
import android.view.ViewGroup
diff --git a/app/src/main/java/com/example/mear/adapters/SongAdapter.kt b/app/src/main/java/com/example/mear/adapters/SongAdapter.kt
index 4438e6c..7b05b5e 100644
--- a/app/src/main/java/com/example/mear/adapters/SongAdapter.kt
+++ b/app/src/main/java/com/example/mear/adapters/SongAdapter.kt
@@ -3,7 +3,7 @@ package com.example.mear.adapters
import java.lang.Exception
import kotlinx.android.synthetic.main.fragment_song_view.view.*
-import android.support.v7.widget.RecyclerView
+import androidx.recyclerview.widget.RecyclerView
import android.view.View
import android.view.ViewGroup
import android.widget.Filter
diff --git a/app/src/main/java/extensions.kt b/app/src/main/java/com/example/mear/extensions.kt
similarity index 55%
rename from app/src/main/java/extensions.kt
rename to app/src/main/java/com/example/mear/extensions.kt
index 7c66950..75a66c7 100644
--- a/app/src/main/java/extensions.kt
+++ b/app/src/main/java/com/example/mear/extensions.kt
@@ -1,16 +1,11 @@
package com.example.mear
-import android.content.Context
-import android.support.annotation.LayoutRes
+import androidx.annotation.LayoutRes
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
-import com.example.mear.management.DatabaseManager
-
-val Context.database: DatabaseManager
- get() = DatabaseManager.getInstance(applicationContext)
fun ViewGroup.inflate(@LayoutRes layoutRes: Int, attachToRoot: Boolean = false): View {
return LayoutInflater.from(context).inflate(layoutRes, this, attachToRoot)
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/com/example/mear/holders/SettingItemsHolder.kt b/app/src/main/java/com/example/mear/holders/SettingItemsHolder.kt
index 7b39f65..a47454b 100644
--- a/app/src/main/java/com/example/mear/holders/SettingItemsHolder.kt
+++ b/app/src/main/java/com/example/mear/holders/SettingItemsHolder.kt
@@ -1,6 +1,6 @@
package com.example.mear.holders
-import android.support.v7.widget.RecyclerView
+import androidx.recyclerview.widget.RecyclerView
import android.view.View
import com.example.mear.models.SettingItems
diff --git a/app/src/main/java/com/example/mear/management/DatabaseManager.kt b/app/src/main/java/com/example/mear/management/DatabaseManager.kt
deleted file mode 100644
index 7887b21..0000000
--- a/app/src/main/java/com/example/mear/management/DatabaseManager.kt
+++ /dev/null
@@ -1,93 +0,0 @@
-package com.example.mear.management
-
-import android.content.Context
-import android.database.sqlite.SQLiteDatabase
-import com.example.mear.constants.ControlTypes
-
-import java.lang.Exception
-
-import org.jetbrains.anko.db.*
-import org.jetbrains.anko.db.ManagedSQLiteOpenHelper
-
-import com.example.mear.models.PlayControls
-import com.example.mear.repositories.ShuffleRepository
-
-class DatabaseManager(ctx: Context): ManagedSQLiteOpenHelper(ctx, "Mear",
- null, 1) {
- companion object {
- private var instance: DatabaseManager? = null
-
- @Synchronized
- fun getInstance(ctx: Context): DatabaseManager {
- if (instance == null) {
- instance = DatabaseManager(ctx.applicationContext)
- }
- return instance!!
- }
- }
-
-
- override fun onCreate(db: SQLiteDatabase?) {
- try {
- db!!.createTable(
- "Track", true,
- "Id" to INTEGER + PRIMARY_KEY + UNIQUE,
- "Title" to TEXT, "Album" to TEXT, "Artist" to TEXT,
- "Duration" to INTEGER, "FilePath" to TEXT
- )
- db!!.createTable(
- "TrackCount", true,
- "Id" to INTEGER + PRIMARY_KEY + UNIQUE,
- "TotalSongs" to INTEGER
- )
- db!!.createTable(
- "PlayCount", true,
- "Id" to INTEGER + PRIMARY_KEY + AUTOINCREMENT,
- "PlayCount" to INTEGER,
- "TrackId" to INTEGER
- )
- db!!.createTable(
- "Settings", true,
- "Id" to INTEGER + PRIMARY_KEY + UNIQUE,
- "DarkTheme" to org.jetbrains.anko.db.REAL
- )
- db!!.createTable(
- "Shuffle", true,
- "Id" to INTEGER + PRIMARY_KEY + UNIQUE,
- "Mode" to TEXT
- )
- db!!.createTable(
- "Repeat", true,
- "Id" to INTEGER + PRIMARY_KEY + UNIQUE,
- "Mode" to TEXT)
- }
- catch (ex: Exception) {
- }
- initializeShuffle(db)
- initializeRepeat(db)
- }
-
- override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
- try {
- db!!.dropTable("Track")
- db!!.dropTable("TrackCount")
- db!!.dropTable("PlayCount")
- db!!.dropTable("Settings")
- db!!.dropTable("Shuffle")
- db!!.dropTable("Repeat")
- }
- catch (ex: Exception) {
- }
- }
-
-
- private fun initializeShuffle(db: SQLiteDatabase?) {
- db!!.insert("Shuffle",
- "Mode" to ControlTypes.SHUFFLE_OFF)
- }
- private fun initializeRepeat(db: SQLiteDatabase?) {
- db!!.insert("Repeat",
- "Mode" to ControlTypes.REPEAT_OFF)
- }
-}
-
diff --git a/app/src/main/java/com/example/mear/management/MusicFiles.kt b/app/src/main/java/com/example/mear/management/MusicFiles.kt
deleted file mode 100644
index 5949724..0000000
--- a/app/src/main/java/com/example/mear/management/MusicFiles.kt
+++ /dev/null
@@ -1,123 +0,0 @@
-package com.example.mear.management
-
-import android.os.Environment
-import com.example.mear.R
-import java.io.File
-import java.lang.Exception
-
-import com.example.mear.constants.DirectoryIgnore
-import com.example.mear.constants.FileTypes
-import com.example.mear.constants.SongSearch
-
-class MusicFiles (private val demoPath: File) {
-
- var allSongs: MutableList?= null
-
- private val musicSongLimit = Int.MAX_VALUE
-
-
- fun loadAllMusicPaths() {
- try {
- allSongs = mutableListOf()
- val demoPath = this.demoPath.absoluteFile.toString() + "/music/"
- val f = File(demoPath)
- var count = 0
-
- val folder = f
- val listOfFiles = folder.listFiles()
-
- for (i in listOfFiles) {
- for (j in i.listFiles()) {
- if (j.absolutePath.toString().contains("zip")) {
- }
- for (k in j.listFiles()) {
- if (k.absolutePath.toString().contains("mp3")) {
- if (count < musicSongLimit) {
- allSongs!!.add(k.absolutePath.toString())
- count++
- }
- else
- {
- break
- }
- }
- }
- }
- }
- }
- catch (ex: Exception) {
- var exMsg = ex.message
- }
- }
-
- fun initialMp3Search() {
- try {
- var pathList: MutableList?
- pathList = mutableListOf()
- var songsAdded = 0
-
- var fileSearch = File(demoPath.absolutePath)
- fileSearch.walkTopDown().forEach {
- println(it.absolutePath)
- if (!ignoreThisDirectory(it.absolutePath)) {
- if (it.isFile) {
- if (it.extension == (FileTypes.Mp3)) {
- if (songsAdded >= SongSearch.INITIAL_SEARCH_AMOUNT) {
- return
- }
- pathList.add(it.absolutePath)
- allSongs = pathList
- songsAdded = songsAdded.inc()
- }
- }
- }
- }
- }
- catch (ex: Exception) {
- val exMsg = ex.message
- }
- }
- fun searchForMp3Songs() {
- try {
- var pathList: MutableList?
- pathList = mutableListOf()
-
- var fileSearch = File(demoPath.absolutePath)
- fileSearch.walkTopDown().forEach {
- println(it.absolutePath)
- if (!ignoreThisDirectory(it.absolutePath)) {
- if (it.isFile) {
- if (it.extension == (FileTypes.Mp3)) {
- pathList.add(it.absolutePath)
- }
- }
- }
- }
-
- allSongs = pathList
- }
- catch (ex: Exception) {
- val exMsg = ex.message
- }
- }
-
- private fun ignoreThisDirectory(path: String): Boolean {
- var ignoreDirectory = false
- try {
- if (path.contains(DirectoryIgnore.Android_Root)) {
- ignoreDirectory = true
- }
- if (path.contains(DirectoryIgnore.Notifications)) {
- ignoreDirectory = true
- }
- if (path.contains(DirectoryIgnore.Ringtones)) {
- ignoreDirectory = true
- }
- return ignoreDirectory
- }
- catch (ex: Exception) {
- val exMsg = ex.message
- }
- return ignoreDirectory
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/mear/playback/service/MusicService.kt b/app/src/main/java/com/example/mear/playback/service/MusicService.kt
index 0483fea..cd3baa4 100644
--- a/app/src/main/java/com/example/mear/playback/service/MusicService.kt
+++ b/app/src/main/java/com/example/mear/playback/service/MusicService.kt
@@ -68,6 +68,11 @@ class MusicService(var appPath: String = ""): Service() {
}
+ fun downloadSong(token: Token, song: Song, appPath: String) {
+ val trackRepo = TrackRepository()
+ val s = trackRepo.download(token, currentSong, appPath)
+ changeSongDownloadStatus(s)
+ }
fun icarusPlaySong(token: Token, song: Song, apiInfo: APIInfo) {
if (song.downloaded) {
offlinePlaySong(song)
@@ -77,11 +82,12 @@ class MusicService(var appPath: String = ""): Service() {
val uri = APIRepository.retrieveSongStreamUri(apiInfo, song)
val hddr = APIRepository.retrieveSongStreamHeader(token)
currentSong = song
+ currentSongIndex = songQueue.indexOfFirst { it.id == currentSong.id }
try {
trackPlayer!!.reset()
trackPlayer!!.setDataSource(this, uri, hddr)
- trackPlayer!!.prepare()
+ trackPlayer!!.prepareAsync()
trackPlayer!!.start()
}
catch (ex: Exception) {
@@ -89,14 +95,30 @@ class MusicService(var appPath: String = ""): Service() {
}
}
- fun changeSongDownloadStatus() {
- currentSong.downloaded = true
- songQueue.forEach {
- s ->
- if (s.id == currentSong.id) {
- s.downloaded = true
- }
+ fun changeSongDownloadStatus(song: Song) {
+ if (!song.downloaded) {
+ song.downloaded = true
}
+ currentSong = song
+ currentSongIndex = songQueue.indexOfFirst { it.id == currentSong.id }
+ songQueue[currentSongIndex!!] = currentSong
+ /**
+ val curPosition = currentPositionOfTrack()
+ trackPlayer!!.reset()
+ trackPlayer!!.setDataSource(currentSong.path)
+ trackPlayer!!.prepareAsync()
+ trackPlayer!!.seekTo(curPosition)
+ trackPlayer!!.start()
+ */
+ }
+
+ fun removeSongDownloadStatus(song: Song) {
+ if (song.downloaded) {
+ song.downloaded = false
+ }
+ currentSong = song
+ currentSongIndex = songQueue.indexOfFirst { it.id == currentSong.id }
+ songQueue[currentSongIndex!!] = currentSong
}
fun goToPosition(progress: Int) { trackPlayer!!.seekTo(progress) }
@@ -157,7 +179,7 @@ class MusicService(var appPath: String = ""): Service() {
uri, hddr)
}
- trackPlayer!!.prepare()
+ trackPlayer!!.prepareAsync()
trackPlayer!!.start()
}
}
@@ -194,7 +216,7 @@ class MusicService(var appPath: String = ""): Service() {
APIRepository.retrieveSongStreamUri(apiInfo, currentSong),
APIRepository.retrieveSongStreamHeader(token))
}
- trackPlayer!!.prepare()
+ trackPlayer!!.prepareAsync()
trackPlayer!!.start()
}
catch (ex: Exception) {
@@ -275,16 +297,12 @@ class MusicService(var appPath: String = ""): Service() {
private fun offlinePlaySong(song: Song) {
try {
currentSong = song
- songQueue.forEach{ s ->
- if (s.id == currentSong.id) {
- s.downloaded = currentSong.downloaded
- s.filename = currentSong.filename
- s.path = currentSong.path
- }
- }
+ currentSongIndex = songQueue.indexOfFirst { it.id == song.id }
+ songQueue[currentSongIndex!!] = currentSong
+
trackPlayer!!.reset()
trackPlayer!!.setDataSource(song.path)
- trackPlayer!!.prepare()
+ trackPlayer!!.prepareAsync()
trackPlayer!!.start()
}
catch (ex: Exception) {
diff --git a/app/src/main/java/com/example/mear/repositories/PlayCountRepository.kt b/app/src/main/java/com/example/mear/repositories/PlayCountRepository.kt
index e668c43..8b01e21 100644
--- a/app/src/main/java/com/example/mear/repositories/PlayCountRepository.kt
+++ b/app/src/main/java/com/example/mear/repositories/PlayCountRepository.kt
@@ -4,70 +4,8 @@ import android.content.Context
import org.jetbrains.anko.db.*
-import com.example.mear.database
import com.example.mear.models.PlayCount
import com.example.mear.models.Track
class PlayCountRepository(val context: Context) {
- fun getAll(): List = context.database.use {
- val playCounts = mutableListOf()
-
- select("PlayCount" )
- .parseList(object : MapRowParser{
- override fun parseRow(columns: Map): PlayCount {
- val id = columns.getValue("Id").toString().toInt()
- val songPlayedAmount = columns.getValue("PlayCount").toString().toInt()
- val trackId = columns.getValue("TrackId").toString().toInt()
-
- val playCount = PlayCount(id, songPlayedAmount, trackId)
- playCounts.add(playCount)
-
- return playCount
- }
- })
- playCounts
- }
- fun getPlayCount(id: Int): PlayCount = context.database.use {
- select("PlayCount").where("Id = $id")
- .parseSingle(object: MapRowParser{
- override fun parseRow(columns: Map): PlayCount {
- val id = columns.getValue("Id").toString().toInt()
- val songPlayedAmount = columns.getValue("PlayCount").toString().toInt()
- val trackId = columns.getValue("TrackId").toString().toInt()
-
- val playCount = PlayCount(id, songPlayedAmount, trackId)
-
- return playCount
- }
- })
- }
-
- fun insertPlayCounts(tracks: List