android:layout_centerHorizontal="true"
android:text="@string/fd_keep_in_sync" />
- <ImageView
- android:id="@+id/fdPreview"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_below="@id/fdKeepInSync"
- android:layout_centerHorizontal="true"
- android:layout_marginTop="16dp"
- android:src="@drawable/owncloud_logo" />
-
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_below="@id/fdPreview"
+ android:layout_below="@id/fdKeepInSync"
android:orientation="vertical" >
<LinearLayout
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:id="@+id/action_open_file_with" android:title="@string/filedetails_open" android:icon="@android:drawable/ic_menu_edit" android:orderInCategory="1" />
+ <item android:id="@+id/action_download_file" android:title="@string/filedetails_download" android:orderInCategory="1" />
+ <item android:id="@+id/action_cancel_download" android:title="@string/common_cancel_download" android:icon="@android:drawable/ic_menu_close_clear_cancel" android:orderInCategory="1" />
+ <item android:id="@+id/action_cancel_upload" android:title="@string/common_cancel_upload" android:icon="@android:drawable/ic_menu_close_clear_cancel" android:orderInCategory="1" />
+ <item android:id="@+id/action_rename_file" android:title="@string/common_rename" android:icon="@android:drawable/ic_menu_set_as" android:orderInCategory="1" />
+ <item android:id="@+id/action_remove_file" android:title="@string/common_remove" android:icon="@android:drawable/ic_menu_delete" android:orderInCategory="1" />
+ <item android:id="@+id/action_see_details" android:title="@string/actionbar_see_details" android:icon="@android:drawable/ic_menu_view" android:orderInCategory="1" />
+
+</menu>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
-
- <item android:id="@+id/open_file_item"
- android:title="@string/filedetails_open"
- android:icon="@android:drawable/ic_menu_edit"
- />
-
- <item android:id="@+id/download_file_item"
- android:title="@string/filedetails_download"
- />
-
- <item android:id="@+id/cancel_download_item"
- android:title="@string/common_cancel_download"
- android:icon="@android:drawable/ic_menu_close_clear_cancel"
- />
-
- <item android:id="@+id/cancel_upload_item"
- android:title="@string/common_cancel_upload"
- android:icon="@android:drawable/ic_menu_close_clear_cancel"
- />
-
- <item android:id="@+id/rename_file_item"
- android:title="@string/common_rename"
- android:icon="@android:drawable/ic_menu_set_as"
- />
-
- <item android:id="@+id/remove_file_item"
- android:title="@string/common_remove"
- android:icon="@android:drawable/ic_menu_delete"
- />
-
-</menu>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<menu
+ xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:id="@+id/action_sync_account" android:title="@string/actionbar_sync" android:icon="@drawable/ic_action_refresh" android:orderInCategory="2" />
+ <item android:id="@+id/action_create_dir" android:title="@string/actionbar_mkdir" android:icon="@drawable/ic_action_create_dir" android:orderInCategory="2" />
+ <item android:id="@+id/action_upload" android:title="@string/actionbar_upload" android:icon="@drawable/ic_action_upload" android:orderInCategory="2" />
+ <item android:id="@+id/action_settings" android:title="@string/actionbar_settings" android:icon="@android:drawable/ic_menu_preferences" android:orderInCategory="2" />
+ <item android:id="@+id/action_about_app" android:title="@string/about_title" android:icon="@android:drawable/ic_menu_info_details" android:orderInCategory="2" />
+
+ <!-- <item android:id="@+id/search" android:title="@string/actionbar_search" android:icon="@drawable/ic_action_search"></item>-->
+</menu>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<menu
- xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:id="@+id/startSync" android:title="@string/actionbar_sync" android:icon="@drawable/ic_action_refresh"></item>
- <item android:id="@+id/createDirectoryItem" android:title="@string/actionbar_mkdir" android:icon="@drawable/ic_action_create_dir"></item>
-
- <!-- <item android:id="@+id/search" android:title="@string/actionbar_search" android:icon="@drawable/ic_action_search"></item>-->
- <item android:id="@+id/action_upload" android:title="@string/actionbar_upload" android:icon="@drawable/ic_action_upload"></item>
- <item android:id="@+id/action_settings" android:title="@string/actionbar_settings" android:icon="@android:drawable/ic_menu_preferences"></item>
- <item android:id="@+id/about_app" android:title="@string/about_title" android:icon="@android:drawable/ic_menu_info_details"></item>
-</menu>
<string name="actionbar_mkdir">Create directory</string>
<string name="actionbar_search">Search</string>
<string name="actionbar_settings">Settings</string>
+ <string name="actionbar_see_details">See details</string>
<string name="prefs_category_general">General</string>
<string name="prefs_category_trackmydevice">Device tracking</string>
import com.owncloud.android.files.services.FileUploader;\r
import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;\r
import com.owncloud.android.ui.fragment.FileDetailFragment;\r
+import com.owncloud.android.ui.fragment.FileFragment;\r
import com.owncloud.android.ui.fragment.FilePreviewFragment;\r
\r
+import com.owncloud.android.AccountUtils;\r
import com.owncloud.android.R;\r
\r
/**\r
\r
public static final String TAG = FileDetailActivity.class.getSimpleName();\r
\r
+ public static final String EXTRA_MODE = "MODE";\r
+ public static final int MODE_DETAILS = 0;\r
+ public static final int MODE_PREVIEW = 1;\r
+ \r
private boolean mConfigurationChangedToLandscape = false;\r
private FileDownloaderBinder mDownloaderBinder = null;\r
private ServiceConnection mDownloadConnection, mUploadConnection = null;\r
private void createChildFragment() {\r
OCFile file = getIntent().getParcelableExtra(FileDetailFragment.EXTRA_FILE);\r
Account account = getIntent().getParcelableExtra(FileDetailFragment.EXTRA_ACCOUNT);\r
+ int mode = getIntent().getIntExtra(EXTRA_MODE, MODE_PREVIEW); \r
+ \r
Fragment newFragment = null;\r
- if (FilePreviewFragment.canBePreviewed(file)) {\r
+ if (FilePreviewFragment.canBePreviewed(file) && mode == MODE_PREVIEW) {\r
newFragment = new FilePreviewFragment(file, account);\r
\r
} else {\r
public FileUploaderBinder getFileUploaderBinder() {\r
return mUploaderBinder;\r
}\r
+\r
+\r
+ @Override\r
+ public void showFragmentWithDetails(OCFile file) {\r
+ FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();\r
+ transaction.replace(R.id.fragment, new FileDetailFragment(file, (Account) getIntent().getParcelableExtra(FileDetailFragment.EXTRA_ACCOUNT)), FileDetailFragment.FTAG); \r
+ transaction.commit();\r
+ }\r
\r
}\r
import java.io.File;\r
\r
import android.accounts.Account;\r
+import android.app.Activity;\r
import android.app.AlertDialog;\r
import android.app.ProgressDialog;\r
import android.app.AlertDialog.Builder;\r
\r
private static final String TAG = "FileDisplayActivity";\r
\r
- private static int[] mMenuIdentifiersToPatch = {R.id.about_app};\r
+ private static int[] mMenuIdentifiersToPatch = {R.id.action_about_app};\r
\r
@Override\r
public void onCreate(Bundle savedInstanceState) {\r
@Override\r
public boolean onCreateOptionsMenu(Menu menu) {\r
MenuInflater inflater = getSherlock().getMenuInflater();\r
- inflater.inflate(R.menu.menu, menu);\r
+ inflater.inflate(R.menu.main_menu, menu);\r
\r
patchHiddenAccents(menu);\r
\r
public boolean onOptionsItemSelected(MenuItem item) {\r
boolean retval = true;\r
switch (item.getItemId()) {\r
- case R.id.createDirectoryItem: {\r
+ case R.id.action_create_dir: {\r
showDialog(DIALOG_CREATE_DIR);\r
break;\r
}\r
- case R.id.startSync: {\r
+ case R.id.action_sync_account: {\r
startSynchronization();\r
break;\r
}\r
startActivity(settingsIntent);\r
break;\r
}\r
- case R.id.about_app : {\r
+ case R.id.action_about_app: {\r
showDialog(DIALOG_ABOUT_APP);\r
break;\r
}\r
}\r
\r
\r
- \r
+ @Override\r
+ public void showFragmentWithDetails(OCFile file) {\r
+ if (mDualPane) {\r
+ FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();\r
+ transaction.replace(R.id.file_details_container, new FileDetailFragment(file, AccountUtils.getCurrentOwnCloudAccount(this)), FileDetailFragment.FTAG); \r
+ transaction.commit();\r
+ \r
+ } else {\r
+ Intent showDetailsIntent = new Intent(this, FileDetailActivity.class);\r
+ showDetailsIntent.putExtra(FileDetailFragment.EXTRA_FILE, file);\r
+ showDetailsIntent.putExtra(FileDetailFragment.EXTRA_ACCOUNT, AccountUtils.getCurrentOwnCloudAccount(this));\r
+ showDetailsIntent.putExtra(FileDetailActivity.EXTRA_MODE, FileDetailActivity.MODE_DETAILS);\r
+ startActivity(showDetailsIntent);\r
+ }\r
+ }\r
\r
\r
}\r
String[] args = {getString(R.string.app_name)};
ConfirmationDialogFragment dialog = ConfirmationDialogFragment.newInstance(R.string.upload_query_move_foreign_files, args, R.string.common_yes, -1, R.string.common_no);
dialog.setOnConfirmationListener(UploadFilesActivity.this);
- mCurrentDialog = dialog;
- mCurrentDialog.show(getSupportFragmentManager(), QUERY_TO_MOVE_DIALOG_TAG);
+ dialog.show(getSupportFragmentManager(), QUERY_TO_MOVE_DIALOG_TAG);
}
}
}
setResult(RESULT_OK_AND_MOVE, data);
finish();
}
- mCurrentDialog.dismiss();
- mCurrentDialog = null;
}
@Override
public void onNeutral(String callerTag) {
Log.d(TAG, "Phantom neutral button in dialog was clicked; dialog tag is " + callerTag);
- mCurrentDialog.dismiss();
- mCurrentDialog = null;
}
public void onCancel(String callerTag) {
/// nothing to do; don't finish, let the user change the selection
Log.d(TAG, "Negative button in dialog was clicked; dialog tag is " + callerTag);
- mCurrentDialog.dismiss();
- mCurrentDialog = null;
}
public final static String ARG_NEUTRAL_BTN_RES = "neutral_btn_res";
public final static String ARG_NEGATIVE_BTN_RES = "negative_btn_res";
+ public static final String FTAG_CONFIRMATION = "CONFIRMATION_FRAGMENT";
+
private ConfirmationDialogFragmentListener mListener;
/**
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
mListener.onConfirmation(getTag());
+ dialog.dismiss();
}
});
if (neuBtn != -1)
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
mListener.onNeutral(getTag());
+ dialog.dismiss();
}
});
if (negBtn != -1)
@Override
public void onClick(DialogInterface dialog, int which) {
mListener.onCancel(getTag());
+ dialog.dismiss();
}
});
return builder.create();
* @author David A. Velasco\r
*/\r
public class FileDetailFragment extends SherlockFragment implements\r
- OnClickListener, OnTouchListener, \r
+ OnClickListener, \r
ConfirmationDialogFragment.ConfirmationDialogFragmentListener, OnRemoteOperationListener, EditNameDialogListener,\r
FileFragment {\r
\r
public static final String EXTRA_FILE = "FILE";\r
public static final String EXTRA_ACCOUNT = "ACCOUNT";\r
\r
- private FileDetailFragment.ContainerActivity mContainerActivity;\r
+ private FileFragment.ContainerActivity mContainerActivity;\r
\r
private int mLayout;\r
private View mView;\r
private OCFile mFile;\r
private Account mAccount;\r
private FileDataStorageManager mStorageManager;\r
- private ImageView mPreview;\r
\r
private DownloadFinishReceiver mDownloadFinishReceiver;\r
private UploadFinishReceiver mUploadFinishReceiver;\r
\r
private Handler mHandler;\r
private RemoteOperation mLastRemoteOperation;\r
- private DialogFragment mCurrentDialog;\r
\r
private MediaServiceBinder mMediaServiceBinder = null;\r
private MediaController mMediaController = null;\r
mView.findViewById(R.id.fdOpenBtn).setOnClickListener(this);\r
mView.findViewById(R.id.fdRemoveBtn).setOnClickListener(this);\r
//mView.findViewById(R.id.fdShareBtn).setOnClickListener(this);\r
- mPreview = (ImageView)mView.findViewById(R.id.fdPreview);\r
- mPreview.setOnTouchListener(this);\r
}\r
\r
updateFileDetails(false);\r
filter = new IntentFilter(FileUploader.UPLOAD_FINISH_MESSAGE);\r
getActivity().registerReceiver(mUploadFinishReceiver, filter);\r
\r
- mPreview = (ImageView)mView.findViewById(R.id.fdPreview); // this is here just because it is nullified in onPause()\r
- \r
}\r
\r
\r
getActivity().unregisterReceiver(mUploadFinishReceiver);\r
mUploadFinishReceiver = null;\r
\r
- if (mPreview != null) { // why?\r
- mPreview = null;\r
- }\r
- \r
}\r
\r
\r
mFile.isDown() ? R.string.confirmation_remove_local : -1,\r
R.string.common_cancel);\r
confDialog.setOnConfirmationListener(this);\r
- mCurrentDialog = confDialog;\r
- mCurrentDialog.show(getFragmentManager(), FTAG_CONFIRMATION);\r
+ confDialog.show(getFragmentManager(), FTAG_CONFIRMATION);\r
break;\r
}\r
case R.id.fdOpenBtn: {\r
}\r
\r
\r
- @Override\r
- public boolean onTouch(View v, MotionEvent event) {\r
- if (v == mPreview && event.getAction() == MotionEvent.ACTION_DOWN && mFile != null && mFile.isDown()) {\r
- if (mFile.isVideo()) {\r
- startVideoActivity();\r
- }\r
- }\r
- return false;\r
- }\r
-\r
- \r
private void startVideoActivity() {\r
Intent i = new Intent(getActivity(), VideoActivity.class);\r
i.putExtra(VideoActivity.EXTRA_FILE, mFile);\r
getActivity().showDialog((inDisplayActivity)? FileDisplayActivity.DIALOG_SHORT_WAIT : FileDetailActivity.DIALOG_SHORT_WAIT);\r
}\r
}\r
- mCurrentDialog.dismiss();\r
- mCurrentDialog = null;\r
}\r
\r
@Override\r
mStorageManager.saveFile(mFile);\r
updateFileDetails(mFile, mAccount);\r
}\r
- mCurrentDialog.dismiss();\r
- mCurrentDialog = null;\r
}\r
\r
@Override\r
public void onCancel(String callerTag) {\r
Log.d(TAG, "REMOVAL CANCELED");\r
- mCurrentDialog.dismiss();\r
- mCurrentDialog = null;\r
}\r
\r
\r
setButtonsForTransferring();\r
\r
} else if (mFile.isDown()) {\r
- // Update preview\r
- if (mFile.getMimetype().startsWith("image/")) {\r
- BitmapLoader bl = new BitmapLoader();\r
- bl.execute(new String[]{mFile.getStoragePath()});\r
- }\r
\r
setButtonsForDown();\r
\r
\r
\r
/**\r
- * Interface to implement by any Activity that includes some instance of FileDetailFragment\r
- * \r
- * @author David A. Velasco\r
- */\r
- public interface ContainerActivity extends TransferServiceGetter {\r
-\r
- /**\r
- * Callback method invoked when the detail fragment wants to notice its container \r
- * activity about a relevant state the file shown by the fragment.\r
- * \r
- * Added to notify to FileDisplayActivity about the need of refresh the files list. \r
- * \r
- * Currently called when:\r
- * - a download is started;\r
- * - a rename is completed;\r
- * - a deletion is completed;\r
- * - the 'inSync' flag is changed;\r
- */\r
- public void onFileStateChanged();\r
- \r
- }\r
- \r
-\r
- /**\r
* Once the file download has finished -> update view\r
* @author Bartek Przybylski\r
*/\r
}\r
\r
\r
- class BitmapLoader extends AsyncTask<String, Void, Bitmap> {\r
- @SuppressLint({ "NewApi", "NewApi", "NewApi" }) // to avoid Lint errors since Android SDK r20\r
- @Override\r
- protected Bitmap doInBackground(String... params) {\r
- Bitmap result = null;\r
- if (params.length != 1) return result;\r
- String storagePath = params[0];\r
- try {\r
-\r
- BitmapFactory.Options options = new Options();\r
- options.inScaled = true;\r
- options.inPurgeable = true;\r
- options.inJustDecodeBounds = 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
- result = BitmapFactory.decodeFile(storagePath, options);\r
- options.inJustDecodeBounds = false;\r
-\r
- int width = options.outWidth;\r
- int height = options.outHeight;\r
- int scale = 1;\r
- if (width >= 2048 || height >= 2048) {\r
- scale = (int) Math.ceil((Math.ceil(Math.max(height, width) / 2048.)));\r
- options.inSampleSize = scale;\r
- }\r
- Display display = getActivity().getWindowManager().getDefaultDisplay();\r
- Point size = new Point();\r
- int screenwidth;\r
- if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB_MR2) {\r
- display.getSize(size);\r
- screenwidth = size.x;\r
- } else {\r
- screenwidth = display.getWidth();\r
- }\r
-\r
- Log.e("ASD", "W " + width + " SW " + screenwidth);\r
-\r
- if (width > screenwidth) {\r
- scale = (int) Math.ceil((float)width / screenwidth);\r
- options.inSampleSize = scale;\r
- }\r
-\r
- result = BitmapFactory.decodeFile(storagePath, options);\r
-\r
- Log.e("ASD", "W " + options.outWidth + " SW " + options.outHeight);\r
-\r
- } catch (OutOfMemoryError e) {\r
- result = null;\r
- Log.e(TAG, "Out of memory occured for file with size " + storagePath);\r
- \r
- } catch (NoSuchFieldError e) {\r
- result = null;\r
- Log.e(TAG, "Error from access to unexisting field despite protection " + storagePath);\r
- \r
- } catch (Throwable t) {\r
- result = null;\r
- Log.e(TAG, "Unexpected error while creating image preview " + storagePath, t);\r
- }\r
- return result;\r
- }\r
- @Override\r
- protected void onPostExecute(Bitmap result) {\r
- if (result != null && mPreview != null) {\r
- mPreview.setImageBitmap(result);\r
- }\r
- }\r
- \r
- }\r
-\r
/**\r
* {@inheritDoc}\r
*/\r
import android.support.v4.app.Fragment;
import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.ui.activity.TransferServiceGetter;
/**
* Common methods for {@link Fragment}s containing {@link OCFile}s
* @return The {@link OCFile} hold
*/
public OCFile getFile();
+
+
+ /**
+ * Interface to implement by any Activity that includes some instance of FileFragment
+ *
+ * @author David A. Velasco
+ */
+ public interface ContainerActivity extends TransferServiceGetter {
+
+ /**
+ * Callback method invoked when the detail fragment wants to notice its container
+ * activity about a relevant state the file shown by the fragment.
+ *
+ * Added to notify to FileDisplayActivity about the need of refresh the files list.
+ *
+ * Currently called when:
+ * - a download is started;
+ * - a rename is completed;
+ * - a deletion is completed;
+ * - the 'inSync' flag is changed;
+ */
+ public void onFileStateChanged();
+
+ /**
+ * Request the parent activity to show the details of an {@link OCFile}.
+ *
+ * @param file File to show details
+ */
+ public void showFragmentWithDetails(OCFile file);
+
+ }
+
}
import android.widget.TextView;
import android.widget.Toast;
import android.widget.VideoView;
+import android.widget.AdapterView.AdapterContextMenuInfo;
import com.actionbarsherlock.app.SherlockFragment;
+import com.actionbarsherlock.view.Menu;
+import com.actionbarsherlock.view.MenuInflater;
+import com.actionbarsherlock.view.MenuItem;
import com.owncloud.android.AccountUtils;
import com.owncloud.android.DisplayUtils;
import com.owncloud.android.authenticator.AccountAuthenticator;
* @author David A. Velasco
*/
public class FilePreviewFragment extends SherlockFragment implements
- /*OnClickListener,*/ OnTouchListener , FileFragment
- /*ConfirmationDialogFragment.ConfirmationDialogFragmentListener, OnRemoteOperationListener, EditNameDialogListener*/ {
+ /*OnClickListener,*/ OnTouchListener , FileFragment,
+ ConfirmationDialogFragment.ConfirmationDialogFragmentListener, OnRemoteOperationListener /*, EditNameDialogListener*/ {
public static final String EXTRA_FILE = "FILE";
public static final String EXTRA_ACCOUNT = "ACCOUNT";
private static final String EXTRA_PLAY_POSITION = "PLAY_POSITION";
- //private FilePreviewFragment.ContainerActivity mContainerActivity;
-
private View mView;
private OCFile mFile;
private Account mAccount;
- //private FileDataStorageManager mStorageManager;
+ private FileDataStorageManager mStorageManager;
private ImageView mImagePreview;
public Bitmap mBitmap = null;
private VideoView mVideoPreview;
//private DownloadFinishReceiver mDownloadFinishReceiver;
//private UploadFinishReceiver mUploadFinishReceiver;
- //private Handler mHandler;
- //private RemoteOperation mLastRemoteOperation;
- //private DialogFragment mCurrentDialog;
+ private Handler mHandler;
+ private RemoteOperation mLastRemoteOperation;
private MediaServiceBinder mMediaServiceBinder = null;
private MediaController mMediaController = null;
private VideoHelper mVideoHelper;
private static final String TAG = FilePreviewFragment.class.getSimpleName();
- public static final String FTAG = FilePreviewFragment.class.getSimpleName();;
- //public static final String FTAG_CONFIRMATION = "REMOVE_CONFIRMATION_FRAGMENT";
/**
mFile = fileToDetail;
mAccount = ocAccount;
mSavedPlaybackPosition = 0;
- //mStorageManager = null; // we need a context to init this; the container activity is not available yet at this moment
+ mStorageManager = null; // we need a context to init this; the container activity is not available yet at this moment
}
mFile = null;
mAccount = null;
mSavedPlaybackPosition = 0;
- //mStorageManager = null;
+ mStorageManager = null;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- //mHandler = new Handler();
+ mHandler = new Handler();
+ setHasOptionsMenu(true);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
+ if (!(activity instanceof FileFragment.ContainerActivity))
+ throw new ClassCastException(activity.toString() + " must implement " + FileFragment.ContainerActivity.class.getSimpleName());
}
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
- //mStorageManager = new FileDataStorageManager(mAccount, getActivity().getApplicationContext().getContentResolver());
+ mStorageManager = new FileDataStorageManager(mAccount, getActivity().getApplicationContext().getContentResolver());
if (savedInstanceState != null) {
mFile = savedInstanceState.getParcelable(FilePreviewFragment.EXTRA_FILE);
mAccount = savedInstanceState.getParcelable(FilePreviewFragment.EXTRA_ACCOUNT);
}
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+ super.onCreateOptionsMenu(menu, inflater);
+
+ inflater.inflate(R.menu.file_actions_menu, menu);
+ List<Integer> toHide = new ArrayList<Integer>();
+
+ MenuItem item = null;
+ toHide.add(R.id.action_cancel_download);
+ toHide.add(R.id.action_cancel_upload);
+ toHide.add(R.id.action_download_file);
+ toHide.add(R.id.action_rename_file); // by now
+
+ for (int i : toHide) {
+ item = menu.findItem(i);
+ if (item != null) {
+ item.setVisible(false);
+ item.setEnabled(false);
+ }
+ }
+
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.action_open_file_with: {
+ openFile();
+ return true;
+ }
+ case R.id.action_remove_file: {
+ removeFile();
+ return true;
+ }
+ case R.id.action_see_details: {
+ seeDetails();
+ return true;
+ }
+
+ /*
+ case R.id.action_toggle_keep_in_sync: {
+ CheckBox cb = (CheckBox) getView().findViewById(R.id.fdKeepInSync);
+ mFile.setKeepInSync(cb.isChecked());
+ mStorageManager.saveFile(mFile);
+
+ /// register the OCFile instance in the observer service to monitor local updates;
+ /// if necessary, the file is download
+ Intent intent = new Intent(getActivity().getApplicationContext(),
+ FileObserverService.class);
+ intent.putExtra(FileObserverService.KEY_FILE_CMD,
+ (cb.isChecked()?
+ FileObserverService.CMD_ADD_OBSERVED_FILE:
+ FileObserverService.CMD_DEL_OBSERVED_FILE));
+ intent.putExtra(FileObserverService.KEY_CMD_ARG_FILE, mFile);
+ intent.putExtra(FileObserverService.KEY_CMD_ARG_ACCOUNT, mAccount);
+ Log.e(TAG, "starting observer service");
+ getActivity().startService(intent);
+
+ if (mFile.keepInSync()) {
+ onClick(getView().findViewById(R.id.fdDownloadBtn)); // force an immediate synchronization
+ }
+ break;
+ }*/
+ default:
+ return false;
+ }
+ }
+
+
+ private void seeDetails() {
+ stopPreview(false);
+ ((FileFragment.ContainerActivity)getActivity()).showFragmentWithDetails(mFile);
+ }
+
+
private void prepareVideo() {
// create helper to get more control on the playback
mVideoHelper = new VideoHelper();
mMediaController = null;
}
}
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
if (mBitmap != null) {
mBitmap.recycle();
}
- /*-*
- * Opens mFile.
- *-/
+ /**
+ * Opens the previewed file with an external application.
+ *
+ * TODO - improve this; instead of prioritize the actions available for the MIME type in the server,
+ * we should get a list of available apps for MIME tpye in the server and join it with the list of
+ * available apps for the MIME type known from the file extension, to let the user choose
+ */
private void openFile() {
-
+ stopPreview(true);
String storagePath = mFile.getStoragePath();
String encodedStoragePath = WebdavUtils.encodePath(storagePath);
try {
}
}
+ finish();
+ }
+
+ /**
+ * Starts a the removal of the previewed file.
+ *
+ * Shows a confirmation dialog. The action continues in {@link #onConfirmation(String)} , {@link #onNeutral(String)} or {@link #onCancel(String)},
+ * depending upon the user selection in the dialog.
+ */
+ private void removeFile() {
+ ConfirmationDialogFragment confDialog = ConfirmationDialogFragment.newInstance(
+ R.string.confirmation_remove_alert,
+ new String[]{mFile.getFileName()},
+ R.string.confirmation_remove_remote_and_local,
+ R.string.confirmation_remove_local,
+ R.string.common_cancel);
+ confDialog.setOnConfirmationListener(this);
+ confDialog.show(getFragmentManager(), ConfirmationDialogFragment.FTAG_CONFIRMATION);
}
- */
- /*
+
+ /**
+ * Performs the removal of the previewed file, both locally and in the server.
+ */
@Override
public void onConfirmation(String callerTag) {
- if (callerTag.equals(FTAG_CONFIRMATION)) {
- if (mStorageManager.getFileById(mFile.getFileId()) != null) {
- mLastRemoteOperation = new RemoveFileOperation( mFile,
- true,
- mStorageManager);
- WebdavClient wc = OwnCloudClientUtils.createOwnCloudClient(mAccount, getSherlockActivity().getApplicationContext());
- mLastRemoteOperation.execute(wc, this, mHandler);
-
- boolean inDisplayActivity = getActivity() instanceof FileDisplayActivity;
- getActivity().showDialog((inDisplayActivity)? FileDisplayActivity.DIALOG_SHORT_WAIT : FileDetailActivity.DIALOG_SHORT_WAIT);
- }
+ if (mStorageManager.getFileById(mFile.getFileId()) != null) { // check that the file is still there;
+ stopPreview(true);
+ mLastRemoteOperation = new RemoveFileOperation( mFile, // TODO we need to review the interface with RemoteOperations, and use OCFile IDs instead of OCFile objects as parameters
+ true,
+ mStorageManager);
+ WebdavClient wc = OwnCloudClientUtils.createOwnCloudClient(mAccount, getSherlockActivity().getApplicationContext());
+ mLastRemoteOperation.execute(wc, this, mHandler);
+
+ boolean inDisplayActivity = getActivity() instanceof FileDisplayActivity;
+ getActivity().showDialog((inDisplayActivity)? FileDisplayActivity.DIALOG_SHORT_WAIT : FileDetailActivity.DIALOG_SHORT_WAIT);
}
- mCurrentDialog.dismiss();
- mCurrentDialog = null;
}
+
+ /**
+ * Removes the file from local storage
+ */
@Override
public void onNeutral(String callerTag) {
- File f = null;
- if (mFile.isDown() && (f = new File(mFile.getStoragePath())).exists()) {
+ // TODO this code should be made in a secondary thread,
+ if (mFile.isDown()) { // checks it is still there
+ stopPreview(true);
+ File f = new File(mFile.getStoragePath());
f.delete();
mFile.setStoragePath(null);
mStorageManager.saveFile(mFile);
- updateFileDetails(mFile, mAccount);
+ finish();
}
- mCurrentDialog.dismiss();
- mCurrentDialog = null;
}
+ /**
+ * User cancelled the removal action.
+ */
@Override
public void onCancel(String callerTag) {
- Log.d(TAG, "REMOVAL CANCELED");
- mCurrentDialog.dismiss();
- mCurrentDialog = null;
+ // nothing to do here
}
- */
+
/**
* {@inheritDoc}
(file.isAudio() || file.isVideo() || file.isImage()));
}
- /*-*
+ /**
* {@inheritDoc}
- *-/
+ */
@Override
public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) {
if (operation.equals(mLastRemoteOperation)) {
if (operation instanceof RemoveFileOperation) {
onRemoveFileOperationFinish((RemoveFileOperation)operation, result);
-
+
+ /*
} else if (operation instanceof RenameFileOperation) {
onRenameFileOperationFinish((RenameFileOperation)operation, result);
} else if (operation instanceof SynchronizeFileOperation) {
- onSynchronizeFileOperationFinish((SynchronizeFileOperation)operation, result);
+ onSynchronizeFileOperationFinish((SynchronizeFileOperation)operation, result);*/
}
}
}
- */
- /*
private void onRemoveFileOperationFinish(RemoveFileOperation operation, RemoteOperationResult result) {
boolean inDisplayActivity = getActivity() instanceof FileDisplayActivity;
getActivity().dismissDialog((inDisplayActivity)? FileDisplayActivity.DIALOG_SHORT_WAIT : FileDetailActivity.DIALOG_SHORT_WAIT);
if (result.isSuccess()) {
Toast msg = Toast.makeText(getActivity().getApplicationContext(), R.string.remove_success_msg, Toast.LENGTH_LONG);
msg.show();
- if (inDisplayActivity) {
- // double pane
- FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
- transaction.replace(R.id.file_details_container, new FilePreviewFragment(null, null)); // empty FileDetailFragment
- transaction.commit();
- mContainerActivity.onFileStateChanged();
- } else {
- getActivity().finish();
- }
+ finish();
} else {
Toast msg = Toast.makeText(getActivity(), R.string.remove_fail_msg, Toast.LENGTH_LONG);
}
}
}
+
+ private void stopPreview(boolean stopAudio) {
+ if (mMediaController != null) {
+ mMediaController.hide();
+ }
+ if (mFile.isAudio() && stopAudio) {
+ mMediaServiceBinder.pause();
+
+ } else if (mFile.isVideo()) {
+ mVideoPreview.stopPlayback();
+ }
+ }
+
+
+
+ /**
+ * Finishes the preview
+ */
+ private void finish() {
+ Activity container = getActivity();
+ if (container instanceof FileDisplayActivity) {
+ // double pane
+ FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
+ transaction.replace(R.id.file_details_container, new FileDetailFragment(null, null), FileDetailFragment.FTAG); // empty FileDetailFragment
+ transaction.commit();
+ ((FileFragment.ContainerActivity)container).onFileStateChanged();
+ } else {
+ container.finish();
+ }
+ }
+ /*
private void onRenameFileOperationFinish(RenameFileOperation operation, RemoteOperationResult result) {
boolean inDisplayActivity = getActivity() instanceof FileDisplayActivity;
getActivity().dismissDialog((inDisplayActivity)? FileDisplayActivity.DIALOG_SHORT_WAIT : FileDetailActivity.DIALOG_SHORT_WAIT);
private Handler mHandler;
private OCFile mTargetFile;
- private DialogFragment mCurrentDialog;
-
/**
* {@inheritDoc}
*/
public void onCreateContextMenu (ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getActivity().getMenuInflater();
- inflater.inflate(R.menu.file_context_menu, menu);
+ inflater.inflate(R.menu.file_actions_menu, menu);
AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
OCFile targetFile = (OCFile) mAdapter.getItem(info.position);
List<Integer> toHide = new ArrayList<Integer>();
MenuItem item = null;
if (targetFile.isDirectory()) {
// contextual menu for folders
- toHide.add(R.id.open_file_item);
- toHide.add(R.id.download_file_item);
- toHide.add(R.id.cancel_download_item);
- toHide.add(R.id.cancel_upload_item);
+ toHide.add(R.id.action_open_file_with);
+ toHide.add(R.id.action_download_file);
+ toHide.add(R.id.action_cancel_download);
+ toHide.add(R.id.action_cancel_upload);
+ toHide.add(R.id.action_see_details);
if ( mContainerActivity.getFileDownloaderBinder().isDownloading(AccountUtils.getCurrentOwnCloudAccount(getActivity()), targetFile) ||
mContainerActivity.getFileUploaderBinder().isUploading(AccountUtils.getCurrentOwnCloudAccount(getActivity()), targetFile) ) {
- toDisable.add(R.id.rename_file_item);
- toDisable.add(R.id.remove_file_item);
+ toDisable.add(R.id.action_rename_file);
+ toDisable.add(R.id.action_remove_file);
}
} else {
// contextual menu for regular files
if (targetFile.isDown()) {
- toHide.add(R.id.cancel_download_item);
- toHide.add(R.id.cancel_upload_item);
- item = menu.findItem(R.id.download_file_item);
+ toHide.add(R.id.action_cancel_download);
+ toHide.add(R.id.action_cancel_upload);
+ item = menu.findItem(R.id.action_download_file);
if (item != null) {
item.setTitle(R.string.filedetails_sync_file);
}
} else {
- toHide.add(R.id.open_file_item);
+ toHide.add(R.id.action_open_file_with);
}
if ( mContainerActivity.getFileDownloaderBinder().isDownloading(AccountUtils.getCurrentOwnCloudAccount(getActivity()), targetFile)) {
- toHide.add(R.id.download_file_item);
- toHide.add(R.id.cancel_upload_item);
- toDisable.add(R.id.open_file_item);
- toDisable.add(R.id.rename_file_item);
- toDisable.add(R.id.remove_file_item);
+ toHide.add(R.id.action_download_file);
+ toHide.add(R.id.action_cancel_upload);
+ toDisable.add(R.id.action_open_file_with);
+ toDisable.add(R.id.action_rename_file);
+ toDisable.add(R.id.action_remove_file);
} else if ( mContainerActivity.getFileUploaderBinder().isUploading(AccountUtils.getCurrentOwnCloudAccount(getActivity()), targetFile)) {
- toHide.add(R.id.download_file_item);
- toHide.add(R.id.cancel_download_item);
- toDisable.add(R.id.open_file_item);
- toDisable.add(R.id.rename_file_item);
- toDisable.add(R.id.remove_file_item);
+ toHide.add(R.id.action_download_file);
+ toHide.add(R.id.action_cancel_download);
+ toDisable.add(R.id.action_open_file_with);
+ toDisable.add(R.id.action_rename_file);
+ toDisable.add(R.id.action_remove_file);
} else {
- toHide.add(R.id.cancel_download_item);
- toHide.add(R.id.cancel_upload_item);
+ toHide.add(R.id.action_cancel_download);
+ toHide.add(R.id.action_cancel_upload);
}
}
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
mTargetFile = (OCFile) mAdapter.getItem(info.position);
switch (item.getItemId()) {
- case R.id.rename_file_item: {
+ case R.id.action_rename_file: {
EditNameDialog dialog = EditNameDialog.newInstance(getString(R.string.rename_dialog_title), mTargetFile.getFileName(), this);
dialog.show(getFragmentManager(), EditNameDialog.TAG);
return true;
}
- case R.id.remove_file_item: {
+ case R.id.action_remove_file: {
int messageStringId = R.string.confirmation_remove_alert;
int posBtnStringId = R.string.confirmation_remove_remote;
int neuBtnStringId = -1;
neuBtnStringId,
R.string.common_cancel);
confDialog.setOnConfirmationListener(this);
- mCurrentDialog = confDialog;
- mCurrentDialog.show(getFragmentManager(), FileDetailFragment.FTAG_CONFIRMATION);
+ confDialog.show(getFragmentManager(), FileDetailFragment.FTAG_CONFIRMATION);
return true;
}
- case R.id.open_file_item: {
+ case R.id.action_open_file_with: {
String storagePath = mTargetFile.getStoragePath();
String encodedStoragePath = WebdavUtils.encodePath(storagePath);
try {
}
return true;
}
- case R.id.download_file_item: {
+ case R.id.action_download_file: {
Account account = AccountUtils.getCurrentOwnCloudAccount(getSherlockActivity());
RemoteOperation operation = new SynchronizeFileOperation(mTargetFile, null, mContainerActivity.getStorageManager(), account, true, false, getSherlockActivity());
WebdavClient wc = OwnCloudClientUtils.createOwnCloudClient(account, getSherlockActivity().getApplicationContext());
getSherlockActivity().showDialog(FileDisplayActivity.DIALOG_SHORT_WAIT);
return true;
}
- case R.id.cancel_download_item: {
+ case R.id.action_cancel_download: {
FileDownloaderBinder downloaderBinder = mContainerActivity.getFileDownloaderBinder();
Account account = AccountUtils.getCurrentOwnCloudAccount(getActivity());
if (downloaderBinder != null && downloaderBinder.isDownloading(account, mTargetFile)) {
}
return true;
}
- case R.id.cancel_upload_item: {
+ case R.id.action_cancel_upload: {
FileUploaderBinder uploaderBinder = mContainerActivity.getFileUploaderBinder();
Account account = AccountUtils.getCurrentOwnCloudAccount(getActivity());
if (uploaderBinder != null && uploaderBinder.isUploading(account, mTargetFile)) {
}
return true;
}
+ case R.id.action_see_details: {
+ ((FileFragment.ContainerActivity)getActivity()).showFragmentWithDetails(mTargetFile);
+ return true;
+ }
default:
return super.onContextItemSelected(item);
}
getActivity().showDialog(FileDisplayActivity.DIALOG_SHORT_WAIT);
}
- if (mCurrentDialog != null) {
- mCurrentDialog.dismiss();
- mCurrentDialog = null;
- }
}
}
mTargetFile.setStoragePath(null);
mContainerActivity.getStorageManager().saveFile(mTargetFile);
}
- if (mCurrentDialog != null) {
- mCurrentDialog.dismiss();
- mCurrentDialog = null;
- }
listDirectory();
mContainerActivity.onTransferStateChanged(mTargetFile, false, false);
}
@Override
public void onCancel(String callerTag) {
Log.d(TAG, "REMOVAL CANCELED");
- if (mCurrentDialog != null) {
- mCurrentDialog.dismiss();
- mCurrentDialog = null;
- }
}