-->\r
<manifest package="eu.alefzero.owncloud"\r
android:versionCode="1"\r
- android:versionName="0.1.134B" xmlns:android="http://schemas.android.com/apk/res/android">\r
+ android:versionName="0.1.140B" xmlns:android="http://schemas.android.com/apk/res/android">\r
\r
<uses-permission android:name="android.permission.GET_ACCOUNTS" />\r
<uses-permission android:name="android.permission.USE_CREDENTIALS" />\r
android:layout_height="match_parent"
android:layout_margin="7dp"
android:layout_weight="1"
- android:src="@drawable/logo_inverted" />
+ android:src="@drawable/owncloud_logo" />
<LinearLayout
android:id="@+id/LinearLayout1"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:layout_weight="1"
- android:src="@drawable/logo_inverted" />
+ android:src="@drawable/owncloud_logo" />
<FrameLayout
android:layout_width="match_parent"
<string name="uploader_info_dirname">Directory name</string>
<string name="uploader_upload_succeed">Uploading completed successfully</string>
<string name="uploader_upload_failed">Upload failed: </string>
+ <string name="uploader_files_uploaded_suffix"> files uploaded</string>
<string name="common_choose_account">Choose account</string>
<string name="sync_string_contacts">Contacts</string>
<string name="use_ssl">Use Secure Connection</string>
return defaultAccount;\r
}\r
\r
+ \r
+\r
+ /**\r
+ * Checks, whether or not there are any ownCloud accounts setup.\r
+ * \r
+ * @return true, if there is at least one account.\r
+ */\r
+ public static boolean accountsAreSetup(Context context) {\r
+ AccountManager accMan = AccountManager.get(context);\r
+ Account[] accounts = accMan\r
+ .getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE);\r
+ return accounts.length > 0;\r
+ }\r
+ \r
+ \r
public static void setCurrentOwnCloudAccount(Context context, String name) {\r
SharedPreferences.Editor appPrefs = PreferenceManager\r
.getDefaultSharedPreferences(context).edit();\r
Intent upload_intent = new Intent(context, InstantUploadService.class);
Account account = new Account(account_name, AccountAuthenticator.ACCOUNT_TYPE);
- String mimeType = MimeTypeMap.getSingleton()
- .getMimeTypeFromExtension(
- f.getName().substring(f.getName().lastIndexOf('.') + 1));
+ String mimeType;
+ try {
+ mimeType = MimeTypeMap.getSingleton()
+ .getMimeTypeFromExtension(
+ f.getName().substring(f.getName().lastIndexOf('.') + 1));
+
+ } catch (IndexOutOfBoundsException e) {
+ Log.e(TAG, "Trying to find out MIME type of a file without extension: " + f.getName());
+ mimeType = "application/octet-stream";
+ }
upload_intent.putExtra(InstantUploadService.KEY_ACCOUNT, account);
upload_intent.putExtra(InstantUploadService.KEY_FILE_PATH, file_path);
package eu.alefzero.owncloud.files.services;
import java.io.File;
+import java.util.List;
import eu.alefzero.owncloud.AccountUtils;
import eu.alefzero.owncloud.R;
import eu.alefzero.owncloud.datamodel.OCFile;
import eu.alefzero.owncloud.files.interfaces.OnDatatransferProgressListener;
import eu.alefzero.owncloud.utils.OwnCloudVersion;
-import eu.alefzero.webdav.OnUploadProgressListener;
import eu.alefzero.webdav.WebdavClient;
import android.accounts.Account;
import android.accounts.AccountManager;
public class FileUploader extends Service implements OnDatatransferProgressListener {
+ public static final String UPLOAD_FINISH_MESSAGE = "UPLOAD_FINISH";
+ public static final String EXTRA_PARENT_DIR_ID = "PARENT_DIR_ID";
+
public static final String KEY_LOCAL_FILE = "LOCAL_FILE";
public static final String KEY_REMOTE_FILE = "REMOTE_FILE";
public static final String KEY_ACCOUNT = "ACCOUNT";
private AccountManager mAccountManager;
private Account mAccount;
private String[] mLocalPaths, mRemotePaths;
- private boolean mResult;
private int mUploadType;
private Notification mNotification;
private int mTotalDataToSend, mSendData;
private int mCurrentIndexUpload, mPreviousPercent;
+ private int mSuccessCounter;
@Override
public IBinder onBind(Intent arg0) {
}
public void run() {
- if (mResult) {
- Toast.makeText(this, "Upload successfull", Toast.LENGTH_SHORT)
- .show();
+ String message;
+ if (mSuccessCounter == mLocalPaths.length) {
+ message = getString(R.string.uploader_upload_succeed);
} else {
+ message = getString(R.string.uploader_upload_failed);
+ if (mLocalPaths.length > 1)
+ message += " (" + mSuccessCounter + " / " + mLocalPaths.length + getString(R.string.uploader_files_uploaded_suffix) + ")";
Toast.makeText(this, "Upload could not be completed", Toast.LENGTH_SHORT).show();
}
+ Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
public void uploadFile() {
Log.d(TAG, "Will upload " + mTotalDataToSend + " bytes, with " + mLocalPaths.length + " files");
+ mSuccessCounter = 0;
+
for (int i = 0; i < mLocalPaths.length; ++i) {
- String mimeType = MimeTypeMap.getSingleton()
- .getMimeTypeFromExtension(
- mLocalPaths[i].substring(mLocalPaths[i]
+
+ String mimeType;
+ try {
+ mimeType = MimeTypeMap.getSingleton()
+ .getMimeTypeFromExtension(
+ mLocalPaths[i].substring(mLocalPaths[i]
.lastIndexOf('.') + 1));
- mResult = false;
+ } catch (IndexOutOfBoundsException e) {
+ Log.e(TAG, "Trying to find out MIME type of a file without extension: " + mLocalPaths[i]);
+ mimeType = "application/octet-stream";
+ }
+
mCurrentIndexUpload = i;
if (wc.putFile(mLocalPaths[i], mRemotePaths[i], mimeType)) {
- mResult |= true;
+ mSuccessCounter++;
OCFile new_file = new OCFile(mRemotePaths[i]);
new_file.setMimetype(mimeType);
new_file.setFileLength(new File(mLocalPaths[i]).length());
new_file.setLastSyncDate(0);
new_file.setStoragePath(mLocalPaths[i]);
File f = new File(mRemotePaths[i]);
- new_file.setParentId(storageManager.getFileByPath(f.getParent().endsWith("/")?f.getParent():f.getParent()+"/").getFileId());
+ long parentDirId = storageManager.getFileByPath(f.getParent().endsWith("/")?f.getParent():f.getParent()+"/").getFileId();
+ new_file.setParentId(parentDirId);
storageManager.saveFile(new_file);
+
+ Intent end = new Intent(UPLOAD_FINISH_MESSAGE);
+ end.putExtra(EXTRA_PARENT_DIR_ID, parentDirId);
+ sendBroadcast(end);
}
+
}
- // notification.contentView.setProgressBar(R.id.status_progress,
- // mLocalPaths.length-1, mLocalPaths.length-1, false);
mNotificationManager.cancel(42);
run();
}
package eu.alefzero.owncloud.syncadapter;\r
\r
import java.io.IOException;\r
+import java.util.ArrayList;\r
+import java.util.Iterator;\r
+import java.util.List;\r
import java.util.Vector;\r
\r
import org.apache.jackrabbit.webdav.DavException;\r
import android.content.SyncResult;\r
import android.os.Bundle;\r
import android.util.Log;\r
+import android.webkit.MimeTypeMap;\r
import eu.alefzero.owncloud.datamodel.FileDataStorageManager;\r
import eu.alefzero.owncloud.datamodel.OCFile;\r
import eu.alefzero.webdav.WebdavEntry;\r
this.setContentProvider(provider);\r
this.setStorageManager(new FileDataStorageManager(account,\r
getContentProvider()));\r
-\r
+ \r
Log.d(TAG, "syncing owncloud account " + account.name);\r
\r
- Intent i = new Intent(FileSyncService.SYNC_MESSAGE);\r
- i.putExtra(FileSyncService.IN_PROGRESS, true);\r
- i.putExtra(FileSyncService.ACCOUNT_NAME, account.name);\r
- getContext().sendStickyBroadcast(i);\r
+ sendStickyBroadcast(true, -1); // starting message to the main IU\r
\r
PropFindMethod query;\r
try {\r
syncResult.stats.numIoExceptions++;\r
e.printStackTrace();\r
}\r
- i.putExtra(FileSyncService.IN_PROGRESS, false);\r
- getContext().sendStickyBroadcast(i);\r
+ sendStickyBroadcast(false, -1); \r
}\r
\r
private void fetchData(String uri, SyncResult syncResult, long parentId) {\r
getClient().executeMethod(query);\r
MultiStatus resp = null;\r
resp = query.getResponseBodyAsMultiStatus();\r
+ List<String> paths = new ArrayList<String>();\r
+ List<Long> fileIds = new ArrayList<Long>(); \r
for (int i = 1; i < resp.getResponses().length; ++i) {\r
WebdavEntry we = new WebdavEntry(resp.getResponses()[i], getUri().getPath());\r
OCFile file = fillOCFile(we);\r
getStorageManager().saveFile(file);\r
if (parentId == 0)\r
parentId = file.getFileId();\r
- if (we.contentType().equals("DIR"))\r
- fetchData(getUri().toString() + we.path(), syncResult, file.getFileId());\r
+ if (we.contentType().equals("DIR")) {\r
+ // for recursive fetch later\r
+ paths.add(we.path());\r
+ fileIds.add(file.getFileId());\r
+ }\r
}\r
+ \r
Vector<OCFile> files = getStorageManager().getDirectoryContent(\r
getStorageManager().getFileById(parentId));\r
for (OCFile file : files) {\r
if (file.getLastSyncDate() != mCurrentSyncTime && file.getLastSyncDate() != 0)\r
getStorageManager().removeFile(file);\r
}\r
+ \r
+ // synched folder -> notice to main thread\r
+ sendStickyBroadcast(true, parentId);\r
+\r
+ // recursive fetch\r
+ Iterator<String> pathsIt = paths.iterator();\r
+ Iterator<Long> fileIdsIt = fileIds.iterator();\r
+ while (pathsIt.hasNext()) {\r
+ fetchData(getUri().toString() + pathsIt.next(), syncResult, fileIdsIt.next());\r
+ }\r
+\r
+\r
} catch (OperationCanceledException e) {\r
e.printStackTrace();\r
} catch (AuthenticatorException e) {\r
file.setLastSyncDate(mCurrentSyncTime);\r
return file;\r
}\r
+ \r
+ \r
+ private void sendStickyBroadcast(boolean inProgress, long OCDirId) {\r
+ Intent i = new Intent(FileSyncService.SYNC_MESSAGE);\r
+ i.putExtra(FileSyncService.IN_PROGRESS, inProgress);\r
+ i.putExtra(FileSyncService.ACCOUNT_NAME, getAccount().name);\r
+ if (OCDirId > 0) {\r
+ i.putExtra(FileSyncService.SYNC_FOLDER, OCDirId);\r
+ }\r
+ getContext().sendStickyBroadcast(i);\r
+ }\r
\r
}\r
public static final String SYNC_MESSAGE = "eu.alefzero.owncloud.files.ACCOUNT_SYNC";\r
public static final String IN_PROGRESS = "sync_in_progress";\r
public static final String ACCOUNT_NAME = "account_name";\r
+ public static final String SYNC_FOLDER = "eu.alefzero.owncloud.files.SYNC_FOLDER";\r
\r
/*\r
* {@inheritDoc}\r
setResult(RESULT_OK, intent);\r
Bundle bundle = new Bundle();\r
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);\r
- getContentResolver().startSync(ProviderTableMeta.CONTENT_URI,\r
- bundle);\r
+ //getContentResolver().startSync(ProviderTableMeta.CONTENT_URI,\r
+ // bundle);\r
+ ContentResolver.requestSync(account, "org.ownlcoud", bundle);\r
\r
/*\r
* if\r
\r
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();\r
mFileDetail = new FileDetailFragment();\r
- ft.add(R.id.fragment, mFileDetail, "FileDetails");\r
+ ft.replace(R.id.fragment, mFileDetail, "FileDetails");\r
ft.commit();\r
\r
}\r
\r
package eu.alefzero.owncloud.ui.activity;\r
\r
-import java.io.BufferedReader;\r
import java.io.File;\r
-import java.io.InputStreamReader;\r
-import java.lang.Thread.UncaughtExceptionHandler;\r
import java.util.ArrayList;\r
\r
import android.accounts.Account;\r
import android.content.Intent;\r
import android.content.IntentFilter;\r
import android.content.pm.PackageInfo;\r
-import android.content.pm.PackageManager;\r
import android.content.pm.PackageManager.NameNotFoundException;\r
import android.database.Cursor;\r
import android.net.Uri;\r
import android.os.Bundle;\r
import android.provider.MediaStore;\r
-import android.telephony.TelephonyManager;\r
import android.util.Log;\r
import android.view.View;\r
import android.view.ViewGroup;\r
import android.widget.ArrayAdapter;\r
-import android.widget.CheckedTextView;\r
import android.widget.EditText;\r
import android.widget.TextView;\r
+import android.widget.Toast;\r
\r
import com.actionbarsherlock.app.ActionBar;\r
import com.actionbarsherlock.app.ActionBar.OnNavigationListener;\r
import eu.alefzero.owncloud.datamodel.DataStorageManager;\r
import eu.alefzero.owncloud.datamodel.FileDataStorageManager;\r
import eu.alefzero.owncloud.datamodel.OCFile;\r
+import eu.alefzero.owncloud.files.services.FileDownloader;\r
import eu.alefzero.owncloud.files.services.FileUploader;\r
import eu.alefzero.owncloud.syncadapter.FileSyncService;\r
import eu.alefzero.owncloud.ui.fragment.FileDetailFragment;\r
*/\r
\r
public class FileDisplayActivity extends SherlockFragmentActivity implements\r
- OnNavigationListener, OnClickListener, android.view.View.OnClickListener {\r
+ OnNavigationListener, OnClickListener, android.view.View.OnClickListener {\r
+ \r
private ArrayAdapter<String> mDirectories;\r
- private DataStorageManager mStorageManager;\r
- private FileListFragment mFileList;\r
private OCFile mCurrentDir;\r
private String[] mDirs = null;\r
\r
- private SyncBroadcastReceiver syncBroadcastRevceiver;\r
+ private DataStorageManager mStorageManager;\r
+ private SyncBroadcastReceiver mSyncBroadcastReceiver;\r
+ private UploadFinishReceiver mUploadFinishReceiver;\r
\r
private View mLayoutView = null;\r
+ private FileListFragment mFileList;\r
\r
private static final String KEY_DIR_ARRAY = "DIR_ARRAY";\r
private static final String KEY_CURRENT_DIR = "DIR";\r
private static final int DIALOG_SETUP_ACCOUNT = 0;\r
private static final int DIALOG_CREATE_DIR = 1;\r
private static final int DIALOG_ABOUT_APP = 2;\r
+ \r
private static final int ACTION_SELECT_FILE = 1;\r
+ //private static final int ACTION_CREATE_FIRST_ACCOUNT = 2; dvelasco: WIP\r
\r
@Override\r
public void onCreate(Bundle savedInstanceState) {\r
+ Log.i(getClass().toString(), "onCreate() start");\r
super.onCreate(savedInstanceState);\r
\r
- // TODO: fix hack: workaround for bug in actionbar sherlock\r
- // it always shows indeterminate progress bar\r
- if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {\r
- requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);\r
- setProgressBarIndeterminateVisibility(false);\r
- }\r
+ requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);\r
+ setSupportProgressBarIndeterminateVisibility(false);\r
\r
Thread.setDefaultUncaughtExceptionHandler(new CrashHandler(getApplicationContext()));\r
\r
if(savedInstanceState != null){\r
- mCurrentDir = (OCFile) savedInstanceState.getParcelable(KEY_CURRENT_DIR);\r
+ mCurrentDir = (OCFile) savedInstanceState.getParcelable(KEY_CURRENT_DIR); // this is never saved with this key :S\r
}\r
\r
- if (findViewById(R.id.file_list_view) == null) \r
- mLayoutView = getLayoutInflater().inflate(R.layout.files, null); // always inflate this at onCreate() ; just once!\r
+ mLayoutView = getLayoutInflater().inflate(R.layout.files, null); // always inflate this at onCreate() ; just once!\r
\r
- //TODO: Dialog useless -> get rid of this\r
- if (!accountsAreSetup()) {\r
+ if (AccountUtils.accountsAreSetup(this)) {\r
+ setContentView(mLayoutView); \r
+ \r
+ } else {\r
setContentView(R.layout.no_account_available);\r
setProgressBarIndeterminateVisibility(false);\r
getSupportActionBar().setNavigationMode(ActionBar.DISPLAY_SHOW_TITLE);\r
findViewById(R.id.setup_account).setOnClickListener(this);\r
- \r
- } else if (findViewById(R.id.file_list_view) == null) {\r
- setContentView(mLayoutView);\r
}\r
\r
+ Log.i(getClass().toString(), "onCreate() end");\r
}\r
\r
@Override\r
case R.id.startSync: {\r
Bundle bundle = new Bundle();\r
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);\r
+ bundle.putString("PROBANDO", "PARAMETRO PASADO AL SYNC");\r
ContentResolver.requestSync(\r
AccountUtils.getCurrentOwnCloudAccount(this),\r
"org.owncloud", bundle);\r
* Called, when the user selected something for uploading\r
*/\r
public void onActivityResult(int requestCode, int resultCode, Intent data) {\r
- if (resultCode == RESULT_OK) {\r
- if (requestCode == ACTION_SELECT_FILE) {\r
+ if (requestCode == ACTION_SELECT_FILE) {\r
+ if (resultCode == RESULT_OK) {\r
Uri selectedImageUri = data.getData();\r
\r
String filemanagerstring = selectedImageUri.getPath();\r
i.putExtra(FileUploader.KEY_UPLOAD_TYPE, FileUploader.UPLOAD_SINGLE_FILE);\r
startService(i);\r
}\r
- }\r
+ \r
+ }/* dvelasco: WIP - not working as expected ... yet :)\r
+ else if (requestCode == ACTION_CREATE_FIRST_ACCOUNT) {\r
+ if (resultCode != RESULT_OK) {\r
+ finish(); // the user cancelled the AuthenticatorActivity\r
+ }\r
+ }*/\r
}\r
\r
@Override\r
\r
@Override\r
protected void onRestoreInstanceState(Bundle savedInstanceState) {\r
+ Log.i(getClass().toString(), "onRestoreInstanceState() start");\r
super.onRestoreInstanceState(savedInstanceState);\r
mDirs = savedInstanceState.getStringArray(KEY_DIR_ARRAY);\r
mDirectories = new CustomArrayAdapter<String>(this, R.layout.sherlock_spinner_dropdown_item);\r
for (String s : mDirs)\r
mDirectories.insert(s, 0);\r
mCurrentDir = savedInstanceState.getParcelable(FileDetailFragment.EXTRA_FILE);\r
+ Log.i(getClass().toString(), "onRestoreInstanceState() end");\r
}\r
\r
@Override\r
protected void onSaveInstanceState(Bundle outState) {\r
+ Log.i(getClass().toString(), "onSaveInstanceState() start");\r
super.onSaveInstanceState(outState);\r
if(mDirectories != null && mDirectories.getCount() != 0){\r
mDirs = new String[mDirectories.getCount()-1];\r
}\r
outState.putStringArray(KEY_DIR_ARRAY, mDirs);\r
outState.putParcelable(FileDetailFragment.EXTRA_FILE, mCurrentDir);\r
+ Log.i(getClass().toString(), "onSaveInstanceState() end");\r
}\r
\r
@Override\r
protected void onResume() {\r
+ Log.i(getClass().toString(), "onResume() start");\r
super.onResume();\r
\r
- if (accountsAreSetup()) {\r
+ if (!AccountUtils.accountsAreSetup(this)) {\r
+ /*Intent intent = new Intent(android.provider.Settings.ACTION_ADD_ACCOUNT);\r
+ intent.putExtra(android.provider.Settings.EXTRA_AUTHORITIES, new String[] { AccountAuthenticator.AUTH_TOKEN_TYPE });\r
+ //startActivity(intent);\r
+ startActivityForResult(intent, ACTION_CREATE_FIRST_ACCOUNT);*/\r
+ \r
+ } else { // at least an account exist: normal operation\r
\r
- setContentView(mLayoutView); // this should solve the crash by repeated inflating in big screens (DROIDCLOUD-27)\r
+ // set the layout only if it couldn't be set in onCreate\r
+ if (findViewById(R.id.file_list_view) == null)\r
+ setContentView(mLayoutView);\r
\r
// Listen for sync messages\r
IntentFilter syncIntentFilter = new IntentFilter(FileSyncService.SYNC_MESSAGE);\r
- syncBroadcastRevceiver = new SyncBroadcastReceiver();\r
- registerReceiver(syncBroadcastRevceiver, syncIntentFilter);\r
+ mSyncBroadcastReceiver = new SyncBroadcastReceiver();\r
+ registerReceiver(mSyncBroadcastReceiver, syncIntentFilter);\r
+ \r
+ // Listen for upload messages\r
+ IntentFilter uploadIntentFilter = new IntentFilter(FileUploader.UPLOAD_FINISH_MESSAGE);\r
+ mUploadFinishReceiver = new UploadFinishReceiver();\r
+ registerReceiver(mUploadFinishReceiver, uploadIntentFilter);\r
\r
// Storage manager initialization\r
mStorageManager = new FileDataStorageManager(\r
// List dir here\r
mFileList.listDirectory(mCurrentDir);\r
}\r
+ Log.i(getClass().toString(), "onResume() end");\r
}\r
\r
@Override\r
protected void onPause() {\r
+ Log.i(getClass().toString(), "onPause() start");\r
super.onPause();\r
- if (syncBroadcastRevceiver != null) {\r
- unregisterReceiver(syncBroadcastRevceiver);\r
- syncBroadcastRevceiver = null;\r
+ if (mSyncBroadcastReceiver != null) {\r
+ unregisterReceiver(mSyncBroadcastReceiver);\r
+ mSyncBroadcastReceiver = null;\r
+ }\r
+ if (mUploadFinishReceiver != null) {\r
+ unregisterReceiver(mUploadFinishReceiver);\r
+ mUploadFinishReceiver = null;\r
}\r
getIntent().putExtra(FileDetailFragment.EXTRA_FILE, mCurrentDir);\r
+ Log.i(getClass().toString(), "onPause() end");\r
}\r
\r
@Override\r
return !mDirectories.isEmpty();\r
}\r
\r
- /**\r
- * Checks, whether or not there are any ownCloud accounts setup.\r
- * \r
- * @return true, if there is at least one account.\r
- */\r
- private boolean accountsAreSetup() {\r
- AccountManager accMan = AccountManager.get(this);\r
- Account[] accounts = accMan\r
- .getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE);\r
- return accounts.length > 0;\r
- }\r
-\r
private class DirectoryCreator implements Runnable {\r
private String mTargetPath;\r
private Account mAccount;\r
.getStringExtra(FileSyncService.ACCOUNT_NAME);\r
Log.d("FileDisplay", "sync of account " + account_name\r
+ " is in_progress: " + inProgress);\r
- setProgressBarIndeterminateVisibility(inProgress);\r
+ setSupportProgressBarIndeterminateVisibility(inProgress);\r
+ \r
+ long OCDirId = intent.getLongExtra(FileSyncService.SYNC_FOLDER, -1);\r
+ if (OCDirId > 0) {\r
+ OCFile syncDir = mStorageManager.getFileById(OCDirId);\r
+ if (syncDir != null && (\r
+ (mCurrentDir == null && syncDir.getFileName().equals("/")) ||\r
+ syncDir.equals(mCurrentDir))\r
+ ) {\r
+ FileListFragment fileListFragment = (FileListFragment) getSupportFragmentManager().findFragmentById(R.id.fileList);\r
+ if (fileListFragment != null) { \r
+ fileListFragment.listDirectory();\r
+ }\r
+ }\r
+ }\r
+ \r
if (!inProgress) {\r
- FileListFragment fileListFramgent = (FileListFragment) getSupportFragmentManager()\r
+ FileListFragment fileListFragment = (FileListFragment) getSupportFragmentManager()\r
.findFragmentById(R.id.fileList);\r
- if (fileListFramgent != null)\r
- fileListFramgent.listDirectory();\r
+ if (fileListFragment != null)\r
+ fileListFragment.listDirectory();\r
}\r
}\r
\r
}\r
+ \r
+\r
+ private class UploadFinishReceiver extends BroadcastReceiver {\r
+ /**\r
+ * Once the file upload has finished -> update view\r
+ * @author David A. Velasco\r
+ * {@link BroadcastReceiver} to enable upload feedback in UI\r
+ */\r
+ @Override\r
+ public void onReceive(Context context, Intent intent) {\r
+ long parentDirId = intent.getLongExtra(FileUploader.EXTRA_PARENT_DIR_ID, -1);\r
+ OCFile parentDir = mStorageManager.getFileById(parentDirId);\r
+ \r
+ if (parentDir != null && (\r
+ (mCurrentDir == null && parentDir.getFileName().equals("/")) ||\r
+ parentDir.equals(mCurrentDir))\r
+ ) {\r
+ FileListFragment fileListFragment = (FileListFragment) getSupportFragmentManager().findFragmentById(R.id.fileList);\r
+ if (fileListFragment != null) { \r
+ fileListFragment.listDirectory();\r
+ }\r
+ }\r
+ }\r
+ \r
+ }\r
\r
+ \r
@Override\r
public void onClick(View v) {\r
if (v.getId() == R.id.setup_account) {\r
import android.accounts.Account;\r
import android.accounts.AccountManager;\r
import android.app.ActionBar.LayoutParams;\r
+import android.content.ActivityNotFoundException;\r
import android.content.BroadcastReceiver;\r
import android.content.Context;\r
import android.content.Intent;\r
import android.view.View;\r
import android.view.View.OnClickListener;\r
import android.view.ViewGroup;\r
+import android.webkit.MimeTypeMap;\r
import android.widget.Button;\r
import android.widget.ImageView;\r
import android.widget.TextView;\r
if (mFile.getMimetype().startsWith("image/")) {\r
BitmapFactory.Options options = new Options();\r
options.inScaled = true;\r
- options.inMutable = false;\r
- options.inPreferQualityOverSpeed = false;\r
options.inPurgeable = true;\r
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD_MR1) {\r
+ options.inPreferQualityOverSpeed = false;\r
+ }\r
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {\r
+ options.inMutable = false;\r
+ }\r
\r
Bitmap bmp = BitmapFactory.decodeFile(mFile.getStoragePath(), options);\r
\r
} catch (OutOfMemoryError e) {\r
preview.setVisibility(View.INVISIBLE);\r
Log.e(TAG, "Out of memory occured for file with size " + mFile.getFileLength());\r
+ \r
+ } catch (NoSuchFieldError e) {\r
+ preview.setVisibility(View.INVISIBLE);\r
+ Log.e(TAG, "Error from access to unexisting field despite protection " + mFile.getFileLength());\r
+ \r
+ } catch (Throwable t) {\r
+ preview.setVisibility(View.INVISIBLE);\r
+ Log.e(TAG, "Unexpected error while creating image preview " + mFile.getFileLength(), t);\r
}\r
downloadButton.setText(R.string.filedetails_open);\r
downloadButton.setOnClickListener(new OnClickListener() {\r
@Override\r
public void onClick(View v) {\r
- Intent i = new Intent(Intent.ACTION_VIEW);\r
- i.setDataAndType(Uri.parse("file://"+mFile.getStoragePath()), mFile.getMimetype());\r
- List list = getActivity().getPackageManager().queryIntentActivities(i, PackageManager.MATCH_DEFAULT_ONLY);\r
- if (list.size() > 0) {\r
+ String storagePath = mFile.getStoragePath();\r
+ try {\r
+ Intent i = new Intent(Intent.ACTION_VIEW);\r
+ i.setDataAndType(Uri.parse("file://"+ storagePath), mFile.getMimetype());\r
+ i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);\r
startActivity(i);\r
- } else {\r
- Toast.makeText(getActivity(), "There is no application to handle file " + mFile.getFileName(), Toast.LENGTH_SHORT).show();\r
+ \r
+ } catch (Throwable t) {\r
+ Log.e(TAG, "Fail when trying to open with the mimeType provided from the ownCloud server: " + mFile.getMimetype());\r
+ boolean toastIt = true; \r
+ String mimeType = "";\r
+ try {\r
+ Intent i = new Intent(Intent.ACTION_VIEW);\r
+ mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(storagePath.substring(storagePath.lastIndexOf('.') + 1));\r
+ if (mimeType != mFile.getMimetype()) {\r
+ i.setDataAndType(Uri.parse("file://"+mFile.getStoragePath()), mimeType);\r
+ i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);\r
+ startActivity(i);\r
+ toastIt = false;\r
+ }\r
+ \r
+ } catch (IndexOutOfBoundsException e) {\r
+ Log.e(TAG, "Trying to find out MIME type of a file without extension: " + storagePath);\r
+ \r
+ } catch (ActivityNotFoundException e) {\r
+ Log.e(TAG, "No activity found to handle: " + storagePath + " with MIME type " + mimeType + " obtained from extension");\r
+ \r
+ } catch (Throwable th) {\r
+ Log.e(TAG, "Unexpected problem when opening: " + storagePath, th);\r
+ \r
+ } finally {\r
+ if (toastIt) {\r
+ Toast.makeText(getActivity(), "There is no application to handle file " + mFile.getFileName(), Toast.LENGTH_SHORT).show();\r
+ }\r
+ }\r
+ \r
}\r
}\r
});\r
* the time that the file was created. There is a chance that this will\r
* be fixed in future versions. Use this method to check if this version of\r
* ownCloud has this fix.\r
- * @return True, if ownCloud the ownCloud version is > 3.0.4 and 4.0.1\r
+ * @return True, if ownCloud the ownCloud version is > 3.0.4 and 4.0.4\r
*/\r
private boolean ocVersionSupportsTimeCreated(){\r
if(mIntent != null){\r
AccountManager accManager = (AccountManager) getActivity().getSystemService(Context.ACCOUNT_SERVICE);\r
OwnCloudVersion ocVersion = new OwnCloudVersion(accManager\r
.getUserData(ocAccount, AccountAuthenticator.KEY_OC_VERSION));\r
- if(ocVersion.compareTo(new OwnCloudVersion(0x030004)) >= 0 || ocVersion.compareTo(new OwnCloudVersion(0x040001)) >= 0){\r
+ if(ocVersion.compareTo(new OwnCloudVersion(0x030004)) >= 0 || ocVersion.compareTo(new OwnCloudVersion(0x040004)) >= 0){\r
return true;\r
}\r
}\r
*/\r
public class FileListFragment extends FragmentListView {\r
private static final String TAG = "FileListFragment";\r
- //private Account mAccount; // dvelasco : the fragment is not recreated when other account is selected; keep as an attribute is dangerous\r
+ \r
private Vector<OCFile> mFiles; \r
- //private DataStorageManager mStorageManager; // dvelasco : just the same; it depends upon the current account ; it's updated in FileDisplayActivity!!\r
private OCFile mFile;\r
- private boolean mIsLargeDevice = false; \r
+ private boolean mIsLargeDevice; \r
\r
@Override\r
public void onCreate(Bundle savedInstanceState) {\r
+ Log.i(getClass().toString(), "onCreate() start");\r
super.onCreate(savedInstanceState);\r
\r
Intent intent = getActivity().getIntent();\r
OCFile directory = intent.getParcelableExtra(FileDetailFragment.EXTRA_FILE);\r
mFile = directory;\r
+ mIsLargeDevice = false; \r
\r
+ Log.i(getClass().toString(), "onCreate() stop");\r
}\r
\r
@Override\r
public View onCreateView(LayoutInflater inflater, ViewGroup container,\r
Bundle savedInstanceState) {\r
+ Log.i(getClass().toString(), "onCreateView() start");\r
super.onCreateView(inflater, container, savedInstanceState);\r
getListView().setDivider(getResources().getDrawable(R.drawable.uploader_list_separator));\r
getListView().setDividerHeight(1);\r
\r
- //listDirectory(mFile);\r
- \r
+ Log.i(getClass().toString(), "onCreateView() end");\r
return getListView();\r
} \r
\r
@Override\r
public void onStart() {\r
+ Log.i(getClass().toString(), "onStart() start");\r
+ super.onStart();\r
// Create a placeholder upon launch\r
View fragmentContainer = getActivity().findViewById(R.id.file_details_container);\r
if (fragmentContainer != null) {\r
transaction.replace(R.id.file_details_container, new FileDetailFragment(true));\r
transaction.commit();\r
}\r
- super.onStart();\r
+ Log.i(getClass().toString(), "onStart() end");\r
}\r
\r
@Override\r
mFile = directory;\r
\r
mFiles = storageManager.getDirectoryContent(directory);\r
- if (mFiles == null || mFiles.size() == 0) {\r
+ /*if (mFiles == null || mFiles.size() == 0) {\r
Toast.makeText(getActivity(), "There are no files here", Toast.LENGTH_LONG).show();\r
- }\r
+ }*/\r
setListAdapter(new FileListListAdapter(directory, storageManager, getActivity()));\r
}\r
\r
- @Override\r
- public void onSaveInstanceState(Bundle outState) {\r
- super.onSaveInstanceState(outState);\r
- outState.putParcelable("ACCOUNT", AccountUtils.getCurrentOwnCloudAccount(getActivity()));\r
- }\r
-\r
}\r
prop = propSet.get(DavPropertyName.GETCONTENTTYPE);
if (prop != null) {
mContentType = (String) prop.getValue();
+ // dvelasco: some builds of ownCloud server 4.0.x added a trailing ';' to the MIME type ; if looks fixed, but let's be cautious
+ if (mContentType.indexOf(";") >= 0) {
+ mContentType = mContentType.substring(0, mContentType.indexOf(";"));
+ }
} else {
mContentType = "DIR";
/*