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

Commit 6cf7c168 authored by Fabian Kozynski's avatar Fabian Kozynski
Browse files

Restrict packages to a single concurrent request

A package cannot request more than one tile to be added at a given time.
They must wait until the user has responded to their last request (or
let some time pass).

Test: CTS test
Bug: 197534249

Change-Id: I7aabd522a600b026bfe0bff59391a4f78f90e78e
parent 3866f66f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -338,6 +338,7 @@ package android.app {
  }

  public class StatusBarManager {
    method public void cancelRequestAddTile(@NonNull String);
    method public void clickNotification(@Nullable String, int, int, boolean);
    method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void collapsePanels();
    method public void expandNotificationsPanel();
+15 −0
Original line number Diff line number Diff line
@@ -669,6 +669,21 @@ public class StatusBarManager {
        }
    }

    /**
     * @hide
     * @param packageName
     */
    @TestApi
    public void cancelRequestAddTile(@NonNull String packageName) {
        Objects.requireNonNull(packageName);
        IStatusBarService svc = getService();
        try {
            svc.cancelRequestAddTile(packageName);
        } catch (RemoteException e) {
            e.rethrowFromSystemServer();
        }
    }

    /** @hide */
    public static String windowStateToString(int state) {
        if (state == WINDOW_STATE_HIDING) return "WINDOW_STATE_HIDING";
+1 −0
Original line number Diff line number Diff line
@@ -290,4 +290,5 @@ oneway interface IStatusBar
    void runGcForTest();

    void requestAddTile(in ComponentName componentName, in CharSequence appName, in CharSequence label, in Icon icon, in IAddTileResultCallback callback);
    void cancelRequestAddTile(in String packageName);
}
+1 −0
Original line number Diff line number Diff line
@@ -161,4 +161,5 @@ interface IStatusBarService
    void suppressAmbientDisplay(boolean suppress);

    void requestAddTile(in ComponentName componentName, in CharSequence label, in Icon icon, int userId, in IAddTileResultCallback callback);
    void cancelRequestAddTile(in String packageName);
}
+18 −7
Original line number Diff line number Diff line
@@ -55,6 +55,8 @@ class TileServiceRequestController constructor(
        internal const val DISMISSED = StatusBarManager.TILE_ADD_REQUEST_RESULT_DIALOG_DISMISSED
    }

    private var dialogCanceller: ((String) -> Unit)? = null

    private val commandQueueCallback = object : CommandQueue.Callbacks {
        override fun requestAddTile(
            componentName: ComponentName,
@@ -67,6 +69,10 @@ class TileServiceRequestController constructor(
                callback.onTileRequest(it)
            }
        }

        override fun cancelRequestAddTile(packageName: String) {
            dialogCanceller?.invoke(packageName)
        }
    }

    fun init() {
@@ -95,16 +101,21 @@ class TileServiceRequestController constructor(
            callback.accept(TILE_ALREADY_ADDED)
            return
        }
        val dialogResponse = object : Consumer<Int> {
            override fun accept(response: Int) {
        val dialogResponse = Consumer<Int> { response ->
            if (response == ADD_TILE) {
                addTile(componentName)
            }
            callback.accept(response)
        }
        }
        val tileData = TileRequestDialog.TileData(appName, label, icon)
        createDialog(tileData, dialogResponse).show()
        createDialog(tileData, dialogResponse).also { dialog ->
            dialogCanceller = {
                if (componentName.packageName == it) {
                    dialog.cancel()
                }
                dialogCanceller = null
            }
        }.show()
    }

    private fun createDialog(
Loading