From ca887bdb21d18a1d80abb488fc8d280c162b4612 Mon Sep 17 00:00:00 2001 From: y20k Date: Tue, 28 Nov 2017 22:02:45 +0100 Subject: [PATCH] ui refresh - part 1 --- app/build.gradle | 2 + app/src/main/AndroidManifest.xml | 21 +- .../org/y20k/trackbook/InfosheetActivity.java | 52 --- .../java/org/y20k/trackbook/MainActivity.java | 403 ++++++++---------- .../trackbook/MainActivityMapFragment.java | 114 +++-- .../trackbook/MainActivityTrackFragment.java | 6 + .../y20k/trackbook/helpers/TrackbookKeys.java | 6 +- .../drawable/ic_compass_needle_black_24dp.xml | 9 + .../drawable/ic_delete_forever_grey_24dp.xml | 9 + .../drawable/ic_file_download_grey_24dp.xml | 9 + .../main/res/drawable/ic_info_grey_24dp.xml | 9 + ..._24dp.xml => ic_my_location_grey_24dp.xml} | 2 +- .../res/drawable/ic_notebook_black_24dp.xml | 12 + .../drawable/selector_bottom_navigation.xml | 5 + .../res/layout/activity_infosheet_about.xml | 144 ------- app/src/main/res/layout/activity_main.xml | 177 ++++++-- .../layout/custom_dropdown_item_collapsed.xml | 4 +- .../layout/custom_dropdown_item_expanded.xml | 6 +- .../res/layout/floating_action_button.xml | 132 ------ .../main/res/layout/fragment_main_track.xml | 36 +- app/src/main/res/menu/menu_main.xml | 22 +- app/src/main/res/values-de/strings.xml | 6 +- app/src/main/res/values-v21/styles.xml | 9 - app/src/main/res/values-v23/styles.xml | 29 ++ app/src/main/res/values/colors.xml | 4 + app/src/main/res/values/strings.xml | 6 +- app/src/main/res/values/styles.xml | 24 +- build.gradle | 7 +- 28 files changed, 529 insertions(+), 736 deletions(-) delete mode 100644 app/src/main/java/org/y20k/trackbook/InfosheetActivity.java create mode 100644 app/src/main/res/drawable/ic_compass_needle_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_delete_forever_grey_24dp.xml create mode 100644 app/src/main/res/drawable/ic_file_download_grey_24dp.xml create mode 100644 app/src/main/res/drawable/ic_info_grey_24dp.xml rename app/src/main/res/drawable/{ic_my_location_white_24dp.xml => ic_my_location_grey_24dp.xml} (91%) create mode 100644 app/src/main/res/drawable/ic_notebook_black_24dp.xml create mode 100644 app/src/main/res/drawable/selector_bottom_navigation.xml delete mode 100644 app/src/main/res/layout/activity_infosheet_about.xml delete mode 100644 app/src/main/res/layout/floating_action_button.xml delete mode 100644 app/src/main/res/values-v21/styles.xml create mode 100644 app/src/main/res/values-v23/styles.xml diff --git a/app/build.gradle b/app/build.gradle index 55e1bce..6294b7b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,6 +17,7 @@ android { buildTypes { release { minifyEnabled true + shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } @@ -27,6 +28,7 @@ dependencies { compile 'com.android.support:appcompat-v7:' + supportLibraryVersion compile 'com.android.support:design:' + supportLibraryVersion compile 'com.android.support:cardview-v7:' + supportLibraryVersion + compile 'com.android.support.constraint:constraint-layout:' + constraintLayoutVersion compile 'org.osmdroid:osmdroid-android:' + osmdroidVersion compile 'com.google.code.gson:gson:' + gsonVersion } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index bb50bd7..35853c6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,7 +24,7 @@ @@ -34,24 +34,7 @@ - - - - - - - - - - - + diff --git a/app/src/main/java/org/y20k/trackbook/InfosheetActivity.java b/app/src/main/java/org/y20k/trackbook/InfosheetActivity.java deleted file mode 100644 index 6136ba8..0000000 --- a/app/src/main/java/org/y20k/trackbook/InfosheetActivity.java +++ /dev/null @@ -1,52 +0,0 @@ -/** - * InfosheetActivity.java - * Implements the app's infosheet activity - * The infosheet activity sets up infosheet screens for "About" - * - * This file is part of - * TRACKBOOK - Movement Recorder for Android - * - * Copyright (c) 2016-17 - Y20K.org - * Licensed under the MIT-License - * http://opensource.org/licenses/MIT - * - * Trackbook uses osmdroid - OpenStreetMap-Tools for Android - * https://github.com/osmdroid/osmdroid - */ - - -package org.y20k.trackbook; - -import android.content.Intent; -import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; - -import org.y20k.trackbook.helpers.TrackbookKeys; - - -/** - * InfosheetActivity class - */ -public final class InfosheetActivity extends AppCompatActivity implements TrackbookKeys { - - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - // get activity title from intent - Intent intent = this.getIntent(); - - // set activity title - if (intent.hasExtra(EXTRA_INFOSHEET_TITLE)) { - this.setTitle(intent.getStringExtra(EXTRA_INFOSHEET_TITLE)); - } - - // set activity view - if (intent.hasExtra(EXTRA_INFOSHEET_CONTENT) && intent.getIntExtra(EXTRA_INFOSHEET_CONTENT, -1) == INFOSHEET_CONTENT_ABOUT) { - setContentView(R.layout.activity_infosheet_about); - } - - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/y20k/trackbook/MainActivity.java b/app/src/main/java/org/y20k/trackbook/MainActivity.java index 2d57d8d..789575a 100644 --- a/app/src/main/java/org/y20k/trackbook/MainActivity.java +++ b/app/src/main/java/org/y20k/trackbook/MainActivity.java @@ -1,7 +1,7 @@ /** * MainActivity.java * Implements the app's main activity - * The main activity sets up the main view end inflates a menu bar menu + * The main activity sets up the main view * * This file is part of * TRACKBOOK - Movement Recorder for Android @@ -31,33 +31,24 @@ import android.os.Bundle; import android.os.Environment; import android.preference.PreferenceManager; import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import android.support.design.widget.BottomNavigationView; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; -import android.support.design.widget.TabLayout; import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.content.ContextCompat; import android.support.v4.content.LocalBroadcastManager; import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; -import android.util.SparseArray; -import android.view.Menu; +import android.support.v7.widget.CardView; import android.view.MenuItem; import android.view.View; -import android.view.ViewGroup; import android.widget.Button; -import android.widget.LinearLayout; import android.widget.Toast; import org.y20k.trackbook.helpers.DialogHelper; import org.y20k.trackbook.helpers.LogHelper; import org.y20k.trackbook.helpers.TrackbookKeys; -import org.y20k.trackbook.layout.NonSwipeableViewPager; -import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -74,15 +65,17 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys { /* Main class variables */ - private SectionsPagerAdapter mSectionsPagerAdapter; - private NonSwipeableViewPager mViewPager; + private BottomNavigationView mBottomNavigationView; private boolean mTrackerServiceRunning; private boolean mPermissionsGranted; private boolean mFloatingActionButtonSubMenuVisible; private List mMissingPermissions; - private FloatingActionButton mFloatingActionButton; - private LinearLayout mFloatingActionButtonSubMenu1; - private LinearLayout mFloatingActionButtonSubMenu2; + private FloatingActionButton mFloatingActionButtonMain; + private FloatingActionButton mFloatingActionButtonSubSave; + private FloatingActionButton mFloatingActionButtonSubClear; + private FloatingActionButton mFloatingActionButtonLocation; + private CardView mFloatingActionButtonSubSaveLabel; + private CardView mFloatingActionButtonSubClearLabel; private BroadcastReceiver mTrackingStoppedReceiver; private int mFloatingActionButtonState; private int mSelectedTab; @@ -129,47 +122,6 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys { } - @Override - public boolean onCreateOptionsMenu(Menu menu) { - // inflate action bar options menu - getMenuInflater().inflate(R.menu.menu_main, menu); - return true; - } - - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - - // handle action bar options menu selection - switch (item.getItemId()) { - - // CASE ABOUT - case R.id.action_bar_about: - // get title - String aboutTitle = getString(R.string.header_about); - // put title and content into intent and start activity - Intent aboutIntent = new Intent(this, InfosheetActivity.class); - aboutIntent.putExtra(EXTRA_INFOSHEET_TITLE, aboutTitle); - aboutIntent.putExtra(EXTRA_INFOSHEET_CONTENT, INFOSHEET_CONTENT_ABOUT); - startActivity(aboutIntent); - return true; - - // CASE MY LOCATION - case R.id.action_bar_my_location: - if (mSelectedTab != FRAGMENT_ID_MAP) { - // show map fragment - mSelectedTab = FRAGMENT_ID_MAP; - mViewPager.setCurrentItem(mSelectedTab); - } - return false; - - // CASE DEFAULT - default: - return super.onOptionsItemSelected(item); - } - } - - @Override protected void onResume() { super.onResume(); @@ -181,7 +133,7 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys { handleIncomingIntent(); // if not in onboarding mode: set state of FloatingActionButton - if (mFloatingActionButton != null) { + if (mFloatingActionButtonMain != null) { setFloatingActionButtonState(); } } @@ -286,8 +238,7 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys { /* Handles the visual state after a save action */ private void handleStateAfterSave() { // display and update track tab - mSelectedTab = FRAGMENT_ID_TRACK; - mViewPager.setCurrentItem(mSelectedTab); + mSelectedTab = FRAGMENT_ID_TRACKS; // dismiss notification Intent intent = new Intent(this, TrackerService.class); @@ -344,57 +295,17 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys { // point to the main map layout setContentView(R.layout.activity_main); - // show action bar - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); - setSupportActionBar(toolbar); - - // create adapter that returns fragments for the maim map and the last track display - mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); - - // Set up the ViewPager with the sections adapter. - mViewPager = (NonSwipeableViewPager) findViewById(R.id.container); - mViewPager.setAdapter(mSectionsPagerAdapter); - mViewPager.setCurrentItem(mSelectedTab); - - TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); - tabLayout.setupWithViewPager(mViewPager); - tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { - @Override - public void onTabSelected(TabLayout.Tab tab) { - switch (tab.getPosition()) { - case FRAGMENT_ID_MAP: - // show the Floating Action Button - mFloatingActionButton.show(); - mSelectedTab = FRAGMENT_ID_MAP; - break; - case FRAGMENT_ID_TRACK: - // hide the Floating Action Button - and its sub menu - mFloatingActionButton.hide(); - showFloatingActionButtonMenu(false); - mSelectedTab = FRAGMENT_ID_TRACK; - break; - default: - // show the Floating Action Button - mFloatingActionButton.show(); - break; - } - } - - @Override - public void onTabUnselected(TabLayout.Tab tab) { - - } - - @Override - public void onTabReselected(TabLayout.Tab tab) { - - } - }); + // setup bottom navigation + mBottomNavigationView = findViewById(R.id.navigation); + mBottomNavigationView.setOnNavigationItemSelectedListener(getOnNavigationItemSelectedListener()); // get references to the record button and show/hide its sub menu - mFloatingActionButton = (FloatingActionButton) findViewById(R.id.fabMainButton); - mFloatingActionButtonSubMenu1 = (LinearLayout) findViewById(R.id.fabSubMenu1); - mFloatingActionButtonSubMenu2 = (LinearLayout) findViewById(R.id.fabSubMenu2); + mFloatingActionButtonMain = findViewById(R.id.fabMainButton); + mFloatingActionButtonLocation = findViewById(R.id.fabLLcationButton); + mFloatingActionButtonSubSave = findViewById(R.id.fabSubMenuButtonSave); + mFloatingActionButtonSubSaveLabel = findViewById(R.id.fabSubMenuLabelSave); + mFloatingActionButtonSubClear = findViewById(R.id.fabSubMenuButtonClear); + mFloatingActionButtonSubClearLabel = findViewById(R.id.fabSubMenuLabelClear); if (mFloatingActionButtonSubMenuVisible) { showFloatingActionButtonMenu(true); } else { @@ -402,42 +313,58 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys { } // add listeners to button and submenu - if (mFloatingActionButton != null) { - mFloatingActionButton.setOnClickListener(new View.OnClickListener() { + if (mFloatingActionButtonMain != null) { + mFloatingActionButtonMain.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { handleFloatingActionButtonClick(view); } }); } - if (mFloatingActionButtonSubMenu1 != null) { - mFloatingActionButtonSubMenu1.setOnClickListener(new View.OnClickListener() { + if (mFloatingActionButtonSubSave != null) { + mFloatingActionButtonSubSave.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - // todo check -> may produce NullPointerException - MainActivityMapFragment mainActivityMapFragment = (MainActivityMapFragment) mSectionsPagerAdapter.getFragment(FRAGMENT_ID_MAP); - mainActivityMapFragment.onActivityResult(RESULT_SAVE_DIALOG, Activity.RESULT_OK, getIntent()); - handleStateAfterSave(); + handleSaveButtonClick(); } }); } - if (mFloatingActionButtonSubMenu2 != null) { - mFloatingActionButtonSubMenu2.setOnClickListener(new View.OnClickListener() { + if (mFloatingActionButtonSubSaveLabel != null) { + mFloatingActionButtonSubSaveLabel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - int dialogTitle = -1; - String dialogMessage = getString(R.string.dialog_clear_content); - int dialogPositiveButton = R.string.dialog_clear_action_clear; - int dialogNegativeButton = R.string.dialog_default_action_cancel; + handleSaveButtonClick(); + } + }); + } + if (mFloatingActionButtonSubClear != null) { + mFloatingActionButtonSubClear.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + handleClearButtonClick(); + } + }); + } + if (mFloatingActionButtonSubClearLabel != null) { + mFloatingActionButtonSubClearLabel.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + handleClearButtonClick(); + } + }); + } + if (mFloatingActionButtonLocation != null) { + mFloatingActionButtonLocation.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + MainActivityMapFragment mainActivityMapFragment = (MainActivityMapFragment) getFragmentFromTag(FRAGMENT_TAG_MAP); + mainActivityMapFragment.handleShowMyLocation(); + } + }); + } - // show delete dialog - results are handles by onActivityResult - MainActivityMapFragment mainActivityMapFragment = (MainActivityMapFragment) mSectionsPagerAdapter.getFragment(FRAGMENT_ID_MAP); - DialogFragment dialogFragment = DialogHelper.newInstance(dialogTitle, dialogMessage, dialogPositiveButton, dialogNegativeButton); - dialogFragment.setTargetFragment(mainActivityMapFragment, RESULT_CLEAR_DIALOG); - dialogFragment.show(getSupportFragmentManager(), "ClearDialog"); - } - }); - } + // show map fragment + showFragment(FRAGMENT_ID_MAP); } else { // point to the on main onboarding layout @@ -462,6 +389,30 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys { } + /* Handles tap on the button "save and clear" */ + private void handleSaveButtonClick() { + // todo check -> may produce NullPointerException + MainActivityMapFragment mainActivityMapFragment = (MainActivityMapFragment) getFragmentFromTag(FRAGMENT_TAG_MAP); + mainActivityMapFragment.onActivityResult(RESULT_SAVE_DIALOG, Activity.RESULT_OK, getIntent()); + handleStateAfterSave(); + } + + + /* Handles tap on the button "clear" */ + private void handleClearButtonClick() { + int dialogTitle = -1; + String dialogMessage = getString(R.string.dialog_clear_content); + int dialogPositiveButton = R.string.dialog_clear_action_clear; + int dialogNegativeButton = R.string.dialog_default_action_cancel; + + // show delete dialog - results are handles by onActivityResult + MainActivityMapFragment mainActivityMapFragment = (MainActivityMapFragment) getFragmentFromTag(FRAGMENT_TAG_MAP); + DialogFragment dialogFragment = DialogHelper.newInstance(dialogTitle, dialogMessage, dialogPositiveButton, dialogNegativeButton); + dialogFragment.setTargetFragment(mainActivityMapFragment, RESULT_CLEAR_DIALOG); + dialogFragment.show(getSupportFragmentManager(), "ClearDialog"); + } + + /* Handles tap on the record button */ private void handleFloatingActionButtonClick(View view) { @@ -476,7 +427,7 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys { setFloatingActionButtonState(); // get last location from MainActivity Fragment // todo check -> may produce NullPointerException - MainActivityMapFragment mainActivityMapFragment = (MainActivityMapFragment) mSectionsPagerAdapter.getFragment(FRAGMENT_ID_MAP); + MainActivityMapFragment mainActivityMapFragment = (MainActivityMapFragment) getFragmentFromTag(FRAGMENT_TAG_MAP); Location lastLocation = mainActivityMapFragment.getCurrentBestLocation(); if (lastLocation != null) { @@ -484,7 +435,6 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys { Intent intent = new Intent(this, TrackerService.class); intent.setAction(ACTION_START); intent.putExtra(EXTRA_LAST_LOCATION, lastLocation); -// startService(intent); if (Build.VERSION.SDK_INT == Build.VERSION_CODES.O) { startForegroundService(intent); } else { @@ -527,11 +477,12 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys { } // update tracking state in MainActivityMapFragment // todo check -> may produce NullPointerException - MainActivityMapFragment mainActivityMapFragment = (MainActivityMapFragment) mSectionsPagerAdapter.getFragment(FRAGMENT_ID_MAP); + MainActivityMapFragment mainActivityMapFragment = (MainActivityMapFragment) getFragmentFromTag(FRAGMENT_TAG_MAP); mainActivityMapFragment.setTrackingState(mTrackerServiceRunning); } + // /* Handles tap on the save and clear button */ // private void handleButtonSaveAndClearClick() { // // clear map and save track @@ -539,7 +490,7 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys { // mainActivityMapFragment.clearMap(true); // // // display and update track tab -// mSelectedTab = FRAGMENT_ID_TRACK; +// mSelectedTab = FRAGMENT_ID_TRACKS; // mViewPager.setCurrentItem(mSelectedTab); // // // dismiss notification @@ -579,16 +530,16 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys { switch (mFloatingActionButtonState) { case FAB_STATE_DEFAULT: - mFloatingActionButton.setImageResource(R.drawable.ic_fiber_manual_record_white_24dp); + mFloatingActionButtonMain.setImageResource(R.drawable.ic_fiber_manual_record_white_24dp); break; case FAB_STATE_RECORDING: - mFloatingActionButton.setImageResource(R.drawable.ic_fiber_manual_record_red_24dp); + mFloatingActionButtonMain.setImageResource(R.drawable.ic_fiber_manual_record_red_24dp); break; case FAB_STATE_SAVE: - mFloatingActionButton.setImageResource(R.drawable.ic_save_white_24dp); + mFloatingActionButtonMain.setImageResource(R.drawable.ic_save_white_24dp); break; default: - mFloatingActionButton.setImageResource(R.drawable.ic_fiber_manual_record_white_24dp); + mFloatingActionButtonMain.setImageResource(R.drawable.ic_fiber_manual_record_white_24dp); break; } } @@ -597,15 +548,103 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys { /* Shows (and hides) the sub menu of the floating action button */ private void showFloatingActionButtonMenu(boolean visible) { if (visible) { - mFloatingActionButtonSubMenu1.setVisibility(View.VISIBLE); - mFloatingActionButtonSubMenu2.setVisibility(View.VISIBLE); + mFloatingActionButtonSubClear.setVisibility(View.VISIBLE); + mFloatingActionButtonSubClearLabel.setVisibility(View.VISIBLE); + mFloatingActionButtonSubSave.setVisibility(View.VISIBLE); + mFloatingActionButtonSubSaveLabel.setVisibility(View.VISIBLE); mFloatingActionButtonSubMenuVisible = true; } else { - mFloatingActionButtonSubMenu1.setVisibility(View.INVISIBLE); - mFloatingActionButtonSubMenu2.setVisibility(View.INVISIBLE); + mFloatingActionButtonSubClear.setVisibility(View.INVISIBLE); + mFloatingActionButtonSubClearLabel.setVisibility(View.INVISIBLE); + mFloatingActionButtonSubSaveLabel.setVisibility(View.INVISIBLE); + mFloatingActionButtonSubSave.setVisibility(View.INVISIBLE); mFloatingActionButtonSubMenuVisible = false; } + } + + /* Show fragment for given position */ + private void showFragment(int pos) { + Fragment fragment = null; + String tag = null; + + // define tag + if (pos == FRAGMENT_ID_TRACKS) { + tag = FRAGMENT_TAG_TRACKS; + } else { + tag = FRAGMENT_TAG_MAP; + } + // get fragment + fragment = getFragmentFromTag(tag); + + // update selected tab + mSelectedTab = pos; + + // place fragment in container + getSupportFragmentManager().beginTransaction() + .replace(R.id.container, fragment, tag ) + .commit(); + } + + + /* Returns a fragment for a given tag - creates a new instance if necessary */ + private Fragment getFragmentFromTag(String tag) { + Fragment fragment = null; + fragment = getSupportFragmentManager().findFragmentByTag(tag); + + if (fragment != null) { + return fragment; + } else { + if (tag.equals(FRAGMENT_TAG_TRACKS)) { + fragment = MainActivityTrackFragment.newInstance(); + } else { + fragment = MainActivityMapFragment.newInstance(); + } + return fragment; + } + } + + + /* Handles taps on the bottom navigation */ + private BottomNavigationView.OnNavigationItemSelectedListener getOnNavigationItemSelectedListener() { + return new BottomNavigationView.OnNavigationItemSelectedListener() { + @Override + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_map: + // show the Floating Action Button + mFloatingActionButtonMain.show(); + + // show the my location button + mFloatingActionButtonLocation.show(); + + // show map fragment + mSelectedTab = FRAGMENT_ID_MAP; + showFragment(FRAGMENT_ID_MAP); + + return true; + + case R.id.navigation_last_tracks: + // hide the Floating Action Button - and its sub menu + mFloatingActionButtonMain.hide(); + showFloatingActionButtonMenu(false); + + // hide the my location button + mFloatingActionButtonLocation.hide(); + + // show tracks fragment + mSelectedTab = FRAGMENT_ID_TRACKS; + showFragment(FRAGMENT_ID_TRACKS); + + return true; + + default: + // show the Floating Action Button + mFloatingActionButtonMain.show(); + return false; + } + } + }; } @@ -618,7 +657,7 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys { case ACTION_SHOW_MAP: // show map fragment mSelectedTab = FRAGMENT_ID_MAP; - mViewPager.setCurrentItem(mSelectedTab); + mBottomNavigationView.setSelectedItemId(FRAGMENT_ID_MAP); // clear intent intent.setAction(ACTION_DEFAULT); @@ -662,7 +701,7 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys { setFloatingActionButtonState(); // pass tracking state to MainActivityMapFragment // todo check -> may produce NullPointerException - MainActivityMapFragment mainActivityMapFragment = (MainActivityMapFragment) mSectionsPagerAdapter.getFragment(FRAGMENT_ID_MAP); + MainActivityMapFragment mainActivityMapFragment = (MainActivityMapFragment) getFragmentFromTag(FRAGMENT_TAG_MAP); mainActivityMapFragment.setTrackingState(false); } }; @@ -685,76 +724,4 @@ public class MainActivity extends AppCompatActivity implements TrackbookKeys { } } - - - /** - * Inner class: SectionsPagerAdapter that returns a fragment corresponding to one of the tabs. - * see also: https://developer.android.com/reference/android/support/v4/app/FragmentPagerAdapter.html - * and: http://www.truiton.com/2015/12/android-activity-fragment-communication/ - */ - public class SectionsPagerAdapter extends FragmentPagerAdapter { - - private final SparseArray> instantiatedFragments = new SparseArray<>(); - - public SectionsPagerAdapter(FragmentManager fm) { - super(fm); - } - - @Override - public Fragment getItem(int position) { - // getItem is called to instantiate the fragment for the given page. - switch (position) { - case FRAGMENT_ID_MAP: - return new MainActivityMapFragment(); - case FRAGMENT_ID_TRACK: - return new MainActivityTrackFragment(); - } - return null; - } - - @Override - public int getCount() { - // Show 2 total pages. - return 2; - } - - @Override - public CharSequence getPageTitle(int position) { - switch (position) { - case FRAGMENT_ID_MAP: - return getString(R.string.tab_map); - case FRAGMENT_ID_TRACK: - return getString(R.string.tab_last_tracks); - } - return null; - } - - @Override - public Object instantiateItem(final ViewGroup container, final int position) { - final Fragment fragment = (Fragment) super.instantiateItem(container, position); - instantiatedFragments.put(position, new WeakReference<>(fragment)); - return fragment; - } - - @Override - public void destroyItem(final ViewGroup container, final int position, final Object object) { - instantiatedFragments.remove(position); - super.destroyItem(container, position, object); - } - - @Nullable - public Fragment getFragment(final int position) { - final WeakReference wr = instantiatedFragments.get(position); - if (wr != null) { - return wr.get(); - } else { - return null; - } - } - - } - /** - * End of inner class - */ - } diff --git a/app/src/main/java/org/y20k/trackbook/MainActivityMapFragment.java b/app/src/main/java/org/y20k/trackbook/MainActivityMapFragment.java index 476a2cd..c9fd916 100644 --- a/app/src/main/java/org/y20k/trackbook/MainActivityMapFragment.java +++ b/app/src/main/java/org/y20k/trackbook/MainActivityMapFragment.java @@ -35,7 +35,6 @@ import android.support.design.widget.Snackbar; import android.support.v4.app.Fragment; import android.support.v4.content.LocalBroadcastManager; import android.view.LayoutInflater; -import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; @@ -93,6 +92,12 @@ public class MainActivityMapFragment extends Fragment implements TrackbookKeys { } + /* Return a new Instance of MainActivityMapFragment */ + public static MainActivityMapFragment newInstance() { + return new MainActivityMapFragment(); + } + + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -100,9 +105,6 @@ public class MainActivityMapFragment extends Fragment implements TrackbookKeys { // get activity mActivity = getActivity(); - // action bar has options menu - setHasOptionsMenu(true); - // restore first start state and tracking state mFirstStart = true; mTrackerServiceRunning = false; @@ -291,63 +293,6 @@ public class MainActivityMapFragment extends Fragment implements TrackbookKeys { } - @Override - public boolean onOptionsItemSelected(MenuItem item) { - - // handle action bar options menu selection - switch (item.getItemId()) { - - // CASE MY LOCATION - case R.id.action_bar_my_location: - - // do nothing if location setting is off - if (toggleLocationOffBar()) { - stopPreliminaryTracking(); - return false; - } - - // get current position - GeoPoint position; - - if (mTrackerServiceRunning && mTrack != null) { - // get current Location from tracker service - mCurrentBestLocation = mTrack.getWayPointLocation(mTrack.getSize() - 1); - } else if (mCurrentBestLocation == null) { - // app does not have any location fix - mCurrentBestLocation = LocationHelper.determineLastKnownLocation(mLocationManager); - } - - // check if really got a position - if (mCurrentBestLocation != null) { - position = convertToGeoPoint(mCurrentBestLocation); - - // center map on current position - mController.setCenter(position); - - // mark user's new location on map and remove last marker - updateMyLocationMarker(); - - // inform user about location quality - String locationInfo; - long locationAge = (SystemClock.elapsedRealtimeNanos() - mCurrentBestLocation.getElapsedRealtimeNanos()) / 1000000; - String locationAgeString = LocationHelper.convertToReadableTime(locationAge, false); - if (locationAgeString == null) { - locationAgeString = mActivity.getString(R.string.toast_message_last_location_age_one_hour); - } - locationInfo = " " + locationAgeString + " | " + mCurrentBestLocation.getProvider(); - Toast.makeText(mActivity, mActivity.getString(R.string.toast_message_last_location) + locationInfo, Toast.LENGTH_LONG).show(); - return true; - } else { - Toast.makeText(mActivity, mActivity.getString(R.string.toast_message_location_services_not_ready), Toast.LENGTH_LONG).show(); - return false; - } - - // CASE DEFAULT - default: - return super.onOptionsItemSelected(item); - } - } - @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { @@ -548,6 +493,53 @@ public class MainActivityMapFragment extends Fragment implements TrackbookKeys { } + /* Handles tap on the my location button */ + public boolean handleShowMyLocation() { + + // do nothing if location setting is off + if (toggleLocationOffBar()) { + stopPreliminaryTracking(); + return false; + } + + // get current position + GeoPoint position; + + if (mTrackerServiceRunning && mTrack != null) { + // get current Location from tracker service + mCurrentBestLocation = mTrack.getWayPointLocation(mTrack.getSize() - 1); + } else if (mCurrentBestLocation == null) { + // app does not have any location fix + mCurrentBestLocation = LocationHelper.determineLastKnownLocation(mLocationManager); + } + + // check if really got a position + if (mCurrentBestLocation != null) { + position = convertToGeoPoint(mCurrentBestLocation); + + // center map on current position + mController.setCenter(position); + + // mark user's new location on map and remove last marker + updateMyLocationMarker(); + + // inform user about location quality + String locationInfo; + long locationAge = (SystemClock.elapsedRealtimeNanos() - mCurrentBestLocation.getElapsedRealtimeNanos()) / 1000000; + String locationAgeString = LocationHelper.convertToReadableTime(locationAge, false); + if (locationAgeString == null) { + locationAgeString = mActivity.getString(R.string.toast_message_last_location_age_one_hour); + } + locationInfo = " " + locationAgeString + " | " + mCurrentBestLocation.getProvider(); + Toast.makeText(mActivity, mActivity.getString(R.string.toast_message_last_location) + locationInfo, Toast.LENGTH_LONG).show(); + return true; + } else { + Toast.makeText(mActivity, mActivity.getString(R.string.toast_message_location_services_not_ready), Toast.LENGTH_LONG).show(); + return false; + } + } + + /* Creates receiver for new WayPoints */ private BroadcastReceiver createTrackUpdatedReceiver() { return new BroadcastReceiver() { diff --git a/app/src/main/java/org/y20k/trackbook/MainActivityTrackFragment.java b/app/src/main/java/org/y20k/trackbook/MainActivityTrackFragment.java index e0602f2..2ea120d 100644 --- a/app/src/main/java/org/y20k/trackbook/MainActivityTrackFragment.java +++ b/app/src/main/java/org/y20k/trackbook/MainActivityTrackFragment.java @@ -96,6 +96,12 @@ public class MainActivityTrackFragment extends Fragment implements AdapterView.O private BroadcastReceiver mTrackSavedReceiver; + /* Return a new Instance of MainActivityTrackFragment */ + public static MainActivityTrackFragment newInstance() { + return new MainActivityTrackFragment(); + } + + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); diff --git a/app/src/main/java/org/y20k/trackbook/helpers/TrackbookKeys.java b/app/src/main/java/org/y20k/trackbook/helpers/TrackbookKeys.java index 1233b5b..836315f 100644 --- a/app/src/main/java/org/y20k/trackbook/helpers/TrackbookKeys.java +++ b/app/src/main/java/org/y20k/trackbook/helpers/TrackbookKeys.java @@ -68,7 +68,11 @@ public interface TrackbookKeys { /* FRAGMENT IDS */ int FRAGMENT_ID_MAP = 0; - int FRAGMENT_ID_TRACK = 1; + int FRAGMENT_ID_TRACKS = 1; + + String FRAGMENT_TAG_MAP = "fragmentTagMap"; + String FRAGMENT_TAG_TRACKS = "fragmentTagTracks"; + /* RESULTS */ int RESULT_SAVE_DIALOG = 1; diff --git a/app/src/main/res/drawable/ic_compass_needle_black_24dp.xml b/app/src/main/res/drawable/ic_compass_needle_black_24dp.xml new file mode 100644 index 0000000..fbd8e47 --- /dev/null +++ b/app/src/main/res/drawable/ic_compass_needle_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_delete_forever_grey_24dp.xml b/app/src/main/res/drawable/ic_delete_forever_grey_24dp.xml new file mode 100644 index 0000000..57b27aa --- /dev/null +++ b/app/src/main/res/drawable/ic_delete_forever_grey_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_file_download_grey_24dp.xml b/app/src/main/res/drawable/ic_file_download_grey_24dp.xml new file mode 100644 index 0000000..1e5bf77 --- /dev/null +++ b/app/src/main/res/drawable/ic_file_download_grey_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_info_grey_24dp.xml b/app/src/main/res/drawable/ic_info_grey_24dp.xml new file mode 100644 index 0000000..b49c82e --- /dev/null +++ b/app/src/main/res/drawable/ic_info_grey_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_my_location_white_24dp.xml b/app/src/main/res/drawable/ic_my_location_grey_24dp.xml similarity index 91% rename from app/src/main/res/drawable/ic_my_location_white_24dp.xml rename to app/src/main/res/drawable/ic_my_location_grey_24dp.xml index 4bc02ca..28aacd1 100644 --- a/app/src/main/res/drawable/ic_my_location_white_24dp.xml +++ b/app/src/main/res/drawable/ic_my_location_grey_24dp.xml @@ -4,6 +4,6 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_notebook_black_24dp.xml b/app/src/main/res/drawable/ic_notebook_black_24dp.xml new file mode 100644 index 0000000..d3d8e2a --- /dev/null +++ b/app/src/main/res/drawable/ic_notebook_black_24dp.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/selector_bottom_navigation.xml b/app/src/main/res/drawable/selector_bottom_navigation.xml new file mode 100644 index 0000000..7d06a0e --- /dev/null +++ b/app/src/main/res/drawable/selector_bottom_navigation.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/layout/activity_infosheet_about.xml b/app/src/main/res/layout/activity_infosheet_about.xml deleted file mode 100644 index 171fe41..0000000 --- a/app/src/main/res/layout/activity_infosheet_about.xml +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index b262ecb..0ea2a04 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -3,57 +3,148 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" - android:id="@+id/main_content" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context="org.y20k.trackbook.MainActivity"> - - - - - - - - - - - - - + android:layout_height="match_parent"> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - \ No newline at end of file diff --git a/app/src/main/res/layout/custom_dropdown_item_collapsed.xml b/app/src/main/res/layout/custom_dropdown_item_collapsed.xml index 003e4fc..759026b 100644 --- a/app/src/main/res/layout/custom_dropdown_item_collapsed.xml +++ b/app/src/main/res/layout/custom_dropdown_item_collapsed.xml @@ -7,6 +7,6 @@ android:paddingBottom="@dimen/activity_vertical_margin" android:paddingStart="@dimen/activity_horizontal_margin" android:paddingEnd="@dimen/activity_horizontal_margin" - android:textColor="@color/trackbook_white" + android:textColor="@color/trackbook_grey" android:ellipsize="marquee" - android:maxLines="1" /> \ No newline at end of file + android:singleLine="true" /> \ No newline at end of file diff --git a/app/src/main/res/layout/custom_dropdown_item_expanded.xml b/app/src/main/res/layout/custom_dropdown_item_expanded.xml index 8e89438..f1d4db5 100644 --- a/app/src/main/res/layout/custom_dropdown_item_expanded.xml +++ b/app/src/main/res/layout/custom_dropdown_item_expanded.xml @@ -7,7 +7,7 @@ android:paddingBottom="@dimen/activity_vertical_margin" android:paddingStart="@dimen/activity_horizontal_margin" android:paddingEnd="@dimen/activity_horizontal_margin" - android:textColor="@color/trackbook_white" - android:background="@color/trackbook_blue" + android:textColor="@color/trackbook_grey" + android:background="@color/trackbook_white" android:ellipsize="marquee" - android:maxLines="1" /> \ No newline at end of file + android:singleLine="true" /> \ No newline at end of file diff --git a/app/src/main/res/layout/floating_action_button.xml b/app/src/main/res/layout/floating_action_button.xml deleted file mode 100644 index dee14bf..0000000 --- a/app/src/main/res/layout/floating_action_button.xml +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_main_track.xml b/app/src/main/res/layout/fragment_main_track.xml index e48222c..c34e61c 100644 --- a/app/src/main/res/layout/fragment_main_track.xml +++ b/app/src/main/res/layout/fragment_main_track.xml @@ -29,7 +29,7 @@ android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:orientation="horizontal" - android:background="@color/trackbook_blue_85percent"> + android:background="@color/trackbook_white_85percent"> @@ -74,7 +74,7 @@ android:layout_width="@dimen/bottom_sheet_width" android:layout_height="match_parent" android:layout_gravity="bottom" - android:background="@color/trackbook_blue_85percent" + android:background="@color/trackbook_white_85percent" app:behavior_hideable="true" app:behavior_peekHeight="112dp" app:layout_behavior="android.support.design.widget.BottomSheetBehavior"> @@ -102,7 +102,7 @@ android:id="@+id/statistics_headline" android:layout_width="0dp" android:layout_height="match_parent" - android:textAppearance="@android:style/TextAppearance.Medium.Inverse" + android:textAppearance="@android:style/TextAppearance.Medium" android:layout_weight="1" android:gravity="start|center" android:textStyle="bold" @@ -115,7 +115,7 @@ android:layout_height="wrap_content" android:gravity="end|center" android:contentDescription="@string/descr_statistics_sheet_icon" - app:srcCompat="@drawable/ic_info_white_24dp" /> + app:srcCompat="@drawable/ic_info_grey_24dp" /> @@ -153,14 +153,14 @@ android:layout_height="wrap_content" android:layout_marginEnd="4dp" android:text="@string/statistics_sheet_p_steps" - android:textAppearance="@android:style/TextAppearance.Small.Inverse" + android:textAppearance="@android:style/TextAppearance.Small" android:contentDescription="@string/descr_statistics_sheet_p_steps" /> @@ -176,14 +176,14 @@ android:layout_height="wrap_content" android:layout_marginEnd="4dp" android:text="@string/statistics_sheet_p_waypoints" - android:textAppearance="@android:style/TextAppearance.Small.Inverse" + android:textAppearance="@android:style/TextAppearance.Small" android:contentDescription="@string/descr_statistics_sheet_p_waypoints" /> @@ -199,14 +199,14 @@ android:layout_height="wrap_content" android:layout_marginEnd="4dp" android:text="@string/statistics_sheet_p_duration" - android:textAppearance="@android:style/TextAppearance.Small.Inverse" + android:textAppearance="@android:style/TextAppearance.Small" android:contentDescription="@string/descr_statistics_sheet_p_duration" /> @@ -222,14 +222,14 @@ android:layout_height="wrap_content" android:layout_marginEnd="4dp" android:text="@string/statistics_sheet_p_recording_start" - android:textAppearance="@android:style/TextAppearance.Small.Inverse" + android:textAppearance="@android:style/TextAppearance.Small" android:contentDescription="@string/descr_statistics_sheet_p_recording_start" /> @@ -246,14 +246,14 @@ android:layout_height="wrap_content" android:layout_marginEnd="4dp" android:text="@string/statistics_sheet_p_recording_stop" - android:textAppearance="@android:style/TextAppearance.Small.Inverse" + android:textAppearance="@android:style/TextAppearance.Small" android:contentDescription="@string/descr_statistics_sheet_p_recording_end" /> diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index 7168dd7..701fc84 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -1,20 +1,14 @@ - + + - + android:id="@+id/navigation_map" + android:icon="@drawable/ic_compass_needle_black_24dp" + android:title="@string/tab_map" /> + android:id="@+id/navigation_last_tracks" + android:icon="@drawable/ic_notebook_black_24dp" + android:title="@string/tab_last_tracks" /> diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 108cca0..abb3c9a 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -12,9 +12,9 @@ Über Trackbook - KARTE - LETZTE AUFZEICHNUNG - LETZTE AUFZEICHNUNGEN + Karte + Letzte Aufzeichnung + Letzte Aufzeichnungen Trackbook ist inaktiv diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml deleted file mode 100644 index 64cb6b9..0000000 --- a/app/src/main/res/values-v21/styles.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - diff --git a/app/src/main/res/values-v23/styles.xml b/app/src/main/res/values-v23/styles.xml new file mode 100644 index 0000000..0335113 --- /dev/null +++ b/app/src/main/res/values-v23/styles.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index e63efca..16295e4 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -3,6 +3,7 @@ #FFE53935 #FFB71C1C + #D9E53935 #FFE6BA64 @@ -13,7 +14,10 @@ #FF4CAF50 #FFFFFFFF + #D9FFFFFF + #FF000000 + #FFECEFF1 #FF607d8b #FF455a64 #D9455a64 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e54f225..c4cabb3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -12,9 +12,9 @@ About Trackbook - MAP - LAST TRACK - LAST TRACKS + Map + Last Track + Last Tracks Trackbook running diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 267c6bb..7ce946a 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,22 +1,26 @@ + - - + + + + - diff --git a/build.gradle b/build.gradle index b3d4eaa..97bc251 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.0.0' + classpath 'com.android.tools.build:gradle:3.0.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -21,13 +21,14 @@ allprojects { } project.ext { applicationId = 'org.y20k.trackbook' - versionCode = 15 - versionName = '1.0.8' + versionCode = 16 + versionName = '1.1.0' minSdkVersion = 22 compileSdkVersion = 26 targetSdkVersion = 26 buildToolsVersion = '26.0.2' supportLibraryVersion = '26.1.0' + constraintLayoutVersion = '1.1.0-beta3' osmdroidVersion = '5.6.5' gsonVersion = '2.8.2'