Browse Source

Merge pull request #6067 from nextcloud/newDesign-home-appbar

New design (UI) - Home Appbar
Tobias Kaminsky 5 years ago
parent
commit
4a39f3970d
39 changed files with 355 additions and 262 deletions
  1. 1 1
      scripts/analysis/lint-results.txt
  2. 25 45
      src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java
  3. 1 4
      src/main/java/com/owncloud/android/ui/activities/ActivitiesActivity.java
  4. 2 2
      src/main/java/com/owncloud/android/ui/activity/CommunityActivity.java
  5. 28 25
      src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java
  6. 1 0
      src/main/java/com/owncloud/android/ui/activity/FileActivity.java
  7. 30 30
      src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java
  8. 1 4
      src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.java
  9. 4 2
      src/main/java/com/owncloud/android/ui/activity/ManageSpaceActivity.java
  10. 2 1
      src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java
  11. 1 9
      src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.java
  12. 83 22
      src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.java
  13. 2 5
      src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java
  14. 4 12
      src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java
  15. 1 0
      src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java
  16. 9 14
      src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java
  17. 3 0
      src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.java
  18. 1 1
      src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.java
  19. 7 3
      src/main/java/com/owncloud/android/utils/ThemeUtils.java
  20. 11 0
      src/main/res/animator/appbar_elevation_off.xml
  21. 11 0
      src/main/res/animator/appbar_elevation_on.xml
  22. 9 0
      src/main/res/drawable/ic_menu.xml
  23. 6 7
      src/main/res/layout/accounts_layout.xml
  24. 2 4
      src/main/res/layout/activity_list_layout.xml
  25. 1 2
      src/main/res/layout/community_layout.xml
  26. 3 5
      src/main/res/layout/contacts_preference.xml
  27. 2 3
      src/main/res/layout/externalsite_webview.xml
  28. 6 7
      src/main/res/layout/files_folder_picker.xml
  29. 2 3
      src/main/res/layout/files_picker.xml
  30. 2 4
      src/main/res/layout/notifications_layout.xml
  31. 1 11
      src/main/res/layout/synced_folders_layout.xml
  32. 67 2
      src/main/res/layout/toolbar_standard.xml
  33. 10 13
      src/main/res/layout/toolbar_user_information.xml
  34. 2 4
      src/main/res/layout/trashbin_activity.xml
  35. 3 4
      src/main/res/layout/upload_files_layout.xml
  36. 2 4
      src/main/res/layout/upload_list_layout.xml
  37. 6 6
      src/main/res/layout/uploader_layout.xml
  38. 2 3
      src/main/res/layout/user_info_layout.xml
  39. 1 0
      src/main/res/values/strings.xml

+ 1 - 1
scripts/analysis/lint-results.txt

@@ -1,2 +1,2 @@
 DO NOT TOUCH; GENERATED BY DRONE
-      <span class="mdl-layout-title">Lint Report: 94 warnings</span>
+      <span class="mdl-layout-title">Lint Report: 95 warnings</span>

+ 25 - 45
src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java

@@ -45,6 +45,7 @@ import android.view.MenuItem;
 import android.view.WindowManager;
 import android.widget.ImageView;
 
+import com.google.android.material.button.MaterialButton;
 import com.nextcloud.client.network.ConnectivityService;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
@@ -1040,51 +1041,28 @@ public final class ThumbnailsCacheManager {
     }
 
     public static boolean cancelPotentialAvatarWork(Object file, Object callContext) {
-        if (callContext instanceof ImageView) {
-            return cancelPotentialAvatarWork(file, (ImageView) callContext);
-        } else if (callContext instanceof MenuItem) {
-            return cancelPotentialAvatarWork(file, (MenuItem)callContext);
-        }
-
-        return false;
-    }
-
-    public static boolean cancelPotentialAvatarWork(Object file, ImageView imageView) {
-        final AvatarGenerationTask avatarWorkerTask = getAvatarWorkerTask(imageView);
-
-        if (avatarWorkerTask != null) {
-            final Object usernameData = avatarWorkerTask.mUserId;
-            // If usernameData is not yet set or it differs from the new data
-            if (usernameData == null || !usernameData.equals(file)) {
-                // Cancel previous task
-                avatarWorkerTask.cancel(true);
-                Log_OC.v(TAG, "Cancelled generation of avatar for a reused imageView");
-            } else {
-                // The same work is already in progress
-                return false;
-            }
-        }
-        // No task associated with the ImageView, or an existing task was cancelled
-        return true;
-    }
-
-    public static boolean cancelPotentialAvatarWork(Object file, MenuItem menuItem) {
-        final AvatarGenerationTask avatarWorkerTask = getAvatarWorkerTask(menuItem);
-
-        if (avatarWorkerTask != null) {
-            final Object usernameData = avatarWorkerTask.mUserId;
-            // If usernameData is not yet set or it differs from the new data
-            if (usernameData == null || !usernameData.equals(file)) {
-                // Cancel previous task
-                avatarWorkerTask.cancel(true);
-                Log_OC.v(TAG, "Cancelled generation of avatar for a reused imageView");
-            } else {
-                // The same work is already in progress
-                return false;
+        if (callContext instanceof ImageView ||
+            callContext instanceof MenuItem ||
+            callContext instanceof MaterialButton) {
+
+            AvatarGenerationTask avatarWorkerTask = getAvatarWorkerTask(callContext);
+            if (avatarWorkerTask != null) {
+                final Object usernameData = avatarWorkerTask.mUserId;
+                // If usernameData is not yet set or it differs from the new data
+                if (usernameData == null || !usernameData.equals(file)) {
+                    // Cancel previous task
+                    avatarWorkerTask.cancel(true);
+                    Log_OC.v(TAG, "Cancelled generation of avatar for a reused imageView");
+                } else {
+                    // The same work is already in progress
+                    return false;
+                }
             }
+            // No task associated with the ImageView, or an existing task was cancelled
+            return true;
+        } else {
+            return false;
         }
-        // No task associated with the ImageView, or an existing task was cancelled
-        return true;
     }
 
     public static ThumbnailGenerationTask getBitmapWorkerTask(ImageView imageView) {
@@ -1155,9 +1133,11 @@ public final class ThumbnailsCacheManager {
 
     public static AvatarGenerationTask getAvatarWorkerTask(Object callContext) {
         if (callContext instanceof ImageView) {
-            return getAvatarWorkerTask(((ImageView)callContext).getDrawable());
+            return getAvatarWorkerTask(((ImageView) callContext).getDrawable());
         } else if (callContext instanceof MenuItem) {
-            return getAvatarWorkerTask(((MenuItem)callContext).getIcon());
+            return getAvatarWorkerTask(((MenuItem) callContext).getIcon());
+        } else if (callContext instanceof MaterialButton) {
+            return getAvatarWorkerTask(((MaterialButton) callContext).getIcon());
         }
 
         return null;

+ 1 - 4
src/main/java/com/owncloud/android/ui/activities/ActivitiesActivity.java

@@ -120,10 +120,7 @@ public class ActivitiesActivity extends FileActivity implements ActivityListInte
 
         // setup drawer
         setupDrawer(R.id.nav_activity);
-        ActionBar actionBar = getSupportActionBar();
-        if (actionBar != null) {
-            ThemeUtils.setColoredTitle(actionBar, getString(R.string.drawer_item_activities), this);
-        }
+        updateActionBarTitleAndHomeButtonByString(getString(R.string.drawer_item_activities));
 
         swipeListRefreshLayout.setOnRefreshListener(() -> {
             // We set lastGiven variable to undefined here since when manually refreshing

+ 2 - 2
src/main/java/com/owncloud/android/ui/activity/CommunityActivity.java

@@ -48,11 +48,11 @@ public class CommunityActivity extends FileActivity {
         // setup toolbar
         setupToolbar();
 
+        updateActionBarTitleAndHomeButtonByString(getString(R.string.drawer_community));
+
         // setup drawer
         setupDrawer(R.id.nav_community);
 
-        ThemeUtils.setColoredTitle(getSupportActionBar(), R.string.drawer_community, this);
-
         setupContent();
     }
 

+ 28 - 25
src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java

@@ -53,6 +53,7 @@ import android.widget.TextView;
 import com.bumptech.glide.Glide;
 import com.bumptech.glide.request.animation.GlideAnimation;
 import com.bumptech.glide.request.target.SimpleTarget;
+import com.google.android.material.button.MaterialButton;
 import com.google.android.material.navigation.NavigationView;
 import com.nextcloud.client.account.User;
 import com.nextcloud.client.di.Injectable;
@@ -405,26 +406,18 @@ public abstract class DrawerActivity extends ToolbarActivity
 
         switch (menuItem.getItemId()) {
             case R.id.nav_all_files:
-                if (this instanceof FileDisplayActivity) {
-                    if (((FileDisplayActivity) this).getListOfFilesFragment() instanceof PhotoFragment) {
-                        Intent intent = new Intent(getApplicationContext(), FileDisplayActivity.class);
-                        intent.putExtra(FileDisplayActivity.DRAWER_MENU_ID, menuItem.getItemId());
-                        intent.setAction(FileDisplayActivity.ALL_FILES);
-                        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
-                        startActivity(intent);
-                    } else {
-                        ((FileDisplayActivity) this).browseToRoot();
-                        showFiles(false);
-                        EventBus.getDefault().post(new ChangeMenuEvent());
-                    }
+                showFiles(false);
+                if ((this instanceof FileDisplayActivity) &&
+                    !(((FileDisplayActivity) this).getListOfFilesFragment() instanceof PhotoFragment)) {
+                    ((FileDisplayActivity) this).browseToRoot();
+                    EventBus.getDefault().post(new ChangeMenuEvent());
                 } else {
-                    showFiles(false);
                     Intent intent = new Intent(getApplicationContext(), FileDisplayActivity.class);
-                    intent.putExtra(FileDisplayActivity.DRAWER_MENU_ID, menuItem.getItemId());
                     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+                    intent.setAction(FileDisplayActivity.ALL_FILES);
+                    intent.putExtra(FileDisplayActivity.DRAWER_MENU_ID, menuItem.getItemId());
                     startActivity(intent);
                 }
-
                 break;
             case R.id.nav_favorites:
                 handleSearchEvents(new SearchEvent("", SearchRemoteOperation.SearchType.FAVORITE_SEARCH),
@@ -515,8 +508,7 @@ public abstract class DrawerActivity extends ToolbarActivity
                 break;
 
             case R.id.drawer_menu_account_manage:
-                Intent manageAccountsIntent = new Intent(getApplicationContext(), ManageAccountsActivity.class);
-                startActivityForResult(manageAccountsIntent, ACTION_MANAGE_ACCOUNTS);
+                openManageAccounts();
                 break;
 
             default:
@@ -525,6 +517,11 @@ public abstract class DrawerActivity extends ToolbarActivity
         }
     }
 
+    public void openManageAccounts() {
+        Intent manageAccountsIntent = new Intent(getApplicationContext(), ManageAccountsActivity.class);
+        startActivityForResult(manageAccountsIntent, ACTION_MANAGE_ACCOUNTS);
+    }
+
     private void startPhotoSearch(MenuItem menuItem) {
         SearchEvent searchEvent = new SearchEvent("image/%", SearchRemoteOperation.SearchType.PHOTO_SEARCH);
 
@@ -1367,22 +1364,28 @@ public abstract class DrawerActivity extends ToolbarActivity
     @Override
     public void avatarGenerated(Drawable avatarDrawable, Object callContext) {
         if (callContext instanceof MenuItem) {
-            MenuItem mi = (MenuItem) callContext;
-            mi.setIcon(avatarDrawable);
+            MenuItem menuItem = (MenuItem) callContext;
+            menuItem.setIcon(avatarDrawable);
         } else if (callContext instanceof ImageView) {
-            ImageView iv = (ImageView) callContext;
-            iv.setImageDrawable(avatarDrawable);
+            ImageView imageView = (ImageView) callContext;
+            imageView.setImageDrawable(avatarDrawable);
+        } else if (callContext instanceof MaterialButton) {
+            MaterialButton materialButton = (MaterialButton) callContext;
+            materialButton.setIcon(avatarDrawable);
         }
     }
 
     @Override
     public boolean shouldCallGeneratedCallback(String tag, Object callContext) {
         if (callContext instanceof MenuItem) {
-            MenuItem mi = (MenuItem) callContext;
-            return String.valueOf(mi.getTitle()).equals(tag);
+            MenuItem menuItem = (MenuItem) callContext;
+            return String.valueOf(menuItem.getTitle()).equals(tag);
         } else if (callContext instanceof ImageView) {
-            ImageView iv = (ImageView) callContext;
-            return String.valueOf(iv.getTag()).equals(tag);
+            ImageView imageView = (ImageView) callContext;
+            return String.valueOf(imageView.getTag()).equals(tag);
+        } else if (callContext instanceof MaterialButton) {
+            MaterialButton materialButton = (MaterialButton) callContext;
+            return String.valueOf(materialButton.getTag()).equals(tag);
         }
         return false;
     }

+ 1 - 0
src/main/java/com/owncloud/android/ui/activity/FileActivity.java

@@ -158,6 +158,7 @@ public abstract class FileActivity extends DrawerActivity
     public void showFiles(boolean onDeviceOnly) {
         // must be specialized in subclasses
         MainApp.showOnlyFilesOnDevice(onDeviceOnly);
+        setupToolbar(!onDeviceOnly);
     }
 
     /**

+ 30 - 30
src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java

@@ -258,22 +258,20 @@ public class FileDisplayActivity extends FileActivity
         setContentView(R.layout.files);
 
         // setup toolbar
-        setupToolbar();
+        setupToolbar(true);
 
-        // setup drawer
-        if (MainApp.isOnlyOnDevice()) {
-            setupDrawer(R.id.nav_on_device);
-        } else {
-            setupDrawer(R.id.nav_all_files);
-        }
+        mMenuButton.setOnClickListener(v -> {
+            openDrawer();
+        });
+
+        mSwitchAccountButton.setOnClickListener(v -> {
+            openManageAccounts();
+        });
 
         mDualPane = getResources().getBoolean(R.bool.large_land_layout);
         mLeftFragmentContainer = findViewById(R.id.left_fragment_container);
         mRightFragmentContainer = findViewById(R.id.right_fragment_container);
 
-        // Action bar setup
-        getSupportActionBar().setHomeButtonEnabled(true);
-
         // Init Fragment without UI to retain AsyncTask across configuration changes
         FragmentManager fm = getSupportFragmentManager();
         TaskRetainerFragment taskRetainerFragment =
@@ -503,7 +501,7 @@ public class FileDisplayActivity extends FileActivity
     @Override
     protected void onNewIntent(Intent intent) {
         super.onNewIntent(intent);
-
+        setIntent(intent);
 
         if (ACTION_DETAILS.equalsIgnoreCase(intent.getAction())) {
             OCFile file = intent.getParcelableExtra(EXTRA_FILE);
@@ -697,7 +695,6 @@ public class FileDisplayActivity extends FileActivity
         OCFileListFragment fileListFragment = getListOfFilesFragment();
         if (fileListFragment != null) {
             fileListFragment.listDirectory(MainApp.isOnlyOnDevice(), fromSearch);
-            setupToolbar();
         }
     }
 
@@ -778,8 +775,12 @@ public class FileDisplayActivity extends FileActivity
 
         menu.findItem(R.id.action_select_all).setVisible(false);
         MenuItem searchMenuItem = menu.findItem(R.id.action_search);
-        searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_search));
+        searchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem);
         searchMenuItem.setVisible(false);
+        mSearchText.setOnClickListener(v -> {
+            showSearchView();
+            searchView.setIconified(false);
+        });
 
         ThemeUtils.themeSearchView(searchView, this);
 
@@ -788,7 +789,7 @@ public class FileDisplayActivity extends FileActivity
         mDrawerMenuItemstoShowHideList.add(menu.findItem(R.id.action_sort));
         mDrawerMenuItemstoShowHideList.add(menu.findItem(R.id.action_sync_account));
         mDrawerMenuItemstoShowHideList.add(menu.findItem(R.id.action_switch_view));
-        mDrawerMenuItemstoShowHideList.add(menu.findItem(R.id.action_search));
+        mDrawerMenuItemstoShowHideList.add(searchMenuItem);
 
         //focus the SearchView
         if (!TextUtils.isEmpty(searchQuery)) {
@@ -1148,6 +1149,8 @@ public class FileDisplayActivity extends FileActivity
             // Remove the list to the original state
             listOfFiles.performSearch("", true);
 
+            hideSearchView(getCurrentDir());
+
             setDrawerIndicatorEnabled(isDrawerIndicatorAvailable());
         } else if (isDrawerOpen) {
             // close drawer first
@@ -1248,10 +1251,17 @@ public class FileDisplayActivity extends FileActivity
         if (menuItemId == -1) {
             if (MainApp.isOnlyOnDevice()) {
                 setDrawerMenuItemChecked(R.id.nav_on_device);
+                setupToolbar(false);
             } else {
                 setDrawerMenuItemChecked(R.id.nav_all_files);
+                setupToolbar(true);
             }
         } else {
+            if (menuItemId == R.id.nav_all_files) {
+                setupToolbar(true);
+            } else {
+                setupToolbar(false);
+            }
             setDrawerMenuItemChecked(menuItemId);
         }
 
@@ -2474,26 +2484,11 @@ public class FileDisplayActivity extends FileActivity
         return getListOfFilesFragment().isGridEnabled();
     }
 
-    public void allFilesOption() {
-        browseToRoot();
-    }
-
-    public void setActionBarTitle(@StringRes final int title) {
-        runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                if (getSupportActionBar() != null) {
-                    ThemeUtils.setColoredTitle(getSupportActionBar(), title, getBaseContext());
-                }
-            }
-        });
-    }
-
     @Override
     public void showFiles(boolean onDeviceOnly) {
         super.showFiles(onDeviceOnly);
         if (onDeviceOnly) {
-            setActionBarTitle(R.string.drawer_item_on_device);
+            updateActionBarTitleAndHomeButtonByString(getString(R.string.drawer_item_on_device));
         }
         getListOfFilesFragment().refreshDirectory();
     }
@@ -2582,6 +2577,11 @@ public class FileDisplayActivity extends FileActivity
             setAccountInDrawer(user);
             setupDrawer();
 
+            mSwitchAccountButton.setTag(user.getAccountName());
+            DisplayUtils.setAvatar(user, this, getResources()
+                                       .getDimension(R.dimen.nav_drawer_menu_avatar_radius), getResources(),
+                                   mSwitchAccountButton, this);
+
             final String lastDisplayedAccountName = mLastDisplayedAccount != null ? mLastDisplayedAccount.name : null;
             final boolean accountChanged = !user.getAccountName().equals(lastDisplayedAccountName);
             if (accountChanged) {

+ 1 - 4
src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.java

@@ -147,10 +147,7 @@ public class FolderPickerActivity extends FileActivity implements FileFragment.C
             createFragments();
         }
 
-        if (getSupportActionBar() != null) {
-            getSupportActionBar().setDisplayShowTitleEnabled(true);
-            ThemeUtils.setColoredTitle(getSupportActionBar(), caption, this);
-        }
+        updateActionBarTitleAndHomeButtonByString(caption);
 
         // always AFTER setContentView(...) ; to work around bug in its implementation
 

+ 4 - 2
src/main/java/com/owncloud/android/ui/activity/ManageSpaceActivity.java

@@ -53,8 +53,10 @@ public class ManageSpaceActivity extends AppCompatActivity implements Injectable
         setContentView(R.layout.activity_manage_space);
 
         ActionBar actionBar = getSupportActionBar();
-        actionBar.setDisplayHomeAsUpEnabled(true);
-        actionBar.setTitle(R.string.manage_space_title);
+        if (actionBar != null) {
+            actionBar.setDisplayHomeAsUpEnabled(true);
+            actionBar.setTitle(R.string.manage_space_title);
+        }
 
         TextView descriptionTextView = findViewById(R.id.general_description);
         descriptionTextView.setText(getString(R.string.manage_space_description, getString(R.string.app_name)));

+ 2 - 1
src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java

@@ -138,6 +138,8 @@ public class NotificationsActivity extends FileActivity implements Notifications
         // setup toolbar
         setupToolbar();
 
+        updateActionBarTitleAndHomeButtonByString(getString(R.string.drawer_item_notifications));
+
         swipeEmptyListRefreshLayout = findViewById(R.id.swipe_containing_empty);
         swipeListRefreshLayout = findViewById(R.id.swipe_containing_list);
         ThemeUtils.colorSwipeRefreshLayout(this, swipeListRefreshLayout);
@@ -145,7 +147,6 @@ public class NotificationsActivity extends FileActivity implements Notifications
 
         // setup drawer
         setupDrawer(R.id.nav_notifications);
-        ThemeUtils.setColoredTitle(getSupportActionBar(), getString(R.string.drawer_item_notifications), this);
 
         if (!optionalUser.isPresent()) {
             // show error

+ 1 - 9
src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.java

@@ -177,9 +177,7 @@ public class SyncedFoldersActivity extends FileActivity implements SyncedFolderA
 
         // setup toolbar
         setupToolbar();
-        if (getSupportActionBar() != null){
-            getSupportActionBar().setTitle(R.string.drawer_synced_folders);
-        }
+        updateActionBarTitleAndHomeButtonByString(getString(R.string.drawer_synced_folders));
 
         // setup drawer
         setupDrawer(R.id.nav_synced_folders);
@@ -191,12 +189,6 @@ public class SyncedFoldersActivity extends FileActivity implements SyncedFolderA
 
         setupContent();
 
-        ActionBar actionBar = getSupportActionBar();
-        if (actionBar != null) {
-            ThemeUtils.setColoredTitle(getSupportActionBar(), getString(R.string.drawer_synced_folders), this);
-            actionBar.setDisplayHomeAsUpEnabled(true);
-        }
-
         if (ThemeUtils.themingEnabled(this)) {
             setTheme(R.style.FallbackThemingTheme);
         }

+ 83 - 22
src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.java

@@ -22,16 +22,23 @@
 
 package com.owncloud.android.ui.activity;
 
+import android.animation.AnimatorInflater;
+import android.annotation.SuppressLint;
 import android.graphics.Bitmap;
-import android.graphics.PorterDuff;
 import android.graphics.drawable.Drawable;
+import android.os.Build;
 import android.os.Bundle;
 import android.view.View;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
 import android.widget.TextView;
 
+import com.google.android.material.appbar.AppBarLayout;
+import com.google.android.material.button.MaterialButton;
+import com.google.android.material.card.MaterialCardView;
+import com.google.android.material.textview.MaterialTextView;
 import com.owncloud.android.R;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
@@ -40,15 +47,25 @@ import com.owncloud.android.utils.ThemeUtils;
 import androidx.annotation.StringRes;
 import androidx.appcompat.app.ActionBar;
 import androidx.appcompat.widget.Toolbar;
+import androidx.core.content.ContextCompat;
+import androidx.core.view.ViewCompat;
 
 /**
- * Base class providing toolbar registration functionality, see {@link #setupToolbar()}.
+ * Base class providing toolbar registration functionality, see {@link #setupToolbar(boolean)}.
  */
 public abstract class ToolbarActivity extends BaseActivity {
+    protected MaterialButton mMenuButton;
+    protected MaterialTextView mSearchText;
+    protected MaterialButton mSwitchAccountButton;
+
+    private AppBarLayout mAppBar;
+    private RelativeLayout mDefaultToolbar;
+    private MaterialCardView mHomeSearchToolbar;
     private ImageView mPreviewImage;
     private FrameLayout mPreviewImageContainer;
     private LinearLayout mInfoBox;
     private TextView mInfoBoxMessage;
+    private boolean isHomeSearchToolbarShow = false;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -56,15 +73,25 @@ public abstract class ToolbarActivity extends BaseActivity {
     }
 
     /**
-     * Toolbar setup that must be called in implementer's {@link #onCreate} after {@link #setContentView} if they
-     * want to use the toolbar.
+     * Toolbar setup that must be called in implementer's {@link #onCreate} after {@link #setContentView} if they want
+     * to use the toolbar.
      */
-    protected void setupToolbar(boolean useBackgroundImage) {
-        int primaryColor = ThemeUtils.primaryAppbarColor(this);
+    protected void setupToolbar(boolean isHomeSearchToolbarShow) {
         int fontColor = ThemeUtils.appBarPrimaryFontColor(this);
 
         Toolbar toolbar = findViewById(R.id.toolbar);
         setSupportActionBar(toolbar);
+        ThemeUtils.colorStatusBar(this);
+
+        mAppBar = findViewById(R.id.appbar);
+        mDefaultToolbar = findViewById(R.id.default_toolbar);
+        mHomeSearchToolbar = findViewById(R.id.home_toolbar);
+        mMenuButton = findViewById(R.id.menu_button);
+        mSearchText = findViewById(R.id.search_text);
+        mSwitchAccountButton = findViewById(R.id.switch_account_button);
+
+        this.isHomeSearchToolbarShow = isHomeSearchToolbarShow;
+        updateActionBarTitleAndHomeButton(null);
 
         mInfoBox = findViewById(R.id.info_box);
         mInfoBoxMessage = findViewById(R.id.info_box_message);
@@ -72,8 +99,6 @@ public abstract class ToolbarActivity extends BaseActivity {
         mPreviewImage = findViewById(R.id.preview_image);
         mPreviewImageContainer = findViewById(R.id.preview_image_frame);
 
-        ThemeUtils.colorStatusBar(this);
-
         if (toolbar.getOverflowIcon() != null) {
             ThemeUtils.tintDrawable(toolbar.getOverflowIcon(), fontColor);
         }
@@ -81,10 +106,6 @@ public abstract class ToolbarActivity extends BaseActivity {
         if (toolbar.getNavigationIcon() != null) {
             ThemeUtils.tintDrawable(toolbar.getNavigationIcon(), fontColor);
         }
-
-        if (!useBackgroundImage) {
-            toolbar.setBackgroundColor(primaryColor);
-        }
     }
 
     public void setupToolbar() {
@@ -95,17 +116,57 @@ public abstract class ToolbarActivity extends BaseActivity {
      * Updates title bar and home buttons (state and icon).
      */
     protected void updateActionBarTitleAndHomeButton(OCFile chosenFile) {
-        String title = ThemeUtils.getDefaultDisplayNameForRootFolder(this);    // default
-        boolean inRoot;
-
-        // choose the appropriate title
-        inRoot =  chosenFile == null ||
-                        (chosenFile.isFolder() && chosenFile.getParentId() == FileDataStorageManager.ROOT_PARENT_ID);
-        if (!inRoot) {
-            title = chosenFile.getFileName();
-        }
+        String title;
+        boolean isRoot = isRoot(chosenFile);
 
+        title = isRoot ? ThemeUtils.getDefaultDisplayNameForRootFolder(this) : chosenFile.getFileName();
         updateActionBarTitleAndHomeButtonByString(title);
+
+        if (mAppBar != null) {
+            showHomeSearchToolbar(title, isRoot);
+        }
+    }
+
+    public void showSearchView() {
+        if (isHomeSearchToolbarShow) {
+            showHomeSearchToolbar(false);
+        }
+    }
+
+    public void hideSearchView(OCFile chosenFile) {
+        if (isHomeSearchToolbarShow) {
+            showHomeSearchToolbar(isRoot(chosenFile));
+        }
+    }
+
+    private void showHomeSearchToolbar(String title, boolean isRoot) {
+        showHomeSearchToolbar(isHomeSearchToolbarShow && isRoot);
+        mSearchText.setText(getString(R.string.appbar_search_in, title));
+    }
+
+    @SuppressLint("PrivateResource")
+    private void showHomeSearchToolbar(boolean isShow) {
+        if (isShow) {
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+                mAppBar.setStateListAnimator(AnimatorInflater.loadStateListAnimator(mAppBar.getContext(),
+                                                                                    R.animator.appbar_elevation_off));
+            } else {
+                ViewCompat.setElevation(mAppBar, 0);
+            }
+            mDefaultToolbar.setVisibility(View.GONE);
+            mHomeSearchToolbar.setVisibility(View.VISIBLE);
+            ThemeUtils.colorStatusBar(this, ContextCompat.getColor(this, R.color.bg_default));
+        } else {
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+                mAppBar.setStateListAnimator(AnimatorInflater.loadStateListAnimator(mAppBar.getContext(),
+                                                                                    R.animator.appbar_elevation_on));
+            } else {
+                ViewCompat.setElevation(mAppBar, getResources().getDimension(R.dimen.design_appbar_elevation));
+            }
+            mDefaultToolbar.setVisibility(View.VISIBLE);
+            mHomeSearchToolbar.setVisibility(View.GONE);
+            ThemeUtils.colorStatusBar(this);
+        }
     }
 
     /**
@@ -192,6 +253,6 @@ public abstract class ToolbarActivity extends BaseActivity {
      * get the toolbar's preview image view.
      */
     public ImageView getPreviewImageView() {
-            return mPreviewImage;
+        return mPreviewImage;
     }
 }

+ 2 - 5
src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java

@@ -123,14 +123,12 @@ public class UploadListActivity extends FileActivity {
         // setup toolbar
         setupToolbar();
 
+        updateActionBarTitleAndHomeButtonByString(getString(R.string.uploads_view_title));
+
         // setup drawer
         setupDrawer(R.id.nav_uploads);
 
         setupContent();
-
-        if (getSupportActionBar() != null) {
-            ThemeUtils.setColoredTitle(getSupportActionBar(), R.string.uploads_view_title, this);
-        }
     }
 
     private void setupContent() {
@@ -200,7 +198,6 @@ public class UploadListActivity extends FileActivity {
     @Override
     protected void onStart() {
         super.onStart();
-        ThemeUtils.setColoredTitle(getSupportActionBar(), R.string.uploads_view_title, this);
         final Optional<User> optionalUser = getUser();
         if (optionalUser.isPresent()) {
             setAccountInDrawer(optionalUser.get());

+ 4 - 12
src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java

@@ -142,12 +142,7 @@ public class UserInfoActivity extends FileActivity implements Injectable {
         setContentView(R.layout.user_info_layout);
         unbinder = ButterKnife.bind(this);
 
-
-        boolean useBackgroundImage = URLUtil.isValidUrl(
-                getStorageManager().getCapability(user.getAccountName()).getServerBackground());
-
-        setupToolbar(useBackgroundImage);
-
+        setupToolbar(false);
 
         // set the back button from action bar
         ActionBar actionBar = getSupportActionBar();
@@ -156,11 +151,9 @@ public class UserInfoActivity extends FileActivity implements Injectable {
         if (actionBar != null) {
             actionBar.setDisplayHomeAsUpEnabled(true);
             actionBar.setDisplayShowHomeEnabled(true);
+            actionBar.setTitle("");
         }
 
-        // set title Action bar
-        updateActionBarTitleAndHomeButtonByString("");
-
         mUserInfoList.setAdapter(new UserInfoAdapter(null, ThemeUtils.primaryColor(getAccount(), true, this)));
 
         if (userInfo != null) {
@@ -230,10 +223,9 @@ public class UserInfoActivity extends FileActivity implements Injectable {
 
     private void setHeaderImage() {
         if (getStorageManager().getCapability(user.getAccountName()).getServerBackground() != null) {
-            ViewGroup appBar = findViewById(R.id.appbar);
+            ImageView backgroundImageView = findViewById(R.id.drawer_header_background);
 
-            if (appBar != null) {
-                ImageView backgroundImageView = appBar.findViewById(R.id.drawer_header_background);
+            if (backgroundImageView != null) {
 
                 String background = getStorageManager().getCapability(user.getAccountName()).getServerBackground();
                 int primaryColor = ThemeUtils.primaryColor(getAccount(), false, this);

+ 1 - 0
src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java

@@ -551,6 +551,7 @@ public class ExtendedListFragment extends Fragment implements
             if ((activity = getActivity()) != null && activity instanceof FileDisplayActivity) {
                 FileDisplayActivity fileDisplayActivity = (FileDisplayActivity) activity;
                 fileDisplayActivity.setDrawerIndicatorEnabled(fileDisplayActivity.isDrawerIndicatorAvailable());
+                fileDisplayActivity.hideSearchView(fileDisplayActivity.getCurrentDir());
             }
         }
         if (mOnRefreshListener != null) {

+ 9 - 14
src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java

@@ -1242,21 +1242,16 @@ public class OCFileListFragment extends ExtendedListFragment implements
 
 
                 if (searchView != null && !searchView.isIconified() && !fromSearch) {
-
-                    searchView.post(new Runnable() {
-                        @Override
-                        public void run() {
-                            searchView.setQuery("", false);
-                            searchView.onActionViewCollapsed();
-                            Activity activity;
-                            if ((activity = getActivity()) != null && activity instanceof FileDisplayActivity) {
-                                FileDisplayActivity fileDisplayActivity = (FileDisplayActivity) activity;
-                                if (getCurrentFile() != null) {
-                                    fileDisplayActivity.setDrawerIndicatorEnabled(
-                                            fileDisplayActivity.isRoot(getCurrentFile()));
-                                }
+                    searchView.post(() -> {
+                        searchView.setQuery("", false);
+                        searchView.onActionViewCollapsed();
+                        Activity activity;
+                        if ((activity = getActivity()) != null && activity instanceof FileDisplayActivity) {
+                            FileDisplayActivity fileDisplayActivity = (FileDisplayActivity) activity;
+                            fileDisplayActivity.hideSearchView(fileDisplayActivity.getCurrentDir());
+                            if (getCurrentFile() != null) {
+                                fileDisplayActivity.setDrawerIndicatorEnabled(fileDisplayActivity.isRoot(getCurrentFile()));
                             }
-
                         }
                     });
                 }

+ 3 - 0
src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.java

@@ -29,6 +29,7 @@ import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.ServiceConnection;
+import android.graphics.Color;
 import android.os.Bundle;
 import android.os.IBinder;
 import android.text.TextUtils;
@@ -117,6 +118,8 @@ public class PreviewImageActivity extends FileActivity implements
         // ActionBar
         updateActionBarTitleAndHomeButton(null);
 
+        ThemeUtils.tintBackButton(actionBar, this, Color.WHITE);
+
         mFullScreenAnchorView = getWindow().getDecorView();
         // to keep our UI controls visibility in line with system bars visibility
         setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);

+ 1 - 1
src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.java

@@ -113,8 +113,8 @@ public class TrashbinActivity extends FileActivity implements
         setContentView(R.layout.trashbin_activity);
         unbinder = ButterKnife.bind(this);
         setupToolbar();
+        updateActionBarTitleAndHomeButtonByString(getString(R.string.trashbin_activity_title));
         setupDrawer(R.id.nav_trashbin);
-        ThemeUtils.setColoredTitle(getSupportActionBar(), R.string.trashbin_activity_title, this);
     }
 
     @Override

+ 7 - 3
src/main/java/com/owncloud/android/utils/ThemeUtils.java

@@ -309,12 +309,16 @@ public final class ThemeUtils {
      * @param supportActionBar
      */
     public static void tintBackButton(@Nullable ActionBar supportActionBar, Context context) {
+        tintBackButton(supportActionBar, context, ThemeUtils.appBarPrimaryFontColor(context));
+    }
+
+    public static void tintBackButton(@Nullable ActionBar supportActionBar, Context context, @ColorInt int color) {
         if (supportActionBar == null) {
             return;
         }
 
         Drawable backArrow = context.getResources().getDrawable(R.drawable.ic_arrow_back);
-        supportActionBar.setHomeAsUpIndicator(ThemeUtils.tintDrawable(backArrow, ThemeUtils.appBarPrimaryFontColor(context)));
+        supportActionBar.setHomeAsUpIndicator(ThemeUtils.tintDrawable(backArrow, color));
     }
 
     public static Spanned getColoredTitle(String title, int color) {
@@ -550,8 +554,8 @@ public final class ThemeUtils {
     /**
      * Theme search view
      *
-     * @param searchView       searchView to be changed
-     * @param context          the app's context
+     * @param searchView searchView to be changed
+     * @param context    the app's context
      */
     public static void themeSearchView(SearchView searchView, Context context) {
         // hacky as no default way is provided

+ 11 - 0
src/main/res/animator/appbar_elevation_off.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:ignore="PrivateResource">
+    <item>
+        <objectAnimator
+            android:propertyName="elevation"
+            android:valueTo="0dp"
+            android:valueType="floatType" />
+    </item>
+</selector>

+ 11 - 0
src/main/res/animator/appbar_elevation_on.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:ignore="PrivateResource">
+    <item>
+        <objectAnimator
+            android:propertyName="elevation"
+            android:valueTo="@dimen/design_appbar_elevation"
+            android:valueType="floatType" />
+    </item>
+</selector>

+ 9 - 0
src/main/res/drawable/ic_menu.xml

@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M3,18h18v-2L3,16v2zM3,13h18v-2L3,11v2zM3,6v2h18L21,6L3,6z"/>
+</vector>

+ 6 - 7
src/main/res/layout/accounts_layout.xml

@@ -26,13 +26,12 @@
 	android:layout_height="fill_parent"
 	android:orientation="vertical">
 
-	<include
-		layout="@layout/toolbar_standard"/>
+    <include layout="@layout/toolbar_standard" />
 
-	<androidx.recyclerview.widget.RecyclerView
-		android:id="@+id/account_list"
-		android:layout_width="fill_parent"
-		android:layout_height="fill_parent"
-		android:divider="@null" />
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/account_list"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
+        android:divider="@null" />
 
 </LinearLayout>

+ 2 - 4
src/main/res/layout/activity_list_layout.xml

@@ -30,14 +30,12 @@
         android:layout_height="match_parent"
         android:orientation="vertical">
 
-        <include
-            android:id="@+id/navigation_bar"
-            layout="@layout/toolbar_standard" />
+        <include layout="@layout/toolbar_standard" />
 
         <FrameLayout
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:layout_below="@+id/navigation_bar">
+            android:layout_below="@id/appbar">
 
             <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
                 android:id="@+id/swipe_containing_list"

+ 1 - 2
src/main/res/layout/community_layout.xml

@@ -32,8 +32,7 @@
         android:layout_height="match_parent"
         android:orientation="vertical">
 
-        <include
-            layout="@layout/toolbar_standard"/>
+        <include layout="@layout/toolbar_standard" />
 
         <ScrollView
             android:id="@+id/scrollView"

+ 3 - 5
src/main/res/layout/contacts_preference.xml

@@ -32,15 +32,13 @@
         android:layout_height="match_parent"
         android:orientation="vertical">
 
-        <include
-            android:id="@+id/navigation_bar"
-            layout="@layout/toolbar_standard"/>
+        <include layout="@layout/toolbar_standard" />
 
         <FrameLayout
+            android:id="@+id/frame_container"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:layout_below="@+id/navigation_bar"
-            android:id="@+id/frame_container">
+            android:layout_below="@id/appbar">
 
         </FrameLayout>
     </RelativeLayout>

+ 2 - 3
src/main/res/layout/externalsite_webview.xml

@@ -32,13 +32,12 @@
         android:layout_height="match_parent"
         android:orientation="vertical">
 
-        <include
-            layout="@layout/toolbar_standard"/>
+        <include layout="@layout/toolbar_standard" />
 
         <WebView
             android:id="@+id/webView"
             android:layout_width="match_parent"
-            android:layout_height="match_parent"/>
+            android:layout_height="match_parent" />
 
     </LinearLayout>
 

+ 6 - 7
src/main/res/layout/files_folder_picker.xml

@@ -22,14 +22,13 @@
     android:layout_height="match_parent"
     android:orientation="vertical">
 
-    <include
-        layout="@layout/toolbar_standard" />
+    <include layout="@layout/toolbar_standard" />
 
-	<FrameLayout
-		android:layout_width="match_parent"
-		android:layout_height="0dp"
-        android:layout_weight="1"
-		android:id="@+id/fragment_container" />
+    <FrameLayout
+        android:id="@+id/fragment_container"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1" />
 
 	<LinearLayout
 		android:layout_width="match_parent"

+ 2 - 3
src/main/res/layout/files_picker.xml

@@ -25,14 +25,13 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:orientation="vertical">
 
-    <include
-        layout="@layout/toolbar_standard"/>
+    <include layout="@layout/toolbar_standard" />
 
     <FrameLayout
         android:id="@+id/fragment_container"
         android:layout_width="match_parent"
         android:layout_height="0dp"
-        android:layout_weight="1"/>
+        android:layout_weight="1" />
 
     <LinearLayout
         android:layout_width="match_parent"

+ 2 - 4
src/main/res/layout/notifications_layout.xml

@@ -31,14 +31,12 @@
         android:layout_height="match_parent"
         android:orientation="vertical">
 
-        <include
-            android:id="@+id/navigation_bar"
-            layout="@layout/toolbar_standard"/>
+        <include layout="@layout/toolbar_standard" />
 
         <FrameLayout
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:layout_below="@+id/navigation_bar">
+            android:layout_below="@id/appbar">
 
             <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
                 android:id="@+id/swipe_containing_list"

+ 1 - 11
src/main/res/layout/synced_folders_layout.xml

@@ -31,17 +31,7 @@
         android:layout_width="match_parent"
         android:layout_height="match_parent">
 
-        <com.google.android.material.appbar.AppBarLayout
-            android:id="@+id/app_bar"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content">
-
-            <androidx.appcompat.widget.Toolbar
-                android:id="@+id/toolbar"
-                android:layout_width="match_parent"
-                android:layout_height="?attr/actionBarSize"
-                android:background="?attr/colorPrimary"/>
-        </com.google.android.material.appbar.AppBarLayout>
+        <include layout="@layout/toolbar_standard" />
 
         <FrameLayout
             android:id="@+id/ListLayout"

+ 67 - 2
src/main/res/layout/toolbar_standard.xml

@@ -23,11 +23,13 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:id="@+id/appbar"
     android:layout_width="match_parent"
-    android:layout_height="wrap_content"
+    android:layout_height="?attr/actionBarSize"
+    android:background="@color/bg_default"
     android:theme="@style/ThemeOverlay.MaterialComponents.Dark.ActionBar"
     tools:viewBindingIgnore="true">
 
     <RelativeLayout
+        android:id="@+id/default_toolbar"
         android:layout_width="match_parent"
         android:layout_height="wrap_content">
 
@@ -53,11 +55,74 @@
         <androidx.appcompat.widget.Toolbar
             android:id="@+id/toolbar"
             android:layout_width="match_parent"
-            android:layout_height="?attr/actionBarSize"
+            android:layout_height="wrap_content"
+            android:background="@color/appbar"
             app:popupTheme="@style/Theme.AppCompat.DayNight.NoActionBar" />
 
     </RelativeLayout>
 
+    <com.google.android.material.card.MaterialCardView
+        android:id="@+id/home_toolbar"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_marginStart="16dp"
+        android:layout_marginTop="4dp"
+        android:layout_marginEnd="16dp"
+        android:layout_marginBottom="4dp"
+        android:visibility="gone"
+        app:background="@color/appbar"
+        app:cardCornerRadius="8dp"
+        app:cardElevation="6dp"
+        app:strokeWidth="0dp">
+
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent">
+
+            <com.google.android.material.button.MaterialButton
+                android:id="@+id/menu_button"
+                style="@style/Widget.AppTheme.Button.IconButton"
+                android:layout_width="38dp"
+                android:layout_height="38dp"
+                android:layout_marginStart="8dp"
+                android:contentDescription="@string/action_switch_grid_view"
+                app:cornerRadius="@dimen/button_corner_radius"
+                app:icon="@drawable/ic_menu"
+                app:iconTint="@color/fontAppbar"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintStart_toStartOf="parent"
+                app:layout_constraintTop_toTopOf="parent" />
+
+            <com.google.android.material.textview.MaterialTextView
+                android:id="@+id/search_text"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="18dp"
+                android:layout_marginEnd="18dp"
+                android:gravity="start"
+                android:textColor="@color/fontSecondaryAppbar"
+                android:textSize="16sp"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintLeft_toRightOf="@id/menu_button"
+                app:layout_constraintRight_toLeftOf="@id/switch_account_button"
+                app:layout_constraintTop_toTopOf="parent" />
+
+            <com.google.android.material.button.MaterialButton
+                android:id="@+id/switch_account_button"
+                style="@style/Widget.AppTheme.Button.IconButton"
+                android:layout_width="38dp"
+                android:layout_height="38dp"
+                android:layout_marginEnd="8dp"
+                app:cornerRadius="@dimen/button_corner_radius"
+                app:iconSize="28dp"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintEnd_toEndOf="parent"
+                app:layout_constraintTop_toTopOf="parent" />
+
+        </androidx.constraintlayout.widget.ConstraintLayout>
+
+    </com.google.android.material.card.MaterialCardView>
+
     <include layout="@layout/info_box" />
 
 </com.google.android.material.appbar.AppBarLayout>

+ 10 - 13
src/main/res/layout/toolbar_user_information.xml

@@ -1,5 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
+<?xml version="1.0" encoding="utf-8"?><!--
   Nextcloud Android client application
 
   Copyright (C) 2017 Andy Scherzinger
@@ -18,11 +17,9 @@
   You should have received a copy of the GNU Affero General Public
   License along with this program.  If not, see <http://www.gnu.org/licenses/>.
 -->
-<com.google.android.material.appbar.AppBarLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
+<com.google.android.material.appbar.AppBarLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
-    android:id="@+id/appbar"
     android:layout_width="match_parent"
     android:layout_height="@dimen/nav_drawer_header_height"
     android:theme="@style/ThemeOverlay.MaterialComponents.Dark.ActionBar">
@@ -36,7 +33,7 @@
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:contentDescription="@string/drawer_header_background"
-            android:scaleType="centerCrop"/>
+            android:scaleType="centerCrop" />
 
         <androidx.appcompat.widget.Toolbar
             android:id="@id/toolbar"
@@ -53,9 +50,9 @@
             <RelativeLayout
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:layout_marginBottom="@dimen/toolbar_user_information_layout_margin"
-                android:layout_marginEnd="@dimen/standard_half_margin"
                 android:layout_marginStart="@dimen/toolbar_user_information_layout_margin"
+                android:layout_marginEnd="@dimen/standard_half_margin"
+                android:layout_marginBottom="@dimen/toolbar_user_information_layout_margin"
                 android:gravity="bottom"
                 android:orientation="horizontal"
                 android:weightSum="1">
@@ -70,7 +67,7 @@
                         android:layout_width="@dimen/nav_drawer_header_avatar"
                         android:layout_height="@dimen/nav_drawer_header_avatar"
                         android:contentDescription="@string/avatar"
-                        android:src="@drawable/account_circle_white"/>
+                        android:src="@drawable/account_circle_white" />
                 </FrameLayout>
 
                 <LinearLayout
@@ -95,7 +92,7 @@
                         android:textColor="@color/white"
                         android:textSize="@dimen/drawer_header_text"
                         android:textStyle="bold"
-                        tools:text="Max Mustermann"/>
+                        tools:text="Max Mustermann" />
 
                     <TextView
                         android:id="@+id/userinfo_username"
@@ -110,14 +107,14 @@
                         android:shadowRadius="2"
                         android:textColor="@color/white"
                         android:textSize="@dimen/drawer_header_subtext"
-                        tools:text="max@127.0.0.1/nextcloud"/>
+                        tools:text="max@127.0.0.1/nextcloud" />
                 </LinearLayout>
 
             </RelativeLayout>
 
-        <include layout="@layout/info_box"/>
+            <include layout="@layout/info_box" />
 
-    </LinearLayout>
+        </LinearLayout>
     </RelativeLayout>
 
 </com.google.android.material.appbar.AppBarLayout>

+ 2 - 4
src/main/res/layout/trashbin_activity.xml

@@ -33,14 +33,12 @@
         android:layout_height="match_parent"
         android:orientation="vertical">
 
-        <include
-            android:id="@+id/navigation_bar"
-            layout="@layout/toolbar_standard"/>
+        <include layout="@layout/toolbar_standard" />
 
         <FrameLayout
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:layout_below="@+id/navigation_bar">
+            android:layout_below="@id/appbar">
 
             <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
                 android:id="@+id/swipe_containing_list"

+ 3 - 4
src/main/res/layout/upload_files_layout.xml

@@ -23,15 +23,14 @@
     android:layout_height="fill_parent"
     android:orientation="vertical">
 
-    <include
-        layout="@layout/toolbar_standard" />
+    <include layout="@layout/toolbar_standard" />
 
     <fragment
         android:id="@+id/local_files_list"
+        class="com.owncloud.android.ui.fragment.LocalFileListFragment"
         android:layout_width="match_parent"
         android:layout_height="0dp"
-        android:layout_weight="1"
-        class="com.owncloud.android.ui.fragment.LocalFileListFragment" />
+        android:layout_weight="1" />
 
     <LinearLayout
         android:layout_width="match_parent"

+ 2 - 4
src/main/res/layout/upload_list_layout.xml

@@ -30,14 +30,12 @@
         android:layout_height="match_parent"
         android:orientation="vertical">
 
-        <include
-            android:id="@+id/navigation_bar"
-            layout="@layout/toolbar_standard"/>
+        <include layout="@layout/toolbar_standard" />
 
         <FrameLayout
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:layout_below="@+id/navigation_bar">
+            android:layout_below="@id/appbar">
 
             <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
                 android:id="@+id/swipe_containing_list"

+ 6 - 6
src/main/res/layout/uploader_layout.xml

@@ -24,13 +24,13 @@
     android:layout_height="fill_parent"
     android:orientation="vertical">
 
-    <include
-        layout="@layout/toolbar_standard" />
+    <include layout="@layout/toolbar_standard" />
 
-	<FrameLayout android:layout_height="0dp"
-		android:layout_width="fill_parent"
-		android:id="@+id/frameLayout1"
-		android:layout_weight="1">
+    <FrameLayout
+        android:id="@+id/frameLayout1"
+        android:layout_width="fill_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1">
 
 		<ListView android:id="@android:id/list"
 			android:layout_width="fill_parent"

+ 2 - 3
src/main/res/layout/user_info_layout.xml

@@ -25,10 +25,9 @@
                                                  android:layout_height="match_parent"
                                                  android:background="@color/bg_default">
 
-    <include
-        layout="@layout/toolbar_user_information"/>
+    <include layout="@layout/toolbar_user_information" />
 
-    <include layout="@layout/empty_list"/>
+    <include layout="@layout/empty_list" />
 
     <androidx.core.widget.NestedScrollView
         android:layout_width="match_parent"

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

@@ -3,6 +3,7 @@
     <string name="about_android">%1$s Android app</string>
     <string name="about_version">version %1$s</string>
     <string name="about_version_with_build">version %1$s, build #%2$s</string>
+    <string name="appbar_search_in">Search in %s</string>
     <string name="actionbar_sync">Refresh account</string>
     <string name="actionbar_open_with">Open with</string>
     <string name="actionbar_mkdir">New folder</string>