Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dd6face5 authored by Mihai Preda's avatar Mihai Preda Committed by The Android Open Source Project
Browse files

am eae850ce: Allow intent resolution to be constrained by package name.

Merge commit 'eae850ce'

* commit 'eae850ce':
  Allow intent resolution to be constrained by package name.
parents 76879bc2 eae850ce
Loading
Loading
Loading
Loading
+34 −4
Original line number Original line Diff line number Diff line
@@ -36138,8 +36138,6 @@
>
>
<parameter name="packageName" type="java.lang.String">
<parameter name="packageName" type="java.lang.String">
</parameter>
</parameter>
<exception name="PackageManager.NameNotFoundException" type="android.content.pm.PackageManager.NameNotFoundException">
</exception>
</method>
</method>
<method name="getNameForUid"
<method name="getNameForUid"
 return="java.lang.String"
 return="java.lang.String"
@@ -36567,6 +36565,23 @@
<parameter name="flags" type="int">
<parameter name="flags" type="int">
</parameter>
</parameter>
</method>
</method>
<method name="resolveActivity"
 return="android.content.pm.ResolveInfo"
 abstract="true"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="intent" type="android.content.Intent">
</parameter>
<parameter name="flags" type="int">
</parameter>
<parameter name="packageName" type="java.lang.String">
</parameter>
</method>
<method name="resolveContentProvider"
<method name="resolveContentProvider"
 return="android.content.pm.ProviderInfo"
 return="android.content.pm.ProviderInfo"
 abstract="true"
 abstract="true"
@@ -114689,8 +114704,6 @@
>
>
<parameter name="packageName" type="java.lang.String">
<parameter name="packageName" type="java.lang.String">
</parameter>
</parameter>
<exception name="PackageManager.NameNotFoundException" type="android.content.pm.PackageManager.NameNotFoundException">
</exception>
</method>
</method>
<method name="getNameForUid"
<method name="getNameForUid"
 return="java.lang.String"
 return="java.lang.String"
@@ -115100,6 +115113,23 @@
</parameter>
</parameter>
<parameter name="flags" type="int">
<parameter name="flags" type="int">
</parameter>
</parameter>
<parameter name="packageName" type="java.lang.String">
</parameter>
</method>
<method name="resolveActivity"
 return="android.content.pm.ResolveInfo"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="intent" type="android.content.Intent">
</parameter>
<parameter name="flags" type="int">
</parameter>
</method>
</method>
<method name="resolveContentProvider"
<method name="resolveContentProvider"
 return="android.content.pm.ProviderInfo"
 return="android.content.pm.ProviderInfo"
+31 −30
Original line number Original line Diff line number Diff line
@@ -1535,42 +1535,30 @@ class ApplicationContext extends Context {
            throw new NameNotFoundException(packageName);
            throw new NameNotFoundException(packageName);
        }
        }


        public Intent getLaunchIntentForPackage(String packageName)
        @Override
                throws NameNotFoundException {
        public Intent getLaunchIntentForPackage(String packageName) {
            // First see if the package has an INFO activity; the existence of
            // First see if the package has an INFO activity; the existence of
            // such an activity is implied to be the desired front-door for the
            // such an activity is implied to be the desired front-door for the
            // overall package (such as if it has multiple launcher entries).
            // overall package (such as if it has multiple launcher entries).
            Intent intent = getLaunchIntentForPackageCategory(this, packageName,
            Intent intentToResolve = new Intent(Intent.ACTION_MAIN);
                    Intent.CATEGORY_INFO);
            intentToResolve.addCategory(Intent.CATEGORY_INFO);
            if (intent != null) {
            ResolveInfo resolveInfo = resolveActivity(intentToResolve, 0, packageName);
                return intent;
            }


            // Otherwise, try to find a main launcher activity.
            // Otherwise, try to find a main launcher activity.
            return getLaunchIntentForPackageCategory(this, packageName,
            if (resolveInfo == null) {
                    Intent.CATEGORY_LAUNCHER);
                // reuse the intent instance
                intentToResolve.removeCategory(Intent.CATEGORY_INFO);
                intentToResolve.addCategory(Intent.CATEGORY_LAUNCHER);
                resolveInfo = resolveActivity(intentToResolve, 0, packageName);
            }
            if (resolveInfo == null) {
                return null;
            }
            }
        
        // XXX This should be implemented as a call to the package manager,
        // to reduce the work needed.
        static Intent getLaunchIntentForPackageCategory(PackageManager pm,
                String packageName, String category) {
            Intent intent = new Intent(Intent.ACTION_MAIN);
            Intent intent = new Intent(Intent.ACTION_MAIN);
            intent.setClassName(packageName, resolveInfo.activityInfo.name);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            Intent intentToResolve = new Intent(Intent.ACTION_MAIN, null);
            intentToResolve.addCategory(category);
            final List<ResolveInfo> apps =
                    pm.queryIntentActivities(intentToResolve, 0);
            // I wish there were a way to directly get the "main" activity of a
            // package but ...
            for (ResolveInfo app : apps) {
                if (app.activityInfo.packageName.equals(packageName)) {
                    intent.setClassName(packageName, app.activityInfo.name);
            return intent;
            return intent;
        }
        }
            }
            return null;
        }


        @Override
        @Override
        public int[] getPackageGids(String packageName)
        public int[] getPackageGids(String packageName)
@@ -1808,6 +1796,19 @@ class ApplicationContext extends Context {
            }
            }
        }
        }


        @Override
        public ResolveInfo resolveActivity(Intent intent, int flags, String packageName) {
            try {
                return mPM.resolveIntentForPackage(
                    intent,
                    intent.resolveTypeIfNeeded(mContext.getContentResolver()),
                    flags,
                    packageName);
            } catch (RemoteException e) {
                throw new RuntimeException("Package manager has died", e);
            }
        }

        @Override
        @Override
        public List<ResolveInfo> queryIntentActivities(Intent intent,
        public List<ResolveInfo> queryIntentActivities(Intent intent,
                int flags) {
                int flags) {
+3 −0
Original line number Original line Diff line number Diff line
@@ -81,6 +81,9 @@ interface IPackageManager {
    
    
    ResolveInfo resolveIntent(in Intent intent, String resolvedType, int flags);
    ResolveInfo resolveIntent(in Intent intent, String resolvedType, int flags);


    ResolveInfo resolveIntentForPackage(in Intent intent, String resolvedType, int flags,
            String packageName);

    List<ResolveInfo> queryIntentActivities(in Intent intent, 
    List<ResolveInfo> queryIntentActivities(in Intent intent, 
            String resolvedType, int flags);
            String resolvedType, int flags);


+19 −3
Original line number Original line Diff line number Diff line
@@ -563,8 +563,7 @@ public abstract class PackageManager {
     * launch the main activity in the package, or null if the package does
     * launch the main activity in the package, or null if the package does
     * not contain such an activity.
     * not contain such an activity.
     */
     */
    public abstract Intent getLaunchIntentForPackage(String packageName)
    public abstract Intent getLaunchIntentForPackage(String packageName);
            throws NameNotFoundException;


    /**
    /**
     * Return an array of all of the secondary group-ids that have been
     * Return an array of all of the secondary group-ids that have been
@@ -970,6 +969,23 @@ public abstract class PackageManager {
     */
     */
    public abstract ResolveInfo resolveActivity(Intent intent, int flags);
    public abstract ResolveInfo resolveActivity(Intent intent, int flags);


    /**
     * Resolve the intent restricted to a package.
     * {@see #resolveActivity}
     *
     * @param intent An intent containing all of the desired specification
     *               (action, data, type, category, and/or component).
     * @param flags Additional option flags.  The most important is
     *                    MATCH_DEFAULT_ONLY, to limit the resolution to only
     *                    those activities that support the CATEGORY_DEFAULT.
     * @param packageName Restrict the intent resolution to this package.
     *
     * @return Returns a ResolveInfo containing the final activity intent that
     *         was determined to be the best action.  Returns null if no
     *         matching activity was found.
     */
    public abstract ResolveInfo resolveActivity(Intent intent, int flags, String packageName);

    /**
    /**
     * Retrieve all activities that can be performed for the given intent.
     * Retrieve all activities that can be performed for the given intent.
     *
     *
+17 −0
Original line number Original line Diff line number Diff line
@@ -163,6 +163,23 @@ public class IntentResolver<F extends IntentFilter, R extends Object> {
        return Collections.unmodifiableSet(mFilters);
        return Collections.unmodifiableSet(mFilters);
    }
    }


    public List<R> queryIntentFromList(Intent intent, String resolvedType, 
            boolean defaultOnly, ArrayList<ArrayList<F>> listCut) {
        ArrayList<R> resultList = new ArrayList<R>();

        final boolean debug = localLOGV ||
                ((intent.getFlags() & Intent.FLAG_DEBUG_LOG_RESOLUTION) != 0);

        final String scheme = intent.getScheme();
        int N = listCut.size();
        for (int i = 0; i < N; ++i) {
            buildResolveList(intent, debug, defaultOnly,
                             resolvedType, scheme, listCut.get(i), resultList);
        }
        sortResults(resultList);
        return resultList;
    }

    public List<R> queryIntent(ContentResolver resolver, Intent intent,
    public List<R> queryIntent(ContentResolver resolver, Intent intent,
            String resolvedType, boolean defaultOnly) {
            String resolvedType, boolean defaultOnly) {
        String scheme = intent.getScheme();
        String scheme = intent.getScheme();
Loading