content: /*
   * Copyright (C) 2018 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.internal.globalactions;
  
  import android.content.Context;
  import android.util.Log;
  import android.view.LayoutInflater;
  import android.view.View;
  import android.view.ViewGroup;
  import android.widget.ImageView;
  import android.widget.TextView;
  import com.android.internal.R;
  
  /**
   * A toggle action knows whether it is on or off, and displays an icon and status message
   * accordingly.
   */
  public abstract class ToggleAction implements Action {
      private static final String TAG = "ToggleAction";
  
      public enum State {
          Off(false),
          TurningOn(true),
          TurningOff(true),
          On(false);
  
          private final boolean inTransition;
  
          State(boolean intermediate) {
              inTransition = intermediate;
          }
  
          public boolean inTransition() {
              return inTransition;
          }
      }
  
      protected State mState = State.Off;
  
      // prefs
      protected int mEnabledIconResId;
      protected int mDisabledIconResid;
      protected int mMessageResId;
      protected int mEnabledStatusMessageResId;
      protected int mDisabledStatusMessageResId;
  
      /**
       * @param enabledIconResId The icon for when this action is on.
       * @param disabledIconResid The icon for when this action is off.
       * @param message The general information message, e.g 'Silent Mode'
       * @param enabledStatusMessageResId The on status message, e.g 'sound disabled'
       * @param disabledStatusMessageResId The off status message, e.g. 'sound enabled'
       */
      public ToggleAction(int enabledIconResId,
              int disabledIconResid,
              int message,
              int enabledStatusMessageResId,
              int disabledStatusMessageResId) {
          mEnabledIconResId = enabledIconResId;
          mDisabledIconResid = disabledIconResid;
          mMessageResId = message;
          mEnabledStatusMessageResId = enabledStatusMessageResId;
          mDisabledStatusMessageResId = disabledStatusMessageResId;
      }
  
      /** Override to make changes to resource IDs just before creating the View. */
      void willCreate() {
  
      }
  
      @Override
      public CharSequence getLabelForAccessibility(Context context) {
          return context.getString(mMessageResId);
      }
  
      @Override
      public View create(Context context, View convertView, ViewGroup parent,
              LayoutInflater inflater) {
          willCreate();
  
          View v = inflater.inflate(R.layout.global_actions_item, parent, false);
  
          ImageView icon = v.findViewById(R.id.icon);
          TextView messageView = v.findViewById(R.id.message);
          TextView statusView = v.findViewById(R.id.status);
          final boolean enabled = isEnabled();
  
          if (messageView != null) {
              messageView.setText(mMessageResId);
              messageView.setEnabled(enabled);
          }
  
          boolean on = ((mState == State.On) || (mState == State.TurningOn));
          if (icon != null) {
              icon.setImageDrawable(context.getDrawable(
                      (on ? mEnabledIconResId : mDisabledIconResid)));
              icon.setEnabled(enabled);
          }
  
          if (statusView != null) {
              statusView.setText(on ? mEnabledStatusMessageResId : mDisabledStatusMessageResId);
              statusView.setVisibility(View.VISIBLE);
              statusView.setEnabled(enabled);
          }
          v.setEnabled(enabled);
  
          return v;
      }
  
      @Override
      public final void onPress() {
          if (mState.inTransition()) {
              Log.w(TAG, "shouldn't be able to toggle when in transition");
              return;
          }
  
          final boolean nowOn = !(mState == State.On);
          onToggle(nowOn);
          changeStateFromPress(nowOn);
      }
  
      @Override
      public boolean isEnabled() {
          return !mState.inTransition();
      }
  
      /**
       * Implementations may override this if their state can be in on of the intermediate
       * states until some notification is received (e.g airplane mode is 'turning off' until
       * we know the wireless connections are back online
       * @param buttonOn Whether the button was turned on or off
       */
      protected void changeStateFromPress(boolean buttonOn) {
          mState = buttonOn ? State.On : State.Off;
      }
  
      public abstract void onToggle(boolean on);
  
      public void updateState(State state) {
          mState = state;
      }
  }
  