From: masensio Date: Tue, 4 Feb 2014 08:46:44 +0000 (-0800) Subject: Merge pull request #384 from owncloud/share_link__new_share_menu X-Git-Tag: oc-android-1.5.5~58^2~15 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/816ec123b52b7e1a832d6af32f95fd7349d6b362?hp=261d8a5167571ffbaa447cce8df24f32a53faf7d Merge pull request #384 from owncloud/share_link__new_share_menu Added custom menu to show apps able to receive a link, filtering out ownCloud --- diff --git a/AndroidManifest.xml b/AndroidManifest.xml index ca11c81b..465dec84 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -54,7 +54,6 @@ > - @@ -81,9 +80,12 @@ - + - + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/layout/activity_row.xml b/res/layout/activity_row.xml new file mode 100644 index 00000000..b917600c --- /dev/null +++ b/res/layout/activity_row.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml index 7d941c1a..5a61a15a 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -187,6 +187,7 @@ Wait a moment "Unexpected problem ; please select the file from a different app" No file was selected + Send link to … Login with oAuth2 Connecting to oAuth2 server… diff --git a/src/com/owncloud/android/files/FileHandler.java b/src/com/owncloud/android/files/FileHandler.java index 2eb754dd..77ff78ad 100644 --- a/src/com/owncloud/android/files/FileHandler.java +++ b/src/com/owncloud/android/files/FileHandler.java @@ -27,4 +27,5 @@ public interface FileHandler { public void openFile(OCFile file); + public void shareFileWithLink(OCFile file); } diff --git a/src/com/owncloud/android/ui/activity/FileActivity.java b/src/com/owncloud/android/ui/activity/FileActivity.java index 3a9297ec..07c5b536 100644 --- a/src/com/owncloud/android/ui/activity/FileActivity.java +++ b/src/com/owncloud/android/ui/activity/FileActivity.java @@ -18,15 +18,19 @@ package com.owncloud.android.ui.activity; +import org.apache.http.protocol.HTTP; + import android.accounts.Account; import android.accounts.AccountManager; import android.accounts.AccountManagerCallback; import android.accounts.AccountManagerFuture; import android.accounts.OperationCanceledException; +import android.support.v4.app.DialogFragment; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.webkit.MimeTypeMap; +import android.widget.Toast; import com.actionbarsherlock.app.SherlockFragmentActivity; import com.owncloud.android.MainApp; @@ -37,6 +41,7 @@ import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.accounts.OwnCloudAccount; import com.owncloud.android.lib.network.webdav.WebdavUtils; +import com.owncloud.android.ui.dialog.ActivityChooserDialog; import com.owncloud.android.utils.Log_OC; @@ -52,7 +57,9 @@ public abstract class FileActivity extends SherlockFragmentActivity { public static final String EXTRA_WAITING_TO_PREVIEW = "com.owncloud.android.ui.activity.WAITING_TO_PREVIEW"; public static final String EXTRA_FROM_NOTIFICATION= "com.owncloud.android.ui.activity.FROM_NOTIFICATION"; - public static final String TAG = FileActivity.class.getSimpleName(); + public static final String TAG = FileActivity.class.getSimpleName(); + + private static final String FTAG_CHOOSER_DIALOG = "CHOOSER_DIALOG"; /** OwnCloud {@link Account} where the main {@link OCFile} handled by the activity is located. */ @@ -343,5 +350,57 @@ public abstract class FileActivity extends SherlockFragmentActivity { Log_OC.wtf(TAG, "Trying to open a NULL OCFile"); } } + + /* + public void shareFileWithLink(OCFile file) { + if (file != null) { + + Intent intentToShareLink = new Intent(Intent.ACTION_SEND); + intentToShareLink.putExtra(Intent.EXTRA_TEXT, "https://fake.url.lolo"); + intentToShareLink.setType(HTTP.PLAIN_TEXT_TYPE); + + Intent chooserIntent = Intent.createChooser(intentToShareLink, getString(R.string.action_share_file)); + startActivity(chooserIntent); + + } else { + Log_OC.wtf(TAG, "Trying to open a NULL OCFile"); + } + } + */ + + public void shareFileWithLink(OCFile file) { + if (isSharedSupported()) { + if (file != null) { + + // Create the Share - TODO integrate before or after the chooser menu + //CreateShareOperation createShare = new CreateShareOperation(file.getRemotePath(), ShareType.PUBLIC_LINK, "", false, "", 1); + //createShare.execute(getStorageManager(), this, this, mHandler, this); + + // TODO Get the link --> when the operation is finished + String link = "https://fake.url.lolo"; + + Intent intent = createShareWithLinkIntent(link); + String[] packagesToExclude = new String[] { getPackageName() }; + DialogFragment chooserDialog = ActivityChooserDialog.newInstance(intent, packagesToExclude); + chooserDialog.show(getSupportFragmentManager(), FTAG_CHOOSER_DIALOG); + + } else { + Log_OC.wtf(TAG, "Trying to open a NULL OCFile"); + } + + } else { + // Show a Message + Toast t = Toast.makeText(this, getString(R.string.share_link_no_support_share_api), Toast.LENGTH_LONG); + t.show(); + } + } + + private Intent createShareWithLinkIntent(String link) { + Intent intentToShareLink = new Intent(Intent.ACTION_SEND); + intentToShareLink.putExtra(Intent.EXTRA_TEXT, link); + intentToShareLink.setType(HTTP.PLAIN_TEXT_TYPE); + return intentToShareLink; + } + } diff --git a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java index 9ae9dfed..237113d8 100644 --- a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -73,7 +73,6 @@ import com.owncloud.android.operations.CreateFolderOperation; import com.owncloud.android.lib.operations.common.OnRemoteOperationListener; import com.owncloud.android.lib.operations.common.RemoteOperation; import com.owncloud.android.lib.operations.common.RemoteOperationResult; -import com.owncloud.android.lib.operations.common.ShareType; import com.owncloud.android.lib.operations.common.RemoteOperationResult.ResultCode; import com.owncloud.android.operations.CreateShareOperation; import com.owncloud.android.operations.RemoveFileOperation; @@ -1584,23 +1583,4 @@ OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNa } - - public void shareFileWithLink(OCFile file) { - - if (isSharedSupported()) { - // Create the Share - CreateShareOperation createShare = new CreateShareOperation(file.getRemotePath(), ShareType.PUBLIC_LINK, "", false, "", 1); - createShare.execute(getStorageManager(), this, this, mHandler, this); - - // TODO - // Get the link --> when the operation is finished - - } else { - // Show a Message - Toast t = Toast.makeText(this, getString(R.string.share_link_no_support_share_api), Toast.LENGTH_LONG); - t.show(); - - } - } - } diff --git a/src/com/owncloud/android/ui/dialog/ActivityChooserDialog.java b/src/com/owncloud/android/ui/dialog/ActivityChooserDialog.java new file mode 100644 index 00000000..133f46b9 --- /dev/null +++ b/src/com/owncloud/android/ui/dialog/ActivityChooserDialog.java @@ -0,0 +1,139 @@ +/* ownCloud Android client application + * Copyright (C) 2012-2014 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.dialog; + +import java.util.Arrays; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.ImageView; +import android.widget.ListAdapter; +import android.widget.TextView; + +import com.actionbarsherlock.app.SherlockDialogFragment; +import com.owncloud.android.R; +import com.owncloud.android.utils.Log_OC; + +/** + * Dialog showing a list activities able to resolve a given Intent, + * filtering out the activities matching give package names. + * + * @author David A. Velasco + */ +public class ActivityChooserDialog extends SherlockDialogFragment { + + private final static String TAG = ActivityChooserDialog.class.getSimpleName(); + private final static String ARG_INTENT = ActivityChooserDialog.class.getSimpleName() + ".ARG_INTENT"; + private final static String ARG_PACKAGES_TO_EXCLUDE = ActivityChooserDialog.class.getSimpleName() + ".ARG_PACKAGES_TO_EXCLUDE"; + + private ListAdapter mAdapter; + + public static ActivityChooserDialog newInstance(Intent intent, String[] packagesToExclude/*OnConflictDecisionMadeListener listener*/) { + ActivityChooserDialog f = new ActivityChooserDialog(); + Bundle args = new Bundle(); + args.putParcelable(ARG_INTENT, intent); + args.putStringArray(ARG_PACKAGES_TO_EXCLUDE, packagesToExclude); + f.setArguments(args); + return f; + } + + public ActivityChooserDialog() { + super(); + Log_OC.d(TAG, "constructor"); + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + Intent intent = getArguments().getParcelable(ARG_INTENT); + String[] packagesToExclude = getArguments().getStringArray(ARG_PACKAGES_TO_EXCLUDE); + List packagesToExcludeList = Arrays.asList(packagesToExclude != null ? packagesToExclude : new String[0]); + + PackageManager pm= getSherlockActivity().getPackageManager(); + List activities = pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); + Iterator it = activities.iterator(); + ResolveInfo resolveInfo; + while (it.hasNext()) { + resolveInfo = it.next(); + if (packagesToExcludeList.contains(resolveInfo.activityInfo.packageName.toLowerCase())) { + it.remove(); + } + } + Collections.sort(activities, new ResolveInfo.DisplayNameComparator(pm)); + mAdapter = new ActivityAdapter(getSherlockActivity(), pm, activities); + + return new AlertDialog.Builder(getSherlockActivity()) + .setTitle(R.string.activity_chooser_title) + .setAdapter(mAdapter, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + // The 'which' argument contains the index position + // of the selected item + } + }) + .create(); + } + + + class ActivityAdapter extends ArrayAdapter { + + private PackageManager mPackageManager; + + ActivityAdapter(Context context, PackageManager pm, List apps) { + //super(context, android.R.layout.activity_list_item, apps); + super(context, R.layout.activity_row, apps); + this.mPackageManager = pm; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + if (convertView == null) { + convertView = newView(parent); + } + bindView(position, convertView); + return convertView; + } + + private View newView(ViewGroup parent) { + return(((LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.activity_row, parent, false)); + //return(((LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(android.R.layout.activity_list_item, parent, false)); + } + + private void bindView(int position, View row) { + TextView label = (TextView) row.findViewById(R.id.title); + //TextView label = (TextView) row.findViewById(android.R.id.text1); + label.setText(getItem(position).loadLabel(mPackageManager)); + ImageView icon = (ImageView) row.findViewById(R.id.icon); + //ImageView icon = (ImageView) row.findViewById(android.R.id.icon); + icon.setImageDrawable(getItem(position).loadIcon(mPackageManager)); + } + } + +} diff --git a/src/com/owncloud/android/ui/fragment/FileDetailFragment.java b/src/com/owncloud/android/ui/fragment/FileDetailFragment.java index 5925e085..0eacfe44 100644 --- a/src/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -336,7 +336,7 @@ public class FileDetailFragment extends FileFragment implements public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_share_file: { - mContainerActivity.shareFileWithLink(getFile()); + mContainerActivity.shareFileWithLink(getFile()); return true; } case R.id.action_open_file_with: { diff --git a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java index ae7b7567..8be94778 100644 --- a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -285,7 +285,7 @@ public class OCFileListFragment extends ExtendedListFragment implements EditName mTargetFile = (OCFile) mAdapter.getItem(info.position); switch (item.getItemId()) { case R.id.action_share_file: { - mContainerActivity.shareFileWithLink(mTargetFile); + mContainerActivity.shareFileWithLink(mTargetFile); return true; } case R.id.action_rename_file: { diff --git a/src/com/owncloud/android/ui/preview/PreviewImageActivity.java b/src/com/owncloud/android/ui/preview/PreviewImageActivity.java index 7816349b..3caa80a0 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImageActivity.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageActivity.java @@ -481,9 +481,4 @@ public class PreviewImageActivity extends FileActivity implements FileFragment.C } } - @Override - public void shareFileWithLink(OCFile file) { - - } - } diff --git a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java index 8555fa77..d646bd5b 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageFragment.java @@ -247,6 +247,10 @@ public class PreviewImageFragment extends FileFragment implements OnRemoteOper @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { + case R.id.action_share_file: { + //shareFileWithLink(getFile()); + return true; + } case R.id.action_open_file_with: { openFile(); return true; diff --git a/src/com/owncloud/android/ui/preview/PreviewMediaFragment.java b/src/com/owncloud/android/ui/preview/PreviewMediaFragment.java index 464ea6db..0baed617 100644 --- a/src/com/owncloud/android/ui/preview/PreviewMediaFragment.java +++ b/src/com/owncloud/android/ui/preview/PreviewMediaFragment.java @@ -307,6 +307,10 @@ public class PreviewMediaFragment extends FileFragment implements @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { + case R.id.action_share_file: { + //shareFileWithLink(getFile()); + return true; + } case R.id.action_open_file_with: { openFile(); return true;