diff --git a/app/src/main/java/com/anytypeio/anytype/di/common/ComponentManager.kt b/app/src/main/java/com/anytypeio/anytype/di/common/ComponentManager.kt index 28906d8b59..1208b4a0a9 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/common/ComponentManager.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/common/ComponentManager.kt @@ -81,6 +81,7 @@ import com.anytypeio.anytype.di.feature.settings.LogoutWarningModule import com.anytypeio.anytype.di.feature.settings.MainSettingsModule import com.anytypeio.anytype.di.feature.wallpaper.WallpaperSelectModule import com.anytypeio.anytype.di.feature.widgets.SelectWidgetSourceModule +import com.anytypeio.anytype.di.feature.widgets.SelectWidgetTypeModule import com.anytypeio.anytype.di.main.MainComponent class ComponentManager( @@ -190,6 +191,14 @@ class ComponentManager( .build() } + val selectWidgetTypeSubcomponent = Component { + homeScreenComponent + .get() + .selectWidgetTypeBuilder() + .module(SelectWidgetTypeModule) + .build() + } + val wallpaperSelectComponent = Component { main .wallpaperSelectComponent() diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/home/HomescreenDI.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/home/HomescreenDI.kt index 5a6320c59e..44e6055b36 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/home/HomescreenDI.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/home/HomescreenDI.kt @@ -6,6 +6,7 @@ import com.anytypeio.anytype.core_models.Payload import com.anytypeio.anytype.core_utils.di.scope.PerScreen import com.anytypeio.anytype.di.common.ComponentDependencies import com.anytypeio.anytype.di.feature.widgets.SelectWidgetSourceSubcomponent +import com.anytypeio.anytype.di.feature.widgets.SelectWidgetTypeSubcomponent import com.anytypeio.anytype.domain.auth.repo.AuthRepository import com.anytypeio.anytype.domain.base.AppCoroutineDispatchers import com.anytypeio.anytype.domain.block.repo.BlockRepository @@ -47,6 +48,7 @@ interface HomeScreenComponent { fun inject(fragment: HomeScreenFragment) fun selectWidgetSourceBuilder(): SelectWidgetSourceSubcomponent.Builder + fun selectWidgetTypeBuilder(): SelectWidgetTypeSubcomponent.Builder } @Module diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/widgets/SelectWidgetTypeDI.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/widgets/SelectWidgetTypeDI.kt new file mode 100644 index 0000000000..014a36e4bb --- /dev/null +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/widgets/SelectWidgetTypeDI.kt @@ -0,0 +1,35 @@ +package com.anytypeio.anytype.di.feature.widgets + +import com.anytypeio.anytype.core_utils.di.scope.PerModal +import com.anytypeio.anytype.presentation.widgets.SelectWidgetTypeViewModel +import com.anytypeio.anytype.ui.widgets.SelectWidgetTypeFragment +import dagger.Module +import dagger.Provides +import dagger.Subcomponent + +@Subcomponent( + modules = [SelectWidgetTypeModule::class] +) +@PerModal +interface SelectWidgetTypeSubcomponent { + + @Subcomponent.Builder + interface Builder { + fun module(module: SelectWidgetTypeModule): Builder + fun build(): SelectWidgetTypeSubcomponent + } + + fun inject(fragment: SelectWidgetTypeFragment) +} + +@Module +object SelectWidgetTypeModule { + + @JvmStatic + @PerModal + @Provides + fun factory( + ): SelectWidgetTypeViewModel.Factory = SelectWidgetTypeViewModel.Factory( + // TODO + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/anytypeio/anytype/ui/widgets/SelectWidgetTypeFragment.kt b/app/src/main/java/com/anytypeio/anytype/ui/widgets/SelectWidgetTypeFragment.kt new file mode 100644 index 0000000000..b2885b6388 --- /dev/null +++ b/app/src/main/java/com/anytypeio/anytype/ui/widgets/SelectWidgetTypeFragment.kt @@ -0,0 +1,43 @@ +package com.anytypeio.anytype.ui.widgets + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.compose.ui.platform.ComposeView +import androidx.compose.ui.platform.ViewCompositionStrategy +import androidx.fragment.app.viewModels +import com.anytypeio.anytype.core_utils.ui.BaseBottomSheetComposeFragment +import com.anytypeio.anytype.di.common.componentManager +import com.anytypeio.anytype.presentation.widgets.SelectWidgetTypeViewModel +import javax.inject.Inject + +class SelectWidgetTypeFragment : BaseBottomSheetComposeFragment() { + + private val vm by viewModels { factory } + + @Inject + lateinit var factory: SelectWidgetTypeViewModel.Factory + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View = ComposeView(requireContext()).apply { + setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) + setContent { + SelectWidgetTypeScreen( + views = emptyList(), + onViewClicked = {} + ) + } + } + + override fun injectDependencies() { + componentManager().selectWidgetTypeSubcomponent.get().inject(this) + } + + override fun releaseDependencies() { + componentManager().selectWidgetTypeSubcomponent.release() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/anytypeio/anytype/ui/widgets/SelectWidgetTypeScreen.kt b/app/src/main/java/com/anytypeio/anytype/ui/widgets/SelectWidgetTypeScreen.kt new file mode 100644 index 0000000000..deefa7c45f --- /dev/null +++ b/app/src/main/java/com/anytypeio/anytype/ui/widgets/SelectWidgetTypeScreen.kt @@ -0,0 +1,131 @@ +package com.anytypeio.anytype.ui.widgets + +import androidx.annotation.DrawableRes +import androidx.compose.foundation.Image +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.colorResource +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.anytypeio.anytype.R +import com.anytypeio.anytype.core_ui.foundation.Divider +import com.anytypeio.anytype.core_ui.foundation.Dragger +import com.anytypeio.anytype.core_ui.foundation.Toolbar +import com.anytypeio.anytype.presentation.widgets.WidgetTypeView + +@Composable +fun SelectWidgetTypeScreen( + views: List, + onViewClicked: (WidgetTypeView) -> Unit +) { + Column { + Box( + Modifier + .padding(vertical = 6.dp) + .align(Alignment.CenterHorizontally) + ) { + Dragger() + } + + Toolbar(stringResource(R.string.widget_type)) + + views.forEachIndexed { index, type -> + when (type) { + is WidgetTypeView.Link -> WidgetTypeItem( + title = stringResource( + R.string.widget_type_link + ), + subtitle = stringResource( + R.string.widget_type_link_description + ), + icon = R.drawable.ic_widget_type_link, + isChecked = type.isSelected, + onClick = { onViewClicked(type) } + ) + is WidgetTypeView.List -> WidgetTypeItem( + title = stringResource( + R.string.widget_type_list + ), + subtitle = stringResource( + R.string.widget_type_list_description + ), + icon = R.drawable.ic_widget_type_list, + isChecked = type.isSelected, + onClick = { onViewClicked(type) } + ) + is WidgetTypeView.Tree -> WidgetTypeItem( + title = stringResource( + R.string.widget_type_tree + ), + subtitle = stringResource( + R.string.widget_type_tree_description + ), + icon = R.drawable.ic_widget_type_tree, + isChecked = type.isSelected, + onClick = { onViewClicked(type) } + ) + } + if (index != views.lastIndex) { + Divider(paddingStart = 76.dp) + } + } + Spacer(modifier = Modifier.height(52.dp)) + } +} + +@Composable +fun WidgetTypeItem( + title: String, + subtitle: String, + @DrawableRes icon: Int, + isChecked: Boolean = false, + onClick: () -> Unit +) { + Box( + modifier = Modifier + .fillMaxWidth() + .height(60.dp) + .clickable { onClick() } + ) { + Image( + painterResource(icon), + contentDescription = "Widget type icon", + modifier = Modifier + .align(Alignment.CenterStart) + .padding(start = 20.dp) + ) + Text( + modifier = Modifier + .align(Alignment.TopStart) + .padding(start = 70.dp, top = 11.dp), + text = title, + color = colorResource(id = R.color.text_primary) + ) + Text( + modifier = Modifier + .align(Alignment.BottomStart) + .padding(start = 70.dp, bottom = 11.dp), + text = subtitle, + color = colorResource(id = R.color.text_secondary) + ) + if (isChecked) { + Image( + painterResource(R.drawable.ic_widget_type_checked_checkbox), + contentDescription = "Widget type checkbox icon", + modifier = Modifier + .align(Alignment.CenterEnd) + .padding(end = 20.dp) + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c96e51d37b..b8bfa28d62 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -316,5 +316,12 @@ Do the computation of an expensive paragraph of text on a background thread: Create a widget Edit widgets Widget source + Widget type + Tree + Hierarchical structure of object + Link + Compact version of the object + Widget with list view of set object + List diff --git a/core-ui/src/main/res/drawable/ic_widget_type_checked_checkbox.xml b/core-ui/src/main/res/drawable/ic_widget_type_checked_checkbox.xml new file mode 100644 index 0000000000..e261d49249 --- /dev/null +++ b/core-ui/src/main/res/drawable/ic_widget_type_checked_checkbox.xml @@ -0,0 +1,14 @@ + + + + + + diff --git a/core-ui/src/main/res/drawable/ic_widget_type_link.xml b/core-ui/src/main/res/drawable/ic_widget_type_link.xml new file mode 100644 index 0000000000..dc0e8f0bb4 --- /dev/null +++ b/core-ui/src/main/res/drawable/ic_widget_type_link.xml @@ -0,0 +1,14 @@ + + + + diff --git a/core-ui/src/main/res/drawable/ic_widget_type_list.xml b/core-ui/src/main/res/drawable/ic_widget_type_list.xml new file mode 100644 index 0000000000..a0f61b5314 --- /dev/null +++ b/core-ui/src/main/res/drawable/ic_widget_type_list.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + diff --git a/core-ui/src/main/res/drawable/ic_widget_type_tree.xml b/core-ui/src/main/res/drawable/ic_widget_type_tree.xml new file mode 100644 index 0000000000..50dd690155 --- /dev/null +++ b/core-ui/src/main/res/drawable/ic_widget_type_tree.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/SelectWidgetTypeViewModel.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/SelectWidgetTypeViewModel.kt new file mode 100644 index 0000000000..9a4c3922db --- /dev/null +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/SelectWidgetTypeViewModel.kt @@ -0,0 +1,20 @@ +package com.anytypeio.anytype.presentation.widgets + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import com.anytypeio.anytype.presentation.common.BaseViewModel + +class SelectWidgetTypeViewModel : BaseViewModel() { + + class Factory( + ) : ViewModelProvider.Factory { + + @Suppress("UNCHECKED_CAST") + override fun create(modelClass: Class): T { + return SelectWidgetTypeViewModel( + + ) as T + } + } + +} \ No newline at end of file diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/WidgetTypeView.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/WidgetTypeView.kt new file mode 100644 index 0000000000..e0d2d6f108 --- /dev/null +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/WidgetTypeView.kt @@ -0,0 +1,8 @@ +package com.anytypeio.anytype.presentation.widgets + +sealed class WidgetTypeView { + abstract val isSelected: Boolean + data class List(override val isSelected: Boolean) : WidgetTypeView() + data class Tree(override val isSelected: Boolean): WidgetTypeView() + data class Link(override val isSelected: Boolean): WidgetTypeView() +} \ No newline at end of file