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

Commit 98c1d17c authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

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

parents 6d4bdc53 f88d25e1
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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);
+1 −0
Original line number Diff line number Diff line
@@ -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);
+12 −0
Original line number Diff line number Diff line
@@ -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>
+7 −5
Original line number Diff line number Diff line
@@ -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;
    }
+19 −5
Original line number Diff line number Diff line
@@ -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() {
Loading