From 44d894671c20e17120dcb3afd416b3829535579b Mon Sep 17 00:00:00 2001 From: davidmigloz Date: Wed, 11 Jan 2017 14:18:45 +0100 Subject: [PATCH 01/10] Update dependences --- app/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 410847bc..39e094dd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -112,8 +112,8 @@ dependencies { // Dependencies for local unit tests testCompile 'junit:junit:4.12' testCompile 'org.mockito:mockito-all:2.0.2-beta' - testCompile 'org.slf4j:slf4j-api:1.7.21' - testCompile 'org.slf4j:slf4j-log4j12:1.7.21' + testCompile 'org.slf4j:slf4j-api:1.7.22' + testCompile 'org.slf4j:slf4j-log4j12:1.7.22' testCompile 'log4j:log4j:1.2.17' testCompile 'org.json:json:20160810' @@ -123,7 +123,7 @@ dependencies { // Dependencies for Android unit tests androidTestCompile 'junit:junit:4.12' - androidTestCompile 'org.mockito:mockito-core:2.3.0' + androidTestCompile 'org.mockito:mockito-core:2.5.5' // Espresso UI Testing androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2' From a35d169d4644ac19df2965e60ad6dc4a3b70a78c Mon Sep 17 00:00:00 2001 From: davidmigloz Date: Thu, 12 Jan 2017 15:27:07 +0100 Subject: [PATCH 02/10] Document sprint 14 #154 --- docs/img/burndowns/sprint14.png | Bin 0 -> 29042 bytes docs/rst/anexos/A_PlanProyecto.rst | 21 +++++++++++++++++++++ docs/rst/anexos/Registro-tiempo.xlsx | Bin 27087 -> 28498 bytes 3 files changed, 21 insertions(+) create mode 100644 docs/img/burndowns/sprint14.png diff --git a/docs/img/burndowns/sprint14.png b/docs/img/burndowns/sprint14.png new file mode 100644 index 0000000000000000000000000000000000000000..8f220f574d82907508c85c16ad420211ebe6d309 GIT binary patch literal 29042 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 Kt9N|)%|8Gb_BlBK literal 0 HcmV?d00001 diff --git a/docs/rst/anexos/A_PlanProyecto.rst b/docs/rst/anexos/A_PlanProyecto.rst index 6edf9a4b..e560eddd 100644 --- a/docs/rst/anexos/A_PlanProyecto.rst +++ b/docs/rst/anexos/A_PlanProyecto.rst @@ -356,6 +356,27 @@ horas, completando todas las tareas. .. figure:: ../../img/burndowns/sprint13.png :alt: Sprint 13. + +Sprint 14 (15/12/16 - 11/01/17) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Se trató del sprint más largo de todos los realizados, con una duración de cuatro +semanas debido a las vacaciones de Navidad. + +Los objetivos de este *sprint* fueron: implementar el servicio de monitorización +en segundo plano, junto con su sección de ajustes, la obtención de información +meteorológica, la edición y borrado de colmenares y colmenas y las pestañas de +información de colmenar y colmena. Además, realizar un estudio de viabilidad +legal y selececionar la licencia más apropiada para el proyecto. + +Las tareas en las que se descompusieron los objetivos se pueden ver en: +`Sprint 14 `__. + +Se estimaron 143 horas de trabajo y se invirtieron finalmente 187,75 +horas, completando todas las tareas. + +.. figure:: ../../img/burndowns/sprint14.png + :alt: Sprint 14. Estudio de viabilidad --------------------- diff --git a/docs/rst/anexos/Registro-tiempo.xlsx b/docs/rst/anexos/Registro-tiempo.xlsx index 7cd68483005299ab6e36d5a5d7fb08d78a24f509..1ece648a97311f42cc9bceb01d2f3bde3d3404c8 100644 GIT binary patch delta 23666 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

Ze3Xk^HKAiUVQVmH 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 From 67d3afe79f4f7056b9481bea7720d236bcdbd8d1 Mon Sep 17 00:00:00 2001 From: davidmigloz Date: Thu, 12 Jan 2017 19:12:22 +0100 Subject: [PATCH 03/10] Minor changes --- .../addeditapiary/AddEditApiaryActivity.java | 6 +- .../addeditapiary/AddEditApiaryFragment.java | 15 ++-- .../addeditapiary/AddEditApiaryPresenter.java | 2 +- .../addedithive/AddEditHiveFragment.java | 2 +- .../gobees/apiaries/ApiariesActivity.java | 3 +- .../gobees/apiaries/ApiariesAdapter.java | 3 +- .../gobees/apiaries/ApiariesFragment.java | 3 +- .../gobees/apiaries/ApiariesPresenter.java | 8 +- .../gobees/apiary/ApiaryHivesFragment.java | 8 +- .../gobees/apiary/HivesAdapter.java | 3 +- .../network/OpenWeatherMapUtilsTest.java | 83 ++++++++++--------- 11 files changed, 76 insertions(+), 60 deletions(-) diff --git a/app/src/main/java/com/davidmiguel/gobees/addeditapiary/AddEditApiaryActivity.java b/app/src/main/java/com/davidmiguel/gobees/addeditapiary/AddEditApiaryActivity.java index 7edd47dd..421ca805 100644 --- a/app/src/main/java/com/davidmiguel/gobees/addeditapiary/AddEditApiaryActivity.java +++ b/app/src/main/java/com/davidmiguel/gobees/addeditapiary/AddEditApiaryActivity.java @@ -104,9 +104,11 @@ public boolean onSupportNavigateUp() { } @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, + @NonNull int[] grantResults) { if (addEditApiaryFragment != null) { - addEditApiaryFragment.onRequestPermissionsResult(requestCode, permissions, grantResults); + addEditApiaryFragment.onRequestPermissionsResult(requestCode, + permissions, grantResults); } super.onRequestPermissionsResult(requestCode, permissions, grantResults); } diff --git a/app/src/main/java/com/davidmiguel/gobees/addeditapiary/AddEditApiaryFragment.java b/app/src/main/java/com/davidmiguel/gobees/addeditapiary/AddEditApiaryFragment.java index 7e09bcd6..eb726a05 100644 --- a/app/src/main/java/com/davidmiguel/gobees/addeditapiary/AddEditApiaryFragment.java +++ b/app/src/main/java/com/davidmiguel/gobees/addeditapiary/AddEditApiaryFragment.java @@ -192,17 +192,21 @@ public void showRequestPermission(final UserResponse response) { new AlertDialog.Builder(getActivity()) .setTitle(getString(R.string.permission_request_title)) .setMessage(getString(R.string.location_permission_request_body)) - .setPositiveButton(getString(R.string.permission_request_allow_button), + .setPositiveButton( + getString(R.string.permission_request_allow_button), new DialogInterface.OnClickListener() { @Override - public void onClick(DialogInterface dialogInterface, int i) { + public void onClick(DialogInterface dialogInterface, + int which) { response.result(true); } }) - .setNegativeButton(getString(R.string.permission_request_deny_button), + .setNegativeButton( + getString(R.string.permission_request_deny_button), new DialogInterface.OnClickListener() { @Override - public void onClick(DialogInterface dialogInterface, int i) { + public void onClick(DialogInterface dialogInterface, + int which) { response.result(false); } }) @@ -218,7 +222,8 @@ public void result(boolean allPermissionsGranted) { presenter.toogleLocation(getContext()); } else { // Warn the user that it's not possible to use the feature - Toast.makeText(getActivity(), getString(R.string.permission_request_denied), + Toast.makeText(getActivity(), + getString(R.string.permission_request_denied), Toast.LENGTH_LONG).show(); } } diff --git a/app/src/main/java/com/davidmiguel/gobees/addeditapiary/AddEditApiaryPresenter.java b/app/src/main/java/com/davidmiguel/gobees/addeditapiary/AddEditApiaryPresenter.java index ef843280..4ef5fc7b 100644 --- a/app/src/main/java/com/davidmiguel/gobees/addeditapiary/AddEditApiaryPresenter.java +++ b/app/src/main/java/com/davidmiguel/gobees/addeditapiary/AddEditApiaryPresenter.java @@ -182,7 +182,7 @@ public void onLocationChanged(Location location) { } @Override - public void onConnectionSuspended(int i) { + public void onConnectionSuspended(int cause) { // We don't need to perform any action } diff --git a/app/src/main/java/com/davidmiguel/gobees/addedithive/AddEditHiveFragment.java b/app/src/main/java/com/davidmiguel/gobees/addedithive/AddEditHiveFragment.java index b3723303..00188e72 100644 --- a/app/src/main/java/com/davidmiguel/gobees/addedithive/AddEditHiveFragment.java +++ b/app/src/main/java/com/davidmiguel/gobees/addedithive/AddEditHiveFragment.java @@ -80,7 +80,7 @@ public void onActivityCreated(Bundle savedInstanceState) { (FloatingActionButton) getActivity().findViewById(R.id.fab_add_hive); fab.setOnClickListener(new View.OnClickListener() { @Override - public void onClick(View v) { + public void onClick(View view) { presenter.save(nameTextView.getText().toString(), notesTextView.getText().toString()); } diff --git a/app/src/main/java/com/davidmiguel/gobees/apiaries/ApiariesActivity.java b/app/src/main/java/com/davidmiguel/gobees/apiaries/ApiariesActivity.java index e651b6c4..ecd2e297 100644 --- a/app/src/main/java/com/davidmiguel/gobees/apiaries/ApiariesActivity.java +++ b/app/src/main/java/com/davidmiguel/gobees/apiaries/ApiariesActivity.java @@ -103,8 +103,9 @@ public boolean onOptionsItemSelected(MenuItem item) { // Open the navigation drawer when the home icon is selected from the toolbar drawerLayout.openDrawer(GravityCompat.START); return true; + default: + return super.onOptionsItemSelected(item); } - return super.onOptionsItemSelected(item); } /** diff --git a/app/src/main/java/com/davidmiguel/gobees/apiaries/ApiariesAdapter.java b/app/src/main/java/com/davidmiguel/gobees/apiaries/ApiariesAdapter.java index 32274ace..a59fa521 100644 --- a/app/src/main/java/com/davidmiguel/gobees/apiaries/ApiariesAdapter.java +++ b/app/src/main/java/com/davidmiguel/gobees/apiaries/ApiariesAdapter.java @@ -53,7 +53,8 @@ class ApiariesAdapter extends RecyclerView.Adapter { private List apiaries; private ApiaryItemListener listener; - ApiariesAdapter(Context context, MenuInflater menuInflater, List apiaries, ApiaryItemListener listener) { + ApiariesAdapter(Context context, MenuInflater menuInflater, List apiaries, + ApiaryItemListener listener) { this.context = context; this.menuInflater = menuInflater; this.apiaries = checkNotNull(apiaries); diff --git a/app/src/main/java/com/davidmiguel/gobees/apiaries/ApiariesFragment.java b/app/src/main/java/com/davidmiguel/gobees/apiaries/ApiariesFragment.java index 8b8f0161..68d244d4 100644 --- a/app/src/main/java/com/davidmiguel/gobees/apiaries/ApiariesFragment.java +++ b/app/src/main/java/com/davidmiguel/gobees/apiaries/ApiariesFragment.java @@ -74,7 +74,8 @@ public static ApiariesFragment newInstance() { @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - listAdapter = new ApiariesAdapter(getContext(), getActivity().getMenuInflater(), new ArrayList(0), this); + listAdapter = new ApiariesAdapter(getContext(), getActivity().getMenuInflater(), + new ArrayList(0), this); } @Nullable diff --git a/app/src/main/java/com/davidmiguel/gobees/apiaries/ApiariesPresenter.java b/app/src/main/java/com/davidmiguel/gobees/apiaries/ApiariesPresenter.java index f0999cb0..2ccf3e22 100644 --- a/app/src/main/java/com/davidmiguel/gobees/apiaries/ApiariesPresenter.java +++ b/app/src/main/java/com/davidmiguel/gobees/apiaries/ApiariesPresenter.java @@ -56,7 +56,8 @@ class ApiariesPresenter implements ApiariesContract.Presenter { @Override public void result(int requestCode, int resultCode) { // If a apiary was successfully added, show snackbar - if (AddEditApiaryActivity.REQUEST_ADD_APIARY == requestCode && Activity.RESULT_OK == resultCode) { + if (AddEditApiaryActivity.REQUEST_ADD_APIARY == requestCode + && Activity.RESULT_OK == resultCode) { view.showSuccessfullySavedMessage(); } } @@ -72,7 +73,7 @@ public void loadApiaries(boolean forceUpdate) { if (forceUpdate) { goBeesRepository.refreshApiaries(); } - // Get apiaires + // Get apiaries goBeesRepository.getApiaries(new GoBeesDataSource.GetApiariesCallback() { @Override @@ -194,7 +195,8 @@ private void checkCurrentWeather(List apiaries) { } // Update weather if needed if (apiariesToUpdate.size() > 0) { - goBeesRepository.updateApiariesCurrentWeather(apiariesToUpdate, new GoBeesDataSource.TaskCallback() { + goBeesRepository.updateApiariesCurrentWeather(apiariesToUpdate, + new GoBeesDataSource.TaskCallback() { @Override public void onSuccess() { view.notifyApiariesUpdated(); diff --git a/app/src/main/java/com/davidmiguel/gobees/apiary/ApiaryHivesFragment.java b/app/src/main/java/com/davidmiguel/gobees/apiary/ApiaryHivesFragment.java index c3af4e99..af924c10 100644 --- a/app/src/main/java/com/davidmiguel/gobees/apiary/ApiaryHivesFragment.java +++ b/app/src/main/java/com/davidmiguel/gobees/apiary/ApiaryHivesFragment.java @@ -84,7 +84,8 @@ public static ApiaryHivesFragment newInstance(long apiaryId) { @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - listAdapter = new HivesAdapter(getActivity().getMenuInflater(), new ArrayList(0), this); + listAdapter = new HivesAdapter(getActivity().getMenuInflater(), + new ArrayList(0), this); } @Nullable @@ -163,9 +164,10 @@ public boolean onOptionsItemSelected(MenuItem item) { return true; case R.id.menu_refresh: presenter.loadData(true); - break; + return true; + default: + return super.onOptionsItemSelected(item); } - return true; } @Override diff --git a/app/src/main/java/com/davidmiguel/gobees/apiary/HivesAdapter.java b/app/src/main/java/com/davidmiguel/gobees/apiary/HivesAdapter.java index f1cc78a7..965f9464 100644 --- a/app/src/main/java/com/davidmiguel/gobees/apiary/HivesAdapter.java +++ b/app/src/main/java/com/davidmiguel/gobees/apiary/HivesAdapter.java @@ -130,7 +130,8 @@ public void onClick(View view) { public void bind(@NonNull Hive hive) { hiveName.setText(hive.getName()); - lastRevision.setText(DateUtils.getRelativeTimeSpanString(hive.getLastRevision().getTime(), + lastRevision.setText( + DateUtils.getRelativeTimeSpanString(hive.getLastRevision().getTime(), (new Date()).getTime(), DateUtils.MINUTE_IN_MILLIS)); } diff --git a/app/src/test/java/com/davidmiguel/gobees/data/source/network/OpenWeatherMapUtilsTest.java b/app/src/test/java/com/davidmiguel/gobees/data/source/network/OpenWeatherMapUtilsTest.java index c28a9a27..6297b995 100644 --- a/app/src/test/java/com/davidmiguel/gobees/data/source/network/OpenWeatherMapUtilsTest.java +++ b/app/src/test/java/com/davidmiguel/gobees/data/source/network/OpenWeatherMapUtilsTest.java @@ -21,7 +21,8 @@ import org.junit.Test; -import static org.junit.Assert.*; +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertNotNull; /** * OpenWeatherMapUtilsTest unit tests. @@ -29,46 +30,46 @@ public class OpenWeatherMapUtilsTest { @Test public void parseCurrentWeatherJson() throws Exception { - String jsonResponse = "{\n" + - " \"coord\":{\n" + - " \"lon\":139,\n" + - " \"lat\":35\n" + - " },\n" + - " \"sys\":{\n" + - " \"country\":\"JP\",\n" + - " \"sunrise\":1369769524,\n" + - " \"sunset\":1369821049\n" + - " },\n" + - " \"weather\":[\n" + - " {\n" + - " \"id\":804,\n" + - " \"main\":\"clouds\",\n" + - " \"description\":\"overcast clouds\",\n" + - " \"icon\":\"04n\"\n" + - " }\n" + - " ],\n" + - " \"main\":{\n" + - " \"temp\":289.5,\n" + - " \"humidity\":89,\n" + - " \"pressure\":1013,\n" + - " \"temp_min\":287.04,\n" + - " \"temp_max\":292.04\n" + - " },\n" + - " \"wind\":{\n" + - " \"speed\":7.31,\n" + - " \"deg\":187.002\n" + - " },\n" + - " \"rain\":{\n" + - " \"3h\":0\n" + - " },\n" + - " \"clouds\":{\n" + - " \"all\":92\n" + - " },\n" + - " \"dt\":1369824698,\n" + - " \"id\":1851632,\n" + - " \"name\":\"Shuzenji\",\n" + - " \"cod\":200\n" + - "}"; + String jsonResponse = "{\n" + + " \"coord\":{\n" + + " \"lon\":139,\n" + + " \"lat\":35\n" + + " },\n" + + " \"sys\":{\n" + + " \"country\":\"JP\",\n" + + " \"sunrise\":1369769524,\n" + + " \"sunset\":1369821049\n" + + " },\n" + + " \"weather\":[\n" + + " {\n" + + " \"id\":804,\n" + + " \"main\":\"clouds\",\n" + + " \"description\":\"overcast clouds\",\n" + + " \"icon\":\"04n\"\n" + + " }\n" + + " ],\n" + + " \"main\":{\n" + + " \"temp\":289.5,\n" + + " \"humidity\":89,\n" + + " \"pressure\":1013,\n" + + " \"temp_min\":287.04,\n" + + " \"temp_max\":292.04\n" + + " },\n" + + " \"wind\":{\n" + + " \"speed\":7.31,\n" + + " \"deg\":187.002\n" + + " },\n" + + " \"rain\":{\n" + + " \"3h\":0\n" + + " },\n" + + " \"clouds\":{\n" + + " \"all\":92\n" + + " },\n" + + " \"dt\":1369824698,\n" + + " \"id\":1851632,\n" + + " \"name\":\"Shuzenji\",\n" + + " \"cod\":200\n" + + "}"; MeteoRecord mr = OpenWeatherMapUtils.parseCurrentWeatherJson(jsonResponse); assertNotNull(mr); assertEquals("city", "Shuzenji", mr.getCityName()); From cb2d0d7f17a319be12976eb4f92b26a295b500b2 Mon Sep 17 00:00:00 2001 From: davidmigloz Date: Sun, 15 Jan 2017 22:57:06 +0100 Subject: [PATCH 04/10] Implement about section #153 --- app/src/main/AndroidManifest.xml | 3 + .../gobees/about/AboutActivity.java | 68 ++++ .../gobees/about/AboutContract.java | 92 ++++++ .../gobees/about/AboutFragment.java | 177 ++++++++++ .../gobees/about/AboutPresenter.java | 93 ++++++ .../com/davidmiguel/gobees/about/Library.java | 59 ++++ .../davidmiguel/gobees/about/LibsAdapter.java | 104 ++++++ .../gobees/apiaries/ApiariesActivity.java | 37 ++- .../gobees/recording/RecordingFragment.java | 5 - .../gobees/utils/AndroidUtils.java | 19 ++ .../main/res/drawable-anydpi/ic_feedback.xml | 9 + app/src/main/res/drawable-anydpi/ic_help.xml | 9 + app/src/main/res/drawable-anydpi/ic_info.xml | 9 + app/src/main/res/drawable-anydpi/ic_share.xml | 9 + app/src/main/res/layout/about_act.xml | 62 ++++ app/src/main/res/layout/about_frag.xml | 125 +++++++ .../main/res/layout/about_libs_list_item.xml | 49 +++ app/src/main/res/menu/drawer_actions.xml | 37 ++- app/src/main/res/values/strings.xml | 311 +++++++++++++++++- 19 files changed, 1250 insertions(+), 27 deletions(-) create mode 100644 app/src/main/java/com/davidmiguel/gobees/about/AboutActivity.java create mode 100644 app/src/main/java/com/davidmiguel/gobees/about/AboutContract.java create mode 100644 app/src/main/java/com/davidmiguel/gobees/about/AboutFragment.java create mode 100644 app/src/main/java/com/davidmiguel/gobees/about/AboutPresenter.java create mode 100644 app/src/main/java/com/davidmiguel/gobees/about/Library.java create mode 100644 app/src/main/java/com/davidmiguel/gobees/about/LibsAdapter.java create mode 100644 app/src/main/res/drawable-anydpi/ic_feedback.xml create mode 100644 app/src/main/res/drawable-anydpi/ic_help.xml create mode 100644 app/src/main/res/drawable-anydpi/ic_info.xml create mode 100644 app/src/main/res/drawable-anydpi/ic_share.xml create mode 100644 app/src/main/res/layout/about_act.xml create mode 100644 app/src/main/res/layout/about_frag.xml create mode 100644 app/src/main/res/layout/about_libs_list_item.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 13a6c10e..3fac8013 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -57,6 +57,9 @@ + diff --git a/app/src/main/java/com/davidmiguel/gobees/about/AboutActivity.java b/app/src/main/java/com/davidmiguel/gobees/about/AboutActivity.java new file mode 100644 index 00000000..85c2a58d --- /dev/null +++ b/app/src/main/java/com/davidmiguel/gobees/about/AboutActivity.java @@ -0,0 +1,68 @@ +/* + * GoBees + * Copyright (c) 2016 - 2017 David Miguel Lozano + * + * 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 + * 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 . + */ + +package com.davidmiguel.gobees.about; + +import android.os.Bundle; +import android.support.v7.app.ActionBar; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; + +import com.davidmiguel.gobees.R; +import com.davidmiguel.gobees.utils.ActivityUtils; + +/** + * About GoBees activity. + */ +public class AboutActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.about_act); + + // Set up the toolbar + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.setDisplayShowHomeEnabled(true); + actionBar.setTitle(R.string.about_title); + } + + // Add fragment to the activity + AboutFragment aboutFragment = + (AboutFragment) getSupportFragmentManager().findFragmentById(R.id.contentFrame); + if (aboutFragment == null) { + // Create the fragment + aboutFragment = AboutFragment.newInstance(); + ActivityUtils.addFragmentToActivity( + getSupportFragmentManager(), aboutFragment, R.id.contentFrame); + } + + // Create the presenter + new AboutPresenter(aboutFragment); + } + + @Override + public boolean onSupportNavigateUp() { + onBackPressed(); + return true; + } +} diff --git a/app/src/main/java/com/davidmiguel/gobees/about/AboutContract.java b/app/src/main/java/com/davidmiguel/gobees/about/AboutContract.java new file mode 100644 index 00000000..fb3a8bb5 --- /dev/null +++ b/app/src/main/java/com/davidmiguel/gobees/about/AboutContract.java @@ -0,0 +1,92 @@ +/* + * GoBees + * Copyright (c) 2016 - 2017 David Miguel Lozano + * + * 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 + * 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 . + */ + +package com.davidmiguel.gobees.about; + +import com.davidmiguel.gobees.utils.BasePresenter; +import com.davidmiguel.gobees.utils.BaseView; + +import java.util.List; + +/** + * This specifies the contract between the view and the presenter. + */ +interface AboutContract { + + interface View extends BaseView { + + /** + * Shows app verion. + * + * @param version vresion number. + */ + void showVersion(String version); + + /** + * Opens website. + * + * @param url website url. + */ + void openWebsite(int url); + + /** + * Opens a modal window with the changelog. + * + * @param title title. + * @param changelog data. + */ + void openChangelog(int title, int changelog); + + /** + * Opens a modal window with the license text. + * + * @param title modal title. + * @param license license text. + */ + void openLicence(String title, int license); + + /** + * Shows list of libraries used in the app. + * + * @param libraries list of libraries. + */ + void showLibraries(List libraries); + + } + + interface Presenter extends BasePresenter { + + /** + * When website button is clicked. + */ + void onWebsiteClicked(); + + /** + * When changelog button is clicked. + */ + void onChangelogClicked(); + + /** + * When a license button is clicked. + * + * @param license type of license. + */ + void onLicenseClicked(Library.License license); + + } +} diff --git a/app/src/main/java/com/davidmiguel/gobees/about/AboutFragment.java b/app/src/main/java/com/davidmiguel/gobees/about/AboutFragment.java new file mode 100644 index 00000000..a6ef46c2 --- /dev/null +++ b/app/src/main/java/com/davidmiguel/gobees/about/AboutFragment.java @@ -0,0 +1,177 @@ +/* + * GoBees + * Copyright (c) 2016 - 2017 David Miguel Lozano + * + * 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 + * 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 . + */ + +package com.davidmiguel.gobees.about; + +import android.content.DialogInterface; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v7.app.AlertDialog; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.TextView; + +import com.davidmiguel.gobees.R; +import com.davidmiguel.gobees.utils.AndroidUtils; + +import java.util.ArrayList; +import java.util.List; + +import static com.google.common.base.Preconditions.checkNotNull; + +/** + * Display about GoBees info and open source licenses. + */ +public class AboutFragment extends Fragment + implements AboutContract.View, LibsAdapter.LibItemListener { + + private AboutContract.Presenter presenter; + private LibsAdapter libsAdapter; + + private TextView versionTv; + + public AboutFragment() { + // Requires empty public constructor + } + + public static AboutFragment newInstance() { + return new AboutFragment(); + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View root = inflater.inflate(R.layout.about_frag, container, false); + + versionTv = (TextView) root.findViewById(R.id.version); + Button websiteBtn = (Button) root.findViewById(R.id.website_btn); + Button licenseBtn = (Button) root.findViewById(R.id.license_btn); + Button changelogBtn = (Button) root.findViewById(R.id.changelog_btn); + RecyclerView recyclerView = (RecyclerView) root.findViewById(R.id.recycler_view); + + // Set btn listeners + websiteBtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + presenter.onWebsiteClicked(); + } + }); + licenseBtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + presenter.onLicenseClicked(Library.License.GPL3); + } + }); + changelogBtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + presenter.onChangelogClicked(); + } + }); + + // Set libs list + LinearLayoutManager llm = new LinearLayoutManager(getActivity()); + recyclerView.setLayoutManager(llm); + recyclerView.setAdapter(libsAdapter); + + + return root; + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + libsAdapter = new LibsAdapter(new ArrayList(0), this); + } + + @Override + public void onResume() { + super.onResume(); + presenter.start(); + } + + @Override + public void setPresenter(@NonNull AboutContract.Presenter presenter) { + this.presenter = checkNotNull(presenter); + } + + @Override + public boolean isActive() { + return isAdded(); + } + + @Override + public void showVersion(String version) { + versionTv.setText(getString(R.string.version) + " " + version); + } + + @Override + public void openWebsite(int url) { + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setData(Uri.parse(getString(url))); + startActivity(intent); + } + + @Override + public void openChangelog(int title, int changelog) { + showDialog(getString(title), getString(changelog)); + } + + @Override + public void openLicence(String title, int license) { + showDialog(title, getString(license)); + } + + @Override + public void showLibraries(List libraries) { + libsAdapter.replaceData(libraries); + } + + /** + * Shows a dialog with given data. + * + * @param title dialog title. + * @param body dialog text. + */ + private void showDialog(String title, String body) { + AlertDialog alertDialog = new AlertDialog.Builder(getContext()).create(); + alertDialog.setTitle(title); + alertDialog.setMessage(AndroidUtils.fromHtml(body)); + alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, getString(R.string.close_btn), + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + alertDialog.show(); + } + + @Override + public void onLibraryClicked(Library.License license) { + presenter.onLicenseClicked(license); + } +} diff --git a/app/src/main/java/com/davidmiguel/gobees/about/AboutPresenter.java b/app/src/main/java/com/davidmiguel/gobees/about/AboutPresenter.java new file mode 100644 index 00000000..4d886d8a --- /dev/null +++ b/app/src/main/java/com/davidmiguel/gobees/about/AboutPresenter.java @@ -0,0 +1,93 @@ +/* + * GoBees + * Copyright (c) 2016 - 2017 David Miguel Lozano + * + * 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 + * 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 . + */ + +package com.davidmiguel.gobees.about; + +import com.davidmiguel.gobees.BuildConfig; +import com.davidmiguel.gobees.R; +import com.google.common.collect.Lists; + +import java.util.List; + +/** + * Listens to user actions from the UI AboutFragment, retrieves the data and updates the + * UI as required. + */ +class AboutPresenter implements AboutContract.Presenter { + + private AboutContract.View view; + + AboutPresenter(AboutContract.View view) { + this.view = view; + this.view.setPresenter(this); + } + + @Override + public void start() { + view.showVersion(BuildConfig.VERSION_NAME); + view.showLibraries(getLibraries()); + } + + @Override + public void onWebsiteClicked() { + view.openWebsite(R.string.gobees_url); + } + + @Override + public void onChangelogClicked() { + view.openChangelog(R.string.changelog_btn, R.string.changelog); + } + + @Override + public void onLicenseClicked(Library.License license) { + switch (license) { + case APACHE2: + view.openLicence(license.toString(), R.string.apache_2); + break; + case GPL3: + view.openLicence(license.toString(), R.string.gpl3); + break; + case BSD: + view.openLicence(license.toString(), R.string.bsd); + break; + case CCBYSA4: + view.openLicence(license.toString(), R.string.ccbysa4); + break; + case MIT: + view.openLicence(license.toString(), R.string.mit); + break; + } + } + + private List getLibraries() { + return Lists.newArrayList( + new Library("Android Support Library", Library.License.APACHE2), + new Library("Google Play Services", Library.License.APACHE2), + new Library("Guava", Library.License.APACHE2), + new Library("Material Design Icons", Library.License.APACHE2), + new Library("MPAndroidChart", Library.License.APACHE2), + new Library("OpenCV", Library.License.BSD), + new Library("OpenWeatherMap API", Library.License.CCBYSA4), + new Library("Permission Utils", Library.License.MIT), + new Library("Realm", Library.License.APACHE2), + new Library("RoundedImageView", Library.License.APACHE2), + new Library("Simple Weather Icons", Library.License.APACHE2), + new Library("VNTNumberPicker Preference", Library.License.APACHE2) + ); + } +} diff --git a/app/src/main/java/com/davidmiguel/gobees/about/Library.java b/app/src/main/java/com/davidmiguel/gobees/about/Library.java new file mode 100644 index 00000000..2502a882 --- /dev/null +++ b/app/src/main/java/com/davidmiguel/gobees/about/Library.java @@ -0,0 +1,59 @@ +/* + * GoBees + * Copyright (c) 2016 - 2017 David Miguel Lozano + * + * 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 + * 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 . + */ + +package com.davidmiguel.gobees.about; + +/** + * Models a dependence of the app. + */ +class Library { + + private String name; + private License license; + + Library(String name, License license) { + this.name = name; + this.license = license; + } + + public String getName() { + return name; + } + + public License getLicense() { + return license; + } + + public enum License { + APACHE2("Apache v2.0"), + GPL3("GPLv3"), + MIT("MIT"), + BSD("BSD"), + CCBYSA4("CC BY-SA 4.0"); + + private final String name; + + License(String s) { + name = s; + } + + public String toString() { + return this.name; + } + } +} diff --git a/app/src/main/java/com/davidmiguel/gobees/about/LibsAdapter.java b/app/src/main/java/com/davidmiguel/gobees/about/LibsAdapter.java new file mode 100644 index 00000000..71ba981d --- /dev/null +++ b/app/src/main/java/com/davidmiguel/gobees/about/LibsAdapter.java @@ -0,0 +1,104 @@ +/* + * GoBees + * Copyright (c) 2016 - 2017 David Miguel Lozano + * + * 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 + * 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 . + */ + +package com.davidmiguel.gobees.about; + +import android.support.annotation.NonNull; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.TextView; + +import com.davidmiguel.gobees.R; +import com.davidmiguel.gobees.utils.BaseViewHolder; + +import java.util.List; + +import static com.google.common.base.Preconditions.checkNotNull; + +/** + * Libraries list adapter. + */ +class LibsAdapter extends RecyclerView.Adapter { + + private List libraries; + private LibItemListener listener; + + LibsAdapter(List libraries, LibItemListener listener) { + this.libraries = checkNotNull(libraries); + this.listener = listener; + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.about_libs_list_item, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + holder.bind(libraries.get(position)); + } + + @Override + public int getItemCount() { + return libraries == null ? 0 : libraries.size(); + } + + void replaceData(List libraries) { + this.libraries = checkNotNull(libraries); + notifyDataSetChanged(); + } + + interface LibItemListener { + void onLibraryClicked(Library.License license); + } + + class ViewHolder extends RecyclerView.ViewHolder + implements BaseViewHolder, View.OnClickListener { + + private TextView libraryTv; + private Button license; + + ViewHolder(View itemView) { + super(itemView); + + // Get views + libraryTv = (TextView) itemView.findViewById(R.id.lib_name); + license = (Button) itemView.findViewById(R.id.license); + + // Set listeners + license.setOnClickListener(this); + } + + public void bind(@NonNull Library library) { + // Set library name + libraryTv.setText(library.getName()); + // Set library license + license.setText(library.getLicense().toString()); + } + + @Override + public void onClick(View view) { + listener.onLibraryClicked(libraries.get(getAdapterPosition()).getLicense()); + } + } +} diff --git a/app/src/main/java/com/davidmiguel/gobees/apiaries/ApiariesActivity.java b/app/src/main/java/com/davidmiguel/gobees/apiaries/ApiariesActivity.java index ecd2e297..b41ccbe7 100644 --- a/app/src/main/java/com/davidmiguel/gobees/apiaries/ApiariesActivity.java +++ b/app/src/main/java/com/davidmiguel/gobees/apiaries/ApiariesActivity.java @@ -20,6 +20,7 @@ import android.content.Context; import android.content.Intent; +import android.net.Uri; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.annotation.NonNull; @@ -33,6 +34,7 @@ import com.davidmiguel.gobees.Injection; import com.davidmiguel.gobees.R; +import com.davidmiguel.gobees.about.AboutActivity; import com.davidmiguel.gobees.data.source.cache.GoBeesRepository; import com.davidmiguel.gobees.settings.SettingsActivity; import com.davidmiguel.gobees.utils.ActivityUtils; @@ -118,14 +120,47 @@ private void setupDrawerContent(NavigationView navigationView, final Context con public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) { switch (menuItem.getItemId()) { case R.id.settings_navigation_menu_item: + // Settings Intent intent = new Intent(context, SettingsActivity.class); startActivity(intent); break; + case R.id.help_navigation_menu_item: + // Help + + break; + case R.id.feedback_navigation_menu_item: + // Feedback + Intent emailIntent = new Intent(Intent.ACTION_SENDTO, + Uri.parse("mailto:" + getString(R.string.gobees_email))); + emailIntent.putExtra(Intent.EXTRA_SUBJECT, + getString(R.string.gobees_email_subject)); + emailIntent.putExtra(Intent.EXTRA_TEXT, + getString(R.string.gobees_email_body)); + startActivity(Intent.createChooser( + emailIntent, getString(R.string.feedback_title))); + break; + case R.id.share_app_navigation_menu_item: + // Share app + Intent sendIntent = new Intent(); + sendIntent.setAction(Intent.ACTION_SEND); + sendIntent.putExtra(Intent.EXTRA_TEXT, + getString(R.string.share_app_text) + + Uri.parse(getString(R.string.share_app_url))); + sendIntent.setType("text/plain"); + startActivity(Intent.createChooser( + sendIntent, getString(R.string.share_app_title))); + break; + case R.id.about_navigation_menu_item: + // About + Intent aboutIntent = + new Intent(ApiariesActivity.this, AboutActivity.class); + startActivity(aboutIntent); + break; default: break; } // Close the navigation drawer when an item is selected. - menuItem.setChecked(true); + menuItem.setChecked(false); drawerLayout.closeDrawers(); return true; } diff --git a/app/src/main/java/com/davidmiguel/gobees/recording/RecordingFragment.java b/app/src/main/java/com/davidmiguel/gobees/recording/RecordingFragment.java index 2497c328..bef48aa4 100644 --- a/app/src/main/java/com/davidmiguel/gobees/recording/RecordingFragment.java +++ b/app/src/main/java/com/davidmiguel/gobees/recording/RecordingFragment.java @@ -96,11 +96,6 @@ public static RecordingFragment newInstance() { return new RecordingFragment(); } - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - } - @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, diff --git a/app/src/main/java/com/davidmiguel/gobees/utils/AndroidUtils.java b/app/src/main/java/com/davidmiguel/gobees/utils/AndroidUtils.java index 03275683..fe61cebf 100644 --- a/app/src/main/java/com/davidmiguel/gobees/utils/AndroidUtils.java +++ b/app/src/main/java/com/davidmiguel/gobees/utils/AndroidUtils.java @@ -20,6 +20,8 @@ import android.app.Activity; import android.content.Context; +import android.text.Html; +import android.text.Spanned; import android.view.View; import android.view.inputmethod.InputMethodManager; @@ -41,4 +43,21 @@ public static void closeKeyboard(Activity activity) { imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } } + + /** + * Html.fromHtml wrapper supporting new and old versions. + * + * @param html html to parse. + * @return Spanned text. + */ + @SuppressWarnings("deprecation") + public static Spanned fromHtml(String html) { + Spanned result; + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { + result = Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY); + } else { + result = Html.fromHtml(html); + } + return result; + } } diff --git a/app/src/main/res/drawable-anydpi/ic_feedback.xml b/app/src/main/res/drawable-anydpi/ic_feedback.xml new file mode 100644 index 00000000..584bfce0 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/ic_feedback.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/ic_help.xml b/app/src/main/res/drawable-anydpi/ic_help.xml new file mode 100644 index 00000000..63812eb8 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/ic_help.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/ic_info.xml b/app/src/main/res/drawable-anydpi/ic_info.xml new file mode 100644 index 00000000..4260d92f --- /dev/null +++ b/app/src/main/res/drawable-anydpi/ic_info.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/ic_share.xml b/app/src/main/res/drawable-anydpi/ic_share.xml new file mode 100644 index 00000000..e3fe874d --- /dev/null +++ b/app/src/main/res/drawable-anydpi/ic_share.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/about_act.xml b/app/src/main/res/layout/about_act.xml new file mode 100644 index 00000000..814df531 --- /dev/null +++ b/app/src/main/res/layout/about_act.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/about_frag.xml b/app/src/main/res/layout/about_frag.xml new file mode 100644 index 00000000..1a6f3999 --- /dev/null +++ b/app/src/main/res/layout/about_frag.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + +