AndroidTextToolbar.kt

/*
 * Copyright 2020 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 androidx.compose.ui.platform

import android.os.Build
import android.view.ActionMode
import android.view.View
import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.platform.actionmodecallback.FloatingTextActionModeCallback
import androidx.compose.ui.platform.actionmodecallback.PrimaryTextActionModeCallback
import androidx.compose.ui.platform.actionmodecallback.TextActionModeCallback

/**
 * Android implementation for [TextToolbar].
 */
internal class AndroidTextToolbar(private val view: View) : TextToolbar {
    private var actionMode: ActionMode? = null
    private var textToolbarStatus = TextToolbarStatus.Hidden

    override fun showMenu(
        rect: Rect,
        onCopyRequested: ActionCallback?,
        onPasteRequested: ActionCallback?,
        onCutRequested: ActionCallback?,
        onSelectAllRequested: ActionCallback?
    ) {
        textToolbarStatus = TextToolbarStatus.Shown
        if (Build.VERSION.SDK_INT >= 23) {
            val actionModeCallback =
                FloatingTextActionModeCallback(
                    TextActionModeCallback(
                        onCopyRequested = onCopyRequested,
                        onCutRequested = onCutRequested,
                        onPasteRequested = onPasteRequested,
                        onSelectAllRequested = onSelectAllRequested
                    )
                )
            actionModeCallback.setRect(rect)
            actionMode = view.startActionMode(
                actionModeCallback,
                ActionMode.TYPE_FLOATING
            )
        } else {
            val actionModeCallback =
                PrimaryTextActionModeCallback(
                    TextActionModeCallback(
                        onCopyRequested = onCopyRequested,
                        onPasteRequested = onPasteRequested,
                        onCutRequested = onCutRequested,
                        onSelectAllRequested = onSelectAllRequested
                    )
                )
            actionMode = view.startActionMode(actionModeCallback)
        }
    }

    override fun hide() {
        textToolbarStatus = TextToolbarStatus.Hidden
        actionMode?.finish()
        actionMode = null
    }

    override val status: TextToolbarStatus
        get() = textToolbarStatus
}