Merge pull request #420 from owncloud/send_file_pr311_with_develop

'Send file to other apps' optimized
This commit is contained in:
David A. Velasco 2014-03-07 12:42:31 +01:00
commit 30ac4cc870
13 changed files with 194 additions and 48 deletions

View file

@ -92,11 +92,15 @@
<activity android:name=".ui.activity.PreferencesNewSessionewSession" > <activity android:name=".ui.activity.PreferencesNewSessionewSession" >
</activity> </activity>
<activity android:name=".ui.preview.PreviewImageActivity" /> <activity
android:name=".ui.preview.PreviewImageActivity"
/>
<activity android:name=".ui.preview.PreviewVideoActivity" <activity
android:label="@string/app_name" android:name=".ui.preview.PreviewVideoActivity"
android:theme="@style/Theme.ownCloud.Fullscreen" > android:label="@string/app_name"
android:theme="@style/Theme.ownCloud.Fullscreen"
>
</activity> </activity>
<service <service

@ -1 +1 @@
Subproject commit cd4414a7bda686c84e1ca75dd10bcbf9b3f57f83 Subproject commit fb267a0564392adf4938b8f8824e5c89c22776a0

View file

@ -21,6 +21,10 @@
<string name="auth_method_oauth2">off</string> <string name="auth_method_oauth2">off</string>
<string name="auth_method_saml_web_sso">off</string> <string name="auth_method_saml_web_sso">off</string>
<!-- Flags to enable/disable some features -->
<string name = "send_files_to_other_apps">on</string>
<!-- Colors --> <!-- Colors -->
<color name="login_background_color">#FFFFFF</color> <color name="login_background_color">#FFFFFF</color>
<color name="login_logo_background_color">#FFFFFF</color> <color name="login_logo_background_color">#FFFFFF</color>

View file

@ -253,6 +253,8 @@
<string name="unshare_link_file_no_exist">Unable to unshare this file or folder. It does not exist.</string> <string name="unshare_link_file_no_exist">Unable to unshare this file or folder. It does not exist.</string>
<string name="unshare_link_file_error">An error occurred while trying to unshare this file or folder</string> <string name="unshare_link_file_error">An error occurred while trying to unshare this file or folder</string>
<string name="activity_chooser_send_file_title">Send</string>
<string name="copy_link">Copy link</string> <string name="copy_link">Copy link</string>
<string name="clipboard_text_copied">Copied to clipboard</string> <string name="clipboard_text_copied">Copied to clipboard</string>
</resources> </resources>

View file

@ -145,7 +145,7 @@ public class FileOperationsHelper {
} }
return false; return false;
} }
public void unshareFileWithLink(OCFile file, FileActivity callerActivity) { public void unshareFileWithLink(OCFile file, FileActivity callerActivity) {
@ -166,4 +166,23 @@ public class FileOperationsHelper {
} }
} }
public void sendDownloadedFile(OCFile file, FileActivity callerActivity) {
if (file != null) {
Intent sendIntent = new Intent(android.content.Intent.ACTION_SEND);
// set MimeType
sendIntent.setType(file.getMimetype());
sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + file.getStoragePath()));
sendIntent.putExtra(Intent.ACTION_SEND, true); // Send Action
// Show dialog, without the own app
String[] packagesToExclude = new String[] { callerActivity.getPackageName() };
DialogFragment chooserDialog = ShareLinkToDialog.newInstance(sendIntent, packagesToExclude, file);
chooserDialog.show(callerActivity.getSupportFragmentManager(), FTAG_CHOOSER_DIALOG);
} else {
Log_OC.wtf(TAG, "Trying to send a NULL OCFile");
}
}
} }

View file

@ -34,6 +34,7 @@ import android.content.IntentFilter;
import android.content.ServiceConnection; import android.content.ServiceConnection;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.SyncRequest; import android.content.SyncRequest;
import android.content.res.Configuration;
import android.content.res.Resources.NotFoundException; import android.content.res.Resources.NotFoundException;
import android.database.Cursor; import android.database.Cursor;
import android.net.Uri; import android.net.Uri;
@ -120,6 +121,7 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa
private static final String KEY_WAITING_TO_PREVIEW = "WAITING_TO_PREVIEW"; private static final String KEY_WAITING_TO_PREVIEW = "WAITING_TO_PREVIEW";
private static final String KEY_SYNC_IN_PROGRESS = "SYNC_IN_PROGRESS"; private static final String KEY_SYNC_IN_PROGRESS = "SYNC_IN_PROGRESS";
//private static final String KEY_REFRESH_SHARES_IN_PROGRESS = "SHARES_IN_PROGRESS"; //private static final String KEY_REFRESH_SHARES_IN_PROGRESS = "SHARES_IN_PROGRESS";
private static final String KEY_WAITING_TO_SEND = "WAITING_TO_SEND";
public static final int DIALOG_SHORT_WAIT = 0; public static final int DIALOG_SHORT_WAIT = 0;
private static final int DIALOG_CHOOSE_UPLOAD_SOURCE = 1; private static final int DIALOG_CHOOSE_UPLOAD_SOURCE = 1;
@ -141,6 +143,8 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa
private boolean mSyncInProgress = false; private boolean mSyncInProgress = false;
//private boolean mRefreshSharesInProgress = false; //private boolean mRefreshSharesInProgress = false;
private OCFile mWaitingToSend;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
Log_OC.d(TAG, "onCreate() start"); Log_OC.d(TAG, "onCreate() start");
@ -171,11 +175,13 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa
mWaitingToPreview = (OCFile) savedInstanceState.getParcelable(FileDisplayActivity.KEY_WAITING_TO_PREVIEW); mWaitingToPreview = (OCFile) savedInstanceState.getParcelable(FileDisplayActivity.KEY_WAITING_TO_PREVIEW);
mSyncInProgress = savedInstanceState.getBoolean(KEY_SYNC_IN_PROGRESS); mSyncInProgress = savedInstanceState.getBoolean(KEY_SYNC_IN_PROGRESS);
//mRefreshSharesInProgress = savedInstanceState.getBoolean(KEY_REFRESH_SHARES_IN_PROGRESS); //mRefreshSharesInProgress = savedInstanceState.getBoolean(KEY_REFRESH_SHARES_IN_PROGRESS);
mWaitingToSend = (OCFile) savedInstanceState.getParcelable(FileDisplayActivity.KEY_WAITING_TO_SEND);
} else { } else {
mWaitingToPreview = null; mWaitingToPreview = null;
mSyncInProgress = false; mSyncInProgress = false;
//mRefreshSharesInProgress = false; //mRefreshSharesInProgress = false;
mWaitingToSend = null;
} }
/// USER INTERFACE /// USER INTERFACE
@ -218,7 +224,6 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa
unbindService(mUploadConnection); unbindService(mUploadConnection);
} }
/** /**
* Called when the ownCloud {@link Account} associated to the Activity was just updated. * Called when the ownCloud {@link Account} associated to the Activity was just updated.
*/ */
@ -666,6 +671,7 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa
outState.putParcelable(FileDisplayActivity.KEY_WAITING_TO_PREVIEW, mWaitingToPreview); outState.putParcelable(FileDisplayActivity.KEY_WAITING_TO_PREVIEW, mWaitingToPreview);
outState.putBoolean(FileDisplayActivity.KEY_SYNC_IN_PROGRESS, mSyncInProgress); outState.putBoolean(FileDisplayActivity.KEY_SYNC_IN_PROGRESS, mSyncInProgress);
//outState.putBoolean(FileDisplayActivity.KEY_REFRESH_SHARES_IN_PROGRESS, mRefreshSharesInProgress); //outState.putBoolean(FileDisplayActivity.KEY_REFRESH_SHARES_IN_PROGRESS, mRefreshSharesInProgress);
outState.putParcelable(FileDisplayActivity.KEY_WAITING_TO_SEND, mWaitingToSend);
Log_OC.d(TAG, "onSaveInstanceState() end"); Log_OC.d(TAG, "onSaveInstanceState() end");
} }
@ -1022,6 +1028,13 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa
refreshSecondFragment(intent.getAction(), downloadedRemotePath, intent.getBooleanExtra(FileDownloader.EXTRA_DOWNLOAD_RESULT, false)); refreshSecondFragment(intent.getAction(), downloadedRemotePath, intent.getBooleanExtra(FileDownloader.EXTRA_DOWNLOAD_RESULT, false));
} }
if (mWaitingToSend != null) {
mWaitingToSend = getStorageManager().getFileByPath(mWaitingToSend.getRemotePath()); // Update the file to send
if (mWaitingToSend.isDown()) {
sendDownloadedFile();
}
}
removeStickyBroadcast(intent); removeStickyBroadcast(intent);
} }
@ -1601,4 +1614,34 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa
} }
*/ */
/**
* Requests the download of the received {@link OCFile} , updates the UI
* to monitor the download progress and prepares the activity to send the file
* when the download finishes.
*
* @param file {@link OCFile} to download and preview.
*/
@Override
public void startDownloadForSending(OCFile file) {
mWaitingToSend = file;
requestForDownload(mWaitingToSend);
boolean hasSecondFragment = (getSecondFragment()!= null);
updateFragmentsVisibility(hasSecondFragment);
}
private void requestForDownload(OCFile file) {
Account account = getAccount();
if (!mDownloaderBinder.isDownloading(account, file)) {
Intent i = new Intent(this, FileDownloader.class);
i.putExtra(FileDownloader.EXTRA_ACCOUNT, account);
i.putExtra(FileDownloader.EXTRA_FILE, file);
startService(i);
}
}
private void sendDownloadedFile(){
getFileOperationsHelper().sendDownloadedFile(mWaitingToSend, this);
mWaitingToSend = null;
}
} }

View file

@ -97,35 +97,59 @@ public class ShareLinkToDialog extends SherlockDialogFragment {
} }
} }
// add activity for copy to clipboard boolean sendAction = mIntent.getBooleanExtra(Intent.ACTION_SEND, false);
Intent copyToClipboardIntent = new Intent(getSherlockActivity(), CopyToClipboardActivity.class);
List<ResolveInfo> copyToClipboard = pm.queryIntentActivities(copyToClipboardIntent, 0); if (!sendAction) {
if (!copyToClipboard.isEmpty()) { // add activity for copy to clipboard
activities.add(copyToClipboard.get(0)); Intent copyToClipboardIntent = new Intent(getSherlockActivity(), CopyToClipboardActivity.class);
List<ResolveInfo> copyToClipboard = pm.queryIntentActivities(copyToClipboardIntent, 0);
if (!copyToClipboard.isEmpty()) {
activities.add(copyToClipboard.get(0));
}
} }
Collections.sort(activities, new ResolveInfo.DisplayNameComparator(pm)); Collections.sort(activities, new ResolveInfo.DisplayNameComparator(pm));
mAdapter = new ActivityAdapter(getSherlockActivity(), pm, activities); mAdapter = new ActivityAdapter(getSherlockActivity(), pm, activities);
return new AlertDialog.Builder(getSherlockActivity()) return createSelector(sendAction);
.setTitle(R.string.activity_chooser_title)
.setAdapter(mAdapter, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// Add the information of the chosen activity to the intent to send
ResolveInfo chosen = mAdapter.getItem(which);
ActivityInfo actInfo = chosen.activityInfo;
ComponentName name=new ComponentName(actInfo.applicationInfo.packageName, actInfo.name);
mIntent.setComponent(name);
// Create a new share resource
FileOperationsHelper foh = new FileOperationsHelper();
foh.shareFileWithLinkToApp(mFile, mIntent, (FileActivity)getSherlockActivity());
}
})
.create();
} }
private AlertDialog createSelector(final boolean sendAction) {
int titleId;
if (sendAction) {
titleId = R.string.activity_chooser_send_file_title;
} else {
titleId = R.string.activity_chooser_title;
}
return new AlertDialog.Builder(getSherlockActivity())
.setTitle(titleId)
.setAdapter(mAdapter, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// Add the information of the chosen activity to the intent to send
ResolveInfo chosen = mAdapter.getItem(which);
ActivityInfo actInfo = chosen.activityInfo;
ComponentName name=new ComponentName(actInfo.applicationInfo.packageName, actInfo.name);
mIntent.setComponent(name);
if (sendAction) {
dialog.dismiss(); // explicitly added for Android 2.x devices
// Send the file
((FileActivity)getSherlockActivity()).startActivity(mIntent);
} else {
// Create a new share resource
FileOperationsHelper foh = new FileOperationsHelper();
foh.shareFileWithLinkToApp(mFile, mIntent, (FileActivity)getSherlockActivity());
}
}
})
.create();
}
class ActivityAdapter extends ArrayAdapter<ResolveInfo> { class ActivityAdapter extends ArrayAdapter<ResolveInfo> {

View file

@ -252,6 +252,20 @@ public class FileDetailFragment extends FileFragment implements
item.setVisible(false); item.setVisible(false);
item.setEnabled(false); item.setEnabled(false);
} }
// Send file
item = menu.findItem(R.id.action_send_file);
boolean sendEnabled = getString(R.string.send_files_to_other_apps).equalsIgnoreCase("on");
if (item != null) {
if (sendEnabled) {
item.setVisible(true);
item.setEnabled(true);
} else {
item.setVisible(false);
item.setEnabled(false);
}
}
} }
@ -376,6 +390,18 @@ public class FileDetailFragment extends FileFragment implements
synchronizeFile(); synchronizeFile();
return true; return true;
} }
case R.id.action_send_file: {
FileDisplayActivity activity = (FileDisplayActivity) getSherlockActivity();
// Obtain the file
if (!getFile().isDown()) { // Download the file
Log_OC.d(TAG, getFile().getRemotePath() + " : File must be downloaded");
activity.startDownloadForSending(getFile());
} else {
activity.getFileOperationsHelper().sendDownloadedFile(getFile(), activity);
}
return true;
}
default: default:
return false; return false;
} }

View file

@ -44,8 +44,6 @@ import com.owncloud.android.utils.Log_OC;
import android.accounts.Account; import android.accounts.Account;
import android.app.Activity; import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.view.ContextMenu; import android.view.ContextMenu;
@ -265,6 +263,12 @@ public class OCFileListFragment extends ExtendedListFragment implements EditName
toHide.add(R.id.action_unshare_file); toHide.add(R.id.action_unshare_file);
} }
// Send file
boolean sendEnabled = getString(R.string.send_files_to_other_apps).equalsIgnoreCase("on");
if (!sendEnabled) {
toHide.add(R.id.action_send_file);
}
for (int i : toHide) { for (int i : toHide) {
item = menu.findItem(i); item = menu.findItem(i);
if (item != null) { if (item != null) {
@ -362,11 +366,16 @@ public class OCFileListFragment extends ExtendedListFragment implements EditName
return true; return true;
} }
case R.id.action_send_file: { case R.id.action_send_file: {
Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND); // Obtain the file
// set MimeType if (!mTargetFile.isDown()) { // Download the file
sharingIntent.setType(mTargetFile.getMimetype()); Log_OC.d(TAG, mTargetFile.getRemotePath() + " : File must be downloaded");
sharingIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://"+mTargetFile.getStoragePath())); mContainerActivity.startDownloadForSending(mTargetFile);
startActivity(Intent.createChooser(sharingIntent, "Share via"));
} else {
FileDisplayActivity activity = (FileDisplayActivity) getSherlockActivity();
activity.getFileOperationsHelper().sendDownloadedFile(mTargetFile, activity);
}
return true; return true;
} }
default: default:
@ -473,6 +482,8 @@ public class OCFileListFragment extends ExtendedListFragment implements EditName
* @param uploading Flag signaling if the file is now uploading. * @param uploading Flag signaling if the file is now uploading.
*/ */
public void onTransferStateChanged(OCFile file, boolean downloading, boolean uploading); public void onTransferStateChanged(OCFile file, boolean downloading, boolean uploading);
void startDownloadForSending(OCFile file);
} }

View file

@ -23,6 +23,7 @@ import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.content.ServiceConnection; import android.content.ServiceConnection;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.os.Bundle; import android.os.Bundle;
import android.os.IBinder; import android.os.IBinder;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
@ -245,7 +246,6 @@ public class PreviewImageActivity extends FileActivity implements FileFragment.C
super.onDestroy(); super.onDestroy();
} }
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
boolean returnValue = false; boolean returnValue = false;

View file

@ -250,6 +250,12 @@ public class PreviewImageFragment extends FileFragment implements OnRemoteOper
toHide.add(R.id.action_unshare_file); toHide.add(R.id.action_unshare_file);
} }
// Send file
boolean sendEnabled = getString(R.string.send_files_to_other_apps).equalsIgnoreCase("on");
if (!sendEnabled) {
toHide.add(R.id.action_send_file);
}
for (int i : toHide) { for (int i : toHide) {
item = menu.findItem(i); item = menu.findItem(i);
if (item != null) { if (item != null) {
@ -311,7 +317,8 @@ public class PreviewImageFragment extends FileFragment implements OnRemoteOper
return true; return true;
} }
case R.id.action_send_file: { case R.id.action_send_file: {
shareFile(); FileActivity act = (FileActivity)getSherlockActivity();
act.getFileOperationsHelper().sendDownloadedFile(getFile(), act);
return true; return true;
} }
@ -320,15 +327,6 @@ public class PreviewImageFragment extends FileFragment implements OnRemoteOper
} }
} }
private void shareFile(){
Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
// set MimeType
sharingIntent.setType(getFile().getMimetype());
sharingIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://"+getFile().getStoragePath()));
startActivity(Intent.createChooser(sharingIntent, "Share via"));
}
private void seeDetails() { private void seeDetails() {
((FileFragment.ContainerActivity)getActivity()).showDetails(getFile()); ((FileFragment.ContainerActivity)getActivity()).showDetails(getFile());

View file

@ -295,6 +295,12 @@ public class PreviewMediaFragment extends FileFragment implements
toHide.add(R.id.action_unshare_file); toHide.add(R.id.action_unshare_file);
} }
// Send file
boolean sendEnabled = getString(R.string.send_files_to_other_apps).equalsIgnoreCase("on");
if (!sendEnabled) {
toHide.add(R.id.action_send_file);
}
for (int i : toHide) { for (int i : toHide) {
item = menu.findItem(i); item = menu.findItem(i);
if (item != null) { if (item != null) {
@ -351,6 +357,9 @@ public class PreviewMediaFragment extends FileFragment implements
seeDetails(); seeDetails();
return true; return true;
} }
case R.id.action_send_file: {
sendFile();
}
default: default:
return false; return false;
@ -380,6 +389,12 @@ public class PreviewMediaFragment extends FileFragment implements
} }
private void sendFile() {
stopPreview(false);
FileActivity activity = (FileActivity)((FileFragment.ContainerActivity)getActivity());
activity.getFileOperationsHelper().sendDownloadedFile(getFile(), activity);
}
private void seeDetails() { private void seeDetails() {
stopPreview(false); stopPreview(false);

View file

@ -27,6 +27,7 @@ import android.accounts.Account;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.res.Configuration;
import android.media.MediaPlayer; import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener; import android.media.MediaPlayer.OnErrorListener;
@ -188,7 +189,6 @@ public class PreviewVideoActivity extends FileActivity implements OnCompletionLi
return true; return true;
} }
@Override @Override
protected void onAccountSet(boolean stateWasRecovered) { protected void onAccountSet(boolean stateWasRecovered) {
super.onAccountSet(stateWasRecovered); super.onAccountSet(stateWasRecovered);