X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/5d784d98b4b86e0d047ac2bdf5539495ccfb81f8..956a78753b58e95c1199dee32e88a464757b5061:/src/com/owncloud/android/ui/activity/FileDisplayActivity.java diff --git a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java index 57656d64..50fbe90f 100644 --- a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -25,6 +25,7 @@ import android.accounts.Account; import android.accounts.AccountManager; import android.accounts.AuthenticatorException; import android.accounts.OperationCanceledException; +import android.annotation.TargetApi; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; @@ -39,6 +40,7 @@ import android.content.IntentFilter; import android.content.ServiceConnection; import android.content.SharedPreferences; import android.content.SyncRequest; +import android.content.res.Configuration; import android.content.res.Resources.NotFoundException; import android.database.Cursor; import android.net.Uri; @@ -50,13 +52,21 @@ import android.preference.PreferenceManager; import android.provider.DocumentsContract; import android.provider.MediaStore; import android.provider.OpenableColumns; +import android.support.v4.app.ActionBarDrawerToggle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; +import android.support.v4.view.GravityCompat; +import android.support.v4.widget.DrawerLayout; import android.util.Log; import android.view.View; import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; @@ -66,9 +76,9 @@ import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; import com.actionbarsherlock.view.Window; -import com.owncloud.android.BuildConfig; import com.owncloud.android.MainApp; import com.owncloud.android.R; +import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.files.services.FileDownloader; import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder; @@ -95,6 +105,7 @@ import com.owncloud.android.operations.UnshareLinkOperation; import com.owncloud.android.services.observer.FileObserverService; import com.owncloud.android.syncadapter.FileSyncAdapter; import com.owncloud.android.ui.adapter.FileListListAdapter; +import com.owncloud.android.ui.adapter.NavigationDrawerListAdapter; import com.owncloud.android.ui.dialog.CreateFolderDialogFragment; import com.owncloud.android.ui.dialog.SslUntrustedCertDialog; import com.owncloud.android.ui.dialog.SslUntrustedCertDialog.OnSslUntrustedCertListener; @@ -107,6 +118,7 @@ import com.owncloud.android.ui.preview.PreviewMediaFragment; import com.owncloud.android.ui.preview.PreviewVideoActivity; import com.owncloud.android.utils.DisplayUtils; import com.owncloud.android.utils.ErrorMessageAdapter; +import com.owncloud.android.utils.UriUtils; /** @@ -157,14 +169,17 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { private String DIALOG_UNTRUSTED_CERT; private OCFile mWaitingToSend; - - private static final String URI_CONTENT_SCHEME = "content://"; - + + + private DrawerLayout mDrawerLayout; + private ActionBarDrawerToggle mDrawerToggle; + private boolean showAccounts = false; + @Override protected void onCreate(Bundle savedInstanceState) { Log_OC.d(TAG, "onCreate() start"); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); - + super.onCreate(savedInstanceState); // this calls onAccountChanged() when ownCloud Account is valid // PIN CODE request ; best location is to decide, let's try this first @@ -195,7 +210,89 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { /// USER INTERFACE // Inflate and set the layout view - setContentView(R.layout.files); + setContentView(R.layout.files); + + // TODO move to another place that all activity can use it + mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); + + mDrawerToggle = new ActionBarDrawerToggle( + this, + mDrawerLayout, + R.drawable.ic_drawer, + R.string.drawer_open, + R.string.empty + ) { + + /** Called when a drawer has settled in a completely closed state. */ + public void onDrawerClosed(View view) { + super.onDrawerClosed(view); + getSupportActionBar().setDisplayShowTitleEnabled(true); + getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); + initFragmentsWithFile(); + invalidateOptionsMenu(); + } + + /** Called when a drawer has settled in a completely open state. */ + public void onDrawerOpened(View drawerView) { + super.onDrawerOpened(drawerView); + getSupportActionBar().setTitle(R.string.drawer_open); + getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); + invalidateOptionsMenu(); + } + }; + + mDrawerToggle.setDrawerIndicatorEnabled(true); + + // Notification Drawer + LinearLayout notificatonDrawer = (LinearLayout) findViewById(R.id.left_drawer); + + // ListView + ListView listView = (ListView) notificatonDrawer.findViewById(R.id.drawer_list); + final NavigationDrawerListAdapter adapter = new NavigationDrawerListAdapter(getApplicationContext(), this); + + listView.setAdapter(adapter); + + listView.setOnItemClickListener(new OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + if (showAccounts && position > 0){ + position = position - 1; + } + switch (position){ + case 0: + showAccounts = !showAccounts; + adapter.setShowAccounts(showAccounts); + adapter.notifyDataSetChanged(); + break; + case 1: + MainApp.showOnlyFilesOnDevice(false); + mDrawerLayout.closeDrawers(); + break; + case 2: + MainApp.showOnlyFilesOnDevice(true); + mDrawerLayout.closeDrawers(); + break; + case 3: + Intent settingsIntent = new Intent(getApplicationContext(), Preferences.class); + startActivity(settingsIntent); + break; + } + } + }); + + // User-Icon + ImageView userIcon = (ImageView) notificatonDrawer.findViewById(R.id.drawer_userIcon); + userIcon.setImageResource(DisplayUtils.getSeasonalIconId()); + + // Username + TextView username = (TextView) notificatonDrawer.findViewById(R.id.drawer_username); + Account account = AccountUtils.getCurrentOwnCloudAccount(getApplicationContext()); + int lastAtPos = account.name.lastIndexOf("@"); + username.setText(account.name.substring(0, lastAtPos)); + + // Set the drawer toggle as the DrawerListener + mDrawerLayout.setDrawerListener(mDrawerToggle); + mDualPane = getResources().getBoolean(R.bool.large_land_layout); mLeftFragmentContainer = findViewById(R.id.left_fragment_container); mRightFragmentContainer = findViewById(R.id.right_fragment_container); @@ -205,9 +302,14 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { // Action bar setup mDirectories = new CustomArrayAdapter(this, R.layout.sherlock_spinner_dropdown_item); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); // mandatory since Android ICS, according to the official documentation + getSupportActionBar().setDisplayShowCustomEnabled(true); // CRUCIAL - for displaying your custom actionbar + getSupportActionBar().setDisplayShowTitleEnabled(true); setSupportProgressBarIndeterminateVisibility(mSyncInProgress /*|| mRefreshSharesInProgress*/); // always AFTER setContentView(...) ; to work around bug in its implementation + mDrawerToggle.syncState(); + setBackgroundText(); Log_OC.d(TAG, "onCreate() end"); @@ -218,6 +320,19 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { super.onStart(); getSupportActionBar().setIcon(DisplayUtils.getSeasonalIconId()); } + + @Override + protected void onPostCreate(Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + // Sync the toggle state after onRestoreInstanceState has occurred. + mDrawerToggle.syncState(); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + mDrawerToggle.onConfigurationChanged(newConfig); + } @Override protected void onDestroy() { @@ -296,7 +411,7 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { /// First fragment OCFileListFragment listOfFiles = getListOfFilesFragment(); if (listOfFiles != null) { - listOfFiles.listDirectory(getCurrentDir()); + listOfFiles.listDirectory(getCurrentDir(), MainApp.getOnlyOnDevice()); } else { Log_OC.e(TAG, "Still have a chance to lose the initializacion of list fragment >("); } @@ -416,7 +531,7 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { protected void refreshListOfFilesFragment() { OCFileListFragment fileListFragment = getListOfFilesFragment(); if (fileListFragment != null) { - fileListFragment.listDirectory(); + fileListFragment.listDirectory(MainApp.getOnlyOnDevice()); } } @@ -459,11 +574,11 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { @Override public boolean onPrepareOptionsMenu(Menu menu) { - if (BuildConfig.DEBUG) { - menu.findItem(R.id.action_logger).setVisible(true); - } else { - menu.findItem(R.id.action_logger).setVisible(false); - } + boolean drawerOpen = mDrawerLayout.isDrawerOpen(GravityCompat.START); + menu.findItem(R.id.action_upload).setVisible(!drawerOpen); + menu.findItem(R.id.action_create_dir).setVisible(!drawerOpen); + menu.findItem(R.id.action_sort).setVisible(!drawerOpen); + return super.onPrepareOptionsMenu(menu); } @@ -473,6 +588,7 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { inflater.inflate(R.menu.main_menu, menu); return true; } + @Override public boolean onOptionsItemSelected(MenuItem item) { @@ -484,32 +600,17 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { dialog.show(getSupportFragmentManager(), "createdirdialog"); break; } - case R.id.action_sync_account: { - startSynchronization(); - break; - } case R.id.action_upload: { showDialog(DIALOG_CHOOSE_UPLOAD_SOURCE); break; } - case R.id.action_settings: { - Intent settingsIntent = new Intent(this, Preferences.class); - startActivity(settingsIntent); - break; - } - case R.id.action_logger: { - Intent loggerIntent = new Intent(getApplicationContext(),LogHistoryActivity.class); - startActivity(loggerIntent); - break; - } case android.R.id.home: { - FileFragment second = getSecondFragment(); - OCFile currentDir = getCurrentDir(); - if((currentDir != null && currentDir.getParentId() != 0) || - (second != null && second.getFile() != null)) { - onBackPressed(); - + if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) { + mDrawerLayout.closeDrawer(GravityCompat.START); + } else { + mDrawerLayout.openDrawer(GravityCompat.START); } + // TODO add hamburger to left of android.R.id.home break; } case R.id.action_sort: { @@ -571,6 +672,11 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { builder.setExpedited(true); builder.setManual(true); builder.syncOnce(); + + // Fix bug in Android Lollipop when you click on refresh the whole account + Bundle extras = new Bundle(); + builder.setExtras(extras); + SyncRequest request = builder.build(); ContentResolver.requestSync(request); } @@ -601,18 +707,27 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { /** * Called, when the user selected something for uploading + * */ + @TargetApi(Build.VERSION_CODES.JELLY_BEAN) protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == ACTION_SELECT_CONTENT_FROM_APPS && (resultCode == RESULT_OK || resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE)) { - requestSimpleUpload(data, resultCode); - + //getClipData is only supported on api level 16+, Jelly Bean + if (data.getData() == null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN){ + for( int i = 0; i < data.getClipData().getItemCount(); i++){ + Intent intent = new Intent(); + intent.setData(data.getClipData().getItemAt(i).getUri()); + requestSimpleUpload(intent, resultCode); + } + }else { + requestSimpleUpload(data, resultCode); + } } else if (requestCode == ACTION_SELECT_MULTIPLE_FILES && (resultCode == RESULT_OK || resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE)) { requestMultipleUpload(data, resultCode); - } else if (requestCode == ACTION_MOVE_FILES && (resultCode == RESULT_OK || - resultCode == MoveActivity.RESULT_OK_AND_MOVE)){ + } else if (requestCode == ACTION_MOVE_FILES && resultCode == RESULT_OK){ final Intent fData = data; final int fResultCode = resultCode; @@ -700,7 +815,7 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { if (!remotepath.endsWith(OCFile.PATH_SEPARATOR)) remotepath += OCFile.PATH_SEPARATOR; - if (filepath.startsWith(URI_CONTENT_SCHEME)) { + if (filepath.startsWith(UriUtils.URI_CONTENT_SCHEME)) { Cursor cursor = MainApp.getAppContext().getContentResolver() .query(Uri.parse(filepath), null, null, null, null, null); @@ -711,7 +826,9 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); Log.i(TAG, "Display Name: " + displayName + "; mimeType: " + mimeType); - remotepath += displayName + getComposedFileExtension(filepath); + displayName.replace(File.separatorChar, '_'); + displayName.replace(File.pathSeparatorChar, '_'); + remotepath += displayName + DisplayUtils.getComposedFileExtension(filepath); } } finally { @@ -738,8 +855,8 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { * @param resultCode Result code received */ private void requestMoveOperation(Intent data, int resultCode) { - OCFile folderToMoveAt = (OCFile) data.getParcelableExtra(MoveActivity.EXTRA_CURRENT_FOLDER); - OCFile targetFile = (OCFile) data.getParcelableExtra(MoveActivity.EXTRA_TARGET_FILE); + OCFile folderToMoveAt = (OCFile) data.getParcelableExtra(FolderPickerActivity.EXTRA_FOLDER); + OCFile targetFile = (OCFile) data.getParcelableExtra(FolderPickerActivity.EXTRA_FILE); getFileOperationsHelper().moveFile(folderToMoveAt, targetFile); } @@ -872,6 +989,10 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { } else if (item == 1) { Intent action = new Intent(Intent.ACTION_GET_CONTENT); action = action.setType("*/*").addCategory(Intent.CATEGORY_OPENABLE); + //Intent.EXTRA_ALLOW_MULTIPLE is only supported on api level 18+, Jelly Bean + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { + action.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); + } startActivityForResult(Intent.createChooser(action, getString(R.string.upload_chooser_title)), ACTION_SELECT_CONTENT_FROM_APPS); } @@ -907,12 +1028,12 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { * @return The path to the content or null if it could not be found */ public String getPath(Uri uri) { - final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; + final boolean isKitKatOrLater = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; // DocumentProvider - if (isKitKat && DocumentsContract.isDocumentUri(getApplicationContext(), uri)) { + if (isKitKatOrLater && DocumentsContract.isDocumentUri(getApplicationContext(), uri)) { // ExternalStorageProvider - if (isExternalStorageDocument(uri)) { + if (UriUtils.isExternalStorageDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; @@ -922,16 +1043,16 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { } } // DownloadsProvider - else if (isDownloadsDocument(uri)) { + else if (UriUtils.isDownloadsDocument(uri)) { final String id = DocumentsContract.getDocumentId(uri); final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); - return getDataColumn(getApplicationContext(), contentUri, null, null); + return UriUtils.getDataColumn(getApplicationContext(), contentUri, null, null); } // MediaProvider - else if (isMediaDocument(uri)) { + else if (UriUtils.isMediaDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; @@ -948,10 +1069,10 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { final String selection = "_id=?"; final String[] selectionArgs = new String[] { split[1] }; - return getDataColumn(getApplicationContext(), contentUri, selection, selectionArgs); + return UriUtils.getDataColumn(getApplicationContext(), contentUri, selection, selectionArgs); } // Documents providers returned as content://... - else if (isContentDocument(uri)) { + else if (UriUtils.isContentDocument(uri)) { return uri.toString(); } } @@ -959,10 +1080,10 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { else if ("content".equalsIgnoreCase(uri.getScheme())) { // Return the remote address - if (isGooglePhotosUri(uri)) + if (UriUtils.isGooglePhotosUri(uri)) return uri.getLastPathSegment(); - return getDataColumn(getApplicationContext(), uri, null, null); + return UriUtils.getDataColumn(getApplicationContext(), uri, null, null); } // File else if ("file".equalsIgnoreCase(uri.getScheme())) { @@ -972,77 +1093,6 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { } /** - * Get the value of the data column for this Uri. This is useful for - * MediaStore Uris, and other file-based ContentProviders. - * - * @param context The context. - * @param uri The Uri to query. - * @param selection (Optional) Filter used in the query. - * @param selectionArgs (Optional) Selection arguments used in the query. - * @return The value of the _data column, which is typically a file path. - */ - public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { - - Cursor cursor = null; - final String column = "_data"; - final String[] projection = { column }; - - try { - cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); - if (cursor != null && cursor.moveToFirst()) { - - final int column_index = cursor.getColumnIndexOrThrow(column); - return cursor.getString(column_index); - } - } finally { - if (cursor != null) - cursor.close(); - } - return null; - } - - /** - * @param uri The Uri to check. - * @return Whether the Uri authority is ExternalStorageProvider. - */ - public static boolean isExternalStorageDocument(Uri uri) { - return "com.android.externalstorage.documents".equals(uri.getAuthority()); - } - - /** - * @param uri The Uri to check. - * @return Whether the Uri authority is DownloadsProvider. - */ - public static boolean isDownloadsDocument(Uri uri) { - return "com.android.providers.downloads.documents".equals(uri.getAuthority()); - } - - /** - * @param uri The Uri to check. - * @return Whether the Uri authority is MediaProvider. - */ - public static boolean isMediaDocument(Uri uri) { - return "com.android.providers.media.documents".equals(uri.getAuthority()); - } - - /** - * @param uri The Uri to check. - * @return Whether the Uri authority is Google Photos. - */ - public static boolean isGooglePhotosUri(Uri uri) { - return "com.google.android.apps.photos.content".equals(uri.getAuthority()); - } - - /** - * - * @param uri The Uri to check. - * @return Whether the Uri is from a content provider as kind "content://..." - */ - public static boolean isContentDocument(Uri uri) { - return uri.toString().startsWith(URI_CONTENT_SCHEME); - } - - /** * Pushes a directory to the drop down list * @param directory to push * @throws IllegalArgumentException If the {@link OCFile#isFolder()} returns false. @@ -1142,7 +1192,7 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { if (synchFolderRemotePath != null && currentDir.getRemotePath().equals(synchFolderRemotePath)) { OCFileListFragment fileListFragment = getListOfFilesFragment(); if (fileListFragment != null) { - fileListFragment.listDirectory(currentDir); + fileListFragment.listDirectory(currentDir, MainApp.getOnlyOnDevice()); } } setFile(currentFile); @@ -1355,7 +1405,7 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { popDirname(); } OCFile root = getStorageManager().getFileByPath(OCFile.ROOT_PATH); - listOfFiles.listDirectory(root); + listOfFiles.listDirectory(root, MainApp.getOnlyOnDevice()); setFile(listOfFiles.getCurrentFile()); startSyncFolderOperation(root, false); } @@ -1370,7 +1420,7 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { OCFileListFragment listOfFiles = getListOfFilesFragment(); if (listOfFiles != null) { setNavigationListWithFolder(folder); - listOfFiles.listDirectory(folder); + listOfFiles.listDirectory(folder, MainApp.getOnlyOnDevice()); setFile(listOfFiles.getCurrentFile()); startSyncFolderOperation(folder, false); } else { @@ -1420,8 +1470,10 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { // only list of files - set for browsing through folders OCFile currentDir = getCurrentDir(); boolean noRoot = (currentDir != null && currentDir.getParentId() != 0); - actionBar.setDisplayHomeAsUpEnabled(noRoot); - actionBar.setDisplayShowTitleEnabled(!noRoot); +// actionBar.setDisplayHomeAsUpEnabled(noRoot); +// actionBar.setDisplayShowTitleEnabled(!noRoot); + actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.setDisplayShowTitleEnabled(true); if (!noRoot) { actionBar.setTitle(getString(R.string.default_display_name_for_root_folder)); } @@ -1467,7 +1519,7 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { // a new chance to get the mDownloadBinder through getFileDownloadBinder() - THIS IS A MESS OCFileListFragment listOfFiles = getListOfFilesFragment(); if (listOfFiles != null) { - listOfFiles.listDirectory(); + listOfFiles.listDirectory(MainApp.getOnlyOnDevice()); } FileFragment secondFragment = getSecondFragment(); if (secondFragment != null && secondFragment instanceof FileDetailFragment) { @@ -1951,21 +2003,14 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { private void sortByName(boolean ascending){ getListOfFilesFragment().sortByName(ascending); } + + public void restart(){ + Intent i = new Intent(this, FileDisplayActivity.class); + i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(i); + } - /** - * Get the file extension if it is on path as type "content://.../DocInfo.doc" - * @param filepath: Content Uri converted to string format - * @return String: fileExtension (type '.pdf'). Empty if no extension - */ - private String getComposedFileExtension(String filepath) { - String fileExtension = ""; - String fileNameInContentUri = filepath.substring(filepath.lastIndexOf("/")); - - // Check if extension is included in uri - int pos = fileNameInContentUri.lastIndexOf('.'); - if (pos >= 0) { - fileExtension = fileNameInContentUri.substring(pos); - } - return fileExtension; + public void closeDrawer() { + mDrawerLayout.closeDrawers(); } }