Skip to content

Commit

Permalink
Merge pull request #176 from daniebeler/settingsRedesign
Browse files Browse the repository at this point in the history
Settings redesign
  • Loading branch information
daniebeler authored Feb 2, 2025
2 parents b8f5c59 + fb445be commit beed12a
Show file tree
Hide file tree
Showing 73 changed files with 1,932 additions and 786 deletions.
10 changes: 10 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,16 @@
android:theme="@style/Theme.Pixelix"
tools:ignore="Instantiatable"
tools:targetApi="31">

<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="com.daniebeler.pfpixelix.utils.ApplicationInitializer"
android:value="androidx.startup" />
</provider>

<activity
android:name=".MainActivity"
Expand Down
146 changes: 84 additions & 62 deletions app/src/main/java/com/daniebeler/pfpixelix/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,18 @@ import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.UnfoldMore
import androidx.compose.material3.DrawerValue
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.MaterialTheme.shapes
import androidx.compose.material3.ModalBottomSheet
import androidx.compose.material3.ModalDrawerSheet
import androidx.compose.material3.NavigationBar
import androidx.compose.material3.NavigationBarItem
import androidx.compose.material3.NavigationBarItemDefaults
import androidx.compose.material3.Scaffold
import androidx.compose.material3.rememberDrawerState
import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
Expand Down Expand Up @@ -67,6 +71,7 @@ import com.daniebeler.pfpixelix.domain.repository.CountryRepository
import com.daniebeler.pfpixelix.domain.usecase.GetCurrentLoginDataUseCase
import com.daniebeler.pfpixelix.domain.usecase.VerifyTokenUseCase
import com.daniebeler.pfpixelix.ui.composables.HomeComposable
import com.daniebeler.pfpixelix.ui.composables.ReverseModalNavigationDrawer
import com.daniebeler.pfpixelix.ui.composables.collection.CollectionComposable
import com.daniebeler.pfpixelix.ui.composables.direct_messages.chat.ChatComposable
import com.daniebeler.pfpixelix.ui.composables.direct_messages.conversations.ConversationsComposable
Expand All @@ -93,6 +98,7 @@ import com.daniebeler.pfpixelix.ui.composables.single_post.SinglePostComposable
import com.daniebeler.pfpixelix.ui.composables.timelines.hashtag_timeline.HashtagTimelineComposable
import com.daniebeler.pfpixelix.ui.theme.PixelixTheme
import com.daniebeler.pfpixelix.utils.Navigate
import com.daniebeler.pfpixelix.utils.end
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.cancelChildren
import kotlinx.coroutines.delay
Expand Down Expand Up @@ -168,83 +174,100 @@ class MainActivity : ComponentActivity() {


setContent {
val scope = rememberCoroutineScope()
val drawerState = rememberDrawerState(DrawerValue.Closed)

val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true)
var showAccountSwitchBottomSheet by remember { mutableStateOf(false) }

PixelixTheme {
val navController: NavHostController = rememberNavController()

Scaffold(contentWindowInsets = WindowInsets(0.dp), bottomBar = {
BottomBar(
navController = navController,
avatar = avatar,
openAccountSwitchBottomSheet = { showAccountSwitchBottomSheet = true },
context = this
)
}) { paddingValues ->
Box(
modifier = Modifier.padding(paddingValues)
ReverseModalNavigationDrawer(drawerState = drawerState, drawerContent = {
ModalDrawerSheet(
drawerState = drawerState,
drawerShape = shapes.extraLarge.end(0.dp),
windowInsets = WindowInsets(0, 0, 0, 0)
) {
NavigationGraph(
PreferencesComposable(navController, {scope.launch {
drawerState.close()
}})
}
}) {

Scaffold(contentWindowInsets = WindowInsets(0.dp), bottomBar = {
BottomBar(
navController = navController,
avatar = avatar,
openAccountSwitchBottomSheet = { showAccountSwitchBottomSheet = true },
context = this
)

LaunchedEffect(imageUris) {
imageUris.forEach { uri ->
try {
contentResolver.takePersistableUriPermission(
uri, Intent.FLAG_GRANT_READ_URI_PERMISSION
}) { paddingValues ->
Box(
modifier = Modifier.padding(paddingValues)
) {
NavigationGraph(navController = navController, {
scope.launch {
drawerState.open()
}
} )

LaunchedEffect(imageUris) {
imageUris.forEach { uri ->
try {
contentResolver.takePersistableUriPermission(
uri, Intent.FLAG_GRANT_READ_URI_PERMISSION
)
} catch (e: SecurityException) {
e.printStackTrace() // Handle permission denial gracefully
}
}
if (imageUris.isNotEmpty()) {
val urisJson =
Json.encodeToString(imageUris.map { uri -> uri.toString() })
Navigate.navigate(
"new_post_screen?uris=$urisJson", navController
)
} catch (e: SecurityException) {
e.printStackTrace() // Handle permission denial gracefully
}
}
if (imageUris.isNotEmpty()) {
val urisJson =
Json.encodeToString(imageUris.map { uri -> uri.toString() })
Navigate.navigate(
"new_post_screen?uris=$urisJson", navController
)
}
}

val destination = intent.extras?.getString(KEY_DESTINATION) ?: ""
if (destination.isNotBlank()) {
// Delay the navigation action to ensure the graph is set
LaunchedEffect(Unit) {
when (destination) {
StartNavigation.Notifications.toString() -> Navigate.navigate(
"notifications_screen", navController
)

StartNavigation.Profile.toString() -> {
val accountId: String = intent.extras?.getString(
KEY_DESTINATION_PARAM
) ?: ""
if (accountId.isNotBlank()) {
Navigate.navigate(
"profile_screen/$accountId", navController
)
val destination = intent.extras?.getString(KEY_DESTINATION) ?: ""
if (destination.isNotBlank()) {
// Delay the navigation action to ensure the graph is set
LaunchedEffect(Unit) {
when (destination) {
StartNavigation.Notifications.toString() -> Navigate.navigate(
"notifications_screen", navController
)

StartNavigation.Profile.toString() -> {
val accountId: String = intent.extras?.getString(
KEY_DESTINATION_PARAM
) ?: ""
if (accountId.isNotBlank()) {
Navigate.navigate(
"profile_screen/$accountId", navController
)
}
}
}

StartNavigation.Post.toString() -> {
val postId: String = intent.extras?.getString(
KEY_DESTINATION_PARAM
) ?: ""
if (postId.isNotBlank()) {
Navigate.navigate(
"single_post_screen/$postId", navController
)
StartNavigation.Post.toString() -> {
val postId: String = intent.extras?.getString(
KEY_DESTINATION_PARAM
) ?: ""
if (postId.isNotBlank()) {
Navigate.navigate(
"single_post_screen/$postId", navController
)

}
}
}
}
}
}
}


}
}
if (showAccountSwitchBottomSheet) {
ModalBottomSheet(
Expand Down Expand Up @@ -345,13 +368,16 @@ fun gotoLoginActivity(context: Context, isAbleToGotBack: Boolean) {
}

@Composable
fun NavigationGraph(navController: NavHostController) {
fun NavigationGraph(
navController: NavHostController,
openPreferencesDrawer: () -> Unit
) {
NavHost(navController,
startDestination = Destinations.HomeScreen.route,
enterTransition = { EnterTransition.None },
exitTransition = { ExitTransition.None }) {
composable(Destinations.HomeScreen.route) {
HomeComposable(navController)
HomeComposable(navController, openPreferencesDrawer)
}

composable(Destinations.NotificationsScreen.route) {
Expand Down Expand Up @@ -386,10 +412,6 @@ fun NavigationGraph(navController: NavHostController) {
EditProfileComposable(navController)
}

composable(Destinations.Preferences.route) {
PreferencesComposable(navController)
}

composable(Destinations.IconSelection.route) {
IconSelectionComposable(navController)
}
Expand Down Expand Up @@ -438,7 +460,7 @@ fun NavigationGraph(navController: NavHostController) {
}

composable(Destinations.OwnProfile.route) {
OwnProfileComposable(navController)
OwnProfileComposable(navController, openPreferencesDrawer)
}

composable(Destinations.Followers.route) { navBackStackEntry ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,6 @@ sealed class Destinations(
route = "edit_profile_screen"
)

data object Preferences : Destinations(
route = "preferences_screen"
)

data object IconSelection : Destinations(
route = "icon_selection_screen"
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,10 +76,6 @@ class StorageRepositoryImpl @Inject constructor(
}
}

override fun getStoreTheme(): Flow<String> = storage.data.map { preferences ->
preferences[stringPreferencesKey(Constants.THEME_DATASTORE_KEY)] ?: "system"
}

override suspend fun storeView(view: ViewEnum) {
storage.edit { preferences ->
preferences[stringPreferencesKey(Constants.VIEW_DATASTORE_KEY)] = view.toString()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.daniebeler.pfpixelix.di

import android.content.Context
import com.daniebeler.pfpixelix.domain.repository.AccountRepository
import com.daniebeler.pfpixelix.domain.repository.CountryRepository
import com.daniebeler.pfpixelix.domain.repository.PostRepository
Expand Down Expand Up @@ -27,6 +28,7 @@ import com.daniebeler.pfpixelix.domain.usecase.UpdateAccountUseCase
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton

Expand Down Expand Up @@ -60,8 +62,8 @@ class AccountUseCaseModule {
@Provides
@Singleton
fun provideGetPostsOfAccountUseCase(
postRepository: PostRepository, storageRepository: StorageRepository
): GetPostsOfAccountUseCase = GetPostsOfAccountUseCase(postRepository, storageRepository)
postRepository: PostRepository, @ApplicationContext context: Context
): GetPostsOfAccountUseCase = GetPostsOfAccountUseCase(postRepository, context)

@Provides
@Singleton
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,20 +10,13 @@ import com.daniebeler.pfpixelix.domain.usecase.GetActiveAppIconUseCase
import com.daniebeler.pfpixelix.domain.usecase.GetBlockedAccountsUseCase
import com.daniebeler.pfpixelix.domain.usecase.GetBookmarkedPostsUseCase
import com.daniebeler.pfpixelix.domain.usecase.GetHideAltTextButtonUseCase
import com.daniebeler.pfpixelix.domain.usecase.GetHideSensitiveContentUseCase
import com.daniebeler.pfpixelix.domain.usecase.GetInstanceUseCase
import com.daniebeler.pfpixelix.domain.usecase.GetIsFocusModeEnabledUseCase
import com.daniebeler.pfpixelix.domain.usecase.GetMutedAccountsUseCase
import com.daniebeler.pfpixelix.domain.usecase.GetOwnInstanceDomainUseCase
import com.daniebeler.pfpixelix.domain.usecase.GetThemeUseCase
import com.daniebeler.pfpixelix.domain.usecase.GetUseInAppBrowserUseCase
import com.daniebeler.pfpixelix.domain.usecase.LogoutUseCase
import com.daniebeler.pfpixelix.domain.usecase.OpenExternalUrlUseCase
import com.daniebeler.pfpixelix.domain.usecase.StoreHideAltTextButtonUseCase
import com.daniebeler.pfpixelix.domain.usecase.StoreHideSensitiveContentUseCase
import com.daniebeler.pfpixelix.domain.usecase.StoreIsFocusModeEnabledUseCase
import com.daniebeler.pfpixelix.domain.usecase.StoreThemeUseCase
import com.daniebeler.pfpixelix.domain.usecase.StoreUseInAppBrowserUseCase
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
Expand All @@ -34,36 +27,11 @@ import javax.inject.Singleton
@InstallIn(SingletonComponent::class)
class SettingsUseCaseModule {

@Provides
@Singleton
fun provideStoreHideSensitiveContentUseCase(repository: StorageRepository): StoreHideSensitiveContentUseCase =
StoreHideSensitiveContentUseCase(repository)

@Provides
@Singleton
fun provideGetHideSensitiveContentUseCase(repository: StorageRepository): GetHideSensitiveContentUseCase =
GetHideSensitiveContentUseCase(repository)

@Provides
@Singleton
fun provideStoreHideAltTextButtonUseCase(repository: StorageRepository): StoreHideAltTextButtonUseCase =
StoreHideAltTextButtonUseCase(repository)

@Provides
@Singleton
fun provideGetHideAltTextButtonUseCase(repository: StorageRepository): GetHideAltTextButtonUseCase =
GetHideAltTextButtonUseCase(repository)

@Provides
@Singleton
fun provideStoreIsInFocusModeUseCase(repository: StorageRepository): StoreIsFocusModeEnabledUseCase =
StoreIsFocusModeEnabledUseCase(repository)

@Provides
@Singleton
fun provideGetIsInFocusModeUseCase(repository: StorageRepository): GetIsFocusModeEnabledUseCase =
GetIsFocusModeEnabledUseCase(repository)

@Provides
@Singleton
fun provideLogoutUseCase(
Expand Down Expand Up @@ -97,13 +65,8 @@ class SettingsUseCaseModule {

@Provides
@Singleton
fun provideOpenExternalUrlUseCase(repository: StorageRepository): OpenExternalUrlUseCase =
OpenExternalUrlUseCase(repository)

@Provides
@Singleton
fun provideStoreUseInAppBrowserUseCase(repository: StorageRepository): StoreUseInAppBrowserUseCase =
StoreUseInAppBrowserUseCase(repository)
fun provideOpenExternalUrlUseCase(): OpenExternalUrlUseCase =
OpenExternalUrlUseCase()

@Provides
@Singleton
Expand All @@ -115,11 +78,6 @@ class SettingsUseCaseModule {
fun provideStoreThemeUseCase(repository: StorageRepository): StoreThemeUseCase =
StoreThemeUseCase(repository)

@Provides
@Singleton
fun provideGetThemeUseCase(repository: StorageRepository): GetThemeUseCase =
GetThemeUseCase(repository)

@Provides
@Singleton
fun provideGetAppIconUseCase(): GetActiveAppIconUseCase = GetActiveAppIconUseCase()
Expand Down
Loading

0 comments on commit beed12a

Please sign in to comment.