Search in sources :

Example 1 with JournaledFile

use of com.android.internal.util.JournaledFile in project android_frameworks_base by ParanoidAndroid.

the class WallpaperManagerService method saveSettingsLocked.

private void saveSettingsLocked(WallpaperData wallpaper) {
    JournaledFile journal = makeJournaledFile(wallpaper.userId);
    FileOutputStream stream = null;
    try {
        stream = new FileOutputStream(journal.chooseForWrite(), false);
        XmlSerializer out = new FastXmlSerializer();
        out.setOutput(stream, "utf-8");
        out.startDocument(null, true);
        out.startTag(null, "wp");
        out.attribute(null, "width", Integer.toString(wallpaper.width));
        out.attribute(null, "height", Integer.toString(wallpaper.height));
        out.attribute(null, "name", wallpaper.name);
        if (wallpaper.wallpaperComponent != null && !wallpaper.wallpaperComponent.equals(IMAGE_WALLPAPER)) {
            out.attribute(null, "component", wallpaper.wallpaperComponent.flattenToShortString());
        }
        out.endTag(null, "wp");
        out.endDocument();
        stream.close();
        journal.commit();
    } catch (IOException e) {
        try {
            if (stream != null) {
                stream.close();
            }
        } catch (IOException ex) {
        // Ignore
        }
        journal.rollback();
    }
}
Also used : FastXmlSerializer(com.android.internal.util.FastXmlSerializer) JournaledFile(com.android.internal.util.JournaledFile) FileOutputStream(java.io.FileOutputStream) IOException(java.io.IOException) XmlSerializer(org.xmlpull.v1.XmlSerializer) FastXmlSerializer(com.android.internal.util.FastXmlSerializer)

Example 2 with JournaledFile

use of com.android.internal.util.JournaledFile in project platform_frameworks_base by android.

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) InstallerException(com.android.server.pm.Installer.InstallerException) FileNotFoundException(java.io.FileNotFoundException) XmlPullParserException(org.xmlpull.v1.XmlPullParserException) 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 3 with JournaledFile

use of com.android.internal.util.JournaledFile in project platform_frameworks_base by android.

the class DevicePolicyManagerService method loadSettingsLocked.

private void loadSettingsLocked(DevicePolicyData policy, int userHandle) {
    JournaledFile journal = makeJournaledFile(userHandle);
    FileInputStream stream = null;
    File file = journal.chooseForRead();
    try {
        stream = new FileInputStream(file);
        XmlPullParser parser = Xml.newPullParser();
        parser.setInput(stream, StandardCharsets.UTF_8.name());
        int type;
        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT && type != XmlPullParser.START_TAG) {
        }
        String tag = parser.getName();
        if (!"policies".equals(tag)) {
            throw new XmlPullParserException("Settings do not start with policies tag: found " + tag);
        }
        // Extract the permission provider component name if available
        String permissionProvider = parser.getAttributeValue(null, ATTR_PERMISSION_PROVIDER);
        if (permissionProvider != null) {
            policy.mRestrictionsProvider = ComponentName.unflattenFromString(permissionProvider);
        }
        String userSetupComplete = parser.getAttributeValue(null, ATTR_SETUP_COMPLETE);
        if (userSetupComplete != null && Boolean.toString(true).equals(userSetupComplete)) {
            policy.mUserSetupComplete = true;
        }
        String paired = parser.getAttributeValue(null, ATTR_DEVICE_PAIRED);
        if (paired != null && Boolean.toString(true).equals(paired)) {
            policy.mPaired = true;
        }
        String deviceProvisioningConfigApplied = parser.getAttributeValue(null, ATTR_DEVICE_PROVISIONING_CONFIG_APPLIED);
        if (deviceProvisioningConfigApplied != null && Boolean.toString(true).equals(deviceProvisioningConfigApplied)) {
            policy.mDeviceProvisioningConfigApplied = true;
        }
        String provisioningState = parser.getAttributeValue(null, ATTR_PROVISIONING_STATE);
        if (!TextUtils.isEmpty(provisioningState)) {
            policy.mUserProvisioningState = Integer.parseInt(provisioningState);
        }
        String permissionPolicy = parser.getAttributeValue(null, ATTR_PERMISSION_POLICY);
        if (!TextUtils.isEmpty(permissionPolicy)) {
            policy.mPermissionPolicy = Integer.parseInt(permissionPolicy);
        }
        policy.mDelegatedCertInstallerPackage = parser.getAttributeValue(null, ATTR_DELEGATED_CERT_INSTALLER);
        policy.mApplicationRestrictionsManagingPackage = parser.getAttributeValue(null, ATTR_APPLICATION_RESTRICTIONS_MANAGER);
        type = parser.next();
        int outerDepth = parser.getDepth();
        policy.mLockTaskPackages.clear();
        policy.mAdminList.clear();
        policy.mAdminMap.clear();
        policy.mAffiliationIds.clear();
        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
                continue;
            }
            tag = parser.getName();
            if ("admin".equals(tag)) {
                String name = parser.getAttributeValue(null, "name");
                try {
                    DeviceAdminInfo dai = findAdmin(ComponentName.unflattenFromString(name), userHandle, /* throwForMissionPermission= */
                    false);
                    if (VERBOSE_LOG && (UserHandle.getUserId(dai.getActivityInfo().applicationInfo.uid) != userHandle)) {
                        Slog.w(LOG_TAG, "findAdmin returned an incorrect uid " + dai.getActivityInfo().applicationInfo.uid + " for user " + userHandle);
                    }
                    if (dai != null) {
                        ActiveAdmin ap = new ActiveAdmin(dai, /* parent */
                        false);
                        ap.readFromXml(parser);
                        policy.mAdminMap.put(ap.info.getComponent(), ap);
                    }
                } catch (RuntimeException e) {
                    Slog.w(LOG_TAG, "Failed loading admin " + name, e);
                }
            } else if ("failed-password-attempts".equals(tag)) {
                policy.mFailedPasswordAttempts = Integer.parseInt(parser.getAttributeValue(null, "value"));
            } else if ("password-owner".equals(tag)) {
                policy.mPasswordOwner = Integer.parseInt(parser.getAttributeValue(null, "value"));
            } else if ("active-password".equals(tag)) {
                policy.mActivePasswordQuality = Integer.parseInt(parser.getAttributeValue(null, "quality"));
                policy.mActivePasswordLength = Integer.parseInt(parser.getAttributeValue(null, "length"));
                policy.mActivePasswordUpperCase = Integer.parseInt(parser.getAttributeValue(null, "uppercase"));
                policy.mActivePasswordLowerCase = Integer.parseInt(parser.getAttributeValue(null, "lowercase"));
                policy.mActivePasswordLetters = Integer.parseInt(parser.getAttributeValue(null, "letters"));
                policy.mActivePasswordNumeric = Integer.parseInt(parser.getAttributeValue(null, "numeric"));
                policy.mActivePasswordSymbols = Integer.parseInt(parser.getAttributeValue(null, "symbols"));
                policy.mActivePasswordNonLetter = Integer.parseInt(parser.getAttributeValue(null, "nonletter"));
            } else if (TAG_ACCEPTED_CA_CERTIFICATES.equals(tag)) {
                policy.mAcceptedCaCertificates.add(parser.getAttributeValue(null, ATTR_NAME));
            } else if (TAG_LOCK_TASK_COMPONENTS.equals(tag)) {
                policy.mLockTaskPackages.add(parser.getAttributeValue(null, "name"));
            } else if (TAG_STATUS_BAR.equals(tag)) {
                policy.mStatusBarDisabled = Boolean.parseBoolean(parser.getAttributeValue(null, ATTR_DISABLED));
            } else if (DO_NOT_ASK_CREDENTIALS_ON_BOOT_XML.equals(tag)) {
                policy.doNotAskCredentialsOnBoot = true;
            } else if (TAG_AFFILIATION_ID.equals(tag)) {
                policy.mAffiliationIds.add(parser.getAttributeValue(null, "id"));
            } else if (TAG_ADMIN_BROADCAST_PENDING.equals(tag)) {
                String pending = parser.getAttributeValue(null, ATTR_VALUE);
                policy.mAdminBroadcastPending = Boolean.toString(true).equals(pending);
            } else if (TAG_INITIALIZATION_BUNDLE.equals(tag)) {
                policy.mInitBundle = PersistableBundle.restoreFromXml(parser);
            } else {
                Slog.w(LOG_TAG, "Unknown tag: " + tag);
                XmlUtils.skipCurrentTag(parser);
            }
        }
    } catch (FileNotFoundException e) {
    // Don't be noisy, this is normal if we haven't defined any policies.
    } catch (NullPointerException | NumberFormatException | XmlPullParserException | IOException | IndexOutOfBoundsException e) {
        Slog.w(LOG_TAG, "failed parsing " + file, e);
    }
    try {
        if (stream != null) {
            stream.close();
        }
    } catch (IOException e) {
    // Ignore
    }
    // Generate a list of admins from the admin map
    policy.mAdminList.addAll(policy.mAdminMap.values());
    // Validate that what we stored for the password quality matches
    // sufficiently what is currently set.  Note that this is only
    // a sanity check in case the two get out of sync; this should
    // never normally happen.
    final long identity = mInjector.binderClearCallingIdentity();
    try {
        int actualPasswordQuality = mLockPatternUtils.getActivePasswordQuality(userHandle);
        if (actualPasswordQuality < policy.mActivePasswordQuality) {
            Slog.w(LOG_TAG, "Active password quality 0x" + Integer.toHexString(policy.mActivePasswordQuality) + " does not match actual quality 0x" + Integer.toHexString(actualPasswordQuality));
            policy.mActivePasswordQuality = DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
            policy.mActivePasswordLength = 0;
            policy.mActivePasswordUpperCase = 0;
            policy.mActivePasswordLowerCase = 0;
            policy.mActivePasswordLetters = 0;
            policy.mActivePasswordNumeric = 0;
            policy.mActivePasswordSymbols = 0;
            policy.mActivePasswordNonLetter = 0;
        }
    } finally {
        mInjector.binderRestoreCallingIdentity(identity);
    }
    validatePasswordOwnerLocked(policy);
    updateMaximumTimeToLockLocked(userHandle);
    updateLockTaskPackagesLocked(policy.mLockTaskPackages, userHandle);
    if (policy.mStatusBarDisabled) {
        setStatusBarDisabledInternal(policy.mStatusBarDisabled, userHandle);
    }
}
Also used : JournaledFile(com.android.internal.util.JournaledFile) XmlPullParser(org.xmlpull.v1.XmlPullParser) FileNotFoundException(java.io.FileNotFoundException) ParcelableString(com.android.internal.util.ParcelableString) IOException(java.io.IOException) FileInputStream(java.io.FileInputStream) DeviceAdminInfo(android.app.admin.DeviceAdminInfo) XmlPullParserException(org.xmlpull.v1.XmlPullParserException) File(java.io.File) JournaledFile(com.android.internal.util.JournaledFile)

Example 4 with JournaledFile

use of com.android.internal.util.JournaledFile in project platform_frameworks_base by android.

the class WallpaperManagerService method saveSettingsLocked.

private void saveSettingsLocked(int userId) {
    JournaledFile journal = makeJournaledFile(userId);
    FileOutputStream fstream = null;
    BufferedOutputStream stream = null;
    try {
        XmlSerializer out = new FastXmlSerializer();
        fstream = new FileOutputStream(journal.chooseForWrite(), false);
        stream = new BufferedOutputStream(fstream);
        out.setOutput(stream, StandardCharsets.UTF_8.name());
        out.startDocument(null, true);
        WallpaperData wallpaper;
        wallpaper = mWallpaperMap.get(userId);
        if (wallpaper != null) {
            writeWallpaperAttributes(out, "wp", wallpaper);
        }
        wallpaper = mLockWallpaperMap.get(userId);
        if (wallpaper != null) {
            writeWallpaperAttributes(out, "kwp", wallpaper);
        }
        out.endDocument();
        // also flushes fstream
        stream.flush();
        FileUtils.sync(fstream);
        // also closes fstream
        stream.close();
        journal.commit();
    } catch (IOException e) {
        IoUtils.closeQuietly(stream);
        journal.rollback();
    }
}
Also used : FastXmlSerializer(com.android.internal.util.FastXmlSerializer) JournaledFile(com.android.internal.util.JournaledFile) FileOutputStream(java.io.FileOutputStream) IOException(java.io.IOException) BufferedOutputStream(java.io.BufferedOutputStream) XmlSerializer(org.xmlpull.v1.XmlSerializer) FastXmlSerializer(com.android.internal.util.FastXmlSerializer)

Example 5 with JournaledFile

use of com.android.internal.util.JournaledFile in project android_frameworks_base by DirtyUnicorns.

the class DevicePolicyManagerService method saveSettingsLocked.

private void saveSettingsLocked(int userHandle) {
    DevicePolicyData policy = getUserData(userHandle);
    JournaledFile journal = makeJournaledFile(userHandle);
    FileOutputStream stream = null;
    try {
        stream = new FileOutputStream(journal.chooseForWrite(), false);
        XmlSerializer out = new FastXmlSerializer();
        out.setOutput(stream, StandardCharsets.UTF_8.name());
        out.startDocument(null, true);
        out.startTag(null, "policies");
        if (policy.mRestrictionsProvider != null) {
            out.attribute(null, ATTR_PERMISSION_PROVIDER, policy.mRestrictionsProvider.flattenToString());
        }
        if (policy.mUserSetupComplete) {
            out.attribute(null, ATTR_SETUP_COMPLETE, Boolean.toString(true));
        }
        if (policy.mPaired) {
            out.attribute(null, ATTR_DEVICE_PAIRED, Boolean.toString(true));
        }
        if (policy.mDeviceProvisioningConfigApplied) {
            out.attribute(null, ATTR_DEVICE_PROVISIONING_CONFIG_APPLIED, Boolean.toString(true));
        }
        if (policy.mUserProvisioningState != DevicePolicyManager.STATE_USER_UNMANAGED) {
            out.attribute(null, ATTR_PROVISIONING_STATE, Integer.toString(policy.mUserProvisioningState));
        }
        if (policy.mPermissionPolicy != DevicePolicyManager.PERMISSION_POLICY_PROMPT) {
            out.attribute(null, ATTR_PERMISSION_POLICY, Integer.toString(policy.mPermissionPolicy));
        }
        if (policy.mDelegatedCertInstallerPackage != null) {
            out.attribute(null, ATTR_DELEGATED_CERT_INSTALLER, policy.mDelegatedCertInstallerPackage);
        }
        if (policy.mApplicationRestrictionsManagingPackage != null) {
            out.attribute(null, ATTR_APPLICATION_RESTRICTIONS_MANAGER, policy.mApplicationRestrictionsManagingPackage);
        }
        final int N = policy.mAdminList.size();
        for (int i = 0; i < N; i++) {
            ActiveAdmin ap = policy.mAdminList.get(i);
            if (ap != null) {
                out.startTag(null, "admin");
                out.attribute(null, "name", ap.info.getComponent().flattenToString());
                ap.writeToXml(out);
                out.endTag(null, "admin");
            }
        }
        if (policy.mPasswordOwner >= 0) {
            out.startTag(null, "password-owner");
            out.attribute(null, "value", Integer.toString(policy.mPasswordOwner));
            out.endTag(null, "password-owner");
        }
        if (policy.mFailedPasswordAttempts != 0) {
            out.startTag(null, "failed-password-attempts");
            out.attribute(null, "value", Integer.toString(policy.mFailedPasswordAttempts));
            out.endTag(null, "failed-password-attempts");
        }
        // Don't save metrics for FBE devices
        if (!mInjector.storageManagerIsFileBasedEncryptionEnabled() && (policy.mActivePasswordQuality != 0 || policy.mActivePasswordLength != 0 || policy.mActivePasswordUpperCase != 0 || policy.mActivePasswordLowerCase != 0 || policy.mActivePasswordLetters != 0 || policy.mActivePasswordNumeric != 0 || policy.mActivePasswordSymbols != 0 || policy.mActivePasswordNonLetter != 0)) {
            out.startTag(null, "active-password");
            out.attribute(null, "quality", Integer.toString(policy.mActivePasswordQuality));
            out.attribute(null, "length", Integer.toString(policy.mActivePasswordLength));
            out.attribute(null, "uppercase", Integer.toString(policy.mActivePasswordUpperCase));
            out.attribute(null, "lowercase", Integer.toString(policy.mActivePasswordLowerCase));
            out.attribute(null, "letters", Integer.toString(policy.mActivePasswordLetters));
            out.attribute(null, "numeric", Integer.toString(policy.mActivePasswordNumeric));
            out.attribute(null, "symbols", Integer.toString(policy.mActivePasswordSymbols));
            out.attribute(null, "nonletter", Integer.toString(policy.mActivePasswordNonLetter));
            out.endTag(null, "active-password");
        }
        for (int i = 0; i < policy.mAcceptedCaCertificates.size(); i++) {
            out.startTag(null, TAG_ACCEPTED_CA_CERTIFICATES);
            out.attribute(null, ATTR_NAME, policy.mAcceptedCaCertificates.valueAt(i));
            out.endTag(null, TAG_ACCEPTED_CA_CERTIFICATES);
        }
        for (int i = 0; i < policy.mLockTaskPackages.size(); i++) {
            String component = policy.mLockTaskPackages.get(i);
            out.startTag(null, TAG_LOCK_TASK_COMPONENTS);
            out.attribute(null, "name", component);
            out.endTag(null, TAG_LOCK_TASK_COMPONENTS);
        }
        if (policy.mStatusBarDisabled) {
            out.startTag(null, TAG_STATUS_BAR);
            out.attribute(null, ATTR_DISABLED, Boolean.toString(policy.mStatusBarDisabled));
            out.endTag(null, TAG_STATUS_BAR);
        }
        if (policy.doNotAskCredentialsOnBoot) {
            out.startTag(null, DO_NOT_ASK_CREDENTIALS_ON_BOOT_XML);
            out.endTag(null, DO_NOT_ASK_CREDENTIALS_ON_BOOT_XML);
        }
        for (String id : policy.mAffiliationIds) {
            out.startTag(null, TAG_AFFILIATION_ID);
            out.attribute(null, "id", id);
            out.endTag(null, TAG_AFFILIATION_ID);
        }
        if (policy.mAdminBroadcastPending) {
            out.startTag(null, TAG_ADMIN_BROADCAST_PENDING);
            out.attribute(null, ATTR_VALUE, Boolean.toString(policy.mAdminBroadcastPending));
            out.endTag(null, TAG_ADMIN_BROADCAST_PENDING);
        }
        if (policy.mInitBundle != null) {
            out.startTag(null, TAG_INITIALIZATION_BUNDLE);
            policy.mInitBundle.saveToXml(out);
            out.endTag(null, TAG_INITIALIZATION_BUNDLE);
        }
        out.endTag(null, "policies");
        out.endDocument();
        stream.flush();
        FileUtils.sync(stream);
        stream.close();
        journal.commit();
        sendChangedNotification(userHandle);
    } catch (XmlPullParserException | IOException e) {
        Slog.w(LOG_TAG, "failed writing file", e);
        try {
            if (stream != null) {
                stream.close();
            }
        } catch (IOException ex) {
        // Ignore
        }
        journal.rollback();
    }
}
Also used : FastXmlSerializer(com.android.internal.util.FastXmlSerializer) JournaledFile(com.android.internal.util.JournaledFile) FileOutputStream(java.io.FileOutputStream) XmlPullParserException(org.xmlpull.v1.XmlPullParserException) ParcelableString(com.android.internal.util.ParcelableString) IOException(java.io.IOException) XmlSerializer(org.xmlpull.v1.XmlSerializer) FastXmlSerializer(com.android.internal.util.FastXmlSerializer)

Aggregations

JournaledFile (com.android.internal.util.JournaledFile)23 IOException (java.io.IOException)23 XmlPullParserException (org.xmlpull.v1.XmlPullParserException)17 File (java.io.File)14 FileOutputStream (java.io.FileOutputStream)14 FileNotFoundException (java.io.FileNotFoundException)13 FastXmlSerializer (com.android.internal.util.FastXmlSerializer)10 XmlSerializer (org.xmlpull.v1.XmlSerializer)10 FileInputStream (java.io.FileInputStream)9 XmlPullParser (org.xmlpull.v1.XmlPullParser)9 ParcelableString (com.android.internal.util.ParcelableString)6 ApplicationInfo (android.content.pm.ApplicationInfo)5 AtomicFile (android.util.AtomicFile)5 BufferedOutputStream (java.io.BufferedOutputStream)5 DeviceAdminInfo (android.app.admin.DeviceAdminInfo)4 UserInfo (android.content.pm.UserInfo)4 Point (android.graphics.Point)4 BufferedWriter (java.io.BufferedWriter)4 OutputStreamWriter (java.io.OutputStreamWriter)4 InstallerException (com.android.internal.os.InstallerConnection.InstallerException)3