diff --git a/app/normal/release/app.aab b/app/normal/release/app.aab deleted file mode 100644 index f101357ec..000000000 Binary files a/app/normal/release/app.aab and /dev/null differ diff --git a/app/src/main/java/code/name/monkey/retromusic/model/AbsCustomPlaylist.java b/app/src/main/java/code/name/monkey/retromusic/model/AbsCustomPlaylist.java index d2c22d625..29ca03577 100644 --- a/app/src/main/java/code/name/monkey/retromusic/model/AbsCustomPlaylist.java +++ b/app/src/main/java/code/name/monkey/retromusic/model/AbsCustomPlaylist.java @@ -2,14 +2,14 @@ package code.name.monkey.retromusic.model; import android.content.Context; import android.os.Parcel; -import androidx.annotation.NonNull; import java.util.ArrayList; +import androidx.annotation.NonNull; +import code.name.monkey.models.Song; import io.reactivex.Observable; - public abstract class AbsCustomPlaylist extends Playlist { public AbsCustomPlaylist(int id, String name) { super(id, name); diff --git a/app/src/main/java/code/name/monkey/retromusic/model/Album.kt b/app/src/main/java/code/name/monkey/retromusic/model/Album.kt index 27405c44b..fb64107b7 100644 --- a/app/src/main/java/code/name/monkey/retromusic/model/Album.kt +++ b/app/src/main/java/code/name/monkey/retromusic/model/Album.kt @@ -1,10 +1,10 @@ -package code.name.monkey.retromusic.model +package code.name.monkey.models import java.util.* class Album { - val songs: ArrayList? + val songs: ArrayList? val id: Int get() = safeGetFirstSong().albumId @@ -27,7 +27,7 @@ class Album { val songCount: Int get() = songs!!.size - constructor(songs: ArrayList) { + constructor(songs: ArrayList) { this.songs = songs } @@ -35,7 +35,7 @@ class Album { this.songs = ArrayList() } - fun safeGetFirstSong(): Song { - return if (songs!!.isEmpty()) Song.EMPTY_SONG else songs[0] + fun safeGetFirstSong(): code.name.monkey.models.Song { + return if (songs!!.isEmpty()) code.name.monkey.models.Song.EMPTY_SONG else songs[0] } } diff --git a/app/src/main/java/code/name/monkey/retromusic/model/Artist.kt b/app/src/main/java/code/name/monkey/retromusic/model/Artist.kt index 0f5a5c35f..449d0c77f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/model/Artist.kt +++ b/app/src/main/java/code/name/monkey/retromusic/model/Artist.kt @@ -30,9 +30,9 @@ class Artist { val albumCount: Int get() = albums!!.size - val songs: ArrayList + val songs: ArrayList get() { - val songs = ArrayList() + val songs = ArrayList() for (album in albums!!) { songs.addAll(album.songs!!) } diff --git a/app/src/main/java/code/name/monkey/retromusic/model/Playlist.java b/app/src/main/java/code/name/monkey/retromusic/model/Playlist.java index a04f31263..ba4b76572 100644 --- a/app/src/main/java/code/name/monkey/retromusic/model/Playlist.java +++ b/app/src/main/java/code/name/monkey/retromusic/model/Playlist.java @@ -1,4 +1,4 @@ -package code.name.monkey.retromusic.model; +package code.name.monkey.models; import android.os.Parcel; import android.os.Parcelable; diff --git a/app/src/main/java/code/name/monkey/retromusic/model/PlaylistSong.java b/app/src/main/java/code/name/monkey/retromusic/model/PlaylistSong.java index c44f1f6ac..ae7af07df 100644 --- a/app/src/main/java/code/name/monkey/retromusic/model/PlaylistSong.java +++ b/app/src/main/java/code/name/monkey/retromusic/model/PlaylistSong.java @@ -2,6 +2,8 @@ package code.name.monkey.retromusic.model; import android.os.Parcel; +import code.name.monkey.models.Song; + public class PlaylistSong extends Song { public static PlaylistSong EMPTY_PLAYLIST_SONG = new PlaylistSong(-1, "", -1, -1, -1, "", -1, -1, "", -1, "", -1, -1); diff --git a/app/src/main/java/code/name/monkey/retromusic/model/lyrics/Lyrics.java b/app/src/main/java/code/name/monkey/retromusic/model/lyrics/Lyrics.java index f80e53956..32a346e0f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/model/lyrics/Lyrics.java +++ b/app/src/main/java/code/name/monkey/retromusic/model/lyrics/Lyrics.java @@ -1,7 +1,7 @@ -package code.name.monkey.retromusic.model.lyrics; +package code.name.monkey.models.lyrics; -import code.name.monkey.retromusic.model.Song; +import code.name.monkey.models.Song; import java.util.ArrayList; diff --git a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/AbsSmartPlaylist.java b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/AbsSmartPlaylist.java index 9e3291ba8..dad72616c 100644 --- a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/AbsSmartPlaylist.java +++ b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/AbsSmartPlaylist.java @@ -1,4 +1,4 @@ -package code.name.monkey.retromusic.model.smartplaylist; +package code.name.monkey.models.smartplaylist; import android.content.Context; import android.os.Parcel; diff --git a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/HistoryPlaylist.java b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/HistoryPlaylist.java index 1ab5e0d7a..088560501 100644 --- a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/HistoryPlaylist.java +++ b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/HistoryPlaylist.java @@ -7,9 +7,10 @@ import androidx.annotation.NonNull; import java.util.ArrayList; +import code.name.monkey.models.Song; import code.name.monkey.retromusic.R; import code.name.monkey.retromusic.loaders.TopAndRecentlyPlayedTracksLoader; -import code.name.monkey.retromusic.model.Song; + import code.name.monkey.retromusic.providers.HistoryStore; import io.reactivex.Observable; diff --git a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/LastAddedPlaylist.java b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/LastAddedPlaylist.java index d4dd4c7ca..d2395c343 100644 --- a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/LastAddedPlaylist.java +++ b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/LastAddedPlaylist.java @@ -8,7 +8,7 @@ import androidx.annotation.NonNull; import code.name.monkey.retromusic.R; import code.name.monkey.retromusic.loaders.LastAddedSongsLoader; -import code.name.monkey.retromusic.model.Song; +import code.name.monkey.models.Song; import java.util.ArrayList; diff --git a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/MyTopTracksPlaylist.java b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/MyTopTracksPlaylist.java index 18515d200..b62a4dd3d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/MyTopTracksPlaylist.java +++ b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/MyTopTracksPlaylist.java @@ -8,7 +8,7 @@ import androidx.annotation.NonNull; import code.name.monkey.retromusic.R; import code.name.monkey.retromusic.loaders.TopAndRecentlyPlayedTracksLoader; -import code.name.monkey.retromusic.model.Song; +import code.name.monkey.models.Song; import code.name.monkey.retromusic.providers.SongPlayCountStore; import java.util.ArrayList; diff --git a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/ShuffleAllPlaylist.java b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/ShuffleAllPlaylist.java index e4b752f04..169a4a60d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/ShuffleAllPlaylist.java +++ b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/ShuffleAllPlaylist.java @@ -8,7 +8,7 @@ import androidx.annotation.NonNull; import code.name.monkey.retromusic.R; import code.name.monkey.retromusic.loaders.SongLoader; -import code.name.monkey.retromusic.model.Song; +import code.name.monkey.models.Song; import java.util.ArrayList; diff --git a/app/src/main/java/code/name/monkey/retromusic/util/ViewUtil.java b/app/src/main/java/code/name/monkey/retromusic/util/ViewUtil.java deleted file mode 100644 index 149d7e06e..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/util/ViewUtil.java +++ /dev/null @@ -1,96 +0,0 @@ -package code.name.monkey.retromusic.util; - -import android.animation.Animator; -import android.animation.ArgbEvaluator; -import android.animation.ObjectAnimator; -import android.content.Context; -import android.content.res.Resources; -import android.graphics.Color; -import android.os.Build; -import android.util.DisplayMetrics; -import android.view.View; -import android.view.ViewGroup; -import android.view.animation.PathInterpolator; -import android.widget.TextView; - -import androidx.annotation.ColorInt; -import androidx.core.view.ViewCompat; - -import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import code.name.monkey.appthemehelper.util.ColorUtil; -import code.name.monkey.appthemehelper.util.MaterialValueHelper; - -public class ViewUtil { - - public final static int RETRO_MUSIC_ANIM_TIME = 1000; - - public static Animator createTextColorTransition(final TextView v, @ColorInt final int startColor, @ColorInt final int endColor) { - return createColorAnimator(v, "textColor", startColor, endColor); - } - - private static Animator createColorAnimator(Object target, String propertyName, @ColorInt int startColor, @ColorInt int endColor) { - ObjectAnimator animator; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - animator = ObjectAnimator.ofArgb(target, propertyName, startColor, endColor); - } else { - animator = ObjectAnimator.ofInt(target, propertyName, startColor, endColor); - animator.setEvaluator(new ArgbEvaluator()); - } - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - animator.setInterpolator(new PathInterpolator(0.4f, 0f, 1f, 1f)); - } - animator.setDuration(RETRO_MUSIC_ANIM_TIME); - return animator; - } - - public static void setStatusBarHeight(final Context context, View statusBar) { - ViewGroup.LayoutParams lp = statusBar.getLayoutParams(); - lp.height = getStatusBarHeight(context); - statusBar.requestLayout(); - } - - public static int getStatusBarHeight(final Context context) { - int result = 0; - int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); - if (resourceId > 0) { - result = context.getResources().getDimensionPixelSize(resourceId); - } - return result; - } - - public static boolean hitTest(View v, int x, int y) { - final int tx = (int) (ViewCompat.getTranslationX(v) + 0.5f); - final int ty = (int) (ViewCompat.getTranslationY(v) + 0.5f); - final int left = v.getLeft() + tx; - final int right = v.getRight() + tx; - final int top = v.getTop() + ty; - final int bottom = v.getBottom() + ty; - - return (x >= left) && (x <= right) && (y >= top) && (y <= bottom); - } - - public static void setUpFastScrollRecyclerViewColor(Context context, - FastScrollRecyclerView recyclerView, int accentColor) { - recyclerView.setPopupBgColor(accentColor); - recyclerView.setPopupTextColor( - MaterialValueHelper.INSTANCE.getPrimaryTextColor(context, ColorUtil.INSTANCE.isColorLight(accentColor))); - recyclerView.setThumbColor(accentColor); - recyclerView.setTrackColor(Color.TRANSPARENT); - //recyclerView.setTrackColor(ColorUtil.withAlpha(ATHUtil.resolveColor(context, R.attr.colorControlNormal), 0.12f)); - } - - public static float convertDpToPixel(float dp, Resources resources) { - DisplayMetrics metrics = resources.getDisplayMetrics(); - return dp * metrics.density; - } - - @NotNull - public static Animator createBackgroundColorTransition(@Nullable View colorGradientBackground, int lastColor, int newColor) { - return null; - } -} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/util/ViewUtil.kt b/app/src/main/java/code/name/monkey/retromusic/util/ViewUtil.kt new file mode 100644 index 000000000..002f50add --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/util/ViewUtil.kt @@ -0,0 +1,96 @@ +package code.name.monkey.retromusic.util + +import android.animation.Animator +import android.animation.ArgbEvaluator +import android.animation.ObjectAnimator +import android.content.Context +import android.content.res.Resources +import android.graphics.Color +import android.graphics.PorterDuff +import android.os.Build +import android.util.DisplayMetrics +import android.view.View +import android.view.ViewGroup +import android.view.animation.PathInterpolator +import android.widget.SeekBar +import android.widget.TextView + +import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView + +import androidx.annotation.ColorInt +import androidx.core.view.ViewCompat +import code.name.monkey.appthemehelper.ThemeStore +import code.name.monkey.appthemehelper.util.ColorUtil +import code.name.monkey.appthemehelper.util.MaterialValueHelper + +object ViewUtil { + + val RETRO_MUSIC_ANIM_TIME = 1000 + + fun createTextColorTransition(v: TextView, @ColorInt startColor: Int, @ColorInt endColor: Int): Animator { + return createColorAnimator(v, "textColor", startColor, endColor) + } + + fun setProgressDrawable(progressSlider: SeekBar, newColor: Int) {} + + private fun createColorAnimator(target: Any, propertyName: String, @ColorInt startColor: Int, @ColorInt endColor: Int): Animator { + val animator: ObjectAnimator + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + animator = ObjectAnimator.ofArgb(target, propertyName, startColor, endColor) + } else { + animator = ObjectAnimator.ofInt(target, propertyName, startColor, endColor) + animator.setEvaluator(ArgbEvaluator()) + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + animator.interpolator = PathInterpolator(0.4f, 0f, 1f, 1f) + } + animator.duration = RETRO_MUSIC_ANIM_TIME.toLong() + return animator + } + + fun setStatusBarHeight(context: Context, statusBar: View) { + val lp = statusBar.layoutParams + lp.height = getStatusBarHeight(context) + statusBar.requestLayout() + } + + fun getStatusBarHeight(context: Context): Int { + var result = 0 + val resourceId = context.resources.getIdentifier("status_bar_height", "dimen", "android") + if (resourceId > 0) { + result = context.resources.getDimensionPixelSize(resourceId) + } + return result + } + + fun hitTest(v: View, x: Int, y: Int): Boolean { + val tx = (ViewCompat.getTranslationX(v) + 0.5f).toInt() + val ty = (ViewCompat.getTranslationY(v) + 0.5f).toInt() + val left = v.left + tx + val right = v.right + tx + val top = v.top + ty + val bottom = v.bottom + ty + + return x >= left && x <= right && y >= top && y <= bottom + } + + fun setUpFastScrollRecyclerViewColor(context: Context, + recyclerView: FastScrollRecyclerView, accentColor: Int) { + recyclerView.setPopupBgColor(accentColor) + recyclerView.setPopupTextColor( + MaterialValueHelper.getPrimaryTextColor(context, ColorUtil.isColorLight(accentColor))) + recyclerView.setThumbColor(accentColor) + recyclerView.setTrackColor(Color.TRANSPARENT) + //recyclerView.setTrackColor(ColorUtil.withAlpha(ATHUtil.resolveColor(context, R.attr.colorControlNormal), 0.12f)); + } + + fun convertDpToPixel(dp: Float, resources: Resources): Float { + val metrics = resources.displayMetrics + return dp * metrics.density + } + + fun createBackgroundColorTransition(colorGradientBackground: View?, lastColor: Int, newColor: Int): Animator { + return null + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_text_fields_black_24dp.xml b/app/src/main/res/drawable/ic_text_fields_black_24dp.xml new file mode 100644 index 000000000..dd81ddfd3 --- /dev/null +++ b/app/src/main/res/drawable/ic_text_fields_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_time_lapse_white_24dp.xml b/app/src/main/res/drawable/ic_time_lapse_white_24dp.xml new file mode 100644 index 000000000..a8b409b1d --- /dev/null +++ b/app/src/main/res/drawable/ic_time_lapse_white_24dp.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/promotional.webp b/app/src/main/res/drawable/promotional.webp new file mode 100644 index 000000000..82b502235 Binary files /dev/null and b/app/src/main/res/drawable/promotional.webp differ diff --git a/app/src/main/res/layout/activity_pro_version_content.xml b/app/src/main/res/layout/activity_pro_version_content.xml deleted file mode 100644 index 4e454f1a4..000000000 --- a/app/src/main/res/layout/activity_pro_version_content.xml +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/models/.gitignore b/models/.gitignore new file mode 100644 index 000000000..796b96d1c --- /dev/null +++ b/models/.gitignore @@ -0,0 +1 @@ +/build diff --git a/models/build.gradle b/models/build.gradle new file mode 100644 index 000000000..3ae53d2fc --- /dev/null +++ b/models/build.gradle @@ -0,0 +1,34 @@ +apply plugin: 'com.android.library' + +android { + compileSdkVersion 28 + + + + defaultConfig { + minSdkVersion 22 + targetSdkVersion 28 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + + implementation 'com.android.support:appcompat-v7:28.0.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' +} diff --git a/models/proguard-rules.pro b/models/proguard-rules.pro new file mode 100644 index 000000000..f1b424510 --- /dev/null +++ b/models/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# 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 diff --git a/models/src/androidTest/java/code/name/monkey/models/ExampleInstrumentedTest.java b/models/src/androidTest/java/code/name/monkey/models/ExampleInstrumentedTest.java new file mode 100644 index 000000000..7c78e94b0 --- /dev/null +++ b/models/src/androidTest/java/code/name/monkey/models/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package code.name.monkey.models; + +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.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("code.name.monkey.models.test", appContext.getPackageName()); + } +} diff --git a/models/src/main/AndroidManifest.xml b/models/src/main/AndroidManifest.xml new file mode 100644 index 000000000..11b733b32 --- /dev/null +++ b/models/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/models/src/main/java/code/name/monkey/models/Song.kt b/models/src/main/java/code/name/monkey/models/Song.kt new file mode 100644 index 000000000..4ae862a45 --- /dev/null +++ b/models/src/main/java/code/name/monkey/models/Song.kt @@ -0,0 +1,2 @@ +package code.name.monkey.models + diff --git a/models/src/main/res/values/strings.xml b/models/src/main/res/values/strings.xml new file mode 100644 index 000000000..5d909ee86 --- /dev/null +++ b/models/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + models + diff --git a/models/src/test/java/code/name/monkey/models/ExampleUnitTest.java b/models/src/test/java/code/name/monkey/models/ExampleUnitTest.java new file mode 100644 index 000000000..126f09187 --- /dev/null +++ b/models/src/test/java/code/name/monkey/models/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package code.name.monkey.models; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file