content: /*
   * Copyright (C) 2015 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.setupwizardlib.view;
  
  import android.annotation.TargetApi;
  import android.content.Context;
  import android.content.res.TypedArray;
  import android.graphics.Color;
  import android.os.Build.VERSION_CODES;
  import androidx.annotation.StyleableRes;
  import android.util.AttributeSet;
  import android.view.ContextThemeWrapper;
  import android.view.View;
  import android.widget.Button;
  import android.widget.LinearLayout;
  import com.android.setupwizardlib.R;
  
  /**
   * Custom navigation bar for use with setup wizard. This bar contains a back button, more button and
   * next button. By default, the more button is hidden, and typically the next button will be hidden
   * if the more button is shown.
   *
   * @see com.android.setupwizardlib.template.RequireScrollMixin
   */
  public class NavigationBar extends LinearLayout implements View.OnClickListener {
  
    /**
     * An interface to listen to events of the navigation bar, namely when the user clicks on the back
     * or next button.
     */
    public interface NavigationBarListener {
      void onNavigateBack();
  
      void onNavigateNext();
    }
  
    private static int getNavbarTheme(Context context) {
      // Normally we can automatically guess the theme by comparing the foreground color against
      // the background color. But we also allow specifying explicitly using suwNavBarTheme.
      TypedArray attributes =
          context.obtainStyledAttributes(
              new int[] {
                R.attr.suwNavBarTheme, android.R.attr.colorForeground, android.R.attr.colorBackground
              });
      @StyleableRes int suwNavBarTheme = 0;
      @StyleableRes int colorForeground = 1;
      @StyleableRes int colorBackground = 2;
      int theme = attributes.getResourceId(suwNavBarTheme, 0);
      if (theme == 0) {
        // Compare the value of the foreground against the background color to see if current
        // theme is light-on-dark or dark-on-light.
        float[] foregroundHsv = new float[3];
        float[] backgroundHsv = new float[3];
        Color.colorToHSV(attributes.getColor(colorForeground, 0), foregroundHsv);
        Color.colorToHSV(attributes.getColor(colorBackground, 0), backgroundHsv);
        boolean isDarkBg = foregroundHsv[2] > backgroundHsv[2];
        theme = isDarkBg ? R.style.SuwNavBarThemeDark : R.style.SuwNavBarThemeLight;
      }
      attributes.recycle();
      return theme;
    }
  
    private static Context getThemedContext(Context context) {
      final int theme = getNavbarTheme(context);
      return new ContextThemeWrapper(context, theme);
    }
  
    private Button nextButton;
    private Button backButton;
    private Button moreButton;
    private NavigationBarListener listener;
  
    public NavigationBar(Context context) {
      super(getThemedContext(context));
      init();
    }
  
    public NavigationBar(Context context, AttributeSet attrs) {
      super(getThemedContext(context), attrs);
      init();
    }
  
    @TargetApi(VERSION_CODES.HONEYCOMB)
    public NavigationBar(Context context, AttributeSet attrs, int defStyleAttr) {
      super(getThemedContext(context), attrs, defStyleAttr);
      init();
    }
  
    // All the constructors delegate to this init method. The 3-argument constructor is not
    // available in LinearLayout before v11, so call super with the exact same arguments.
    private void init() {
      View.inflate(getContext(), R.layout.suw_navbar_view, this);
      nextButton = (Button) findViewById(R.id.suw_navbar_next);
      backButton = (Button) findViewById(R.id.suw_navbar_back);
      moreButton = (Button) findViewById(R.id.suw_navbar_more);
    }
  
    public Button getBackButton() {
      return backButton;
    }
  
    public Button getNextButton() {
      return nextButton;
    }
  
    public Button getMoreButton() {
      return moreButton;
    }
  
    public void setNavigationBarListener(NavigationBarListener listener) {
      this.listener = listener;
      if (this.listener != null) {
        getBackButton().setOnClickListener(this);
        getNextButton().setOnClickListener(this);
      }
    }
  
    @Override
    public void onClick(View view) {
      if (listener != null) {
        if (view == getBackButton()) {
          listener.onNavigateBack();
        } else if (view == getNextButton()) {
          listener.onNavigateNext();
        }
      }
    }
  }
  