Browse Source

Some progress on search

Mario Danic 8 years ago
parent
commit
bb3dfac2d4

+ 2 - 1
build.gradle

@@ -173,7 +173,7 @@ dependencies {
     compile name: 'touch-image-view'
     compile 'com.android.support:multidex:1.0.1'
 
-    compile 'com.github.nextcloud:android-library:favorites-branch-SNAPSHOT'
+    compile 'com.github.nextcloud:android-library:search-SNAPSHOT'
     compile "com.android.support:support-v4:${supportLibraryVersion}"
     compile "com.android.support:design:${supportLibraryVersion}"
     compile 'com.jakewharton:disklrucache:2.0.2'
@@ -183,6 +183,7 @@ dependencies {
     compile group: 'commons-io', name: 'commons-io', version: '2.4'
     compile 'com.google.android.gms:play-services:10.2.0'
     compile 'com.github.evernote:android-job:v1.1.7'
+    compile 'org.greenrobot:eventbus:3.0.0'
 
     customCompile 'com.google.firebase:firebase-core:10.2.0'
 

+ 3 - 0
src/custom/res/values/setup.xml

@@ -101,6 +101,9 @@
     <!-- analytics enabled -->
     <bool name="analytics_enabled">false</bool>
 
+    <!-- custom Files title -->
+    <string name="custom_files_title" translatable="true">Home</string>
+
 </resources>
 
 

+ 13 - 2
src/main/java/com/owncloud/android/authentication/AccountUtils.java

@@ -182,6 +182,7 @@ public class AccountUtils {
             if (AccountTypeUtils.getAuthTokenTypeSamlSessionCookie(MainApp.getAccountType()).equals(authTokenType)) {
                 return SAML_SSO_PATH;
             }
+
             return WEBDAV_PATH_4_0_AND_LATER;
         }
         return null;
@@ -321,7 +322,7 @@ public class AccountUtils {
         return serverVersion;
     }
 
-    public static boolean hasSearchUsersSupport(Account account){
+    private static OwnCloudVersion getOwnCloudVersion(Account account) {
         OwnCloudVersion serverVersion = null;
         if (account != null) {
             AccountManager accountMgr = AccountManager.get(MainApp.getAppContext());
@@ -330,6 +331,16 @@ public class AccountUtils {
                 serverVersion = new OwnCloudVersion(serverVersionStr);
             }
         }
-        return (serverVersion != null ? serverVersion.isSearchUsersSupported() : false);
+        return serverVersion;
+
+    }
+    public static boolean hasSearchUsersSupport(Account account){
+        OwnCloudVersion serverVersion = getOwnCloudVersion(account);
+        return (serverVersion != null && serverVersion.isSearchUsersSupported());
+    }
+
+    public static boolean hasSearchSupport(Account account) {
+        OwnCloudVersion serverVersion = getOwnCloudVersion(account);
+        return (serverVersion != null && serverVersion.isSearchSupported());
     }
 }

+ 6 - 6
src/main/java/com/owncloud/android/operations/RefreshFolderOperation.java

@@ -91,7 +91,7 @@ public class RefreshFolderOperation extends RemoteOperation {
     private int mConflictsFound;
 
     /** Counter of failed operations in synchronization of kept-in-sync files */
-    private int mFailsInFavouritesFound;
+    private int mFailsInKeptInSyncFound;
 
     /**
      * Map of remote and local paths to files that where locally stored in a location 
@@ -156,8 +156,8 @@ public class RefreshFolderOperation extends RemoteOperation {
         return mConflictsFound;
     }
     
-    public int getFailsInFavouritesFound() {
-        return mFailsInFavouritesFound;
+    public int getFailsInKeptInSyncFound() {
+        return mFailsInKeptInSyncFound;
     }
     
     public Map<String, String> getForgottenLocalFiles() {
@@ -182,7 +182,7 @@ public class RefreshFolderOperation extends RemoteOperation {
     @Override
     protected RemoteOperationResult run(OwnCloudClient client) {
         RemoteOperationResult result = null;
-        mFailsInFavouritesFound = 0;
+        mFailsInKeptInSyncFound = 0;
         mConflictsFound = 0;
         mForgottenLocalFiles.clear();
         
@@ -316,7 +316,7 @@ public class RefreshFolderOperation extends RemoteOperation {
         
         if (result.isSuccess()) {
             synchronizeData(result.getData());
-            if (mConflictsFound > 0  || mFailsInFavouritesFound > 0) { 
+            if (mConflictsFound > 0  || mFailsInKeptInSyncFound > 0) {
                 result = new RemoteOperationResult(ResultCode.SYNC_CONFLICT);   
                     // should be a different result code, but will do the job
             }
@@ -463,7 +463,7 @@ public class RefreshFolderOperation extends RemoteOperation {
                 if (contentsResult.getCode() == ResultCode.SYNC_CONFLICT) {
                     mConflictsFound++;
                 } else {
-                    mFailsInFavouritesFound++;
+                    mFailsInKeptInSyncFound++;
                     if (contentsResult.getException() != null) {
                         Log_OC.e(TAG, "Error while synchronizing favourites : " 
                                 +  contentsResult.getLogMessage(), contentsResult.getException());

+ 15 - 10
src/main/java/com/owncloud/android/operations/UpdateOCVersionOperation.java

@@ -20,10 +20,9 @@
 
 package com.owncloud.android.operations;
 
-import org.apache.commons.httpclient.HttpStatus;
-import org.apache.commons.httpclient.methods.GetMethod;
-import org.json.JSONException;
-import org.json.JSONObject;
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.content.Context;
 
 import com.owncloud.android.authentication.AccountUtils;
 import com.owncloud.android.lib.common.OwnCloudClient;
@@ -34,9 +33,10 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCo
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.lib.resources.status.OwnCloudVersion;
 
-import android.accounts.Account;
-import android.accounts.AccountManager;
-import android.content.Context;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.json.JSONException;
+import org.json.JSONObject;
 
 
 /**
@@ -65,6 +65,9 @@ public class UpdateOCVersionOperation extends RemoteOperation {
         statUrl += AccountUtils.STATUS_PATH;
         RemoteOperationResult result = null;
         GetMethod get = null;
+
+        String webDav = client.getWebdavUri().toString();
+
         try {
             get = new GetMethod(statUrl);
             int status = client.executeMethod(get);
@@ -96,15 +99,17 @@ public class UpdateOCVersionOperation extends RemoteOperation {
                     result = new RemoteOperationResult(RemoteOperationResult.ResultCode.INSTANCE_NOT_CONFIGURED);
                 }
             }
-            Log_OC.i(TAG, "Check for update of ownCloud server version at " + client.getWebdavUri() + ": " + result.getLogMessage());
+
+
+            Log_OC.i(TAG, "Check for update of ownCloud server version at " + webDav + ": " + result.getLogMessage());
             
         } catch (JSONException e) {
             result = new RemoteOperationResult(RemoteOperationResult.ResultCode.INSTANCE_NOT_CONFIGURED);
-            Log_OC.e(TAG, "Check for update of ownCloud server version at " + client.getWebdavUri() + ": " + result.getLogMessage(), e);
+            Log_OC.e(TAG, "Check for update of ownCloud server version at " + webDav + ": " + result.getLogMessage(), e);
                 
         } catch (Exception e) {
             result = new RemoteOperationResult(e);
-            Log_OC.e(TAG, "Check for update of ownCloud server version at " + client.getWebdavUri() + ": " + result.getLogMessage(), e);
+            Log_OC.e(TAG, "Check for update of ownCloud server version at " + webDav + ": " + result.getLogMessage(), e);
             
         } finally {
             if (get != null) {

+ 1 - 1
src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java

@@ -279,7 +279,7 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
             
             if (result.getCode() == ResultCode.SYNC_CONFLICT) {
                 mConflictsFound += synchFolderOp.getConflictsFound();
-                mFailsInFavouritesFound += synchFolderOp.getFailsInFavouritesFound();
+                mFailsInFavouritesFound += synchFolderOp.getFailsInKeptInSyncFound();
             }
             if (synchFolderOp.getForgottenLocalFiles().size() > 0) {
                 mForgottenLocalFiles.putAll(synchFolderOp.getForgottenLocalFiles());

+ 39 - 0
src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java

@@ -35,6 +35,7 @@ import android.support.design.widget.NavigationView;
 import android.support.v4.view.GravityCompat;
 import android.support.v4.widget.DrawerLayout;
 import android.support.v7.app.ActionBarDrawerToggle;
+import android.text.TextUtils;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
@@ -53,10 +54,14 @@ import com.owncloud.android.lib.common.UserInfo;
 import com.owncloud.android.lib.common.operations.RemoteOperation;
 import com.owncloud.android.lib.common.operations.RemoteOperationResult;
 import com.owncloud.android.lib.common.utils.Log_OC;
+import com.owncloud.android.lib.resources.files.SearchOperation;
 import com.owncloud.android.lib.resources.users.GetRemoteUserInfoOperation;
 import com.owncloud.android.ui.TextDrawable;
+import com.owncloud.android.ui.events.SearchEvent;
 import com.owncloud.android.utils.DisplayUtils;
 
+import org.greenrobot.eventbus.EventBus;
+
 /**
  * Base class to handle setup of the drawer implementation including user switching and avatar fetching and fallback
  * generation.
@@ -285,6 +290,30 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU
         } else {
             navigationView.getMenu().setGroupVisible(R.id.drawer_menu_accounts, false);
         }
+
+        if (getResources().getBoolean(R.bool.bottom_toolbar_enabled)) {
+            navigationView.getMenu().findItem(R.id.nav_all_files).setVisible(false);
+        } else if (!TextUtils.isEmpty(getResources().getString(R.string.custom_files_title))) {
+            navigationView.getMenu().findItem(R.id.nav_all_files).setTitle(R.string.custom_files_title);
+        }
+
+        if (AccountUtils.hasSearchSupport(AccountUtils.getCurrentOwnCloudAccount(MainApp.getAppContext()))) {
+            if (getResources().getBoolean(R.bool.recently_added_enabled)) {
+                navigationView.getMenu().findItem(R.id.nav_recently_added).setVisible(true);
+            }
+
+            if (getResources().getBoolean(R.bool.recently_modified_enabled)) {
+                navigationView.getMenu().findItem(R.id.nav_recently_modified).setVisible(true);
+            }
+
+            if (getResources().getBoolean(R.bool.shared_enabled)) {
+                navigationView.getMenu().findItem(R.id.nav_shared).setVisible(true);
+            }
+
+            if (getResources().getBoolean(R.bool.videos_enabled)) {
+                navigationView.getMenu().findItem(R.id.nav_videos).setVisible(true);
+            }
+        }
     }
 
     private void selectNavigationItem(final MenuItem menuItem) {
@@ -326,6 +355,15 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU
                         ManageAccountsActivity.class);
                 startActivityForResult(manageAccountsIntent, ACTION_MANAGE_ACCOUNTS);
                 break;
+            case R.id.nav_recently_added:
+                break;
+            case R.id.nav_recently_modified:
+                break;
+            case R.id.nav_shared:
+                break;
+            case R.id.nav_videos:
+                EventBus.getDefault().post(new SearchEvent("video/%", SearchOperation.SearchType.CONTENT_TYPE_SEARCH));
+                break;
             case Menu.NONE:
                 // account clicked
                 accountClicked(menuItem.getTitle().toString());
@@ -341,6 +379,7 @@ public abstract class DrawerActivity extends ToolbarActivity implements DisplayU
      */
     public abstract void showFiles(boolean onDeviceOnly);
 
+
     /**
      * sets the new/current account and restarts. In case the given account equals the actual/current account the
      * call will be ignored.

+ 35 - 5
src/main/java/com/owncloud/android/ui/adapter/FileListListAdapter.java

@@ -27,6 +27,8 @@ import android.accounts.Account;
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.Color;
+import android.os.Handler;
+import android.os.Looper;
 import android.text.TextUtils;
 import android.util.SparseBooleanArray;
 import android.view.LayoutInflater;
@@ -48,9 +50,10 @@ import com.owncloud.android.datamodel.ThumbnailsCacheManager;
 import com.owncloud.android.db.PreferenceManager;
 import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
 import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
+import com.owncloud.android.lib.resources.files.RemoteFile;
 import com.owncloud.android.services.OperationsService.OperationsServiceBinder;
 import com.owncloud.android.ui.activity.ComponentsGetter;
-import com.owncloud.android.ui.interfaces.ExtendedListFragmentInterface;
+import com.owncloud.android.ui.interfaces.OCFileListFragmentInterface;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.MimeTypeUtil;
@@ -74,7 +77,7 @@ public class FileListListAdapter extends BaseAdapter {
     private FileDataStorageManager mStorageManager;
     private Account mAccount;
     private ComponentsGetter mTransferServiceGetter;
-    private ExtendedListFragmentInterface extendedListFragmentInterface;
+    private OCFileListFragmentInterface OCFileListFragmentInterface;
 
     private FilesFilter mFilesFilter;
     private OCFile currentDirectory;
@@ -83,10 +86,10 @@ public class FileListListAdapter extends BaseAdapter {
             boolean justFolders,
             Context context,
             ComponentsGetter transferServiceGetter,
-            ExtendedListFragmentInterface extendedListFragmentInterface
+            OCFileListFragmentInterface OCFileListFragmentInterface
     ) {
 
-        this.extendedListFragmentInterface = extendedListFragmentInterface;
+        this.OCFileListFragmentInterface = OCFileListFragmentInterface;
         mJustFolders = justFolders;
         mContext = context;
         mAccount = AccountUtils.getCurrentOwnCloudAccount(mContext);
@@ -419,6 +422,31 @@ public class FileListListAdapter extends BaseAdapter {
         notifyDataSetChanged();
     }
 
+    public void setData(ArrayList<Object> objects) {
+        mFiles = new Vector<>();
+        for (int i = 0; i < objects.size(); i++) {
+            OCFile ocFile = FileStorageUtils.fillOCFile((RemoteFile) objects.get(i));
+            mFiles.add(ocFile);
+        }
+
+        if (!mShowHiddenFiles) {
+            mFiles = filterHiddenFiles(mFiles);
+        }
+
+        mFiles = FileStorageUtils.sortOcFolder(mFiles);
+
+        mFilesAll = new Vector<>();
+        mFilesAll.addAll(mFiles);
+
+        new Handler(Looper.getMainLooper()).post(new Runnable() {
+            @Override
+            public void run() {
+                notifyDataSetChanged();
+                OCFileListFragmentInterface.finishedFiltering();
+            }
+        });
+    }
+
     /**
      * Filter for getting only the folders
      *
@@ -477,6 +505,8 @@ public class FileListListAdapter extends BaseAdapter {
 
         @Override
         protected FilterResults performFiltering(CharSequence constraint) {
+
+
             FilterResults results = new FilterResults();
             Vector<OCFile> filteredFiles = new Vector<>();
 
@@ -510,7 +540,7 @@ public class FileListListAdapter extends BaseAdapter {
             }
 
             notifyDataSetChanged();
-            extendedListFragmentInterface.finishedFiltering();
+            OCFileListFragmentInterface.finishedFiltering();
 
         }
     }

+ 28 - 0
src/main/java/com/owncloud/android/ui/events/SearchEvent.java

@@ -0,0 +1,28 @@
+package com.owncloud.android.ui.events;
+
+import com.owncloud.android.lib.resources.files.SearchOperation;
+
+/**
+ * Created by mdjanic on 10/03/2017.
+ */
+
+public class SearchEvent {
+    public final String searchQuery;
+
+    public final SearchOperation.SearchType searchType;
+
+
+    public SearchEvent(String searchQuery, SearchOperation.SearchType searchType) {
+
+        this.searchQuery = searchQuery;
+        this.searchType = searchType;
+    }
+
+    public String getSearchQuery() {
+        return searchQuery;
+    }
+
+    public SearchOperation.SearchType getSearchType() {
+        return searchType;
+    }
+}

+ 57 - 2
src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java

@@ -22,6 +22,9 @@
  */
 package com.owncloud.android.ui.fragment;
 
+import android.accounts.Account;
+import android.accounts.AuthenticatorException;
+import android.accounts.OperationCanceledException;
 import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
@@ -51,7 +54,12 @@ import com.owncloud.android.authentication.AccountUtils;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.files.FileMenuFilter;
+import com.owncloud.android.lib.common.OwnCloudAccount;
+import com.owncloud.android.lib.common.OwnCloudClient;
+import com.owncloud.android.lib.common.OwnCloudClientManagerFactory;
+import com.owncloud.android.lib.common.operations.RemoteOperationResult;
 import com.owncloud.android.lib.common.utils.Log_OC;
+import com.owncloud.android.lib.resources.files.SearchOperation;
 import com.owncloud.android.lib.resources.status.OwnCloudVersion;
 import com.owncloud.android.ui.activity.FileActivity;
 import com.owncloud.android.ui.activity.FileDisplayActivity;
@@ -63,15 +71,21 @@ import com.owncloud.android.ui.dialog.ConfirmationDialogFragment;
 import com.owncloud.android.ui.dialog.CreateFolderDialogFragment;
 import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment;
 import com.owncloud.android.ui.dialog.RenameFileDialogFragment;
+import com.owncloud.android.ui.events.SearchEvent;
 import com.owncloud.android.ui.helpers.SparseBooleanArrayParcelable;
-import com.owncloud.android.ui.interfaces.ExtendedListFragmentInterface;
+import com.owncloud.android.ui.interfaces.OCFileListFragmentInterface;
 import com.owncloud.android.ui.preview.PreviewImageFragment;
 import com.owncloud.android.ui.preview.PreviewMediaFragment;
 import com.owncloud.android.ui.preview.PreviewTextFragment;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.FileStorageUtils;
 
+import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
+
 import java.io.File;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -80,7 +94,7 @@ import java.util.List;
  *
  * TODO refactor to get rid of direct dependency on FileDisplayActivity
  */
-public class OCFileListFragment extends ExtendedListFragment implements ExtendedListFragmentInterface {
+public class OCFileListFragment extends ExtendedListFragment implements OCFileListFragmentInterface {
 
     private static final String TAG = OCFileListFragment.class.getSimpleName();
 
@@ -1007,5 +1021,46 @@ public class OCFileListFragment extends ExtendedListFragment implements Extended
         editor.apply();
     }
 
+    @Subscribe(threadMode = ThreadMode.BACKGROUND)
+    public void onMessageEvent(SearchEvent event) {
+        Account currentAccount = com.owncloud.android.authentication.AccountUtils.
+                getCurrentOwnCloudAccount(MainApp.getAppContext());
+
+        try {
+            OwnCloudAccount ocAccount = new OwnCloudAccount(
+                    currentAccount,
+                    MainApp.getAppContext()
+            );
+
+            OwnCloudClient mClient = OwnCloudClientManagerFactory.getDefaultSingleton().
+                    getClientFor(ocAccount, MainApp.getAppContext());
+            SearchOperation operation = new SearchOperation(event.getSearchQuery(), event.getSearchType());
+            RemoteOperationResult remoteOperationResult = operation.execute(mClient);
+            if (remoteOperationResult.isSuccess() || remoteOperationResult.getData() != null) {
+                mAdapter.setData(remoteOperationResult.getData());
+            }
+        } catch (AuthenticatorException e) {
+            e.printStackTrace();
+        } catch (com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (OperationCanceledException e) {
+            e.printStackTrace();
+        }
+
 
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        EventBus.getDefault().register(this);
+    }
+
+    @Override
+    public void onStop() {
+        EventBus.getDefault().unregister(this);
+        super.onStop();
+    }
 }

+ 1 - 1
src/main/java/com/owncloud/android/ui/interfaces/ExtendedListFragmentInterface.java → src/main/java/com/owncloud/android/ui/interfaces/OCFileListFragmentInterface.java

@@ -24,6 +24,6 @@ package com.owncloud.android.ui.interfaces;
  * Interface for signaling filter finish
  */
 
-public interface ExtendedListFragmentInterface {
+public interface OCFileListFragmentInterface {
     void finishedFiltering();
 }

+ 25 - 4
src/main/res/menu/drawer_menu.xml

@@ -20,13 +20,14 @@
     <!--
       standard menu
       all items in this group MUST have orderInCategory="0" set
+
     -->
     <group android:id="@+id/drawer_menu_standard" android:checkableBehavior="single">
         <item
             android:orderInCategory="0"
             android:id="@+id/nav_all_files"
             android:icon="@drawable/ic_folder_open"
-            android:title="@string/drawer_item_all_files"/>
+            android:title="@string/drawer_item_files"/>
         <item
             android:orderInCategory="0"
             android:id="@+id/nav_on_device"
@@ -34,9 +35,24 @@
             android:title="@string/drawer_item_on_device"/>
         <item
             android:orderInCategory="0"
-            android:id="@+id/nav_uploads"
-            android:icon="@drawable/ic_uploads"
-            android:title="@string/drawer_item_uploads_list"/>
+            android:id="@+id/nav_recently_added"
+            android:title="@string/drawer_item_recently_added"
+            android:visible="false"/>
+        <item
+            android:orderInCategory="0"
+            android:id="@+id/nav_recently_modified"
+            android:title="@string/drawer_item_recently_modified"
+            android:visible="false"/>
+        <item
+            android:orderInCategory="0"
+            android:id="@+id/nav_shared"
+            android:title="@string/drawer_item_shared"
+            android:visible="false"/>
+        <item
+            android:orderInCategory="0"
+            android:id="@+id/nav_videos"
+            android:title="@string/drawer_item_videos"
+            android:visible="false"/>
         <item
             android:orderInCategory="0"
             android:id="@+id/nav_folder_sync"
@@ -66,6 +82,11 @@
       all items in this group MUST have orderInCategory="3" set
     -->
     <group android:id="@+id/drawer_menu_bottom" android:checkableBehavior="single">
+        <item
+            android:orderInCategory="2"
+            android:id="@+id/nav_uploads"
+            android:icon="@drawable/ic_uploads"
+            android:title="@string/drawer_item_uploads_list"/>
         <item
             android:orderInCategory="3"
             android:id="@+id/nav_settings"

+ 3 - 0
src/main/res/values/setup.xml

@@ -102,6 +102,9 @@
     <!-- analytics enabled -->
     <bool name="analytics_enabled">false</bool>
 
+    <!-- custom Files title -->
+    <string name="custom_files_title" translatable="true"></string>
+
 </resources>
 
 

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

@@ -17,7 +17,12 @@
     <string name="menu_item_sort_by_date">Newest - Oldest</string>
     <string name="menu_item_sort_by_size">Biggest - Smallest</string>
     <string name="drawer_item_all_files">All files</string>
+    <string name="drawer_item_files">Files</string>
     <string name="drawer_item_on_device">On device</string>
+    <string name="drawer_item_recently_added">Recently added</string>
+    <string name="drawer_item_recently_modified">Recently modified</string>
+    <string name="drawer_item_shared">Shared</string>
+    <string name="drawer_item_videos">Videos</string>
     <string name="drawer_item_settings">Settings</string>
     <string name="drawer_item_uploads_list">Uploads</string>
     <string name="drawer_quota">%1$s of %2$s used</string>