Skip to content
This repository was archived by the owner on Mar 26, 2024. It is now read-only.

Commit f6b09e1

Browse files
committed
Merged release-0.5 into master
2 parents 9fe1d07 + ef178d5 commit f6b09e1

File tree

111 files changed

+3265
-773
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

111 files changed

+3265
-773
lines changed

.travis.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ before_script:
4545
- cp opencv/build/lib/libopencv_java310.so opencv_lib/libopencv_java310.so
4646
- export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/opencv_lib/
4747
- chmod +x gradlew
48+
# Create gradle.properties with fake credentials
49+
- echo "OpenWeatherMapApiKey=\"c75f70c4717eb95847d378bba3bdb275\"" > ~/.gradle/gradle.properties
4850

4951
script:
5052
# Compile and run unit tests

app/build.gradle

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ android {
1010
applicationId "com.davidmiguel.gobees"
1111
minSdkVersion 19
1212
targetSdkVersion 25
13-
versionCode 4
14-
versionName "v0.4"
13+
versionCode 5
14+
versionName "v0.5"
1515

1616
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
1717
}
@@ -33,6 +33,11 @@ android {
3333
}
3434
}
3535

36+
buildTypes.each {
37+
// OpenWeatherMap key (stored in [USER_HOME]/.gradle/gradle.properties)
38+
it.buildConfigField 'String', 'OPEN_WEATHER_MAP_API_KEY', OpenWeatherMapApiKey
39+
}
40+
3641
// Mock: stubs out the service layer completely and returns a fake dataset
3742
// Prod: production version
3843
productFlavors {
@@ -84,13 +89,15 @@ dependencies {
8489
compile 'com.makeramen:roundedimageview:2.3.0'
8590
compile 'com.github.PhilJay:MPAndroidChart:v3.0.1'
8691
compile 'com.vanniktech:vntnumberpickerpreference:1.0.0'
92+
compile 'rebus:permission-utils:1.0.6'
8793

8894
// Dependencies for local unit tests
8995
testCompile 'junit:junit:4.12'
9096
testCompile 'org.mockito:mockito-all:2.0.2-beta'
9197
testCompile 'org.slf4j:slf4j-api:1.7.21'
9298
testCompile 'org.slf4j:slf4j-log4j12:1.7.21'
9399
testCompile 'log4j:log4j:1.2.17'
100+
testCompile 'org.json:json:20160810'
94101

95102
// Android Testing Support Library's runner and rules
96103
androidTestCompile 'com.android.support.test:runner:0.5'

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
<uses-permission android:name="android.permission.CAMERA"/>
66
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
7+
<uses-permission android:name="android.permission.INTERNET"/>
78

89
<uses-feature android:name="android.hardware.camera"/>
910
<uses-feature

app/src/main/java/com/davidmiguel/gobees/addeditapiary/AddEditApiaryActivity.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.davidmiguel.gobees.addeditapiary;
22

33
import android.os.Bundle;
4+
import android.support.annotation.NonNull;
5+
import android.support.v4.app.Fragment;
46
import android.support.v7.app.ActionBar;
57
import android.support.v7.app.AppCompatActivity;
68
import android.support.v7.widget.Toolbar;
@@ -18,6 +20,7 @@ public class AddEditApiaryActivity extends AppCompatActivity {
1820
public static final int REQUEST_ADD_APIARY = 1;
1921
public static final int NEW_APIARY = -1;
2022

23+
private Fragment addEditApiaryFragment;
2124
private GoBeesRepository goBeesRepository;
2225

2326
@Override
@@ -39,9 +42,7 @@ protected void onCreate(Bundle savedInstanceState) {
3942
.getLongExtra(AddEditApiaryFragment.ARGUMENT_EDIT_APIARY_ID, NEW_APIARY);
4043

4144
// Add fragment to the activity and set title
42-
AddEditApiaryFragment addEditApiaryFragment =
43-
(AddEditApiaryFragment) getSupportFragmentManager()
44-
.findFragmentById(R.id.contentFrame);
45+
addEditApiaryFragment = getSupportFragmentManager().findFragmentById(R.id.contentFrame);
4546
if (addEditApiaryFragment == null) {
4647
addEditApiaryFragment = AddEditApiaryFragment.newInstance();
4748
if (getIntent().hasExtra(AddEditApiaryFragment.ARGUMENT_EDIT_APIARY_ID)) {
@@ -67,7 +68,8 @@ protected void onCreate(Bundle savedInstanceState) {
6768
goBeesRepository.openDb();
6869

6970
// Create the presenter
70-
new AddEditApiaryPresenter(goBeesRepository, addEditApiaryFragment, apiaryId);
71+
new AddEditApiaryPresenter(goBeesRepository,
72+
(AddEditApiaryContract.View) addEditApiaryFragment, apiaryId);
7173
}
7274

7375
@Override
@@ -82,4 +84,12 @@ public boolean onSupportNavigateUp() {
8284
onBackPressed();
8385
return true;
8486
}
87+
88+
@Override
89+
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
90+
if (addEditApiaryFragment != null) {
91+
addEditApiaryFragment.onRequestPermissionsResult(requestCode, permissions, grantResults);
92+
}
93+
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
94+
}
8595
}

app/src/main/java/com/davidmiguel/gobees/addeditapiary/AddEditApiaryContract.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,13 @@ interface View extends BaseView<Presenter> {
6565
* Shows save error message.
6666
*/
6767
void showSaveApiaryError();
68+
69+
/**
70+
* Checks whether ACCESS_FINE_LOCATION permission is granted. If not, asks for it.
71+
*
72+
* @return if the permission is granted.
73+
*/
74+
boolean checkLocationPermission();
6875
}
6976

7077
interface Presenter extends BasePresenter {
@@ -75,7 +82,7 @@ interface Presenter extends BasePresenter {
7582
* @param name apiary name.
7683
* @param notes apiary notes.
7784
*/
78-
void saveApiary(String name, String notes);
85+
void save(String name, String notes);
7986

8087
/**
8188
* Fill apiary data (the apiary must already exist in the repository).

app/src/main/java/com/davidmiguel/gobees/addeditapiary/AddEditApiaryFragment.java

Lines changed: 76 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.davidmiguel.gobees.addeditapiary;
22

33
import android.app.Activity;
4+
import android.content.DialogInterface;
45
import android.location.Location;
56
import android.os.Bundle;
67
import android.support.annotation.NonNull;
@@ -9,6 +10,7 @@
910
import android.support.design.widget.Snackbar;
1011
import android.support.v4.app.Fragment;
1112
import android.support.v4.content.ContextCompat;
13+
import android.support.v7.app.AlertDialog;
1214
import android.view.LayoutInflater;
1315
import android.view.View;
1416
import android.view.ViewGroup;
@@ -18,6 +20,12 @@
1820

1921
import com.davidmiguel.gobees.R;
2022

23+
import rebus.permissionutils.AskagainCallback;
24+
import rebus.permissionutils.PermissionEnum;
25+
import rebus.permissionutils.PermissionManager;
26+
import rebus.permissionutils.PermissionUtils;
27+
import rebus.permissionutils.SimpleCallback;
28+
2129
import static com.google.common.base.Preconditions.checkNotNull;
2230

2331
/**
@@ -72,11 +80,10 @@ public void onClick(View view) {
7280
// Configure floating action button
7381
FloatingActionButton fab =
7482
(FloatingActionButton) getActivity().findViewById(R.id.fab_add_apiary);
75-
fab.setImageResource(R.drawable.ic_done);
7683
fab.setOnClickListener(new View.OnClickListener() {
7784
@Override
78-
public void onClick(View v) {
79-
presenter.saveApiary(nameTextView.getText().toString(),
85+
public void onClick(View view) {
86+
presenter.save(nameTextView.getText().toString(),
8087
notesTextView.getText().toString());
8188
}
8289
});
@@ -101,13 +108,13 @@ public void setName(String name) {
101108

102109
@Override
103110
public void setLocation(Location location) {
104-
String sb = "(" +
105-
String.valueOf(location.getLatitude()) +
106-
", " +
107-
String.valueOf(location.getLongitude()) +
108-
") ±" +
109-
Math.round(location.getAccuracy()) +
110-
"m";
111+
String sb = "("
112+
+ String.valueOf(location.getLatitude())
113+
+ ", "
114+
+ String.valueOf(location.getLongitude())
115+
+ ") ±"
116+
+ Math.round(location.getAccuracy())
117+
+ "m";
111118
locationTextView.setText(sb);
112119
}
113120

@@ -118,8 +125,8 @@ public void setNotes(String notes) {
118125

119126
@Override
120127
public void setLocationIcon(boolean active) {
121-
getLocationIcon.setColorFilter(active ?
122-
ContextCompat.getColor(getContext(), R.color.colorPrimaryDark) :
128+
getLocationIcon.setColorFilter(active
129+
? ContextCompat.getColor(getContext(), R.color.colorPrimaryDark) :
123130
ContextCompat.getColor(getContext(), R.color.colorAccent));
124131
}
125132

@@ -150,6 +157,63 @@ public void showSaveApiaryError() {
150157
showMessage(getView(), getString(R.string.save_apiary_error_message));
151158
}
152159

160+
@Override
161+
public boolean checkLocationPermission() {
162+
// Check location permission
163+
if (PermissionUtils.isGranted(getActivity(), PermissionEnum.ACCESS_FINE_LOCATION)) {
164+
return true;
165+
}
166+
// Ask for permission
167+
PermissionManager.with(getActivity())
168+
.permission(PermissionEnum.ACCESS_FINE_LOCATION)
169+
.askagain(true)
170+
.askagainCallback(new AskagainCallback() {
171+
@Override
172+
public void showRequestPermission(final UserResponse response) {
173+
new AlertDialog.Builder(getActivity())
174+
.setTitle(getString(R.string.permission_request_title))
175+
.setMessage(getString(R.string.location_permission_request_body))
176+
.setPositiveButton(getString(R.string.permission_request_allow_button),
177+
new DialogInterface.OnClickListener() {
178+
@Override
179+
public void onClick(DialogInterface dialogInterface, int i) {
180+
response.result(true);
181+
}
182+
})
183+
.setNegativeButton(getString(R.string.permission_request_deny_button),
184+
new DialogInterface.OnClickListener() {
185+
@Override
186+
public void onClick(DialogInterface dialogInterface, int i) {
187+
response.result(false);
188+
}
189+
})
190+
.setCancelable(false)
191+
.show();
192+
}
193+
})
194+
.callback(new SimpleCallback() {
195+
@Override
196+
public void result(boolean allPermissionsGranted) {
197+
if (allPermissionsGranted) {
198+
// Launch the feature
199+
presenter.toogleLocation(getContext());
200+
} else {
201+
// Warn the user that it's not possible to use the feature
202+
Toast.makeText(getActivity(), getString(R.string.permission_request_denied),
203+
Toast.LENGTH_LONG).show();
204+
}
205+
}
206+
})
207+
.ask();
208+
return false;
209+
}
210+
211+
@Override
212+
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
213+
@NonNull int[] grantResults) {
214+
PermissionManager.handleResult(requestCode, permissions, grantResults);
215+
}
216+
153217
@Override
154218
public boolean isActive() {
155219
return isAdded();

0 commit comments

Comments
 (0)