Skip to content

Commit

Permalink
Merge pull request #158 from metabrainz/additions
Browse files Browse the repository at this point in the history
Improved Profile Screen, Added a dummy Explore Screen and Bumped dependencies
  • Loading branch information
akshaaatt committed May 28, 2023
2 parents 5015463 + d7af62b commit 42aefbc
Show file tree
Hide file tree
Showing 50 changed files with 1,368 additions and 1,475 deletions.
24 changes: 16 additions & 8 deletions app/build.gradle
Expand Up @@ -102,6 +102,11 @@ android {
kotlinOptions {
jvmTarget = '17'
}
packagingOptions {
resources {
excludes += '/META-INF/{AL2.0,LGPL2.1}'
}
}
}

dependencies {
Expand All @@ -112,7 +117,7 @@ dependencies {
implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.1'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation 'androidx.core:core-ktx:1.10.0'
implementation 'androidx.core:core-ktx:1.10.1'
implementation 'androidx.browser:browser:1.5.0'
implementation 'androidx.preference:preference-ktx:1.2.0'
implementation 'androidx.core:core-splashscreen:1.0.1'
Expand All @@ -128,8 +133,10 @@ dependencies {
//Image downloading and Caching library
implementation 'com.github.bumptech.glide:glide:4.15.1'
implementation "com.github.bumptech.glide:compose:1.0.0-alpha.1"
implementation 'io.coil-kt:coil-compose:2.3.0'
implementation 'io.coil-kt:coil-compose:2.4.0'
implementation 'com.caverock:androidsvg-aar:1.4'
implementation platform('androidx.compose:compose-bom:2022.10.00')
implementation 'androidx.compose.ui:ui-graphics'
kapt 'com.github.bumptech.glide:compiler:4.15.1'

//Permissions
Expand All @@ -141,7 +148,7 @@ dependencies {
implementation 'androidx.coordinatorlayout:coordinatorlayout:1.2.0'

//Design Setup
implementation 'com.google.android.material:material:1.8.0'
implementation 'com.google.android.material:material:1.9.0'
implementation 'com.airbnb.android:lottie:6.0.0'
implementation 'com.github.akshaaatt:Onboarding:1.0.5'
implementation 'com.github.akshaaatt:Share-Android:1.0.0'
Expand All @@ -157,17 +164,18 @@ dependencies {
implementation "androidx.compose.ui:ui-util:$compose_version"
implementation "androidx.compose.material:material:$compose_version"
implementation "androidx.compose.material:material-icons-extended:$compose_version"
implementation 'androidx.compose.material3:material3:1.0.1'
implementation 'androidx.compose.material3:material3-window-size-class:1.0.1'
implementation 'androidx.compose.material3:material3:1.1.0'
implementation 'androidx.compose.material3:material3-window-size-class:1.1.0'
implementation "androidx.compose.animation:animation:$compose_version"
implementation "androidx.compose.ui:ui-tooling-preview:$compose_version"
implementation 'androidx.constraintlayout:constraintlayout-compose:1.0.1'
implementation "androidx.compose.foundation:foundation:$compose_version"
implementation 'androidx.hilt:hilt-navigation-compose:1.0.0'
implementation 'com.airbnb.android:lottie-compose:6.0.0'
implementation 'androidx.activity:activity-compose:1.7.1'

// Compose Navigation
implementation 'androidx.navigation:navigation-compose:2.6.0-beta01' // Stable one
implementation 'androidx.navigation:navigation-compose:2.5.3' // Stable one
implementation "com.google.accompanist:accompanist-navigation-animation:$accompanist_version" // Experimental but has animations

//Spotify
Expand All @@ -177,7 +185,7 @@ dependencies {
testImplementation 'junit:junit:4.13.2'
testImplementation 'com.squareup.okhttp3:mockwebserver:5.0.0-alpha.11'
testImplementation 'androidx.arch.core:core-testing:2.2.0'
testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4'
testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.1'

debugImplementation "androidx.test:monitor:1.6.1" // Solves "class PlatformTestStorageRegistery not found" error for ui tests.
debugImplementation "androidx.compose.ui:ui-test-manifest:$compose_version"
Expand All @@ -191,7 +199,7 @@ dependencies {
androidTestImplementation 'androidx.arch.core:core-testing:2.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
androidTestImplementation 'androidx.test.espresso:espresso-intents:3.5.1'
androidTestImplementation 'app.cash.turbine:turbine:0.12.3'
androidTestImplementation 'app.cash.turbine:turbine:0.13.0'
androidTestImplementation 'tools.fastlane:screengrab:2.1.1' // Fastlane ScreenGrab

testImplementation project(path: ':sharedTest')
Expand Down
Expand Up @@ -16,7 +16,7 @@ import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.listenbrainz.android.ui.screens.login.LoginActivity
import org.listenbrainz.android.ui.screens.profile.LoginActivity

@RunWith(AndroidJUnit4ClassRunner::class)
@LargeTest
Expand Down
53 changes: 26 additions & 27 deletions app/src/main/AndroidManifest.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" >
xmlns:tools="http://schemas.android.com/tools">

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
Expand All @@ -11,8 +11,9 @@
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28"/>
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28" />

<queries>
<package android:name="com.google.android.apps.youtube.music" />
Expand All @@ -26,12 +27,12 @@
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true"
tools:targetApi="32" >
tools:targetApi="32">
<activity
android:name=".ui.screens.yim.YearInMusicActivity"
android:exported="false"
android:label="@string/title_activity_year_in_music"
android:theme="@style/AppTheme" >
android:theme="@style/AppTheme">
<meta-data
android:name="android.app.lib_name"
android:value="" />
Expand All @@ -48,37 +49,36 @@
</service>
<service
android:name=".service.BrainzPlayerService"
android:exported="true" >
android:exported="true">
<intent-filter>
<action android:name="android.media.browse.MediaMrowserService" />
</intent-filter>
</service>

<!--TODO: To receive events from wired devices-->
<!--<receiver android:name="androidx.media.session.MediaButtonReceiver"
</service> <!-- TODO: To receive events from wired devices -->
<!--
<receiver android:name="androidx.media.session.MediaButtonReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>-->

</receiver>
-->
<activity
android:name=".ui.screens.onboarding.FeaturesActivity"
android:theme="@style/AppThemeNoActionBar" />
<activity
android:name=".ui.screens.dashboard.DashboardActivity"
android:exported="true"
android:theme="@style/Theme.App.Starting" >
android:theme="@style/Theme.App.Starting">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ui.screens.login.LoginActivity"
android:name=".ui.screens.profile.LoginActivity"
android:exported="true"
android:label="@string/auth_title" >
android:label="@string/auth_title">
<intent-filter>
<action android:name="android.intent.action.VIEW" />

Expand All @@ -96,18 +96,17 @@
<activity
android:name=".ui.screens.dashboard.DonateActivity"
android:label="@string/donate_title" />
<activity
android:name=".ui.screens.settings.SettingsActivity"
android:label="@string/preferences_title" />
<activity android:name=".ui.screens.newsbrainz.NewsBrainzActivity" />
<activity
android:name=".ui.screens.listens.RemotePlayerActivity"
android:theme="@style/AppThemeNoActionBar" />

<!-- Sentry Setup-->
<meta-data android:name="io.sentry.dsn" android:value="@string/sentryDsn" />
<meta-data android:name="io.sentry.traces.sample-rate" android:value="1.0" />
<meta-data android:name="io.sentry.traces.user-interaction.enable" android:value="true" />
<!-- Sentry Setup -->
<meta-data
android:name="io.sentry.dsn"
android:value="@string/sentryDsn" />
<meta-data
android:name="io.sentry.traces.sample-rate"
android:value="1.0" />
<meta-data
android:name="io.sentry.traces.user-interaction.enable"
android:value="true" />
</application>

</manifest>
</manifest>
Expand Up @@ -30,7 +30,7 @@ class App : Application() {
context = this

when {
appPreferences.preferenceListeningEnabled && Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP -> {
Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP -> {
startListenService()
}
}
Expand Down
@@ -0,0 +1,11 @@
package org.listenbrainz.android.model

import org.listenbrainz.android.R

sealed class AppNavigationItem(var route: String, var iconUnselected: Int, var iconSelected: Int, var title: String) {
object Home : AppNavigationItem("home", R.drawable.house_regular, R.drawable.house_solid, "Home")
object BrainzPlayer : AppNavigationItem("brainzplayer", R.drawable.headphone_regular, R.drawable.headphones_solid, "Player")
object Explore : AppNavigationItem("explore", R.drawable.music_regular, R.drawable.music_solid, "Explore")
object Profile : AppNavigationItem("profile", R.drawable.user_regular, R.drawable.user_solid, "Profile")
}

Expand Up @@ -5,9 +5,6 @@ import org.listenbrainz.android.model.Playable
import org.listenbrainz.android.model.UserInfo

interface AppPreferences {

val systemLanguagePreference: Boolean

val themePreference : String?

/**
Expand All @@ -20,9 +17,7 @@ interface AppPreferences {
*
* [PermissionStatus.DENIED_TWICE] -> permission is denied twice and cannot be asked again. User need to go to settings to enable the permission.*/
var permissionsPreference: String?

var preferenceListeningEnabled: Boolean


/** Blacklist for ListenService.*/
var listeningBlacklist: List<String>

Expand All @@ -31,8 +26,6 @@ interface AppPreferences {

var onboardingCompleted: Boolean

val preferenceListeningSpotifyEnabled: Boolean

fun saveOAuthToken(token: AccessToken)
fun saveUserInfo(userInfo: UserInfo)
fun logoutUser()
Expand Down
Expand Up @@ -17,11 +17,8 @@ import org.listenbrainz.android.util.Constants.Strings.MB_ACCESS_TOKEN
import org.listenbrainz.android.util.Constants.Strings.PREFERENCE_ALBUMS_ON_DEVICE
import org.listenbrainz.android.util.Constants.Strings.PREFERENCE_LISTENING_APPS
import org.listenbrainz.android.util.Constants.Strings.PREFERENCE_LISTENING_BLACKLIST
import org.listenbrainz.android.util.Constants.Strings.PREFERENCE_LISTENING_ENABLED
import org.listenbrainz.android.util.Constants.Strings.PREFERENCE_LISTENING_SPOTIFY
import org.listenbrainz.android.util.Constants.Strings.PREFERENCE_PERMS
import org.listenbrainz.android.util.Constants.Strings.PREFERENCE_SONGS_ON_DEVICE
import org.listenbrainz.android.util.Constants.Strings.PREFERENCE_SYSTEM_LANGUAGE
import org.listenbrainz.android.util.Constants.Strings.PREFERENCE_SYSTEM_THEME
import org.listenbrainz.android.util.Constants.Strings.REFRESH_TOKEN
import org.listenbrainz.android.util.Constants.Strings.STATUS_LOGGED_IN
Expand Down Expand Up @@ -57,21 +54,13 @@ class AppPreferencesImpl(private val context : Context): AppPreferences {
}

// Preferences Implementation

override val systemLanguagePreference: Boolean
get() = preferences.getBoolean(PREFERENCE_SYSTEM_LANGUAGE, false)

override val themePreference: String?
get() = preferences.getString(PREFERENCE_SYSTEM_THEME, "Use device theme")

override var permissionsPreference: String?
get() = preferences.getString(PREFERENCE_PERMS, PermissionStatus.NOT_REQUESTED.name)
set(value) = setString(PREFERENCE_PERMS, value)

override var preferenceListeningEnabled: Boolean
get() = preferences.getBoolean(PREFERENCE_LISTENING_ENABLED, false)
set(value) = setBoolean(PREFERENCE_LISTENING_ENABLED, value)

override var listeningBlacklist: List<String>
get() {
val jsonString = preferences.getString(PREFERENCE_LISTENING_BLACKLIST, "")
Expand Down Expand Up @@ -112,10 +101,6 @@ class AppPreferencesImpl(private val context : Context): AppPreferences {
get() = preferences.getBoolean(ONBOARDING, false)
set(value) = setBoolean(ONBOARDING, value)

override val preferenceListeningSpotifyEnabled
get() = preferences.getBoolean(PREFERENCE_LISTENING_SPOTIFY, false)


override fun saveOAuthToken(token: AccessToken) {
val editor = preferences.edit()
editor.putString(MB_ACCESS_TOKEN, token.accessToken)
Expand Down
Expand Up @@ -12,6 +12,7 @@ import org.listenbrainz.android.repository.AppPreferences
import org.listenbrainz.android.util.ListenHandler
import org.listenbrainz.android.util.ListenSessionListener
import org.listenbrainz.android.util.Log.d
import org.listenbrainz.android.util.Utils.isNotificationServiceEnabled
import javax.inject.Inject

@AndroidEntryPoint
Expand All @@ -35,7 +36,7 @@ class ListenScrobbleService : NotificationListenerService() {
override fun onListenerConnected() {
super.onListenerConnected()
when {
Looper.myLooper() == null -> {
Looper.myLooper() == null && isNotificationServiceEnabled(applicationContext) -> {
Handler(Looper.getMainLooper()).post { initialize() }
}
else -> initialize()
Expand Down
@@ -1,20 +1,15 @@
package org.listenbrainz.android.ui.components

import android.content.ActivityNotFoundException
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.view.Menu
import android.view.MenuItem
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.preference.PreferenceManager
import org.listenbrainz.android.R
import org.listenbrainz.android.ui.screens.onboarding.FeaturesActivity
import org.listenbrainz.android.util.Constants
import org.listenbrainz.android.util.Constants.Strings.PREFERENCE_SYSTEM_LANGUAGE
import org.listenbrainz.android.util.IntentFactory.getSettings
import org.listenbrainz.android.util.Utils.changeLanguage
import org.listenbrainz.android.util.Utils.emailIntent

abstract class ListenBrainzActivity : AppCompatActivity() {
Expand All @@ -30,10 +25,7 @@ abstract class ListenBrainzActivity : AppCompatActivity() {
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
android.R.id.home -> {
onBackPressed()
}
R.id.menu_preferences -> {
startActivity(getSettings(applicationContext))
onBackPressedDispatcher.onBackPressed()
}
R.id.menu_feedback -> {
sendFeedback()
Expand All @@ -50,13 +42,6 @@ abstract class ListenBrainzActivity : AppCompatActivity() {
return false
}

override fun attachBaseContext(newBase: Context) {
if (PreferenceManager.getDefaultSharedPreferences(newBase).getBoolean(PREFERENCE_SYSTEM_LANGUAGE, false)) {
val context: Context = changeLanguage(newBase, "en")
super.attachBaseContext(context)
} else super.attachBaseContext(newBase)
}

private fun sendFeedback() {
try {
startActivity(emailIntent(Constants.FEEDBACK_EMAIL, Constants.FEEDBACK_SUBJECT))
Expand Down

0 comments on commit 42aefbc

Please sign in to comment.