package @ANDROID_MANIFEST_PACKAGE@;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

import org.libsdl.app.SDLActivity;

import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import android.view.View;
import android.view.ViewGroup;
import android.view.LayoutInflater;

public class SDLEntryTestActivity extends Activity {

    public String MODIFY_ARGUMENTS = "@ANDROID_MANIFEST_PACKAGE@.MODIFY_ARGUMENTS";
    boolean isModifyingArguments;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.v("SDL", "SDLEntryTestActivity onCreate");
        super.onCreate(savedInstanceState);

        String intent_action = getIntent().getAction();
        Log.v("SDL", "SDLEntryTestActivity intent.action = " + intent_action);

        if (intent_action == MODIFY_ARGUMENTS) {
            isModifyingArguments = true;
            createArgumentLayout();
        } else {
            startChildActivityAndFinish();
        }
    }

    protected void createArgumentLayout() {
        LayoutInflater inflater = getLayoutInflater();
        View view = inflater.inflate(R.layout.arguments_layout, null);
        setContentView(view);

        Button button = (Button)requireViewById(R.id.arguments_start_button);
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                startChildActivityAndFinish();
            }
        });
    }

    protected String[] getArguments() {
        if (!isModifyingArguments) {
            return new String[0];
        }
        EditText editText = (EditText)findViewById(R.id.arguments_edit);
        String text = editText.getText().toString();
        String new_text = text.replace("[ \t]*[ \t\n]+[ \t]+", "\n").strip();
        Log.v("SDL", "text = " + text + "\n becomes \n" + new_text);
        return new_text.split("\n", 0);
    }

    @Override
    protected void onStart() {
        Log.v("SDL", "SDLEntryTestActivity onStart");
        super.onStart();
    }

    @Override
    protected void onResume() {
        Log.v("SDL", "SDLEntryTestActivity onResume");
        super.onResume();
    }

    @Override
    protected void onPause() {
        Log.v("SDL", "SDLEntryTestActivity onPause");
        super.onPause();
    }

    @Override
    protected void onStop() {
        Log.v("SDL", "SDLEntryTestActivity onStop");
        super.onStop();
    }

    @Override
    protected void onDestroy() {
        Log.v("SDL", "SDLEntryTestActivity onDestroy");
        super.onDestroy();
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        Log.v("SDL", "SDLEntryTestActivity onRestoreInstanceState");
        super.onRestoreInstanceState(savedInstanceState);
        EditText editText = (EditText)findViewById(R.id.arguments_edit);
        editText.setText(savedInstanceState.getCharSequence("args", ""), TextView.BufferType.EDITABLE);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        Log.v("SDL", "SDLEntryTestActivity onSaveInstanceState");
        EditText editText = (EditText)findViewById(R.id.arguments_edit);
        outState.putCharSequence("args", editText.getText());
        super.onSaveInstanceState(outState);
    }

    private void startChildActivityAndFinish() {
        Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        intent.setClassName("@ANDROID_MANIFEST_PACKAGE@", "@ANDROID_MANIFEST_PACKAGE@.SDLTestActivity");
        intent.putExtra("arguments", getArguments());
        startActivity(intent);
        finish();
    }
}
