Search in sources :

Example 66 with ApplicationInfo

use of android.content.pm.ApplicationInfo in project android_frameworks_base by ResurrectionRemix.

the class NetworkPolicyManagerService method addDefaultRestrictBackgroundWhitelistUidsUL.

private boolean addDefaultRestrictBackgroundWhitelistUidsUL(int userId) {
    final SystemConfig sysConfig = SystemConfig.getInstance();
    final PackageManager pm = mContext.getPackageManager();
    final ArraySet<String> allowDataUsage = sysConfig.getAllowInDataUsageSave();
    boolean changed = false;
    for (int i = 0; i < allowDataUsage.size(); i++) {
        final String pkg = allowDataUsage.valueAt(i);
        if (LOGD)
            Slog.d(TAG, "checking restricted background whitelisting for package " + pkg + " and user " + userId);
        final ApplicationInfo app;
        try {
            app = pm.getApplicationInfoAsUser(pkg, PackageManager.MATCH_SYSTEM_ONLY, userId);
        } catch (PackageManager.NameNotFoundException e) {
            if (LOGD)
                Slog.d(TAG, "No ApplicationInfo for package " + pkg);
            // Ignore it - some apps on allow-in-data-usage-save are optional.
            continue;
        }
        if (!app.isPrivilegedApp()) {
            Slog.e(TAG, "addDefaultRestrictBackgroundWhitelistUidsUL(): " + "skipping non-privileged app  " + pkg);
            continue;
        }
        final int uid = UserHandle.getUid(userId, app.uid);
        mDefaultRestrictBackgroundWhitelistUids.append(uid, true);
        if (LOGD)
            Slog.d(TAG, "Adding uid " + uid + " (user " + userId + ") to default restricted " + "background whitelist. Revoked status: " + mRestrictBackgroundWhitelistRevokedUids.get(uid));
        if (!mRestrictBackgroundWhitelistRevokedUids.get(uid)) {
            if (LOGD)
                Slog.d(TAG, "adding default package " + pkg + " (uid " + uid + " for user " + userId + ") to restrict background whitelist");
            mRestrictBackgroundWhitelistUids.append(uid, true);
            changed = true;
        }
    }
    return changed;
}
Also used : SystemConfig(com.android.server.SystemConfig) PackageManager(android.content.pm.PackageManager) IPackageManager(android.content.pm.IPackageManager) NameNotFoundException(android.content.pm.PackageManager.NameNotFoundException) ApplicationInfo(android.content.pm.ApplicationInfo) NetworkPolicyManager.uidRulesToString(android.net.NetworkPolicyManager.uidRulesToString)

Example 67 with ApplicationInfo

use of android.content.pm.ApplicationInfo in project android_frameworks_base by ResurrectionRemix.

the class NetworkStatsService method removeUserLocked.

/**
     * Clean up {@link #mUidRecorder} after user is removed.
     */
private void removeUserLocked(int userId) {
    if (LOGV)
        Slog.v(TAG, "removeUserLocked() for userId=" + userId);
    // Build list of UIDs that we should clean up
    int[] uids = new int[0];
    final List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES | PackageManager.GET_DISABLED_COMPONENTS);
    for (ApplicationInfo app : apps) {
        final int uid = UserHandle.getUid(userId, app.uid);
        uids = ArrayUtils.appendInt(uids, uid);
    }
    removeUidsLocked(uids);
}
Also used : ApplicationInfo(android.content.pm.ApplicationInfo)

Example 68 with ApplicationInfo

use of android.content.pm.ApplicationInfo in project android_frameworks_base by ResurrectionRemix.

the class ManagedServices method registerServiceLocked.

private void registerServiceLocked(final ComponentName name, final int userid, final boolean isSystem) {
    if (DEBUG)
        Slog.v(TAG, "registerService: " + name + " u=" + userid);
    final String servicesBindingTag = name.toString() + "/" + userid;
    if (mServicesBinding.contains(servicesBindingTag)) {
        // stop registering this thing already! we're working on it
        return;
    }
    mServicesBinding.add(servicesBindingTag);
    final int N = mServices.size();
    for (int i = N - 1; i >= 0; i--) {
        final ManagedServiceInfo info = mServices.get(i);
        if (name.equals(info.component) && info.userid == userid) {
            // cut old connections
            if (DEBUG)
                Slog.v(TAG, "    disconnecting old " + getCaption() + ": " + info.service);
            removeServiceLocked(i);
            if (info.connection != null) {
                mContext.unbindService(info.connection);
            }
        }
    }
    Intent intent = new Intent(mConfig.serviceInterface);
    intent.setComponent(name);
    intent.putExtra(Intent.EXTRA_CLIENT_LABEL, mConfig.clientLabel);
    final PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mConfig.settingsAction), 0);
    intent.putExtra(Intent.EXTRA_CLIENT_INTENT, pendingIntent);
    ApplicationInfo appInfo = null;
    try {
        appInfo = mContext.getPackageManager().getApplicationInfo(name.getPackageName(), 0);
    } catch (NameNotFoundException e) {
    // Ignore if the package doesn't exist we won't be able to bind to the service.
    }
    final int targetSdkVersion = appInfo != null ? appInfo.targetSdkVersion : Build.VERSION_CODES.BASE;
    try {
        if (DEBUG)
            Slog.v(TAG, "binding: " + intent);
        ServiceConnection serviceConnection = new ServiceConnection() {

            IInterface mService;

            @Override
            public void onServiceConnected(ComponentName name, IBinder binder) {
                boolean added = false;
                ManagedServiceInfo info = null;
                synchronized (mMutex) {
                    mServicesBinding.remove(servicesBindingTag);
                    try {
                        mService = asInterface(binder);
                        info = newServiceInfo(mService, name, userid, isSystem, this, targetSdkVersion);
                        binder.linkToDeath(info, 0);
                        added = mServices.add(info);
                    } catch (RemoteException e) {
                    // already dead
                    }
                }
                if (added) {
                    onServiceAdded(info);
                }
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {
                Slog.v(TAG, getCaption() + " connection lost: " + name);
            }
        };
        if (!mContext.bindServiceAsUser(intent, serviceConnection, BIND_AUTO_CREATE | BIND_FOREGROUND_SERVICE | BIND_ALLOW_WHITELIST_MANAGEMENT, new UserHandle(userid))) {
            mServicesBinding.remove(servicesBindingTag);
            Slog.w(TAG, "Unable to bind " + getCaption() + " service: " + intent);
            return;
        }
    } catch (SecurityException ex) {
        Slog.e(TAG, "Unable to bind " + getCaption() + " service: " + intent, ex);
        return;
    }
}
Also used : ServiceConnection(android.content.ServiceConnection) NameNotFoundException(android.content.pm.PackageManager.NameNotFoundException) ApplicationInfo(android.content.pm.ApplicationInfo) IInterface(android.os.IInterface) Intent(android.content.Intent) PendingIntent(android.app.PendingIntent) IBinder(android.os.IBinder) UserHandle(android.os.UserHandle) ComponentName(android.content.ComponentName) PendingIntent(android.app.PendingIntent) RemoteException(android.os.RemoteException)

Example 69 with ApplicationInfo

use of android.content.pm.ApplicationInfo in project android_frameworks_base by ResurrectionRemix.

the class Settings method writePackageListLPr.

void writePackageListLPr(int creatingUserId) {
    // Only derive GIDs for active users (not dying)
    final List<UserInfo> users = UserManagerService.getInstance().getUsers(true);
    int[] userIds = new int[users.size()];
    for (int i = 0; i < userIds.length; i++) {
        userIds[i] = users.get(i).id;
    }
    if (creatingUserId != -1) {
        userIds = ArrayUtils.appendInt(userIds, creatingUserId);
    }
    // Write package list file now, use a JournaledFile.
    File tempFile = new File(mPackageListFilename.getAbsolutePath() + ".tmp");
    JournaledFile journal = new JournaledFile(mPackageListFilename, tempFile);
    final File writeTarget = journal.chooseForWrite();
    FileOutputStream fstr;
    BufferedWriter writer = null;
    try {
        fstr = new FileOutputStream(writeTarget);
        writer = new BufferedWriter(new OutputStreamWriter(fstr, Charset.defaultCharset()));
        FileUtils.setPermissions(fstr.getFD(), 0640, SYSTEM_UID, PACKAGE_INFO_GID);
        StringBuilder sb = new StringBuilder();
        for (final PackageSetting pkg : mPackages.values()) {
            if (pkg.pkg == null || pkg.pkg.applicationInfo == null || pkg.pkg.applicationInfo.dataDir == null) {
                if (!"android".equals(pkg.name)) {
                    Slog.w(TAG, "Skipping " + pkg + " due to missing metadata");
                }
                continue;
            }
            final ApplicationInfo ai = pkg.pkg.applicationInfo;
            final String dataPath = ai.dataDir;
            final boolean isDebug = (ai.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
            final int[] gids = pkg.getPermissionsState().computeGids(userIds);
            // Avoid any application that has a space in its path.
            if (dataPath.indexOf(' ') >= 0)
                continue;
            // we store on each line the following information for now:
            //
            // pkgName    - package name
            // userId     - application-specific user id
            // debugFlag  - 0 or 1 if the package is debuggable.
            // dataPath   - path to package's data path
            // seinfo     - seinfo label for the app (assigned at install time)
            // gids       - supplementary gids this app launches with
            //
            // NOTE: We prefer not to expose all ApplicationInfo flags for now.
            //
            // DO NOT MODIFY THIS FORMAT UNLESS YOU CAN ALSO MODIFY ITS USERS
            // FROM NATIVE CODE. AT THE MOMENT, LOOK AT THE FOLLOWING SOURCES:
            //   frameworks/base/libs/packagelistparser
            //   system/core/run-as/run-as.c
            //
            sb.setLength(0);
            sb.append(ai.packageName);
            sb.append(" ");
            sb.append(ai.uid);
            sb.append(isDebug ? " 1 " : " 0 ");
            sb.append(dataPath);
            sb.append(" ");
            sb.append(ai.seinfo);
            sb.append(" ");
            if (gids != null && gids.length > 0) {
                sb.append(gids[0]);
                for (int i = 1; i < gids.length; i++) {
                    sb.append(",");
                    sb.append(gids[i]);
                }
            } else {
                sb.append("none");
            }
            sb.append("\n");
            writer.append(sb);
        }
        writer.flush();
        FileUtils.sync(fstr);
        writer.close();
        journal.commit();
    } catch (Exception e) {
        Slog.wtf(TAG, "Failed to write packages.list", e);
        IoUtils.closeQuietly(writer);
        journal.rollback();
    }
}
Also used : JournaledFile(com.android.internal.util.JournaledFile) ApplicationInfo(android.content.pm.ApplicationInfo) UserInfo(android.content.pm.UserInfo) FileNotFoundException(java.io.FileNotFoundException) XmlPullParserException(org.xmlpull.v1.XmlPullParserException) InstallerException(com.android.internal.os.InstallerConnection.InstallerException) IOException(java.io.IOException) BufferedWriter(java.io.BufferedWriter) FileOutputStream(java.io.FileOutputStream) OutputStreamWriter(java.io.OutputStreamWriter) AtomicFile(android.util.AtomicFile) File(java.io.File) JournaledFile(com.android.internal.util.JournaledFile)

Example 70 with ApplicationInfo

use of android.content.pm.ApplicationInfo in project android_frameworks_base by ResurrectionRemix.

the class PhoneWindowManager method checkAddPermission.

/** {@inheritDoc} */
@Override
public int checkAddPermission(WindowManager.LayoutParams attrs, int[] outAppOp) {
    int type = attrs.type;
    outAppOp[0] = AppOpsManager.OP_NONE;
    if (!((type >= FIRST_APPLICATION_WINDOW && type <= LAST_APPLICATION_WINDOW) || (type >= FIRST_SUB_WINDOW && type <= LAST_SUB_WINDOW) || (type >= FIRST_SYSTEM_WINDOW && type <= LAST_SYSTEM_WINDOW))) {
        return WindowManagerGlobal.ADD_INVALID_TYPE;
    }
    if (type < FIRST_SYSTEM_WINDOW || type > LAST_SYSTEM_WINDOW) {
        // Window manager will make sure these are okay.
        return WindowManagerGlobal.ADD_OKAY;
    }
    String permission = null;
    switch(type) {
        case TYPE_TOAST:
            // XXX right now the app process has complete control over
            // this...  should introduce a token to let the system
            // monitor/control what they are doing.
            outAppOp[0] = AppOpsManager.OP_TOAST_WINDOW;
            break;
        case TYPE_DREAM:
        case TYPE_INPUT_METHOD:
        case TYPE_WALLPAPER:
        case TYPE_PRIVATE_PRESENTATION:
        case TYPE_VOICE_INTERACTION:
        case TYPE_ACCESSIBILITY_OVERLAY:
        case TYPE_QS_DIALOG:
            // The window manager will check these.
            break;
        case TYPE_PHONE:
        case TYPE_PRIORITY_PHONE:
        case TYPE_SYSTEM_ALERT:
        case TYPE_SYSTEM_ERROR:
        case TYPE_SYSTEM_OVERLAY:
            permission = android.Manifest.permission.SYSTEM_ALERT_WINDOW;
            outAppOp[0] = AppOpsManager.OP_SYSTEM_ALERT_WINDOW;
            break;
        case TYPE_KEYGUARD_PANEL:
            permission = org.cyanogenmod.platform.internal.Manifest.permission.THIRD_PARTY_KEYGUARD;
            break;
        default:
            permission = android.Manifest.permission.INTERNAL_SYSTEM_WINDOW;
    }
    if (permission != null) {
        if (android.Manifest.permission.SYSTEM_ALERT_WINDOW.equals(permission)) {
            final int callingUid = Binder.getCallingUid();
            // system processes will be automatically allowed privilege to draw
            if (callingUid == Process.SYSTEM_UID) {
                return WindowManagerGlobal.ADD_OKAY;
            }
            // check if user has enabled this operation. SecurityException will be thrown if
            // this app has not been allowed by the user
            final int mode = mAppOpsManager.checkOpNoThrow(outAppOp[0], callingUid, attrs.packageName);
            switch(mode) {
                case AppOpsManager.MODE_ALLOWED:
                case AppOpsManager.MODE_IGNORED:
                    // actually be hidden in WindowManagerService
                    return WindowManagerGlobal.ADD_OKAY;
                case AppOpsManager.MODE_ERRORED:
                    try {
                        ApplicationInfo appInfo = mContext.getPackageManager().getApplicationInfo(attrs.packageName, UserHandle.getUserId(callingUid));
                        // Don't crash legacy apps
                        if (appInfo.targetSdkVersion < Build.VERSION_CODES.M) {
                            return WindowManagerGlobal.ADD_OKAY;
                        }
                    } catch (PackageManager.NameNotFoundException e) {
                    /* ignore */
                    }
                    return WindowManagerGlobal.ADD_PERMISSION_DENIED;
                default:
                    // checkCallingPermission()
                    if (mContext.checkCallingPermission(permission) != PackageManager.PERMISSION_GRANTED) {
                        return WindowManagerGlobal.ADD_PERMISSION_DENIED;
                    } else {
                        return WindowManagerGlobal.ADD_OKAY;
                    }
            }
        }
        if (mContext.checkCallingOrSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
            return WindowManagerGlobal.ADD_PERMISSION_DENIED;
        }
    }
    return WindowManagerGlobal.ADD_OKAY;
}
Also used : PackageManager(android.content.pm.PackageManager) ApplicationInfo(android.content.pm.ApplicationInfo)

Aggregations

ApplicationInfo (android.content.pm.ApplicationInfo)1914 PackageManager (android.content.pm.PackageManager)682 Test (org.junit.Test)366 NameNotFoundException (android.content.pm.PackageManager.NameNotFoundException)363 ArrayList (java.util.ArrayList)258 Intent (android.content.Intent)231 RemoteException (android.os.RemoteException)229 PackageInfo (android.content.pm.PackageInfo)214 ResolveInfo (android.content.pm.ResolveInfo)177 IOException (java.io.IOException)122 ActivityInfo (android.content.pm.ActivityInfo)114 IPackageManager (android.content.pm.IPackageManager)109 UserHandle (android.os.UserHandle)108 Context (android.content.Context)103 Bundle (android.os.Bundle)103 File (java.io.File)100 Drawable (android.graphics.drawable.Drawable)91 UserInfo (android.content.pm.UserInfo)89 ComponentName (android.content.ComponentName)69 SmallTest (android.support.test.filters.SmallTest)66