From: David A. Velasco Date: Wed, 22 Apr 2015 07:35:37 +0000 (+0200) Subject: Merge branch 'develop' into loging_different_servers_same_pattern X-Git-Tag: test~30^2~2 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/968c535e19e40bee7df8609fd050bc2196ca95e6?hp=70759950ba3e0ad62416283d94ae8eed14271e9c Merge branch 'develop' into loging_different_servers_same_pattern Conflicts SOLVED in: src/com/owncloud/android/ui/activity/FileActivity.java --- diff --git a/res/values-bg-rBG/strings.xml b/res/values-bg-rBG/strings.xml index 49fe7544..335db5be 100644 --- a/res/values-bg-rBG/strings.xml +++ b/res/values-bg-rBG/strings.xml @@ -261,6 +261,8 @@ Настъпи грешка при опита за споделяне на този файл или папка. Неуспешен опит за прекратяване на споделянето. Моля, провери дали файла съществува. Настъпи грешка при опита за премахване на споделянето на този файл или папка. + Въведи Парола + Вие трябва да въведете парола Изпращане Копиране на връзката Копирана @@ -300,5 +302,7 @@ Сигурност Качване на видео път Свалянето на директорията %1$s не може да бъде завършено + %1$s споделено \"%2$s\" с теб + Обнови връзката Адрес на сървъра diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml index b3ad7dd8..d7fa6ac8 100644 --- a/res/values-et-rEE/strings.xml +++ b/res/values-et-rEE/strings.xml @@ -165,6 +165,7 @@ Allpool on loend kohalikest failidest ning serveris asuvatest failidest %5$s, mi Võrguühendust pole Turvaline ühendus pole saadaval Saadi ühendus + Ühenduse testimine Vigases vormingus server seadistus Sama konto kasutaja ja server on juba selles seadmes olemas Sisestatud kasutaja ei kattu selle konto kasutajaga @@ -191,6 +192,7 @@ Allpool on loend kohalikest failidest ning serveris asuvatest failidest %5$s, mi Server ei tagasta korrektset kasutaja ID-d. Palun kontakteeru administraatoriga. ⇥ Ei suuda autoriseerida selle serveriga. + Kontot pole veel seadmes Hoia faili ajakohasena Nimeta ümber Eemalda @@ -264,6 +266,8 @@ Allpool on loend kohalikest failidest ning serveris asuvatest failidest %5$s, mi Faili või kausta jagamisel esines viga Liigutamise lõpetamine ebaõnnestus. Palun kontrolli, kas fail on olemas Faili või kausta jagamise tühistamisel esines viga + Sisesta parool + Sa pead parooli sisestama Saada Kopeeri link Kopeeritud lõikepuhvrisse @@ -286,6 +290,9 @@ Allpool on loend kohalikest failidest ning serveris asuvatest failidest %5$s, mi Turvaline ühendus suunatakse läbi turvamata ühenduse. Logid Saada ajalugu + Logide saatmise rakendust ei leitud. Paigalda postirakendus! + %1$s Androidi rakenduse logid + Andmete laadimine... Autentimine on vajalik Vale parool Tõsta ümber @@ -298,5 +305,9 @@ Allpool on loend kohalikest failidest ning serveris asuvatest failidest %5$s, mi selle faili liigutamiseks Kohesed üleslaadimised Turvalisus + Video üleslaadimise asukoht + Kausta %1$s allalaadimine ei õnnestunud + %1$s jagas sinuga \"%2$s\" + Värskenda ühendust Serveri aadress diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 5179fbbe..e673ba2f 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -37,7 +37,7 @@ Aide Recommander à un ami Commentaires - Empreinte + Mentions légales Mémoriser l\'emplacement de partage Mémoriser le dernier emplacement de téléversement Essayez %1$s sur votre smartphone ! diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 055fa978..72ead355 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -161,6 +161,7 @@ 沒有網際網路連線 安全連線不可用。 連線已建立 + 測試連線 伺服器設定有問題 已經有相同使用者與伺服器的帳號存在於這個裝置 輸入的使用者與這個帳戶的使用者不一致 @@ -187,6 +188,7 @@ 你的伺服器並沒有傳回正確的使用者 ID, 請聯絡伺服器的管理員 無法在這個伺服器上取得認證 + 帳號目前不存在於本裝置 讓檔案保持最新的 重新命名 移除 @@ -260,6 +262,8 @@ 在分享檔案或目錄時發生了錯誤 無法取消分享這個檔案或目錄. 請檢查它們是否存在 在取消分享檔案或目錄時發生了錯誤 + 輸入密碼 + 您必須輸入密碼 寄出 複製連結 複製至剪貼簿中 @@ -299,5 +303,7 @@ 安全性 影片上傳路徑 %1$s 目錄的下載未完成 + %1$s 分享了 \"%2$s\" 給您 + 重新連線 伺服器位址 diff --git a/src/com/owncloud/android/ui/activity/FileActivity.java b/src/com/owncloud/android/ui/activity/FileActivity.java index e3af8368..17aa8c04 100644 --- a/src/com/owncloud/android/ui/activity/FileActivity.java +++ b/src/com/owncloud/android/ui/activity/FileActivity.java @@ -169,6 +169,16 @@ public class FileActivity extends SherlockFragmentActivity } + @Override + protected void onNewIntent (Intent intent) { + Log_OC.v(TAG, "onNewIntent() start"); + Account current = AccountUtils.getCurrentOwnCloudAccount(this); + if (current != null && mAccount != null && !mAccount.name.equals(current.name)) { + mAccount = current; + } + Log_OC.v(TAG, "onNewIntent() stop"); + } + /** * Since ownCloud {@link Account}s can be managed from the system setting menu, * the existence of the {@link Account} associated to the instance must be checked @@ -176,46 +186,54 @@ public class FileActivity extends SherlockFragmentActivity */ @Override protected void onRestart() { + Log_OC.v(TAG, "onRestart() start"); super.onRestart(); - boolean validAccount = (mAccount != null && AccountUtils.setCurrentOwnCloudAccount(getApplicationContext(), mAccount.name)); + boolean validAccount = (mAccount != null && AccountUtils.exists(mAccount, this)); if (!validAccount) { swapToDefaultAccount(); } + Log_OC.v(TAG, "onRestart() end"); } @Override protected void onStart() { + Log_OC.v(TAG, "onStart() start"); super.onStart(); if (mAccountWasSet) { onAccountSet(mAccountWasRestored); } + Log_OC.v(TAG, "onStart() end"); } @Override protected void onResume() { + Log_OC.v(TAG, "onResume() start"); super.onResume(); if (mOperationsServiceBinder != null) { doOnResumeAndBound(); } - + Log_OC.v(TAG, "onResume() end"); } @Override protected void onPause() { - + Log_OC.v(TAG, "onPause() start"); + if (mOperationsServiceBinder != null) { mOperationsServiceBinder.removeOperationListener(this); } super.onPause(); + Log_OC.v(TAG, "onPause() end"); } @Override protected void onDestroy() { + Log_OC.v(TAG, "onDestroy() start"); if (mOperationsServiceConnection != null) { unbindService(mOperationsServiceConnection); mOperationsServiceBinder = null; @@ -230,6 +248,7 @@ public class FileActivity extends SherlockFragmentActivity } super.onDestroy(); + Log_OC.v(TAG, "onDestroy() end"); } @@ -245,7 +264,8 @@ public class FileActivity extends SherlockFragmentActivity */ protected void setAccount(Account account, boolean savedAccount) { Account oldAccount = mAccount; - boolean validAccount = (account != null && AccountUtils.setCurrentOwnCloudAccount(getApplicationContext(), account.name)); + boolean validAccount = + (account != null && AccountUtils.setCurrentOwnCloudAccount(getApplicationContext(), account.name)); if (validAccount) { mAccount = account; mAccountWasSet = true; @@ -546,7 +566,9 @@ public class FileActivity extends SherlockFragmentActivity } } - private void onSynchronizeFolderOperationFinish(SynchronizeFolderOperation operation, RemoteOperationResult result) { + private void onSynchronizeFolderOperationFinish( + SynchronizeFolderOperation operation, RemoteOperationResult result + ) { if (!result.isSuccess() && result.getCode() != ResultCode.CANCELLED){ Toast t = Toast.makeText(this, ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()), Toast.LENGTH_LONG); diff --git a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java index 3ea6822b..83a49024 100644 --- a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -29,12 +29,9 @@ import android.accounts.AccountManager; import android.accounts.AuthenticatorException; import android.annotation.TargetApi; import android.app.AlertDialog; -import android.app.Dialog; -import android.app.ProgressDialog; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.ContentResolver; -import android.content.ContentUris; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; @@ -47,16 +44,12 @@ import android.database.Cursor; import android.net.Uri; import android.os.Build; import android.os.Bundle; -import android.os.Environment; import android.os.IBinder; import android.preference.PreferenceManager; -import android.provider.DocumentsContract; -import android.provider.MediaStore; import android.provider.OpenableColumns; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; -import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; @@ -97,9 +90,11 @@ import com.owncloud.android.operations.RefreshFolderOperation; import com.owncloud.android.operations.UnshareLinkOperation; import com.owncloud.android.services.observer.FileObserverService; import com.owncloud.android.syncadapter.FileSyncAdapter; +import com.owncloud.android.ui.dialog.ConfirmationDialogFragment; import com.owncloud.android.ui.dialog.CreateFolderDialogFragment; import com.owncloud.android.ui.dialog.SslUntrustedCertDialog; import com.owncloud.android.ui.dialog.SslUntrustedCertDialog.OnSslUntrustedCertListener; +import com.owncloud.android.ui.dialog.UploadSourceDialogFragment; import com.owncloud.android.ui.fragment.FileDetailFragment; import com.owncloud.android.ui.fragment.FileFragment; import com.owncloud.android.ui.fragment.OCFileListFragment; @@ -136,14 +131,10 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { private static final String KEY_SYNC_IN_PROGRESS = "SYNC_IN_PROGRESS"; private static final String KEY_WAITING_TO_SEND = "WAITING_TO_SEND"; - public static final int DIALOG_SHORT_WAIT = 0; - private static final int DIALOG_CHOOSE_UPLOAD_SOURCE = 1; - private static final int DIALOG_CERT_NOT_SAVED = 2; - public static final String ACTION_DETAILS = "com.owncloud.android.ui.activity.action.DETAILS"; - private static final int ACTION_SELECT_CONTENT_FROM_APPS = 1; - private static final int ACTION_SELECT_MULTIPLE_FILES = 2; + public static final int ACTION_SELECT_CONTENT_FROM_APPS = 1; + public static final int ACTION_SELECT_MULTIPLE_FILES = 2; public static final int ACTION_MOVE_FILES = 3; private static final String TAG = FileDisplayActivity.class.getSimpleName(); @@ -155,8 +146,12 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { private boolean mSyncInProgress = false; - private String DIALOG_UNTRUSTED_CERT; - + private static String DIALOG_UNTRUSTED_CERT = "DIALOG_UNTRUSTED_CERT"; + private static String DIALOG_CREATE_FOLDER = "DIALOG_CREATE_FOLDER"; + private static String DIALOG_UPLOAD_SOURCE = "DIALOG_UPLOAD_SOURCE"; + private static String DIALOG_CERT_NOT_SAVED = "DIALOG_CERT_NOT_SAVED"; + + private OCFile mWaitingToSend; @Override @@ -214,13 +209,17 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { @Override protected void onStart() { + Log_OC.d(TAG, "onStart() start"); super.onStart(); getSupportActionBar().setIcon(DisplayUtils.getSeasonalIconId()); + Log_OC.d(TAG, "onStart() end"); } @Override protected void onDestroy() { + Log_OC.d(TAG, "onDestroy() start"); super.onDestroy(); + Log_OC.d(TAG, "onDestroy() end"); } /** @@ -478,9 +477,8 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { boolean retval = true; switch (item.getItemId()) { case R.id.action_create_dir: { - CreateFolderDialogFragment dialog = - CreateFolderDialogFragment.newInstance(getCurrentDir()); - dialog.show(getSupportFragmentManager(), "createdirdialog"); + CreateFolderDialogFragment dialog = CreateFolderDialogFragment.newInstance(getCurrentDir()); + dialog.show(getSupportFragmentManager(), DIALOG_CREATE_FOLDER); break; } case R.id.action_sync_account: { @@ -488,7 +486,9 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { break; } case R.id.action_upload: { - showDialog(DIALOG_CHOOSE_UPLOAD_SOURCE); + UploadSourceDialogFragment dialog = UploadSourceDialogFragment.newInstance(getAccount()); + dialog.show(getSupportFragmentManager(), DIALOG_UPLOAD_SOURCE); + break; } case R.id.action_settings: { @@ -608,8 +608,8 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { * */ @TargetApi(Build.VERSION_CODES.JELLY_BEAN) + @Override 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)) { //getClipData is only supported on api level 16+, Jelly Bean @@ -638,7 +638,11 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { }, DELAY_TO_REQUEST_OPERATION_ON_ACTIVITY_RESULTS ); + + } else { + super.onActivityResult(requestCode, resultCode, data); } + } private void requestMultipleUpload(Intent data, int resultCode) { @@ -675,7 +679,7 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { private void requestSimpleUpload(Intent data, int resultCode) { - String filepath = null; + String filePath = null; String mimeType = null; Uri selectedImageUri = data.getData(); @@ -683,67 +687,60 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { try { mimeType = getContentResolver().getType(selectedImageUri); - String filemanagerstring = selectedImageUri.getPath(); - String selectedImagePath = getPath(selectedImageUri); + String fileManagerString = selectedImageUri.getPath(); + String selectedImagePath = UriUtils.getLocalPath(selectedImageUri, this); if (selectedImagePath != null) - filepath = selectedImagePath; + filePath = selectedImagePath; else - filepath = filemanagerstring; + filePath = fileManagerString; } catch (Exception e) { Log_OC.e(TAG, "Unexpected exception when trying to read the result of Intent.ACTION_GET_CONTENT", e); - e.printStackTrace(); } finally { - if (filepath == null) { + if (filePath == null) { Log_OC.e(TAG, "Couldn't resolve path to file"); - Toast t = Toast.makeText(this, getString(R.string.filedisplay_unexpected_bad_get_content), Toast.LENGTH_LONG); + Toast t = Toast.makeText( + this, getString(R.string.filedisplay_unexpected_bad_get_content), Toast.LENGTH_LONG + ); t.show(); return; } } Intent i = new Intent(this, FileUploader.class); - i.putExtra(FileUploader.KEY_ACCOUNT, - getAccount()); - String remotepath = new String(); - for (int j = mDirectories.getCount() - 2; j >= 0; --j) { - remotepath += OCFile.PATH_SEPARATOR + mDirectories.getItem(j); - } - if (!remotepath.endsWith(OCFile.PATH_SEPARATOR)) - remotepath += OCFile.PATH_SEPARATOR; - - if (filepath.startsWith(UriUtils.URI_CONTENT_SCHEME)) { - - Cursor cursor = MainApp.getAppContext().getContentResolver() - .query(Uri.parse(filepath), null, null, null, null, null); + i.putExtra(FileUploader.KEY_ACCOUNT, getAccount()); + OCFile currentDir = getCurrentDir(); + String remotePath = (currentDir != null) ? currentDir.getRemotePath() : OCFile.ROOT_PATH; + if (filePath.startsWith(UriUtils.URI_CONTENT_SCHEME)) { + Cursor cursor = getContentResolver().query(Uri.parse(filePath), null, null, null, null); try { if (cursor != null && cursor.moveToFirst()) { - String displayName = cursor.getString( - cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); - Log.i(TAG, "Display Name: " + displayName + "; mimeType: " + mimeType); + String displayName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); + Log_OC.v(TAG, "Display Name: " + displayName ); displayName.replace(File.separatorChar, '_'); displayName.replace(File.pathSeparatorChar, '_'); - remotepath += displayName + DisplayUtils.getComposedFileExtension(filepath); + remotePath += displayName + DisplayUtils.getComposedFileExtension(filePath); } + // and what happens in case of error?; wrong target name for the upload } finally { cursor.close(); } } else { - remotepath += new File(filepath).getName(); + remotePath += new File(filePath).getName(); } - i.putExtra(FileUploader.KEY_LOCAL_FILE, filepath); - i.putExtra(FileUploader.KEY_REMOTE_FILE, remotepath); + i.putExtra(FileUploader.KEY_LOCAL_FILE, filePath); + i.putExtra(FileUploader.KEY_REMOTE_FILE, remotePath); i.putExtra(FileUploader.KEY_MIME_TYPE, mimeType); i.putExtra(FileUploader.KEY_UPLOAD_TYPE, FileUploader.UPLOAD_SINGLE_FILE); if (resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE) - i.putExtra(FileUploader.KEY_LOCAL_BEHAVIOUR, FileUploader.LOCAL_BEHAVIOUR_MOVE); + i.putExtra(FileUploader.KEY_LOCAL_BEHAVIOUR, FileUploader.LOCAL_BEHAVIOUR_MOVE); startService(i); } @@ -798,9 +795,9 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { @Override protected void onResume() { - super.onResume(); Log_OC.d(TAG, "onResume() start"); - + super.onResume(); + // refresh list of files refreshListOfFilesFragment(); @@ -847,148 +844,8 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { } - Log_OC.d(TAG, "onPause() end"); super.onPause(); - } - - - @Override - protected Dialog onCreateDialog(int id) { - Dialog dialog = null; - AlertDialog.Builder builder; - switch (id) { - case DIALOG_SHORT_WAIT: { - ProgressDialog working_dialog = new ProgressDialog(this); - working_dialog.setMessage(getResources().getString( - R.string.wait_a_moment)); - working_dialog.setIndeterminate(true); - working_dialog.setCancelable(false); - dialog = working_dialog; - break; - } - case DIALOG_CHOOSE_UPLOAD_SOURCE: { - - - String[] allTheItems = { getString(R.string.actionbar_upload_files), - getString(R.string.actionbar_upload_from_apps) }; - - builder = new AlertDialog.Builder(this); - builder.setTitle(R.string.actionbar_upload); - builder.setItems(allTheItems, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int item) { - if (item == 0) { - // if (!mDualPane) { - Intent action = new Intent(FileDisplayActivity.this, UploadFilesActivity.class); - action.putExtra(UploadFilesActivity.EXTRA_ACCOUNT, FileDisplayActivity.this.getAccount()); - startActivityForResult(action, ACTION_SELECT_MULTIPLE_FILES); - // } else { - // TODO create and handle new fragment - // LocalFileListFragment - // } - } 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); - } - } - }); - dialog = builder.create(); - break; - } - case DIALOG_CERT_NOT_SAVED: { - builder = new AlertDialog.Builder(this); - builder.setMessage(getResources().getString(R.string.ssl_validator_not_saved)); - builder.setCancelable(false); - builder.setPositiveButton(R.string.common_ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - }; - }); - dialog = builder.create(); - break; - } - default: - dialog = null; - } - - return dialog; - } - - /** - * Translates a content URI of an content to a physical path on the disk - * - * @param uri The URI to resolve - * @return The path to the content or null if it could not be found - */ - public String getPath(Uri uri) { - final boolean isKitKatOrLater = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; - - // DocumentProvider - if (isKitKatOrLater && DocumentsContract.isDocumentUri(getApplicationContext(), uri)) { - // ExternalStorageProvider - if (UriUtils.isExternalStorageDocument(uri)) { - final String docId = DocumentsContract.getDocumentId(uri); - final String[] split = docId.split(":"); - final String type = split[0]; - - if ("primary".equalsIgnoreCase(type)) { - return Environment.getExternalStorageDirectory() + "/" + split[1]; - } - } - // DownloadsProvider - 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 UriUtils.getDataColumn(getApplicationContext(), contentUri, null, null); - } - // MediaProvider - else if (UriUtils.isMediaDocument(uri)) { - final String docId = DocumentsContract.getDocumentId(uri); - final String[] split = docId.split(":"); - final String type = split[0]; - - Uri contentUri = null; - if ("image".equals(type)) { - contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; - } else if ("video".equals(type)) { - contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; - } else if ("audio".equals(type)) { - contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; - } - - final String selection = "_id=?"; - final String[] selectionArgs = new String[] { split[1] }; - - return UriUtils.getDataColumn(getApplicationContext(), contentUri, selection, selectionArgs); - } - // Documents providers returned as content://... - else if (UriUtils.isContentDocument(uri)) { - return uri.toString(); - } - } - // MediaStore (and general) - else if ("content".equalsIgnoreCase(uri.getScheme())) { - - // Return the remote address - if (UriUtils.isGooglePhotosUri(uri)) - return uri.getLastPathSegment(); - - return UriUtils.getDataColumn(getApplicationContext(), uri, null, null); - } - // File - else if ("file".equalsIgnoreCase(uri.getScheme())) { - return uri.getPath(); - } - return null; + Log_OC.d(TAG, "onPause() end"); } /** @@ -1492,7 +1349,10 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { @Override public void onFailedSavingCertificate() { - showDialog(DIALOG_CERT_NOT_SAVED); + ConfirmationDialogFragment dialog = ConfirmationDialogFragment.newInstance( + R.string.ssl_validator_not_saved, new String[]{}, R.string.common_ok, -1, -1 + ); + dialog.show(getSupportFragmentManager(), DIALOG_CERT_NOT_SAVED); } @Override @@ -1932,4 +1792,5 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { private void sortByName(boolean ascending){ getListOfFilesFragment().sortByName(ascending); } + } diff --git a/src/com/owncloud/android/ui/activity/Preferences.java b/src/com/owncloud/android/ui/activity/Preferences.java index 5585024d..70ca9dee 100644 --- a/src/com/owncloud/android/ui/activity/Preferences.java +++ b/src/com/owncloud/android/ui/activity/Preferences.java @@ -616,6 +616,7 @@ public class Preferences extends SherlockPreferenceActivity FileDisplayActivity.class ); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(i); } else { finish(); diff --git a/src/com/owncloud/android/ui/activity/UploadFilesActivity.java b/src/com/owncloud/android/ui/activity/UploadFilesActivity.java index 7563ea66..fce4ddce 100644 --- a/src/com/owncloud/android/ui/activity/UploadFilesActivity.java +++ b/src/com/owncloud/android/ui/activity/UploadFilesActivity.java @@ -64,11 +64,13 @@ public class UploadFilesActivity extends FileActivity implements private Account mAccountOnCreation; private DialogFragment mCurrentDialog; - public static final String EXTRA_CHOSEN_FILES = UploadFilesActivity.class.getCanonicalName() + ".EXTRA_CHOSEN_FILES"; + public static final String EXTRA_CHOSEN_FILES = + UploadFilesActivity.class.getCanonicalName() + ".EXTRA_CHOSEN_FILES"; public static final int RESULT_OK_AND_MOVE = RESULT_FIRST_USER; - private static final String KEY_DIRECTORY_PATH = UploadFilesActivity.class.getCanonicalName() + ".KEY_DIRECTORY_PATH"; + private static final String KEY_DIRECTORY_PATH = + UploadFilesActivity.class.getCanonicalName() + ".KEY_DIRECTORY_PATH"; private static final String TAG = "UploadFilesActivity"; private static final String WAIT_DIALOG_TAG = "WAIT"; private static final String QUERY_TO_MOVE_DIALOG_TAG = "QUERY_TO_MOVE"; @@ -180,7 +182,8 @@ public class UploadFilesActivity extends FileActivity implements @Override protected void onSaveInstanceState(Bundle outState) { - // responsibility of restore is preferred in onCreate() before than in onRestoreInstanceState when there are Fragments involved + // responsibility of restore is preferred in onCreate() before than in + // onRestoreInstanceState when there are Fragments involved Log_OC.d(TAG, "onSaveInstanceState() start"); super.onSaveInstanceState(outState); outState.putString(UploadFilesActivity.KEY_DIRECTORY_PATH, mCurrentDir.getAbsolutePath()); @@ -317,7 +320,7 @@ public class UploadFilesActivity extends FileActivity implements File localFile = new File(localPath); total += localFile.length(); } - return (FileStorageUtils.getUsableSpace(mAccountOnCreation.name) >= total); + return (new Boolean(FileStorageUtils.getUsableSpace(mAccountOnCreation.name) >= total)); } /** @@ -341,9 +344,12 @@ public class UploadFilesActivity extends FileActivity implements finish(); } else { - // show a dialog to query the user if wants to move the selected files to the ownCloud folder instead of copying + // show a dialog to query the user if wants to move the selected files + // to the ownCloud folder instead of copying String[] args = {getString(R.string.app_name)}; - ConfirmationDialogFragment dialog = ConfirmationDialogFragment.newInstance(R.string.upload_query_move_foreign_files, args, R.string.common_yes, -1, R.string.common_no); + ConfirmationDialogFragment dialog = ConfirmationDialogFragment.newInstance( + R.string.upload_query_move_foreign_files, args, R.string.common_yes, -1, R.string.common_no + ); dialog.setOnConfirmationListener(UploadFilesActivity.this); dialog.show(getSupportFragmentManager(), QUERY_TO_MOVE_DIALOG_TAG); } @@ -354,7 +360,8 @@ public class UploadFilesActivity extends FileActivity implements public void onConfirmation(String callerTag) { Log_OC.d(TAG, "Positive button in dialog was clicked; dialog tag is " + callerTag); if (callerTag.equals(QUERY_TO_MOVE_DIALOG_TAG)) { - // return the list of selected files to the caller activity (success), signaling that they should be moved to the ownCloud folder, instead of copied + // return the list of selected files to the caller activity (success), + // signaling that they should be moved to the ownCloud folder, instead of copied Intent data = new Intent(); data.putExtra(EXTRA_CHOSEN_FILES, mFileListFragment.getCheckedFilePaths()); setResult(RESULT_OK_AND_MOVE, data); diff --git a/src/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java b/src/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java index 29ed3908..48aabe5c 100644 --- a/src/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java +++ b/src/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java @@ -93,7 +93,9 @@ public class ConfirmationDialogFragment extends SherlockDialogFragment { builder.setPositiveButton(posBtn, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { - mListener.onConfirmation(getTag()); + if (mListener != null) { + mListener.onConfirmation(getTag()); + } dialog.dismiss(); } }); @@ -101,7 +103,9 @@ public class ConfirmationDialogFragment extends SherlockDialogFragment { builder.setNeutralButton(neuBtn, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { - mListener.onNeutral(getTag()); + if (mListener != null) { + mListener.onNeutral(getTag()); + } dialog.dismiss(); } }); @@ -110,7 +114,9 @@ public class ConfirmationDialogFragment extends SherlockDialogFragment { new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - mListener.onCancel(getTag()); + if (mListener != null) { + mListener.onCancel(getTag()); + } dialog.dismiss(); } }); diff --git a/src/com/owncloud/android/ui/dialog/UploadSourceDialogFragment.java b/src/com/owncloud/android/ui/dialog/UploadSourceDialogFragment.java new file mode 100644 index 00000000..2f6eeadf --- /dev/null +++ b/src/com/owncloud/android/ui/dialog/UploadSourceDialogFragment.java @@ -0,0 +1,104 @@ +/** + * ownCloud Android client application + * + * @author David A. Velasco + * Copyright (C) 2015 ownCloud Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.owncloud.android.ui.dialog; + +import android.accounts.Account; +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; + +import com.actionbarsherlock.app.SherlockDialogFragment; +import com.owncloud.android.R; +import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.ui.activity.FileActivity; +import com.owncloud.android.ui.activity.UploadFilesActivity; + + +/** + * Dialog showing two options to allow the user upload files from the filesystem or from other apps. + * + * Assumes that its parent activity extends {@link FileActivity} + */ +public class UploadSourceDialogFragment extends SherlockDialogFragment { + + private final static String TAG = UploadSourceDialogFragment.class.getSimpleName(); + private final static String ARG_ACCOUNT = UploadSourceDialogFragment.class.getSimpleName() + ".ARG_ACCOUNT"; + + public static final int ACTION_SELECT_CONTENT_FROM_APPS = 1; + public static final int ACTION_SELECT_MULTIPLE_FILES = 2; + + public static UploadSourceDialogFragment newInstance(Account account) { + UploadSourceDialogFragment f = new UploadSourceDialogFragment(); + Bundle args = new Bundle(); + args.putParcelable(ARG_ACCOUNT, account); + f.setArguments(args); + return f; + } + + public UploadSourceDialogFragment() { + super(); + Log_OC.v(TAG, "constructor"); + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + + String[] allTheItems = { + getString(R.string.actionbar_upload_files), + getString(R.string.actionbar_upload_from_apps) + }; + + AlertDialog.Builder builder = new AlertDialog.Builder(getSherlockActivity()); + builder.setTitle(R.string.actionbar_upload); + builder.setItems(allTheItems, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int item) { + if (item == 0) { + Intent action = new Intent(getSherlockActivity(), UploadFilesActivity.class); + action.putExtra( + UploadFilesActivity.EXTRA_ACCOUNT, + ((FileActivity)getSherlockActivity()).getAccount() + ); + //startActivityForResult(action, ACTION_SELECT_MULTIPLE_FILES); // this flow seems broken; + // Actionbarsherlock, maybe? + getSherlockActivity().startActivityForResult(action, ACTION_SELECT_MULTIPLE_FILES); + + } 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( // this flow seems broken; + // Actionbarsherlock, maybe? + getSherlockActivity().startActivityForResult( + Intent.createChooser(action, getString(R.string.upload_chooser_title)), + ACTION_SELECT_CONTENT_FROM_APPS + ); + } + } + }); + return builder.create(); + } + +} diff --git a/src/com/owncloud/android/utils/UriUtils.java b/src/com/owncloud/android/utils/UriUtils.java index 8070e360..2972ee55 100644 --- a/src/com/owncloud/android/utils/UriUtils.java +++ b/src/com/owncloud/android/utils/UriUtils.java @@ -19,16 +19,30 @@ package com.owncloud.android.utils; +import android.annotation.TargetApi; +import android.content.ContentUris; import android.content.Context; import android.database.Cursor; import android.net.Uri; +import android.os.Build; +import android.os.Environment; +import android.provider.DocumentsContract; +import android.provider.MediaStore; +import android.provider.OpenableColumns; + +import com.owncloud.android.MainApp; +import com.owncloud.android.lib.common.utils.Log_OC; + +import java.io.File; /** * A helper class for some Uri operations. */ public class UriUtils { - + + public static final String TAG = UriUtils.class.getSimpleName(); + public static final String URI_CONTENT_SCHEME = "content://"; @@ -102,4 +116,78 @@ public class UriUtils { public static boolean isContentDocument(Uri uri) { return uri.toString().startsWith(URI_CONTENT_SCHEME); } + + + /** + * Translates a content:// URI referred to a local file file to a path on the local filesystem + * + * @param uri The URI to resolve + * @return The path in the file system to the content or null if it could not be found (not a file) + */ + @TargetApi(Build.VERSION_CODES.KITKAT) + public static String getLocalPath(Uri uri, Context context) { + final boolean isKitKatOrLater = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; + + // DocumentProvider + if (isKitKatOrLater && DocumentsContract.isDocumentUri(context, uri)) { + // ExternalStorageProvider + if (UriUtils.isExternalStorageDocument(uri)) { + final String docId = DocumentsContract.getDocumentId(uri); + final String[] split = docId.split(":"); + final String type = split[0]; + + if ("primary".equalsIgnoreCase(type)) { + return Environment.getExternalStorageDirectory() + "/" + split[1]; + } + } + // DownloadsProvider + 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 UriUtils.getDataColumn(context, contentUri, null, null); + } + // MediaProvider + else if (UriUtils.isMediaDocument(uri)) { + final String docId = DocumentsContract.getDocumentId(uri); + final String[] split = docId.split(":"); + final String type = split[0]; + + Uri contentUri = null; + if ("image".equals(type)) { + contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; + } else if ("video".equals(type)) { + contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; + } else if ("audio".equals(type)) { + contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; + } + + final String selection = "_id=?"; + final String[] selectionArgs = new String[] { split[1] }; + + return UriUtils.getDataColumn(context, contentUri, selection, selectionArgs); + } + // Documents providers returned as content://... + else if (UriUtils.isContentDocument(uri)) { + return uri.toString(); + } + } + // MediaStore (and general) + else if ("content".equalsIgnoreCase(uri.getScheme())) { + + // Return the remote address + if (UriUtils.isGooglePhotosUri(uri)) + return uri.getLastPathSegment(); + + return UriUtils.getDataColumn(context, uri, null, null); + } + // File + else if ("file".equalsIgnoreCase(uri.getScheme())) { + return uri.getPath(); + } + return null; + } + }