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

Commit 483a6bbf authored by Dianne Hackborn's avatar Dianne Hackborn
Browse files

Add version identifier to app ops.

All old versions drop their modes except for the notification op
(which is the only one there is currently a user-visible control for).

Change-Id: I9e09cebe63e9ea81f2adc01aef7d1a5a59f57a56
parent 38d4cfd4
Loading
Loading
Loading
Loading
+16 −5
Original line number Original line Diff line number Diff line
@@ -63,6 +63,8 @@ public class AppOpsService extends IAppOpsService.Stub {
    // Write at most every 30 minutes.
    // Write at most every 30 minutes.
    static final long WRITE_DELAY = DEBUG ? 1000 : 30*60*1000;
    static final long WRITE_DELAY = DEBUG ? 1000 : 30*60*1000;


    static final int CURRENT_VERSION = 1;

    Context mContext;
    Context mContext;
    final AtomicFile mFile;
    final AtomicFile mFile;
    final Handler mHandler;
    final Handler mHandler;
@@ -631,6 +633,9 @@ public class AppOpsService extends IAppOpsService.Stub {
                        throw new IllegalStateException("no start tag found");
                        throw new IllegalStateException("no start tag found");
                    }
                    }


                    String versStr = parser.getAttributeValue(null, "vers");
                    int vers = versStr != null ? Integer.parseInt(versStr) : 0;

                    int outerDepth = parser.getDepth();
                    int outerDepth = parser.getDepth();
                    while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
                    while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
                            && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
                            && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
@@ -640,7 +645,7 @@ public class AppOpsService extends IAppOpsService.Stub {


                        String tagName = parser.getName();
                        String tagName = parser.getName();
                        if (tagName.equals("pkg")) {
                        if (tagName.equals("pkg")) {
                            readPackage(parser);
                            readPackage(parser, vers);
                        } else {
                        } else {
                            Slog.w(TAG, "Unknown element under <app-ops>: "
                            Slog.w(TAG, "Unknown element under <app-ops>: "
                                    + parser.getName());
                                    + parser.getName());
@@ -673,7 +678,7 @@ public class AppOpsService extends IAppOpsService.Stub {
        }
        }
    }
    }


    void readPackage(XmlPullParser parser) throws NumberFormatException,
    void readPackage(XmlPullParser parser, int vers) throws NumberFormatException,
            XmlPullParserException, IOException {
            XmlPullParserException, IOException {
        String pkgName = parser.getAttributeValue(null, "n");
        String pkgName = parser.getAttributeValue(null, "n");
        int outerDepth = parser.getDepth();
        int outerDepth = parser.getDepth();
@@ -686,7 +691,7 @@ public class AppOpsService extends IAppOpsService.Stub {


            String tagName = parser.getName();
            String tagName = parser.getName();
            if (tagName.equals("uid")) {
            if (tagName.equals("uid")) {
                readUid(parser, pkgName);
                readUid(parser, vers, pkgName);
            } else {
            } else {
                Slog.w(TAG, "Unknown element under <pkg>: "
                Slog.w(TAG, "Unknown element under <pkg>: "
                        + parser.getName());
                        + parser.getName());
@@ -695,7 +700,7 @@ public class AppOpsService extends IAppOpsService.Stub {
        }
        }
    }
    }


    void readUid(XmlPullParser parser, String pkgName) throws NumberFormatException,
    void readUid(XmlPullParser parser, int vers, String pkgName) throws NumberFormatException,
            XmlPullParserException, IOException {
            XmlPullParserException, IOException {
        int uid = Integer.parseInt(parser.getAttributeValue(null, "n"));
        int uid = Integer.parseInt(parser.getAttributeValue(null, "n"));
        int outerDepth = parser.getDepth();
        int outerDepth = parser.getDepth();
@@ -711,8 +716,13 @@ public class AppOpsService extends IAppOpsService.Stub {
                Op op = new Op(Integer.parseInt(parser.getAttributeValue(null, "n")));
                Op op = new Op(Integer.parseInt(parser.getAttributeValue(null, "n")));
                String mode = parser.getAttributeValue(null, "m");
                String mode = parser.getAttributeValue(null, "m");
                if (mode != null) {
                if (mode != null) {
                    if (vers < CURRENT_VERSION && op.op != AppOpsManager.OP_POST_NOTIFICATION) {
                        Slog.w(TAG, "AppOps vers " + vers + ": drop mode from "
                                + pkgName + "/" + uid + " op " + op.op);
                    } else {
                        op.mode = Integer.parseInt(mode);
                        op.mode = Integer.parseInt(mode);
                    }
                    }
                }
                String time = parser.getAttributeValue(null, "t");
                String time = parser.getAttributeValue(null, "t");
                if (time != null) {
                if (time != null) {
                    op.time = Long.parseLong(time);
                    op.time = Long.parseLong(time);
@@ -761,6 +771,7 @@ public class AppOpsService extends IAppOpsService.Stub {
                out.setOutput(stream, "utf-8");
                out.setOutput(stream, "utf-8");
                out.startDocument(null, true);
                out.startDocument(null, true);
                out.startTag(null, "app-ops");
                out.startTag(null, "app-ops");
                out.attribute(null, "vers", Integer.toString(CURRENT_VERSION));


                if (allOps != null) {
                if (allOps != null) {
                    String lastPkg = null;
                    String lastPkg = null;