/*
 * 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.example.rscamera;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.ViewFlipper;

import com.android.example.rscamera.rscamera.R;

import java.text.DecimalFormat;
import java.util.Timer;
import java.util.TimerTask;

/**
 * Main Activity for this app
 * It presents a ui for setting ISO, Shutter speed, and focus
 */
public class MainActivity extends Activity {
    private static final String TAG = "MainActivity";
    private static final long ONE_SECOND = 1000000000;
    private CameraView mPreviewView;
    private ViewFlipper mViewFlipper;
    private Button mSpeedButton;
    private Button mISOButton;
    private Button mFocusButton;
    private Timer mTimer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSpeedButton = findViewById(R.id.speed);
        mISOButton = findViewById(R.id.iso);
        mFocusButton = findViewById(R.id.focus);
        mPreviewView = findViewById(R.id.preview);
        mViewFlipper = findViewById(R.id.viewFlipper);
        SeekBar seekBar = findViewById(R.id.focusbar);
        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                mPreviewView.setFocusInMeters(seekBar.getProgress() / 10.f);
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });
        mPreviewView.setParametersChangedCallback(new CameraView.ParametersChangedCallback() {
            @Override
            public void parametersChanged() {
                update_buttons();
            }
        });
        mTimer = new Timer();

        mTimer.scheduleAtFixedRate(new TimerTask() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                runOnUiThread(new Runnable() {
                    public void run() {
                        setTitle("RS Camera (" + mPreviewView.getFps() + "fps)");
                    }
                });

            }
        }, 250, 250);
    }

    @Override
    protected void onResume() {
        super.onResume();
        mPreviewView.resume(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        mPreviewView.pause();
    }

    public void setShutterSpeed(View v) {
        if (mPreviewView.isAutoExposure()) {
            mPreviewView.setAutoExposure(false);
            mPreviewView.setMode(CameraView.MODE_SPEED);
        } else {
            mPreviewView.setMode(CameraView.MODE_NONE);
            mPreviewView.setAutoExposure(true);
        }
        update_buttons();
    }

    public void setISO(View v) {
        if (mPreviewView.isAutoExposure()) {
            mPreviewView.setAutoExposure(false);
            mPreviewView.setMode(CameraView.MODE_ISO);
        } else {
            mPreviewView.setMode(CameraView.MODE_NONE);
            mPreviewView.setAutoExposure(true);
        }
        update_buttons();
    }

    public void setFocus(View v) {
        if (mPreviewView.isAutofocus()) {
            mPreviewView.setAutofocus(false);
            mPreviewView.setMode(CameraView.MODE_FOCUS);
            mViewFlipper.setInAnimation(this, R.anim.slide_in_from_left);
            mViewFlipper.setOutAnimation(this, R.anim.slide_out_to_right);
            mViewFlipper.showNext();
        } else {
            mPreviewView.setMode(CameraView.MODE_NONE);
            mPreviewView.setAutofocus(true);
        }
        update_buttons();
    }

    public void back(View v) {
        mViewFlipper.setInAnimation(this, R.anim.slide_in_from_left);
        mViewFlipper.setOutAnimation(this, R.anim.slide_out_to_right);
        mViewFlipper.showNext();
    }

    public void capture(View v) {
        mPreviewView.takePicture();
    }

    private void update_buttons() {
        byte mode = mPreviewView.getMode();
        mSpeedButton.setElevation(mode == CameraView.MODE_SPEED ? 20 : 0);
        mFocusButton.setElevation(mode == CameraView.MODE_FOCUS ? 20 : 0);
        mISOButton.setElevation(mode == CameraView.MODE_ISO ? 20 : 0);

        String a;
        a = (mPreviewView.isAutoExposure()) ? "A " : "  ";
        if (ONE_SECOND > mPreviewView.getExposure()) {
            mSpeedButton.setText(a + 1 + "/" + (ONE_SECOND / mPreviewView.getExposure()) + "s");
        } else {
            mSpeedButton.setText(a + (mPreviewView.getExposure() / ONE_SECOND) + "\"s");

        }
        a = (mPreviewView.isAutofocus()) ? "A " : "  ";
        DecimalFormat df = new DecimalFormat("#.###");
        float d = mPreviewView.getFocusDist();
        if (d < 0.01) {
            d = 0;
        }
        mFocusButton.setText(a + df.format(0.1 / d) + " m");
        a = (mPreviewView.isAutoExposure()) ? "A ISO " : "  ISO ";
        mISOButton.setText(a + mPreviewView.getIso() + " M");
    }
}
