package com.tos_bot.ui;
import android.content.Context;
import android.graphics.Typeface;
import android.view.Display;
import android.view.View;
import android.view.WindowManager;
import android.widget.HorizontalScrollView;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import com.tos_bot.ConfigData;
import com.tos_bot.Constants;
import com.tos_bot.ui.state.State;
import com.tos_bot.weightMap;
import com.tos_bot.ui.state.InitPage;
import com.tos_bot.ui.state.SettingPage;
import com.tos_bot.ui.state.StartServicePage;
import com.tos_bot.ui.state.VariablePage;
import com.tos_bot.ui.state.StrategyPage;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Sean.
*/
public class FloatingUIManager {
private int WIDTH;
private int HEIGHT;
private int RADIUS;
private WindowManager _wm;
private Context _context;
private Observer _observer;
private double imageButtonRatio = 1;
private State current;
private ArrayList<View> _views = new ArrayList<View>();
private InitPage initPage;
private SettingPage settingPage;
private StartServicePage startServicePage;
private VariablePage variablePage;
private StrategyPage strategyPage;
private FloatingImageButton _floatStrategyButton;
private FloatingImageButton _floatSettingButton;
//private View _view;
public void Init(){
current = initPage;
current.Init();
}
public void Setting() {
current = settingPage;
current.Setting();
}
public void Variable() {
current = variablePage;
current.Variable();
}
public void Strategy() {
current = strategyPage;
current.Strategy();
}
public void StartService() {
current = startServicePage;
current.StartService();
}
public ArrayList<View> RegisterWidget(InitPage page){
final FloatingImageButton button = CreateSettingButton();
_floatSettingButton = button;
_views.add(button);
return new ArrayList<View>(){{
add(button);
}};
}
public ArrayList<View> RegisterWidget(SettingPage page){
final FloatingImageButton button1 = CreateStartButton();
final FloatingImageButton button2 = CreateStrategyButton();
final FloatingImageButton button3 = CreateVariableButton();
_floatStrategyButton = button2;
_views.add(button1);
_views.add(button2);
_views.add(button3);
return new ArrayList<View>(){{
add(button1);
add(button2);
add(button3);
add(_floatSettingButton);
}};
}
public ArrayList<View> RegisterWidget(StartServicePage page){
final FloatingImageButton button = CreateStopButton();
_views.add(button);
return new ArrayList<View>(){{
add(button);
}};
}
public ArrayList<View> RegisterWidget(VariablePage page){
final FloatingSeekBar seekBar1;
final FloatingSeekBar seekBar2;
final FloatingTextView text1 = CreateStepTextView();
final FloatingTextView text2 = CreateComboTextView();
final FloatingImageButton button = CreateReturnButton();
seekBar1 = CreateStepSeekBar(text1);
seekBar2 = CreateComboSeekBar(text2);
_views.add(seekBar1);
_views.add(seekBar2);
_views.add(text1);
_views.add(text2);
_views.add(button);
return new ArrayList<View>(){{
add(seekBar1);
add(seekBar2);
add(text1);
add(text2);
add(button);
}};
}
public ArrayList<View> RegisterWidget(StrategyPage page){
final FloatingLinearLayout layout = CreateStrategyHorizontalScrollView();
_views.add(layout);
return new ArrayList<View>(){{
add(layout);
}};
}
public FloatingUIManager(Context context, Display display, Observer observer){
WIDTH = display.getWidth();
HEIGHT = display.getHeight();
RADIUS = HEIGHT / 5;
imageButtonRatio = CalcRatio();
_context = context;
_wm = (WindowManager) context.getSystemService("window");
_observer = observer;
initPage = new InitPage(this);
settingPage = new SettingPage(this);
startServicePage = new StartServicePage(this);
variablePage = new VariablePage(this);
strategyPage = new StrategyPage(this);
current = initPage;
}
private FloatingImageButton CreateStartButton(){
int side = getStartButtonPosition();
FloatingImageButton button = CreateButton(side, side, "start");
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
current.StartService();
_observer.NotifyStart();
}
});
return button;
}
private int getStartButtonPosition(){
return (int)(RADIUS / Math.sqrt(2));
}
private FloatingImageButton CreateStopButton(){
FloatingImageButton button = CreateButton(
(int)(WIDTH * Constants.LEFT_TOP_WIDGET_X),
(int)(HEIGHT * Constants.LEFT_TOP_WIDGET_Y), "stop");
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
current.Init();
if (ConfigData.solverThread != null) {
Thread moribund = ConfigData.solverThread;
ConfigData.solverThread = null;
moribund.interrupt();
}
_observer.NotifyStop();
}
});
return button;
}
private FloatingImageButton CreateStrategyButton(){
FloatingImageButton button = CreateButton(
RADIUS, 0,
Constants.IdStringMap.get(ConfigData.StyleName) + "_Button");
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
current.Strategy();
}
});
return button;
}
private FloatingLinearLayout CreateStrategyHorizontalScrollView(){
FloatingLinearLayout layout = new FloatingLinearLayout(_context);
WindowManager.LayoutParams wmParams = layout.getLayoutParams(
(int)Constants.LEFT_TOP_WIDGET_X,
(int)Constants.LEFT_TOP_WIDGET_Y);
HorizontalScrollView scrollView = new HorizontalScrollView(_context);
scrollView.addView(getStrategyLinearLayout());
layout.addView(scrollView);
_wm.addView(layout, wmParams);
layout.setVisibility(View.INVISIBLE);
return layout;
}
private LinearLayout getStrategyLinearLayout() {
LinearLayout layout = new LinearLayout(_context);
Integer[] styleList = weightMap.getInstance().getStyleList();
for (int i = 0; i < styleList.length; i++) {
layout.addView(getImageButton(styleList[i]));
}
return layout;
}
private ImageButton getImageButton(Integer styleName) {
StrategyImageButton button = new StrategyImageButton(_context);
button.setId(styleName);
button.setUpImage(styleName, imageButtonRatio);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
ConfigData.StyleName = view.getId();
_floatStrategyButton.setUpImage(
Constants.IdStringMap.get(ConfigData.StyleName) + "_Button",
imageButtonRatio);
current.Setting();
}
});
return button;
}
private FloatingImageButton CreateSettingButton(){
FloatingImageButton button = CreateButton(
(int)Constants.LEFT_TOP_WIDGET_X,
(int)Constants.LEFT_TOP_WIDGET_Y, "setting");
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
if (current == initPage){
current.Setting();
}else{
current.Init();
}
}
});
return button;
}
private FloatingImageButton CreateVariableButton(){
FloatingImageButton button = CreateButton((int)Constants.LEFT_TOP_WIDGET_X, RADIUS, "variable");
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
current.Variable();
}
});
return button;
}
private FloatingSeekBar CreateStepSeekBar(final FloatingTextView text){
final FloatingSeekBar seekBar = CreateSeekBar(
(int)(WIDTH * Constants.STEP_SEEK_BAR_X),
(int)(HEIGHT * Constants.STEP_SEEK_BAR_Y));
seekBar.setMax(Constants.STEP_SEEK_BAR_MAX);
seekBar.setProgress(ConfigData.deep);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar arg0) {
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {
}
@Override
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
text.setText(String.valueOf(seekBar.getProgress()));
ConfigData.deep = seekBar.getProgress();
}
});
return seekBar;
}
private FloatingTextView CreateStepTextView(){
FloatingTextView text = CreateTextView(
(int)(WIDTH * Constants.SEEK_BAR_TEXT_X),
(int)(HEIGHT * Constants.STEP_SEEK_BAR_Y));
text.setText(String.valueOf(ConfigData.deep));
return text;
}
private FloatingSeekBar CreateComboSeekBar(final FloatingTextView text){
final FloatingSeekBar seekBar = CreateSeekBar(
(int)(WIDTH * Constants.COMBO_SEEK_BAR_X),
(int)(HEIGHT * Constants.COMBO_SEEK_BAR_Y));
seekBar.setMax(Constants.COMBO_SEEK_BAR_MAX);
seekBar.setProgress(Integer.parseInt(ConfigData.maxCombo));
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar arg0) {
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {
}
@Override
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
text.setText(String.valueOf(seekBar.getProgress()));
ConfigData.maxCombo = String.valueOf(seekBar.getProgress());
}
});
return seekBar;
}
private FloatingTextView CreateComboTextView(){
FloatingTextView text = CreateTextView(
(int)(WIDTH * Constants.SEEK_BAR_TEXT_X),
(int)(HEIGHT * Constants.COMBO_SEEK_BAR_Y));
text.setText(ConfigData.maxCombo);
return text;
}
private FloatingImageButton CreateReturnButton(){
FloatingImageButton button = CreateButton(
(int)Constants.LEFT_TOP_WIDGET_X,
(int)Constants.LEFT_TOP_WIDGET_Y, "return");
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
current.Setting();
}
});
return button;
}
private double CalcRatio(){
double ratioX = (double)WIDTH / (double)Constants.STANDARD_X;
double ratioY = (double)HEIGHT / (double)Constants.STANDARD_Y;
if (ratioX > ratioY)
return ratioY;
else
return ratioX;
}
public void StartFloatingUI(){
current.Init();
}
public void StopFloatingUI(){
for(View v : _views) {
v.setVisibility(View.INVISIBLE);
}
current = initPage;
}
private FloatingSeekBar CreateSeekBar(int x, int y){
FloatingSeekBar seekBar = new FloatingSeekBar(_context);
WindowManager.LayoutParams wmParams = seekBar.getLayoutParams(x, y);
wmParams.width = (int)(WIDTH * Constants.SEEK_BAR_WIDTH);
_wm.addView(seekBar, wmParams);
seekBar.setVisibility(View.INVISIBLE);
return seekBar;
}
private FloatingTextView CreateTextView(int x, int y){
FloatingTextView textView = new FloatingTextView(_context);
textView.setTextSize(Constants.SEEK_BAR_TEXT_SIZE);
textView.setTypeface(null, Typeface.BOLD);
WindowManager.LayoutParams wmParams = textView.getLayoutParams(x, y);
_wm.addView(textView, wmParams);
textView.setVisibility(View.INVISIBLE);
return textView;
}
private FloatingImageButton CreateButton(int x, int y, String filename){
FloatingImageButton button = new FloatingImageButton(_context);
button.setUpImage(filename, imageButtonRatio);
WindowManager.LayoutParams wmParams = button.getLayoutParams(x, y);
_wm.addView(button, wmParams);
button.setVisibility(View.INVISIBLE);
return button;
}
}