aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorherriojr <jherriott@cyngn.com>2015-10-16 15:17:22 -0700
committerherriojr <jherriott@cyngn.com>2015-10-16 15:47:14 -0700
commit3a4d70fe0513bf1faf817e8d0d90b73f1e32707a (patch)
treee1b0223eb39f4456839094a79e23e6c4f3a604a6
parent25bcc733b630c3ee032b185ab9adfbbd99e4cbbc (diff)
downloadandroid_packages_apps_CMFileManager-3a4d70fe0513bf1faf817e8d0d90b73f1e32707a.tar.gz
android_packages_apps_CMFileManager-3a4d70fe0513bf1faf817e8d0d90b73f1e32707a.tar.bz2
android_packages_apps_CMFileManager-3a4d70fe0513bf1faf817e8d0d90b73f1e32707a.zip
Use System Resolver
Converting to using the system resolver. The logic has changed slightly in the following cases: Open -- Tries to start activity, falls back to EditorActivity on failure Open With -- Uses Chooser and populates Editor if not already there Falls back to EditorActivity on failure Click on FSObject -- Same as Open Sending Object -- Same as Open Cleaned up code around this a little since there were unused parameters. Note: The Chooser will only show EXTRA_INITIAL_INTENTS if there are other options as well, which is why we have to do the check up front to see if we need to add it, and falling back to just using the Editor if nothing exists to handle it. Issue-Id: CYNGNOS-1236 Change-Id: I803b86cf6bfec80bbc886025be43ce800afd3be1
-rwxr-xr-xsrc/com/cyanogenmod/filemanager/activities/SearchActivity.java2
-rw-r--r--src/com/cyanogenmod/filemanager/activities/ShortcutActivity.java2
-rw-r--r--src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java10
-rwxr-xr-xsrc/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java254
-rwxr-xr-xsrc/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java4
5 files changed, 74 insertions, 198 deletions
diff --git a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java
index 1ced5f98..6089873a 100755
--- a/src/com/cyanogenmod/filemanager/activities/SearchActivity.java
+++ b/src/com/cyanogenmod/filemanager/activities/SearchActivity.java
@@ -1397,7 +1397,7 @@ public class SearchActivity extends Activity
// Open the file here, so when focus back to the app, the search activity
// its in top of the stack
- IntentsActionPolicy.openFileSystemObject(this, fso, false, null, null);
+ IntentsActionPolicy.openFileSystemObject(this, fso, false, null);
} else {
// The fso not exists, delete the fso from the search
try {
diff --git a/src/com/cyanogenmod/filemanager/activities/ShortcutActivity.java b/src/com/cyanogenmod/filemanager/activities/ShortcutActivity.java
index 57e2670e..f074641c 100644
--- a/src/com/cyanogenmod/filemanager/activities/ShortcutActivity.java
+++ b/src/com/cyanogenmod/filemanager/activities/ShortcutActivity.java
@@ -189,7 +189,7 @@ public class ShortcutActivity extends Activity implements OnCancelListener, OnDi
} else {
// Open the file. Delegate in action policy
- IntentsActionPolicy.openFileSystemObject(this, fso, false, this, this);
+ IntentsActionPolicy.openFileSystemObject(this, fso, false, this);
}
} catch (Exception e) {
diff --git a/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java b/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java
index ecc7ce2c..5f2ec4e2 100644
--- a/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java
+++ b/src/com/cyanogenmod/filemanager/ui/dialogs/ActionsDialog.java
@@ -287,12 +287,12 @@ public class ActionsDialog implements OnItemClickListener, OnItemLongClickListen
//- Open
case R.id.mnu_actions_open:
IntentsActionPolicy.openFileSystemObject(
- this.mContext, this.mFso, false, null, null);
+ this.mContext, this.mFso, false, null);
break;
//- Open with
case R.id.mnu_actions_open_with:
IntentsActionPolicy.openFileSystemObject(
- this.mContext, this.mFso, true, null, null);
+ this.mContext, this.mFso, true, null);
break;
//- Execute
@@ -303,7 +303,7 @@ public class ActionsDialog implements OnItemClickListener, OnItemLongClickListen
//- Send
case R.id.mnu_actions_send:
IntentsActionPolicy.sendFileSystemObject(
- this.mContext, this.mFso, null, null);
+ this.mContext, this.mFso, null);
break;
case R.id.mnu_actions_send_selection:
if (this.mOnSelectionListener != null) {
@@ -311,10 +311,10 @@ public class ActionsDialog implements OnItemClickListener, OnItemLongClickListen
this.mOnSelectionListener.onRequestSelectedFiles();
if (selection.size() == 1) {
IntentsActionPolicy.sendFileSystemObject(
- this.mContext, selection.get(0), null, null);
+ this.mContext, selection.get(0), null);
} else {
IntentsActionPolicy.sendMultipleFileSystemObject(
- this.mContext, selection, null, null);
+ this.mContext, selection, null);
}
}
break;
diff --git a/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java b/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java
index 64fb4086..4944adf7 100755
--- a/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java
+++ b/src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java
@@ -19,18 +19,17 @@ package com.cyanogenmod.filemanager.ui.policy;
import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Context;
-import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
-import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.widget.Toast;
import com.cyanogenmod.filemanager.R;
+import com.cyanogenmod.filemanager.activities.EditorActivity;
import com.cyanogenmod.filemanager.activities.ShortcutActivity;
import com.cyanogenmod.filemanager.console.secure.SecureConsole;
import com.cyanogenmod.filemanager.model.FileSystemObject;
@@ -40,7 +39,6 @@ import com.cyanogenmod.filemanager.providers.SecureResourceProvider.Authorizatio
import com.cyanogenmod.filemanager.providers.secure.ISecureChoiceCompleteListener;
import com.cyanogenmod.filemanager.providers.secure.SecureCacheCleanupService;
import com.cyanogenmod.filemanager.providers.secure.SecureChoiceClickListener;
-import com.cyanogenmod.filemanager.ui.dialogs.AssociationsDialog;
import com.cyanogenmod.filemanager.util.DialogHelper;
import com.cyanogenmod.filemanager.util.ExceptionUtil;
import com.cyanogenmod.filemanager.util.FileHelper;
@@ -97,12 +95,11 @@ public final class IntentsActionPolicy extends ActionsPolicy {
* @param ctx The current context
* @param fso The file system object
* @param choose If allow the user to select the application to open with
- * @param onCancelListener The cancel listener
* @param onDismissListener The dismiss listener
*/
public static void openFileSystemObject(
final Context ctx, final FileSystemObject fso, final boolean choose,
- final OnCancelListener onCancelListener, final OnDismissListener onDismissListener) {
+ final OnDismissListener onDismissListener) {
try {
// Create the intent to open the file
final Intent intent = new Intent();
@@ -145,12 +142,6 @@ public final class IntentsActionPolicy extends ActionsPolicy {
ctx,
intent,
choose,
- createInternalIntents(ctx, cacheFso),
- 0,
- R.string.associations_dialog_openwith_title,
- R.string.associations_dialog_openwith_action,
- true,
- onCancelListener,
onDismissListener);
}
@@ -174,33 +165,28 @@ public final class IntentsActionPolicy extends ActionsPolicy {
}
// Resolve the intent
- resolveIntent(
- ctx,
- intent,
- choose,
- createInternalIntents(ctx, fso),
- 0,
- R.string.associations_dialog_openwith_title,
- R.string.associations_dialog_openwith_action,
- true, onCancelListener, onDismissListener);
-
+ resolveIntent(ctx, intent, choose, onDismissListener);
} catch (Exception e) {
ExceptionUtil.translateException(ctx, e);
}
}
+ private static boolean handledByEditorInManifest(Context context, Intent intent) {
+ Intent i = new Intent(intent);
+ i.setPackage(context.getPackageName());
+ return context.getPackageManager().queryIntentActivities(i, 0).size() > 0;
+ }
+
/**
* Method that sends a {@link FileSystemObject} with the default registered application
* by the system, or ask the user for select a registered application.
*
* @param ctx The current context
* @param fso The file system object
- * @param onCancelListener The cancel listener
* @param onDismissListener The dismiss listener
*/
public static void sendFileSystemObject(
- final Context ctx, final FileSystemObject fso,
- OnCancelListener onCancelListener, OnDismissListener onDismissListener) {
+ final Context ctx, final FileSystemObject fso, OnDismissListener onDismissListener) {
try {
// Create the intent to
Intent intent = new Intent();
@@ -214,12 +200,8 @@ public final class IntentsActionPolicy extends ActionsPolicy {
resolveIntent(
ctx,
intent,
- true,
- null,
- 0,
- R.string.associations_dialog_sendwith_title,
- R.string.associations_dialog_sendwith_action,
- false, onCancelListener, onDismissListener);
+ false,
+ onDismissListener);
} catch (Exception e) {
ExceptionUtil.translateException(ctx, e);
@@ -232,12 +214,11 @@ public final class IntentsActionPolicy extends ActionsPolicy {
*
* @param ctx The current context
* @param fsos The file system objects
- * @param onCancelListener The cancel listener
* @param onDismissListener The dismiss listener
*/
public static void sendMultipleFileSystemObject(
final Context ctx, final List<FileSystemObject> fsos,
- OnCancelListener onCancelListener, OnDismissListener onDismissListener) {
+ OnDismissListener onDismissListener) {
try {
// Create the intent to
Intent intent = new Intent();
@@ -281,12 +262,8 @@ public final class IntentsActionPolicy extends ActionsPolicy {
resolveIntent(
ctx,
intent,
- true,
- null,
- 0,
- R.string.associations_dialog_sendwith_title,
- R.string.associations_dialog_sendwith_action,
- false, onCancelListener, onDismissListener);
+ false,
+ onDismissListener);
} catch (Exception e) {
ExceptionUtil.translateException(ctx, e);
@@ -298,170 +275,58 @@ public final class IntentsActionPolicy extends ActionsPolicy {
*
* @param ctx The current context
* @param intent The intent to resolve
- * @param choose If allow the user to select the application to select the registered
* application. If no preferred app or more than one exists the dialog is shown.
- * @param internals The list of internals intents that can handle the action
- * @param icon The icon of the dialog
- * @param title The title of the dialog
- * @param action The button title of the dialog
- * @param allowPreferred If allow the user to mark the selected app as preferred
- * @param onCancelListener The cancel listener
* @param onDismissListener The dismiss listener
*/
private static void resolveIntent(
- Context ctx, Intent intent, boolean choose, List<Intent> internals,
- int icon, int title, int action, boolean allowPreferred,
- OnCancelListener onCancelListener, OnDismissListener onDismissListener) {
- //Retrieve the activities that can handle the file
- final PackageManager packageManager = ctx.getPackageManager();
- if (DEBUG) {
- intent.addFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION);
- }
- List<ResolveInfo> info =
- packageManager.
- queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
- Collections.sort(info, new Comparator<ResolveInfo>() {
- @Override
- public int compare(ResolveInfo lhs, ResolveInfo rhs) {
- boolean isLshCMFM =
- lhs.activityInfo.packageName.compareTo(PREFERRED_PACKAGE) == 0;
- boolean isRshCMFM =
- rhs.activityInfo.packageName.compareTo(PREFERRED_PACKAGE) == 0;
- if (isLshCMFM && !isRshCMFM) {
- return -1;
+ Context ctx, Intent intent, boolean choose, OnDismissListener onDismissListener) {
+ if (choose) {
+ PackageManager pm = ctx.getPackageManager();
+ List<ResolveInfo> infos = pm.queryIntentActivities(intent, 0);
+
+ Intent editor = new Intent(intent);
+ editor.setClass(ctx, EditorActivity.class);
+
+ if (infos.size() > 0) {
+ // Try to only show the chooser when we have multiple items
+ Intent i = Intent.createChooser(intent,
+ ctx.getString(R.string.associations_dialog_openwith_title));
+ if (!handledByEditorInManifest(ctx, intent)) {
+ i.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[]{
+ editor,
+ });
}
- if (!isLshCMFM && isRshCMFM) {
- return 1;
- }
- return lhs.activityInfo.name.compareTo(rhs.activityInfo.name);
- }
- });
-
- if (info.size() == 0) {
- // This basically checks the system to see if it possibly wants to handle it
- ResolveInfo ri = packageManager.resolveActivity(intent, 0);
- if (ri != null) {
try {
- ctx.startActivity(getIntentFromResolveInfo(ri, intent));
- if (onDismissListener != null) {
- onDismissListener.onDismiss(null);
- }
- return;
+ ctx.startActivity(i);
} catch (ActivityNotFoundException e) {
- // fall through, we may still want to handle it with an internal activity
- }
- }
- }
-
- // Add the internal editors
- int count = 0;
- if (internals != null) {
- int cc = internals.size();
- for (int i = 0; i < cc; i++) {
- Intent ii = internals.get(i);
- List<ResolveInfo> ie =
- packageManager.
- queryIntentActivities(ii, 0);
- if (ie.size() > 0) {
- ResolveInfo rie = ie.get(0);
-
- // Only if the internal is not in the query list
- boolean exists = false;
- int ccc = info.size();
- for (int j = 0; j < ccc; j++) {
- ResolveInfo ri = info.get(j);
- if (ri.activityInfo.packageName.compareTo(
- rie.activityInfo.packageName) == 0 &&
- ri.activityInfo.name.compareTo(
- rie.activityInfo.name) == 0) {
-
- // Mark as internal
- if (ri.activityInfo.metaData == null) {
- ri.activityInfo.metaData = new Bundle();
- ri.activityInfo.metaData.putString(
- EXTRA_INTERNAL_ACTION, ii.getAction());
- ri.activityInfo.metaData.putBoolean(
- CATEGORY_INTERNAL_VIEWER, true);
- }
- exists = true;
- break;
- }
- }
- if (exists) {
- continue;
- }
-
- // Mark as internal
- if (rie.activityInfo.metaData == null) {
- rie.activityInfo.metaData = new Bundle();
- rie.activityInfo.metaData.putString(EXTRA_INTERNAL_ACTION, ii.getAction());
- rie.activityInfo.metaData.putBoolean(CATEGORY_INTERNAL_VIEWER, true);
+ try {
+ ctx.startActivity(editor);
+ } catch (ActivityNotFoundException e1) {
+ // Do nothing, this should never happen
}
-
- // Only one result must be matched
- info.add(count, rie);
- count++;
}
- }
- }
-
- // No registered application
- if (info.size() == 0) {
- DialogHelper.showToast(ctx, R.string.msgs_not_registered_app, Toast.LENGTH_SHORT);
- if (onDismissListener != null) {
- onDismissListener.onDismiss(null);
- }
- return;
- }
-
- // Retrieve the preferred activity that can handle the file. We only want the
- // resolved activity if the activity is a preferred activity. Other case, the
- // resolved activity was never added by addPreferredActivity
- ResolveInfo mPreferredInfo = findPreferredActivity(ctx, intent, info);
-
- // Is a simple open and we have an application that can handle the file?
- //---
- // If we have a preferred application, then use it
- if (!choose && (mPreferredInfo != null && mPreferredInfo.match != 0)) {
- try {
- ctx.startActivity(getIntentFromResolveInfo(mPreferredInfo, intent));
- if (onDismissListener != null) {
- onDismissListener.onDismiss(null);
+ } else {
+ try {
+ ctx.startActivity(editor);
+ } catch (ActivityNotFoundException e) {
+ // Do nothing, this should never happen
}
- return;
- } catch (ActivityNotFoundException e) {
- // fall through, the preferred may have been uninstalled.
}
- }
- // If there are only one activity (app or internal editor), then use it
- if (!choose && info.size() == 1) {
- ResolveInfo ri = info.get(0);
+ } else {
try {
- ctx.startActivity(getIntentFromResolveInfo(ri, intent));
+ ctx.startActivity(intent);
} catch (ActivityNotFoundException e) {
- DialogHelper.showToast(ctx, R.string.msgs_not_registered_app, Toast.LENGTH_SHORT);
- }
- if (onDismissListener != null) {
- onDismissListener.onDismiss(null);
+ intent.setClass(ctx, EditorActivity.class);
+ try {
+ ctx.startActivity(intent);
+ } catch (ActivityNotFoundException e2) {
+ // This should never happen unless the editor is removed.
+ }
}
- return;
}
-
- // If we have multiples apps and there is not a preferred application then show
- // open with dialog
- AssociationsDialog dialog =
- new AssociationsDialog(
- ctx,
- icon,
- ctx.getString(title),
- ctx.getString(action),
- intent,
- info,
- mPreferredInfo,
- allowPreferred,
- onCancelListener,
- onDismissListener);
- dialog.show();
+ if (onDismissListener != null) {
+ onDismissListener.onDismiss(null);
+ }
}
/**
@@ -519,7 +384,7 @@ public final class IntentsActionPolicy extends ActionsPolicy {
*/
private static List<Intent> createInternalIntents(Context ctx, FileSystemObject fso) {
List<Intent> intents = new ArrayList<Intent>();
- intents.addAll(createEditorIntent(ctx, fso));
+ intents.addAll(createEditorIntents(ctx, fso));
return intents;
}
@@ -529,7 +394,7 @@ public final class IntentsActionPolicy extends ActionsPolicy {
* @param ctx The current context
* @param fso FileSystemObject
*/
- private static List<Intent> createEditorIntent(Context ctx, FileSystemObject fso) {
+ private static List<Intent> createEditorIntents(Context ctx, FileSystemObject fso) {
List<Intent> intents = new ArrayList<Intent>();
MimeTypeCategory category = MimeTypeHelper.getCategory(ctx, fso);
@@ -549,6 +414,17 @@ public final class IntentsActionPolicy extends ActionsPolicy {
return intents;
}
+ private static Intent createEditorIntent(Context ctx, FileSystemObject fso) {
+ Intent editorIntent = null;
+ MimeTypeCategory category = MimeTypeHelper.getCategory(ctx, fso);
+
+ editorIntent = new Intent();
+ editorIntent.setAction(Intent.ACTION_VIEW);
+ editorIntent.addCategory(CATEGORY_INTERNAL_VIEWER);
+ editorIntent.addCategory(CATEGORY_EDITOR);
+ return editorIntent;
+ }
+
/**
* Method that returns an {@link Intent} from his {@link ResolveInfo}
*
diff --git a/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java b/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java
index 8adf2732..6d8ba671 100755
--- a/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java
+++ b/src/com/cyanogenmod/filemanager/ui/widgets/NavigationView.java
@@ -1216,7 +1216,7 @@ BreadcrumbListener, OnSelectionChangedListener, OnSelectionListener, OnRequestRe
changeCurrentDir(fso.getFullPath(), searchInfo);
} else {
// Open the file with the preferred registered app
- IntentsActionPolicy.openFileSystemObject(getContext(), fso, false, null, null);
+ IntentsActionPolicy.openFileSystemObject(getContext(), fso, false, null);
}
}
@@ -1248,7 +1248,7 @@ BreadcrumbListener, OnSelectionChangedListener, OnSelectionListener, OnRequestRe
// Open the file (edit or pick)
if (this.mNavigationMode.compareTo(NAVIGATION_MODE.BROWSABLE) == 0) {
// Open the file with the preferred registered app
- IntentsActionPolicy.openFileSystemObject(getContext(), fso, false, null, null);
+ IntentsActionPolicy.openFileSystemObject(getContext(), fso, false, null);
} else {
// Request a file pick selection
if (this.mOnFilePickedListener != null) {