/* * Copyright (C) 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 com.android.deskclock import android.view.KeyEvent import android.widget.Button import android.widget.ImageView import androidx.annotation.ColorInt import androidx.fragment.app.Fragment import com.android.deskclock.FabContainer.UpdateFabFlag import com.android.deskclock.uidata.UiDataModel abstract class DeskClockFragment( /** The tab associated with this fragment. */ private val mTab: UiDataModel.Tab ) : Fragment(), FabContainer, FabController { /** The container that houses the fab and its left and right buttons. */ private var mFabContainer: FabContainer? = null override fun onResume() { super.onResume() // Update the fab and buttons in case their state changed while the fragment was paused. if (isTabSelected) { updateFab(FabContainer.FAB_AND_BUTTONS_IMMEDIATE) } } open fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { // By default return false so event continues to propagate return false } override fun onLeftButtonClick(left: Button) { // Do nothing here, only in derived classes } override fun onRightButtonClick(right: Button) { // Do nothing here, only in derived classes } override fun onMorphFab(fab: ImageView) { // Do nothing here, only in derived classes } /** * @param color the newly installed app window color */ protected open fun onAppColorChanged(@ColorInt color: Int) { // Do nothing here, only in derived classes } /** * @param fabContainer the container that houses the fab and its left and right buttons */ fun setFabContainer(fabContainer: FabContainer?) { mFabContainer = fabContainer } /** * Requests that the parent activity update the fab and buttons. * * @param updateTypes the manner in which the fab container should be updated */ override fun updateFab(@UpdateFabFlag updateTypes: Int) { mFabContainer?.updateFab(updateTypes) } /** * @return `true` iff the currently selected tab displays this fragment */ val isTabSelected: Boolean get() = UiDataModel.uiDataModel.selectedTab == mTab /** * Select the tab that displays this fragment. */ fun selectTab() { UiDataModel.uiDataModel.selectedTab = mTab } /** * Updates the scrolling state in the [UiDataModel] for this tab. * * @param scrolledToTop `true` iff the vertical scroll position of this tab is at the top */ fun setTabScrolledToTop(scrolledToTop: Boolean) { UiDataModel.uiDataModel.setTabScrolledToTop(mTab, scrolledToTop) } }