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

Commit c3de397d authored by Jacky Wang's avatar Jacky Wang
Browse files

[Catalyst] Add protobuf support for Permissions

Bug: 374115149
Flag: EXEMPT new class
Test: N/A
Change-Id: I678497889f16301befb1c1bbaf83188099db50b7
parent 688b57b8
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -99,6 +99,20 @@ message PreferenceProto {
  }
}

// Proto of permissions
message PermissionsProto {
  repeated PermissionProto all_of = 1;
  repeated PermissionProto any_of = 2;
}

// Proto of permission
message PermissionProto {
  oneof kind {
    string permission = 1;
    PermissionsProto permissions = 2;
  }
}

// Proto of string or string resource id.
message TextProto {
  oneof text {
+89 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settingslib.graph

import com.android.settingslib.datastore.AllOfPermissions
import com.android.settingslib.datastore.AnyOfPermissions
import com.android.settingslib.datastore.Permissions
import com.android.settingslib.datastore.and
import com.android.settingslib.datastore.or
import com.android.settingslib.graph.proto.PermissionProto
import com.android.settingslib.graph.proto.PermissionsProto

inline fun permissionsProto(init: PermissionsProto.Builder.() -> Unit): PermissionsProto =
    PermissionsProto.newBuilder().also(init).build()

inline fun permissionProto(init: PermissionProto.Builder.() -> Unit): PermissionProto =
    PermissionProto.newBuilder().also(init).build()

fun Permissions.toProto(): PermissionsProto = permissionsProto {
    when (this@toProto) {
        is AllOfPermissions -> {
            forEach { addAllOf(it.toPermissionProto()) }
        }
        is AnyOfPermissions -> {
            forEach { addAnyOf(it.toPermissionProto()) }
        }
    }
}

private fun Any.toPermissionProto() =
    when {
        this is Permissions -> permissionProto { permissions = toProto() }
        else -> permissionProto { permission = this@toPermissionProto as String }
    }

fun PermissionsProto.getAllPermissions(): List<String> {
    val permissions = mutableSetOf<String>()
    fun Permissions.collect() {
        forEach {
            when {
                it is String -> permissions.add(it)
                else -> (it as Permissions).collect()
            }
        }
    }
    toPermissions().collect()
    return permissions.toList()
}

fun PermissionsProto.toPermissions(): Permissions {
    var permissions = Permissions.EMPTY
    for (index in 0 until allOfCount) {
        val permission = getAllOf(index).toPermission()
        permissions =
            when (permission) {
                is String -> permissions and permission
                else -> permissions and (permission as Permissions)
            }
    }
    for (index in 0 until anyOfCount) {
        val permission = getAnyOf(index).toPermission()
        permissions =
            when (permission) {
                is String -> permissions or permission
                else -> permissions or (permission as Permissions)
            }
    }
    return permissions
}

private fun PermissionProto.toPermission(): Any =
    when {
        hasPermissions() -> permissions.toPermissions()
        else -> permission
    }