/* * Copyright (C) 2013 jonas.oreland@gmail.com * * This program 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, either version 3 of the License, or * (at your option) any later version. * * This program 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 this program. If not, see <http://www.gnu.org/licenses/>. */ package org.runnerup.view; import android.annotation.TargetApi; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.util.Pair; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.EditText; import android.widget.TableLayout; import android.widget.TableRow; import android.widget.TextView; import org.runnerup.R; import org.runnerup.common.util.Constants; import org.runnerup.util.HRZoneCalculator; import org.runnerup.util.HRZones; import org.runnerup.widget.TitleSpinner; import org.runnerup.widget.WidgetUtil; import java.util.Vector; @TargetApi(Build.VERSION_CODES.FROYO) public class HRZonesActivity extends AppCompatActivity implements Constants { TitleSpinner ageSpinner; TitleSpinner sexSpinner; TitleSpinner maxHRSpinner; HRZones hrZones; HRZoneCalculator hrZoneCalculator; final Vector<EditText> zones = new Vector<EditText>(); boolean skipSave = false; View addZoneRow(LayoutInflater inflator, ViewGroup root, int zone) { TableRow row = (TableRow) inflator.inflate(R.layout.heartratezonerow, null); TextView tv = (TextView) row.findViewById(R.id.zonetext); EditText lo = (EditText) row.findViewById(R.id.zonelo); EditText hi = (EditText) row.findViewById(R.id.zonehi); Pair<Integer, Integer> lim = hrZoneCalculator.getZoneLimits(zone); tv.setText(getString(R.string.Zone) + " " + zone + " " + lim.first + "% - " + lim.second + "%"); lo.setTag("zone" + zone + "lo"); hi.setTag("zone" + zone + "hi"); zones.add(lo); zones.add(hi); return row; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.heartratezones); WidgetUtil.addLegacyOverflowButton(getWindow()); hrZones = new HRZones(this); hrZoneCalculator = new HRZoneCalculator(this); ageSpinner = (TitleSpinner) findViewById(R.id.hrz_age); sexSpinner = (TitleSpinner) findViewById(R.id.hrz_sex); maxHRSpinner = (TitleSpinner) findViewById(R.id.hrz_mhr); TableLayout zonesTable = (TableLayout) findViewById(R.id.zones_table); { int zoneCount = hrZoneCalculator.getZoneCount(); LayoutInflater inflator = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); zones.clear(); for (int i = 0; i < zoneCount; i++) { View row = addZoneRow(inflator, zonesTable, i + 1); zonesTable.addView(row); } } ageSpinner.setOnCloseDialogListener(new TitleSpinner.OnCloseDialogListener() { @Override public void onClose(TitleSpinner spinner, boolean ok) { if (ok) { recomputeMaxHR(); } } }); sexSpinner.setOnCloseDialogListener(new TitleSpinner.OnCloseDialogListener() { @Override public void onClose(TitleSpinner spinner, boolean ok) { if (ok) { recomputeMaxHR(); } } }); maxHRSpinner.setOnCloseDialogListener(new TitleSpinner.OnCloseDialogListener() { @Override public void onClose(TitleSpinner spinner, boolean ok) { if (ok) { recomputeZones(); } } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.hrzonessettings_menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_hrzonessettings_clear: clearHRSettings(); break; } return true; } @Override protected void onResume() { super.onResume(); if (hrZones.isConfigured()) { load(); } else { recomputeZones(); } } private void load() { for (int zone = 0; zone < zones.size() / 2; zone++) { Pair<Integer, Integer> values = hrZones.getHRValues(zone + 1); if (values != null) { EditText lo = zones.get(2 * zone + 0); EditText hi = zones.get(2 * zone + 1); lo.setText(Integer.toString(values.first)); hi.setText(Integer.toString(values.second)); Log.e(getClass().getName(), "loaded " + (zone + 1) + " " + values.first + "-" + values.second); } } } protected void recomputeMaxHR() { new Handler().post(new Runnable() { @Override public void run() { try { int age = Integer.parseInt(ageSpinner.getValue().toString()); int maxHR = HRZoneCalculator.computeMaxHR(age, "Male".contentEquals(sexSpinner.getValue())); maxHRSpinner.setValue(Integer.toString(maxHR)); recomputeZones(); } catch (NumberFormatException ex) { } } }); } protected void recomputeZones() { new Handler().post(new Runnable() { @Override public void run() { try { int zoneCount = hrZoneCalculator.getZoneCount(); int maxHR = Integer.parseInt(maxHRSpinner.getValue().toString()); for (int i = 0; i < zoneCount; i++) { Pair<Integer, Integer> val = hrZoneCalculator.computeHRZone(i + 1, maxHR); zones.get(2 * i + 0).setText(Integer.toString(val.first)); zones.get(2 * i + 1).setText(Integer.toString(val.second)); } } catch (NumberFormatException ex) { } } }); } protected void saveHR() { try { Vector<Integer> vals = new Vector<Integer>(); System.err.print("saving: "); for (int i = 0; i < zones.size(); i += 2) { vals.add(Integer.valueOf(zones.get(i).getText().toString())); System.err.print(" " + vals.lastElement()); } vals.add(Integer.valueOf(zones.lastElement().getText().toString())); Log.e(getClass().getName(), " " + vals.lastElement()); hrZones.save(vals); } catch (Exception ex) { } } void clearHRSettings() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(getString(R.string.Clear_heart_rate_zone_settings)); builder.setMessage(getString(R.string.Are_you_sure)); builder.setPositiveButton(getString(R.string.OK), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { ageSpinner.clear(); sexSpinner.clear(); maxHRSpinner.clear(); hrZones.clear(); dialog.dismiss(); skipSave = true; finish(); } }); builder.setNegativeButton(getString(R.string.Cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // Do nothing but close the dialog dialog.dismiss(); } }); builder.show(); } @Override protected void onPause() { if (!skipSave) { saveHR(); } skipSave = false; super.onPause(); } @Override public void onDestroy() { super.onDestroy(); } }