Merge "Add API to get currently pinned slices" into pi-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
98c1d17cb4
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user