浏览代码

Navigation fixes

Signed-off-by: alperozturk <alper_ozturk@proton.me>
alperozturk 1 年之前
父节点
当前提交
3fc5f426fa

+ 1 - 3
app/src/androidTest/java/com/nextcloud/client/assistant/AssistantRepositoryTests.kt

@@ -28,7 +28,7 @@ import org.junit.Assert.assertTrue
 import org.junit.Before
 import org.junit.Test
 
-class AssistantRepositoryTests: AbstractOnServerIT() {
+class AssistantRepositoryTests : AbstractOnServerIT() {
 
     private var sut: AssistantRepository? = null
 
@@ -65,6 +65,4 @@ class AssistantRepositoryTests: AbstractOnServerIT() {
     }
 
      */
-
-
 }

+ 81 - 98
app/src/main/AndroidManifest.xml

@@ -1,22 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?><!--
-  Nextcloud Android client application
-
-  Copyright (C) 2012  Bartek Przybylski
-  Copyright (C) 2012-2016 ownCloud Inc.
-  Copyright (C) 2016 Nextcloud
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License version 2,
-  as published by the Free Software Foundation.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
--->
+<?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools">
 
@@ -24,16 +6,15 @@
     <uses-permission android:name="android.permission.READ_CONTACTS" />
     <uses-permission android:name="android.permission.WRITE_CONTACTS" />
     <uses-permission android:name="android.permission.READ_CALENDAR" />
-    <uses-permission android:name="android.permission.WRITE_CALENDAR" />
-
-    <!-- Used for document scanning, but lib declares it as required, which it's not -->
+    <uses-permission android:name="android.permission.WRITE_CALENDAR" /> <!-- Used for document scanning, but lib declares it as required, which it's not -->
     <uses-feature
         android:name="android.hardware.camera2"
         android:required="false"
         tools:node="replace" />
-
-    <!-- WRITE_EXTERNAL_STORAGE may be enabled or disabled by the user after installation in
-        API >= 23; the app needs to handle this -->
+    <!--
+ WRITE_EXTERNAL_STORAGE may be enabled or disabled by the user after installation in
+        API >= 23; the app needs to handle this
+    -->
     <uses-permission
         android:name="android.permission.WRITE_EXTERNAL_STORAGE"
         android:maxSdkVersion="29"
@@ -45,9 +26,7 @@
         android:name="android.permission.READ_EXTERNAL_STORAGE"
         android:maxSdkVersion="32" />
     <uses-permission android:name="android.permission.CAMERA" />
-    <uses-permission android:name="android.permission.VIBRATE" />
-
-    <!-- Next permissions are always approved in installation time, the apps needs to do nothing special in runtime -->
+    <uses-permission android:name="android.permission.VIBRATE" /> <!-- Next permissions are always approved in installation time, the apps needs to do nothing special in runtime -->
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.READ_SYNC_STATS" />
     <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
@@ -62,35 +41,72 @@
     <uses-permission
         android:name="com.android.launcher.permission.INSTALL_SHORTCUT"
         android:maxSdkVersion="25" />
-
-    <!-- Apps that target Android 9 (API level 28) or higher and use foreground services
-    must request the FOREGROUND_SERVICE permission -->
-    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
-
-    <!-- Runtime permissions introduced in Android 13 (API level 33) -->
+    <!--
+ Apps that target Android 9 (API level 28) or higher and use foreground services
+    must request the FOREGROUND_SERVICE permission
+    -->
+    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <!-- Runtime permissions introduced in Android 13 (API level 33) -->
     <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
     <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
-    <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
-
-    <!-- Needed for Android 14 (API level 34) -->
+    <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <!-- Needed for Android 14 (API level 34) -->
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
-
-    <!-- Some Chromebooks don't support touch. Although not essential,
-         it's a good idea to explicitly include this declaration. -->
+    <!--
+ Some Chromebooks don't support touch. Although not essential,
+         it's a good idea to explicitly include this declaration.
+    -->
     <uses-feature
         android:name="android.hardware.touchscreen"
         android:required="false" />
-
     <uses-feature
         android:name="android.hardware.camera"
         android:required="false" />
 
+    <queries>
+        <package android:name="it.niedermann.nextcloud.deck" />
+        <package android:name="it.niedermann.nextcloud.deck.play" />
+        <package android:name="it.niedermann.nextcloud.deck.dev" />
+        <package android:name="at.bitfire.davdroid" />
+
+        <intent>
+            <action android:name="android.intent.action.VIEW" />
+
+            <data android:mimeType="*/*" />
+        </intent>
+        <intent>
+            <action android:name="android.intent.action.SEND" />
+
+            <data android:mimeType="*/*" />
+        </intent>
+        <intent>
+            <action android:name="android.intent.action.SEND_MULTIPLE" />
+
+            <data android:mimeType="*/*" />
+        </intent>
+        <intent>
+            <action android:name="android.intent.action.PICK" />
+
+            <data android:mimeType="*/*" />
+        </intent>
+        <intent>
+            <action android:name="android.media.action.IMAGE_CAPTURE" />
+        </intent>
+        <intent>
+            <action android:name="android.media.action.IMAGE_CAPTURE_SECURE" />
+        </intent>
+        <intent>
+            <action android:name="android.media.action.VIDEO_CAPTURE" />
+        </intent>
+        <intent>
+            <action android:name="android.intent.action.GET_CONTENT" />
+        </intent>
+    </queries>
+
     <application
         android:name=".MainApp"
         android:allowBackup="false"
-        android:fullBackupContent="@xml/backup_config"
         android:dataExtractionRules="@xml/backup_rules"
+        android:fullBackupContent="@xml/backup_config"
         android:icon="@mipmap/ic_launcher"
         android:installLocation="internalOnly"
         android:label="@string/app_name"
@@ -101,8 +117,11 @@
         android:supportsRtl="true"
         android:theme="@style/Theme.ownCloud.Toolbar"
         android:usesCleartextTraffic="true"
-        tools:replace="android:allowBackup"
-        tools:ignore="UnusedAttribute">
+        tools:ignore="UnusedAttribute"
+        tools:replace="android:allowBackup">
+        <activity
+            android:name="com.nextcloud.ui.composeActivity.ComposeActivity"
+            android:exported="false" />
 
         <uses-library
             android:name="org.apache.http.legacy"
@@ -203,8 +222,8 @@
         <activity
             android:name=".ui.activity.SetupEncryptionActivity"
             android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"
-            android:theme="@style/Theme.NoBackground"
-            android:exported="false" />
+            android:exported="false"
+            android:theme="@style/Theme.NoBackground" />
         <activity
             android:name=".ui.activity.ContactsPreferenceActivity"
             android:exported="false"
@@ -217,12 +236,16 @@
             android:theme="@style/Theme.ownCloud.NoActionBar">
             <intent-filter>
                 <action android:name="android.intent.action.SEND" />
+
                 <category android:name="android.intent.category.DEFAULT" />
+
                 <data android:mimeType="*/*" />
             </intent-filter>
             <intent-filter>
                 <action android:name="android.intent.action.SEND_MULTIPLE" />
+
                 <category android:name="android.intent.category.DEFAULT" />
+
                 <data android:mimeType="*/*" />
             </intent-filter>
         </activity>
@@ -236,9 +259,10 @@
             android:theme="@style/Theme.ownCloud.Overlay" />
         <activity
             android:name=".ui.preview.PreviewMediaActivity"
-            android:exported="false"
             android:configChanges="orientation|screenLayout|screenSize|keyboardHidden"
+            android:exported="false"
             android:theme="@style/Theme.ownCloud.Media" />
+
         <service
             android:name=".authentication.AccountAuthenticatorService"
             android:exported="false">
@@ -264,8 +288,8 @@
         </service>
         <service
             android:name="com.nextcloud.client.widget.DashboardWidgetService"
-            android:permission="android.permission.BIND_REMOTEVIEWS"
-            android:exported="true" />
+            android:exported="true"
+            android:permission="android.permission.BIND_REMOTEVIEWS" />
 
         <provider
             android:name=".providers.FileContentProvider"
@@ -303,14 +327,12 @@
                 android:readPermission="false"
                 android:writePermission="false" />
         </provider>
-
         <provider
             android:name=".providers.UsersAndGroupsSearchProvider"
             android:authorities="@string/users_and_groups_search_authority"
             android:enabled="true"
             android:exported="false"
             android:label="@string/share_search" />
-
         <provider
             android:name=".providers.DocumentsStorageProvider"
             android:authorities="@string/document_provider_authority"
@@ -321,9 +343,7 @@
             <intent-filter>
                 <action android:name="android.content.action.DOCUMENTS_PROVIDER" />
             </intent-filter>
-        </provider>
-
-        <!-- new provider used to generate URIs without file:// scheme (forbidden from Android 7) -->
+        </provider> <!-- new provider used to generate URIs without file:// scheme (forbidden from Android 7) -->
         <provider
             android:name="androidx.core.content.FileProvider"
             android:authorities="@string/file_provider_authority"
@@ -338,8 +358,7 @@
             android:authorities="@string/image_cache_provider_authority"
             android:exported="true"
             android:grantUriPermissions="true"
-            android:permission="android.permission.MANAGE_DOCUMENTS" />
-        <!-- Disable WorkManager initialization. Whoever designed this, should pay closer attention -->
+            android:permission="android.permission.MANAGE_DOCUMENTS" /> <!-- Disable WorkManager initialization. Whoever designed this, should pay closer attention -->
         <!-- to "best before" dates in his fridge. -->
         <!-- disable default provider -->
         <provider
@@ -395,12 +414,12 @@
             android:exported="false" />
         <service
             android:name="com.nextcloud.client.jobs.transfer.FileTransferService"
-            android:foregroundServiceType="dataSync"
-            android:exported="false" />
+            android:exported="false"
+            android:foregroundServiceType="dataSync" />
         <service
             android:name="com.nextcloud.client.media.PlayerService"
-            android:foregroundServiceType="mediaPlayback"
-            android:exported="false" />
+            android:exported="false"
+            android:foregroundServiceType="mediaPlayback" />
 
         <activity
             android:name=".ui.activity.PassCodeActivity"
@@ -478,6 +497,7 @@
             <intent-filter>
                 <action android:name="android.intent.action.SEARCH" />
             </intent-filter>
+
             <meta-data
                 android:name="android.app.searchable"
                 android:resource="@xml/users_and_groups_searchable" />
@@ -514,7 +534,6 @@
             android:name="com.nextcloud.client.editimage.EditImageActivity"
             android:exported="false"
             android:theme="@style/Theme.ownCloud.Toolbar.NullBackground" />
-
         <activity
             android:name="com.nmc.android.ui.LauncherActivity"
             android:exported="true"
@@ -525,42 +544,6 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
-
     </application>
 
-    <queries>
-        <package android:name="it.niedermann.nextcloud.deck" />
-        <package android:name="it.niedermann.nextcloud.deck.play" />
-        <package android:name="it.niedermann.nextcloud.deck.dev" />
-        <package android:name="at.bitfire.davdroid"/>
-
-        <intent>
-            <action android:name="android.intent.action.VIEW" />
-            <data android:mimeType="*/*" />
-        </intent>
-        <intent>
-            <action android:name="android.intent.action.SEND" />
-            <data android:mimeType="*/*" />
-        </intent>
-        <intent>
-            <action android:name="android.intent.action.SEND_MULTIPLE" />
-            <data android:mimeType="*/*" />
-        </intent>
-        <intent>
-            <action android:name="android.intent.action.PICK" />
-            <data android:mimeType="*/*" />
-        </intent>
-        <intent>
-            <action android:name="android.media.action.IMAGE_CAPTURE" />
-        </intent>
-        <intent>
-            <action android:name="android.media.action.IMAGE_CAPTURE_SECURE" />
-        </intent>
-        <intent>
-            <action android:name="android.media.action.VIDEO_CAPTURE" />
-        </intent>
-        <intent>
-            <action android:name="android.intent.action.GET_CONTENT" />
-        </intent>
-    </queries>
-</manifest>
+</manifest>

+ 7 - 1
app/src/main/java/com/nextcloud/client/assistant/AssistantViewModel.kt

@@ -64,7 +64,7 @@ class AssistantViewModel(client: NextcloudClient) : ViewModel() {
 
     fun createTask(
         input: String,
-        type: String,
+        type: String
     ) {
         viewModelScope.launch(Dispatchers.IO) {
             val result = repository.createTask(input, type)
@@ -126,6 +126,12 @@ class AssistantViewModel(client: NextcloudClient) : ViewModel() {
         }
     }
 
+    fun resetTaskDeletionState() {
+        _isTaskDeleted.update {
+            null
+        }
+    }
+
     private fun filterTaskList(taskTypeId: String?) {
         if (taskTypeId == null) {
             _filteredTaskList.update {

+ 34 - 19
app/src/main/java/com/nextcloud/client/assistant/AsssistantScreen.kt

@@ -32,7 +32,11 @@ import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.lazy.LazyColumn
 import androidx.compose.foundation.lazy.items
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Add
 import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material3.FloatingActionButton
+import androidx.compose.material3.Icon
 import androidx.compose.material3.LinearProgressIndicator
 import androidx.compose.material3.pulltorefresh.rememberPullToRefreshState
 import androidx.compose.runtime.Composable
@@ -42,13 +46,13 @@ import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.input.nestedscroll.nestedScroll
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.unit.dp
-import com.google.android.material.floatingactionbutton.FloatingActionButton
 import com.nextcloud.client.assistant.component.AddTaskAlertDialog
 import com.nextcloud.client.assistant.component.CenterText
 import com.nextcloud.client.assistant.component.TaskTypesRow
@@ -62,7 +66,7 @@ import kotlinx.coroutines.delay
 
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
-fun AssistantScreen(viewModel: AssistantViewModel, floatingActionButton: FloatingActionButton) {
+fun AssistantScreen(viewModel: AssistantViewModel) {
     val activity = LocalContext.current as Activity
     val loading by viewModel.loading.collectAsState()
     val selectedTaskType by viewModel.selectedTaskType.collectAsState()
@@ -86,17 +90,6 @@ fun AssistantScreen(viewModel: AssistantViewModel, floatingActionButton: Floatin
         }
     }
 
-    floatingActionButton.setOnClickListener {
-        if (selectedTaskType?.id != null) {
-            showAddTaskAlertDialog = true
-        } else {
-            DisplayUtils.showSnackMessage(
-                activity,
-                activity.getString(R.string.assistant_screen_select_different_task_type_to_add)
-            )
-        }
-    }
-
     Box(Modifier.nestedScroll(pullRefreshState.nestedScrollConnection)) {
         if (loading || pullRefreshState.isRefreshing) {
             CenterText(text = stringResource(id = R.string.assistant_screen_loading))
@@ -122,6 +115,24 @@ fun AssistantScreen(viewModel: AssistantViewModel, floatingActionButton: Floatin
         } else {
             LinearProgressIndicator(progress = { pullRefreshState.progress }, modifier = Modifier.fillMaxWidth())
         }
+
+        FloatingActionButton(
+            modifier = Modifier
+                .align(Alignment.BottomEnd)
+                .padding(16.dp),
+            onClick = {
+                if (selectedTaskType?.id != null) {
+                    showAddTaskAlertDialog = true
+                } else {
+                    DisplayUtils.showSnackMessage(
+                        activity,
+                        activity.getString(R.string.assistant_screen_select_different_task_type_to_add)
+                    )
+                }
+            }
+        ) {
+            Icon(Icons.Filled.Add, "Add Task Icon")
+        }
     }
 
     if (isTaskCreated) {
@@ -133,7 +144,7 @@ fun AssistantScreen(viewModel: AssistantViewModel, floatingActionButton: Floatin
 
     isTaskDeleted?.let {
         val messageId = if (it) {
-            R.string.assistant_screen_task_delete_success_message
+            R.string.assistant_screen_task_create_success_message
         } else {
             R.string.assistant_screen_task_delete_success_message
         }
@@ -142,6 +153,8 @@ fun AssistantScreen(viewModel: AssistantViewModel, floatingActionButton: Floatin
             activity,
             stringResource(id = messageId)
         )
+
+        viewModel.resetTaskDeletionState()
     }
 
     if (showDeleteTaskAlertDialog) {
@@ -152,7 +165,7 @@ fun AssistantScreen(viewModel: AssistantViewModel, floatingActionButton: Floatin
                 title = stringResource(id = R.string.assistant_screen_delete_task_alert_dialog_title),
                 description = stringResource(id = R.string.assistant_screen_delete_task_alert_dialog_description),
                 dismiss = { showDeleteTaskAlertDialog = false },
-                onComplete = { viewModel.deleteTask(id) },
+                onComplete = { viewModel.deleteTask(id) }
             )
         }
     }
@@ -173,7 +186,7 @@ private fun AssistantContent(
     taskTypes: List<TaskType>?,
     selectedTaskType: TaskType?,
     viewModel: AssistantViewModel,
-    showDeleteTaskAlertDialog: (Long) -> Unit,
+    showDeleteTaskAlertDialog: (Long) -> Unit
 ) {
     LazyColumn(
         modifier = Modifier
@@ -197,9 +210,11 @@ private fun AssistantContent(
 
 @Composable
 private fun EmptyTaskList(selectedTaskType: TaskType?, taskTypes: List<TaskType>?, viewModel: AssistantViewModel) {
-    Column(modifier = Modifier
-        .fillMaxSize()
-        .padding(16.dp)) {
+    Column(
+        modifier = Modifier
+            .fillMaxSize()
+            .padding(16.dp)
+    ) {
         TaskTypesRow(selectedTaskType, data = taskTypes) { task ->
             viewModel.selectTaskType(task)
         }

+ 3 - 1
app/src/main/java/com/nextcloud/client/assistant/component/AddTaskAlertDialog.kt

@@ -58,7 +58,9 @@ fun AddTaskAlertDialog(viewModel: AssistantViewModel, taskType: TaskType, dismis
             TextField(
                 placeholder = {
                     Text(
-                        text = stringResource(id = R.string.assistant_screen_create_task_alert_dialog_input_field_placeholder),
+                        text = stringResource(
+                            id = R.string.assistant_screen_create_task_alert_dialog_input_field_placeholder
+                        )
                     )
                 },
                 keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text),

+ 2 - 3
app/src/main/java/com/nextcloud/client/assistant/component/TaskView.kt

@@ -55,12 +55,11 @@ import com.owncloud.android.lib.resources.assistant.model.Task
 @Composable
 fun TaskView(
     task: Task,
-    showDeleteTaskAlertDialog: (Long) -> Unit,
+    showDeleteTaskAlertDialog: (Long) -> Unit
 ) {
     var expanded by remember { mutableStateOf(false) }
     var showMoreActionsBottomSheet by remember { mutableStateOf(false) }
 
-
     // TODO Check color
     Column(
         modifier = Modifier
@@ -135,7 +134,7 @@ fun TaskView(
                     R.string.assistant_screen_task_more_actions_bottom_sheet_delete_action
                 ) {
                     showDeleteTaskAlertDialog(task.id)
-                },
+                }
             )
 
             MoreActionsBottomSheet(

+ 1 - 1
app/src/main/java/com/nextcloud/client/assistant/repository/AssistantRepository.kt

@@ -38,7 +38,7 @@ class AssistantRepository(private val client: NextcloudClient) : AssistantReposi
 
     override fun createTask(
         input: String,
-        type: String,
+        type: String
     ): RemoteOperationResult<Void> {
         return CreateTaskRemoteOperation(input, type).execute(client)
     }

+ 1 - 1
app/src/main/java/com/nextcloud/client/assistant/repository/AssistantRepositoryType.kt

@@ -30,7 +30,7 @@ interface AssistantRepositoryType {
 
     fun createTask(
         input: String,
-        type: String,
+        type: String
     ): RemoteOperationResult<Void>
 
     fun getTaskList(appId: String): RemoteOperationResult<TaskList>

+ 4 - 0
app/src/main/java/com/nextcloud/client/di/ComponentsModule.java

@@ -41,6 +41,7 @@ import com.nextcloud.client.widget.DashboardWidgetService;
 import com.nextcloud.ui.ChooseAccountDialogFragment;
 import com.nextcloud.ui.ImageDetailFragment;
 import com.nextcloud.ui.SetStatusDialogFragment;
+import com.nextcloud.ui.composeActivity.ComposeActivity;
 import com.nextcloud.ui.fileactions.FileActionsBottomSheet;
 import com.nmc.android.ui.LauncherActivity;
 import com.owncloud.android.MainApp;
@@ -199,6 +200,9 @@ abstract class ComponentsModule {
     @ContributesAndroidInjector
     abstract CommunityActivity participateActivity();
 
+    @ContributesAndroidInjector
+    abstract ComposeActivity composeActivity();
+
     @ContributesAndroidInjector
     abstract PassCodeActivity passCodeActivity();
 

+ 47 - 39
app/src/main/java/com/nextcloud/ui/composeFragment/ComposeFragment.kt → app/src/main/java/com/nextcloud/ui/composeActivity/ComposeActivity.kt

@@ -19,97 +19,105 @@
  * along with this program. If not, see <https://www.gnu.org/licenses/>.
  */
 
-package com.nextcloud.ui.composeFragment
+package com.nextcloud.ui.composeActivity
 
+import android.content.Context
 import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
+import android.view.MenuItem
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
-import androidx.compose.ui.platform.ViewCompositionStrategy
-import com.google.android.material.floatingactionbutton.FloatingActionButton
 import com.nextcloud.client.assistant.AssistantScreen
 import com.nextcloud.client.assistant.AssistantViewModel
 import com.nextcloud.common.NextcloudClient
+import com.nextcloud.common.User
 import com.nextcloud.utils.extensions.getSerializableArgument
 import com.owncloud.android.R
-import com.owncloud.android.databinding.FragmentComposeViewBinding
+import com.owncloud.android.databinding.ActivityComposeBinding
 import com.owncloud.android.lib.common.OwnCloudClientFactory
 import com.owncloud.android.lib.common.accounts.AccountUtils
 import com.owncloud.android.lib.common.utils.Log_OC
-import com.owncloud.android.ui.fragment.FileFragment
+import com.owncloud.android.ui.activity.DrawerActivity
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.withContext
 
-class ComposeFragment : FileFragment() {
+class ComposeActivity : DrawerActivity() {
 
-    private var _binding: FragmentComposeViewBinding? = null
-
-    private val binding get() = _binding!!
-    private var destination: ComposeDestination? = null
+    lateinit var binding: ActivityComposeBinding
 
     companion object {
         const val destinationKey = "destinationKey"
+        const val titleKey = "titleKey"
+        const val menuItemKey = "menuItemKey"
     }
 
-    override fun onCreateView(
-        inflater: LayoutInflater,
-        container: ViewGroup?,
-        savedInstanceState: Bundle?
-    ): View {
-        _binding = FragmentComposeViewBinding.inflate(inflater, container, false)
-        destination = arguments.getSerializableArgument(destinationKey, ComposeDestination::class.java)
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        binding = ActivityComposeBinding.inflate(layoutInflater)
+        setContentView(binding.root)
 
-        binding.composeView.apply {
-            setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
+        val destination = intent.getSerializableArgument(destinationKey, ComposeDestination::class.java)
+        val titleId = intent.getIntExtra(titleKey, R.string.empty)
+        val menuItemId = intent.getIntExtra(menuItemKey, R.id.nav_assistant)
 
-            setContent {
-                Content(destination)
-            }
+        setupToolbar()
+        updateActionBarTitleAndHomeButtonByString(getString(titleId))
+
+        setupDrawer(menuItemId)
+
+        binding.composeView.setContent {
+            Content(destination, storageManager.user, this)
         }
+    }
 
-        return binding.root
+    override fun onResume() {
+        super.onResume()
+        setDrawerMenuItemChecked(R.id.nav_assistant)
+    }
+
+    override fun onOptionsItemSelected(item: MenuItem): Boolean {
+        var retval = true
+        if (item.itemId == android.R.id.home) {
+            if (isDrawerOpen) {
+                closeDrawer()
+            } else {
+                openDrawer()
+            }
+        } else {
+            retval = super.onOptionsItemSelected(item)
+        }
+        return retval
     }
 
     @Composable
-    private fun Content(destination: ComposeDestination?) {
-        val floatingActionButton: FloatingActionButton = requireActivity().findViewById(R.id.fab_main)
+    private fun Content(destination: ComposeDestination?, user: User, context: Context) {
         var nextcloudClient by remember { mutableStateOf<NextcloudClient?>(null) }
 
         LaunchedEffect(Unit) {
-            nextcloudClient = getNextcloudClient()
+            nextcloudClient = getNextcloudClient(user, context)
         }
 
         return if (destination == ComposeDestination.AssistantScreen && nextcloudClient != null) {
             AssistantScreen(
                 viewModel = AssistantViewModel(
                     client = nextcloudClient!!
-                ),
-                floatingActionButton
+                )
             )
         } else {
-
         }
     }
 
-    private suspend fun getNextcloudClient(): NextcloudClient? {
+    private suspend fun getNextcloudClient(user: User, context: Context): NextcloudClient? {
         return withContext(Dispatchers.IO) {
             try {
-                OwnCloudClientFactory.createNextcloudClient(containerActivity.storageManager.user, requireContext())
+                OwnCloudClientFactory.createNextcloudClient(user, context)
             } catch (e: AccountUtils.AccountNotFoundException) {
                 Log_OC.e(this, "Error caught at init of AssistantRepository", e)
                 null
             }
         }
     }
-
-    override fun onDestroyView() {
-        super.onDestroyView()
-        _binding = null
-    }
 }

+ 5 - 3
app/src/main/java/com/nextcloud/ui/composeFragment/ComposeDestination.kt → app/src/main/java/com/nextcloud/ui/composeActivity/ComposeDestination.kt

@@ -19,8 +19,10 @@
  * along with this program. If not, see <https://www.gnu.org/licenses/>.
  */
 
-package com.nextcloud.ui.composeFragment
+package com.nextcloud.ui.composeActivity
 
-enum class ComposeDestination {
+import java.io.Serializable
+
+enum class ComposeDestination : Serializable {
     AssistantScreen
-}
+}

+ 3 - 3
app/src/main/java/com/nextcloud/ui/composeComponents/bottomSheet/MoreActionsBottomSheet.kt

@@ -77,7 +77,7 @@ fun MoreActionsBottomSheet(
                                 }
                         }
                         .padding(all = 16.dp),
-                    verticalAlignment = Alignment.CenterVertically,
+                    verticalAlignment = Alignment.CenterVertically
                 ) {
                     Icon(
                         painter = painterResource(id = action.first),
@@ -90,7 +90,7 @@ fun MoreActionsBottomSheet(
 
                     Text(
                         text = stringResource(action.second),
-                        fontSize = 16.sp,
+                        fontSize = 16.sp
                     )
                 }
             }
@@ -98,4 +98,4 @@ fun MoreActionsBottomSheet(
             Spacer(modifier = Modifier.height(32.dp))
         }
     }
-}
+}

+ 0 - 1
app/src/main/java/com/owncloud/android/ui/activity/CommunityActivity.kt

@@ -42,7 +42,6 @@ open class CommunityActivity : DrawerActivity() {
 
         setupToolbar()
         updateActionBarTitleAndHomeButtonByString(getString(R.string.drawer_community))
-
         setupDrawer(R.id.nav_community)
         binding.communityReleaseCandidateText.movementMethod = LinkMovementMethod.getInstance()
         setupContributeForumView()

+ 9 - 19
app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java

@@ -74,8 +74,8 @@ import com.nextcloud.client.preferences.AppPreferences;
 import com.nextcloud.common.NextcloudClient;
 import com.nextcloud.java.util.Optional;
 import com.nextcloud.ui.ChooseAccountDialogFragment;
-import com.nextcloud.ui.composeFragment.ComposeDestination;
-import com.nextcloud.ui.composeFragment.ComposeFragment;
+import com.nextcloud.ui.composeActivity.ComposeActivity;
+import com.nextcloud.ui.composeActivity.ComposeDestination;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
 import com.owncloud.android.authentication.PassCodeManager;
@@ -248,9 +248,6 @@ public abstract class DrawerActivity extends ToolbarActivity
         if (getSupportActionBar() != null) {
             getSupportActionBar().setDisplayHomeAsUpEnabled(true);
         }
-
-        showSortListGroup(true);
-        hideSearchText(false);
     }
 
     /**
@@ -548,7 +545,7 @@ public abstract class DrawerActivity extends ToolbarActivity
             intent.putExtra(FileDisplayActivity.DRAWER_MENU_ID, menuItem.getItemId());
             startActivity(intent);
         } else if (itemId == R.id.nav_assistant) {
-            navigateComposeView(ComposeDestination.AssistantScreen, false, true);
+            startComposeActivity(ComposeDestination.AssistantScreen, R.string.assistant_screen_top_bar_title, itemId);
         } else {
             if (menuItem.getItemId() >= MENU_ITEM_EXTERNAL_LINK &&
                 menuItem.getItemId() <= MENU_ITEM_EXTERNAL_LINK + 100) {
@@ -560,19 +557,12 @@ public abstract class DrawerActivity extends ToolbarActivity
         }
     }
 
-    private void navigateComposeView(ComposeDestination destination, boolean showSortListGroup, boolean hideSearchText) {
-        showSortListGroup(showSortListGroup);
-        hideSearchText(hideSearchText);
-
-        ComposeFragment composeFragment = new ComposeFragment();
-        Bundle bundle = new Bundle();
-        bundle.putSerializable(ComposeFragment.destinationKey, destination);
-        composeFragment.setArguments(bundle);
-
-        getSupportFragmentManager()
-            .beginTransaction()
-            .replace(R.id.left_fragment_container, composeFragment)
-            .commit();
+    private void startComposeActivity(ComposeDestination destination, int titleId, int menuItemId) {
+        Intent composeActivity = new Intent(getApplicationContext(), ComposeActivity.class);
+        composeActivity.putExtra(ComposeActivity.destinationKey, destination);
+        composeActivity.putExtra(ComposeActivity.titleKey, titleId);
+        composeActivity.putExtra(ComposeActivity.menuItemKey, menuItemId);
+        startActivity(composeActivity);
     }
 
     private void startActivity(Class<? extends Activity> activity) {

+ 0 - 8
app/src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.java

@@ -155,14 +155,6 @@ public abstract class ToolbarActivity extends BaseActivity implements Injectable
         mSearchText.setText(getString(R.string.appbar_search_in, title));
     }
 
-    public void hideSearchText(boolean hide) {
-        if (hide) {
-            mSearchText.setVisibility(View.GONE);
-        } else {
-            mSearchText.setVisibility(View.VISIBLE);
-        }
-    }
-
     @SuppressLint("PrivateResource")
     private void showHomeSearchToolbar(boolean isShow) {
         viewThemeUtils.material.themeToolbar(mToolbar);

+ 54 - 0
app/src/main/res/layout/activity_compose.xml

@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Nextcloud Android client application
+  ~
+  ~ @author Alper Ozturk
+  ~ Copyright (C) 2024 Alper Ozturk
+  ~ Copyright (C) 2024 Nextcloud GmbH
+  ~
+  ~ This program is free software: you can redistribute it and/or modify
+  ~ it under the terms of the GNU Affero General Public License as published by
+  ~ the Free Software Foundation, either version 3 of the License, or
+  ~ (at your option) any later version.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
+  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+  ~ GNU Affero General Public License for more details.
+  ~
+  ~ You should have received a copy of the GNU Affero General Public License
+  ~ along with this program. If not, see <https://www.gnu.org/licenses/>.
+  -->
+
+
+<androidx.drawerlayout.widget.DrawerLayout
+    android:id="@+id/drawer_layout"
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:clickable="true"
+    android:fitsSystemWindows="true"
+    android:focusable="true">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical">
+
+        <include layout="@layout/toolbar_standard" />
+
+        <androidx.compose.ui.platform.ComposeView
+            android:id="@+id/compose_view"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"/>
+
+    </LinearLayout>
+
+    <include
+        layout="@layout/drawer"
+        android:layout_width="@dimen/drawer_width"
+        android:layout_height="match_parent"
+        android:layout_gravity="start"/>
+
+</androidx.drawerlayout.widget.DrawerLayout>

+ 2 - 1
app/src/main/res/values/strings.xml

@@ -18,6 +18,7 @@
     <string name="menu_item_sort_by_size_biggest_first">Biggest first</string>
     <string name="menu_item_sort_by_size_smallest_first">Smallest first</string>
 
+    <string name="assistant_screen_top_bar_title">Assistant</string>
     <string name="assistant_screen_loading">Task List are loading, please wait</string>
     <string name="assistant_screen_no_task_available_text">No task available for %s task type, you can create a new task from bottom right.</string>
     <string name="assistant_screen_delete_task_alert_dialog_title">Delete Task</string>
@@ -1155,7 +1156,7 @@
     <string name="image_preview_unit_megapixel">%s MP</string>
     <string name="image_preview_filedetails">File details</string>
     <string name="image_preview_image_taking_conditions">Image taking conditions</string>
-    <string translatable="false" name="make_model">%1$s %2$s</string>
+    <string name="make_model" translatable="false">%1$s %2$s</string>
     <string name="sub_folder_rule_year">Year</string>
     <string name="sub_folder_rule_month">Year/Month</string>
     <string name="sub_folder_rule_day">Year/Month/Day</string>