Loading core/java/android/app/AppOpsManager.java +12 −2 Original line number Original line Diff line number Diff line Loading @@ -1555,6 +1555,7 @@ public class AppOpsManager { private final long[] mRejectTimes; private final long[] mRejectTimes; private final int mDuration; private final int mDuration; private final int mProxyUid; private final int mProxyUid; private final boolean mRunning; private final String mProxyPackageName; private final String mProxyPackageName; public OpEntry(int op, int mode, long time, long rejectTime, int duration, public OpEntry(int op, int mode, long time, long rejectTime, int duration, Loading @@ -1566,12 +1567,13 @@ public class AppOpsManager { mTimes[0] = time; mTimes[0] = time; mRejectTimes[0] = rejectTime; mRejectTimes[0] = rejectTime; mDuration = duration; mDuration = duration; mRunning = duration == -1; mProxyUid = proxyUid; mProxyUid = proxyUid; mProxyPackageName = proxyPackage; mProxyPackageName = proxyPackage; } } public OpEntry(int op, int mode, long[] times, long[] rejectTimes, int duration, public OpEntry(int op, int mode, long[] times, long[] rejectTimes, int duration, int proxyUid, String proxyPackage) { boolean running, int proxyUid, String proxyPackage) { mOp = op; mOp = op; mMode = mode; mMode = mode; mTimes = new long[_NUM_UID_STATE]; mTimes = new long[_NUM_UID_STATE]; Loading @@ -1579,10 +1581,16 @@ public class AppOpsManager { System.arraycopy(times, 0, mTimes, 0, _NUM_UID_STATE); System.arraycopy(times, 0, mTimes, 0, _NUM_UID_STATE); System.arraycopy(rejectTimes, 0, mRejectTimes, 0, _NUM_UID_STATE); System.arraycopy(rejectTimes, 0, mRejectTimes, 0, _NUM_UID_STATE); mDuration = duration; mDuration = duration; mRunning = running; mProxyUid = proxyUid; mProxyUid = proxyUid; mProxyPackageName = proxyPackage; mProxyPackageName = proxyPackage; } } public OpEntry(int op, int mode, long[] times, long[] rejectTimes, int duration, int proxyUid, String proxyPackage) { this(op, mode, times, rejectTimes, duration, duration == -1, proxyUid, proxyPackage); } public int getOp() { public int getOp() { return mOp; return mOp; } } Loading Loading @@ -1632,7 +1640,7 @@ public class AppOpsManager { } } public boolean isRunning() { public boolean isRunning() { return mDuration == -1; return mRunning; } } public int getDuration() { public int getDuration() { Loading @@ -1659,6 +1667,7 @@ public class AppOpsManager { dest.writeLongArray(mTimes); dest.writeLongArray(mTimes); dest.writeLongArray(mRejectTimes); dest.writeLongArray(mRejectTimes); dest.writeInt(mDuration); dest.writeInt(mDuration); dest.writeBoolean(mRunning); dest.writeInt(mProxyUid); dest.writeInt(mProxyUid); dest.writeString(mProxyPackageName); dest.writeString(mProxyPackageName); } } Loading @@ -1669,6 +1678,7 @@ public class AppOpsManager { mTimes = source.createLongArray(); mTimes = source.createLongArray(); mRejectTimes = source.createLongArray(); mRejectTimes = source.createLongArray(); mDuration = source.readInt(); mDuration = source.readInt(); mRunning = source.readBoolean(); mProxyUid = source.readInt(); mProxyUid = source.readInt(); mProxyPackageName = source.readString(); mProxyPackageName = source.readString(); } } Loading services/core/java/com/android/server/AppOpsService.java +6 −4 Original line number Original line Diff line number Diff line Loading @@ -812,11 +812,12 @@ public class AppOpsService extends IAppOpsService.Stub { resOps = new ArrayList<>(); resOps = new ArrayList<>(); for (int j=0; j<pkgOps.size(); j++) { for (int j=0; j<pkgOps.size(); j++) { Op curOp = pkgOps.valueAt(j); Op curOp = pkgOps.valueAt(j); long duration = curOp.duration == -1 final boolean running = curOp.duration == -1; long duration = running ? (elapsedNow - curOp.startRealtime) ? (elapsedNow - curOp.startRealtime) : curOp.duration; : curOp.duration; resOps.add(new AppOpsManager.OpEntry(curOp.op, curOp.mode, curOp.time, resOps.add(new AppOpsManager.OpEntry(curOp.op, curOp.mode, curOp.time, curOp.rejectTime, (int) duration, curOp.proxyUid, curOp.rejectTime, (int) duration, running, curOp.proxyUid, curOp.proxyPackageName)); curOp.proxyPackageName)); } } } else { } else { Loading @@ -826,11 +827,12 @@ public class AppOpsService extends IAppOpsService.Stub { if (resOps == null) { if (resOps == null) { resOps = new ArrayList<>(); resOps = new ArrayList<>(); } } long duration = curOp.duration == -1 final boolean running = curOp.duration == -1; final long duration = running ? (elapsedNow - curOp.startRealtime) ? (elapsedNow - curOp.startRealtime) : curOp.duration; : curOp.duration; resOps.add(new AppOpsManager.OpEntry(curOp.op, curOp.mode, curOp.time, resOps.add(new AppOpsManager.OpEntry(curOp.op, curOp.mode, curOp.time, curOp.rejectTime, (int) duration, curOp.proxyUid, curOp.rejectTime, (int) duration, running, curOp.proxyUid, curOp.proxyPackageName)); curOp.proxyPackageName)); } } } } Loading services/tests/servicestests/src/com/android/server/appops/AppOpsActiveWatcherTest.java +44 −0 Original line number Original line Diff line number Diff line Loading @@ -18,6 +18,8 @@ package com.android.server.appops; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.reset; Loading @@ -36,6 +38,8 @@ import android.support.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runner.RunWith; import java.util.List; /** /** * Tests app ops version upgrades * Tests app ops version upgrades */ */ Loading Loading @@ -107,6 +111,46 @@ public class AppOpsActiveWatcherTest { verifyNoMoreInteractions(listener); verifyNoMoreInteractions(listener); } } @Test public void testIsRunning() throws Exception { final AppOpsManager appOpsManager = getContext().getSystemService(AppOpsManager.class); // Start the op appOpsManager.startOp(AppOpsManager.OP_CAMERA); assertTrue("Camera should be running", isCameraOn(appOpsManager)); // Finish the op appOpsManager.finishOp(AppOpsManager.OP_CAMERA); assertFalse("Camera should not be running", isCameraOn(appOpsManager)); } private boolean isCameraOn(AppOpsManager appOpsManager) { List<AppOpsManager.PackageOps> packages = appOpsManager.getPackagesForOps(new int[] {AppOpsManager.OP_CAMERA}); // AppOpsManager can return null when there is no requested data. if (packages != null) { final int numPackages = packages.size(); for (int packageInd = 0; packageInd < numPackages; packageInd++) { AppOpsManager.PackageOps packageOp = packages.get(packageInd); List<AppOpsManager.OpEntry> opEntries = packageOp.getOps(); if (opEntries != null) { final int numOps = opEntries.size(); for (int opInd = 0; opInd < numOps; opInd++) { AppOpsManager.OpEntry opEntry = opEntries.get(opInd); if (opEntry.getOp() == AppOpsManager.OP_CAMERA) { if (opEntry.isRunning()) { return true; } } } } } } return false; } private static Context getContext() { private static Context getContext() { return InstrumentationRegistry.getContext(); return InstrumentationRegistry.getContext(); } } Loading Loading
core/java/android/app/AppOpsManager.java +12 −2 Original line number Original line Diff line number Diff line Loading @@ -1555,6 +1555,7 @@ public class AppOpsManager { private final long[] mRejectTimes; private final long[] mRejectTimes; private final int mDuration; private final int mDuration; private final int mProxyUid; private final int mProxyUid; private final boolean mRunning; private final String mProxyPackageName; private final String mProxyPackageName; public OpEntry(int op, int mode, long time, long rejectTime, int duration, public OpEntry(int op, int mode, long time, long rejectTime, int duration, Loading @@ -1566,12 +1567,13 @@ public class AppOpsManager { mTimes[0] = time; mTimes[0] = time; mRejectTimes[0] = rejectTime; mRejectTimes[0] = rejectTime; mDuration = duration; mDuration = duration; mRunning = duration == -1; mProxyUid = proxyUid; mProxyUid = proxyUid; mProxyPackageName = proxyPackage; mProxyPackageName = proxyPackage; } } public OpEntry(int op, int mode, long[] times, long[] rejectTimes, int duration, public OpEntry(int op, int mode, long[] times, long[] rejectTimes, int duration, int proxyUid, String proxyPackage) { boolean running, int proxyUid, String proxyPackage) { mOp = op; mOp = op; mMode = mode; mMode = mode; mTimes = new long[_NUM_UID_STATE]; mTimes = new long[_NUM_UID_STATE]; Loading @@ -1579,10 +1581,16 @@ public class AppOpsManager { System.arraycopy(times, 0, mTimes, 0, _NUM_UID_STATE); System.arraycopy(times, 0, mTimes, 0, _NUM_UID_STATE); System.arraycopy(rejectTimes, 0, mRejectTimes, 0, _NUM_UID_STATE); System.arraycopy(rejectTimes, 0, mRejectTimes, 0, _NUM_UID_STATE); mDuration = duration; mDuration = duration; mRunning = running; mProxyUid = proxyUid; mProxyUid = proxyUid; mProxyPackageName = proxyPackage; mProxyPackageName = proxyPackage; } } public OpEntry(int op, int mode, long[] times, long[] rejectTimes, int duration, int proxyUid, String proxyPackage) { this(op, mode, times, rejectTimes, duration, duration == -1, proxyUid, proxyPackage); } public int getOp() { public int getOp() { return mOp; return mOp; } } Loading Loading @@ -1632,7 +1640,7 @@ public class AppOpsManager { } } public boolean isRunning() { public boolean isRunning() { return mDuration == -1; return mRunning; } } public int getDuration() { public int getDuration() { Loading @@ -1659,6 +1667,7 @@ public class AppOpsManager { dest.writeLongArray(mTimes); dest.writeLongArray(mTimes); dest.writeLongArray(mRejectTimes); dest.writeLongArray(mRejectTimes); dest.writeInt(mDuration); dest.writeInt(mDuration); dest.writeBoolean(mRunning); dest.writeInt(mProxyUid); dest.writeInt(mProxyUid); dest.writeString(mProxyPackageName); dest.writeString(mProxyPackageName); } } Loading @@ -1669,6 +1678,7 @@ public class AppOpsManager { mTimes = source.createLongArray(); mTimes = source.createLongArray(); mRejectTimes = source.createLongArray(); mRejectTimes = source.createLongArray(); mDuration = source.readInt(); mDuration = source.readInt(); mRunning = source.readBoolean(); mProxyUid = source.readInt(); mProxyUid = source.readInt(); mProxyPackageName = source.readString(); mProxyPackageName = source.readString(); } } Loading
services/core/java/com/android/server/AppOpsService.java +6 −4 Original line number Original line Diff line number Diff line Loading @@ -812,11 +812,12 @@ public class AppOpsService extends IAppOpsService.Stub { resOps = new ArrayList<>(); resOps = new ArrayList<>(); for (int j=0; j<pkgOps.size(); j++) { for (int j=0; j<pkgOps.size(); j++) { Op curOp = pkgOps.valueAt(j); Op curOp = pkgOps.valueAt(j); long duration = curOp.duration == -1 final boolean running = curOp.duration == -1; long duration = running ? (elapsedNow - curOp.startRealtime) ? (elapsedNow - curOp.startRealtime) : curOp.duration; : curOp.duration; resOps.add(new AppOpsManager.OpEntry(curOp.op, curOp.mode, curOp.time, resOps.add(new AppOpsManager.OpEntry(curOp.op, curOp.mode, curOp.time, curOp.rejectTime, (int) duration, curOp.proxyUid, curOp.rejectTime, (int) duration, running, curOp.proxyUid, curOp.proxyPackageName)); curOp.proxyPackageName)); } } } else { } else { Loading @@ -826,11 +827,12 @@ public class AppOpsService extends IAppOpsService.Stub { if (resOps == null) { if (resOps == null) { resOps = new ArrayList<>(); resOps = new ArrayList<>(); } } long duration = curOp.duration == -1 final boolean running = curOp.duration == -1; final long duration = running ? (elapsedNow - curOp.startRealtime) ? (elapsedNow - curOp.startRealtime) : curOp.duration; : curOp.duration; resOps.add(new AppOpsManager.OpEntry(curOp.op, curOp.mode, curOp.time, resOps.add(new AppOpsManager.OpEntry(curOp.op, curOp.mode, curOp.time, curOp.rejectTime, (int) duration, curOp.proxyUid, curOp.rejectTime, (int) duration, running, curOp.proxyUid, curOp.proxyPackageName)); curOp.proxyPackageName)); } } } } Loading
services/tests/servicestests/src/com/android/server/appops/AppOpsActiveWatcherTest.java +44 −0 Original line number Original line Diff line number Diff line Loading @@ -18,6 +18,8 @@ package com.android.server.appops; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.reset; Loading @@ -36,6 +38,8 @@ import android.support.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runner.RunWith; import java.util.List; /** /** * Tests app ops version upgrades * Tests app ops version upgrades */ */ Loading Loading @@ -107,6 +111,46 @@ public class AppOpsActiveWatcherTest { verifyNoMoreInteractions(listener); verifyNoMoreInteractions(listener); } } @Test public void testIsRunning() throws Exception { final AppOpsManager appOpsManager = getContext().getSystemService(AppOpsManager.class); // Start the op appOpsManager.startOp(AppOpsManager.OP_CAMERA); assertTrue("Camera should be running", isCameraOn(appOpsManager)); // Finish the op appOpsManager.finishOp(AppOpsManager.OP_CAMERA); assertFalse("Camera should not be running", isCameraOn(appOpsManager)); } private boolean isCameraOn(AppOpsManager appOpsManager) { List<AppOpsManager.PackageOps> packages = appOpsManager.getPackagesForOps(new int[] {AppOpsManager.OP_CAMERA}); // AppOpsManager can return null when there is no requested data. if (packages != null) { final int numPackages = packages.size(); for (int packageInd = 0; packageInd < numPackages; packageInd++) { AppOpsManager.PackageOps packageOp = packages.get(packageInd); List<AppOpsManager.OpEntry> opEntries = packageOp.getOps(); if (opEntries != null) { final int numOps = opEntries.size(); for (int opInd = 0; opInd < numOps; opInd++) { AppOpsManager.OpEntry opEntry = opEntries.get(opInd); if (opEntry.getOp() == AppOpsManager.OP_CAMERA) { if (opEntry.isRunning()) { return true; } } } } } } return false; } private static Context getContext() { private static Context getContext() { return InstrumentationRegistry.getContext(); return InstrumentationRegistry.getContext(); } } Loading