/FileExtraction/Java_unseen/Kegbot_kegbot-android/kegtab/src/main/java/org/kegbot/app/PinActivity.java
/*
 * Copyright 2003-2020 The Kegbot Project contributors <info@kegbot.org>
 *
 * This file is part of the Kegtab package from the Kegbot project. For
 * more information on Kegtab or Kegbot, see <http://kegbot.org/>.
 *
 * Kegtab is free software: you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free
 * Software Foundation, version 2.
 *
 * Kegtab is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with Kegtab. If not, see <http://www.gnu.org/licenses/>.
 */
package org.kegbot.app;

import android.app.ActionBar;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.inputmethod.EditorInfo;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;

import com.google.common.base.Strings;

import org.kegbot.app.config.AppConfiguration;
import org.kegbot.core.KegbotCore;

/**
 * Pass-through activity which verifies the manager pin. PIN-verified activities need no special
 * awareness of the PIN. Use {@link #startThroughPinActivity(Context, Intent)} to launch
 * PIN-verified activities.
 */
public class PinActivity extends Activity {

  private static final String TAG = PinActivity.class.getSimpleName();
  private static final String EXTRA_KEY_START_INTENT = "start_intent";

  private AppConfiguration mConfig;
  private EditText mPinText;
  private TextView mErrorText;
  private Button mPinButton;

  @Override
  protected void onStart() {
    super.onStart();

    mConfig = KegbotCore.getInstance(this).getConfiguration();
    if (Strings.isNullOrEmpty(mConfig.getPin())) {
      onPinSuccess();
      return;
    }

    setContentView(R.layout.enter_pin_activity);

    mPinText = (EditText) findViewById(R.id.managerPin);

    mPinText.addTextChangedListener(new TextWatcher() {
      @Override
      public void onTextChanged(CharSequence s, int start, int before, int count) {
        // Fade out error text after pin is re-typed.
        if (mErrorText.getVisibility() == View.VISIBLE) {
          final Animation out = new AlphaAnimation(1.0f, 0.0f);
          out.setDuration(1000);
          mErrorText.setAnimation(out);
          mErrorText.setVisibility(View.INVISIBLE);
        }
      }

      @Override
      public void beforeTextChanged(CharSequence s, int start, int count, int after) {
      }

      @Override
      public void afterTextChanged(Editable s) {
      }
    });

    mPinText.setOnEditorActionListener(new OnEditorActionListener() {
      @Override
      public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (isNexusDone(actionId)
                || (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN)) {
          verifyPin();
          return true;
        }
        return false;
      }
    });

    mErrorText = (TextView) findViewById(R.id.managerPinError);

    mPinButton = (Button) findViewById(R.id.submitButton);
    mPinButton.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        verifyPin();
      }
    });

    final ActionBar bar = getActionBar();
    if (bar != null) {
      bar.setTitle("");
    }
  }

  //Events may vary by keyboard; This one works on N7
  private static boolean isNexusDone(int actionId){
    return actionId == EditorInfo.IME_ACTION_DONE;
  }

  private void onPinSuccess() {
    setResult(RESULT_OK);
    final Intent startIntent = getIntent().getParcelableExtra(EXTRA_KEY_START_INTENT);
    Log.i(TAG, "Pin validated, starting activity.");
    if (startIntent == null) {
      Log.wtf(TAG, "Start intent was null");
      return;
    }
    startActivity(startIntent);
    finish();
  }

  private void onPinFailure() {
    mPinText.setText("");
    mErrorText.setVisibility(View.VISIBLE);
  }

  private void verifyPin() {
    final String pinText = mPinText.getText().toString();
    if (mConfig.getPin().equalsIgnoreCase(pinText)) {
      onPinSuccess();
    } else {
      onPinFailure();
    }
  }

  /**
   * Start a new activity with pin verification.
   *
   * @param context     the context to be used for starting.
   * @param startIntent the intent which shall be used to start the activity upon success.
   */
  public static void startThroughPinActivity(Context context, Intent startIntent) {
    if (Strings.isNullOrEmpty(KegbotCore.getInstance(context).getConfiguration().getPin())) {
      // Short circuit: no manager pin.
      context.startActivity(startIntent);
      return;
    }
    final Intent intent = new Intent(context, PinActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
    if ((startIntent.getFlags() & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
      intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    }
    intent.putExtra(EXTRA_KEY_START_INTENT, startIntent);
    context.startActivity(intent);
  }

  public static void startThroughPinActivityForResult(Context context, Intent startIntent, int requestCode) {
    if (Strings.isNullOrEmpty(KegbotCore.getInstance(context).getConfiguration().getPin())) {
      // Short circuit: no manager pin.
      ((Activity) context).startActivityForResult(startIntent, requestCode);
      return;
    }
    final Intent intent = new Intent(context, PinActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
    if ((startIntent.getFlags() & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
      intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    }
    intent.putExtra(EXTRA_KEY_START_INTENT, startIntent);

    ((Activity) context).startActivityForResult(intent, requestCode);
  }

}
