Use an explicit intent for "Quick View"...

Define Intent.ACTION_QUICK_VIEW.

Change-Id: Iae85a2a6fe35cfd135ff1af6672d37cc6b33dce4
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index f786d2f..586f3cd 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -658,6 +658,15 @@
     public static final String ACTION_DEFAULT = ACTION_VIEW;
 
     /**
+     * Activity Action: Quick view the data.
+     * <p>Input: {@link #getData} is URI from which to retrieve data.
+     * <p>Output: nothing.
+     * @hide
+     */
+    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+    public static final String ACTION_QUICK_VIEW = "android.intent.action.QUICK_VIEW";
+
+    /**
      * Used to indicate that some piece of data should be attached to some other
      * place.  For example, image data could be attached to a contact.  It is up
      * to the recipient to decide where the data should be attached; the intent
diff --git a/packages/DocumentsUI/src/com/android/documentsui/StandaloneActivity.java b/packages/DocumentsUI/src/com/android/documentsui/StandaloneActivity.java
index a972428..5f40dab 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/StandaloneActivity.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/StandaloneActivity.java
@@ -20,10 +20,12 @@
 import static com.android.documentsui.DirectoryFragment.ANIM_NONE;
 import static com.android.documentsui.DirectoryFragment.ANIM_UP;
 
+import android.annotation.Nullable;
 import android.app.Activity;
 import android.app.FragmentManager;
 import android.content.ActivityNotFoundException;
 import android.content.ClipData;
+import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.content.Context;
@@ -57,6 +59,7 @@
  * Standalone file management activity.
  */
 public class StandaloneActivity extends BaseActivity {
+
     public static final String TAG = "StandaloneFileManagement";
 
     private Toolbar mToolbar;
@@ -283,23 +286,49 @@
     @Override
     public void onDocumentPicked(DocumentInfo doc) {
         if (doc.isDirectory()) {
-            mState.stack.push(doc);
-            mState.stackTouched = true;
-            onCurrentDirectoryChanged(ANIM_DOWN);
+            openFolder(doc);
         } else {
-            // Fall back to viewing
-            final Intent view = new Intent(Intent.ACTION_VIEW);
-            view.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
-            view.setData(doc.derivedUri);
-
-            try {
-                startActivity(view);
-            } catch (ActivityNotFoundException ex2) {
-                Toast.makeText(this, R.string.toast_no_application, Toast.LENGTH_SHORT).show();
-            }
+            openDocument(doc);
         }
     }
 
+    private void openFolder(DocumentInfo doc) {
+        mState.stack.push(doc);
+        mState.stackTouched = true;
+        onCurrentDirectoryChanged(ANIM_DOWN);
+    }
+
+    /**
+     * Launches an intent to view the specified document.
+     */
+    private void openDocument(DocumentInfo doc) {
+        Intent intent = getQuickViewIntent(doc);
+        if (intent == null) {
+            intent = new Intent(Intent.ACTION_VIEW);
+            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+            intent.setData(doc.derivedUri);
+        }
+
+        try {
+            startActivity(intent);
+        } catch (ActivityNotFoundException ex2) {
+            Toast.makeText(this, R.string.toast_no_application, Toast.LENGTH_SHORT).show();
+        }
+    }
+
+    private @Nullable Intent getQuickViewIntent(DocumentInfo doc) {
+        Intent intent = new Intent(Intent.ACTION_QUICK_VIEW);
+        intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+        intent.setData(doc.derivedUri);
+
+        ComponentName handler = intent.resolveActivity(getPackageManager());
+        if (handler != null) {
+            return intent;
+        }
+
+        return null;
+    }
+
     @Override
     public void onDocumentsPicked(List<DocumentInfo> docs) {
         // TODO