From: David A. Velasco Date: Fri, 28 Jun 2013 09:58:43 +0000 (+0200) Subject: Merge branch 'develop' into check_account_existance_in_gallery X-Git-Tag: oc-android-1.4.3~9^2~3 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/5b792b044056bc0a547803ff52f30b9da457870e?ds=inline;hp=-c Merge branch 'develop' into check_account_existance_in_gallery --- 5b792b044056bc0a547803ff52f30b9da457870e diff --combined AndroidManifest.xml index d5cae03a,ad8488d4..90de1600 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@@ -18,8 -18,8 +18,8 @@@ along with this program. If not, see . --> + android:versionCode="104001" + android:versionName="1.4.1" xmlns:android="http://schemas.android.com/apk/res/android"> @@@ -95,7 -95,7 +95,7 @@@ + android:theme="@style/Theme.ownCloud.Fullscreen" > (this, R.layout.sherlock_spinner_dropdown_item); - OCFile currFile = getFile(); - if (mStorageManager != null) { - while(currFile != null && currFile.getFileName() != OCFile.PATH_SEPARATOR) { - if (currFile.isDirectory()) { - mDirectories.add(currFile.getFileName()); - } - currFile = mStorageManager.getFileById(currFile.getParentId()); - } - } - mDirectories.add(OCFile.PATH_SEPARATOR); - ActionBar actionBar = getSupportActionBar(); - actionBar.setHomeButtonEnabled(true); // mandatory since Android ICS, according to the official documentation - setSupportProgressBarIndeterminateVisibility(false); // always AFTER setContentView(...) ; to workaround bug in its implementation + getSupportActionBar().setHomeButtonEnabled(true); // mandatory since Android ICS, according to the official documentation + setSupportProgressBarIndeterminateVisibility(false); // always AFTER setContentView(...) ; to work around bug in its implementation Log_OC.d(TAG, "onCreate() end"); } @@@ -208,32 -222,28 +208,39 @@@ /// Check whether the 'main' OCFile handled by the Activity is contained in the current Account OCFile file = getFile(); if (file != null) { - file = mStorageManager.getFileByPath(file.getRemotePath()); // currentDir = null if not in the current Account + 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 + } + } else { + file = mStorageManager.getFileByPath(file.getRemotePath()); // currentDir = null if not in the current Account + } } if (file == null) { // fall back to root folder - file = mStorageManager.getFileByPath(OCFile.PATH_SEPARATOR); // never should return null + file = mStorageManager.getFileByPath(OCFile.PATH_SEPARATOR); // never returns null } setFile(file); - - if (findViewById(android.R.id.content) != null && !stateWasRecovered) { + mDirectories.clear(); + OCFile fileIt = file; + while(fileIt != null && fileIt.getFileName() != OCFile.PATH_SEPARATOR) { + if (fileIt.isDirectory()) { + mDirectories.add(fileIt.getFileName()); + } + fileIt = mStorageManager.getFileById(fileIt.getParentId()); + } + mDirectories.add(OCFile.PATH_SEPARATOR); + if (!stateWasRecovered) { Log_OC.e(TAG, "Initializing Fragments in onAccountChanged.."); initFragmentsWithFile(); + } else { - Log_OC.e(TAG, "Fragment initializacion ignored in onAccountChanged due to lack of CONTENT VIEW"); + updateFragmentsVisibility(!file.isDirectory()); + updateNavigationElementsInActionBar(file.isDirectory() ? null : file); } + } else { Log_OC.wtf(TAG, "onAccountChanged was called with NULL account associated!"); } @@@ -249,24 -259,11 +256,24 @@@ private void initFragmentsWithFile() { if (getAccount() != null && getFile() != null) { + /// First fragment + OCFileListFragment listOfFiles = getListOfFilesFragment(); + if (listOfFiles != null) { + listOfFiles.listDirectory(getCurrentDir()); + } else { + Log.e(TAG, "Still have a chance to lose the initializacion of list fragment >("); + } + /// Second fragment OCFile file = getFile(); Fragment secondFragment = chooseInitialSecondFragment(file); if (secondFragment != null) { setSecondFragment(secondFragment); + updateFragmentsVisibility(true); + updateNavigationElementsInActionBar(file); + + } else { + cleanSecondFragment(); } } else { @@@ -283,7 -280,9 +290,9 @@@ private Fragment chooseInitialSecondFragment(OCFile file) { Fragment secondFragment = null; if (file != null && !file.isDirectory()) { - if (file.isDown() && PreviewMediaFragment.canBePreviewed(file)) { + if (file.isDown() && PreviewMediaFragment.canBePreviewed(file) + && file.getLastSyncDateForProperties() > 0 // temporal fix + ) { int startPlaybackPosition = getIntent().getIntExtra(PreviewVideoActivity.EXTRA_START_POSITION, 0); boolean autoplay = getIntent().getBooleanExtra(PreviewVideoActivity.EXTRA_AUTOPLAY, true); secondFragment = new PreviewMediaFragment(file, getAccount(), startPlaybackPosition, autoplay); @@@ -362,9 -361,8 +371,9 @@@ FragmentTransaction tr = getSupportFragmentManager().beginTransaction(); tr.remove(second); tr.commit(); - updateFragmentsVisibility(false); } + updateFragmentsVisibility(false); + updateNavigationElementsInActionBar(null); } protected void refeshListOfFilesFragment() { @@@ -589,6 -587,7 +598,6 @@@ setFile(listOfFiles.getCurrentFile()); } cleanSecondFragment(); - updateNavigationElementsInActionBar(null); } @Override @@@ -599,7 -598,14 +608,7 @@@ outState.putParcelable(FileDisplayActivity.KEY_WAITING_TO_PREVIEW, mWaitingToPreview); Log_OC.d(TAG, "onSaveInstanceState() end"); } - - @Override - protected void onStart() { - super.onStart(); - FileFragment second = getSecondFragment(); - updateFragmentsVisibility(second != null); - updateNavigationElementsInActionBar((second == null) ? null : second.getFile()); - } + @Override protected void onResume() { @@@ -622,6 -628,12 +631,6 @@@ mDownloadFinishReceiver = new DownloadFinishReceiver(); registerReceiver(mDownloadFinishReceiver, downloadIntentFilter); - // List current directory - OCFileListFragment listOfFiles = getListOfFilesFragment(); - if (listOfFiles != null) { - listOfFiles.listDirectory(getCurrentDir()); // TODO we should find the way to avoid the need of this (maybe it's not necessary yet; to check) - } - Log_OC.d(TAG, "onResume() end"); } @@@ -927,6 -939,7 +936,6 @@@ public void onBrowsedDownTo(OCFile directory) { pushDirname(directory); cleanSecondFragment(); - updateNavigationElementsInActionBar(null); } /** @@@ -996,9 -1009,9 +1005,9 @@@ /** * TODO */ - private void updateNavigationElementsInActionBar(OCFile currentFile) { + private void updateNavigationElementsInActionBar(OCFile chosenFile) { ActionBar actionBar = getSupportActionBar(); - if (currentFile == null || mDualPane) { + if (chosenFile == null || mDualPane) { // only list of files - set for browsing through folders OCFile currentDir = getCurrentDir(); actionBar.setDisplayHomeAsUpEnabled(currentDir != null && currentDir.getParentId() != 0); @@@ -1009,7 -1022,7 +1018,7 @@@ } else { actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setDisplayShowTitleEnabled(true); - actionBar.setTitle(currentFile.getFileName()); + actionBar.setTitle(chosenFile.getFileName()); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); } } @@@ -1019,8 -1032,18 +1028,9 @@@ * {@inheritDoc} */ @Override - public OCFile getInitialDirectory() { - return getCurrentDir(); - } - - - /** - * {@inheritDoc} - */ - @Override public void onFileStateChanged() { refeshListOfFilesFragment(); + updateNavigationElementsInActionBar(getSecondFragment().getFile()); } @@@ -1316,11 -1339,12 +1326,11 @@@ if (file != null) { if (file.isDirectory()) { return file; - } else { + } else if (mStorageManager != null) { return mStorageManager.getFileById(file.getParentId()); } - } else { - return null; } + return null; } } diff --combined src/com/owncloud/android/ui/activity/UploadFilesActivity.java index 077c4a4f,16e05f89..a6031cdb --- a/src/com/owncloud/android/ui/activity/UploadFilesActivity.java +++ b/src/com/owncloud/android/ui/activity/UploadFilesActivity.java @@@ -21,7 -21,6 +21,6 @@@ import java.io.File import android.accounts.Account; import android.content.Intent; - import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; @@@ -31,22 -30,18 +30,17 @@@ import android.view.View.OnClickListene import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Button; - import android.widget.MediaController; import android.widget.TextView; import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.app.ActionBar.OnNavigationListener; --import com.actionbarsherlock.app.SherlockFragmentActivity; import com.actionbarsherlock.view.MenuItem; - import com.owncloud.android.datamodel.FileDataStorageManager; - import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.ui.dialog.IndeterminateProgressDialog; import com.owncloud.android.ui.fragment.ConfirmationDialogFragment; import com.owncloud.android.ui.fragment.LocalFileListFragment; import com.owncloud.android.ui.fragment.ConfirmationDialogFragment.ConfirmationDialogFragmentListener; import com.owncloud.android.utils.FileStorageUtils; - import com.owncloud.android.AccountUtils; import com.owncloud.android.Log_OC; import com.owncloud.android.R; @@@ -58,7 -53,7 +52,7 @@@ * */ -public class UploadFilesActivity extends SherlockFragmentActivity implements +public class UploadFilesActivity extends FileActivity implements LocalFileListFragment.ContainerActivity, OnNavigationListener, OnClickListener, ConfirmationDialogFragmentListener { private ArrayAdapter mDirectories; @@@ -66,9 -61,10 +60,9 @@@ private LocalFileListFragment mFileListFragment; private Button mCancelBtn; private Button mUploadBtn; - private Account mAccount; + private Account mAccountOnCreation; private DialogFragment mCurrentDialog; - public static final String EXTRA_ACCOUNT = UploadFilesActivity.class.getCanonicalName() + ".EXTRA_ACCOUNT"; public static final String EXTRA_CHOSEN_FILES = UploadFilesActivity.class.getCanonicalName() + ".EXTRA_CHOSEN_FILES"; public static final int RESULT_OK_AND_MOVE = RESULT_FIRST_USER; @@@ -90,7 -86,7 +84,7 @@@ mCurrentDir = Environment.getExternalStorageDirectory(); } - mAccount = getIntent().getParcelableExtra(EXTRA_ACCOUNT); + mAccountOnCreation = getAccount(); /// USER INTERFACE @@@ -322,7 -318,7 +316,7 @@@ File localFile = new File(localPath); total += localFile.length(); } - return (FileStorageUtils.getUsableSpace(mAccount.name) >= total); + return (FileStorageUtils.getUsableSpace(mAccountOnCreation.name) >= total); } /** @@@ -378,22 -374,6 +372,22 @@@ public void onCancel(String callerTag) { /// nothing to do; don't finish, let the user change the selection Log_OC.d(TAG, "Negative button in dialog was clicked; dialog tag is " + callerTag); + } + + + @Override + protected void onAccountSet(boolean stateWasRecovered) { + if (getAccount() != null) { + if (!mAccountOnCreation.equals(getAccount())) { + setResult(RESULT_CANCELED); + finish(); + } + + } else { + Log_OC.wtf(TAG, "onAccountChanged was called with NULL account associated!"); + setResult(RESULT_CANCELED); + finish(); + } } diff --combined src/com/owncloud/android/ui/adapter/FileListListAdapter.java index b05ba284,f678a934..16c74d38 --- a/src/com/owncloud/android/ui/adapter/FileListListAdapter.java +++ b/src/com/owncloud/android/ui/adapter/FileListListAdapter.java @@@ -1,205 -1,260 +1,255 @@@ - -/* ownCloud Android client application - * Copyright (C) 2011 Bartek Przybylski - * Copyright (C) 2012-2013 ownCloud Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or - * (at your option) any later version. - * - * 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.adapter; - -import java.util.Vector; - -import android.accounts.Account; -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.ImageView; -import android.widget.ListAdapter; -import android.widget.ListView; -import android.widget.TextView; - -import com.owncloud.android.DisplayUtils; -import com.owncloud.android.R; -import com.owncloud.android.authentication.AccountUtils; -import com.owncloud.android.datamodel.DataStorageManager; -import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder; -import com.owncloud.android.files.services.FileUploader.FileUploaderBinder; -import com.owncloud.android.ui.activity.TransferServiceGetter; - -/** - * This Adapter populates a ListView with all files and folders in an ownCloud - * instance. - * - * @author Bartek Przybylski - * - */ -public class FileListListAdapter extends BaseAdapter implements ListAdapter { - private Context mContext; - private OCFile mFile = null; - private Vector mFiles = null; - private DataStorageManager mStorageManager; - private Account mAccount; - private TransferServiceGetter mTransferServiceGetter; - //total size of a directory (recursive) - private Long totalSizeOfDirectoriesRecursive = null; - private Long lastModifiedOfAllSubdirectories = null; - - public FileListListAdapter(OCFile file, DataStorageManager storage_man, - Context context, TransferServiceGetter transferServiceGetter) { - mStorageManager = storage_man; - mContext = context; - mAccount = AccountUtils.getCurrentOwnCloudAccount(mContext); - mTransferServiceGetter = transferServiceGetter; - swapDirectory(file, mStorageManager); - /*mFile = file; - mFiles = mStorageManager.getDirectoryContent(mFile);*/ - } - - @Override - public boolean areAllItemsEnabled() { - return true; - } - - @Override - public boolean isEnabled(int position) { - return true; - } - - @Override - public int getCount() { - return mFiles != null ? mFiles.size() : 0; - } - - @Override - public Object getItem(int position) { - if (mFiles == null || mFiles.size() <= position) - return null; - return mFiles.get(position); - } - - @Override - public long getItemId(int position) { - if (mFiles == null || mFiles.size() <= position) - return 0; - return mFiles.get(position).getFileId(); - } - - @Override - public int getItemViewType(int position) { - return 0; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - View view = convertView; - if (view == null) { - LayoutInflater inflator = (LayoutInflater) mContext - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - view = inflator.inflate(R.layout.list_item, null); - } - if (mFiles != null && mFiles.size() > position) { - OCFile file = mFiles.get(position); - TextView fileName = (TextView) view.findViewById(R.id.Filename); - String name = file.getFileName(); - - fileName.setText(name); - ImageView fileIcon = (ImageView) view.findViewById(R.id.imageView1); - fileIcon.setImageResource(DisplayUtils.getResourceId(file.getMimetype())); - ImageView localStateView = (ImageView) view.findViewById(R.id.imageView2); - FileDownloaderBinder downloaderBinder = mTransferServiceGetter.getFileDownloaderBinder(); - FileUploaderBinder uploaderBinder = mTransferServiceGetter.getFileUploaderBinder(); - if (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, file)) { - localStateView.setImageResource(R.drawable.downloading_file_indicator); - localStateView.setVisibility(View.VISIBLE); - } else if (uploaderBinder != null && uploaderBinder.isUploading(mAccount, file)) { - localStateView.setImageResource(R.drawable.uploading_file_indicator); - localStateView.setVisibility(View.VISIBLE); - } else if (file.isDown()) { - localStateView.setImageResource(R.drawable.local_file_indicator); - localStateView.setVisibility(View.VISIBLE); - } else { - localStateView.setVisibility(View.INVISIBLE); - } - - - TextView fileSizeV = (TextView) view.findViewById(R.id.file_size); - TextView lastModV = (TextView) view.findViewById(R.id.last_mod); - ImageView checkBoxV = (ImageView) view.findViewById(R.id.custom_checkbox); - - if (!file.isDirectory()) { - fileSizeV.setVisibility(View.VISIBLE); - fileSizeV.setText(DisplayUtils.bytesToHumanReadable(file.getFileLength())); - lastModV.setVisibility(View.VISIBLE); - lastModV.setText(DisplayUtils.unixTimeToHumanReadable(file.getModificationTimestamp())); - // this if-else is needed even thoe fav icon is visible by default - // because android reuses views in listview - if (!file.keepInSync()) { - view.findViewById(R.id.imageView3).setVisibility(View.GONE); - } else { - view.findViewById(R.id.imageView3).setVisibility(View.VISIBLE); - } - - ListView parentList = (ListView)parent; - if (parentList.getChoiceMode() == ListView.CHOICE_MODE_NONE) { - checkBoxV.setVisibility(View.GONE); - } else { - if (parentList.isItemChecked(position)) { - checkBoxV.setImageResource(android.R.drawable.checkbox_on_background); - } else { - checkBoxV.setImageResource(android.R.drawable.checkbox_off_background); - } - checkBoxV.setVisibility(View.VISIBLE); - } - - } - else { - - getDirectorySizeNumber(file,true); - if (lastModifiedOfAllSubdirectories == null) - { - lastModV.setVisibility(View.GONE); - fileSizeV.setVisibility(View.GONE); - } - else - { - lastModV.setVisibility(View.VISIBLE); - lastModV.setText(DisplayUtils.unixTimeToHumanReadable(lastModifiedOfAllSubdirectories)); - fileSizeV.setVisibility(View.VISIBLE); - fileSizeV.setText(DisplayUtils.bytesToHumanReadable((totalSizeOfDirectoriesRecursive == null) ? 0 : totalSizeOfDirectoriesRecursive)); - } - checkBoxV.setVisibility(View.GONE); - view.findViewById(R.id.imageView3).setVisibility(View.GONE); - } - } - - return view; - } - - - /** - * - This method counts recursively all subdirectories and their files from the root directory. - * - It also shows a timestamp of the last modificated file inside the root directory - * - * @param OCFile : startDirectory - * @param boolean : counting starts from here ? - */ - private void getDirectorySizeNumber(OCFile directory,boolean startOfRecursive) { - if (startOfRecursive) { - totalSizeOfDirectoriesRecursive = null; - } - Vector files = mStorageManager.getDirectoryContent(directory); - for (OCFile file : files) { - if(!file.isDirectory()) { - if (totalSizeOfDirectoriesRecursive == null) { - totalSizeOfDirectoriesRecursive = file.getFileLength(); - lastModifiedOfAllSubdirectories = file.getModificationTimestamp(); - continue; - } - - totalSizeOfDirectoriesRecursive += file.getFileLength(); - if (lastModifiedOfAllSubdirectories < file.getModificationTimestamp()) { - lastModifiedOfAllSubdirectories = file.getModificationTimestamp(); - } - } - else { - this.getDirectorySizeNumber(file, false); - } - } - } - - - @Override - public int getViewTypeCount() { - return 1; - } - - @Override - public boolean hasStableIds() { - return true; - } - - @Override - public boolean isEmpty() { - return (mFiles == null || mFiles.isEmpty()); - } - - /** - * Change the adapted directory for a new one - * @param directory New file to adapt. Can be NULL, meaning "no content to adapt". - * @param updatedStorageManager Optional updated storage manager; used to replace mStorageManager if is different (and not NULL) - */ - public void swapDirectory(OCFile directory, DataStorageManager updatedStorageManager) { - mFile = directory; - if (updatedStorageManager != null && updatedStorageManager != mStorageManager) { - mStorageManager = updatedStorageManager; - mAccount = AccountUtils.getCurrentOwnCloudAccount(mContext); - } - if (mStorageManager != null) { - mFiles = mStorageManager.getDirectoryContent(mFile); - } else { - mFiles = null; - } - notifyDataSetChanged(); - } - -} +/* ownCloud Android client application + * Copyright (C) 2011 Bartek Przybylski + * Copyright (C) 2012-2013 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.adapter; + - import java.util.Vector; - - import com.owncloud.android.AccountUtils; - import com.owncloud.android.DisplayUtils; - import com.owncloud.android.datamodel.DataStorageManager; - import com.owncloud.android.datamodel.OCFile; - import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder; - import com.owncloud.android.files.services.FileUploader.FileUploaderBinder; - import com.owncloud.android.ui.activity.TransferServiceGetter; - - import com.owncloud.android.R; - +import android.accounts.Account; +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.ListAdapter; +import android.widget.ListView; +import android.widget.TextView; + ++import com.owncloud.android.DisplayUtils; ++import com.owncloud.android.R; ++import com.owncloud.android.authentication.AccountUtils; ++import com.owncloud.android.datamodel.DataStorageManager; ++import com.owncloud.android.datamodel.OCFile; ++import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder; ++import com.owncloud.android.files.services.FileUploader.FileUploaderBinder; ++import com.owncloud.android.ui.activity.TransferServiceGetter; ++ ++import java.util.Vector; ++ ++ +/** + * This Adapter populates a ListView with all files and folders in an ownCloud + * instance. + * + * @author Bartek Przybylski + * + */ +public class FileListListAdapter extends BaseAdapter implements ListAdapter { + private Context mContext; + private OCFile mFile = null; + private Vector mFiles = null; - private DataStorageManager mStorageManager = null; ++ private DataStorageManager mStorageManager; + private Account mAccount; + private TransferServiceGetter mTransferServiceGetter; - ++ //total size of a directory (recursive) ++ private Long totalSizeOfDirectoriesRecursive = null; ++ private Long lastModifiedOfAllSubdirectories = null; ++ + public FileListListAdapter(Context context, TransferServiceGetter transferServiceGetter) { + mContext = context; + mAccount = AccountUtils.getCurrentOwnCloudAccount(mContext); + mTransferServiceGetter = transferServiceGetter; + } + + @Override + public boolean areAllItemsEnabled() { + return true; + } + + @Override + public boolean isEnabled(int position) { + return true; + } + + @Override + public int getCount() { + return mFiles != null ? mFiles.size() : 0; + } + + @Override + public Object getItem(int position) { + if (mFiles == null || mFiles.size() <= position) + return null; + return mFiles.get(position); + } + + @Override + public long getItemId(int position) { + if (mFiles == null || mFiles.size() <= position) + return 0; + return mFiles.get(position).getFileId(); + } + + @Override + public int getItemViewType(int position) { + return 0; + } + ++ + @Override + public View getView(int position, View convertView, ViewGroup parent) { + View view = convertView; + if (view == null) { + LayoutInflater inflator = (LayoutInflater) mContext + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + view = inflator.inflate(R.layout.list_item, null); + } ++ + if (mFiles != null && mFiles.size() > position) { + OCFile file = mFiles.get(position); + TextView fileName = (TextView) view.findViewById(R.id.Filename); + String name = file.getFileName(); + + fileName.setText(name); + ImageView fileIcon = (ImageView) view.findViewById(R.id.imageView1); + fileIcon.setImageResource(DisplayUtils.getResourceId(file.getMimetype())); + ImageView localStateView = (ImageView) view.findViewById(R.id.imageView2); + FileDownloaderBinder downloaderBinder = mTransferServiceGetter.getFileDownloaderBinder(); + FileUploaderBinder uploaderBinder = mTransferServiceGetter.getFileUploaderBinder(); + if (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, file)) { + localStateView.setImageResource(R.drawable.downloading_file_indicator); + localStateView.setVisibility(View.VISIBLE); + } else if (uploaderBinder != null && uploaderBinder.isUploading(mAccount, file)) { + localStateView.setImageResource(R.drawable.uploading_file_indicator); + localStateView.setVisibility(View.VISIBLE); + } else if (file.isDown()) { + localStateView.setImageResource(R.drawable.local_file_indicator); + localStateView.setVisibility(View.VISIBLE); + } else { + localStateView.setVisibility(View.INVISIBLE); + } - + + TextView fileSizeV = (TextView) view.findViewById(R.id.file_size); + TextView lastModV = (TextView) view.findViewById(R.id.last_mod); + ImageView checkBoxV = (ImageView) view.findViewById(R.id.custom_checkbox); + + if (!file.isDirectory()) { + fileSizeV.setVisibility(View.VISIBLE); + fileSizeV.setText(DisplayUtils.bytesToHumanReadable(file.getFileLength())); + lastModV.setVisibility(View.VISIBLE); + lastModV.setText(DisplayUtils.unixTimeToHumanReadable(file.getModificationTimestamp())); + // this if-else is needed even thoe fav icon is visible by default + // because android reuses views in listview + if (!file.keepInSync()) { + view.findViewById(R.id.imageView3).setVisibility(View.GONE); + } else { + view.findViewById(R.id.imageView3).setVisibility(View.VISIBLE); + } + + ListView parentList = (ListView)parent; + if (parentList.getChoiceMode() == ListView.CHOICE_MODE_NONE) { + checkBoxV.setVisibility(View.GONE); + } else { + if (parentList.isItemChecked(position)) { + checkBoxV.setImageResource(android.R.drawable.checkbox_on_background); + } else { + checkBoxV.setImageResource(android.R.drawable.checkbox_off_background); + } + checkBoxV.setVisibility(View.VISIBLE); + } + - } else { - fileSizeV.setVisibility(View.GONE); - lastModV.setVisibility(View.GONE); ++ } ++ else { ++ ++ getDirectorySizeNumber(file,true); ++ if (lastModifiedOfAllSubdirectories == null) ++ { ++ lastModV.setVisibility(View.GONE); ++ fileSizeV.setVisibility(View.GONE); ++ } ++ else ++ { ++ lastModV.setVisibility(View.VISIBLE); ++ lastModV.setText(DisplayUtils.unixTimeToHumanReadable(lastModifiedOfAllSubdirectories)); ++ fileSizeV.setVisibility(View.VISIBLE); ++ fileSizeV.setText(DisplayUtils.bytesToHumanReadable((totalSizeOfDirectoriesRecursive == null) ? 0 : totalSizeOfDirectoriesRecursive)); ++ } + checkBoxV.setVisibility(View.GONE); + view.findViewById(R.id.imageView3).setVisibility(View.GONE); + } + } + + return view; + } - ++ ++ ++ /** ++ * - This method counts recursively all subdirectories and their files from the root directory. ++ * - It also shows a timestamp of the last modificated file inside the root directory ++ * ++ * @param OCFile : startDirectory ++ * @param boolean : counting starts from here ? ++ */ ++ private void getDirectorySizeNumber(OCFile directory,boolean startOfRecursive) { ++ if (startOfRecursive) { ++ totalSizeOfDirectoriesRecursive = null; ++ } ++ Vector files = mStorageManager.getDirectoryContent(directory); ++ for (OCFile file : files) { ++ if(!file.isDirectory()) { ++ if (totalSizeOfDirectoriesRecursive == null) { ++ totalSizeOfDirectoriesRecursive = file.getFileLength(); ++ lastModifiedOfAllSubdirectories = file.getModificationTimestamp(); ++ continue; ++ } ++ ++ totalSizeOfDirectoriesRecursive += file.getFileLength(); ++ if (lastModifiedOfAllSubdirectories < file.getModificationTimestamp()) { ++ lastModifiedOfAllSubdirectories = file.getModificationTimestamp(); ++ } ++ } ++ else { ++ this.getDirectorySizeNumber(file, false); ++ } ++ } ++ } ++ ++ + @Override + public int getViewTypeCount() { + return 1; + } + + @Override + public boolean hasStableIds() { + return true; + } + + @Override + public boolean isEmpty() { + return (mFiles == null || mFiles.isEmpty()); + } + + /** + * Change the adapted directory for a new one + * @param directory New file to adapt. Can be NULL, meaning "no content to adapt". + * @param updatedStorageManager Optional updated storage manager; used to replace mStorageManager if is different (and not NULL) + */ + public void swapDirectory(OCFile directory, DataStorageManager updatedStorageManager) { + mFile = directory; + if (updatedStorageManager != null && updatedStorageManager != mStorageManager) { + mStorageManager = updatedStorageManager; + mAccount = AccountUtils.getCurrentOwnCloudAccount(mContext); + } + if (mStorageManager != null) { + mFiles = mStorageManager.getDirectoryContent(mFile); + } else { + mFiles = null; + } + notifyDataSetChanged(); + } + +} diff --combined src/com/owncloud/android/ui/fragment/OCFileListFragment.java index 015ebaa1,b05e801c..51a32866 --- a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java @@@ -21,9 -21,9 +21,9 @@@ import java.io.File import java.util.ArrayList; import java.util.List; - import com.owncloud.android.AccountUtils; import com.owncloud.android.Log_OC; import com.owncloud.android.R; + import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.datamodel.DataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.files.FileHandler; @@@ -94,7 -94,7 +94,7 @@@ public class OCFileListFragment extend public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Log_OC.e(TAG, "onActivityCreated() start"); - mAdapter = new FileListListAdapter(mContainerActivity.getInitialDirectory(), mContainerActivity.getStorageManager(), getActivity(), mContainerActivity); + mAdapter = new FileListListAdapter(getActivity(), mContainerActivity); setListAdapter(mAdapter); registerForContextMenu(getListView()); @@@ -124,6 -124,7 +124,6 @@@ if (file != null) { if (file.isDirectory()) { // update state and view of this fragment - mFile = file; listDirectory(file); // then, notify parent activity to let it update its state and view, and other fragments mContainerActivity.onBrowsedDownTo(file); @@@ -387,6 -388,14 +387,6 @@@ /** - * Callback method invoked when the parent activity is fully created to get the directory to list firstly. - * - * @return Directory to list firstly. Can be NULL. - */ - public OCFile getInitialDirectory(); - - - /** * Callback method invoked when a the 'transfer state' of a file changes. * * This happens when a download or upload is started or ended for a file. diff --combined src/com/owncloud/android/ui/preview/PreviewImageActivity.java index b9ede075,1c1e0f60..0a603050 --- a/src/com/owncloud/android/ui/preview/PreviewImageActivity.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageActivity.java @@@ -16,6 -16,7 +16,6 @@@ */ package com.owncloud.android.ui.preview; -import android.accounts.Account; import android.app.Dialog; import android.app.ProgressDialog; import android.content.BroadcastReceiver; @@@ -32,8 -33,10 +32,9 @@@ import android.view.View import android.view.View.OnTouchListener; import com.actionbarsherlock.app.ActionBar; -import com.actionbarsherlock.app.SherlockFragmentActivity; import com.actionbarsherlock.view.MenuItem; import com.actionbarsherlock.view.Window; + import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.datamodel.DataStorageManager; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; @@@ -44,12 -47,12 +45,12 @@@ import com.owncloud.android.files.servi import com.owncloud.android.ui.activity.FileActivity; import com.owncloud.android.ui.activity.FileDisplayActivity; import com.owncloud.android.ui.fragment.FileFragment; - import com.owncloud.android.AccountUtils; + import com.owncloud.android.Log_OC; import com.owncloud.android.R; /** - * Used as an utility to preview image files contained in an ownCloud account. + * Holds a swiping galley where image files contained in an ownCloud directory are shown * * @author David A. Velasco */ @@@ -62,6 -65,9 +63,6 @@@ public class PreviewImageActivity exten public static final String KEY_WAITING_TO_PREVIEW = "WAITING_TO_PREVIEW"; private static final String KEY_WAITING_FOR_BINDER = "WAITING_FOR_BINDER"; - private OCFile mFile; - private OCFile mParentFolder; - private Account mAccount; private DataStorageManager mStorageManager; private ViewPager mViewPager; @@@ -82,35 -88,53 +83,35 @@@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - mFile = getIntent().getParcelableExtra(FileActivity.EXTRA_FILE); - mAccount = getIntent().getParcelableExtra(FileActivity.EXTRA_ACCOUNT); - if (mFile == null) { - throw new IllegalStateException("Instanced with a NULL OCFile"); - } - if (mAccount == null) { - throw new IllegalStateException("Instanced with a NULL ownCloud Account"); - } - if (!mFile.isImage()) { - throw new IllegalArgumentException("Non-image file passed as argument"); - } requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY); setContentView(R.layout.preview_image_activity); - + ActionBar actionBar = getSupportActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); - actionBar.setTitle(mFile.getFileName()); actionBar.hide(); mFullScreen = true; - - mStorageManager = new FileDataStorageManager(mAccount, getContentResolver()); - mParentFolder = mStorageManager.getFileById(mFile.getParentId()); - if (mParentFolder == null) { - // should not be necessary - mParentFolder = mStorageManager.getFileByPath(OCFile.PATH_SEPARATOR); - } - if (savedInstanceState != null) { mRequestWaitingForBinder = savedInstanceState.getBoolean(KEY_WAITING_FOR_BINDER); } else { mRequestWaitingForBinder = false; } - - createViewPager(); - } - private void createViewPager() { - mPreviewImagePagerAdapter = new PreviewImagePagerAdapter(getSupportFragmentManager(), mParentFolder, mAccount, mStorageManager); + private void initViewPager() { + OCFile parentFolder = mStorageManager.getFileById(getFile().getParentId()); + if (parentFolder == null) { + // should not be necessary + parentFolder = mStorageManager.getFileByPath(OCFile.PATH_SEPARATOR); + } + mPreviewImagePagerAdapter = new PreviewImagePagerAdapter(getSupportFragmentManager(), parentFolder, getAccount(), mStorageManager); mViewPager = (ViewPager) findViewById(R.id.fragmentPager); - int position = mPreviewImagePagerAdapter.getFilePosition(mFile); + int position = mPreviewImagePagerAdapter.getFilePosition(getFile()); position = (position >= 0) ? position : 0; mViewPager.setAdapter(mPreviewImagePagerAdapter); mViewPager.setOnPageChangeListener(this); mViewPager.setCurrentItem(position); - if (position == 0 && !mFile.isDown()) { + if (position == 0 && !getFile().isDown()) { // this is necessary because mViewPager.setCurrentItem(0) just after setting the adapter does not result in a call to #onPageSelected(0) mRequestWaitingForBinder = true; } @@@ -296,9 -320,9 +297,9 @@@ if (mDownloaderBinder == null) { Log_OC.d(TAG, "requestForDownload called without binder to download service"); - } else if (!mDownloaderBinder.isDownloading(mAccount, file)) { + } else if (!mDownloaderBinder.isDownloading(getAccount(), file)) { Intent i = new Intent(this, FileDownloader.class); - i.putExtra(FileDownloader.EXTRA_ACCOUNT, mAccount); + i.putExtra(FileDownloader.EXTRA_ACCOUNT, getAccount()); i.putExtra(FileDownloader.EXTRA_FILE, file); startService(i); } @@@ -361,7 -385,7 +362,7 @@@ public void onReceive(Context context, Intent intent) { String accountName = intent.getStringExtra(FileDownloader.ACCOUNT_NAME); String downloadedRemotePath = intent.getStringExtra(FileDownloader.EXTRA_REMOTE_PATH); - if (mAccount.name.equals(accountName) && + if (getAccount().name.equals(accountName) && downloadedRemotePath != null) { OCFile file = mStorageManager.getFileByPath(downloadedRemotePath); @@@ -412,33 -436,7 +413,33 @@@ @Override protected void onAccountSet(boolean stateWasRecovered) { - // TODO + if (getAccount() != null) { + OCFile file = getFile(); + /// Validate handled file (first image to preview) + if (file == null) { + throw new IllegalStateException("Instanced with a NULL OCFile"); + } + if (!file.isImage()) { + throw new IllegalArgumentException("Non-image file passed as argument"); + } + mStorageManager = new FileDataStorageManager(getAccount(), getContentResolver()); + 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 + getSupportActionBar().setTitle(getFile().getFileName()); + //if (!stateWasRecovered) { + initViewPager(); + //} + + } else { + // handled file not in the current Account + finish(); + } + + } else { + Log_OC.wtf(TAG, "onAccountChanged was called with NULL account associated!"); + } } diff --combined src/com/owncloud/android/ui/preview/PreviewVideoActivity.java index f315cc43,c4b6dce7..0cab2e2b --- a/src/com/owncloud/android/ui/preview/PreviewVideoActivity.java +++ b/src/com/owncloud/android/ui/preview/PreviewVideoActivity.java @@@ -18,6 -18,7 +18,6 @@@ package com.owncloud.android.ui.preview; import android.accounts.Account; -import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; @@@ -27,17 -28,16 +27,18 @@@ import android.media.MediaPlayer.OnErro import android.media.MediaPlayer.OnPreparedListener; import android.net.Uri; import android.os.Bundle; -import android.view.MotionEvent; import android.widget.MediaController; import android.widget.VideoView; - import com.owncloud.android.AccountUtils; import com.owncloud.android.Log_OC; import com.owncloud.android.R; +import com.owncloud.android.datamodel.DataStorageManager; +import com.owncloud.android.datamodel.FileDataStorageManager; + import com.owncloud.android.authentication.AccountUtils; + import com.owncloud.android.authentication.AccountUtils.AccountNotFoundException; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.media.MediaService; +import com.owncloud.android.ui.activity.FileActivity; /** * Activity implementing a basic video player. @@@ -49,8 -49,14 +50,8 @@@ * * @author David A. Velasco */ -public class PreviewVideoActivity extends Activity implements OnCompletionListener, OnPreparedListener, OnErrorListener { +public class PreviewVideoActivity extends FileActivity implements OnCompletionListener, OnPreparedListener, OnErrorListener { - /** Key to receive an {@link OCFile} to play as an extra value in an {@link Intent} */ - public static final String EXTRA_FILE = "FILE"; - - /** Key to receive the ownCloud {@link Account} where the file to play is saved as an extra value in an {@link Intent} */ - public static final String EXTRA_ACCOUNT = "ACCOUNT"; - /** Key to receive a flag signaling if the video should be started immediately */ public static final String EXTRA_AUTOPLAY = "AUTOPLAY"; @@@ -59,8 -65,8 +60,8 @@@ private static final String TAG = PreviewVideoActivity.class.getSimpleName(); - private OCFile mFile; // video file to play - private Account mAccount; // ownCloud account holding mFile + private DataStorageManager mStorageManager; + private int mSavedPlaybackPosition; // in the unit time handled by MediaPlayer.getCurrentPosition() private boolean mAutoplay; // when 'true', the playback starts immediately with the activity private VideoView mVideoPlayer; // view to play the file; both performs and show the playback @@@ -85,10 -91,14 +86,10 @@@ if (savedInstanceState == null) { Bundle extras = getIntent().getExtras(); - mFile = extras.getParcelable(EXTRA_FILE); - mAccount = extras.getParcelable(EXTRA_ACCOUNT); mSavedPlaybackPosition = extras.getInt(EXTRA_START_POSITION); mAutoplay = extras.getBoolean(EXTRA_AUTOPLAY); } else { - mFile = savedInstanceState.getParcelable(EXTRA_FILE); - mAccount = savedInstanceState.getParcelable(EXTRA_ACCOUNT); mSavedPlaybackPosition = savedInstanceState.getInt(EXTRA_START_POSITION); mAutoplay = savedInstanceState.getBoolean(EXTRA_AUTOPLAY); } @@@ -102,6 -112,34 +103,6 @@@ // keep the screen on while the playback is performed (prevents screen off by battery save) mVideoPlayer.setKeepScreenOn(true); - - if (mFile != null) { - if (mFile.isDown()) { - mVideoPlayer.setVideoPath(mFile.getStoragePath()); - - } else if (mAccount != null) { - // not working yet - String url; - try { - url = AccountUtils.constructFullURLForAccount(this, mAccount) + mFile.getRemotePath(); - mVideoPlayer.setVideoURI(Uri.parse(url)); - } catch (AccountNotFoundException e) { - onError(null, MediaService.OC_MEDIA_ERROR, R.string.media_err_no_account); - } - - } else { - onError(null, MediaService.OC_MEDIA_ERROR, R.string.media_err_no_account); - } - - // create and prepare control panel for the user - mMediaController = new MediaController(this); - mMediaController.setMediaPlayer(mVideoPlayer); - mMediaController.setAnchorView(mVideoPlayer); - mVideoPlayer.setMediaController(mMediaController); - - } else { - onError(null, MediaService.OC_MEDIA_ERROR, R.string.media_err_nothing_to_play); - } } @@@ -112,6 -150,8 +113,6 @@@ public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Log_OC.e(TAG, "ACTIVITY\t\tonSaveInstanceState"); - outState.putParcelable(PreviewVideoActivity.EXTRA_FILE, mFile); - outState.putParcelable(PreviewVideoActivity.EXTRA_ACCOUNT, mAccount); outState.putInt(PreviewVideoActivity.EXTRA_START_POSITION, mVideoPlayer.getCurrentPosition()); outState.putBoolean(PreviewVideoActivity.EXTRA_AUTOPLAY , mVideoPlayer.isPlaying()); } @@@ -128,6 -168,39 +129,6 @@@ } - @Override - public void onResume() { - super.onResume(); - Log_OC.e(TAG, "ACTIVTIY\t\tonResume"); - } - - - @Override - public void onStart() { - super.onStart(); - Log_OC.e(TAG, "ACTIVTIY\t\tonStart"); - } - - @Override - public void onDestroy() { - super.onDestroy(); - Log_OC.e(TAG, "ACTIVITY\t\tonDestroy"); - } - - @Override - public void onStop() { - super.onStop(); - Log_OC.e(TAG, "ACTIVTIY\t\tonStop"); - } - - - @Override - public void onPause() { - super.onPause(); - Log_OC.e(TAG, "ACTIVTIY\t\tonPause"); - } - - /** * Called when the file is ready to be played. * @@@ -191,43 -264,25 +192,48 @@@ } - /** - * Screen touches trigger the appearance of the control panel for a limited time. - * - * {@inheritDoc} - */ @Override - public boolean onTouchEvent (MotionEvent ev){ - /*if (ev.getAction() == MotionEvent.ACTION_DOWN) { - if (mMediaController.isShowing()) { - mMediaController.hide(); + protected void onAccountSet(boolean stateWasRecovered) { + if (getAccount() != null) { + OCFile file = getFile(); + /// Validate handled file (first image to preview) + if (file == null) { + throw new IllegalStateException("Instanced with a NULL OCFile"); + } + if (!file.isVideo()) { + throw new IllegalArgumentException("Non-video file passed as argument"); + } + mStorageManager = new FileDataStorageManager(getAccount(), getContentResolver()); + file = mStorageManager.getFileById(file.getFileId()); + if (file != null) { + if (file.isDown()) { + mVideoPlayer.setVideoPath(file.getStoragePath()); + + } else { - // not working now - String url = AccountUtils.constructFullURLForAccount(this, getAccount()) + file.getRemotePath(); - mVideoPlayer.setVideoURI(Uri.parse(url)); ++ // not working yet ++ String url; ++ try { ++ url = AccountUtils.constructFullURLForAccount(this, getAccount()) + file.getRemotePath(); ++ mVideoPlayer.setVideoURI(Uri.parse(url)); ++ } catch (AccountNotFoundException e) { ++ onError(null, MediaService.OC_MEDIA_ERROR, R.string.media_err_no_account); ++ } + } + + // create and prepare control panel for the user + mMediaController = new MediaController(this); + mMediaController.setMediaPlayer(mVideoPlayer); + mMediaController.setAnchorView(mVideoPlayer); + mVideoPlayer.setMediaController(mMediaController); + } else { - mMediaController.show(MediaService.MEDIA_CONTROL_SHORT_LIFE); + finish(); } - return true; } else { - return false; - }*/ - return false; - } + Log_OC.wtf(TAG, "onAccountChanged was called with NULL account associated!"); + finish(); + } + } }