diff --git a/app/build.gradle b/app/build.gradle index 858fe354fc..783561a599 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -225,8 +225,8 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.google.android.gms:play-services-wearable:17.0.0' - implementation 'com.google.firebase:firebase-core:17.2.0' - implementation("com.crashlytics.sdk.android:crashlytics:2.9.9@aar") { + implementation 'com.google.firebase:firebase-core:17.2.1' + implementation('com.crashlytics.sdk.android:crashlytics:2.10.1@aar') { transitive = true; } @@ -234,11 +234,11 @@ dependencies { implementation 'androidx.legacy:legacy-support-v13:1.0.0' implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'androidx.cardview:cardview:1.0.0' - implementation 'androidx.recyclerview:recyclerview:1.0.0' + implementation 'androidx.recyclerview:recyclerview:1.1.0' implementation 'androidx.gridlayout:gridlayout:1.0.0' implementation 'com.google.android.material:material:1.0.0' implementation 'androidx.percentlayout:percentlayout:1.0.0' - implementation "com.wdullaer:materialdatetimepicker:2.3.0" + implementation 'com.wdullaer:materialdatetimepicker:4.2.3' implementation "io.reactivex.rxjava2:rxandroid:2.1.1" @@ -247,11 +247,11 @@ dependencies { implementation("com.github.tony19:logback-android-classic:1.1.1-6") { exclude group: "com.google.android", module: "android" } - implementation "org.apache.commons:commons-lang3:3.7" - implementation "org.slf4j:slf4j-api:1.7.21" + implementation "org.apache.commons:commons-lang3:3.9" + implementation "org.slf4j:slf4j-api:1.7.29" // Graphview cannot be upgraded implementation "com.jjoe64:graphview:4.0.1" - implementation "com.joanzapata.iconify:android-iconify-fontawesome:2.1.1" + implementation "com.joanzapata.iconify:android-iconify-fontawesome:2.2.2" implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation(name: "android-edittext-validator-v1.3.4-mod", ext: "aar") implementation 'com.madgag.spongycastle:core:1.58.0.0' @@ -263,24 +263,23 @@ dependencies { // excluding org.json which is provided by Android exclude group: "org.json", module: "json" } - implementation "com.google.code.gson:gson:2.8.5" + implementation "com.google.code.gson:gson:2.8.6" implementation "com.google.guava:guava:24.1-jre" - implementation "net.danlew:android.joda:2.9.9.1" - implementation "uk.com.robust-it:cloning:1.9.9" + implementation "net.danlew:android.joda:2.10.3" - implementation 'org.mozilla:rhino:1.7.7.2' + implementation 'org.mozilla:rhino:1.7.11' implementation 'com.github.DavidProdinger:weekdays-selector:1.1.0' testImplementation "junit:junit:4.12" - testImplementation "org.json:json:20140107" + testImplementation "org.json:json:20190722" testImplementation "org.mockito:mockito-core:2.8.47" testImplementation "org.powermock:powermock-api-mockito2:${powermockVersion}" testImplementation "org.powermock:powermock-module-junit4-rule-agent:${powermockVersion}" testImplementation "org.powermock:powermock-module-junit4-rule:${powermockVersion}" testImplementation "org.powermock:powermock-module-junit4:${powermockVersion}" - testImplementation "joda-time:joda-time:2.9.9" + testImplementation "joda-time:joda-time:2.10.5" testImplementation("com.google.truth:truth:0.39") { exclude group: "com.google.guava", module: "guava" } @@ -300,11 +299,11 @@ dependencies { // new for tidepool - implementation 'com.squareup.okhttp3:okhttp:3.10.0' - implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0' - implementation "com.squareup.retrofit2:retrofit:2.4.0" - implementation "com.squareup.retrofit2:adapter-rxjava2:2.4.0" - implementation "com.squareup.retrofit2:converter-gson:2.4.0" + implementation 'com.squareup.okhttp3:okhttp:4.2.2' + implementation 'com.squareup.okhttp3:logging-interceptor:4.2.2' + implementation "com.squareup.retrofit2:retrofit:2.6.2" + implementation "com.squareup.retrofit2:adapter-rxjava2:2.6.2" + implementation "com.squareup.retrofit2:converter-gson:2.6.2" } diff --git a/app/src/main/java/info/nightscout/androidaps/MainActivity.java b/app/src/main/java/info/nightscout/androidaps/MainActivity.java index d011a12dd3..c383d039ed 100644 --- a/app/src/main/java/info/nightscout/androidaps/MainActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/MainActivity.java @@ -37,12 +37,10 @@ import com.joanzapata.iconify.fonts.FontAwesomeModule; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import info.nightscout.androidaps.activities.AgreementActivity; import info.nightscout.androidaps.activities.HistoryBrowseActivity; import info.nightscout.androidaps.activities.NoSplashAppCompatActivity; import info.nightscout.androidaps.activities.PreferencesActivity; import info.nightscout.androidaps.activities.SingleFragmentActivity; -import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.events.EventPreferenceChange; import info.nightscout.androidaps.events.EventRebuildTabs; @@ -51,7 +49,6 @@ import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.logging.L; import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin; import info.nightscout.androidaps.plugins.bus.RxBus; -import info.nightscout.androidaps.plugins.configBuilder.ProfileFunctions; import info.nightscout.androidaps.plugins.constraints.versionChecker.VersionCheckerUtilsKt; import info.nightscout.androidaps.plugins.general.nsclient.data.NSSettingsStatus; import info.nightscout.androidaps.setupwizard.SetupWizardActivity; @@ -59,7 +56,6 @@ import info.nightscout.androidaps.tabs.TabPageAdapter; import info.nightscout.androidaps.utils.AndroidPermission; import info.nightscout.androidaps.utils.FabricPrivacy; import info.nightscout.androidaps.utils.LocaleHelper; -import info.nightscout.androidaps.utils.OKDialog; import info.nightscout.androidaps.utils.PasswordProtection; import info.nightscout.androidaps.utils.SP; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -141,11 +137,9 @@ public class MainActivity extends NoSplashAppCompatActivity { .subscribe(this::processPreferenceChange, FabricPrivacy::logException) ); - if (!SP.getBoolean(R.string.key_setupwizard_processed, false)) { + if (!SP.getBoolean(R.string.key_setupwizard_processed, false) || !SP.contains(R.string.key_units)) { Intent intent = new Intent(this, SetupWizardActivity.class); startActivity(intent); - } else { - checkEula(); } AndroidPermission.notifyForStoragePermission(this); @@ -237,16 +231,6 @@ public class MainActivity extends NoSplashAppCompatActivity { } } - private void checkEula() { - //SP.removeBoolean(R.string.key_i_understand); - boolean IUnderstand = SP.getBoolean(R.string.key_i_understand, false); - if (!IUnderstand) { - Intent intent = new Intent(getApplicationContext(), AgreementActivity.class); - startActivity(intent); - finish(); - } - } - private void doMigrations() { // guarantee that the unreachable threshold is at least 30 and of type String @@ -255,11 +239,6 @@ public class MainActivity extends NoSplashAppCompatActivity { SP.remove(R.string.key_pump_unreachable_threshold); if (unreachable_threshold < 30) unreachable_threshold = 30; SP.putString(R.string.key_pump_unreachable_threshold, Integer.toString(unreachable_threshold)); - - if (!SP.contains(R.string.key_units)) { - Intent intent = new Intent(this, SetupWizardActivity.class); - startActivity(intent); - } } diff --git a/app/src/main/java/info/nightscout/androidaps/activities/AgreementActivity.java b/app/src/main/java/info/nightscout/androidaps/activities/AgreementActivity.java deleted file mode 100644 index d3792bbad5..0000000000 --- a/app/src/main/java/info/nightscout/androidaps/activities/AgreementActivity.java +++ /dev/null @@ -1,44 +0,0 @@ -package info.nightscout.androidaps.activities; - -import android.app.Activity; -import android.content.Intent; -import android.os.Bundle; -import android.view.View; -import android.widget.Button; -import android.widget.CheckBox; - -import info.nightscout.androidaps.MainActivity; -import info.nightscout.androidaps.R; -import info.nightscout.androidaps.utils.SP; - -public class AgreementActivity extends NoSplashActivity { - boolean IUnderstand; - CheckBox agreeCheckBox; - Button saveButton; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_agreement); - IUnderstand = SP.getBoolean(R.string.key_i_understand, false); - setContentView(R.layout.activity_agreement); - agreeCheckBox = (CheckBox)findViewById(R.id.agreementCheckBox); - agreeCheckBox.setChecked(IUnderstand); - saveButton = (Button)findViewById(R.id.agreementSaveButton); - addListenerOnButton(); - } - - public void addListenerOnButton() { - saveButton.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - - SP.putBoolean(R.string.key_i_understand, agreeCheckBox.isChecked()); - - Intent intent = new Intent(getApplicationContext(), MainActivity.class); - startActivity(intent); - finish(); - } - - }); - } -} diff --git a/app/src/main/java/info/nightscout/androidaps/activities/HistoryBrowseActivity.java b/app/src/main/java/info/nightscout/androidaps/activities/HistoryBrowseActivity.java index 2397dda9ed..c0f654bbbb 100644 --- a/app/src/main/java/info/nightscout/androidaps/activities/HistoryBrowseActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/activities/HistoryBrowseActivity.java @@ -45,7 +45,7 @@ import info.nightscout.androidaps.utils.T; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; -public class HistoryBrowseActivity extends NoSplashActivity { +public class HistoryBrowseActivity extends NoSplashAppCompatActivity { private static Logger log = LoggerFactory.getLogger(HistoryBrowseActivity.class); private CompositeDisposable disposable = new CompositeDisposable(); @@ -150,7 +150,7 @@ public class HistoryBrowseActivity extends NoSplashActivity { ); dpd.setThemeDark(true); dpd.dismissOnPause(true); - dpd.show(getFragmentManager(), "Datepickerdialog"); + dpd.show(getSupportFragmentManager(), "Datepickerdialog"); }); bgGraph.getGridLabelRenderer().setGridColor(MainApp.gc(R.color.graphgrid)); diff --git a/app/src/main/java/info/nightscout/androidaps/activities/NoSplashActivity.kt b/app/src/main/java/info/nightscout/androidaps/activities/NoSplashActivity.kt deleted file mode 100644 index 0b7af2bd1d..0000000000 --- a/app/src/main/java/info/nightscout/androidaps/activities/NoSplashActivity.kt +++ /dev/null @@ -1,13 +0,0 @@ -package info.nightscout.androidaps.activities - -import android.app.Activity -import android.os.Bundle - -import info.nightscout.androidaps.R - -open class NoSplashActivity : Activity() { - public override fun onCreate(savedInstanceState: Bundle?) { - setTheme(R.style.AppTheme_NoActionBar) - super.onCreate(savedInstanceState) - } -} diff --git a/app/src/main/java/info/nightscout/androidaps/activities/NoSplashAppCompatActivity.kt b/app/src/main/java/info/nightscout/androidaps/activities/NoSplashAppCompatActivity.kt index e4c8027cd5..3f59cd56ef 100644 --- a/app/src/main/java/info/nightscout/androidaps/activities/NoSplashAppCompatActivity.kt +++ b/app/src/main/java/info/nightscout/androidaps/activities/NoSplashAppCompatActivity.kt @@ -1,12 +1,18 @@ package info.nightscout.androidaps.activities +import android.content.Context import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import info.nightscout.androidaps.R +import info.nightscout.androidaps.utils.LocaleHelper open class NoSplashAppCompatActivity : AppCompatActivity() { public override fun onCreate(savedInstanceState: Bundle?) { setTheme(R.style.AppTheme_NoActionBar) super.onCreate(savedInstanceState) } + + public override fun attachBaseContext(newBase: Context) { + super.attachBaseContext(LocaleHelper.wrap(newBase)) + } } diff --git a/app/src/main/java/info/nightscout/androidaps/activities/PreferencesActivity.java b/app/src/main/java/info/nightscout/androidaps/activities/PreferencesActivity.java index 65699bcc77..c0dbf43527 100644 --- a/app/src/main/java/info/nightscout/androidaps/activities/PreferencesActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/activities/PreferencesActivity.java @@ -1,5 +1,6 @@ package info.nightscout.androidaps.activities; +import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.EditTextPreference; @@ -47,6 +48,7 @@ import info.nightscout.androidaps.plugins.sensitivity.SensitivityOref0Plugin; import info.nightscout.androidaps.plugins.sensitivity.SensitivityOref1Plugin; import info.nightscout.androidaps.plugins.sensitivity.SensitivityWeightedAveragePlugin; import info.nightscout.androidaps.plugins.source.SourceDexcomPlugin; +import info.nightscout.androidaps.utils.LocaleHelper; import info.nightscout.androidaps.utils.OKDialog; import info.nightscout.androidaps.utils.SP; import info.nightscout.androidaps.utils.SafeParse; @@ -66,6 +68,11 @@ public class PreferencesActivity extends PreferenceActivity implements SharedPre PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this); } + @Override + public void attachBaseContext(Context newBase) { + super.attachBaseContext(LocaleHelper.INSTANCE.wrap(newBase)); + } + @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { RxBus.INSTANCE.send(new EventPreferenceChange(key)); @@ -122,7 +129,8 @@ public class PreferencesActivity extends PreferenceActivity implements SharedPre } } } - adjustUnitDependentPrefs(pref); + if (pref != null) + adjustUnitDependentPrefs(pref); } public static void initSummary(Preference p) { diff --git a/app/src/main/java/info/nightscout/androidaps/activities/TDDStatsActivity.java b/app/src/main/java/info/nightscout/androidaps/activities/TDDStatsActivity.java index 24cdceada6..03fb034c5c 100644 --- a/app/src/main/java/info/nightscout/androidaps/activities/TDDStatsActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/activities/TDDStatsActivity.java @@ -54,7 +54,7 @@ import info.nightscout.androidaps.utils.SafeParse; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; -public class TDDStatsActivity extends NoSplashActivity { +public class TDDStatsActivity extends NoSplashAppCompatActivity { private static Logger log = LoggerFactory.getLogger(TDDStatsActivity.class); private CompositeDisposable disposable = new CompositeDisposable(); diff --git a/app/src/main/java/info/nightscout/androidaps/data/IobTotal.java b/app/src/main/java/info/nightscout/androidaps/data/IobTotal.java index 79885e297f..60e1b21048 100644 --- a/app/src/main/java/info/nightscout/androidaps/data/IobTotal.java +++ b/app/src/main/java/info/nightscout/androidaps/data/IobTotal.java @@ -1,7 +1,5 @@ package info.nightscout.androidaps.data; -import com.rits.cloning.Cloner; - import org.json.JSONException; import org.json.JSONObject; import org.slf4j.Logger; @@ -37,8 +35,19 @@ public class IobTotal implements DataPointWithLabelInterface { public IobTotal copy() { - Cloner cloner = new Cloner(); - return cloner.deepClone(this); + IobTotal i = new IobTotal(time); + i.iob = iob; + i.activity = activity; + i.bolussnooze = bolussnooze; + i.basaliob = basaliob; + i.netbasalinsulin = netbasalinsulin; + i.hightempinsulin = hightempinsulin; + i.lastBolusTime = lastBolusTime; + if (iobWithZeroTemp != null) i.iobWithZeroTemp = iobWithZeroTemp.copy(); + i.netInsulin = netInsulin; + i.netRatio = netRatio; + i.extendedBolusInsulin = extendedBolusInsulin; + return i; } public IobTotal(long time) { @@ -137,7 +146,7 @@ public class IobTotal implements DataPointWithLabelInterface { // DataPoint interface - int color; + private int color; @Override public double getX() { diff --git a/app/src/main/java/info/nightscout/androidaps/db/BgReading.java b/app/src/main/java/info/nightscout/androidaps/db/BgReading.java index 4224bf9c98..abac9e08c0 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/BgReading.java +++ b/app/src/main/java/info/nightscout/androidaps/db/BgReading.java @@ -7,6 +7,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Date; +import java.util.List; import java.util.Objects; import info.nightscout.androidaps.Constants; @@ -19,10 +20,11 @@ import info.nightscout.androidaps.plugins.general.overview.OverviewPlugin; import info.nightscout.androidaps.plugins.general.overview.graphExtensions.DataPointWithLabelInterface; import info.nightscout.androidaps.plugins.general.overview.graphExtensions.PointsWithLabelGraphSeries; import info.nightscout.androidaps.utils.DecimalFormatter; +import info.nightscout.androidaps.utils.T; @DatabaseTable(tableName = DatabaseHelper.DATABASE_BGREADINGS) public class BgReading implements DataPointWithLabelInterface { - private static Logger log = LoggerFactory.getLogger(L.DATABASE); + private static Logger log = LoggerFactory.getLogger(L.GLUCOSE); @DatabaseField(id = true) public long date; @@ -73,9 +75,10 @@ public class BgReading implements DataPointWithLabelInterface { public String directionToSymbol() { String symbol = ""; - if (direction == null) { - symbol = "??"; - } else if (direction.compareTo("DoubleDown") == 0) { + if (direction == null) + direction = calculateDirection(); + + if (direction.compareTo("DoubleDown") == 0) { symbol = "\u21ca"; } else if (direction.compareTo("SingleDown") == 0) { symbol = "\u2193"; @@ -95,18 +98,13 @@ public class BgReading implements DataPointWithLabelInterface { return symbol; } - public static boolean isSlopeNameInvalid(String direction) { - if (direction.compareTo("NOT_COMPUTABLE") == 0 || + private static boolean isSlopeNameInvalid(String direction) { + return direction.compareTo("NOT_COMPUTABLE") == 0 || direction.compareTo("NOT COMPUTABLE") == 0 || direction.compareTo("OUT_OF_RANGE") == 0 || direction.compareTo("OUT OF RANGE") == 0 || direction.compareTo("NONE") == 0 || - direction.compareTo("NotComputable") == 0 - ) { - return true; - } else { - return false; - } + direction.compareTo("NotComputable") == 0; } @@ -123,7 +121,8 @@ public class BgReading implements DataPointWithLabelInterface { public boolean isDataChanging(BgReading other) { if (date != other.date) { - log.error("Comparing different"); + if (L.isEnabled(L.GLUCOSE)) + log.error("Comparing different"); return false; } if (value != other.value) @@ -133,7 +132,8 @@ public class BgReading implements DataPointWithLabelInterface { public boolean isEqual(BgReading other) { if (date != other.date) { - log.error("Comparing different"); + if (L.isEnabled(L.GLUCOSE)) + log.error("Comparing different"); return false; } if (value != other.value) @@ -149,7 +149,8 @@ public class BgReading implements DataPointWithLabelInterface { public void copyFrom(BgReading other) { if (date != other.date) { - log.error("Copying different"); + if (L.isEnabled(L.GLUCOSE)) + log.error("Copying different"); return; } value = other.value; @@ -245,4 +246,53 @@ public class BgReading implements DataPointWithLabelInterface { return isaCOBPrediction || isCOBPrediction || isIOBPrediction || isUAMPrediction || isZTPrediction; } + + // Copied from xDrip+ + String calculateDirection() { + // Rework to get bgreaings from internal DB and calculate on that base + + List bgReadingsList = MainApp.getDbHelper().getAllBgreadingsDataFromTime(this.date - T.mins(10).msecs(), false); + if (bgReadingsList == null || bgReadingsList.size() < 2) + return "NONE"; + BgReading current = bgReadingsList.get(1); + BgReading previous = bgReadingsList.get(0); + + if (bgReadingsList.get(1).date < bgReadingsList.get(0).date) { + current = bgReadingsList.get(0); + previous = bgReadingsList.get(1); + } + + double slope; + + // Avoid division by 0 + if (current.date == previous.date) + slope = 0; + else + slope = (previous.value - current.value) / (previous.date - current.date); + + if (L.isEnabled(L.GLUCOSE)) + log.debug("Slope is :" + slope + " delta " + (previous.value - current.value) + " date difference " + (current.date - previous.date)); + + double slope_by_minute = slope * 60000; + String arrow = "NONE"; + + if (slope_by_minute <= (-3.5)) { + arrow = "DoubleDown"; + } else if (slope_by_minute <= (-2)) { + arrow = "SingleDown"; + } else if (slope_by_minute <= (-1)) { + arrow = "FortyFiveDown"; + } else if (slope_by_minute <= (1)) { + arrow = "Flat"; + } else if (slope_by_minute <= (2)) { + arrow = "FortyFiveUp"; + } else if (slope_by_minute <= (3.5)) { + arrow = "SingleUp"; + } else if (slope_by_minute <= (40)) { + arrow = "DoubleUp"; + } + if (L.isEnabled(L.GLUCOSE)) + log.debug("Direction set to: " + arrow); + return arrow; + } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationFragment.kt index d1135c21ed..5266c0781c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationFragment.kt @@ -5,10 +5,14 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import info.nightscout.androidaps.R import info.nightscout.androidaps.plugins.bus.RxBus import info.nightscout.androidaps.plugins.general.automation.dialogs.EditEventDialog +import info.nightscout.androidaps.plugins.general.automation.dragHelpers.OnStartDragListener +import info.nightscout.androidaps.plugins.general.automation.dragHelpers.SimpleItemTouchHelperCallback import info.nightscout.androidaps.plugins.general.automation.events.EventAutomationDataChanged import info.nightscout.androidaps.plugins.general.automation.events.EventAutomationUpdateGui import info.nightscout.androidaps.utils.FabricPrivacy @@ -17,11 +21,14 @@ import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.CompositeDisposable import kotlinx.android.synthetic.main.automation_fragment.* -class AutomationFragment : Fragment() { + +class AutomationFragment : Fragment(), OnStartDragListener { private var disposable: CompositeDisposable = CompositeDisposable() private var eventListAdapter: EventListAdapter? = null + private var itemTouchHelper: ItemTouchHelper? = null + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.automation_fragment, container, false) } @@ -29,7 +36,7 @@ class AutomationFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - eventListAdapter = EventListAdapter(AutomationPlugin.automationEvents, fragmentManager, activity) + eventListAdapter = EventListAdapter(AutomationPlugin.automationEvents, fragmentManager, activity, this) automation_eventListView.layoutManager = LinearLayoutManager(context) automation_eventListView.adapter = eventListAdapter @@ -42,6 +49,10 @@ class AutomationFragment : Fragment() { fragmentManager?.let { dialog.show(it, "EditEventDialog") } } + val callback: ItemTouchHelper.Callback = SimpleItemTouchHelperCallback(eventListAdapter!!) + itemTouchHelper = ItemTouchHelper(callback) + itemTouchHelper?.attachToRecyclerView(automation_eventListView) + } @Synchronized @@ -81,4 +92,8 @@ class AutomationFragment : Fragment() { automation_logView?.text = sb.toString() } + override fun onStartDrag(viewHolder: RecyclerView.ViewHolder) { + itemTouchHelper?.startDrag(viewHolder); + } + } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationPlugin.kt index 8b78ae6458..b559311f9d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationPlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationPlugin.kt @@ -161,7 +161,7 @@ object AutomationPlugin : PluginBase(PluginDescription() private fun processActions() { if (!isEnabled(PluginType.GENERAL)) return - if (LoopPlugin.getPlugin().isSuspended) { + if (LoopPlugin.getPlugin().isSuspended || !LoopPlugin.getPlugin().isEnabled(PluginType.LOOP)) { if (L.isEnabled(L.AUTOMATION)) log.debug("Loop deactivated") return diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/EventListAdapter.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/EventListAdapter.java index 08079a9110..87c78d02eb 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/EventListAdapter.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/EventListAdapter.java @@ -1,9 +1,12 @@ package info.nightscout.androidaps.plugins.general.automation; +import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; +import android.graphics.Color; import android.os.Bundle; import android.view.LayoutInflater; +import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.CheckBox; @@ -17,6 +20,7 @@ import androidx.annotation.NonNull; import androidx.fragment.app.FragmentManager; import androidx.recyclerview.widget.RecyclerView; +import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -25,19 +29,26 @@ import info.nightscout.androidaps.R; import info.nightscout.androidaps.plugins.bus.RxBus; import info.nightscout.androidaps.plugins.general.automation.actions.Action; import info.nightscout.androidaps.plugins.general.automation.dialogs.EditEventDialog; +import info.nightscout.androidaps.plugins.general.automation.dragHelpers.ItemTouchHelperAdapter; +import info.nightscout.androidaps.plugins.general.automation.dragHelpers.ItemTouchHelperViewHolder; +import info.nightscout.androidaps.plugins.general.automation.dragHelpers.OnStartDragListener; import info.nightscout.androidaps.plugins.general.automation.events.EventAutomationDataChanged; +import info.nightscout.androidaps.plugins.general.automation.events.EventAutomationUpdateGui; import info.nightscout.androidaps.plugins.general.automation.triggers.TriggerConnector; import info.nightscout.androidaps.utils.OKDialog; -class EventListAdapter extends RecyclerView.Adapter { +class EventListAdapter extends RecyclerView.Adapter implements ItemTouchHelperAdapter { private final List eventList; private final FragmentManager fragmentManager; private final Activity activity; - EventListAdapter(List events, FragmentManager fragmentManager, Activity activity) { + private final OnStartDragListener mDragStartListener; + + EventListAdapter(List events, FragmentManager fragmentManager, Activity activity, OnStartDragListener dragStartListener) { this.eventList = events; this.fragmentManager = fragmentManager; this.activity = activity; + mDragStartListener = dragStartListener; } @NonNull @@ -54,6 +65,7 @@ class EventListAdapter extends RecyclerView.Adapter layout.addView(iv); } + @SuppressLint("ClickableViewAccessibility") @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { final AutomationEvent event = eventList.get(position); @@ -91,16 +103,10 @@ class EventListAdapter extends RecyclerView.Adapter RxBus.INSTANCE.send(new EventAutomationDataChanged()); }); - // remove event - holder.iconTrash.setOnClickListener(v -> - OKDialog.showConfirmation(activity, MainApp.gs(R.string.removerecord) + " " + event.getTitle(), () -> { - eventList.remove(event); - RxBus.INSTANCE.send(new EventAutomationDataChanged()); - }) - ); - // edit event - holder.rootLayout.setOnClickListener(v -> { + holder.rootLayout.setOnClickListener(v -> + + { //EditEventDialog dialog = EditEventDialog.Companion.newInstance(event, false); EditEventDialog dialog = new EditEventDialog(); Bundle args = new Bundle(); @@ -110,6 +116,17 @@ class EventListAdapter extends RecyclerView.Adapter if (fragmentManager != null) dialog.show(fragmentManager, "EditEventDialog"); }); + + // Start a drag whenever the handle view it touched + holder.iconSort.setOnTouchListener((v, motionEvent) -> + + { + if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { + mDragStartListener.onStartDrag(holder); + return true; + } + return v.onTouchEvent(motionEvent); + }); } @Override @@ -117,12 +134,33 @@ class EventListAdapter extends RecyclerView.Adapter return eventList.size(); } - static class ViewHolder extends RecyclerView.ViewHolder { + @Override + public boolean onItemMove(int fromPosition, int toPosition) { + Collections.swap(eventList, fromPosition, toPosition); + notifyItemMoved(fromPosition, toPosition); + RxBus.INSTANCE.send(new EventAutomationDataChanged()); + return true; + } + + @Override + public void onItemDismiss(int position) { + OKDialog.showConfirmation(activity, MainApp.gs(R.string.removerecord) + " " + eventList.get(position).getTitle(), + () -> { + eventList.remove(position); + notifyItemRemoved(position); + RxBus.INSTANCE.send(new EventAutomationDataChanged()); + RxBus.INSTANCE.send(new EventAutomationUpdateGui()); + }, () -> { + RxBus.INSTANCE.send(new EventAutomationUpdateGui()); + }); + } + + static class ViewHolder extends RecyclerView.ViewHolder implements ItemTouchHelperViewHolder { final RelativeLayout rootLayout; final LinearLayout iconLayout; final TextView eventTitle; final Context context; - final ImageView iconTrash; + final ImageView iconSort; final CheckBox enabled; ViewHolder(View view, Context context) { @@ -131,8 +169,18 @@ class EventListAdapter extends RecyclerView.Adapter eventTitle = view.findViewById(R.id.viewEventTitle); rootLayout = view.findViewById(R.id.rootLayout); iconLayout = view.findViewById(R.id.iconLayout); - iconTrash = view.findViewById(R.id.iconTrash); + iconSort = view.findViewById(R.id.iconSort); enabled = view.findViewById(R.id.automation_enabled); } + + @Override + public void onItemSelected() { + itemView.setBackgroundColor(Color.LTGRAY); + } + + @Override + public void onItemClear() { + itemView.setBackgroundColor(MainApp.gc(R.color.ribbonDefault)); + } } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/dragHelpers/ItemTouchHelperAdapter.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/dragHelpers/ItemTouchHelperAdapter.kt new file mode 100644 index 0000000000..bdd68080ef --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/dragHelpers/ItemTouchHelperAdapter.kt @@ -0,0 +1,33 @@ +package info.nightscout.androidaps.plugins.general.automation.dragHelpers + + +interface ItemTouchHelperAdapter { + /** + * Called when an item has been dragged far enough to trigger a move. This is called every time + * an item is shifted, and **not** at the end of a "drop" event.

+ *

+ * Implementations should call [RecyclerView.Adapter.notifyItemMoved] after + * adjusting the underlying data to reflect this move. + * + * @param fromPosition The start position of the moved item. + * @param toPosition Then resolved position of the moved item. + * @return True if the item was moved to the new adapter position. + * + * @see RecyclerView.getAdapterPositionFor + * @see RecyclerView.ViewHolder.getAdapterPosition + */ + fun onItemMove(fromPosition: Int, toPosition: Int): Boolean + + /** + * Called when an item has been dismissed by a swipe.

+ *

+ * Implementations should call [RecyclerView.Adapter.notifyItemRemoved] after + * adjusting the underlying data to reflect this removal. + * + * @param position The position of the item dismissed. + * + * @see RecyclerView.getAdapterPositionFor + * @see RecyclerView.ViewHolder.getAdapterPosition + */ + fun onItemDismiss(position: Int) +} \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/dragHelpers/ItemTouchHelperViewHolder.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/dragHelpers/ItemTouchHelperViewHolder.kt new file mode 100644 index 0000000000..a873e5253d --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/dragHelpers/ItemTouchHelperViewHolder.kt @@ -0,0 +1,20 @@ +package info.nightscout.androidaps.plugins.general.automation.dragHelpers + +/** + * Interface to notify an item ViewHolder of relevant callbacks from [ ]. + * + * @author Paul Burke (ipaulpro) + */ +interface ItemTouchHelperViewHolder { + /** + * Called when the [ItemTouchHelper] first registers an item as being moved or swiped. + * Implementations should update the item view to indicate it's active state. + */ + fun onItemSelected() + + /** + * Called when the [ItemTouchHelper] has completed the move or swipe, and the active item + * state should be cleared. + */ + fun onItemClear() +} \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/dragHelpers/OnStartDragListener.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/dragHelpers/OnStartDragListener.kt new file mode 100644 index 0000000000..9a90a360de --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/dragHelpers/OnStartDragListener.kt @@ -0,0 +1,12 @@ +package info.nightscout.androidaps.plugins.general.automation.dragHelpers + +import androidx.recyclerview.widget.RecyclerView + +interface OnStartDragListener { + /** + * Called when a view is requesting a start of a drag. + * + * @param viewHolder The holder of the view to drag. + */ + fun onStartDrag(viewHolder: RecyclerView.ViewHolder) +} \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/dragHelpers/SimpleItemTouchHelperCallback.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/dragHelpers/SimpleItemTouchHelperCallback.kt new file mode 100644 index 0000000000..7e66046e73 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/dragHelpers/SimpleItemTouchHelperCallback.kt @@ -0,0 +1,85 @@ +package info.nightscout.androidaps.plugins.general.automation.dragHelpers + +import android.graphics.Canvas +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.ItemTouchHelper +import androidx.recyclerview.widget.RecyclerView +import kotlin.math.abs + + +/** + * An implementation of [ItemTouchHelper.Callback] that enables basic drag & drop and + * swipe-to-dismiss. Drag events are automatically started by an item long-press.

+ * + * Expects the `RecyclerView.Adapter` to listen for [ ] callbacks and the `RecyclerView.ViewHolder` to implement + * [ItemTouchHelperViewHolder]. + * + */ +class SimpleItemTouchHelperCallback(private val mAdapter: ItemTouchHelperAdapter) : ItemTouchHelper.Callback() { + override fun isLongPressDragEnabled(): Boolean { + return true + } + + override fun isItemViewSwipeEnabled(): Boolean { + return true + } + + override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int { // Set movement flags based on the layout manager + return if (recyclerView.layoutManager is GridLayoutManager) { + val dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN or ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT + val swipeFlags = 0 + makeMovementFlags(dragFlags, swipeFlags) + } else { + val dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN + val swipeFlags = ItemTouchHelper.START or ItemTouchHelper.END + makeMovementFlags(dragFlags, swipeFlags) + } + } + + override fun onMove(recyclerView: RecyclerView, source: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean { + if (source.itemViewType != target.itemViewType) { + return false + } + // Notify the adapter of the move + mAdapter.onItemMove(source.adapterPosition, target.adapterPosition) + return true + } + + override fun onSwiped(viewHolder: RecyclerView.ViewHolder, i: Int) { // Notify the adapter of the dismissal + mAdapter.onItemDismiss(viewHolder.adapterPosition) + } + + override fun onChildDraw(c: Canvas, recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, dX: Float, dY: Float, actionState: Int, isCurrentlyActive: Boolean) { + if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) { // Fade out the view as it is swiped out of the parent's bounds + val alpha = ALPHA_FULL - abs(dX) / viewHolder.itemView.width.toFloat() + viewHolder.itemView.alpha = alpha + viewHolder.itemView.translationX = dX + } else { + super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive) + } + } + + override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) { // We only want the active item to change + if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) { + if (viewHolder is ItemTouchHelperViewHolder) { // Let the view holder know that this item is being moved or dragged + val itemViewHolder: ItemTouchHelperViewHolder = viewHolder + itemViewHolder.onItemSelected() + } + } + super.onSelectedChanged(viewHolder, actionState) + } + + override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) { + super.clearView(recyclerView, viewHolder) + viewHolder.itemView.alpha = ALPHA_FULL + if (viewHolder is ItemTouchHelperViewHolder) { // Tell the view holder it's time to restore the idle state + val itemViewHolder: ItemTouchHelperViewHolder = viewHolder + itemViewHolder.onItemClear() + } + } + + companion object { + const val ALPHA_FULL = 1.0f + } + +} \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/Trigger.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/Trigger.java index 69ac67bf07..c1bca15028 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/Trigger.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/Trigger.java @@ -1,12 +1,12 @@ package info.nightscout.androidaps.plugins.general.automation.triggers; -import android.app.Activity; import android.content.Context; import android.content.ContextWrapper; import android.widget.LinearLayout; import android.widget.TextView; +import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.FragmentManager; import com.google.common.base.Optional; @@ -84,11 +84,11 @@ public abstract class Trigger { } @Nullable - Activity scanForActivity(Context cont) { + AppCompatActivity scanForActivity(Context cont) { if (cont == null) return null; - else if (cont instanceof Activity) - return (Activity) cont; + else if (cont instanceof AppCompatActivity) + return (AppCompatActivity) cont; else if (cont instanceof ContextWrapper) return scanForActivity(((ContextWrapper) cont).getBaseContext()); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerRecurringTime.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerRecurringTime.java index 89c8d17085..2031dbc74c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerRecurringTime.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerRecurringTime.java @@ -1,6 +1,5 @@ package info.nightscout.androidaps.plugins.general.automation.triggers; -import android.app.Activity; import android.graphics.Typeface; import android.text.format.DateFormat; import android.view.ViewGroup; @@ -9,6 +8,7 @@ import android.widget.TextView; import androidx.annotation.Nullable; import androidx.annotation.StringRes; +import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.FragmentManager; import com.dpro.widgets.WeekdaysPicker; @@ -269,6 +269,8 @@ public class TriggerRecurringTime extends Trigger { weekdaysPicker.setSelectedDays(getSelectedDays()); weekdaysPicker.setOnWeekdaysChangeListener((view, i, list) -> set(DayOfWeek.fromCalendarInt(i), list.contains(i))); weekdaysPicker.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + weekdaysPicker.setSundayFirstDay(Calendar.getInstance().getFirstDayOfWeek() == Calendar.SUNDAY); + weekdaysPicker.redrawDays(); root.addView(weekdaysPicker); @@ -294,9 +296,9 @@ public class TriggerRecurringTime extends Trigger { ); tpd.setThemeDark(true); tpd.dismissOnPause(true); - Activity a = scanForActivity(root.getContext()); + AppCompatActivity a = scanForActivity(root.getContext()); if (a != null) - tpd.show(a.getFragmentManager(), "TimePickerDialog"); + tpd.show(a.getSupportFragmentManager(), "TimePickerDialog"); }); int px = MainApp.dpToPx(10); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerTime.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerTime.java index 08f9a65aa7..91e739ca45 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerTime.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerTime.java @@ -1,12 +1,12 @@ package info.nightscout.androidaps.plugins.general.automation.triggers; -import android.app.Activity; import android.graphics.Typeface; import android.text.format.DateFormat; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; +import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.FragmentManager; import com.google.common.base.Optional; @@ -142,9 +142,9 @@ public class TriggerTime extends Trigger { ); dpd.setThemeDark(true); dpd.dismissOnPause(true); - Activity a = scanForActivity(root.getContext()); + AppCompatActivity a = scanForActivity(root.getContext()); if (a != null) - dpd.show(a.getFragmentManager(), "DatePickerDialog"); + dpd.show(a.getSupportFragmentManager(), "DatePickerDialog"); }); timeButton.setOnClickListener(view -> { GregorianCalendar calendar = new GregorianCalendar(); @@ -162,9 +162,9 @@ public class TriggerTime extends Trigger { ); tpd.setThemeDark(true); tpd.dismissOnPause(true); - Activity a = scanForActivity(root.getContext()); + AppCompatActivity a = scanForActivity(root.getContext()); if (a != null) - tpd.show(a.getFragmentManager(), "TimePickerDialog"); + tpd.show(a.getSupportFragmentManager(), "TimePickerDialog"); }); int px = MainApp.dpToPx(10); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerTimeRange.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerTimeRange.java index 1d03871620..082c5af75c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerTimeRange.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerTimeRange.java @@ -1,12 +1,12 @@ package info.nightscout.androidaps.plugins.general.automation.triggers; -import android.app.Activity; import android.graphics.Typeface; import android.text.format.DateFormat; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; +import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.FragmentManager; import com.google.common.base.Optional; @@ -18,7 +18,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Calendar; -import java.util.Date; import java.util.GregorianCalendar; import info.nightscout.androidaps.MainApp; @@ -33,14 +32,14 @@ import info.nightscout.androidaps.utils.T; public class TriggerTimeRange extends Trigger { private static Logger log = LoggerFactory.getLogger(L.AUTOMATION); - + // in minutes since midnight 60 means 1AM private int start; private int end; long timeZoneOffset = DateUtil.getTimeZoneOffsetMs(); public TriggerTimeRange() { - + start = getMinSinceMidnight(DateUtil.now()); end = getMinSinceMidnight(DateUtil.now()); } @@ -60,11 +59,11 @@ public class TriggerTimeRange extends Trigger { return false; boolean doRun = false; - if ( start < end && start < currentMinSinceMidnight && currentMinSinceMidnight < end) + if (start < end && start < currentMinSinceMidnight && currentMinSinceMidnight < end) doRun = true; - // handle cases like 10PM to 6AM - else if ( start > end && (start < currentMinSinceMidnight || currentMinSinceMidnight < end)) + // handle cases like 10PM to 6AM + else if (start > end && (start < currentMinSinceMidnight || currentMinSinceMidnight < end)) doRun = true; if (doRun) { @@ -129,8 +128,8 @@ public class TriggerTimeRange extends Trigger { } TriggerTimeRange period(int start, int end) { - this.start = getMinSinceMidnight(start*60000); - this.end = getMinSinceMidnight(end*60000); + this.start = getMinSinceMidnight(start * 60000); + this.end = getMinSinceMidnight(end * 60000); return this; } @@ -145,7 +144,7 @@ public class TriggerTimeRange extends Trigger { } long toMilis(long minutesSinceMidnight) { - return minutesSinceMidnight*60*1000; + return minutesSinceMidnight * 60 * 1000; } public int getMinSinceMidnight(long time) { @@ -157,11 +156,11 @@ public class TriggerTimeRange extends Trigger { return (calendar.get(Calendar.HOUR_OF_DAY) * 60) + calendar.get(Calendar.MINUTE); } - int getStart(){ + int getStart() { return start; } - int getEnd(){ + int getEnd() { return end; } @@ -170,8 +169,8 @@ public class TriggerTimeRange extends Trigger { TextView label = new TextView(root.getContext()); TextView startButton = new TextView(root.getContext()); TextView endButton = new TextView(root.getContext()); - log.debug("Start is: " + start ); - log.debug("End is: " + end ); + log.debug("Start is: " + start); + log.debug("End is: " + end); startButton.setText(DateUtil.timeString(toMilis(start) - timeZoneOffset)); endButton.setText(MainApp.gs(R.string.and) + " " + DateUtil.timeString(toMilis(end) - timeZoneOffset)); @@ -193,9 +192,9 @@ public class TriggerTimeRange extends Trigger { ); tpd.setThemeDark(true); tpd.dismissOnPause(true); - Activity a = scanForActivity(root.getContext()); + AppCompatActivity a = scanForActivity(root.getContext()); if (a != null) - tpd.show(a.getFragmentManager(), "TimePickerDialog"); + tpd.show(a.getSupportFragmentManager(), "TimePickerDialog"); }); endButton.setOnClickListener(view -> { GregorianCalendar calendar = new GregorianCalendar(); @@ -213,9 +212,9 @@ public class TriggerTimeRange extends Trigger { ); tpd.setThemeDark(true); tpd.dismissOnPause(true); - Activity a = scanForActivity(root.getContext()); + AppCompatActivity a = scanForActivity(root.getContext()); if (a != null) - tpd.show(a.getFragmentManager(), "TimePickerDialog"); + tpd.show(a.getSupportFragmentManager(), "TimePickerDialog"); }); int px = MainApp.dpToPx(10); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/careportal/Dialogs/NewNSTreatmentDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/careportal/Dialogs/NewNSTreatmentDialog.java index e2be9075e3..64b7b05987 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/careportal/Dialogs/NewNSTreatmentDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/careportal/Dialogs/NewNSTreatmentDialog.java @@ -1,10 +1,8 @@ package info.nightscout.androidaps.plugins.general.careportal.Dialogs; -import android.app.Activity; +import android.content.Context; import android.os.Bundle; -import androidx.fragment.app.DialogFragment; -import androidx.appcompat.app.AlertDialog; import android.text.Editable; import android.text.TextWatcher; import android.text.format.DateFormat; @@ -20,9 +18,12 @@ import android.widget.RadioButton; import android.widget.Spinner; import android.widget.TextView; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatDialogFragment; +import androidx.fragment.app.DialogFragment; + import com.google.common.collect.Lists; import com.wdullaer.materialdatetimepicker.date.DatePickerDialog; -import com.wdullaer.materialdatetimepicker.time.RadialPickerLayout; import com.wdullaer.materialdatetimepicker.time.TimePickerDialog; import org.json.JSONException; @@ -39,7 +40,6 @@ import java.util.List; import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; -import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.ProfileStore; import info.nightscout.androidaps.db.BgReading; @@ -51,6 +51,7 @@ import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.configBuilder.ProfileFunctions; import info.nightscout.androidaps.plugins.general.careportal.OptionsToShow; import info.nightscout.androidaps.plugins.general.nsclient.NSUpload; +import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus; import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin; import info.nightscout.androidaps.utils.DateUtil; import info.nightscout.androidaps.utils.DefaultValueHelper; @@ -61,11 +62,9 @@ import info.nightscout.androidaps.utils.SP; import info.nightscout.androidaps.utils.SafeParse; import info.nightscout.androidaps.utils.Translator; -public class NewNSTreatmentDialog extends DialogFragment implements View.OnClickListener, DatePickerDialog.OnDateSetListener, TimePickerDialog.OnTimeSetListener { +public class NewNSTreatmentDialog extends AppCompatDialogFragment implements View.OnClickListener, DatePickerDialog.OnDateSetListener, TimePickerDialog.OnTimeSetListener { private static Logger log = LoggerFactory.getLogger(NewNSTreatmentDialog.class); - private Activity context; - private static OptionsToShow options; private static String event; @@ -119,18 +118,6 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick } } - @Override - public void onAttach(Activity activity) { - context = activity; - super.onAttach(activity); - } - - @Override - public void onDetach() { - super.onDetach(); - this.context = null; - } - @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -421,18 +408,18 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick ); dpd.setThemeDark(true); dpd.dismissOnPause(true); - dpd.show(context.getFragmentManager(), "Datepickerdialog"); + dpd.show(getActivity().getSupportFragmentManager(), "Datepickerdialog"); break; case R.id.careportal_newnstreatment_eventtime: TimePickerDialog tpd = TimePickerDialog.newInstance( this, calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), - DateFormat.is24HourFormat(context) + DateFormat.is24HourFormat(getContext()) ); tpd.setThemeDark(true); tpd.dismissOnPause(true); - tpd.show(context.getFragmentManager(), "Timepickerdialog"); + tpd.show(getActivity().getSupportFragmentManager(), "Timepickerdialog"); break; case R.id.ok: confirmNSTreatmentCreation(); @@ -469,7 +456,7 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick } @Override - public void onTimeSet(RadialPickerLayout view, int hourOfDay, int minute, int second) { + public void onTimeSet(TimePickerDialog view, int hourOfDay, int minute, int second) { eventTime.setHours(hourOfDay); eventTime.setMinutes(minute); eventTime.setSeconds(this.seconds++); // randomize seconds to prevent creating record of the same time, if user choose time manually @@ -477,7 +464,6 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick updateBGforDateTime(); } - JSONObject gatherData() { String enteredBy = SP.getString("careportal_enteredby", ""); JSONObject data = new JSONObject(); @@ -702,6 +688,7 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick } void confirmNSTreatmentCreation() { + Context context = getContext(); if (context != null) { final JSONObject data = gatherData(); final String confirmText = buildConfirmText(data); @@ -715,7 +702,7 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick } - public void createNSTreatment(JSONObject data) { + void createNSTreatment(JSONObject data) { if (options.executeProfileSwitch) { if (data.has("profile")) { ProfileFunctions.doProfileSwitch(profileStore, JsonHelper.safeGetString(data, "profile"), JsonHelper.safeGetInt(data, "duration"), JsonHelper.safeGetInt(data, "percentage"), JsonHelper.safeGetInt(data, "timeshift")); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/ImportExportPrefs.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/ImportExportPrefs.java index 7a801a44c0..ae9867b0a2 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/ImportExportPrefs.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/ImportExportPrefs.java @@ -30,6 +30,7 @@ import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.logging.L; import info.nightscout.androidaps.plugins.bus.RxBus; import info.nightscout.androidaps.utils.OKDialog; +import info.nightscout.androidaps.utils.SP; import info.nightscout.androidaps.utils.ToastUtils; /** @@ -113,27 +114,24 @@ public class ImportExportPrefs { .setMessage(MainApp.gs(R.string.import_from) + " " + file + " ?") .setPositiveButton(android.R.string.yes, (dialog, which) -> { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - SharedPreferences.Editor editor = prefs.edit(); String line; String[] lineParts; try { - editor.clear(); - editor.commit(); + SP.clear(); BufferedReader reader = new BufferedReader(new FileReader(file)); while ((line = reader.readLine()) != null) { lineParts = line.split("::"); if (lineParts.length == 2) { if (lineParts[1].equals("true") || lineParts[1].equals("false")) { - editor.putBoolean(lineParts[0], Boolean.parseBoolean(lineParts[1])); + SP.putBoolean(lineParts[0], Boolean.parseBoolean(lineParts[1])); } else { - editor.putString(lineParts[0], lineParts[1]); + SP.putString(lineParts[0], lineParts[1]); } } } reader.close(); - editor.commit(); + SP.putBoolean(R.string.key_setupwizard_processed, true); OKDialog.show(context, MainApp.gs(R.string.setting_imported), MainApp.gs(R.string.restartingapp), () -> { log.debug("Exiting"); MainApp.instance().stopKeepAliveService(); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/activities/LogSettingActivity.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/activities/LogSettingActivity.kt index f47bb03513..d9ed0c590c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/activities/LogSettingActivity.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/activities/LogSettingActivity.kt @@ -6,11 +6,11 @@ import android.widget.CheckBox import android.widget.LinearLayout import android.widget.TextView import info.nightscout.androidaps.R -import info.nightscout.androidaps.activities.NoSplashActivity +import info.nightscout.androidaps.activities.NoSplashAppCompatActivity import info.nightscout.androidaps.logging.L import kotlinx.android.synthetic.main.activity_logsetting.* -class LogSettingActivity : NoSplashActivity() { +class LogSettingActivity : NoSplashAppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/tidepool/comm/InfoInterceptor.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/tidepool/comm/InfoInterceptor.kt index ca3c3e0483..4acc0b5d67 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/tidepool/comm/InfoInterceptor.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/tidepool/comm/InfoInterceptor.kt @@ -19,7 +19,7 @@ class InfoInterceptor(tag: String) : Interceptor { @Throws(IOException::class) override fun intercept(chain: Interceptor.Chain): Response { val request = chain.request() - request?.body()?.let { + request.body?.let { if (L.isEnabled(L.TIDEPOOL)) { log.debug("Interceptor Body size: " + it.contentLength()) val requestBuffer = Buffer() diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/tidepool/comm/TidepoolUploader.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/tidepool/comm/TidepoolUploader.kt index 40473c0d93..7ab263b8d7 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/tidepool/comm/TidepoolUploader.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/tidepool/comm/TidepoolUploader.kt @@ -14,9 +14,9 @@ import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.OKDialog import info.nightscout.androidaps.utils.SP import info.nightscout.androidaps.utils.T -import okhttp3.MediaType +import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.OkHttpClient -import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.toRequestBody import okhttp3.logging.HttpLoggingInterceptor import org.slf4j.LoggerFactory import retrofit2.Retrofit @@ -43,7 +43,7 @@ object TidepoolUploader { val PUMPTYPE = "Tandem" - var connectionStatus: ConnectionStatus = TidepoolUploader.ConnectionStatus.DISCONNECTED + var connectionStatus: ConnectionStatus = ConnectionStatus.DISCONNECTED fun getRetrofitInstance(): Retrofit? { if (retrofit == null) { @@ -75,7 +75,7 @@ object TidepoolUploader { retrofit = null if (L.isEnabled(L.TIDEPOOL)) log.debug("Instance reset") - connectionStatus = TidepoolUploader.ConnectionStatus.DISCONNECTED + connectionStatus = ConnectionStatus.DISCONNECTED } @Synchronized @@ -197,7 +197,7 @@ object TidepoolUploader { } else -> { - val body = RequestBody.create(MediaType.parse("application/json"), chunk) + val body = chunk.toRequestBody("application/json".toMediaTypeOrNull()) RxBus.send(EventTidepoolStatus(("Uploading"))) if (session.service != null && session.token != null && session.datasetReply != null) { @@ -231,11 +231,11 @@ object TidepoolUploader { extendWakeLock(60000) val call = session!!.service?.deleteDataSet(session!!.token!!, session!!.datasetReply!!.id!!) call?.enqueue(TidepoolCallback(session!!, "Delete Dataset", { - connectionStatus = TidepoolUploader.ConnectionStatus.DISCONNECTED + connectionStatus = ConnectionStatus.DISCONNECTED RxBus.send(EventTidepoolStatus(("Dataset removed OK"))) releaseWakeLock() }, { - connectionStatus = TidepoolUploader.ConnectionStatus.DISCONNECTED + connectionStatus = ConnectionStatus.DISCONNECTED RxBus.send(EventTidepoolStatus(("Dataset remove FAILED"))) releaseWakeLock() })) @@ -255,11 +255,11 @@ object TidepoolUploader { extendWakeLock(60000) val call = session.service?.deleteAllData(token, userid) call?.enqueue(TidepoolCallback(session, "Delete all data", { - connectionStatus = TidepoolUploader.ConnectionStatus.DISCONNECTED + connectionStatus = ConnectionStatus.DISCONNECTED RxBus.send(EventTidepoolStatus(("All data removed OK"))) releaseWakeLock() }, { - connectionStatus = TidepoolUploader.ConnectionStatus.DISCONNECTED + connectionStatus = ConnectionStatus.DISCONNECTED RxBus.send(EventTidepoolStatus(("All data remove FAILED"))) releaseWakeLock() })) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/tidepool/events/EventTidepoolStatus.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/tidepool/events/EventTidepoolStatus.kt index e7854f8ff2..f9e2b724cb 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/tidepool/events/EventTidepoolStatus.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/tidepool/events/EventTidepoolStatus.kt @@ -3,9 +3,9 @@ package info.nightscout.androidaps.plugins.general.tidepool.events import info.nightscout.androidaps.events.Event import info.nightscout.androidaps.logging.L import info.nightscout.androidaps.utils.DateUtil -import info.nightscout.androidaps.utils.LocaleHelper import org.slf4j.LoggerFactory import java.text.SimpleDateFormat +import java.util.* class EventTidepoolStatus(val status: String) : Event() { private val log = LoggerFactory.getLogger(L.TIDEPOOL) @@ -17,7 +17,7 @@ class EventTidepoolStatus(val status: String) : Event() { log.debug("New status: $status") } - private var timeFormat = SimpleDateFormat("HH:mm:ss", LocaleHelper.currentLocale()) + private var timeFormat = SimpleDateFormat("HH:mm:ss", Locale.getDefault()) fun toPreparedHtml(): StringBuilder { val stringBuilder = StringBuilder() diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/tidepool/messages/BaseMessage.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/tidepool/messages/BaseMessage.kt index d3cdffcf8c..d9dfc97b38 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/tidepool/messages/BaseMessage.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/tidepool/messages/BaseMessage.kt @@ -1,8 +1,9 @@ package info.nightscout.androidaps.plugins.general.tidepool.messages import info.nightscout.androidaps.plugins.general.tidepool.utils.GsonInstance -import okhttp3.MediaType +import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.toRequestBody open class BaseMessage { private fun toS(): String { @@ -10,7 +11,7 @@ open class BaseMessage { } fun getBody(): RequestBody { - return RequestBody.create(MediaType.parse("application/json"), this.toS()) + return this.toS().toRequestBody("application/json".toMediaTypeOrNull()) } } \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/activities/DanaRHistoryActivity.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/activities/DanaRHistoryActivity.java index ae25d781af..97f029bd8c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/activities/DanaRHistoryActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/activities/DanaRHistoryActivity.java @@ -24,7 +24,7 @@ import java.util.List; import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; -import info.nightscout.androidaps.activities.NoSplashActivity; +import info.nightscout.androidaps.activities.NoSplashAppCompatActivity; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.db.DanaRHistoryRecord; import info.nightscout.androidaps.events.EventPumpStatusChanged; @@ -44,7 +44,7 @@ import info.nightscout.androidaps.utils.FabricPrivacy; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; -public class DanaRHistoryActivity extends NoSplashActivity { +public class DanaRHistoryActivity extends NoSplashAppCompatActivity { private static Logger log = LoggerFactory.getLogger(L.PUMP); private CompositeDisposable disposable = new CompositeDisposable(); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/activities/DanaRUserOptionsActivity.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/activities/DanaRUserOptionsActivity.java index f1181bb7cb..0346b5320e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/activities/DanaRUserOptionsActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/activities/DanaRUserOptionsActivity.java @@ -12,9 +12,8 @@ import org.slf4j.LoggerFactory; import java.text.DecimalFormat; import info.nightscout.androidaps.Constants; -import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; -import info.nightscout.androidaps.activities.NoSplashActivity; +import info.nightscout.androidaps.activities.NoSplashAppCompatActivity; import info.nightscout.androidaps.events.EventInitializationChanged; import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.logging.L; @@ -33,7 +32,7 @@ import io.reactivex.disposables.CompositeDisposable; * Created by Rumen Georgiev on 5/31/2018. */ -public class DanaRUserOptionsActivity extends NoSplashActivity { +public class DanaRUserOptionsActivity extends NoSplashAppCompatActivity { private static Logger log = LoggerFactory.getLogger(L.PUMP); private CompositeDisposable disposable = new CompositeDisposable(); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/dialog/MedtronicHistoryActivity.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/dialog/MedtronicHistoryActivity.java index 2d1a3a871e..7641e5c4cb 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/dialog/MedtronicHistoryActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/dialog/MedtronicHistoryActivity.java @@ -20,13 +20,13 @@ import java.util.ArrayList; import java.util.List; import info.nightscout.androidaps.R; -import info.nightscout.androidaps.activities.NoSplashActivity; +import info.nightscout.androidaps.activities.NoSplashAppCompatActivity; import info.nightscout.androidaps.logging.L; import info.nightscout.androidaps.plugins.pump.medtronic.MedtronicPumpPlugin; import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.pump.PumpHistoryEntry; import info.nightscout.androidaps.plugins.pump.medtronic.comm.history.pump.PumpHistoryEntryGroup; -public class MedtronicHistoryActivity extends NoSplashActivity { +public class MedtronicHistoryActivity extends NoSplashAppCompatActivity { private static Logger LOG = LoggerFactory.getLogger(L.PUMP); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/treatments/fragments/TreatmentsProfileSwitchFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/treatments/fragments/TreatmentsProfileSwitchFragment.kt index 28b4f04452..a125f7a8c3 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/treatments/fragments/TreatmentsProfileSwitchFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/treatments/fragments/TreatmentsProfileSwitchFragment.kt @@ -48,7 +48,7 @@ class TreatmentsProfileSwitchFragment : Fragment() { val builder = AlertDialog.Builder(this.context!!) builder.setTitle(MainApp.gs(R.string.confirmation)) builder.setMessage(MainApp.gs(R.string.refresheventsfromnightscout) + "?") - builder.setPositiveButton(MainApp.gs(R.string.ok)) { dialog: DialogInterface?, id: Int -> + builder.setPositiveButton(MainApp.gs(R.string.ok)) { _ , _-> MainApp.getDbHelper().resetProfileSwitch() RxBus.send(EventNSClientRestart()) } diff --git a/app/src/main/java/info/nightscout/androidaps/setupwizard/SetupWizardActivity.java b/app/src/main/java/info/nightscout/androidaps/setupwizard/SetupWizardActivity.java index e6a4831693..603292d3cc 100644 --- a/app/src/main/java/info/nightscout/androidaps/setupwizard/SetupWizardActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/setupwizard/SetupWizardActivity.java @@ -72,18 +72,6 @@ public class SetupWizardActivity extends NoSplashAppCompatActivity { } } - @Override - public void onBackPressed() { - if (currentWizardPage == 0) - OKDialog.showConfirmation(this, MainApp.gs(R.string.exitwizard), this::finish); - else showPreviousPage(null); - } - - public void exitPressed(View view) { - SP.putBoolean(R.string.key_setupwizard_processed, true); - OKDialog.showConfirmation(this, MainApp.gs(R.string.exitwizard), this::finish); - } - @Override public void onPause() { super.onPause(); @@ -157,6 +145,18 @@ public class SetupWizardActivity extends NoSplashAppCompatActivity { }); } + @Override + public void onBackPressed() { + if (currentWizardPage == 0) + OKDialog.showConfirmation(this, MainApp.gs(R.string.exitwizard), this::finish); + else showPreviousPage(null); + } + + public void exitPressed(View view) { + SP.putBoolean(R.string.key_setupwizard_processed, true); + OKDialog.showConfirmation(this, MainApp.gs(R.string.exitwizard), this::finish); + } + public void showNextPage(View view) { this.finish(); Intent intent = new Intent(this, SetupWizardActivity.class); diff --git a/app/src/main/java/info/nightscout/androidaps/setupwizard/elements/SWItem.java b/app/src/main/java/info/nightscout/androidaps/setupwizard/elements/SWItem.java index 720d00d4b7..734b204ff3 100644 --- a/app/src/main/java/info/nightscout/androidaps/setupwizard/elements/SWItem.java +++ b/app/src/main/java/info/nightscout/androidaps/setupwizard/elements/SWItem.java @@ -3,6 +3,8 @@ package info.nightscout.androidaps.setupwizard.elements; import android.view.View; import android.widget.LinearLayout; +import androidx.annotation.StringRes; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -67,12 +69,12 @@ public class SWItem { return type; } - public SWItem label(int label) { + public SWItem label(@StringRes int label) { this.label = label; return this; } - public SWItem comment(int comment) { + public SWItem comment(@StringRes int comment) { this.comment = comment; return this; } diff --git a/app/src/main/java/info/nightscout/androidaps/utils/LocaleHelper.kt b/app/src/main/java/info/nightscout/androidaps/utils/LocaleHelper.kt index 6052c5699a..447d076d93 100644 --- a/app/src/main/java/info/nightscout/androidaps/utils/LocaleHelper.kt +++ b/app/src/main/java/info/nightscout/androidaps/utils/LocaleHelper.kt @@ -1,21 +1,19 @@ package info.nightscout.androidaps.utils import android.content.Context +import android.content.ContextWrapper +import android.os.Build +import android.os.LocaleList import info.nightscout.androidaps.R import java.util.* -object LocaleHelper { - fun update(context: Context) = - updateResources(context, currentLanguage()) +object LocaleHelper { fun currentLanguage(): String = SP.getString(R.string.key_language, Locale.getDefault().language) - fun currentLocale(): Locale = - Locale(SP.getString(R.string.key_language, Locale.getDefault().language)) - - @Suppress("DEPRECATION") - private fun updateResources(context: Context, language: String) { + private fun currentLocale(): Locale { + val language = currentLanguage() var locale = Locale(language) if (language.contains("_")) { // language with country like pt_BR defined in arrays.xml @@ -23,10 +21,35 @@ object LocaleHelper { val country = language.substring(3, 5) locale = Locale(lang, country) } + return locale + } + @Suppress("DEPRECATION") + fun update(context: Context) { + val locale = currentLocale() Locale.setDefault(locale) val resources = context.resources - resources.configuration.setLocale(locale) - resources.updateConfiguration(resources.configuration, resources.displayMetrics) + val configuration = resources.configuration + context.createConfigurationContext(configuration) + configuration.setLocale(locale) + configuration.locale = locale + resources.updateConfiguration(configuration, resources.displayMetrics) + } + + fun wrap(ctx: Context): ContextWrapper { + val res = ctx.resources + val configuration = res.configuration + val newLocale = currentLocale() + val context = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + configuration.setLocale(newLocale) + val localeList = LocaleList(newLocale) + LocaleList.setDefault(localeList) + configuration.locales = localeList + ctx.createConfigurationContext(configuration) + } else { + configuration.setLocale(newLocale) + ctx.createConfigurationContext(configuration) + } + return ContextWrapper(context) } } \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/utils/SP.java b/app/src/main/java/info/nightscout/androidaps/utils/SP.java index 1b46642751..e45e650ace 100644 --- a/app/src/main/java/info/nightscout/androidaps/utils/SP.java +++ b/app/src/main/java/info/nightscout/androidaps/utils/SP.java @@ -10,7 +10,11 @@ import info.nightscout.androidaps.MainApp; */ public class SP { - static SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext()); + private static SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext()); + + static public void clear() { + sharedPreferences.edit().clear().apply(); + } static public boolean contains(String key) { return sharedPreferences.contains(key); @@ -85,75 +89,51 @@ public class SP { } static public void putBoolean(String key, boolean value) { - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putBoolean(key, value); - editor.apply(); + sharedPreferences.edit().putBoolean(key, value).apply(); } static public void putBoolean(int resourceID, boolean value) { - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putBoolean(MainApp.gs(resourceID), value); - editor.apply(); + sharedPreferences.edit().putBoolean(MainApp.gs(resourceID), value).apply(); } static public void putDouble(String key, double value) { - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putString(key, Double.toString(value)); - editor.apply(); + sharedPreferences.edit().putString(key, Double.toString(value)).apply(); } static public void putLong(String key, long value) { - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putLong(key, value); - editor.apply(); + sharedPreferences.edit().putLong(key, value).apply(); } static public void putLong(int resourceID, long value) { - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putLong(MainApp.gs(resourceID), value); - editor.apply(); + sharedPreferences.edit().putLong(MainApp.gs(resourceID), value).apply(); } static public void putInt(String key, int value) { - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putInt(key, value); - editor.apply(); + sharedPreferences.edit().putInt(key, value).apply(); } static public void putInt(int resourceID, int value) { - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putInt(MainApp.gs(resourceID), value); - editor.apply(); + sharedPreferences.edit().putInt(MainApp.gs(resourceID), value).apply(); } static public void incInt(int resourceID) { - SharedPreferences.Editor editor = sharedPreferences.edit(); int value = SP.getInt(resourceID, 0) + 1; - editor.putInt(MainApp.gs(resourceID), value); - editor.apply(); + sharedPreferences.edit().putInt(MainApp.gs(resourceID), value).apply(); } static public void putString(int resourceID, String value) { - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putString(MainApp.gs(resourceID), value); - editor.apply(); + sharedPreferences.edit().putString(MainApp.gs(resourceID), value).apply(); } static public void putString(String key, String value) { - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putString(key, value); - editor.apply(); + sharedPreferences.edit().putString(key, value).apply(); } static public void remove(int resourceID) { - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.remove(MainApp.gs(resourceID)); - editor.apply(); + sharedPreferences.edit().remove(MainApp.gs(resourceID)).apply(); } static public void remove(String key) { - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.remove(key); - editor.apply(); + sharedPreferences.edit().remove(key).apply(); } } diff --git a/app/src/main/res/drawable/ic_reorder_gray_24dp.xml b/app/src/main/res/drawable/ic_reorder_gray_24dp.xml new file mode 100644 index 0000000000..8c12d67379 --- /dev/null +++ b/app/src/main/res/drawable/ic_reorder_gray_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/actions_fill_dialog.xml b/app/src/main/res/layout/actions_fill_dialog.xml index 27fdb02ee7..ce52f25abb 100644 --- a/app/src/main/res/layout/actions_fill_dialog.xml +++ b/app/src/main/res/layout/actions_fill_dialog.xml @@ -142,7 +142,7 @@ - + diff --git a/app/src/main/res/layout/activity_agreement.xml b/app/src/main/res/layout/activity_agreement.xml deleted file mode 100644 index 5c98f937ed..0000000000 --- a/app/src/main/res/layout/activity_agreement.xml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - - -