diff --git a/.metadata b/.metadata
index 828f2c0a..01965b78 100644
--- a/.metadata
+++ b/.metadata
@@ -4,7 +4,7 @@
# This file should be version controlled and should not be manually edited.
version:
- revision: "300451adae589accbece3490f4396f10bdf15e6e"
+ revision: "c23637390482d4cf9598c3ce3f2be31aa7332daf"
channel: "stable"
project_type: app
@@ -13,11 +13,11 @@ project_type: app
migration:
platforms:
- platform: root
- create_revision: 300451adae589accbece3490f4396f10bdf15e6e
- base_revision: 300451adae589accbece3490f4396f10bdf15e6e
- - platform: windows
- create_revision: 300451adae589accbece3490f4396f10bdf15e6e
- base_revision: 300451adae589accbece3490f4396f10bdf15e6e
+ create_revision: c23637390482d4cf9598c3ce3f2be31aa7332daf
+ base_revision: c23637390482d4cf9598c3ce3f2be31aa7332daf
+ - platform: android
+ create_revision: c23637390482d4cf9598c3ce3f2be31aa7332daf
+ base_revision: c23637390482d4cf9598c3ce3f2be31aa7332daf
# User provided section
diff --git a/CONTRIBUTION.md b/CONTRIBUTION.md
index 50b698e2..b5ad2737 100644
--- a/CONTRIBUTION.md
+++ b/CONTRIBUTION.md
@@ -138,11 +138,11 @@ Do the following:
- Create a `.env` in root of the project following the `.env.example` template
- Now run the following to bootstrap the project
```bash
- flutter pub get && dart run build_runner build --delete-conflicting-outputs --enable-experiment=records,patterns
+ flutter pub get && flutter pub run build_runner build --delete-conflicting-outputs --enable-experiment=records,patterns
```
- Finally run these following commands in the root of the project to start the Spotube Locally
```bash
- flutter run -d )>
+ flutter run -d [window|macos|linux|android-id]
```
Do debugging/testing/build etc then submit to us with PR against the development branch (dev) & we'll review your code
diff --git a/Makefile b/Makefile
index 48626312..43c005ff 100644
--- a/Makefile
+++ b/Makefile
@@ -13,10 +13,10 @@ tar:
&& tar -cJf build/spotube-linux-${VERSION}-${PKG_ARCH}.tar.xz -C $(TEMP_DIR) .\
&& rm -rf $(TEMP_DIR)
-aursrcinfo:
+aurInfo:
docker run -e EXPORT_SRC=1 -v ${PWD}/aur-struct:/pkg -v ${MIRRORLIST}:/etc/pacman.d/mirrorlist:ro whynothugo/makepkg
-publishaur:
+aurPublish:
echo '[Warning!]: you need SSH paired with AUR'\
&& rm -rf build/spotube\
&& git clone ssh://aur@aur.archlinux.org/spotube-bin.git build/spotube\
@@ -26,7 +26,7 @@ publishaur:
&& git commit -m "${MSG}"\
&& git push
-innoinstall:
+innoInstall:
powershell curl -o build\installer.exe http://files.jrsoftware.org/is/6/innosetup-${INNO_VERSION}.exe
powershell git clone https://github.com/DomGries/InnoDependencyInstaller.git build\inno-depend
powershell build\installer.exe /verysilent /allusers /dir=build\iscc
@@ -41,7 +41,7 @@ choco:
apk:
mv build/app/outputs/apk/release/app-release.apk build/Spotube-android-all-arch.apk
-gensums:
+genSums:
sh -c scripts/gensums.sh
migrate:
diff --git a/android/.gitignore b/android/.gitignore
index 6f568019..be3943c9 100644
--- a/android/.gitignore
+++ b/android/.gitignore
@@ -5,9 +5,10 @@ gradle-wrapper.jar
/gradlew.bat
/local.properties
GeneratedPluginRegistrant.java
+.cxx/
# Remember to never publicly share your keystore.
-# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
+# See https://flutter.dev/to/reference-keystore
key.properties
**/*.keystore
**/*.jks
diff --git a/android/app/build.gradle b/android/app/build.gradle
deleted file mode 100644
index 5051f5a3..00000000
--- a/android/app/build.gradle
+++ /dev/null
@@ -1,139 +0,0 @@
-plugins {
- id "com.android.application"
- id "kotlin-android"
- id "dev.flutter.flutter-gradle-plugin"
-}
-
-def localProperties = new Properties()
-def localPropertiesFile = rootProject.file('local.properties')
-if (localPropertiesFile.exists()) {
- localPropertiesFile.withReader('UTF-8') { reader ->
- localProperties.load(reader)
- }
-}
-
-def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
-if (flutterVersionCode == null) {
- flutterVersionCode = '1'
-}
-
-def flutterVersionName = localProperties.getProperty('flutter.versionName')
-if (flutterVersionName == null) {
- flutterVersionName = '1.0'
-}
-
-def keystoreProperties = new Properties()
-def keystorePropertiesFile = rootProject.file('key.properties')
-if (keystorePropertiesFile.exists()) {
- keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
-}
-
-def composeVersion = "1.4.8"
-
-android {
- namespace "oss.krtirtho.spotube"
-
- compileSdkVersion 35
-
- ndkVersion = "27.0.12077973"
-
- compileOptions {
- coreLibraryDesugaringEnabled true
- sourceCompatibility JavaVersion.VERSION_1_8
- targetCompatibility JavaVersion.VERSION_1_8
- }
-
- kotlinOptions {
- jvmTarget = '1.8'
- }
-
- sourceSets {
- main.java.srcDirs += 'src/main/kotlin'
- }
-
- buildFeatures {
- compose true
- }
-
- composeOptions {
- kotlinCompilerExtensionVersion "$composeVersion" // Correlates with org.jetbrains.kotlin.android plugin in settings.gradle
- }
-
- defaultConfig {
- applicationId "oss.krtirtho.spotube"
- minSdkVersion 24
- targetSdkVersion 35
- versionCode flutterVersionCode.toInteger()
- versionName flutterVersionName
- multiDexEnabled true
- }
-
- signingConfigs {
- release {
- keyAlias keystoreProperties['keyAlias']
- keyPassword keystoreProperties['keyPassword']
- storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
- storePassword keystoreProperties['storePassword']
- }
- }
-
- buildTypes {
- release {
- signingConfig signingConfigs.release
- }
- debug {
- signingConfig signingConfigs.release
- }
- }
-
- flavorDimensions "default"
-
- productFlavors {
- nightly {
- dimension "default"
- resValue "string", "app_name_en", "Spotube Nightly"
- applicationIdSuffix ".nightly"
- versionNameSuffix "-nightly"
- signingConfig signingConfigs.release
- }
- dev {
- dimension "default"
- resValue "string", "app_name_en", "Spotube Dev"
- applicationIdSuffix ".dev"
- versionNameSuffix "-dev"
- signingConfig signingConfigs.release
- }
- stable {
- dimension "default"
- resValue "string", "app_name_en", "Spotube"
- signingConfig signingConfigs.release
- }
- }
-
- packagingOptions {
- resources.excludes += "DebugProbesKt.bin"
- }
-}
-
-flutter {
- source '../..'
-}
-
-def glanceVersion = "1.1.1"
-dependencies {
- coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.4'
-
- implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'
- // other deps so just ignore
- implementation 'com.android.support:multidex:2.0.1'
-
- implementation "androidx.glance:glance-appwidget:$glanceVersion"
- implementation "androidx.glance:glance-appwidget-preview:$glanceVersion"
- implementation "androidx.glance:glance-preview:$glanceVersion"
- implementation "androidx.glance:glance-material3:$glanceVersion"
- implementation "androidx.glance:glance-material:$glanceVersion"
- implementation "androidx.work:work-runtime-ktx:2.8.1"
-
- implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3"
- implementation 'com.google.code.gson:gson:2.11.0'
-}
\ No newline at end of file
diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts
new file mode 100644
index 00000000..51a28ff1
--- /dev/null
+++ b/android/app/build.gradle.kts
@@ -0,0 +1,44 @@
+plugins {
+ id("com.android.application")
+ id("kotlin-android")
+ // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
+ id("dev.flutter.flutter-gradle-plugin")
+}
+
+android {
+ namespace = "com.example.spotube"
+ compileSdk = flutter.compileSdkVersion
+ ndkVersion = flutter.ndkVersion
+
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_11
+ targetCompatibility = JavaVersion.VERSION_11
+ }
+
+ kotlinOptions {
+ jvmTarget = JavaVersion.VERSION_11.toString()
+ }
+
+ defaultConfig {
+ // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
+ applicationId = "com.example.spotube"
+ // You can update the following values to match your application needs.
+ // For more information, see: https://flutter.dev/to/review-gradle-config.
+ minSdk = flutter.minSdkVersion
+ targetSdk = flutter.targetSdkVersion
+ versionCode = flutter.versionCode
+ versionName = flutter.versionName
+ }
+
+ buildTypes {
+ release {
+ // TODO: Add your own signing config for the release build.
+ // Signing with the debug keys for now, so `flutter run --release` works.
+ signingConfig = signingConfigs.getByName("debug")
+ }
+ }
+}
+
+flutter {
+ source = "../.."
+}
diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro
deleted file mode 100644
index 700901e8..00000000
--- a/android/app/proguard-rules.pro
+++ /dev/null
@@ -1,21 +0,0 @@
--keep class androidx.lifecycle.DefaultLifecycleObserver
-
--keepnames class kotlinx.serialization.** { *; }
--keepnames class oss.krtirtho.spotube.glance.models.** { *; }
--keep @kotlinx.serialization.Serializable class *
--keepclassmembers class ** {
- @kotlinx.serialization.* ;
-}
-
-## We don't need beans
--dontwarn java.beans.BeanDescriptor
--dontwarn java.beans.BeanInfo
--dontwarn java.beans.IntrospectionException
--dontwarn java.beans.Introspector
--dontwarn java.beans.PropertyDescriptor
-
-## Rules for NewPipeExtractor
--keep class org.schabi.newpipe.extractor.timeago.patterns.** { *; }
--keep class org.mozilla.javascript.** { *; }
--keep class org.mozilla.classfile.ClassFileWriter
--dontwarn org.mozilla.javascript.tools.**
\ No newline at end of file
diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml
index a32d12af..399f6981 100644
--- a/android/app/src/debug/AndroidManifest.xml
+++ b/android/app/src/debug/AndroidManifest.xml
@@ -1,6 +1,7 @@
-
-
-
\ No newline at end of file
+
+
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 0effefe2..fa0ee0bd 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -1,141 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+ In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
+
+
+
+
+
+
+
diff --git a/android/app/src/main/java/io/flutter/app/FlutterMultiDexApplication.java b/android/app/src/main/java/io/flutter/app/FlutterMultiDexApplication.java
deleted file mode 100644
index 752fc185..00000000
--- a/android/app/src/main/java/io/flutter/app/FlutterMultiDexApplication.java
+++ /dev/null
@@ -1,25 +0,0 @@
-// Generated file.
-//
-// If you wish to remove Flutter's multidex support, delete this entire file.
-//
-// Modifications to this file should be done in a copy under a different name
-// as this file may be regenerated.
-
-package io.flutter.app;
-
-import android.app.Application;
-import android.content.Context;
-import androidx.annotation.CallSuper;
-import androidx.multidex.MultiDex;
-
-/**
- * Extension of {@link android.app.Application}, adding multidex support.
- */
-public class FlutterMultiDexApplication extends Application {
- @Override
- @CallSuper
- protected void attachBaseContext(Context base) {
- super.attachBaseContext(base);
- MultiDex.install(this);
- }
-}
diff --git a/android/app/src/main/kotlin/com/example/spotube/MainActivity.kt b/android/app/src/main/kotlin/com/example/spotube/MainActivity.kt
new file mode 100644
index 00000000..d593b415
--- /dev/null
+++ b/android/app/src/main/kotlin/com/example/spotube/MainActivity.kt
@@ -0,0 +1,5 @@
+package com.example.spotube
+
+import io.flutter.embedding.android.FlutterActivity
+
+class MainActivity : FlutterActivity()
diff --git a/android/app/src/main/kotlin/oss/krtirtho/spotube/MainActivity.kt b/android/app/src/main/kotlin/oss/krtirtho/spotube/MainActivity.kt
deleted file mode 100644
index 90debb71..00000000
--- a/android/app/src/main/kotlin/oss/krtirtho/spotube/MainActivity.kt
+++ /dev/null
@@ -1,6 +0,0 @@
-package oss.krtirtho.spotube
-
-import io.flutter.embedding.android.FlutterActivity
-
-class MainActivity: FlutterActivity() {
-}
diff --git a/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/HomePlayerWidget.kt b/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/HomePlayerWidget.kt
deleted file mode 100644
index a20af959..00000000
--- a/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/HomePlayerWidget.kt
+++ /dev/null
@@ -1,207 +0,0 @@
-package oss.krtirtho.spotube.glance
-
-import HomeWidgetGlanceState
-import HomeWidgetGlanceStateDefinition
-import android.R
-import android.content.Context
-import android.graphics.drawable.Icon
-import android.net.Uri
-import android.util.Log
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.unit.DpSize
-import androidx.compose.ui.unit.dp
-import androidx.glance.GlanceId
-import androidx.glance.GlanceModifier
-import androidx.glance.GlanceTheme
-import androidx.glance.Image
-import androidx.glance.ImageProvider
-import androidx.glance.LocalSize
-import androidx.glance.action.ActionParameters
-import androidx.glance.action.actionParametersOf
-import androidx.glance.action.clickable
-import androidx.glance.background
-import androidx.glance.appwidget.GlanceAppWidget
-import androidx.glance.appwidget.SizeMode
-import androidx.glance.appwidget.action.ActionCallback
-import androidx.glance.appwidget.action.actionRunCallback
-import androidx.glance.appwidget.background
-import androidx.glance.appwidget.components.CircleIconButton
-import androidx.glance.appwidget.components.Scaffold
-import androidx.glance.appwidget.cornerRadius
-import androidx.glance.appwidget.provideContent
-import androidx.glance.background
-import androidx.glance.currentState
-import androidx.glance.layout.Alignment
-import androidx.glance.layout.Box
-import androidx.glance.layout.Column
-import androidx.glance.layout.ContentScale
-import androidx.glance.layout.Row
-import androidx.glance.layout.Spacer
-import androidx.glance.layout.fillMaxSize
-import androidx.glance.layout.fillMaxWidth
-import androidx.glance.layout.padding
-import androidx.glance.layout.size
-import androidx.glance.preview.ExperimentalGlancePreviewApi
-import androidx.glance.preview.Preview
-import androidx.glance.state.GlanceStateDefinition
-import com.google.gson.Gson
-import es.antonborri.home_widget.HomeWidgetBackgroundIntent
-import es.antonborri.home_widget.actionStartActivity
-import oss.krtirtho.spotube.MainActivity
-import oss.krtirtho.spotube.glance.models.Track
-import oss.krtirtho.spotube.glance.widgets.FlutterAssetImageProvider
-import oss.krtirtho.spotube.glance.widgets.TrackDetailsView
-import oss.krtirtho.spotube.glance.widgets.TrackProgress
-
-val gson = Gson()
-val serverAddressKey = ActionParameters.Key("serverAddress")
-
-class Breakpoints {
- companion object {
- val SMALL_SQUARE = DpSize(100.dp, 100.dp)
- val HORIZONTAL_RECTANGLE = DpSize(250.dp, 100.dp)
- val BIG_SQUARE = DpSize(250.dp, 250.dp)
- }
-}
-
-class HomePlayerWidget : GlanceAppWidget() {
-
- override val sizeMode = SizeMode.Responsive(
- setOf(
- Breakpoints.SMALL_SQUARE,
- Breakpoints.HORIZONTAL_RECTANGLE,
- Breakpoints.BIG_SQUARE
- )
- )
-
- override val stateDefinition: GlanceStateDefinition<*>?
- get() = HomeWidgetGlanceStateDefinition()
-
- override suspend fun provideGlance(context: Context, id: GlanceId) {
- provideContent {
- GlanceContent(context, currentState())
- }
- }
-
-
- @OptIn(ExperimentalGlancePreviewApi::class)
- @Preview(widthDp = 100, heightDp = 100)
- @Composable
- private fun GlanceContent(context: Context, currentState: HomeWidgetGlanceState) {
- val prefs = currentState.preferences
- val size = LocalSize.current
-
- val activeTrackStr = prefs.getString("activeTrack", null)
-
- val isPlaying = prefs.getBoolean("isPlaying", false)
- val playbackServerAddress = prefs.getString("playbackServerAddress", null) ?: ""
-
- var activeTrack: Track? = null
- if (activeTrackStr != null) {
- activeTrack = gson.fromJson(activeTrackStr, Track::class.java)
- }
-
-
- val playIcon = Icon.createWithResource(context, R.drawable.ic_media_play);
- val pauseIcon = Icon.createWithResource(context, R.drawable.ic_media_pause);
- val previousIcon = Icon.createWithResource(context, R.drawable.ic_media_previous);
- val nextIcon = Icon.createWithResource(context, R.drawable.ic_media_next);
-
- GlanceTheme {
- Box(
- modifier = GlanceModifier
- .fillMaxSize()
- .cornerRadius(8.dp)
- .background(
- color = GlanceTheme.colors.surface.getColor(context)
- )
- .clickable {
- actionStartActivity(context)
- }
- ,
- ) {
- Box(
- modifier = GlanceModifier
- .background(
- color =
- GlanceTheme.colors.surface.getColor(context)
- .copy(alpha = 0.5f),
- )
- .fillMaxSize(),
- ) {}
- Column(
- modifier = GlanceModifier.padding(top = 10.dp, start = 10.dp, end = 10.dp)
- ) {
- Row(verticalAlignment = Alignment.Vertical.CenterVertically) {
- TrackDetailsView(activeTrack)
- }
- Spacer(modifier = GlanceModifier.size(6.dp))
- if (size != Breakpoints.SMALL_SQUARE) {
- TrackProgress(prefs)
- }
- Spacer(modifier = GlanceModifier.size(6.dp))
- Row(
- modifier = GlanceModifier.fillMaxWidth(),
- horizontalAlignment = Alignment.Horizontal.CenterHorizontally
- ) {
- CircleIconButton(
- imageProvider = ImageProvider(previousIcon),
- contentDescription = "Previous",
- onClick = actionRunCallback(
- parameters = actionParametersOf(serverAddressKey to playbackServerAddress)
- )
- )
- Spacer(modifier = GlanceModifier.size(6.dp))
- CircleIconButton(
- imageProvider =
- if (isPlaying) ImageProvider(pauseIcon)
- else ImageProvider(playIcon),
- contentDescription = "Play/Pause",
- onClick = actionRunCallback(
- parameters = actionParametersOf(serverAddressKey to playbackServerAddress)
- )
- )
- Spacer(modifier = GlanceModifier.size(6.dp))
- CircleIconButton(
- imageProvider = ImageProvider(nextIcon),
- contentDescription = "Previous",
- onClick = actionRunCallback(
- parameters = actionParametersOf(
- serverAddressKey to playbackServerAddress
- )
- )
- )
- }
- }
- }
- }
- }
-}
-
-class PlayPauseAction : InteractiveAction("toggle-playback")
-class NextAction : InteractiveAction("next")
-class PreviousAction : InteractiveAction("previous")
-
-
-abstract class InteractiveAction(val command: String) : ActionCallback {
- override suspend fun onAction(
- context: Context,
- glanceId: GlanceId,
- parameters: ActionParameters
- ) {
- val serverAddress = parameters[serverAddressKey] ?: ""
-
- Log.d("HomePlayerWidget", "Sending command $command to $serverAddress")
-
- if (serverAddress == null || serverAddress.isEmpty()) {
- return
- }
-
-
- val backgroundIntent = HomeWidgetBackgroundIntent.getBroadcast(
- context,
- Uri.parse("spotube://playback/$command?serverAddress=$serverAddress")
- )
- backgroundIntent.send()
- }
-}
diff --git a/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/HomePlayerWidgetReceiver.kt b/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/HomePlayerWidgetReceiver.kt
deleted file mode 100644
index 2d23c64f..00000000
--- a/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/HomePlayerWidgetReceiver.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-package oss.krtirtho.spotube.glance
-
-import HomeWidgetGlanceWidgetReceiver
-
-class HomePlayerWidgetReceiver : HomeWidgetGlanceWidgetReceiver() {
- override val glanceAppWidget = HomePlayerWidget()
-}
diff --git a/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/models/AlbumSimple.kt b/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/models/AlbumSimple.kt
deleted file mode 100644
index 4edd69f6..00000000
--- a/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/models/AlbumSimple.kt
+++ /dev/null
@@ -1,40 +0,0 @@
-package oss.krtirtho.spotube.glance.models
-
-import com.google.gson.annotations.SerializedName
-import kotlinx.serialization.Serializable
-
-@Serializable
-data class AlbumSimple(
- @SerializedName("album_type")
- val albumType: AlbumType?,
-
- @SerializedName("available_markets")
- val availableMarkets: List?,
-
- val href: String?,
- val id: String?,
- val images: List?,
- val name: String?,
-
- @SerializedName("release_date")
- val releaseDate: String?,
-
- @SerializedName("release_date_precision")
- val releaseDatePrecision: DatePrecision?,
-
- val type: String?,
- val uri: String?,
-)
-
-@Serializable
-enum class AlbumType {
- album,
- single,
- compilation
-}
-
-enum class DatePrecision {
- year,
- month,
- day
-}
\ No newline at end of file
diff --git a/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/models/Artist.kt b/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/models/Artist.kt
deleted file mode 100644
index ef43ecc8..00000000
--- a/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/models/Artist.kt
+++ /dev/null
@@ -1,25 +0,0 @@
-package oss.krtirtho.spotube.glance.models
-
-import com.google.gson.annotations.SerializedName
-import kotlinx.serialization.Serializable
-
-@Serializable
-data class Artist(
- val href: String?,
- val id: String?,
- val name: String?,
- val type: String?,
- val uri: String?,
-
- val followers: Followers?,
- val genres: List?,
- val images: List?,
-
- @SerializedName("popularity")
- val popularity: Int?
-)
-
-@Serializable
-data class Followers(
- val total: Int?
-)
diff --git a/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/models/Image.kt b/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/models/Image.kt
deleted file mode 100644
index de7d5521..00000000
--- a/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/models/Image.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-package oss.krtirtho.spotube.glance.models
-
-import kotlinx.serialization.Serializable
-
-@Serializable
-data class Image(
- val height: Int?,
- val width: Int?,
- val path: String,
-)
\ No newline at end of file
diff --git a/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/models/Track.kt b/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/models/Track.kt
deleted file mode 100644
index 717b790f..00000000
--- a/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/models/Track.kt
+++ /dev/null
@@ -1,37 +0,0 @@
-package oss.krtirtho.spotube.glance.models
-
-import com.google.gson.annotations.SerializedName
-import kotlinx.serialization.Serializable
-import kotlin.time.Duration.Companion.milliseconds
-
-@Serializable
-data class Track(
- val album: AlbumSimple?, val artists: List?,
-
- @SerializedName("available_markets") val availableMarkets: List?,
-
- @SerializedName("disc_number") val discNumber: Int?,
-
- @SerializedName("duration_ms") val durationMs: Int,
-
- val explicit: Boolean?, val href: String?, val id: String?,
-
- @SerializedName("is_playable") val isPlayable: Boolean?,
-
- val name: String?,
-
- @SerializedName("popularity") val popularity: Int?,
-
- @SerializedName("preview_url") val previewUrl: String?,
-
- @SerializedName("track_number") val trackNumber: Int?,
-
- val type: String?, val uri: String?
-) {
- val duration: kotlin.time.Duration
- get() = durationMs.toLong().milliseconds
-}
-
-enum class Market {
- AD, AE, AF, AG, AI, AL, AM, AO, AQ, AR, AS, AT, AU, AW, AX, AZ, BA, BB, BD, BE, BF, BG, BH, BI, BJ, BL, BM, BN, BO, BQ, BR, BS, BT, BV, BW, BY, BZ, CA, CC, CD, CF, CG, CH, CI, CK, CL, CM, CN, CO, CR, CU, CV, CW, CX, CY, CZ, DE, DJ, DK, DM, DO, DZ, EC, EE, EG, EH, ER, ES, ET, FI, FJ, FK, FM, FO, FR, GA, GB, GD, GE, GF, GG, GH, GI, GL, GM, GN, GP, GQ, GR, GS, GT, GU, GW, GY, HK, HM, HN, HR, HT, HU, ID, IE, IL, IM, IN, IO, IQ, IR, IS, IT, JE, JM, JO, JP, KE, KG, KH, KI, KM, KN, KP, KR, KW, KY, KZ, LA, LB, LC, LI, LK, LR, LS, LT, LU, LV, LY, MA, MC, MD, ME, MF, MG, MH, MK, ML, MM, MN, MO, MP, MQ, MR, MS, MT, MU, MV, MW, MX, MY, MZ, NA, NC, NE, NF, NG, NI, NL, NO, NP, NR, NU, NZ, OM, PA, PE, PF, PG, PH, PK, PL, PM, PN, PR, PS, PT, PW, PY, QA, RE, RO, RS, RU, RW, SA, SB, SC, SD, SE, SG, SH, SI, SJ, SK, SL, SM, SN, SO, SR, SS, ST, SV, SX, SY, SZ, TC, TD, TF, TG, TH, TJ, TK, TL, TM, TN, TO, TR, TT, TV, TW, TZ, UA, UG, UM, US, UY, UZ, VA, VC, VE, VG, VI, VN, VU, WF, WS, XK, YE, YT, ZA, ZM, ZW,
-}
diff --git a/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/widgets/Base64ImageProvider.kt b/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/widgets/Base64ImageProvider.kt
deleted file mode 100644
index 79339cea..00000000
--- a/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/widgets/Base64ImageProvider.kt
+++ /dev/null
@@ -1,14 +0,0 @@
-package oss.krtirtho.spotube.glance.widgets
-
-import android.graphics.BitmapFactory
-import android.util.Base64
-import androidx.glance.ImageProvider
-
-@Suppress("FunctionName")
-fun Base64ImageProvider(base64: String): ImageProvider {
- var bytes = Base64.decode(base64, Base64.DEFAULT);
-
- var bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.size);
-
- return ImageProvider(bitmap)
-}
\ No newline at end of file
diff --git a/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/widgets/FlutterAssetImageProvider.kt b/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/widgets/FlutterAssetImageProvider.kt
deleted file mode 100644
index ad51ca3c..00000000
--- a/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/widgets/FlutterAssetImageProvider.kt
+++ /dev/null
@@ -1,14 +0,0 @@
-package oss.krtirtho.spotube.glance.widgets
-
-import android.content.Context
-import android.graphics.BitmapFactory
-import androidx.glance.ImageProvider
-
-@Suppress("FunctionName")
-fun FlutterAssetImageProvider(context: Context, path: String): ImageProvider {
- var inputStream = context.assets.open("flutter_assets/$path")
-
- return ImageProvider(
- BitmapFactory.decodeStream(inputStream)
- )
-}
\ No newline at end of file
diff --git a/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/widgets/TrackDetailsView.kt b/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/widgets/TrackDetailsView.kt
deleted file mode 100644
index fdfe8e4b..00000000
--- a/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/widgets/TrackDetailsView.kt
+++ /dev/null
@@ -1,78 +0,0 @@
-package oss.krtirtho.spotube.glance.widgets
-
-import android.graphics.BitmapFactory
-import android.net.Uri
-import android.util.Log
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.unit.dp
-import androidx.compose.ui.unit.sp
-import androidx.glance.GlanceModifier
-import androidx.glance.GlanceTheme
-import androidx.glance.Image
-import androidx.glance.ImageProvider
-import androidx.glance.LocalContext
-import androidx.glance.LocalSize
-import androidx.glance.appwidget.cornerRadius
-import androidx.glance.layout.Alignment
-import androidx.glance.layout.Row
-import androidx.glance.layout.Column
-import androidx.glance.layout.ContentScale
-import androidx.glance.layout.Spacer
-import androidx.glance.layout.size
-import androidx.glance.text.FontWeight
-import androidx.glance.text.Text
-import androidx.glance.text.TextStyle
-import oss.krtirtho.spotube.glance.Breakpoints
-import oss.krtirtho.spotube.glance.models.Track
-
-@Composable
-fun TrackDetailsView(activeTrack: Track?) {
- val context = LocalContext.current
-
- val size = LocalSize.current
-
- val artistStr = activeTrack?.artists?.map { it.name }?.joinToString(", ") ?: ""
- val imgLocalPath = activeTrack?.album?.images?.get(0)?.path;
- val title = activeTrack?.name ?: ""
-
-
- Image(
- provider =
- if (imgLocalPath == null)
- ImageProvider(
- BitmapFactory.decodeResource(
- context.resources,
- android.R.drawable.ic_delete
- )
- )
- else ImageProvider(BitmapFactory.decodeFile(imgLocalPath)),
- contentDescription = "Album Art",
- modifier = GlanceModifier.cornerRadius(8.dp)
- .size(
- if (size.height < 200.dp) 50.dp
- else 100.dp
- ),
- contentScale = ContentScale.Fit
- )
- Spacer(modifier = GlanceModifier.size(6.dp))
- Column {
- Text(
- text = title,
- style = TextStyle(
- fontSize = 16.sp,
- fontWeight = FontWeight.Bold,
- color = GlanceTheme.colors.onBackground
- ),
- )
- if (size != Breakpoints.SMALL_SQUARE) {
- Spacer(modifier = GlanceModifier.size(6.dp))
- Text(
- text = artistStr,
- style = TextStyle(
- fontSize = 14.sp,
- color = GlanceTheme.colors.onBackground
- ),
- )
- }
- }
-}
\ No newline at end of file
diff --git a/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/widgets/TrackProgress.kt b/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/widgets/TrackProgress.kt
deleted file mode 100644
index b54059b1..00000000
--- a/android/app/src/main/kotlin/oss/krtirtho/spotube/glance/widgets/TrackProgress.kt
+++ /dev/null
@@ -1,77 +0,0 @@
-package oss.krtirtho.spotube.glance.widgets
-
-import android.content.SharedPreferences
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.unit.dp
-import androidx.glance.GlanceModifier
-import androidx.glance.GlanceTheme
-import androidx.glance.LocalSize
-import androidx.glance.appwidget.LinearProgressIndicator
-import androidx.glance.layout.Column
-import androidx.glance.layout.Row
-import androidx.glance.layout.Spacer
-import androidx.glance.layout.fillMaxWidth
-import androidx.glance.layout.size
-import androidx.glance.text.Text
-import androidx.glance.text.TextStyle
-import kotlin.math.max
-import kotlin.time.Duration
-import kotlin.time.Duration.Companion.seconds
-import oss.krtirtho.spotube.glance.Breakpoints
-
-fun Duration.format(): String {
- return this.toComponents { hour, minutes, seconds, nanoseconds ->
- var paddedSeconds = seconds.toString().padStart(2, '0')
- var paddedMinutes = minutes.toString().padStart(2, '0')
- var paddedHour = hour.toString().padStart(2, '0')
- if (hour == 0L) {
- "$paddedMinutes:$paddedSeconds"
- } else {
- "$paddedHour:$paddedMinutes:$paddedSeconds"
- }
- }
-}
-
-@Composable
-fun TrackProgress(prefs: SharedPreferences) {
- val size = LocalSize.current
- val position = prefs.getInt("position", 0).seconds
- var duration = prefs.getInt("duration", 0).seconds
-
- var progress = position.inWholeSeconds.toFloat() / max(duration.inWholeSeconds.toFloat(), 1.0f)
-
- var textStyle =
- TextStyle(
- color = GlanceTheme.colors.onBackground,
- )
-
- if (size == Breakpoints.HORIZONTAL_RECTANGLE) {
- Row(modifier = GlanceModifier.fillMaxWidth()) {
- Text(text = position.format(), style = textStyle)
- Spacer(modifier = GlanceModifier.size(6.dp))
- LinearProgressIndicator(
- progress = progress,
- modifier = GlanceModifier.defaultWeight(),
- color = GlanceTheme.colors.primary,
- backgroundColor = GlanceTheme.colors.primaryContainer,
- )
- Spacer(modifier = GlanceModifier.size(6.dp))
- Text(text = duration.format(), style = textStyle)
- }
- } else {
- Column(modifier = GlanceModifier.fillMaxWidth()) {
- LinearProgressIndicator(
- progress = progress,
- modifier = GlanceModifier.fillMaxWidth(),
- color = GlanceTheme.colors.primary,
- backgroundColor = GlanceTheme.colors.primaryContainer,
- )
- Spacer(modifier = GlanceModifier.size(6.dp))
- Row(modifier = GlanceModifier.fillMaxWidth()) {
- Text(text = position.format(), style = textStyle)
- Spacer(modifier = GlanceModifier.defaultWeight())
- Text(text = duration.format(), style = textStyle)
- }
- }
- }
-}
diff --git a/android/app/src/main/res/drawable-hdpi-v31/android12branding.png b/android/app/src/main/res/drawable-hdpi-v31/android12branding.png
deleted file mode 100644
index fff3f148..00000000
Binary files a/android/app/src/main/res/drawable-hdpi-v31/android12branding.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-hdpi/android12splash.png b/android/app/src/main/res/drawable-hdpi/android12splash.png
deleted file mode 100644
index 0d4e1c68..00000000
Binary files a/android/app/src/main/res/drawable-hdpi/android12splash.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-hdpi/branding.png b/android/app/src/main/res/drawable-hdpi/branding.png
deleted file mode 100644
index fff3f148..00000000
Binary files a/android/app/src/main/res/drawable-hdpi/branding.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-hdpi/ic_launcher_background.png b/android/app/src/main/res/drawable-hdpi/ic_launcher_background.png
deleted file mode 100644
index 696717ef..00000000
Binary files a/android/app/src/main/res/drawable-hdpi/ic_launcher_background.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png
deleted file mode 100644
index a65caa1b..00000000
Binary files a/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-hdpi/splash.png b/android/app/src/main/res/drawable-hdpi/splash.png
deleted file mode 100644
index 0979b5e4..00000000
Binary files a/android/app/src/main/res/drawable-hdpi/splash.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-mdpi-v31/android12branding.png b/android/app/src/main/res/drawable-mdpi-v31/android12branding.png
deleted file mode 100644
index 5a197da3..00000000
Binary files a/android/app/src/main/res/drawable-mdpi-v31/android12branding.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-mdpi/android12splash.png b/android/app/src/main/res/drawable-mdpi/android12splash.png
deleted file mode 100644
index 5d9760d4..00000000
Binary files a/android/app/src/main/res/drawable-mdpi/android12splash.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-mdpi/branding.png b/android/app/src/main/res/drawable-mdpi/branding.png
deleted file mode 100644
index 5a197da3..00000000
Binary files a/android/app/src/main/res/drawable-mdpi/branding.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-mdpi/ic_launcher_background.png b/android/app/src/main/res/drawable-mdpi/ic_launcher_background.png
deleted file mode 100644
index d2bb407f..00000000
Binary files a/android/app/src/main/res/drawable-mdpi/ic_launcher_background.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png
deleted file mode 100644
index 3ad0f47e..00000000
Binary files a/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-mdpi/splash.png b/android/app/src/main/res/drawable-mdpi/splash.png
deleted file mode 100644
index c5e4aca0..00000000
Binary files a/android/app/src/main/res/drawable-mdpi/splash.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-night-hdpi-v31/android12branding.png b/android/app/src/main/res/drawable-night-hdpi-v31/android12branding.png
deleted file mode 100644
index fff3f148..00000000
Binary files a/android/app/src/main/res/drawable-night-hdpi-v31/android12branding.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-night-hdpi/android12splash.png b/android/app/src/main/res/drawable-night-hdpi/android12splash.png
deleted file mode 100644
index 0d4e1c68..00000000
Binary files a/android/app/src/main/res/drawable-night-hdpi/android12splash.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-night-mdpi-v31/android12branding.png b/android/app/src/main/res/drawable-night-mdpi-v31/android12branding.png
deleted file mode 100644
index 5a197da3..00000000
Binary files a/android/app/src/main/res/drawable-night-mdpi-v31/android12branding.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-night-mdpi/android12splash.png b/android/app/src/main/res/drawable-night-mdpi/android12splash.png
deleted file mode 100644
index 5d9760d4..00000000
Binary files a/android/app/src/main/res/drawable-night-mdpi/android12splash.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-night-xhdpi-v31/android12branding.png b/android/app/src/main/res/drawable-night-xhdpi-v31/android12branding.png
deleted file mode 100644
index efc7e6c8..00000000
Binary files a/android/app/src/main/res/drawable-night-xhdpi-v31/android12branding.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-night-xhdpi/android12splash.png b/android/app/src/main/res/drawable-night-xhdpi/android12splash.png
deleted file mode 100644
index 8e5ceb0a..00000000
Binary files a/android/app/src/main/res/drawable-night-xhdpi/android12splash.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-night-xxhdpi-v31/android12branding.png b/android/app/src/main/res/drawable-night-xxhdpi-v31/android12branding.png
deleted file mode 100644
index 593877e0..00000000
Binary files a/android/app/src/main/res/drawable-night-xxhdpi-v31/android12branding.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png b/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png
deleted file mode 100644
index fb89da37..00000000
Binary files a/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-night-xxxhdpi-v31/android12branding.png b/android/app/src/main/res/drawable-night-xxxhdpi-v31/android12branding.png
deleted file mode 100644
index 9d233302..00000000
Binary files a/android/app/src/main/res/drawable-night-xxxhdpi-v31/android12branding.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png b/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png
deleted file mode 100644
index 38e4a12c..00000000
Binary files a/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-v21/background.png b/android/app/src/main/res/drawable-v21/background.png
deleted file mode 100644
index 203fc77a..00000000
Binary files a/android/app/src/main/res/drawable-v21/background.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml
index 52e8749e..f74085f3 100644
--- a/android/app/src/main/res/drawable-v21/launch_background.xml
+++ b/android/app/src/main/res/drawable-v21/launch_background.xml
@@ -1,12 +1,12 @@
+
- -
-
-
- -
-
-
- -
-
-
+
+
+
+
diff --git a/android/app/src/main/res/drawable-xhdpi-v31/android12branding.png b/android/app/src/main/res/drawable-xhdpi-v31/android12branding.png
deleted file mode 100644
index efc7e6c8..00000000
Binary files a/android/app/src/main/res/drawable-xhdpi-v31/android12branding.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-xhdpi/android12splash.png b/android/app/src/main/res/drawable-xhdpi/android12splash.png
deleted file mode 100644
index 8e5ceb0a..00000000
Binary files a/android/app/src/main/res/drawable-xhdpi/android12splash.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-xhdpi/branding.png b/android/app/src/main/res/drawable-xhdpi/branding.png
deleted file mode 100644
index efc7e6c8..00000000
Binary files a/android/app/src/main/res/drawable-xhdpi/branding.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-xhdpi/ic_launcher_background.png b/android/app/src/main/res/drawable-xhdpi/ic_launcher_background.png
deleted file mode 100644
index 534e957f..00000000
Binary files a/android/app/src/main/res/drawable-xhdpi/ic_launcher_background.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png
deleted file mode 100644
index 8774c0ff..00000000
Binary files a/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-xhdpi/splash.png b/android/app/src/main/res/drawable-xhdpi/splash.png
deleted file mode 100644
index 41222c6c..00000000
Binary files a/android/app/src/main/res/drawable-xhdpi/splash.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-xxhdpi-v31/android12branding.png b/android/app/src/main/res/drawable-xxhdpi-v31/android12branding.png
deleted file mode 100644
index 593877e0..00000000
Binary files a/android/app/src/main/res/drawable-xxhdpi-v31/android12branding.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-xxhdpi/android12splash.png b/android/app/src/main/res/drawable-xxhdpi/android12splash.png
deleted file mode 100644
index fb89da37..00000000
Binary files a/android/app/src/main/res/drawable-xxhdpi/android12splash.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-xxhdpi/branding.png b/android/app/src/main/res/drawable-xxhdpi/branding.png
deleted file mode 100644
index 593877e0..00000000
Binary files a/android/app/src/main/res/drawable-xxhdpi/branding.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_launcher_background.png b/android/app/src/main/res/drawable-xxhdpi/ic_launcher_background.png
deleted file mode 100644
index c1eaa966..00000000
Binary files a/android/app/src/main/res/drawable-xxhdpi/ic_launcher_background.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png
deleted file mode 100644
index a379c006..00000000
Binary files a/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-xxhdpi/splash.png b/android/app/src/main/res/drawable-xxhdpi/splash.png
deleted file mode 100644
index 5ab19d32..00000000
Binary files a/android/app/src/main/res/drawable-xxhdpi/splash.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-xxxhdpi-v31/android12branding.png b/android/app/src/main/res/drawable-xxxhdpi-v31/android12branding.png
deleted file mode 100644
index 9d233302..00000000
Binary files a/android/app/src/main/res/drawable-xxxhdpi-v31/android12branding.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-xxxhdpi/android12splash.png b/android/app/src/main/res/drawable-xxxhdpi/android12splash.png
deleted file mode 100644
index 38e4a12c..00000000
Binary files a/android/app/src/main/res/drawable-xxxhdpi/android12splash.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-xxxhdpi/branding.png b/android/app/src/main/res/drawable-xxxhdpi/branding.png
deleted file mode 100644
index 9d233302..00000000
Binary files a/android/app/src/main/res/drawable-xxxhdpi/branding.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_background.png b/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_background.png
deleted file mode 100644
index 6c7c4636..00000000
Binary files a/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_background.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png
deleted file mode 100644
index 44621df8..00000000
Binary files a/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable-xxxhdpi/splash.png b/android/app/src/main/res/drawable-xxxhdpi/splash.png
deleted file mode 100644
index a6d40b89..00000000
Binary files a/android/app/src/main/res/drawable-xxxhdpi/splash.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable/background.png b/android/app/src/main/res/drawable/background.png
deleted file mode 100644
index 203fc77a..00000000
Binary files a/android/app/src/main/res/drawable/background.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable/ic_launcher_monochrome.xml b/android/app/src/main/res/drawable/ic_launcher_monochrome.xml
deleted file mode 100644
index 8aae0e6c..00000000
--- a/android/app/src/main/res/drawable/ic_launcher_monochrome.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml
index 52e8749e..304732f8 100644
--- a/android/app/src/main/res/drawable/launch_background.xml
+++ b/android/app/src/main/res/drawable/launch_background.xml
@@ -1,12 +1,12 @@
+
- -
-
-
- -
-
-
- -
-
-
+
+
+
+
diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
deleted file mode 100644
index f606c4d8..00000000
--- a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
index d26a3a6e..db77bb4b 100644
Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
index 63d16c60..17987b79 100644
Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
index fe2957ad..09d43914 100644
Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
index 85c1d793..d5f1c8d3 100644
Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
index f22fa5cf..4d6372ee 100644
Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/values-night-v31/styles.xml b/android/app/src/main/res/values-night-v31/styles.xml
deleted file mode 100644
index 96980835..00000000
--- a/android/app/src/main/res/values-night-v31/styles.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
-
diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml
index 5eb2eda1..06952be7 100644
--- a/android/app/src/main/res/values-night/styles.xml
+++ b/android/app/src/main/res/values-night/styles.xml
@@ -3,12 +3,8 @@
-
-
-
-
diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml
deleted file mode 100644
index 88247a21..00000000
--- a/android/app/src/main/res/values/colors.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
- #242832
-
\ No newline at end of file
diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml
index 0fdc7036..cb1ef880 100644
--- a/android/app/src/main/res/values/styles.xml
+++ b/android/app/src/main/res/values/styles.xml
@@ -3,12 +3,8 @@
-
-
-
-
diff --git a/android/app/src/nightly/res/values-night/styles.xml b/android/app/src/nightly/res/values-night/styles.xml
deleted file mode 100644
index dbc9ea9f..00000000
--- a/android/app/src/nightly/res/values-night/styles.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
diff --git a/android/app/src/nightly/res/values-v31/styles.xml b/android/app/src/nightly/res/values-v31/styles.xml
deleted file mode 100644
index 981a07a9..00000000
--- a/android/app/src/nightly/res/values-v31/styles.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
-
diff --git a/android/app/src/nightly/res/values/colors.xml b/android/app/src/nightly/res/values/colors.xml
deleted file mode 100644
index 88247a21..00000000
--- a/android/app/src/nightly/res/values/colors.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
- #242832
-
\ No newline at end of file
diff --git a/android/app/src/nightly/res/values/styles.xml b/android/app/src/nightly/res/values/styles.xml
deleted file mode 100644
index 0d1fa8fc..00000000
--- a/android/app/src/nightly/res/values/styles.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml
index a32d12af..399f6981 100644
--- a/android/app/src/profile/AndroidManifest.xml
+++ b/android/app/src/profile/AndroidManifest.xml
@@ -1,6 +1,7 @@
-
-
-
\ No newline at end of file
+
+
diff --git a/android/build.gradle b/android/build.gradle
deleted file mode 100644
index 8f31e8ca..00000000
--- a/android/build.gradle
+++ /dev/null
@@ -1,18 +0,0 @@
-allprojects {
- repositories {
- google()
- mavenCentral()
- }
-}
-
-rootProject.buildDir = '../build'
-subprojects {
- project.buildDir = "${rootProject.buildDir}/${project.name}"
-}
-subprojects {
- project.evaluationDependsOn(':app')
-}
-
-tasks.register("clean", Delete) {
- delete rootProject.buildDir
-}
\ No newline at end of file
diff --git a/android/build.gradle.kts b/android/build.gradle.kts
new file mode 100644
index 00000000..89176ef4
--- /dev/null
+++ b/android/build.gradle.kts
@@ -0,0 +1,21 @@
+allprojects {
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+
+val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get()
+rootProject.layout.buildDirectory.value(newBuildDir)
+
+subprojects {
+ val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name)
+ project.layout.buildDirectory.value(newSubprojectBuildDir)
+}
+subprojects {
+ project.evaluationDependsOn(":app")
+}
+
+tasks.register("clean") {
+ delete(rootProject.layout.buildDirectory)
+}
diff --git a/android/gradle.properties b/android/gradle.properties
index ed508580..f018a618 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -1,3 +1,3 @@
-org.gradle.jvmargs=-Xmx4608m
+org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
android.useAndroidX=true
android.enableJetifier=true
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
index bf6b7385..afa1e8eb 100644
--- a/android/gradle/wrapper/gradle-wrapper.properties
+++ b/android/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,5 @@
-#Fri Dec 13 21:53:13 BDT 2024
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip
diff --git a/android/settings.gradle b/android/settings.gradle
deleted file mode 100644
index 1e8ffbe3..00000000
--- a/android/settings.gradle
+++ /dev/null
@@ -1,25 +0,0 @@
-pluginManagement {
- def flutterSdkPath = {
- def properties = new Properties()
- file("local.properties").withInputStream { properties.load(it) }
- def flutterSdkPath = properties.getProperty("flutter.sdk")
- assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
- return flutterSdkPath
- }()
-
- includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
-
- repositories {
- google()
- mavenCentral()
- gradlePluginPortal()
- }
-}
-
-plugins {
- id "dev.flutter.flutter-plugin-loader" version "1.0.0"
- id "com.android.application" version '8.7.0' apply false
- id "org.jetbrains.kotlin.android" version "1.8.22" apply false
-}
-
-include ':app'
\ No newline at end of file
diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts
new file mode 100644
index 00000000..a439442c
--- /dev/null
+++ b/android/settings.gradle.kts
@@ -0,0 +1,25 @@
+pluginManagement {
+ val flutterSdkPath = run {
+ val properties = java.util.Properties()
+ file("local.properties").inputStream().use { properties.load(it) }
+ val flutterSdkPath = properties.getProperty("flutter.sdk")
+ require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" }
+ flutterSdkPath
+ }
+
+ includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
+
+ repositories {
+ google()
+ mavenCentral()
+ gradlePluginPortal()
+ }
+}
+
+plugins {
+ id("dev.flutter.flutter-plugin-loader") version "1.0.0"
+ id("com.android.application") version "8.7.0" apply false
+ id("org.jetbrains.kotlin.android") version "1.8.22" apply false
+}
+
+include(":app")
diff --git a/assets/spotube-icon.png b/assets/spotube-icon.png
new file mode 100644
index 00000000..69ce5707
Binary files /dev/null and b/assets/spotube-icon.png differ
diff --git a/flutter_launcher_icons-nightly.yaml b/flutter_launcher_icons-nightly.yaml
index c6892d4b..63b85aa1 100644
--- a/flutter_launcher_icons-nightly.yaml
+++ b/flutter_launcher_icons-nightly.yaml
@@ -1,6 +1,6 @@
flutter_launcher_icons:
android: true
ios: true
- image_path: "assets/spotube-nightly-logo.png"
- adaptive_icon_foreground: "assets/spotube-nightly-logo-foreground.jpg"
+ image_path: "assets/spotube-icon.png"
+# adaptive_icon_foreground: "assets/spotube-nightly-logo-foreground.jpg"
adaptive_icon_background: "#242832"
diff --git a/flutter_launcher_icons.yaml b/flutter_launcher_icons.yaml
index 372117b1..fd42be17 100644
--- a/flutter_launcher_icons.yaml
+++ b/flutter_launcher_icons.yaml
@@ -1,29 +1,33 @@
# flutter pub run flutter_launcher_icons
flutter_launcher_icons:
- image_path: "assets/spotube-logo.png"
+ image_path: "assets/spotube-icon.png"
- android: true
- # image_path_android: "assets/icon/icon.png"
- min_sdk_android: 21 # android min sdk min:16, default 21
- adaptive_icon_background: "#242832"
- adaptive_icon_foreground: "assets/spotube-logo-foreground.jpg"
- # adaptive_icon_monochrome: "assets/icon/monochrome.png"
+ android:
+ image_path_android: "assets/spotube-icon.png"
+ min_sdk_android: 21 # android min sdk min:16, default 21
+ adaptive_icon_background: "#242832"
+ # adaptive_icon_foreground: "assets/spotube-icon-foreground.jpg"
+ # adaptive_icon_monochrome: "assets/icon/monochrome.png"
- ios: true
- # image_path_ios: "assets/icon/icon.png"
- remove_alpha_channel_ios: true
- # image_path_ios_dark_transparent: "assets/icon/icon_dark.png"
- # image_path_ios_tinted_grayscale: "assets/icon/icon_tinted.png"
- # desaturate_tinted_to_grayscale_ios: true
+ ios:
+# image_path_ios: "assets/spotube-icon.png"
+ remove_alpha_channel_ios: true
+ # image_path_ios_dark_transparent: "assets/icon/icon_dark.png"
+ # image_path_ios_tinted_grayscale: "assets/icon/icon_tinted.png"
+ desaturate_tinted_to_grayscale_ios: true
web:
generate: false
windows:
generate: true
- image_path: "assets/spotube-logo.png"
- icon_size: 48 # min:48, max:256, default: 48
+ image_path: "assets/spotube-icon.png"
+ icon_size: 48
+
+ linux:
+ generate: true
+ image_path: "assets/spotube-icon.png"
macos:
generate: true
- image_path: "assets/spotube-logo-macos.png"
+ image_path: "assets/spotube-icon.png"
diff --git a/flutter_native_splash-nightly.yaml b/flutter_native_splash-nightly.yaml
index 37da37d9..96e83c00 100644
--- a/flutter_native_splash-nightly.yaml
+++ b/flutter_native_splash-nightly.yaml
@@ -1,9 +1,10 @@
-flutter_native_splash:
- background_image: assets/bengali-patterns-bg.jpg
- image: assets/spotube-nightly-logo.png
- branding: assets/branding.png
- android_12:
- image: assets/spotube-nightly-logo_android12.png
- branding: assets/branding.png
- color: "#000000"
- icon_background_color: "#000000"
+#flutter_native_splash:
+# background_image: assets/bengali-patterns-bg.jpg
+# image: assets/spotube-nightly-logo.png
+# branding: assets/branding.png
+# android_12:
+# image: assets/spotube-nightly-logo_android12.png
+# branding: assets/branding.png
+# color: "#000000"
+# icon_background_color: "#000000"
+
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-1024x1024@1x.png
index dbc4596b..7bd3d002 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-1024x1024@1x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-1024x1024@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-20x20@1x.png
index 4836771d..9783a55e 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-20x20@1x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-20x20@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-20x20@2x.png
index 90954ce9..a7e90cc2 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-20x20@2x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-20x20@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-20x20@3x.png
index 9c0ebd5f..21c358cc 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-20x20@3x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-20x20@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-29x29@1x.png
index 94cd79be..156206ad 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-29x29@1x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-29x29@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-29x29@2x.png
index ff70cab7..c279b3cd 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-29x29@2x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-29x29@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-29x29@3x.png
index 6cdda1b6..452fc1aa 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-29x29@3x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-29x29@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-40x40@1x.png
index 90954ce9..a7e90cc2 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-40x40@1x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-40x40@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-40x40@2x.png
index 5184f84f..1e405387 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-40x40@2x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-40x40@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-40x40@3x.png
index 57e21a75..b9a63aac 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-40x40@3x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-40x40@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-50x50@1x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-50x50@1x.png
index 93e157b6..0af77bfc 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-50x50@1x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-50x50@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-50x50@2x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-50x50@2x.png
index d175beb2..e0ad7f7b 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-50x50@2x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-50x50@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-57x57@1x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-57x57@1x.png
index 6d634c87..6ed03b2a 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-57x57@1x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-57x57@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-57x57@2x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-57x57@2x.png
index 22da4950..20a2bb6d 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-57x57@2x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-57x57@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-60x60@2x.png
index 57e21a75..b9a63aac 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-60x60@2x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-60x60@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-60x60@3x.png
index 3cfd01c2..5a75a3cb 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-60x60@3x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-60x60@3x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-72x72@1x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-72x72@1x.png
index a826bb73..003a521b 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-72x72@1x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-72x72@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-72x72@2x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-72x72@2x.png
index 3a8a7832..ba483744 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-72x72@2x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-72x72@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-76x76@1x.png
index f233322b..f4915aa1 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-76x76@1x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-76x76@1x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-76x76@2x.png
index 2f5b082a..7661c456 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-76x76@2x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-76x76@2x.png differ
diff --git a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-83.5x83.5@2x.png
index e4ecc19a..c5ee50f9 100644
Binary files a/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-83.5x83.5@2x.png and b/ios/Runner/Assets.xcassets/AppIcon-nightly.appiconset/AppIcon-nightly-83.5x83.5@2x.png differ
diff --git a/lib/collections/assets.gen.dart b/lib/collections/assets.gen.dart
index d5e4f954..c0b2224d 100644
--- a/lib/collections/assets.gen.dart
+++ b/lib/collections/assets.gen.dart
@@ -146,6 +146,8 @@ class Assets {
static const $AssetsPatternsGen patterns = $AssetsPatternsGen();
static const AssetGenImage placeholder =
AssetGenImage('assets/placeholder.png');
+ static const AssetGenImage spotubeIcon =
+ AssetGenImage('assets/spotube-icon.png');
static const AssetGenImage spotubeLogoNightlyNotWallpaper =
AssetGenImage('assets/spotube-logo-nightly-notWallpaper.png');
static const AssetGenImage spotubeLogoStableNotWallpaper =
@@ -166,6 +168,7 @@ class Assets {
jiosaavn,
likedTracks,
placeholder,
+ spotubeIcon,
spotubeLogoNightlyNotWallpaper,
spotubeLogoStableNotWallpaper,
spotubeLogoStableWallpaper,
diff --git a/lib/collections/intents.dart b/lib/collections/intents.dart
index e4e3fa07..42c580ca 100644
--- a/lib/collections/intents.dart
+++ b/lib/collections/intents.dart
@@ -75,7 +75,7 @@ class HomeTabAction extends Action {
router.navigate(const SearchRoute());
break;
case HomeTabs.lyrics:
- router.navigate(LyricsRoute());
+ router.navigate(const LyricsRoute());
break;
case HomeTabs.userPlaylists:
router.navigate(const UserPlaylistsRoute());
diff --git a/lib/generated_plugin_registrant.dart b/lib/generated_plugin_registrant.dart
deleted file mode 100644
index 68940c8d..00000000
--- a/lib/generated_plugin_registrant.dart
+++ /dev/null
@@ -1,22 +0,0 @@
-//
-// Generated file. Do not edit.
-//
-
-// ignore_for_file: directives_ordering
-// ignore_for_file: lines_longer_than_80_chars
-// ignore_for_file: depend_on_referenced_packages
-
-import 'package:audio_service_web/audio_service_web.dart';
-import 'package:audio_session/audio_session_web.dart';
-import 'package:flutter_web_plugins/flutter_web_plugins.dart';
-import 'package:shared_preferences_web/shared_preferences_web.dart';
-import 'package:url_launcher_web/url_launcher_web.dart';
-
-// ignore: public_member_api_docs
-void registerPlugins(Registrar registrar) {
- AudioServiceWeb.registerWith(registrar);
- AudioSessionWeb.registerWith(registrar);
- SharedPreferencesPlugin.registerWith(registrar);
- UrlLauncherPlugin.registerWith(registrar);
- registrar.registerMessageHandler();
-}
diff --git a/lib/main.dart b/lib/main.dart
index 76ffaea3..644efcc3 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -10,7 +10,7 @@ import 'package:flutter_displaymode/flutter_displaymode.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_native_splash/flutter_native_splash.dart';
-import 'package:flutter_new_pipe_extractor/flutter_new_pipe_extractor.dart';
+// import 'package:flutter_new_pipe_extractor/flutter_new_pipe_extractor.dart';
import 'package:home_widget/home_widget.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:local_notifier/local_notifier.dart';
@@ -76,7 +76,7 @@ Future main(List rawArgs) async {
if (kIsAndroid) {
await FlutterDisplayMode.setHighRefreshRate();
- await NewPipeExtractor.init();
+ // await NewPipeExtractor.init();
}
if (!kIsWeb) {
diff --git a/lib/models/database/database.dart b/lib/models/database/database.dart
index 720c302d..a7b60205 100644
--- a/lib/models/database/database.dart
+++ b/lib/models/database/database.dart
@@ -18,7 +18,7 @@ import 'package:spotube/modules/settings/color_scheme_picker_dialog.dart';
import 'package:spotube/services/kv_store/encrypted_kv_store.dart';
import 'package:spotube/services/kv_store/kv_store.dart';
import 'package:spotube/services/sourced_track/enums.dart';
-import 'package:spotube/services/youtube_engine/newpipe_engine.dart';
+// import 'package:spotube/services/youtube_engine/newpipe_engine.dart';
import 'package:spotube/services/youtube_engine/youtube_explode_engine.dart';
import 'package:spotube/services/youtube_engine/yt_dlp_engine.dart';
import 'package:sqlite3/sqlite3.dart';
diff --git a/lib/models/database/tables/preferences.dart b/lib/models/database/tables/preferences.dart
index d0427ac3..a1e44b95 100644
--- a/lib/models/database/tables/preferences.dart
+++ b/lib/models/database/tables/preferences.dart
@@ -34,7 +34,9 @@ enum YoutubeClientEngine {
YoutubeClientEngine.youtubeExplode =>
YouTubeExplodeEngine.isAvailableForPlatform,
YoutubeClientEngine.ytDlp => YtDlpEngine.isAvailableForPlatform,
- YoutubeClientEngine.newPipe => NewPipeEngine.isAvailableForPlatform,
+ // YoutubeClientEngine.newPipe => NewPipeEngine.isAvailableForPlatform,
+ // TODO: Handle this case.
+ YoutubeClientEngine.newPipe => throw UnimplementedError(),
};
}
}
@@ -125,7 +127,7 @@ class PreferencesTable extends Table {
albumColorSync: true,
amoledDarkTheme: false,
checkUpdate: true,
- normalizeAudio: false,
+ normalizeAudio: true,
showSystemTrayIcon: false,
systemTitleBar: false,
skipNonMusic: true,
diff --git a/lib/modules/home/sections/feed.dart b/lib/modules/home/sections/feed.dart
index d3e363cc..216dc491 100644
--- a/lib/modules/home/sections/feed.dart
+++ b/lib/modules/home/sections/feed.dart
@@ -12,7 +12,7 @@ class HomePageFeedSection extends HookConsumerWidget {
@override
Widget build(BuildContext context, ref) {
final homeFeed = ref.watch(homeViewProvider);
- final nonShortSections = homeFeed.asData?.value?.sections
+ final nonShortSections = homeFeed.asData?.value.sections
.where((s) => s.typename == "HomeGenericSectionData")
.toList() ??
[];
diff --git a/lib/modules/root/spotube_navigation_bar.dart b/lib/modules/root/spotube_navigation_bar.dart
index fb8ad075..d9a3a1f9 100644
--- a/lib/modules/root/spotube_navigation_bar.dart
+++ b/lib/modules/root/spotube_navigation_bar.dart
@@ -7,9 +7,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:shadcn_flutter/shadcn_flutter_extension.dart';
import 'package:spotube/collections/side_bar_tiles.dart';
-import 'package:spotube/extensions/constrains.dart';
import 'package:spotube/extensions/context.dart';
-import 'package:spotube/models/database/database.dart';
import 'package:spotube/provider/download_manager_provider.dart';
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
diff --git a/lib/pages/settings/settings.dart b/lib/pages/settings/settings.dart
index 094f32d6..eddb3cde 100644
--- a/lib/pages/settings/settings.dart
+++ b/lib/pages/settings/settings.dart
@@ -57,9 +57,17 @@ class SettingsPage extends HookConsumerWidget {
if (!kIsWeb) const SettingsDevelopersSection(),
const SettingsAboutSection(),
Center(
- child: Button.destructive(
- onPressed: preferencesNotifier.reset,
- child: Text(context.l10n.restore_defaults),
+ child: ConstrainedBox(
+ constraints: const BoxConstraints(
+ minWidth: 150,
+ maxWidth: 250,
+ minHeight: 40,
+ maxHeight: 60,
+ ),
+ child: Button.destructive(
+ onPressed: preferencesNotifier.reset,
+ child: Text(context.l10n.restore_defaults),
+ ),
),
),
const SizedBox(height: 200),
diff --git a/lib/provider/audio_player/audio_player_streams.dart b/lib/provider/audio_player/audio_player_streams.dart
index 1a826394..8efc5fd4 100644
--- a/lib/provider/audio_player/audio_player_streams.dart
+++ b/lib/provider/audio_player/audio_player_streams.dart
@@ -63,7 +63,9 @@ class AudioPlayerStreamListeners {
final currentSegments = await ref.read(segmentProvider.future);
if (currentSegments?.segments.isNotEmpty != true ||
- position < const Duration(seconds: 3)) return;
+ position < const Duration(seconds: 3)) {
+ return;
+ }
for (final segment in currentSegments!.segments) {
final seconds = position.inSeconds;
diff --git a/lib/provider/download_manager_provider.dart b/lib/provider/download_manager_provider.dart
index d7abf1c7..d9a1c8d5 100644
--- a/lib/provider/download_manager_provider.dart
+++ b/lib/provider/download_manager_provider.dart
@@ -46,7 +46,9 @@ class DownloadManagerProvider extends ChangeNotifier {
//? WebA audiotagging is not supported yet
//? Although in future by converting weba to opus & then tagging it
//? is possible using vorbis comments
- downloadCodec == SourceCodecs.weba) return;
+ downloadCodec == SourceCodecs.weba) {
+ return;
+ }
final file = File(request.path);
diff --git a/lib/provider/youtube_engine/youtube_engine.dart b/lib/provider/youtube_engine/youtube_engine.dart
index 0aa37db5..7fb7b726 100644
--- a/lib/provider/youtube_engine/youtube_engine.dart
+++ b/lib/provider/youtube_engine/youtube_engine.dart
@@ -1,7 +1,7 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:spotube/models/database/database.dart';
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
-import 'package:spotube/services/youtube_engine/newpipe_engine.dart';
+// import 'package:spotube/services/youtube_engine/newpipe_engine.dart';
import 'package:spotube/services/youtube_engine/youtube_explode_engine.dart';
import 'package:spotube/services/youtube_engine/yt_dlp_engine.dart';
@@ -10,11 +10,12 @@ final youtubeEngineProvider = Provider((ref) {
userPreferencesProvider.select((value) => value.youtubeClientEngine),
);
- if (engineMode == YoutubeClientEngine.newPipe &&
- NewPipeEngine.isAvailableForPlatform) {
- return NewPipeEngine();
- } else if (engineMode == YoutubeClientEngine.ytDlp &&
- YtDlpEngine.isAvailableForPlatform) {
+ // if (engineMode == YoutubeClientEngine.newPipe &&
+ // NewPipeEngine.isAvailableForPlatform) {
+ // return NewPipeEngine();
+ // } else if (engineMode == YoutubeClientEngine.ytDlp &&
+ // YtDlpEngine.isAvailableForPlatform) {
+ if (engineMode == YoutubeClientEngine.ytDlp && YtDlpEngine.isAvailableForPlatform) {
return YtDlpEngine();
} else {
return YouTubeExplodeEngine();
diff --git a/lib/services/youtube_engine/newpipe_engine.dart b/lib/services/youtube_engine/newpipe_engine.dart
deleted file mode 100644
index 3d6ef458..00000000
--- a/lib/services/youtube_engine/newpipe_engine.dart
+++ /dev/null
@@ -1,109 +0,0 @@
-import 'package:flutter_new_pipe_extractor/flutter_new_pipe_extractor.dart'
- hide Engagement;
-import 'package:http_parser/http_parser.dart';
-import 'package:spotube/services/youtube_engine/youtube_engine.dart';
-import 'package:spotube/utils/platform.dart';
-import 'package:youtube_explode_dart/youtube_explode_dart.dart';
-
-class NewPipeEngine implements YouTubeEngine {
- static bool get isAvailableForPlatform => kIsAndroid;
-
- AudioOnlyStreamInfo _parseAudioStream(AudioStream stream, String videoId) {
- return AudioOnlyStreamInfo(
- VideoId(videoId),
- stream.itag,
- Uri.parse(stream.content),
- StreamContainer.parse(stream.mediaFormat!.mimeType.split("/").last),
- FileSize.unknown,
- Bitrate(stream.bitrate),
- stream.codec,
- stream.quality,
- [],
- MediaType.parse(stream.mediaFormat!.mimeType),
- null,
- );
- }
-
- Video _parseVideo(VideoInfo info) {
- return Video(
- VideoId(info.id),
- info.name,
- info.uploaderName,
- ChannelId(info.uploaderUrl),
- info.uploadDate.offsetDateTime,
- info.uploadDate.offsetDateTime.toString(),
- info.uploadDate.offsetDateTime,
- info.description.content ?? "",
- Duration(seconds: info.duration),
- ThumbnailSet(info.id),
- info.tags,
- Engagement(
- info.viewCount,
- info.likeCount,
- info.dislikeCount,
- ),
- !info.streamType.name.toLowerCase().contains("live"),
- );
- }
-
- Video _parseVideoResult(VideoSearchResultItem info) {
- final id = Uri.parse(info.url).queryParameters["v"]!;
- return Video(
- VideoId(id),
- info.name,
- info.uploaderName,
- ChannelId(info.uploaderUrl),
- info.uploadDate?.offsetDateTime,
- info.uploadDate?.offsetDateTime.toString(),
- info.uploadDate?.offsetDateTime,
- info.shortDescription ?? "",
- Duration(seconds: info.duration),
- ThumbnailSet(id),
- [],
- Engagement(info.viewCount, null, null),
- !info.streamType.name.toLowerCase().contains("live"),
- );
- }
-
- @override
- Future getStreamManifest(String videoId) async {
- final video = await NewPipeExtractor.getVideoInfo(videoId);
-
- final streams =
- video.audioStreams.map((stream) => _parseAudioStream(stream, videoId));
-
- return StreamManifest(streams);
- }
-
- @override
- Future
Following are the features that currently spotube offers:
- - 🚫 No ads, thanks to the use of public & free Spotify and YT Music APIs¹
- - ⬇️ Downloadable tracks
- - 🖥️ 📱 Cross-platform support
- - 🪶 Small size & less data usage
- - 🕵️ Anonymous/guest login
- - 🕒 Time synced lyrics
- - ✋ No telemetry, diagnostics or user data collection
- - 🚀 Native performance
- - 📖 Open source/libre software
- - 🔉 Playback control is done locally, not on the server
+ - No ads, thanks to the use of public & free Spotify and YT Music APIs¹
+ - Downloadable tracks
+ - Cross-platform support
+ - Small size & less data usage
+ - Anonymous/guest login
+ - Time synced lyrics
+ - No telemetry, diagnostics or user data collection
+ - Native performance
+ - Open source/libre software
+ - Playback control is done locally, not on the server
diff --git a/linux/packaging/appimage/make_config.yaml b/linux/packaging/appimage/make_config.yaml
index c7332ea2..4294fe12 100644
--- a/linux/packaging/appimage/make_config.yaml
+++ b/linux/packaging/appimage/make_config.yaml
@@ -1,5 +1,5 @@
display_name: Spotube
-icon: assets/spotube-logo.png
+icon: assets/spotube-icon.png
keywords:
- Music
diff --git a/linux/packaging/deb/make_config.yaml b/linux/packaging/deb/make_config.yaml
index 4528a136..f189b486 100644
--- a/linux/packaging/deb/make_config.yaml
+++ b/linux/packaging/deb/make_config.yaml
@@ -30,7 +30,7 @@ suggested_dependencies:
- yt-dlp
essential: false
-icon: assets/spotube-logo.png
+icon: assets/spotube-icon.png
keywords:
- Music
diff --git a/linux/packaging/rpm/make_config.yaml b/linux/packaging/rpm/make_config.yaml
index 3d4a3b7e..83f3585a 100644
--- a/linux/packaging/rpm/make_config.yaml
+++ b/linux/packaging/rpm/make_config.yaml
@@ -1,4 +1,4 @@
-icon: assets/spotube-logo.png
+icon: assets/spotube-icon.png
summary: Lightweight cross-platform Spotify desktop client
group: Applications/Multimedia
vendor: Kingkor Roy Tirtho
diff --git a/linux/spotube.desktop b/linux/spotube.desktop
index 53f381e1..4d5fa317 100644
--- a/linux/spotube.desktop
+++ b/linux/spotube.desktop
@@ -2,7 +2,7 @@
Type=Application
Name=Spotube
Exec=/usr/bin/spotube
-Icon=/usr/share/icons/spotube/spotube-logo.png
+Icon=/usr/share/icons/spotube/spotube-icon.png
Comment=A music streaming app combining the power of Spotify & YouTube
Terminal=false
Categories=Audio;Music;Player;AudioVideo;
diff --git a/macos/packaging/dmg/make_config.yaml b/macos/packaging/dmg/make_config.yaml
index 8292ede1..21ecefdd 100644
--- a/macos/packaging/dmg/make_config.yaml
+++ b/macos/packaging/dmg/make_config.yaml
@@ -1,5 +1,5 @@
title: Spotube
-icon: assets/spotube-logo.png
+icon: assets/spotube-icon.png
contents:
- x: 448
y: 344
diff --git a/pubspec.lock b/pubspec.lock
index 8a9de0d0..1ea14cbf 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -930,15 +930,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.4.3"
- flutter_new_pipe_extractor:
- dependency: "direct main"
- description:
- path: "."
- ref: HEAD
- resolved-ref: "157930289f49d9c2b5016a3df6f771ebfdf2b1e7"
- url: "https://github.com/KRTirtho/flutter_new_pipe_extractor.git"
- source: git
- version: "0.1.0"
flutter_plugin_android_lifecycle:
dependency: transitive
description:
diff --git a/pubspec.yaml b/pubspec.yaml
index fd2cf9f6..8a10a1db 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -135,9 +135,6 @@ dependencies:
git:
url: https://github.com/KRTirtho/yt_dlp_dart.git
ref: e2d82305fab18566408d6f8758361017d1640c3d
- flutter_new_pipe_extractor:
- git:
- url: https://github.com/KRTirtho/flutter_new_pipe_extractor.git
http_parser: ^4.1.2
collection: any
otp_util: ^1.0.2
@@ -205,11 +202,11 @@ flutter_gen:
output: lib/collections
flutter_native_splash:
- background_image: assets/bengali-patterns-bg.jpg
- image: assets/spotube-logo.png
+# background_image: assets/bengali-patterns-bg.jpg
+ image: assets/spotube-icon.png
branding: assets/branding.png
- android_12:
- image: assets/spotube-logo_android12.png
- branding: assets/branding.png
- color: "#000000"
- icon_background_color: "#000000"
+# android_12:
+# image: assets/spotube-logo_android12.png
+# branding: assets/branding.png
+# color: "#000000"
+# icon_background_color: "#000000"
diff --git a/scripts/install.sh b/scripts/install.sh
index 4d54c069..a627faa2 100755
--- a/scripts/install.sh
+++ b/scripts/install.sh
@@ -5,7 +5,7 @@ fname="$(basename $0)"
installDir='/usr/share/spotube'
desktopFile='/usr/share/applications/spotube.desktop'
appdata='/usr/share/appdata/spotube.appdata.xml'
-icon='/usr/share/icons/spotube/spotube-logo.png'
+icon='/usr/share/icons/spotube/spotube-icon.png'
symlink='/usr/bin/spotube'
temp='/tmp/spotube-installer'
latestVer="$(wget -qO- "https://api.github.com/repos/KRTirtho/spotube/releases/latest" \ | grep -Po '"tag_name": "\K.*?(?=")')"
@@ -118,7 +118,7 @@ function install_spotube(){
mv ${temp}/spotube.desktop ${desktopDir}
mv ${temp}/com.github.KRTirtho.Spotube.appdata.xml ${appdata}
mkdir -p /usr/share/icons/spotube
- mv ${temp}/spotube-logo.png ${icon}
+ mv ${temp}/spotube-icon.png ${icon}
ln -s /usr/share/spotube/spotube ${symlink}
rm -rf ${temp} # Remove temp dir