lenidh.android.holochron.ui.MainActivity.java Source code

Java tutorial

Introduction

Here is the source code for lenidh.android.holochron.ui.MainActivity.java

Source

/*
 * Copyright (C) 2013 Moritz Heindl <lenidh[at]gmail[dot]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 lenidh.android.holochron.ui;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.view.ViewPager;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import de.lenidh.libzeitmesser.stopwatch.Display;
import lenidh.android.holochron.App;
import lenidh.android.holochron.R;
import lenidh.android.holochron.adapters.ElapsedTimeLapAdapter;
import lenidh.android.holochron.adapters.LapAdapter;
import lenidh.android.holochron.adapters.LapPagerAdapter;
import lenidh.android.holochron.adapters.LapTimeLapAdapter;
import lenidh.android.holochron.controls.DigitalDisplay;
import lenidh.android.holochron.services.WatchService;

import java.util.ArrayList;

public class MainActivity extends SherlockFragmentActivity
        implements Display, SharedPreferences.OnSharedPreferenceChangeListener, ViewPager.OnPageChangeListener {

    private Button btnState;
    private Button btnExtra;
    private DigitalDisplay display;
    private ViewPager lapPager;
    private LapAdapter elapsedTimeArrayAdapter;
    private LapAdapter lapTimeArrayAdapter;
    private LapListFragment lapTimeListFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // Theme needs to be selected before super.onCreate.
        if (App.getThemePreference().equals(getString(R.string.pref_value_theme_dark))
                || App.getThemePreference().equals(getString(R.string.pref_value_theme_classic))) {
            setTheme(R.style.AppTheme_Dark);
        }

        super.onCreate(savedInstanceState);

        if (App.getThemePreference().equals(getString(R.string.pref_value_theme_classic))) {
            setContentView(R.layout.activity_main_classic);
        } else {
            setContentView(R.layout.activity_main);
        }

        /* state button */

        this.btnState = (Button) this.findViewById(R.id.btnState);
        this.btnState.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                onStartStop();
            }
        });

        /* extra button */

        this.btnExtra = (Button) this.findViewById(R.id.btnExtra);
        this.btnExtra.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                onResetRecord();
            }
        });

        // Configure dark theme.
        if (App.getThemePreference().equals(getString(R.string.pref_value_theme_dark))) {
            LinearLayout tile = (LinearLayout) this.findViewById(R.id.tile);
            View hView = this.findViewById(R.id.hSeparator);
            View vView = this.findViewById(R.id.vSeparator);
            View landSeparator = this.findViewById(R.id.landSeparator);

            tile.setBackgroundResource(R.drawable.tile_shape_dark);
            hView.setBackgroundResource(R.color.watch_button_separator_color_dark);
            vView.setBackgroundResource(R.color.watch_button_separator_color_dark);
            if (landSeparator != null)
                landSeparator.setBackgroundResource(android.R.color.white);
            this.btnState.setTextColor(getResources().getColor(android.R.color.white));
            this.btnExtra.setTextColor(getResources().getColor(android.R.color.white));
        }

        /* display */

        this.display = (DigitalDisplay) this.findViewById(R.id.digitalDisplay1);

        /* elapsed time Adapter */

        this.elapsedTimeArrayAdapter = new ElapsedTimeLapAdapter(this, App.getWatch().getLapContainer());

        /* lap time Adapter */

        LapTimeLapAdapter.SortOrder sortOrder = this.getLapTimeMode();
        this.lapTimeArrayAdapter = new LapTimeLapAdapter(this, App.getWatch().getLapContainer(), sortOrder);

        /* lap pages */

        // Find pager view.
        this.lapPager = (ViewPager) this.findViewById(R.id.lapPager);
        this.lapPager.setOnPageChangeListener(this);
        ArrayList<LapListFragment> pages = new ArrayList<LapListFragment>();

        // Check if page was already created and create page if necessary.
        LapListFragment elapsedTimeListFragment = (LapListFragment) getSupportFragmentManager()
                .findFragmentByTag("android:switcher:" + lapPager.getId() + ":0");
        if (elapsedTimeListFragment == null)
            elapsedTimeListFragment = new LapListFragment();
        elapsedTimeListFragment.setListAdapter(this.elapsedTimeArrayAdapter);
        pages.add(elapsedTimeListFragment);

        // Check if page was already created and create page if necessary.
        this.lapTimeListFragment = (LapListFragment) getSupportFragmentManager()
                .findFragmentByTag("android:switcher:" + lapPager.getId() + ":1");
        if (lapTimeListFragment == null)
            this.lapTimeListFragment = new LapListFragment();
        this.lapTimeListFragment.setListAdapter(this.lapTimeArrayAdapter);
        pages.add(this.lapTimeListFragment);

        // Create the page adapter.
        LapPagerAdapter lapPagerAdapter = new LapPagerAdapter(getSupportFragmentManager());
        lapPagerAdapter.setPages(pages);

        // Add page adapter to pager.
        this.lapPager.setAdapter(lapPagerAdapter);
    }

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

        updateTime();
        updateLaps();
        updateState();
        App.getWatch().addDisplay(this);
    }

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

        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        preferences.registerOnSharedPreferenceChangeListener(this);

        Intent intent = new Intent(this, WatchService.class);
        stopService(intent);
    }

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

        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        preferences.unregisterOnSharedPreferenceChangeListener(this);

        // Keep watch alive by running service.
        if (App.getWatch().getElapsedTime() > 0) {
            Intent intent = new Intent(this, WatchService.class);
            startService(intent);
        }
    }

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

        App.getWatch().removeDisplay(this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        this.getSupportMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        MenuItem sortItem = menu.findItem(R.id.menu_item_order);

        if (this.lapPager.getCurrentItem() == 1 && App.getWatch().getLapContainer().size() >= 2) {
            sortItem.setVisible(true);

            SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
            boolean lapByNumberPref = preferences.getBoolean(this.getString(R.string.pref_key_lap_by_number),
                    false);
            if (lapByNumberPref) {
                sortItem.setTitle(this.getString(R.string.pref_sort_by_lap_time));
            } else {
                sortItem.setTitle(this.getString(R.string.pref_sort_by_number));
            }
        } else {
            sortItem.setVisible(false);
        }

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.menu_item_settings:
            this.startActivity(new Intent(this, SettingsActivity.class));
            return true;
        case R.id.menu_item_about:
            this.startActivity(new Intent(this, AboutActivity.class));
            return true;
        case R.id.menu_item_order:
            SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
            boolean lapByNumberPref = preferences.getBoolean(this.getString(R.string.pref_key_lap_by_number),
                    false);
            SharedPreferences.Editor editor = preferences.edit();
            editor.putBoolean(this.getString(R.string.pref_key_lap_by_number), !lapByNumberPref);
            editor.commit();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        App.updateThemePreference();
        finish();
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
        case KeyEvent.KEYCODE_VOLUME_DOWN:
            this.onVolumeDown();
            return true;
        case KeyEvent.KEYCODE_VOLUME_UP:
            this.onVolumeUp();
            return true;
        }

        return super.onKeyDown(keyCode, event);
    }

    @Override
    public void updateTime() {
        this.runOnUiThread(new Runnable() {

            @Override
            public void run() {
                display.setTime(App.getWatch().getElapsedTime());
            }
        });
    }

    @Override
    public void updateState() {
        this.runOnUiThread(new Runnable() {

            @Override
            public void run() {
                if (App.getWatch().isRunning()) {
                    btnState.setText(R.string.stop);
                    btnExtra.setText(R.string.lap);
                } else {
                    btnState.setText(R.string.start);
                    btnExtra.setText(R.string.reset);
                }
            }
        });
    }

    @Override
    public void updateLaps() {
        this.lapTimeArrayAdapter.notifyDataSetChanged();
        this.elapsedTimeArrayAdapter.notifyDataSetChanged();
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        if (this.getString(R.string.pref_key_lap_by_number).equals(key)) {
            this.invalidateOptionsMenu();

            LapTimeLapAdapter.SortOrder sortOrder = this.getLapTimeMode();
            this.lapTimeArrayAdapter = new LapTimeLapAdapter(this, App.getWatch().getLapContainer(), sortOrder);
            this.lapTimeListFragment.setListAdapter(this.lapTimeArrayAdapter);
        }
    }

    private LapTimeLapAdapter.SortOrder getLapTimeMode() {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        boolean byNumber = preferences.getBoolean(this.getString(R.string.pref_key_lap_by_number), false);
        return (byNumber) ? LapTimeLapAdapter.SortOrder.SORT_BY_NUMBER : LapTimeLapAdapter.SortOrder.SORT_BY_TIME;
    }

    @Override
    public void onPageScrolled(int i, float v, int i2) {
    }

    @Override
    public void onPageSelected(int i) {
        this.invalidateOptionsMenu();
    }

    @Override
    public void onPageScrollStateChanged(int i) {
    }

    private void onStartStop() {
        if (App.getWatch().isRunning()) {
            App.getWatch().stop();
        } else {
            App.getWatch().start();
        }
    }

    private void onResetRecord() {
        if (App.getWatch().isRunning()) {
            App.getWatch().record();
            if (App.getWatch().getLapContainer().size() == 2)
                invalidateOptionsMenu();
        } else {
            App.getWatch().reset();
            this.invalidateOptionsMenu();
        }
    }

    private void onVolumeDown() {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        String volumeKeyPref = preferences.getString(this.getString(R.string.pref_key_volume_buttons),
                this.getString(R.string.pref_value_volume_buttons_ignore));

        if (this.getString(R.string.pref_value_volume_buttons_use).equals(volumeKeyPref)) {
            this.onResetRecord();
        } else if (this.getString(R.string.pref_value_volume_buttons_inverse).equals(volumeKeyPref)) {
            this.onStartStop();
        }
    }

    private void onVolumeUp() {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        String volumeKeyPref = preferences.getString(this.getString(R.string.pref_key_volume_buttons),
                this.getString(R.string.pref_value_volume_buttons_ignore));

        if (this.getString(R.string.pref_value_volume_buttons_use).equals(volumeKeyPref)) {
            this.onStartStop();
        } else if (this.getString(R.string.pref_value_volume_buttons_inverse).equals(volumeKeyPref)) {
            this.onResetRecord();
        }
    }
}