Skip to content

Commit 145b46b

Browse files
committed
Merge branch 'release-2.5.10'
* release-2.5.10: Bump versionCode and versionName CI: simplify script and check for successful cache extraction Revert "CI: use api 28 image to avoid re-download of build-tools" Update Kotlin to 1.3.0 (#154) Add Notifications management settings (API 26+) (#156) RoutinesActivityCreate/Edit test: Solve autocorrect bug RoutinesActivityCreate/Edit tests: add error messages to asserts gitlab-ci: add generated DB file as an artifact (#153) Merge PR #149 + changes (#151) Merge PR #147 + changes (#152) InstallDatabaseService: only vibrate once for progress notification Use HH format instead of kk to display time (#148) Update CONTRIBUTING.md DBTest: Clean up exportation Features/export db (#140)
2 parents 55e9660 + eb20bfb commit 145b46b

25 files changed

+202
-35
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,4 @@ Calendula/keystore
4848
captures/
4949

5050
hs_err_*.log
51+
generated/

.gitlab-ci.yml

+3-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
image: circleci/android:api-28-alpha
1+
image: circleci/android:api-27-alpha
22

33
before_script:
44
- export GRADLE_USER_HOME="$(pwd)/.gradle"
@@ -8,12 +8,9 @@ cache:
88
paths:
99
- .gradle
1010

11-
stages:
12-
- build
13-
1411
build:
15-
stage: build
1612
script:
13+
- du -hs .gradle/ || true
1714
- ./gradlew assembleCiDebug
1815
- ./gradlew testCiDebugUnitTest
1916
- ./gradlew jacocoTestReportCiDebug
@@ -25,4 +22,5 @@ build:
2522
- Calendula/build/reports/tests/
2623
- Calendula/build/test-results/
2724
- Calendula/build/reports/jacoco/
25+
- generated/
2826
expire_in: 1 week

CONTRIBUTING.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ Driessen](http://nvie.com/about/) on [this article](http://nvie.com/posts/a-succ
2525
* The `develop` branch reflects the code of the latest delivered development changes for the next release.
2626
* Furthermore, when a development version (almost) reflects the desired state of the new release, a release branch is created. Release branches are usually deployed through the *Google Play BETA channel* before they are made available to everyone
2727

28-
Create a topic branch from where you want to work. This may be usually the `master` or `release` branch for bug fixes or `develop` for adding new features. Please avoid working directly on the master branch.
28+
Create a topic branch from where you want to work. This may be usually the `master` or `release` branch for bug fixes or `develop` for adding new features. **Please avoid working directly on the `master` branch, and do not submits pull requests with `master` as a target.**
2929

3030
## I would like to contribute, but I'm not a developer...
3131

Calendula/build.gradle

+2-2
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@ android {
7676
defaultConfig {
7777
minSdkVersion 18
7878
targetSdkVersion 26
79-
versionCode 40
80-
versionName "2.5.9"
79+
versionCode 41
80+
versionName "2.5.10"
8181
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
8282
applicationId "es.usc.citius.servando.calendula"
8383
multiDexEnabled true

Calendula/src/androidTest/java/es/usc/citius/servando/calendula/activities/RoutinesActivityCreateTest.java

+10-4
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,12 @@
1919
package es.usc.citius.servando.calendula.activities;
2020

2121
import android.support.test.InstrumentationRegistry;
22+
import android.support.test.espresso.assertion.ViewAssertions;
2223
import android.test.ActivityInstrumentationTestCase2;
24+
import android.view.View;
2325

26+
import org.hamcrest.Description;
27+
import org.hamcrest.Matcher;
2428
import org.joda.time.LocalTime;
2529
import org.junit.Before;
2630
import org.junit.Test;
@@ -42,7 +46,7 @@
4246

4347
public class RoutinesActivityCreateTest extends ActivityInstrumentationTestCase2<RoutinesActivity> {
4448

45-
public static final String NAME = "breakfast";
49+
private static final String NAME = "Breakfast";
4650

4751
private RoutinesActivity mActivity;
4852

@@ -93,9 +97,11 @@ public void testCreateRoutine() {
9397

9498
// find routine and do assertions
9599
Routine r = DB.routines().findOneBy(Routine.COLUMN_NAME, NAME);
96-
assertNotNull(r);
97-
assertEquals(NAME, r.getName());
98-
assertEquals(new LocalTime(18, 30), r.getTime());
100+
101+
assertEquals("Routine count is wrong", 1, DB.routines().count());
102+
assertNotNull("Routine is null", r);
103+
assertEquals("Routine name is wrong", NAME, r.getName());
104+
assertEquals("Routine time is wrong", new LocalTime(18, 30), r.getTime());
99105
}
100106

101107

Calendula/src/androidTest/java/es/usc/citius/servando/calendula/activities/RoutinesActivityEditTest.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@
4444

4545
public class RoutinesActivityEditTest extends ActivityInstrumentationTestCase2<RoutinesActivity> {
4646

47-
public static final String NAME_BEFORE_EDIT = "breakfast";
48-
public static final String NAME_AFTER_EDIT = "lunch";
47+
private static final String NAME_BEFORE_EDIT = "Breakfast";
48+
private static final String NAME_AFTER_EDIT = "Lunch";
4949

5050
private RoutinesActivity mActivity;
5151

@@ -109,10 +109,10 @@ public void testEditRoutine() {
109109

110110
// find edited routine and do assertions
111111
Routine r = DB.routines().findOneBy(Routine.COLUMN_NAME, NAME_AFTER_EDIT);
112-
assertEquals(1, DB.routines().count());
113-
assertNotNull(r);
114-
assertEquals(NAME_AFTER_EDIT, r.getName());
115-
assertEquals(new LocalTime(20, 0), r.getTime());
112+
assertEquals("Routine count is wrong",1, DB.routines().count());
113+
assertNotNull("Routine is null", r);
114+
assertEquals("Routine name is wrong",NAME_AFTER_EDIT, r.getName());
115+
assertEquals("Routine time is wrong", new LocalTime(20, 0), r.getTime());
116116
}
117117

118118

Calendula/src/main/java/es/usc/citius/servando/calendula/DailyAgendaRecyclerAdapter.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ public void onBindNormalItemViewHolder(NormalItemViewHolder viewHolder, DailyAge
227227
}
228228

229229
viewHolder.title.setText(item.title);
230-
viewHolder.hour.setText(item.time.toString("kk") + ":");
230+
viewHolder.hour.setText(String.format("%s:", item.time.toString("HH")));
231231
viewHolder.minute.setText(item.time.toString("mm"));
232232

233233
boolean allTaken = addMeds(viewHolder, item);

Calendula/src/main/java/es/usc/citius/servando/calendula/activities/ConfirmActivity.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -379,9 +379,9 @@ protected void onCreate(Bundle savedInstanceState) {
379379

380380
relativeTime = DateUtils.getRelativeTimeSpanString(dt.getMillis(), now.getMillis(), 5 * DateUtils.MINUTE_IN_MILLIS, DateUtils.FORMAT_ABBREV_ALL).toString();
381381

382-
hour.setText(time.toString("kk:"));
382+
hour.setText(time.toString("HH:"));
383383
minute.setText(time.toString("mm"));
384-
friendlyTime.setText(relativeTime.substring(0, 1).toUpperCase() + relativeTime.substring(1));
384+
friendlyTime.setText(String.format("%s%s", relativeTime.substring(0, 1).toUpperCase(), relativeTime.substring(1)));
385385

386386
if (isDistant) {
387387
fab.setBackgroundTintList(ColorStateList.valueOf(getResources().getColor(R.color.android_orange_dark)));

Calendula/src/main/java/es/usc/citius/servando/calendula/activities/PickupNotification.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,15 @@ public static void notify(final Context context, final String title, final Strin
8787
.setTicker(ticker)
8888
.setContentIntent(defaultIntent)
8989
.setStyle(style)
90-
.setPriority(Notification.PRIORITY_DEFAULT)
91-
.setVibrate(new long[]{1000, 200, 500, 200, 100, 200, 1000})
9290
//.setSound(ringtoneUri != null ? ringtoneUri : Settings.System.DEFAULT_NOTIFICATION_URI)
9391
.setAutoCancel(true);
9492

93+
if (NotificationHelper.isNotificationVibrationEnabled(context)) {
94+
builder.setVibrate(NotificationHelper.VIBRATION_PATTERN_DEFAULT);
95+
} else {
96+
builder.setVibrate(NotificationHelper.VIBRATION_PATTERN_NONE);
97+
}
98+
9599
Notification n = builder.build();
96100
n.defaults = 0;
97101
n.ledARGB = 0x00ffa500;

Calendula/src/main/java/es/usc/citius/servando/calendula/activities/ReminderNotification.java

+10-4
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ private static Notification buildNotification(Context context, NotificationOptio
211211
.setSmallIcon(options.lost ? R.drawable.ic_pill_small_lost : R.drawable.ic_pill_small)
212212
.setContentTitle(options.title)
213213
.setContentText(options.text)
214-
.setPriority(NotificationCompat.PRIORITY_HIGH)
214+
.setPriority(NotificationCompat.PRIORITY_MAX)
215215
// Provide a large icon, shown with the notification in the
216216
// notification drawer on devices running Android 3.0 or later.
217217
.setLargeIcon(options.picture)
@@ -226,11 +226,17 @@ private static Notification buildNotification(Context context, NotificationOptio
226226
// or later.
227227
.setStyle(options.style)
228228
// Automatically dismiss the notification when it is touched.
229-
.setAutoCancel(true);
229+
.setAutoCancel(true)
230+
// Set ringtone
231+
.setSound(options.ringtone);
230232

233+
// if insistent is enabled, an activity with vibration will start
231234
if (!insistentNotifications) {
232-
// if insistent is enabled, an activity with vibration will start
233-
builder.setVibrate(new long[]{1000, 200, 100, 500, 400, 200, 100, 500, 400, 200, 100, 500, 1000}).setSound(options.ringtone);
235+
if (NotificationHelper.isNotificationVibrationEnabled(context)) {
236+
builder.setVibrate(NotificationHelper.VIBRATION_PATTERN_MEDS);
237+
} else {
238+
builder.setVibrate(NotificationHelper.VIBRATION_PATTERN_NONE);
239+
}
234240
}
235241

236242
if (!options.lost) {

Calendula/src/main/java/es/usc/citius/servando/calendula/drugdb/download/InstallDatabaseService.java

+1
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ private void showNotification(int max, int prog) {
179179
.setContentIntent(pIntent)
180180
.setContentTitle(getString(R.string.install_db_notification_title))
181181
.setContentText(getString(R.string.install_db_notification_content))
182+
.setOnlyAlertOnce(true)
182183
.setProgress(max, prog, false);
183184

184185
getNotificationManager().notify(NOTIFICATION_ID, mBuilder.build());

Calendula/src/main/java/es/usc/citius/servando/calendula/jobs/CheckDatabaseUpdatesJob.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818

1919
package es.usc.citius.servando.calendula.jobs;
2020

21-
import android.app.NotificationManager;
2221
import android.app.PendingIntent;
2322
import android.content.Context;
2423
import android.content.Intent;
@@ -106,7 +105,8 @@ private void notifyUpdate(Context ctx, final String database) {
106105
.setTicker(ctx.getString(R.string.app_name) + ctx.getString(R.string.text_database_update_available))
107106
.setSmallIcon(R.drawable.ic_launcher_white)
108107
.setLargeIcon(IconUtils.icon(ctx, CommunityMaterial.Icon.cmd_database, R.color.white, 100).toBitmap())
109-
.setVibrate(new long[]{0, 400})
108+
.setVibrate(NotificationHelper.VIBRATION_PATTERN_DB)
109+
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
110110
.setAutoCancel(true)
111111
.setContentIntent(updateIntent);
112112

Calendula/src/main/java/es/usc/citius/servando/calendula/notifications/NotificationHelper.kt

+34
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,24 @@ package es.usc.citius.servando.calendula.notifications
2121
import android.app.NotificationChannel
2222
import android.app.NotificationManager
2323
import android.content.Context
24+
import android.media.AudioManager
2425
import android.os.Build
2526
import es.usc.citius.servando.calendula.R
27+
import es.usc.citius.servando.calendula.util.PreferenceKeys
28+
import es.usc.citius.servando.calendula.util.PreferenceUtils
2629

2730

2831
object NotificationHelper {
2932

33+
@JvmField
34+
val VIBRATION_PATTERN_MEDS =
35+
longArrayOf(1000, 200, 100, 500, 400, 200, 100, 500, 400, 200, 100, 500, 1000)
36+
@JvmField
37+
val VIBRATION_PATTERN_DEFAULT = longArrayOf(1000, 200, 500, 200, 100, 200, 1000)
38+
@JvmField
39+
val VIBRATION_PATTERN_DB = longArrayOf(0, 400)
40+
@JvmField
41+
val VIBRATION_PATTERN_NONE = longArrayOf(0L)
3042

3143
/**
3244
* Intended for high-importance med notifications such as intake reminders.
@@ -72,4 +84,26 @@ object NotificationHelper {
7284
}
7385
}
7486

87+
/**
88+
* Get notification vibration setting for the app.
89+
*
90+
* @param context a [Context], required for getting audioManager
91+
* @return a [Boolean], true if vibration setting is enabled; false otherwise
92+
*/
93+
@JvmStatic
94+
fun isNotificationVibrationEnabled(context: Context): Boolean {
95+
96+
val vibrationSettingInt =
97+
PreferenceUtils.getInt(PreferenceKeys.SETTINGS_NOTIFICATION_VIBRATION, 0)
98+
val audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
99+
100+
return when (vibrationSettingInt) {
101+
0 -> true
102+
1 -> return audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0
103+
// TODO this should not only be if system alarm volume is 0, but also if the selected ringtone is "None"
104+
2 -> return audioManager.getStreamVolume(AudioManager.STREAM_ALARM) == 0
105+
3 -> false
106+
else -> true
107+
}
108+
}
75109
}

Calendula/src/main/java/es/usc/citius/servando/calendula/settings/notifications/NotificationPrefsContract.kt

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ interface NotificationPrefsContract {
3030
fun requestRingtone(reqCode: Int, ringtoneType: Int, currentValue: Uri?)
3131
fun setNotificationRingtoneText(text: String)
3232
fun setInsistentRingtoneText(text: String)
33+
fun setVisibleNotificationManagementPref(visible: Boolean)
3334
}
3435

3536
interface Presenter : IPresenter<View> {

Calendula/src/main/java/es/usc/citius/servando/calendula/settings/notifications/NotificationPrefsFragment.kt

+24
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import android.content.Intent
2222
import android.content.SharedPreferences
2323
import android.media.RingtoneManager
2424
import android.net.Uri
25+
import android.os.Build
2526
import android.os.Bundle
2627
import android.provider.Settings
2728
import android.support.v7.preference.Preference
@@ -42,6 +43,7 @@ class NotificationPrefsFragment :
4243
private const val TAG = "NotificationPrefsFragm"
4344
}
4445

46+
private val applicationPackageName: String by lazy { activity!!.packageName as String }
4547
override val fragmentTitle: Int = R.string.pref_header_notifications
4648
override val presenter: NotificationPrefsContract.Presenter by lazy {
4749
NotificationPrefsPresenter(
@@ -67,6 +69,14 @@ class NotificationPrefsFragment :
6769
presenter.selectInsistentRingtone()
6870
return true
6971
}
72+
PreferenceKeys.SETTINGS_NOTIFICATION_MANAGEMENT.key() -> {
73+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
74+
val intent = Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS)
75+
.putExtra(Settings.EXTRA_APP_PACKAGE, applicationPackageName)
76+
startActivity(intent)
77+
}
78+
return true
79+
}
7080
}
7181
return super.onPreferenceTreeClick(preference)
7282
}
@@ -123,5 +133,19 @@ class NotificationPrefsFragment :
123133
insistentNotificationPref.summary = text
124134
}
125135

136+
override fun setVisibleNotificationManagementPref(visible: Boolean){
137+
findPreference(PreferenceKeys.SETTINGS_NOTIFICATION_TONE.key()).apply{
138+
isEnabled = !visible
139+
isVisible = !visible
140+
}
141+
findPreference(PreferenceKeys.SETTINGS_NOTIFICATION_VIBRATION.key()).apply{
142+
isEnabled = !visible
143+
isVisible = !visible
144+
}
145+
findPreference(PreferenceKeys.SETTINGS_NOTIFICATION_MANAGEMENT.key()).apply{
146+
isEnabled = visible
147+
isVisible = visible
148+
}
149+
}
126150

127151
}

Calendula/src/main/java/es/usc/citius/servando/calendula/settings/notifications/NotificationPrefsPresenter.kt

+7
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ package es.usc.citius.servando.calendula.settings.notifications
2121
import android.content.Intent
2222
import android.media.RingtoneManager
2323
import android.net.Uri
24+
import android.os.Build
2425
import android.provider.Settings
2526
import es.usc.citius.servando.calendula.modules.ModuleManager
2627
import es.usc.citius.servando.calendula.modules.modules.StockModule
@@ -47,6 +48,12 @@ class NotificationPrefsPresenter(
4748
view.hideStockPref()
4849
}
4950
updateRingtoneSummaries()
51+
52+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
53+
view.setVisibleNotificationManagementPref(true)
54+
} else {
55+
view.setVisibleNotificationManagementPref(false)
56+
}
5057
}
5158

5259

Calendula/src/main/java/es/usc/citius/servando/calendula/settings/privacy/PrivacyPrefsFragment.kt

+12-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import android.os.Bundle
2424
import android.support.v14.preference.SwitchPreference
2525
import android.support.v7.preference.ListPreference
2626
import android.support.v7.preference.Preference
27+
import android.view.WindowManager
2728
import com.github.javiersantos.materialstyleddialogs.MaterialStyledDialog
2829
import com.github.javiersantos.materialstyleddialogs.enums.Style
2930
import com.mikepenz.google_material_typeface_library.GoogleMaterial
@@ -44,7 +45,6 @@ class PrivacyPrefsFragment :
4445
PrivacyPrefsContract.View {
4546

4647

47-
4848
companion object {
4949
private const val TAG = "PrivacyPrefsFragment"
5050
}
@@ -61,6 +61,7 @@ class PrivacyPrefsFragment :
6161
private val pinPref: Preference by lazy { findPreference(PreferenceKeys.UNLOCK_PIN.key()) }
6262
private val fingerprintPref: SwitchPreference by lazy { findPreference(PreferenceKeys.FINGERPRINT_ENABLED.key()) as SwitchPreference }
6363
private val pinTimeoutPref: ListPreference by lazy { findPreference(PreferenceKeys.UNLOCK_PIN_TIMEOUT.key()) as ListPreference }
64+
private val secureWindowPref: SwitchPreference by lazy { findPreference(PreferenceKeys.SECURE_WINDOW.key()) as SwitchPreference }
6465

6566

6667
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
@@ -86,6 +87,16 @@ class PrivacyPrefsFragment :
8687
pinTimeoutPref.key -> {
8788
pinTimeoutPref.summary = pinTimeoutPref.entry
8889
}
90+
secureWindowPref.key -> {
91+
if (secureWindowPref.isChecked) {
92+
activity?.window?.setFlags(
93+
WindowManager.LayoutParams.FLAG_SECURE,
94+
WindowManager.LayoutParams.FLAG_SECURE
95+
)
96+
} else {
97+
activity?.window?.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)
98+
}
99+
}
89100
}
90101
}
91102

Calendula/src/main/java/es/usc/citius/servando/calendula/util/PreferenceKeys.java

+2
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ public enum PreferenceKeys {
6666
SETTINGS_ALARM_NOTIFICATIONS(R.string.prefkey_settings_alarm_notifications),
6767
SETTINGS_DATABASE_UPDATE(R.string.prefkey_settings_database_update),
6868
SETTINGS_NOTIFICATION_TONE(R.string.prefkey_settings_notification_tone),
69+
SETTINGS_NOTIFICATION_VIBRATION(R.string.prefkey_settings_notification_vibration),
70+
SETTINGS_NOTIFICATION_MANAGEMENT(R.string.prefkey_settings_notification_management),
6971
SETTINGS_INSISTENT_NOTIFICATION_TONE(R.string.prefkey_settings_insistent_notification_tone),
7072
SETTINGS_STOCK_ALERT_DAYS(R.string.prefkey_settings_stock_alert_days),
7173
SETTINGS_DEFAULTS_LOADED(R.string.prefkey_settings_defaults_loaded),

0 commit comments

Comments
 (0)