Browse Source

Merge pull request #13610 from nextcloud/notification

check and show notification bell
Tobias Kaminsky 8 months ago
parent
commit
d80612ba57

BIN
app/screenshots/gplay/debug/com.nextcloud.client.FileDisplayActivityScreenshotIT_drawer.png


BIN
app/screenshots/gplay/debug/com.nextcloud.client.UploadListActivityActivityIT_openDrawer.png


+ 1 - 1
app/src/main/java/com/nextcloud/client/files/DeepLinkConstants.kt

@@ -15,7 +15,7 @@ enum class DeepLinkConstants(val route: String, val navId: Int) {
     OPEN_MEDIA("openMedia", R.id.nav_gallery),
     OPEN_MEDIA("openMedia", R.id.nav_gallery),
     OPEN_SHARED("openShared", R.id.nav_shared),
     OPEN_SHARED("openShared", R.id.nav_shared),
     OPEN_OFFLINE("openOffline", R.id.nav_on_device),
     OPEN_OFFLINE("openOffline", R.id.nav_on_device),
-    OPEN_NOTIFICATIONS("openNotifications", R.id.nav_notifications),
+    OPEN_NOTIFICATIONS("openNotifications", -1),
     OPEN_DELETED("openDeleted", R.id.nav_trashbin),
     OPEN_DELETED("openDeleted", R.id.nav_trashbin),
     OPEN_SETTINGS("openSettings", R.id.nav_settings),
     OPEN_SETTINGS("openSettings", R.id.nav_settings),
 
 

+ 0 - 1
app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt

@@ -36,7 +36,6 @@ fun DrawerActivity.getMenuItemIdFromTitle(): Int? {
         getString(R.string.drawer_item_groupfolders) -> R.id.nav_groupfolders
         getString(R.string.drawer_item_groupfolders) -> R.id.nav_groupfolders
         getString(R.string.drawer_item_on_device) -> R.id.nav_on_device
         getString(R.string.drawer_item_on_device) -> R.id.nav_on_device
         getString(R.string.drawer_item_recently_modified) -> R.id.nav_recently_modified
         getString(R.string.drawer_item_recently_modified) -> R.id.nav_recently_modified
-        getString(R.string.drawer_item_notifications) -> R.id.nav_notifications
         getString(R.string.drawer_item_assistant) -> R.id.nav_assistant
         getString(R.string.drawer_item_assistant) -> R.id.nav_assistant
         getString(R.string.drawer_item_uploads_list) -> R.id.nav_uploads
         getString(R.string.drawer_item_uploads_list) -> R.id.nav_uploads
         getString(R.string.drawer_item_trashbin) -> R.id.nav_trashbin
         getString(R.string.drawer_item_trashbin) -> R.id.nav_trashbin

+ 4 - 3
app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java

@@ -539,8 +539,6 @@ public abstract class DrawerActivity extends ToolbarActivity
             startActivity(TrashbinActivity.class, Intent.FLAG_ACTIVITY_CLEAR_TOP);
             startActivity(TrashbinActivity.class, Intent.FLAG_ACTIVITY_CLEAR_TOP);
         } else if (itemId == R.id.nav_activity) {
         } else if (itemId == R.id.nav_activity) {
             startActivity(ActivitiesActivity.class, Intent.FLAG_ACTIVITY_CLEAR_TOP);
             startActivity(ActivitiesActivity.class, Intent.FLAG_ACTIVITY_CLEAR_TOP);
-        } else if (itemId == R.id.nav_notifications) {
-            startActivity(NotificationsActivity.class);
         } else if (itemId == R.id.nav_settings) {
         } else if (itemId == R.id.nav_settings) {
             startActivity(SettingsActivity.class);
             startActivity(SettingsActivity.class);
         } else if (itemId == R.id.nav_community) {
         } else if (itemId == R.id.nav_community) {
@@ -583,7 +581,7 @@ public abstract class DrawerActivity extends ToolbarActivity
         startActivity(composeActivity);
         startActivity(composeActivity);
     }
     }
 
 
-    private void startActivity(Class<? extends Activity> activity) {
+    void startActivity(Class<? extends Activity> activity) {
         startActivity(new Intent(getApplicationContext(), activity));
         startActivity(new Intent(getApplicationContext(), activity));
     }
     }
 
 
@@ -1306,6 +1304,9 @@ public abstract class DrawerActivity extends ToolbarActivity
             case ACTION_APP_UPDATE:
             case ACTION_APP_UPDATE:
                 openAppStore(getPackageName(), false);
                 openAppStore(getPackageName(), false);
                 break;
                 break;
+            case OPEN_NOTIFICATIONS:
+                startActivity(NotificationsActivity.class);
+                break;
             default:
             default:
                 handleNavItemClickEvent(deepLinkType.getNavId());
                 handleNavItemClickEvent(deepLinkType.getNavId());
                 break;
                 break;

+ 24 - 0
app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java

@@ -83,6 +83,8 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCo
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.lib.resources.files.RestoreFileVersionRemoteOperation;
 import com.owncloud.android.lib.resources.files.RestoreFileVersionRemoteOperation;
 import com.owncloud.android.lib.resources.files.SearchRemoteOperation;
 import com.owncloud.android.lib.resources.files.SearchRemoteOperation;
+import com.owncloud.android.lib.resources.notifications.GetNotificationsRemoteOperation;
+import com.owncloud.android.lib.resources.notifications.models.Notification;
 import com.owncloud.android.operations.CopyFileOperation;
 import com.owncloud.android.operations.CopyFileOperation;
 import com.owncloud.android.operations.CreateFolderOperation;
 import com.owncloud.android.operations.CreateFolderOperation;
 import com.owncloud.android.operations.DownloadType;
 import com.owncloud.android.operations.DownloadType;
@@ -308,6 +310,7 @@ public class FileDisplayActivity extends FileActivity
         setupHomeSearchToolbarWithSortAndListButtons();
         setupHomeSearchToolbarWithSortAndListButtons();
         mMenuButton.setOnClickListener(v -> openDrawer());
         mMenuButton.setOnClickListener(v -> openDrawer());
         mSwitchAccountButton.setOnClickListener(v -> showManageAccountsDialog());
         mSwitchAccountButton.setOnClickListener(v -> showManageAccountsDialog());
+        mNotificationButton.setOnClickListener(v -> startActivity(NotificationsActivity.class));
         fastScrollUtils.fixAppBarForFastScroll(binding.appbar.appbar, binding.rootLayout);
         fastScrollUtils.fixAppBarForFastScroll(binding.appbar.appbar, binding.rootLayout);
     }
     }
 
 
@@ -395,6 +398,7 @@ public class FileDisplayActivity extends FileActivity
 
 
         upgradeNotificationForInstantUpload();
         upgradeNotificationForInstantUpload();
         checkOutdatedServer();
         checkOutdatedServer();
+        checkNotifications();
     }
     }
 
 
     private Activity getActivity() {
     private Activity getActivity() {
@@ -425,6 +429,24 @@ public class FileDisplayActivity extends FileActivity
             DisplayUtils.showServerOutdatedSnackbar(this, Snackbar.LENGTH_LONG);
             DisplayUtils.showServerOutdatedSnackbar(this, Snackbar.LENGTH_LONG);
         }
         }
     }
     }
+    
+    private void checkNotifications() {
+        new Thread(() -> {
+            try {
+                RemoteOperationResult<List<Notification>> result = new GetNotificationsRemoteOperation()
+                    .execute(clientFactory.createNextcloudClient(accountManager.getUser()));
+                
+                if (result.isSuccess() && !result.getResultData().isEmpty()) {
+                    runOnUiThread(() -> mNotificationButton.setVisibility(View.VISIBLE));
+                } else {
+                    runOnUiThread(() -> mNotificationButton.setVisibility(View.GONE));
+                }
+                
+            } catch (ClientFactory.CreationException e) {
+                Log_OC.e(TAG, "Could not fetch notifications!");
+            }
+        }).start();
+    }
 
 
     @Override
     @Override
     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
@@ -1153,6 +1175,8 @@ public class FileDisplayActivity extends FileActivity
         }
         }
         //show in-app review dialog to user
         //show in-app review dialog to user
         inAppReviewHelper.showInAppReview(this);
         inAppReviewHelper.showInAppReview(this);
+        
+        checkNotifications();
 
 
         Log_OC.v(TAG, "onResume() end");
         Log_OC.v(TAG, "onResume() end");
     }
     }

+ 73 - 34
app/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.kt

@@ -1,6 +1,7 @@
 /*
 /*
  * Nextcloud - Android Client
  * Nextcloud - Android Client
  *
  *
+ * SPDX-FileCopyrightText: 2024 Alper Ozturk <alper.ozturk@nextcloud.com>
  * SPDX-FileCopyrightText: 2020 Chris Narkiewicz <hello@ezaquarii.com>
  * SPDX-FileCopyrightText: 2020 Chris Narkiewicz <hello@ezaquarii.com>
  * SPDX-FileCopyrightText: 2017 Mario Danic <mario@lovelyhq.com>
  * SPDX-FileCopyrightText: 2017 Mario Danic <mario@lovelyhq.com>
  * SPDX-FileCopyrightText: 2017 Nextcloud GmbH
  * SPDX-FileCopyrightText: 2017 Nextcloud GmbH
@@ -8,17 +9,24 @@
  */
  */
 package com.owncloud.android.ui.activity
 package com.owncloud.android.ui.activity
 
 
+import android.os.Build
 import android.os.Bundle
 import android.os.Bundle
 import android.view.Menu
 import android.view.Menu
 import android.view.MenuItem
 import android.view.MenuItem
 import android.view.View
 import android.view.View
+import android.view.WindowInsetsController
 import androidx.annotation.VisibleForTesting
 import androidx.annotation.VisibleForTesting
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.content.ContextCompat
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.LinearLayoutManager
 import com.google.android.material.snackbar.Snackbar
 import com.google.android.material.snackbar.Snackbar
 import com.nextcloud.client.account.User
 import com.nextcloud.client.account.User
 import com.nextcloud.client.account.UserAccountManager
 import com.nextcloud.client.account.UserAccountManager
+import com.nextcloud.client.di.Injectable
 import com.nextcloud.client.jobs.NotificationWork
 import com.nextcloud.client.jobs.NotificationWork
+import com.nextcloud.client.network.ClientFactory
 import com.nextcloud.client.network.ClientFactory.CreationException
 import com.nextcloud.client.network.ClientFactory.CreationException
+import com.nextcloud.client.preferences.AppPreferences
 import com.nextcloud.common.NextcloudClient
 import com.nextcloud.common.NextcloudClient
 import com.owncloud.android.R
 import com.owncloud.android.R
 import com.owncloud.android.databinding.NotificationsLayoutBinding
 import com.owncloud.android.databinding.NotificationsLayoutBinding
@@ -33,12 +41,15 @@ import com.owncloud.android.ui.asynctasks.DeleteAllNotificationsTask
 import com.owncloud.android.ui.notifications.NotificationsContract
 import com.owncloud.android.ui.notifications.NotificationsContract
 import com.owncloud.android.utils.DisplayUtils
 import com.owncloud.android.utils.DisplayUtils
 import com.owncloud.android.utils.PushUtils
 import com.owncloud.android.utils.PushUtils
+import com.owncloud.android.utils.theme.ViewThemeUtils
 import java.util.Optional
 import java.util.Optional
+import javax.inject.Inject
 
 
 /**
 /**
  * Activity displaying all server side stored notification items.
  * Activity displaying all server side stored notification items.
  */
  */
-class NotificationsActivity : DrawerActivity(), NotificationsContract.View {
+@Suppress("TooManyFunctions")
+class NotificationsActivity : AppCompatActivity(), NotificationsContract.View, Injectable {
 
 
     lateinit var binding: NotificationsLayoutBinding
     lateinit var binding: NotificationsLayoutBinding
 
 
@@ -47,6 +58,18 @@ class NotificationsActivity : DrawerActivity(), NotificationsContract.View {
     private var client: NextcloudClient? = null
     private var client: NextcloudClient? = null
     private var optionalUser: Optional<User>? = null
     private var optionalUser: Optional<User>? = null
 
 
+    @Inject
+    lateinit var viewThemeUtils: ViewThemeUtils
+
+    @Inject
+    lateinit var accountManager: UserAccountManager
+
+    @Inject
+    lateinit var clientFactory: ClientFactory
+
+    @Inject
+    lateinit var preferences: AppPreferences
+
     override fun onCreate(savedInstanceState: Bundle?) {
     override fun onCreate(savedInstanceState: Bundle?) {
         Log_OC.v(TAG, "onCreate() start")
         Log_OC.v(TAG, "onCreate() start")
 
 
@@ -54,26 +77,56 @@ class NotificationsActivity : DrawerActivity(), NotificationsContract.View {
 
 
         binding = NotificationsLayoutBinding.inflate(layoutInflater)
         binding = NotificationsLayoutBinding.inflate(layoutInflater)
         setContentView(binding.root)
         setContentView(binding.root)
+        setupActionBar()
+        setupStatusBar()
+        initUser()
+        setupContainingList()
+        setupPushWarning()
+        setupContent()
 
 
-        optionalUser = user
+        if (optionalUser?.isPresent == false) {
+            showError()
+        }
+    }
 
 
+    private fun initUser() {
+        optionalUser = Optional.of(accountManager.user)
         intent?.let {
         intent?.let {
             it.extras?.let { bundle ->
             it.extras?.let { bundle ->
                 setupUser(bundle)
                 setupUser(bundle)
             }
             }
         }
         }
+    }
 
 
-        setupToolbar()
-        updateActionBarTitleAndHomeButtonByString(getString(R.string.drawer_item_notifications))
-        setupDrawer()
-
-        if (optionalUser?.isPresent == false) {
-            showError()
+    private fun setupActionBar() {
+        setSupportActionBar(findViewById(R.id.toolbar_back_button))
+        supportActionBar?.apply {
+            setTitle(R.string.drawer_item_notifications)
+            setDisplayHomeAsUpEnabled(true)
+            setHomeAsUpIndicator(R.drawable.ic_arrow_back_foreground)
         }
         }
+    }
 
 
-        setupContainingList()
-        setupPushWarning()
-        setupContent()
+    private fun setupStatusBar() {
+        window.statusBarColor = ContextCompat.getColor(this, R.color.bg_default)
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+            val appearanceLightStatusBars = if (preferences.isDarkModeEnabled) {
+                0
+            } else {
+                WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS
+            }
+            window.insetsController?.setSystemBarsAppearance(
+                appearanceLightStatusBars,
+                WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS
+            )
+        } else {
+            @Suppress("DEPRECATION")
+            window.decorView.systemUiVisibility = if (preferences.isDarkModeEnabled) {
+                0
+            } else {
+                View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
+            }
+        }
     }
     }
 
 
     private fun setupContainingList() {
     private fun setupContainingList() {
@@ -97,8 +150,6 @@ class NotificationsActivity : DrawerActivity(), NotificationsContract.View {
             val user = optionalUser?.get()
             val user = optionalUser?.get()
             if (user?.accountName.equals(accountName, ignoreCase = true)) {
             if (user?.accountName.equals(accountName, ignoreCase = true)) {
                 accountManager.setCurrentOwnCloudAccount(accountName)
                 accountManager.setCurrentOwnCloudAccount(accountName)
-                setUser(userAccountManager.user)
-                optionalUser = getUser()
             }
             }
         }
         }
     }
     }
@@ -167,18 +218,6 @@ class NotificationsActivity : DrawerActivity(), NotificationsContract.View {
         }
         }
     }
     }
 
 
-    override fun openDrawer() {
-        super.openDrawer()
-        if (snackbar != null && snackbar?.isShown == true) {
-            snackbar?.dismiss()
-        }
-    }
-
-    override fun closeDrawer() {
-        super.closeDrawer()
-        setupPushWarning()
-    }
-
     /**
     /**
      * sets up the UI elements and loads all notification items.
      * sets up the UI elements and loads all notification items.
      */
      */
@@ -265,16 +304,16 @@ class NotificationsActivity : DrawerActivity(), NotificationsContract.View {
     override fun onOptionsItemSelected(item: MenuItem): Boolean {
     override fun onOptionsItemSelected(item: MenuItem): Boolean {
         var retval = true
         var retval = true
         val itemId = item.itemId
         val itemId = item.itemId
-        if (itemId == android.R.id.home) {
-            if (isDrawerOpen) {
-                closeDrawer()
-            } else {
-                openDrawer()
+        when (itemId) {
+            android.R.id.home -> {
+                onBackPressedDispatcher.onBackPressed()
+            }
+            R.id.action_empty_notifications -> {
+                DeleteAllNotificationsTask(client, this).execute()
+            }
+            else -> {
+                retval = super.onOptionsItemSelected(item)
             }
             }
-        } else if (itemId == R.id.action_empty_notifications) {
-            DeleteAllNotificationsTask(client, this).execute()
-        } else {
-            retval = super.onOptionsItemSelected(item)
         }
         }
         return retval
         return retval
     }
     }

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

@@ -52,6 +52,7 @@ public abstract class ToolbarActivity extends BaseActivity implements Injectable
     protected MaterialButton mMenuButton;
     protected MaterialButton mMenuButton;
     protected MaterialTextView mSearchText;
     protected MaterialTextView mSearchText;
     protected MaterialButton mSwitchAccountButton;
     protected MaterialButton mSwitchAccountButton;
+    protected MaterialButton mNotificationButton;
 
 
     private AppBarLayout mAppBar;
     private AppBarLayout mAppBar;
     private RelativeLayout mDefaultToolbar;
     private RelativeLayout mDefaultToolbar;
@@ -82,6 +83,7 @@ public abstract class ToolbarActivity extends BaseActivity implements Injectable
         mMenuButton = findViewById(R.id.menu_button);
         mMenuButton = findViewById(R.id.menu_button);
         mSearchText = findViewById(R.id.search_text);
         mSearchText = findViewById(R.id.search_text);
         mSwitchAccountButton = findViewById(R.id.switch_account_button);
         mSwitchAccountButton = findViewById(R.id.switch_account_button);
+        mNotificationButton = findViewById(R.id.notification_button);
 
 
         if (showSortListButtonGroup) {
         if (showSortListButtonGroup) {
             findViewById(R.id.sort_list_button_group).setVisibility(View.VISIBLE);
             findViewById(R.id.sort_list_button_group).setVisibility(View.VISIBLE);

+ 13 - 0
app/src/main/res/drawable/ic_arrow_back_foreground.xml

@@ -0,0 +1,13 @@
+<!--
+  ~ Nextcloud - Android Client
+  ~
+  ~ SPDX-FileCopyrightText: 2018-2024 Google LLC
+  ~ SPDX-License-Identifier: Apache-2.0
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="24dp"
+    android:width="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+    <path android:fillColor="@color/foreground_highlight" android:pathData="M20,11V13H8L13.5,18.5L12.08,19.92L4.16,12L12.08,4.08L13.5,5.5L8,11H20Z" />
+</vector>

+ 0 - 16
app/src/main/res/drawable/nav_notifications.xml

@@ -1,16 +0,0 @@
-<!--
-  ~ Nextcloud - Android Client
-  ~
-  ~ SPDX-FileCopyrightText: 2018-2024 Google LLC
-  ~ SPDX-License-Identifier: Apache-2.0
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="24dp"
-    android:height="24dp"
-    android:tint="#757575"
-    android:viewportWidth="960"
-    android:viewportHeight="960">
-    <path
-        android:fillColor="@android:color/white"
-        android:pathData="M160,760L160,680L240,680L240,400Q240,317 290,252.5Q340,188 420,168L420,140Q420,115 437.5,97.5Q455,80 480,80Q505,80 522.5,97.5Q540,115 540,140L540,168Q620,188 670,252.5Q720,317 720,400L720,680L800,680L800,760L160,760ZM480,880Q447,880 423.5,856.5Q400,833 400,800L560,800Q560,833 536.5,856.5Q513,880 480,880Z" />
-</vector>

+ 53 - 67
app/src/main/res/layout/notifications_layout.xml

@@ -6,93 +6,79 @@
   ~ SPDX-FileCopyrightText: 2017 Mario Danic <mario@lovelyhq.com>
   ~ SPDX-FileCopyrightText: 2017 Mario Danic <mario@lovelyhq.com>
   ~ SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only
   ~ SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only
 -->
 -->
-<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.coordinatorlayout.widget.CoordinatorLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     xmlns:tools="http://schemas.android.com/tools"
-    android:id="@+id/drawer_layout"
     android:layout_width="match_parent"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:clickable="true"
-    android:fitsSystemWindows="true"
-    android:focusable="true">
+    android:layout_height="match_parent">
 
 
-    <androidx.coordinatorlayout.widget.CoordinatorLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent">
+    <include layout="@layout/toolbar_back_button" />
 
 
-        <include layout="@layout/toolbar_standard" />
+    <FrameLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_marginTop="@dimen/action_bar_margin_top"
+        android:layout_below="@id/appbar"
+        app:layout_behavior="@string/appbar_scrolling_view_behavior">
 
 
-        <FrameLayout
+        <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+            android:id="@+id/swipe_containing_list"
             android:layout_width="match_parent"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:layout_height="match_parent"
-            android:layout_below="@id/appbar"
-            app:layout_behavior="@string/appbar_scrolling_view_behavior">
+            android:footerDividersEnabled="false"
+            android:visibility="visible">
 
 
-            <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
-                android:id="@+id/swipe_containing_list"
+            <androidx.recyclerview.widget.RecyclerView
+                android:id="@android:id/list"
                 android:layout_width="match_parent"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
                 android:layout_height="match_parent"
-                android:footerDividersEnabled="false"
-                android:visibility="visible">
+                android:layout_marginLeft="-3dp"
+                android:layout_marginRight="-3dp"
+                android:layout_marginBottom="-3dp"
+                android:background="@color/bg_default"
+                android:clipToPadding="false"
+                android:scrollbarStyle="outsideOverlay"
+                android:scrollbars="vertical"
+                android:visibility="visible"
+                tools:listitem="@layout/notification_list_item" />
+
+        </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
+
+        <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+            android:id="@+id/swipe_containing_empty"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:footerDividersEnabled="false"
+            android:visibility="visible">
 
 
-                <androidx.recyclerview.widget.RecyclerView
-                    android:id="@android:id/list"
-                    android:layout_width="match_parent"
-                    android:layout_height="match_parent"
-                    android:layout_marginLeft="-3dp"
-                    android:layout_marginRight="-3dp"
-                    android:layout_marginBottom="-3dp"
-                    android:background="@color/bg_default"
-                    android:clipToPadding="false"
-                    android:scrollbarStyle="outsideOverlay"
-                    android:scrollbars="vertical"
-                    android:visibility="visible"
-                    tools:listitem="@layout/notification_list_item" />
-
-            </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
-
-            <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
-                android:id="@+id/swipe_containing_empty"
+            <FrameLayout
                 android:layout_width="match_parent"
                 android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:footerDividersEnabled="false"
-                android:visibility="visible">
+                android:layout_height="match_parent">
 
 
-                <FrameLayout
+                <LinearLayout
+                    android:id="@+id/loading_content"
                     android:layout_width="match_parent"
                     android:layout_width="match_parent"
-                    android:layout_height="match_parent">
-
-                    <LinearLayout
-                        android:id="@+id/loading_content"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:orientation="vertical"
-                        android:visibility="visible">
-
-                        <include layout="@layout/activity_list_item_shimmer" />
+                    android:layout_height="wrap_content"
+                    android:orientation="vertical"
+                    android:visibility="visible">
 
 
-                        <include layout="@layout/activity_list_item_shimmer" />
+                    <include layout="@layout/activity_list_item_shimmer" />
 
 
-                        <include layout="@layout/activity_list_item_shimmer" />
+                    <include layout="@layout/activity_list_item_shimmer" />
 
 
-                        <include layout="@layout/activity_list_item_shimmer" />
+                    <include layout="@layout/activity_list_item_shimmer" />
 
 
-                    </LinearLayout>
+                    <include layout="@layout/activity_list_item_shimmer" />
 
 
-                    <include
-                        android:id="@+id/empty_list"
-                        layout="@layout/empty_list" />
+                </LinearLayout>
 
 
-                </FrameLayout>
-            </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
+                <include
+                    android:id="@+id/empty_list"
+                    layout="@layout/empty_list" />
 
 
-        </FrameLayout>
-    </androidx.coordinatorlayout.widget.CoordinatorLayout>
-
-    <include
-        layout="@layout/drawer"
-        android:layout_width="@dimen/drawer_width"
-        android:layout_height="match_parent"
-        android:layout_gravity="start" />
+            </FrameLayout>
+        </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
 
 
-</androidx.drawerlayout.widget.DrawerLayout>
+    </FrameLayout>
+</androidx.coordinatorlayout.widget.CoordinatorLayout>

+ 14 - 0
app/src/main/res/layout/toolbar_back_button.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Nextcloud - Android Client
+  ~
+  ~ SPDX-FileCopyrightText: 2024 Alper Ozturk <alper.ozturk@nextcloud.com>
+  ~ SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only
+-->
+<androidx.appcompat.widget.Toolbar
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/toolbar_back_button"
+    android:layout_width="match_parent"
+    android:layout_height="?attr/actionBarSize"
+    app:popupTheme="@style/Theme.AppCompat.DayNight.NoActionBar" />

+ 15 - 1
app/src/main/res/layout/toolbar_standard.xml

@@ -197,10 +197,24 @@
                     android:textSize="16sp"
                     android:textSize="16sp"
                     app:layout_constraintBottom_toBottomOf="parent"
                     app:layout_constraintBottom_toBottomOf="parent"
                     app:layout_constraintLeft_toRightOf="@id/menu_button"
                     app:layout_constraintLeft_toRightOf="@id/menu_button"
-                    app:layout_constraintRight_toLeftOf="@id/switch_account_button"
+                    app:layout_constraintRight_toLeftOf="@id/notification_button"
                     app:layout_constraintTop_toTopOf="parent"
                     app:layout_constraintTop_toTopOf="parent"
                     tools:text="Search in Nextcloud" />
                     tools:text="Search in Nextcloud" />
 
 
+                <com.google.android.material.button.MaterialButton
+                    android:id="@+id/notification_button"
+                    style="@style/Widget.AppTheme.Button.IconButton"
+                    android:layout_width="48dp"
+                    android:layout_height="48dp"
+                    android:contentDescription="@string/notification_icon_description"
+                    app:cornerRadius="@dimen/button_corner_radius"
+                    app:iconSize="20dp"
+                    app:icon="@drawable/ic_notification"
+                    app:iconTint="@color/fontAppbar"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toStartOf="@id/switch_account_button"
+                    app:layout_constraintTop_toTopOf="parent" />
+
                 <com.google.android.material.button.MaterialButton
                 <com.google.android.material.button.MaterialButton
                     android:id="@+id/switch_account_button"
                     android:id="@+id/switch_account_button"
                     style="@style/Widget.AppTheme.Button.IconButton"
                     style="@style/Widget.AppTheme.Button.IconButton"

+ 0 - 6
app/src/main/res/menu/partial_drawer_entries.xml

@@ -64,12 +64,6 @@
             android:orderInCategory="0"
             android:orderInCategory="0"
             android:title="@string/drawer_item_recently_modified"
             android:title="@string/drawer_item_recently_modified"
             android:visible="true"/>
             android:visible="true"/>
-        <item
-            android:orderInCategory="0"
-            android:id="@+id/nav_notifications"
-            android:icon="@drawable/nav_notifications"
-            android:title="@string/drawer_item_notifications"/>
-
         <item
         <item
             android:id="@+id/nav_assistant"
             android:id="@+id/nav_assistant"
             android:icon="@drawable/ic_assistant"
             android:icon="@drawable/ic_assistant"

+ 1 - 0
app/src/main/res/values/dims.xml

@@ -14,6 +14,7 @@
     <dimen name="nav_drawer_header_height">164dp</dimen>
     <dimen name="nav_drawer_header_height">164dp</dimen>
     <dimen name="nav_drawer_menu_avatar_radius">12sp</dimen>
     <dimen name="nav_drawer_menu_avatar_radius">12sp</dimen>
     <dimen name="list_item_avatar_icon_radius">20dp</dimen>
     <dimen name="list_item_avatar_icon_radius">20dp</dimen>
+    <dimen name="action_bar_margin_top">64dp</dimen>
     <dimen name="bottom_sheet_text_start_margin">40dp</dimen>
     <dimen name="bottom_sheet_text_start_margin">40dp</dimen>
     <dimen name="bottom_sheet_item_height">56dp</dimen>
     <dimen name="bottom_sheet_item_height">56dp</dimen>
     <dimen name="bottom_sheet_menu_item_divider_standard_margin">80dp</dimen>
     <dimen name="bottom_sheet_menu_item_divider_standard_margin">80dp</dimen>

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

@@ -1242,4 +1242,5 @@
     <string name="file_name_validator_error_forbidden_space_character_extensions">Filenames must not contain spaces at the beginning or end</string>
     <string name="file_name_validator_error_forbidden_space_character_extensions">Filenames must not contain spaces at the beginning or end</string>
     <string name="sync">Sync</string>
     <string name="sync">Sync</string>
     <string name="please_select_a_server">Please select a server…</string>
     <string name="please_select_a_server">Please select a server…</string>
+    <string name="notification_icon_description">Unread notifications exist</string>
 </resources>
 </resources>