PackageManagerInternal.java revision 303c4bbb40945c399647487a98ace75cdedccd3a
1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.content.pm;
18
19import android.annotation.IntDef;
20import android.annotation.NonNull;
21import android.annotation.Nullable;
22import android.content.ComponentName;
23import android.content.Intent;
24import android.content.pm.PackageManager.ApplicationInfoFlags;
25import android.content.pm.PackageManager.ComponentInfoFlags;
26import android.content.pm.PackageManager.PackageInfoFlags;
27import android.content.pm.PackageManager.ResolveInfoFlags;
28import android.os.Bundle;
29import android.os.PersistableBundle;
30import android.util.SparseArray;
31
32import java.lang.annotation.Retention;
33import java.lang.annotation.RetentionPolicy;
34import java.util.List;
35
36/**
37 * Package manager local system service interface.
38 *
39 * @hide Only for use within the system server.
40 */
41public abstract class PackageManagerInternal {
42    public static final int PACKAGE_SYSTEM = 0;
43    public static final int PACKAGE_SETUP_WIZARD = 1;
44    public static final int PACKAGE_INSTALLER = 2;
45    public static final int PACKAGE_VERIFIER = 3;
46    public static final int PACKAGE_BROWSER = 4;
47    public static final int PACKAGE_SYSTEM_TEXT_CLASSIFIER = 5;
48    @IntDef(value = {
49        PACKAGE_SYSTEM,
50        PACKAGE_SETUP_WIZARD,
51        PACKAGE_INSTALLER,
52        PACKAGE_VERIFIER,
53        PACKAGE_BROWSER,
54        PACKAGE_SYSTEM_TEXT_CLASSIFIER,
55    })
56    @Retention(RetentionPolicy.SOURCE)
57    public @interface KnownPackage {}
58
59    /** Observer called whenever the list of packages changes */
60    public interface PackageListObserver {
61        /** A package was added to the system. */
62        void onPackageAdded(@NonNull String packageName);
63        /** A package was removed from the system. */
64        void onPackageRemoved(@NonNull String packageName);
65    }
66
67    /**
68     * Provider for package names.
69     */
70    public interface PackagesProvider {
71
72        /**
73         * Gets the packages for a given user.
74         * @param userId The user id.
75         * @return The package names.
76         */
77        public String[] getPackages(int userId);
78    }
79
80    /**
81     * Provider for package names.
82     */
83    public interface SyncAdapterPackagesProvider {
84
85        /**
86         * Gets the sync adapter packages for given authority and user.
87         * @param authority The authority.
88         * @param userId The user id.
89         * @return The package names.
90         */
91        public String[] getPackages(String authority, int userId);
92    }
93
94    /**
95     * Sets the location provider packages provider.
96     * @param provider The packages provider.
97     */
98    public abstract void setLocationPackagesProvider(PackagesProvider provider);
99
100    /**
101     * Sets the voice interaction packages provider.
102     * @param provider The packages provider.
103     */
104    public abstract void setVoiceInteractionPackagesProvider(PackagesProvider provider);
105
106    /**
107     * Sets the SMS packages provider.
108     * @param provider The packages provider.
109     */
110    public abstract void setSmsAppPackagesProvider(PackagesProvider provider);
111
112    /**
113     * Sets the dialer packages provider.
114     * @param provider The packages provider.
115     */
116    public abstract void setDialerAppPackagesProvider(PackagesProvider provider);
117
118    /**
119     * Sets the sim call manager packages provider.
120     * @param provider The packages provider.
121     */
122    public abstract void setSimCallManagerPackagesProvider(PackagesProvider provider);
123
124    /**
125     * Sets the Use Open Wifi packages provider.
126     * @param provider The packages provider.
127     */
128    public abstract void setUseOpenWifiAppPackagesProvider(PackagesProvider provider);
129
130    /**
131     * Sets the sync adapter packages provider.
132     * @param provider The provider.
133     */
134    public abstract void setSyncAdapterPackagesprovider(SyncAdapterPackagesProvider provider);
135
136    /**
137     * Requests granting of the default permissions to the current default SMS app.
138     * @param packageName The default SMS package name.
139     * @param userId The user for which to grant the permissions.
140     */
141    public abstract void grantDefaultPermissionsToDefaultSmsApp(String packageName, int userId);
142
143    /**
144     * Requests granting of the default permissions to the current default dialer app.
145     * @param packageName The default dialer package name.
146     * @param userId The user for which to grant the permissions.
147     */
148    public abstract void grantDefaultPermissionsToDefaultDialerApp(String packageName, int userId);
149
150    /**
151     * Requests granting of the default permissions to the current default sim call manager.
152     * @param packageName The default sim call manager package name.
153     * @param userId The user for which to grant the permissions.
154     */
155    public abstract void grantDefaultPermissionsToDefaultSimCallManager(String packageName,
156            int userId);
157
158    /**
159     * Requests granting of the default permissions to the current default Use Open Wifi app.
160     * @param packageName The default use open wifi package name.
161     * @param userId The user for which to grant the permissions.
162     */
163    public abstract void grantDefaultPermissionsToDefaultUseOpenWifiApp(String packageName,
164            int userId);
165
166    /**
167     * Sets a list of apps to keep in PM's internal data structures and as APKs even if no user has
168     * currently installed it. The apps are not preloaded.
169     * @param packageList List of package names to keep cached.
170     */
171    public abstract void setKeepUninstalledPackages(List<String> packageList);
172
173    /**
174     * Gets whether some of the permissions used by this package require a user
175     * review before any of the app components can run.
176     * @param packageName The package name for which to check.
177     * @param userId The user under which to check.
178     * @return True a permissions review is required.
179     */
180    public abstract boolean isPermissionsReviewRequired(String packageName, int userId);
181
182    /**
183     * Retrieve all of the information we know about a particular package/application.
184     * @param filterCallingUid The results will be filtered in the context of this UID instead
185     * of the calling UID.
186     * @see PackageManager#getPackageInfo(String, int)
187     */
188    public abstract PackageInfo getPackageInfo(String packageName,
189            @PackageInfoFlags int flags, int filterCallingUid, int userId);
190
191    /**
192     * Retrieve launcher extras for a suspended package provided to the system in
193     * {@link PackageManager#setPackagesSuspended(String[], boolean, PersistableBundle,
194     * PersistableBundle, String)}.
195     *
196     * @param packageName The package for which to return launcher extras.
197     * @param userId The user for which to check.
198     * @return The launcher extras.
199     *
200     * @see PackageManager#setPackagesSuspended(String[], boolean, PersistableBundle,
201     * PersistableBundle, String)
202     * @see PackageManager#isPackageSuspended()
203     */
204    public abstract Bundle getSuspendedPackageLauncherExtras(String packageName,
205            int userId);
206
207    /**
208     * Internal api to query the suspended state of a package.
209     * @param packageName The package to check.
210     * @param userId The user id to check for.
211     * @return {@code true} if the package is suspended, {@code false} otherwise.
212     * @see PackageManager#isPackageSuspended(String)
213     */
214    public abstract boolean isPackageSuspended(String packageName, int userId);
215
216    /**
217     * Get the name of the package that suspended the given package. Packages can be suspended by
218     * device administrators or apps holding {@link android.Manifest.permission#MANAGE_USERS} or
219     * {@link android.Manifest.permission#SUSPEND_APPS}.
220     *
221     * @param suspendedPackage The package that has been suspended.
222     * @param userId The user for which to check.
223     * @return Name of the package that suspended the given package. Returns {@code null} if the
224     * given package is not currently suspended and the platform package name - i.e.
225     * {@code "android"} - if the package was suspended by a device admin.
226     */
227    public abstract String getSuspendingPackage(String suspendedPackage, int userId);
228
229    /**
230     * Get the dialog message to be shown to the user when they try to launch a suspended
231     * application.
232     *
233     * @param suspendedPackage The package that has been suspended.
234     * @param userId The user for which to check.
235     * @return The dialog message to be shown to the user.
236     */
237    public abstract String getSuspendedDialogMessage(String suspendedPackage, int userId);
238
239    /**
240     * Do a straight uid lookup for the given package/application in the given user.
241     * @see PackageManager#getPackageUidAsUser(String, int, int)
242     * @return The app's uid, or < 0 if the package was not found in that user
243     */
244    public abstract int getPackageUid(String packageName,
245            @PackageInfoFlags int flags, int userId);
246
247    /**
248     * Retrieve all of the information we know about a particular package/application.
249     * @param filterCallingUid The results will be filtered in the context of this UID instead
250     * of the calling UID.
251     * @see PackageManager#getApplicationInfo(String, int)
252     */
253    public abstract ApplicationInfo getApplicationInfo(String packageName,
254            @ApplicationInfoFlags int flags, int filterCallingUid, int userId);
255
256    /**
257     * Retrieve all of the information we know about a particular activity class.
258     * @param filterCallingUid The results will be filtered in the context of this UID instead
259     * of the calling UID.
260     * @see PackageManager#getActivityInfo(ComponentName, int)
261     */
262    public abstract ActivityInfo getActivityInfo(ComponentName component,
263            @ComponentInfoFlags int flags, int filterCallingUid, int userId);
264
265    /**
266     * Retrieve all activities that can be performed for the given intent.
267     * @param filterCallingUid The results will be filtered in the context of this UID instead
268     * of the calling UID.
269     * @see PackageManager#queryIntentActivities(Intent, int)
270     */
271    public abstract List<ResolveInfo> queryIntentActivities(Intent intent,
272            @ResolveInfoFlags int flags, int filterCallingUid, int userId);
273
274    /**
275     * Retrieve all services that can be performed for the given intent.
276     * @see PackageManager#queryIntentServices(Intent, int)
277     */
278    public abstract List<ResolveInfo> queryIntentServices(
279            Intent intent, int flags, int callingUid, int userId);
280
281    /**
282     * Interface to {@link com.android.server.pm.PackageManagerService#getHomeActivitiesAsUser}.
283     */
284    public abstract ComponentName getHomeActivitiesAsUser(List<ResolveInfo> allHomeCandidates,
285            int userId);
286
287    /**
288     * @return The default home activity component name.
289     */
290    public abstract ComponentName getDefaultHomeActivity(int userId);
291
292    /**
293     * Called by DeviceOwnerManagerService to set the package names of device owner and profile
294     * owners.
295     */
296    public abstract void setDeviceAndProfileOwnerPackages(
297            int deviceOwnerUserId, String deviceOwner, SparseArray<String> profileOwners);
298
299    /**
300     * Returns {@code true} if a given package can't be wiped. Otherwise, returns {@code false}.
301     */
302    public abstract boolean isPackageDataProtected(int userId, String packageName);
303
304    /**
305     * Returns {@code true} if a given package's state is protected, e.g. it cannot be force
306     * stopped, suspended, disabled or hidden. Otherwise, returns {@code false}.
307     */
308    public abstract boolean isPackageStateProtected(String packageName, int userId);
309
310    /**
311     * Returns {@code true} if a given package is installed as ephemeral. Otherwise, returns
312     * {@code false}.
313     */
314    public abstract boolean isPackageEphemeral(int userId, String packageName);
315
316    /**
317     * Gets whether the package was ever launched.
318     * @param packageName The package name.
319     * @param userId The user for which to check.
320     * @return Whether was launched.
321     * @throws IllegalArgumentException if the package is not found
322     */
323    public abstract boolean wasPackageEverLaunched(String packageName, int userId);
324
325    /**
326     * Grants a runtime permission
327     * @param packageName The package name.
328     * @param name The name of the permission.
329     * @param userId The userId for which to grant the permission.
330     * @param overridePolicy If true, grant this permission even if it is fixed by policy.
331     */
332    public abstract void grantRuntimePermission(String packageName, String name, int userId,
333            boolean overridePolicy);
334
335    /**
336     * Revokes a runtime permission
337     * @param packageName The package name.
338     * @param name The name of the permission.
339     * @param userId The userId for which to revoke the permission.
340     * @param overridePolicy If true, revoke this permission even if it is fixed by policy.
341     */
342    public abstract void revokeRuntimePermission(String packageName, String name, int userId,
343            boolean overridePolicy);
344
345    /**
346     * Retrieve the official name associated with a uid. This name is
347     * guaranteed to never change, though it is possible for the underlying
348     * uid to be changed. That is, if you are storing information about
349     * uids in persistent storage, you should use the string returned
350     * by this function instead of the raw uid.
351     *
352     * @param uid The uid for which you would like to retrieve a name.
353     * @return Returns a unique name for the given uid, or null if the
354     * uid is not currently assigned.
355     */
356    public abstract String getNameForUid(int uid);
357
358    /**
359     * Request to perform the second phase of ephemeral resolution.
360     * @param responseObj The response of the first phase of ephemeral resolution
361     * @param origIntent The original intent that triggered ephemeral resolution
362     * @param resolvedType The resolved type of the intent
363     * @param callingPackage The name of the package requesting the ephemeral application
364     * @param verificationBundle Optional bundle to pass to the installer for additional
365     * verification
366     * @param userId The ID of the user that triggered ephemeral resolution
367     */
368    public abstract void requestInstantAppResolutionPhaseTwo(AuxiliaryResolveInfo responseObj,
369            Intent origIntent, String resolvedType, String callingPackage,
370            Bundle verificationBundle, int userId);
371
372    /**
373     * Grants access to the package metadata for an ephemeral application.
374     * <p>
375     * When an ephemeral application explicitly tries to interact with a full
376     * install application [via an activity, service or provider that has been
377     * exposed using the {@code visibleToInstantApp} attribute], the normal
378     * application must be able to see metadata about the connecting ephemeral
379     * app. If the ephemeral application uses an implicit intent [ie action VIEW,
380     * category BROWSABLE], it remains hidden from the launched activity.
381     * <p>
382     * If the {@code sourceUid} is not for an ephemeral app or {@code targetUid}
383     * is not for a fully installed app, this method will be a no-op.
384     *
385     * @param userId the user
386     * @param intent the intent that triggered the grant
387     * @param targetAppId The app ID of the fully installed application
388     * @param ephemeralAppId The app ID of the ephemeral application
389     */
390    public abstract void grantEphemeralAccess(int userId, Intent intent,
391            int targetAppId, int ephemeralAppId);
392
393    public abstract boolean isInstantAppInstallerComponent(ComponentName component);
394    /**
395     * Prunes instant apps and state associated with uninstalled
396     * instant apps according to the current platform policy.
397     */
398    public abstract void pruneInstantApps();
399
400    /**
401     * @return The SetupWizard package name.
402     */
403    public abstract String getSetupWizardPackageName();
404
405    public interface ExternalSourcesPolicy {
406
407        int USER_TRUSTED = 0;   // User has trusted the package to install apps
408        int USER_BLOCKED = 1;   // User has blocked the package to install apps
409        int USER_DEFAULT = 2;   // Default code to use when user response is unavailable
410
411        /**
412         * Checks the user preference for whether a package is trusted to request installs through
413         * package installer
414         *
415         * @param packageName The package to check for
416         * @param uid the uid in which the package is running
417         * @return {@link USER_TRUSTED} if the user has trusted the package, {@link USER_BLOCKED}
418         * if user has blocked requests from the package, {@link USER_DEFAULT} if the user response
419         * is not yet available
420         */
421        int getPackageTrustedToInstallApps(String packageName, int uid);
422    }
423
424    public abstract void setExternalSourcesPolicy(ExternalSourcesPolicy policy);
425
426    /**
427     * Return true if the given package is a persistent app process.
428     */
429    public abstract boolean isPackagePersistent(String packageName);
430
431    /**
432     * Returns whether or not the given package represents a legacy system application released
433     * prior to runtime permissions.
434     */
435    public abstract boolean isLegacySystemApp(PackageParser.Package pkg);
436
437    /**
438     * Get all overlay packages for a user.
439     * @param userId The user for which to get the overlays.
440     * @return A list of overlay packages. An empty list is returned if the
441     *         user has no installed overlay packages.
442     */
443    public abstract List<PackageInfo> getOverlayPackages(int userId);
444
445    /**
446     * Get the names of all target packages for a user.
447     * @param userId The user for which to get the package names.
448     * @return A list of target package names. This list includes the "android" package.
449     */
450    public abstract List<String> getTargetPackageNames(int userId);
451
452    /**
453     * Set which overlay to use for a package.
454     * @param userId The user for which to update the overlays.
455     * @param targetPackageName The package name of the package for which to update the overlays.
456     * @param overlayPackageNames The complete list of overlay packages that should be enabled for
457     *                            the target. Previously enabled overlays not specified in the list
458     *                            will be disabled. Pass in null or an empty list to disable
459     *                            all overlays. The order of the items is significant if several
460     *                            overlays modify the same resource.
461     * @return true if all packages names were known by the package manager, false otherwise
462     */
463    public abstract boolean setEnabledOverlayPackages(int userId, String targetPackageName,
464            List<String> overlayPackageNames);
465
466    /**
467     * Resolves an activity intent, allowing instant apps to be resolved.
468     */
469    public abstract ResolveInfo resolveIntent(Intent intent, String resolvedType,
470            int flags, int userId, boolean resolveForStart, int filterCallingUid);
471
472    /**
473    * Resolves a service intent, allowing instant apps to be resolved.
474    */
475    public abstract ResolveInfo resolveService(Intent intent, String resolvedType,
476           int flags, int userId, int callingUid);
477
478   /**
479    * Resolves a content provider intent.
480    */
481    public abstract ProviderInfo resolveContentProvider(String name, int flags, int userId);
482
483    /**
484     * Track the creator of a new isolated uid.
485     * @param isolatedUid The newly created isolated uid.
486     * @param ownerUid The uid of the app that created the isolated process.
487     */
488    public abstract void addIsolatedUid(int isolatedUid, int ownerUid);
489
490    /**
491     * Track removal of an isolated uid.
492     * @param isolatedUid isolated uid that is no longer being used.
493     */
494    public abstract void removeIsolatedUid(int isolatedUid);
495
496    /**
497     * Return the taget SDK version for the app with the given UID.
498     */
499    public abstract int getUidTargetSdkVersion(int uid);
500
501    /**
502     * Return the taget SDK version for the app with the given package name.
503     */
504    public abstract int getPackageTargetSdkVersion(String packageName);
505
506    /** Whether the binder caller can access instant apps. */
507    public abstract boolean canAccessInstantApps(int callingUid, int userId);
508
509    /** Whether the binder caller can access the given component. */
510    public abstract boolean canAccessComponent(int callingUid, ComponentName component, int userId);
511
512    /**
513     * Returns {@code true} if a given package has instant application meta-data.
514     * Otherwise, returns {@code false}. Meta-data is state (eg. cookie, app icon, etc)
515     * associated with an instant app. It may be kept after the instant app has been uninstalled.
516     */
517    public abstract boolean hasInstantApplicationMetadata(String packageName, int userId);
518
519    /**
520     * Updates a package last used time.
521     */
522    public abstract void notifyPackageUse(String packageName, int reason);
523
524    /**
525     * Returns a package object for the given package name.
526     */
527    public abstract @Nullable PackageParser.Package getPackage(@NonNull String packageName);
528
529    /**
530     * Returns a list without a change observer.
531     *
532     * {@see #getPackageList(PackageListObserver)}
533     */
534    public @NonNull PackageList getPackageList() {
535        return getPackageList(null);
536    }
537
538    /**
539     * Returns the list of packages installed at the time of the method call.
540     * <p>The given observer is notified when the list of installed packages
541     * changes [eg. a package was installed or uninstalled]. It will not be
542     * notified if a package is updated.
543     * <p>The package list will not be updated automatically as packages are
544     * installed / uninstalled. Any changes must be handled within the observer.
545     */
546    public abstract @NonNull PackageList getPackageList(@Nullable PackageListObserver observer);
547
548    /**
549     * Removes the observer.
550     * <p>Generally not needed. {@link #getPackageList(PackageListObserver)} will automatically
551     * remove the observer.
552     * <p>Does nothing if the observer isn't currently registered.
553     * <p>Observers are notified asynchronously and it's possible for an observer to be
554     * invoked after its been removed.
555     */
556    public abstract void removePackageListObserver(@NonNull PackageListObserver observer);
557
558    /**
559     * Returns a package object for the disabled system package name.
560     */
561    public abstract @Nullable PackageParser.Package getDisabledPackage(@NonNull String packageName);
562
563    /**
564     * Returns whether or not the component is the resolver activity.
565     */
566    public abstract boolean isResolveActivityComponent(@NonNull ComponentInfo component);
567
568    /**
569     * Returns the package name for a known package.
570     */
571    public abstract @Nullable String getKnownPackageName(
572            @KnownPackage int knownPackage, int userId);
573
574    /**
575     * Returns whether the package is an instant app.
576     */
577    public abstract boolean isInstantApp(String packageName, int userId);
578
579    /**
580     * Returns whether the package is an instant app.
581     */
582    public abstract @Nullable String getInstantAppPackageName(int uid);
583
584    /**
585     * Returns whether or not access to the application should be filtered.
586     * <p>
587     * Access may be limited based upon whether the calling or target applications
588     * are instant applications.
589     *
590     * @see #canAccessInstantApps(int)
591     */
592    public abstract boolean filterAppAccess(
593            @Nullable PackageParser.Package pkg, int callingUid, int userId);
594
595    /*
596     * NOTE: The following methods are temporary until permissions are extracted from
597     * the package manager into a component specifically for handling permissions.
598     */
599    /** Returns the flags for the given permission. */
600    public abstract @Nullable int getPermissionFlagsTEMP(@NonNull String permName,
601            @NonNull String packageName, int userId);
602    /** Updates the flags for the given permission. */
603    public abstract void updatePermissionFlagsTEMP(@NonNull String permName,
604            @NonNull String packageName, int flagMask, int flagValues, int userId);
605
606    /**
607     * Returns true if it's still safe to restore data backed up from this app's version
608     * that was signed with restoringFromSigHash.
609     */
610    public abstract boolean isDataRestoreSafe(@NonNull byte[] restoringFromSigHash,
611            @NonNull String packageName);
612
613    /**
614     * Returns true if it's still safe to restore data backed up from this app's version
615     * that was signed with restoringFromSig.
616     */
617    public abstract boolean isDataRestoreSafe(@NonNull Signature restoringFromSig,
618            @NonNull String packageName);
619
620
621    /**
622     * Returns true if the the signing information for {@code clientUid} is sufficient to gain
623     * access gated by {@code capability}.  This can happen if the two UIDs have the same signing
624     * information, if the signing information {@code clientUid} indicates that it has the signing
625     * certificate for {@code serverUid} in its signing history (if it was previously signed by it),
626     * or if the signing certificate for {@code clientUid} is in ths signing history for {@code
627     * serverUid} and with the {@code capability} specified.
628     */
629    public abstract boolean hasSignatureCapability(int serverUid, int clientUid,
630            @PackageParser.SigningDetails.CertCapabilities int capability);
631}
632