Merge "Add API to get currently pinned slices" into pi-dev

This commit is contained in:
TreeHugger Robot
2018-03-14 20:12:54 +00:00
committed by Android (Google) Code Review
7 changed files with 45 additions and 22 deletions

View File

@@ -7266,6 +7266,7 @@ package android.app.slice {
public class SliceManager {
method public android.app.slice.Slice bindSlice(android.net.Uri, java.util.List<android.app.slice.SliceSpec>);
method public android.app.slice.Slice bindSlice(android.content.Intent, java.util.List<android.app.slice.SliceSpec>);
method public java.util.List<android.net.Uri> getPinnedSlices();
method public java.util.List<android.app.slice.SliceSpec> getPinnedSpecs(android.net.Uri);
method public java.util.Collection<android.net.Uri> getSliceDescendants(android.net.Uri);
method public android.net.Uri mapIntentToUri(android.content.Intent);

View File

@@ -27,6 +27,7 @@ interface ISliceManager {
SliceSpec[] getPinnedSpecs(in Uri uri, String pkg);
int checkSlicePermission(in Uri uri, String pkg, int pid, int uid);
void grantPermissionFromUser(in Uri uri, String pkg, String callingPkg, boolean allSlices);
Uri[] getPinnedSlices(String pkg);
byte[] getBackupPayload(int user);
void applyRestore(in byte[] payload, int user);

View File

@@ -183,6 +183,18 @@ public class SliceManager {
}
}
/**
* Get the list of currently pinned slices for this app.
* @see SliceProvider#onSlicePinned
*/
public @NonNull List<Uri> getPinnedSlices() {
try {
return Arrays.asList(mService.getPinnedSlices(mContext.getPackageName()));
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
/**
* Obtains a list of slices that are descendants of the specified Uri.
* <p>

View File

@@ -14,9 +14,6 @@
package com.android.server.slice;
import static android.app.slice.SliceManager.PERMISSION_GRANTED;
import android.app.slice.Slice;
import android.app.slice.SliceProvider;
import android.app.slice.SliceSpec;
import android.content.ContentProviderClient;
@@ -33,7 +30,6 @@ import android.util.Log;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
@@ -54,18 +50,24 @@ public class PinnedSliceState {
private final ArraySet<String> mPinnedPkgs = new ArraySet<>();
@GuardedBy("mLock")
private final ArrayMap<IBinder, ListenerInfo> mListeners = new ArrayMap<>();
private final String mPkg;
@GuardedBy("mLock")
private SliceSpec[] mSupportedSpecs = null;
private final DeathRecipient mDeathRecipient = this::handleRecheckListeners;
private boolean mSlicePinned;
public PinnedSliceState(SliceManagerService service, Uri uri) {
public PinnedSliceState(SliceManagerService service, Uri uri, String pkg) {
mService = service;
mUri = uri;
mPkg = pkg;
mLock = mService.getLock();
}
public String getPkg() {
return mPkg;
}
public SliceSpec[] getSpecs() {
return mSupportedSpecs;
}

View File

@@ -148,12 +148,26 @@ public class SliceManagerService extends ISliceManager.Stub {
}
/// ----- ISliceManager stuff -----
@Override
public Uri[] getPinnedSlices(String pkg) {
verifyCaller(pkg);
ArrayList<Uri> ret = new ArrayList<>();
synchronized (mLock) {
for (PinnedSliceState state : mPinnedSlicesByUri.values()) {
if (Objects.equals(pkg, state.getPkg())) {
ret.add(state.getUri());
}
}
}
return ret.toArray(new Uri[ret.size()]);
}
@Override
public void pinSlice(String pkg, Uri uri, SliceSpec[] specs, IBinder token) throws RemoteException {
verifyCaller(pkg);
enforceAccess(pkg, uri);
uri = maybeAddUserId(uri, Binder.getCallingUserHandle().getIdentifier());
getOrCreatePinnedSlice(uri).pin(pkg, specs, token);
getOrCreatePinnedSlice(uri, pkg).pin(pkg, specs, token);
}
@Override
@@ -302,11 +316,11 @@ public class SliceManagerService extends ISliceManager.Stub {
}
}
private PinnedSliceState getOrCreatePinnedSlice(Uri uri) {
private PinnedSliceState getOrCreatePinnedSlice(Uri uri, String pkg) {
synchronized (mLock) {
PinnedSliceState manager = mPinnedSlicesByUri.get(uri);
if (manager == null) {
manager = createPinnedSlice(uri);
manager = createPinnedSlice(uri, pkg);
mPinnedSlicesByUri.put(uri, manager);
}
return manager;
@@ -314,8 +328,8 @@ public class SliceManagerService extends ISliceManager.Stub {
}
@VisibleForTesting
protected PinnedSliceState createPinnedSlice(Uri uri) {
return new PinnedSliceState(this, uri);
protected PinnedSliceState createPinnedSlice(Uri uri, String pkg) {
return new PinnedSliceState(this, uri, pkg);
}
public Object getLock() {

View File

@@ -1,7 +1,5 @@
package com.android.server.slice;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -12,23 +10,18 @@ import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.slice.ISliceListener;
import android.app.slice.Slice;
import android.app.slice.SliceProvider;
import android.app.slice.SliceSpec;
import android.content.ContentProvider;
import android.content.Context;
import android.content.IContentProvider;
import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.IBinder.DeathRecipient;
@@ -83,7 +76,7 @@ public class PinnedSliceStateTest extends UiServiceTestCase {
mIContentProvider = mock(IContentProvider.class);
when(mContentProvider.getIContentProvider()).thenReturn(mIContentProvider);
mContext.getContentResolver().addProvider(AUTH, mContentProvider);
mPinnedSliceManager = new PinnedSliceState(mSliceService, TEST_URI);
mPinnedSliceManager = new PinnedSliceState(mSliceService, TEST_URI, "pkg");
}
@Test
@@ -164,4 +157,4 @@ public class PinnedSliceStateTest extends UiServiceTestCase {
verify(mSliceService).removePinnedSlice(eq(TEST_URI));
assertFalse(mPinnedSliceManager.hasPinOrListener());
}
}
}

View File

@@ -18,6 +18,7 @@ import static android.content.ContentProvider.maybeAddUserId;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
@@ -28,7 +29,6 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.app.AppOpsManager;
import android.app.slice.ISliceListener;
import android.app.slice.SliceSpec;
import android.content.pm.PackageManagerInternal;
import android.net.Uri;
@@ -71,7 +71,7 @@ public class SliceManagerServiceTest extends UiServiceTestCase {
mService = spy(new SliceManagerService(mContext, TestableLooper.get(this).getLooper()));
mCreatedSliceState = mock(PinnedSliceState.class);
doReturn(mCreatedSliceState).when(mService).createPinnedSlice(eq(TEST_URI));
doReturn(mCreatedSliceState).when(mService).createPinnedSlice(eq(TEST_URI), anyString());
}
@After
@@ -85,7 +85,7 @@ public class SliceManagerServiceTest extends UiServiceTestCase {
mService.pinSlice("pkg", TEST_URI, EMPTY_SPECS, mToken);
mService.pinSlice("pkg", TEST_URI, EMPTY_SPECS, mToken);
verify(mService, times(1)).createPinnedSlice(eq(TEST_URI));
verify(mService, times(1)).createPinnedSlice(eq(TEST_URI), eq("pkg"));
}
@Test