OSDN Git Service

Check If System Wants Intent
authorherriojr <jherriott@cyngn.com>
Tue, 29 Sep 2015 20:38:20 +0000 (13:38 -0700)
committerherriojr <jherriott@cyngn.com>
Wed, 30 Sep 2015 19:06:01 +0000 (12:06 -0700)
After much thought about this last night, I came to the conclusion
that because applications can in fact do this, we need to be able
to support it in a backwards compatible fashion. In doing so, there
are a few cases which won't work with suggestions, however, the
changes here are less severe than what they were before. Now just
an extra check happens to see if the system wants to handle the
intent if nothing was found to handle it.

What this means is any application acting as its own resolver
will not automatically have the system handle it in this case
and we no longer can support suggestion outlined here:
http://developer.android.com/training/basics/intents/sending.html#StartActivity

The suggestion is wrong anyways as an activity isn't guaranteed
to continue to exist after the query when the start is called. Maybe
I'll try and push a documentation change upstream to AOSP for this.

Change-Id: I8510660420ee52c09d03c719850fa14d6b1c4441
Issue-Id: CYNGNOS-1152

src/com/cyanogenmod/filemanager/ui/policy/IntentsActionPolicy.java

index 043a362..64fb408 100755 (executable)
@@ -16,6 +16,7 @@
 
 package com.cyanogenmod.filemanager.ui.policy;
 
+import android.content.ActivityNotFoundException;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.DialogInterface.OnCancelListener;
@@ -336,6 +337,22 @@ public final class IntentsActionPolicy extends ActionsPolicy {
             }
         });
 
+        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;
+                } 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) {
@@ -406,16 +423,24 @@ public final class IntentsActionPolicy extends ActionsPolicy {
         //---
         // If we have a preferred application, then use it
         if (!choose && (mPreferredInfo  != null && mPreferredInfo.match != 0)) {
-            ctx.startActivity(getIntentFromResolveInfo(mPreferredInfo, intent));
-            if (onDismissListener != null) {
-                onDismissListener.onDismiss(null);
+            try {
+                ctx.startActivity(getIntentFromResolveInfo(mPreferredInfo, intent));
+                if (onDismissListener != null) {
+                    onDismissListener.onDismiss(null);
+                }
+                return;
+            } catch (ActivityNotFoundException e) {
+                // fall through, the preferred may have been uninstalled.
             }
-            return;
         }
         // If there are only one activity (app or internal editor), then use it
         if (!choose && info.size() == 1) {
             ResolveInfo ri = info.get(0);
-            ctx.startActivity(getIntentFromResolveInfo(ri, intent));
+            try {
+                ctx.startActivity(getIntentFromResolveInfo(ri, intent));
+            } catch (ActivityNotFoundException e) {
+                DialogHelper.showToast(ctx, R.string.msgs_not_registered_app, Toast.LENGTH_SHORT);
+            }
             if (onDismissListener != null) {
                 onDismissListener.onDismiss(null);
             }