From: David A. Velasco Date: Tue, 22 Oct 2013 12:15:21 +0000 (-0700) Subject: Merge pull request #284 from owncloud/setup_app_name X-Git-Tag: oc-android-1.5.5~159 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/f79e2c0430b9b732d299cbb516c6884715d10e11?hp=75d58e44a60bb7a6feaf49c05e247cafeeaa1d64 Merge pull request #284 from owncloud/setup_app_name Setup app name, optional settings, and availability of multiple accounts. --- diff --git a/.gitignore b/.gitignore index 7a3b8360..ac30011b 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,13 @@ local.properties # Mac .DS_Store files .DS_Store + +# These files are created automatically by Eclipse: +tests/proguard-project.txt +tests/project.properties +tests/ant.properties +tests/build.xml +proguard-project.txt + +# Should not be commited inside this repo: +actionbarsherlock/ \ No newline at end of file diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 0acd29f0..ac8c1506 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -18,8 +18,8 @@ along with this program. If not, see . --> + android:versionCode="104006" + android:versionName="1.4.6" xmlns:android="http://schemas.android.com/apk/res/android"> diff --git a/SETUP.md b/SETUP.md index 8c1ebd9a..cd67a800 100644 --- a/SETUP.md +++ b/SETUP.md @@ -2,27 +2,44 @@ If you want to start development of ownCloud first download required files, then compile using console or Eclipse, finally create pull request: 1. Fork and download android/develop repository: - + + - NOTE: You must have git in your enviroment path - Navigate to https://github.com/owncloud/android, click fork. - Clone your new repo: "git clone git@github.com:YOURGITHUBNAME/android.git" + - "cd android" - Checkout remote develop branch: "git checkout -b develop remotes/origin/develop" + - Pull changes from your develop branch: "git pull origin develop" + - Make sure to get the latest changes from official android/develop branch: + - Make official owncloud repo known as upstream: "git remote add upstream git@github.com:owncloud/android.git" + - Pull latest changes from upstream: "git pull upstream develop" - 2. Building with console: + 2. Building with console/maven: - - Use setup_env.sh or setup_env.bat - - NOTE: You must have mvn, git, ant/bin, android/tools, and 'platforms-tools' in your enviroment path + - OPTIONAL, CONTINUE WITH STEP 3 IF NOT REQUIRED! + - NOTE: You must have mvn in your enviroment path + - Download/install Android plugin for Maven, then build ownCloud with mvn: + - "cd .." + - "git clone https://github.com/mosabua/maven-android-sdk-deployer.git" + - "cd maven-android-sdk-deployer" + - "mvn -pl com.simpligility.android.sdk-deployer:android-17 -am install" + - "cd ../android" - Now you can create APK using "mvn package" - - 3. Building with eclipse: - - Open Eclipse and create new "Android Project from Existing Code". As root choose *actionbarsherlock/library* - - Increase Android API level until project compiles. 14 should work. bin/library.jar needs to be created! + 3. Building with Eclipse: + + - NOTE: You must have android/tools, and 'platforms-tools' in your enviroment path + - Prepare building with Eclipse: + - "setup_env.bat" or "./setup_env.sh" + - Open Eclipse and create new "Android Project from Existing Code". As root choose android/actionbarsherlock/library + - Increase Android API level until project compiles. 14 should work. + - Clean project and compile. + - Make sure android/actionbarsherlock/library/bin/library.jar was created! - Import OwnCloud Android project. - Increase Android API level to 17. - - Clean all projects. + - Clean project and compile. - After those actions you should be good to go. HAVE FUN! - - TODO: How to build for older devices? - + - NOTE: Even though API level is set to 17, APK also runs on older devices because in AndroidManifest.xml minSdkVersion is set to 8. + 4. Create pull request: - Commit your changes locally: "git commit -a" diff --git a/oc_jb_workaround/AndroidManifest.xml b/oc_jb_workaround/AndroidManifest.xml index cdb77bcd..c987c824 100644 --- a/oc_jb_workaround/AndroidManifest.xml +++ b/oc_jb_workaround/AndroidManifest.xml @@ -1,14 +1,12 @@ + android:versionCode="0100008" + android:versionName="1.0.8" > + android:targetSdkVersion="16" /> 1.6 - 4.1.1.4 - r7 + 4.2.2_r2 4.2.0 @@ -27,19 +26,13 @@ - com.google.android + android android ${google.android-version} provided - com.google.android - support-v4 - ${google.android.support-version} - - - com.actionbarsherlock actionbarsherlock ${actionbarsherlock-version} diff --git a/res/drawable-hdpi/icon.png b/res/drawable-hdpi/icon.png index e388c7be..8a2fe193 100644 Binary files a/res/drawable-hdpi/icon.png and b/res/drawable-hdpi/icon.png differ diff --git a/res/drawable-hdpi/logo.png b/res/drawable-hdpi/logo.png index ecea3b0e..a920912c 100644 Binary files a/res/drawable-hdpi/logo.png and b/res/drawable-hdpi/logo.png differ diff --git a/res/drawable-ldpi/icon.png b/res/drawable-ldpi/icon.png index 11cf0ab1..f8f54b73 100644 Binary files a/res/drawable-ldpi/icon.png and b/res/drawable-ldpi/icon.png differ diff --git a/res/drawable-ldpi/logo.png b/res/drawable-ldpi/logo.png index 62dff255..7de7cb84 100644 Binary files a/res/drawable-ldpi/logo.png and b/res/drawable-ldpi/logo.png differ diff --git a/res/drawable-mdpi/icon.png b/res/drawable-mdpi/icon.png index 6997c7e4..42bbaad0 100644 Binary files a/res/drawable-mdpi/icon.png and b/res/drawable-mdpi/icon.png differ diff --git a/res/drawable-mdpi/logo.png b/res/drawable-mdpi/logo.png index ecea3b0e..a920912c 100644 Binary files a/res/drawable-mdpi/logo.png and b/res/drawable-mdpi/logo.png differ diff --git a/res/layout/media_control.xml b/res/layout/media_control.xml index 489c9973..f308edca 100644 --- a/res/layout/media_control.xml +++ b/res/layout/media_control.xml @@ -27,7 +27,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" - android:paddingTop="4dip" + android:paddingTop="4dp" android:orientation="horizontal" > @@ -58,33 +58,33 @@ android:id="@+id/currentTimeText" android:textSize="14sp" android:textStyle="bold" - android:paddingTop="4dip" - android:paddingStart="4dip" + android:paddingTop="4dp" + android:paddingStart="4dp" android:layout_gravity="center_horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:paddingEnd="4dip" + android:paddingEnd="4dp" android:text="@string/placeholder_media_time" /> diff --git a/src/com/owncloud/android/files/services/FileUploader.java b/src/com/owncloud/android/files/services/FileUploader.java index 55aefbd3..e738a276 100644 --- a/src/com/owncloud/android/files/services/FileUploader.java +++ b/src/com/owncloud/android/files/services/FileUploader.java @@ -29,6 +29,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.apache.http.HttpStatus; +import org.apache.jackrabbit.webdav.DavConstants; import org.apache.jackrabbit.webdav.MultiStatus; import org.apache.jackrabbit.webdav.client.methods.PropFindMethod; @@ -535,6 +536,11 @@ public class FileUploader extends Service implements OnDatatransferProgressListe mPendingUploads.remove(uploadKey); Log_OC.i(TAG, "Remove CurrentUploadItem from pending upload Item Map."); } + if (uploadResult.isException()) { + // enforce the creation of a new client object for next uploads; this grant that a new socket will + // be created in the future if the current exception is due to an abrupt lose of network connection + mUploadClient = null; + } } /// notify result @@ -617,8 +623,9 @@ public class FileUploader extends Service implements OnDatatransferProgressListe PropFindMethod propfind = null; RemoteOperationResult result = null; try { - propfind = new PropFindMethod(mUploadClient.getBaseUri() - + WebdavUtils.encodePath(mCurrentUpload.getRemotePath())); + propfind = new PropFindMethod(mUploadClient.getBaseUri() + WebdavUtils.encodePath(mCurrentUpload.getRemotePath()), + DavConstants.PROPFIND_ALL_PROP, + DavConstants.DEPTH_0); int status = mUploadClient.executeMethod(propfind); boolean isMultiStatus = (status == HttpStatus.SC_MULTI_STATUS); if (isMultiStatus) { @@ -723,12 +730,7 @@ public class FileUploader extends Service implements OnDatatransferProgressListe mNotification.contentView.setImageViewResource(R.id.status_icon, R.drawable.icon); /// includes a pending intent in the notification showing the details view of the file - Intent showDetailsIntent = null; - if (PreviewImageFragment.canBePreviewed(upload.getFile())) { - showDetailsIntent = new Intent(this, PreviewImageActivity.class); - } else { - showDetailsIntent = new Intent(this, FileDisplayActivity.class); - } + Intent showDetailsIntent = new Intent(this, FileDisplayActivity.class); showDetailsIntent.putExtra(FileActivity.EXTRA_FILE, upload.getFile()); showDetailsIntent.putExtra(FileActivity.EXTRA_ACCOUNT, upload.getAccount()); showDetailsIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); diff --git a/src/com/owncloud/android/operations/RemoteOperationResult.java b/src/com/owncloud/android/operations/RemoteOperationResult.java index 999974cf..4e137c42 100644 --- a/src/com/owncloud/android/operations/RemoteOperationResult.java +++ b/src/com/owncloud/android/operations/RemoteOperationResult.java @@ -52,6 +52,7 @@ public class RemoteOperationResult implements Serializable { /** Generated - should be refreshed every time the class changes!! */ private static final long serialVersionUID = -4415103901492836870L; + private static final String TAG = "RemoteOperationResult"; diff --git a/src/com/owncloud/android/operations/SynchronizeFileOperation.java b/src/com/owncloud/android/operations/SynchronizeFileOperation.java index 5be116bc..7a81b84e 100644 --- a/src/com/owncloud/android/operations/SynchronizeFileOperation.java +++ b/src/com/owncloud/android/operations/SynchronizeFileOperation.java @@ -19,6 +19,7 @@ package com.owncloud.android.operations; import org.apache.http.HttpStatus; +import org.apache.jackrabbit.webdav.DavConstants; import org.apache.jackrabbit.webdav.MultiStatus; import org.apache.jackrabbit.webdav.client.methods.PropFindMethod; @@ -89,7 +90,9 @@ public class SynchronizeFileOperation extends RemoteOperation { if (mServerFile == null) { /// take the duty of check the server for the current state of the file there - propfind = new PropFindMethod(client.getBaseUri() + WebdavUtils.encodePath(mLocalFile.getRemotePath())); + propfind = new PropFindMethod(client.getBaseUri() + WebdavUtils.encodePath(mLocalFile.getRemotePath()), + DavConstants.PROPFIND_ALL_PROP, + DavConstants.DEPTH_0); int status = client.executeMethod(propfind, SYNC_READ_TIMEOUT, SYNC_CONNECTION_TIMEOUT); boolean isMultiStatus = status == HttpStatus.SC_MULTI_STATUS; if (isMultiStatus) { diff --git a/src/com/owncloud/android/operations/SynchronizeFolderOperation.java b/src/com/owncloud/android/operations/SynchronizeFolderOperation.java index 0236a139..32956682 100644 --- a/src/com/owncloud/android/operations/SynchronizeFolderOperation.java +++ b/src/com/owncloud/android/operations/SynchronizeFolderOperation.java @@ -29,6 +29,7 @@ import java.util.Map; import java.util.Vector; import org.apache.http.HttpStatus; +import org.apache.jackrabbit.webdav.DavConstants; import org.apache.jackrabbit.webdav.MultiStatus; import org.apache.jackrabbit.webdav.client.methods.PropFindMethod; @@ -134,7 +135,9 @@ public class SynchronizeFolderOperation extends RemoteOperation { Log_OC.d(TAG, "Synchronizing " + mAccount.name + ", fetching files in " + mRemotePath); // remote request - query = new PropFindMethod(client.getBaseUri() + WebdavUtils.encodePath(mRemotePath)); + query = new PropFindMethod(client.getBaseUri() + WebdavUtils.encodePath(mRemotePath), + DavConstants.PROPFIND_ALL_PROP, + DavConstants.DEPTH_1); int status = client.executeMethod(query); // check and process response - /// TODO take into account all the possible status per child-resource diff --git a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java index e66ab605..7721133f 100644 --- a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -86,6 +86,7 @@ import com.owncloud.android.ui.fragment.FileDetailFragment; import com.owncloud.android.ui.fragment.FileFragment; import com.owncloud.android.ui.fragment.OCFileListFragment; import com.owncloud.android.ui.preview.PreviewImageActivity; +import com.owncloud.android.ui.preview.PreviewImageFragment; import com.owncloud.android.ui.preview.PreviewMediaFragment; import com.owncloud.android.ui.preview.PreviewVideoActivity; @@ -220,12 +221,15 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa /// Check whether the 'main' OCFile handled by the Activity is contained in the current Account OCFile file = getFile(); + // get parent from path + String parentPath = ""; if (file != null) { if (file.isDown() && file.getLastSyncDateForProperties() == 0) { // upload in progress - right now, files are not inserted in the local cache until the upload is successful - if (mStorageManager.getFileById(file.getParentId()) == null) { - file = null; // not able to know the directory where the file is uploading - } + // get parent from path + parentPath = file.getRemotePath().substring(0, file.getRemotePath().lastIndexOf(file.getFileName())); + if (mStorageManager.getFileByPath(parentPath) == null) + file = null; // not able to know the directory where the file is uploading } else { file = mStorageManager.getFileByPath(file.getRemotePath()); // currentDir = null if not in the current Account } @@ -241,7 +245,9 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa if (fileIt.isDirectory()) { mDirectories.add(fileIt.getFileName()); } - fileIt = mStorageManager.getFileById(fileIt.getParentId()); + // get parent from path + parentPath = fileIt.getRemotePath().substring(0, fileIt.getRemotePath().lastIndexOf(fileIt.getFileName())); + fileIt = mStorageManager.getFileByPath(parentPath); } mDirectories.add(OCFile.PATH_SEPARATOR); if (!stateWasRecovered) { @@ -867,7 +873,9 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa Log_OC.d(TAG, "sync of account " + accountName + " is in_progress: " + inProgress); - if (getAccount() != null && accountName.equals(getAccount().name)) { + if (getAccount() != null && accountName.equals(getAccount().name) + && mStorageManager != null + ) { String synchFolderRemotePath = intent.getStringExtra(FileSyncService.SYNC_FOLDER_REMOTE_PATH); @@ -881,7 +889,7 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa if ((synchFolderRemotePath != null && currentDir != null && (currentDir.getRemotePath().equals(synchFolderRemotePath))) || fillBlankRoot ) { if (!fillBlankRoot) - currentDir = getStorageManager().getFileByPath(synchFolderRemotePath); + currentDir = mStorageManager.getFileByPath(synchFolderRemotePath); OCFileListFragment fileListFragment = getListOfFilesFragment(); if (fileListFragment != null) { fileListFragment.listDirectory(currentDir); @@ -1370,7 +1378,8 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa if (file.isDirectory()) { return file; } else if (mStorageManager != null) { - return mStorageManager.getFileById(file.getParentId()); + String parentPath = file.getRemotePath().substring(0, file.getRemotePath().lastIndexOf(file.getFileName())); + return mStorageManager.getFileByPath(parentPath); } } return null; diff --git a/src/com/owncloud/android/ui/fragment/FileDetailFragment.java b/src/com/owncloud/android/ui/fragment/FileDetailFragment.java index 07f274ee..944decfa 100644 --- a/src/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -64,6 +64,7 @@ import com.owncloud.android.ui.activity.FileActivity; import com.owncloud.android.ui.activity.FileDisplayActivity; import com.owncloud.android.ui.dialog.EditNameDialog; import com.owncloud.android.ui.dialog.EditNameDialog.EditNameDialogListener; +import com.owncloud.android.ui.preview.PreviewImageFragment; import eu.alefzero.webdav.OnDatatransferProgressListener; @@ -742,7 +743,13 @@ public class FileDetailFragment extends FileFragment implements msg.show(); } getSherlockActivity().removeStickyBroadcast(intent); // not the best place to do this; a small refactorization of BroadcastReceivers should be done + updateFileDetails(false, false); // it updates the buttons; must be called although !uploadWasFine; interrupted uploads still leave an incomplete file in the server + + // Force the preview if the file is an image + if (uploadWasFine && PreviewImageFragment.canBePreviewed(getFile())) { + ((FileDisplayActivity) mContainerActivity).startImagePreview(getFile()); + } } } } diff --git a/src/com/owncloud/android/ui/preview/PreviewImageActivity.java b/src/com/owncloud/android/ui/preview/PreviewImageActivity.java index 7c9ccd69..6a80ffbd 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImageActivity.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageActivity.java @@ -110,7 +110,10 @@ public class PreviewImageActivity extends FileActivity implements FileFragment.C } private void initViewPager() { - OCFile parentFolder = mStorageManager.getFileById(getFile().getParentId()); + // get parent from path + String parentPath = getFile().getRemotePath().substring(0, getFile().getRemotePath().lastIndexOf(getFile().getFileName())); + OCFile parentFolder = mStorageManager.getFileByPath(parentPath); + //OCFile parentFolder = mStorageManager.getFileById(getFile().getParentId()); if (parentFolder == null) { // should not be necessary parentFolder = mStorageManager.getFileByPath(OCFile.PATH_SEPARATOR); @@ -158,7 +161,7 @@ public class PreviewImageActivity extends FileActivity implements FileFragment.C Log_OC.d(TAG, "Simulating reselection of current page after connection of download binder"); onPageSelected(mViewPager.getCurrentItem()); } - + } else if (component.equals(new ComponentName(PreviewImageActivity.this, FileUploader.class))) { Log_OC.d(TAG, "Upload service connected"); mUploaderBinder = (FileUploaderBinder) service; @@ -436,8 +439,12 @@ public class PreviewImageActivity extends FileActivity implements FileFragment.C if (!file.isImage()) { throw new IllegalArgumentException("Non-image file passed as argument"); } - mStorageManager = new FileDataStorageManager(getAccount(), getContentResolver()); - file = mStorageManager.getFileById(file.getFileId()); + mStorageManager = new FileDataStorageManager(getAccount(), getContentResolver()); + + // Update file according to DB file, if it is possible + if (file.getFileId() > DataStorageManager.ROOT_PARENT_ID) + file = mStorageManager.getFileById(file.getFileId()); + if (file != null) { /// Refresh the activity according to the Account and OCFile set setFile(file); // reset after getting it fresh from mStorageManager