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

Commit eae850ce authored by Mihai Preda's avatar Mihai Preda
Browse files

Allow intent resolution to be constrained by package name.

parent 75986cf9
Loading
Loading
Loading
Loading
+34 −4
Original line number Diff line number Diff line
@@ -33321,8 +33321,6 @@
>
<parameter name="packageName" type="java.lang.String">
</parameter>
<exception name="PackageManager.NameNotFoundException" type="android.content.pm.PackageManager.NameNotFoundException">
</exception>
</method>
<method name="getNameForUid"
 return="java.lang.String"
@@ -33750,6 +33748,23 @@
<parameter name="flags" type="int">
</parameter>
</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"
 return="android.content.pm.ProviderInfo"
 abstract="true"
@@ -111816,8 +111831,6 @@
>
<parameter name="packageName" type="java.lang.String">
</parameter>
<exception name="PackageManager.NameNotFoundException" type="android.content.pm.PackageManager.NameNotFoundException">
</exception>
</method>
<method name="getNameForUid"
 return="java.lang.String"
@@ -112227,6 +112240,23 @@
</parameter>
<parameter name="flags" type="int">
</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 name="resolveContentProvider"
 return="android.content.pm.ProviderInfo"
+31 −30
Original line number Diff line number Diff line
@@ -1519,42 +1519,30 @@ class ApplicationContext extends Context {
            throw new NameNotFoundException(packageName);
        }

        public Intent getLaunchIntentForPackage(String packageName)
                throws NameNotFoundException {
        @Override
        public Intent getLaunchIntentForPackage(String packageName) {
            // 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
            // overall package (such as if it has multiple launcher entries).
            Intent intent = getLaunchIntentForPackageCategory(this, packageName,
                    Intent.CATEGORY_INFO);
            if (intent != null) {
                return intent;
            }
            Intent intentToResolve = new Intent(Intent.ACTION_MAIN);
            intentToResolve.addCategory(Intent.CATEGORY_INFO);
            ResolveInfo resolveInfo = resolveActivity(intentToResolve, 0, packageName);

            // Otherwise, try to find a main launcher activity.
            return getLaunchIntentForPackageCategory(this, packageName,
                    Intent.CATEGORY_LAUNCHER);
            if (resolveInfo == null) {
                // 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.setClassName(packageName, resolveInfo.activityInfo.name);
            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 null;
        }

        @Override
        public int[] getPackageGids(String packageName)
@@ -1792,6 +1780,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
        public List<ResolveInfo> queryIntentActivities(Intent intent,
                int flags) {
+3 −0
Original line number Diff line number Diff line
@@ -81,6 +81,9 @@ interface IPackageManager {
    
    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, 
            String resolvedType, int flags);

+19 −3
Original line number 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
     * not contain such an activity.
     */
    public abstract Intent getLaunchIntentForPackage(String packageName)
            throws NameNotFoundException;
    public abstract Intent getLaunchIntentForPackage(String packageName);

    /**
     * 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);

    /**
     * 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.
     *
+17 −0
Original line number Diff line number Diff line
@@ -163,6 +163,23 @@ public class IntentResolver<F extends IntentFilter, R extends Object> {
        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,
            String resolvedType, boolean defaultOnly) {
        String scheme = intent.getScheme();
Loading