/* * Copyright (C) 2025 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.eyedropper.ui.desktop import android.graphics.Bitmap import androidx.compose.ui.geometry.Offset import androidx.lifecycle.SavedStateHandle import com.android.eyedropper.ui.BaseEyeDropperViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow // TODO: b/353144000 - Implement with Hilt /** * [BaseEyeDropperViewModel] subclass that manages additional desktop UX specific state: * * On initialization, we initialize the reticle to the current cursor position to provide a * seamless launch. * * This ViewModel supports multi-display, and is instantiated per display, */ class DesktopViewModel( savedStateHandle: SavedStateHandle, ) : BaseEyeDropperViewModel(savedStateHandle) { /** * The display with the cursor will display its reticle. Correctness is guaranteed by the fact * that there can only be one pointer. */ private var _hasCursor = MutableStateFlow(false) val hasCursor = _hasCursor.asStateFlow() /** * Initialize at current cursor position, or center of screen (hypothetically impossible) */ fun initialize( bitmap: Bitmap, cursorPosition: Offset?, // If null, then this display doesn't have the cursor onColorSelected: (Int) -> Unit, onSelectionCanceled: () -> Unit, ) { super.initialize(bitmap, onColorSelected, onSelectionCanceled) val initialPosition = cursorPosition ?: Offset.Zero updateBitmapPointerPosition( Offset(initialPosition.x, initialPosition.y) ) updateHasCursor(cursorPosition != null) } fun updateHasCursor(hasCursor: Boolean) { _hasCursor.value = hasCursor } }