/* * Copyright (C) 2023 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.settings.remoteauth import android.R import android.graphics.Color import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.annotation.ColorInt import androidx.annotation.IdRes import androidx.annotation.LayoutRes import androidx.fragment.app.Fragment import com.android.settings.Utils import com.google.android.setupcompat.template.FooterBarMixin import com.google.android.setupcompat.template.FooterButton import com.google.android.setupdesign.GlifLayout /** * Displays a content view with a sticky footer in the SetupDesign style. Implementations * must define a primary button, and an optional secondary button. * * A layout with a [GlifLayout] must be provided, along with the id of the [GlifLayout]. */ abstract class RemoteAuthEnrollBase( @LayoutRes val layoutResId: Int, @IdRes private val glifLayoutId: Int ) : Fragment(layoutResId) { protected val primaryFooterButton by lazy { initializePrimaryFooterButton() } protected val secondaryFooterButton by lazy { initializeSecondaryFooterButton() } override fun onCreateView( inflater: LayoutInflater, viewGroup: ViewGroup?, savedInstanceArgs: Bundle? ) = super.onCreateView(inflater, viewGroup, savedInstanceArgs)!!.also { view -> initializeFooterbarMixin(view) } protected fun getGlifLayout(view: View) = view.findViewById(glifLayoutId) /** * Return a button will be used as the primary footer button. */ abstract fun initializePrimaryFooterButton(): FooterButton /** If non-null, returned button will be used as the secondary footer button. */ abstract fun initializeSecondaryFooterButton(): FooterButton? private fun initializeFooterbarMixin(view: View) { val footerBarMixin = checkNotNull(getGlifLayout(view)).getMixin(FooterBarMixin::class.java) primaryFooterButton.also { footerBarMixin.primaryButton = it } secondaryFooterButton?.also { footerBarMixin.secondaryButton = it } footerBarMixin.getButtonContainer().setBackgroundColor(getBackgroundColor()) } @ColorInt private fun getBackgroundColor(): Int { val stateList = Utils.getColorAttr(context, R.attr.windowBackground) return stateList?.defaultColor ?: Color.TRANSPARENT } private companion object{ const val TAG = "RemoteAuthEnrollBase" } }