diff --git a/app/src/main/java/info/nightscout/androidaps/setupwizard/SetupWizardActivity.java b/app/src/main/java/info/nightscout/androidaps/setupwizard/SetupWizardActivity.java deleted file mode 100644 index 9ad3a1ecf2..0000000000 --- a/app/src/main/java/info/nightscout/androidaps/setupwizard/SetupWizardActivity.java +++ /dev/null @@ -1,236 +0,0 @@ -package info.nightscout.androidaps.setupwizard; - -import android.content.Intent; -import android.content.pm.PackageManager; -import android.os.Bundle; -import android.view.View; -import android.widget.LinearLayout; -import android.widget.ScrollView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.core.app.ActivityCompat; - -import java.util.List; - -import javax.inject.Inject; - -import dagger.android.HasAndroidInjector; -import info.nightscout.androidaps.MainActivity; -import info.nightscout.androidaps.R; -import info.nightscout.androidaps.activities.NoSplashAppCompatActivity; -import info.nightscout.androidaps.events.EventProfileNeedsUpdate; -import info.nightscout.androidaps.events.EventProfileStoreChanged; -import info.nightscout.androidaps.events.EventPumpStatusChanged; -import info.nightscout.androidaps.plugins.bus.RxBusWrapper; -import info.nightscout.androidaps.plugins.general.nsclient.events.EventNSClientStatus; -import info.nightscout.androidaps.plugins.profile.local.LocalProfilePlugin; -import info.nightscout.androidaps.setupwizard.elements.SWItem; -import info.nightscout.androidaps.setupwizard.events.EventSWUpdate; -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.resources.ResourceHelper; -import info.nightscout.androidaps.utils.sharedPreferences.SP; -import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.disposables.CompositeDisposable; - -public class SetupWizardActivity extends NoSplashAppCompatActivity { - - @Inject HasAndroidInjector injector; - @Inject LocalProfilePlugin localProfilePlugin; - @Inject SWDefinition swDefinition; - @Inject RxBusWrapper rxBus; - @Inject ResourceHelper resourceHelper; - @Inject SP sp; - - private CompositeDisposable disposable = new CompositeDisposable(); - - ScrollView scrollView; - - private List screens; - private int currentWizardPage = 0; - public static final String INTENT_MESSAGE = "WIZZARDPAGE"; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - LocaleHelper.INSTANCE.update(getApplicationContext()); - setContentView(R.layout.activity_setupwizard); - - scrollView = findViewById(R.id.sw_scrollview); - screens = swDefinition.getScreens(); - - Intent intent = getIntent(); - currentWizardPage = intent.getIntExtra(SetupWizardActivity.INTENT_MESSAGE, 0); - if (screens.size() > 0 && currentWizardPage < screens.size()) { - SWScreen currentScreen = screens.get(currentWizardPage); - - //Set screen name - TextView screenName = findViewById(R.id.sw_content); - screenName.setText(currentScreen.getHeader()); - - swDefinition.setActivity(this); - //Generate layout first - generateLayout(); - updateButtons(); - } - } - - @Override - public void onPause() { - super.onPause(); - disposable.clear(); - } - - @Override - protected void onResume() { - super.onResume(); - swDefinition.setActivity(this); - disposable.add(rxBus - .toObservable(EventPumpStatusChanged.class) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(event -> updateButtons(), exception -> FabricPrivacy.getInstance().logException(exception)) - ); - disposable.add(rxBus - .toObservable(EventNSClientStatus.class) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(event -> updateButtons(), exception -> FabricPrivacy.getInstance().logException(exception)) - ); - disposable.add(rxBus - .toObservable(EventProfileNeedsUpdate.class) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(event -> updateButtons(), exception -> FabricPrivacy.getInstance().logException(exception)) - ); - disposable.add(rxBus - .toObservable(EventProfileStoreChanged.class) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(event -> updateButtons(), exception -> FabricPrivacy.getInstance().logException(exception)) - ); - disposable.add(rxBus - .toObservable(EventSWUpdate.class) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(event -> { - if (event.getRedraw()) generateLayout(); - updateButtons(); - }, exception -> FabricPrivacy.getInstance().logException(exception)) - ); - } - - private void generateLayout() { - SWScreen currentScreen = screens.get(currentWizardPage); - LinearLayout layout = new SWItem(injector, SWItem.Type.NONE).generateLayout(this.findViewById(R.id.sw_content_fields)); - for (int i = 0; i < currentScreen.getItems().size(); i++) { - SWItem currentItem = currentScreen.getItems().get(i); - currentItem.generateDialog(layout); - } - scrollView.smoothScrollTo(0, 0); - } - - private void updateButtons() { - runOnUiThread(() -> { - SWScreen currentScreen = screens.get(currentWizardPage); - if (currentScreen.getValidator() == null || currentScreen.getValidator().isValid() || currentScreen.getSkippable()) { - if (currentWizardPage == nextPage()) { - findViewById(R.id.finish_button).setVisibility(View.VISIBLE); - findViewById(R.id.next_button).setVisibility(View.GONE); - } else { - findViewById(R.id.finish_button).setVisibility(View.GONE); - findViewById(R.id.next_button).setVisibility(View.VISIBLE); - } - } else { - findViewById(R.id.finish_button).setVisibility(View.GONE); - findViewById(R.id.next_button).setVisibility(View.GONE); - } - if (currentWizardPage == 0) - findViewById(R.id.previous_button).setVisibility(View.GONE); - else - findViewById(R.id.previous_button).setVisibility(View.VISIBLE); - currentScreen.processVisibility(); - }); - } - - @Override - public void onBackPressed() { - if (currentWizardPage == 0) - OKDialog.showConfirmation(this, resourceHelper.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, resourceHelper.gs(R.string.exitwizard), this::finish); - } - - public void showNextPage(View view) { - this.finish(); - Intent intent = new Intent(this, SetupWizardActivity.class); - intent.putExtra(INTENT_MESSAGE, nextPage()); - startActivity(intent); - } - - public void showPreviousPage(View view) { - this.finish(); - Intent intent = new Intent(this, SetupWizardActivity.class); - intent.putExtra(INTENT_MESSAGE, previousPage()); - startActivity(intent); - } - - // Go back to overview - public void finishSetupWizard(View view) { - sp.putBoolean(R.string.key_setupwizard_processed, true); - Intent intent = new Intent(this, MainActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - startActivity(intent); - finish(); - } - - private int nextPage() { - int page = currentWizardPage + 1; - while (page < screens.size()) { - if (screens.get(page).getVisibility() == null || screens.get(page).getVisibility().isValid()) - return page; - page++; - } - return Math.min(currentWizardPage, screens.size() - 1); - } - - private int previousPage() { - int page = currentWizardPage - 1; - while (page >= 0) { - if (screens.get(page).getVisibility() == null || screens.get(page).getVisibility().isValid()) - return page; - page--; - } - return Math.max(currentWizardPage, 0); - } - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - if (permissions.length != 0) { - if (ActivityCompat.checkSelfPermission(this, permissions[0]) == PackageManager.PERMISSION_GRANTED) { - switch (requestCode) { - case AndroidPermission.CASE_STORAGE: - //show dialog after permission is granted - OKDialog.show(this, resourceHelper.gs(R.string.permission), resourceHelper.gs(R.string.alert_dialog_storage_permission_text)); - break; - case AndroidPermission.CASE_LOCATION: - case AndroidPermission.CASE_SMS: - case AndroidPermission.CASE_BATTERY: - break; - } - } - } - updateButtons(); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (requestCode == AndroidPermission.CASE_BATTERY) - updateButtons(); - } -} diff --git a/app/src/main/java/info/nightscout/androidaps/setupwizard/SetupWizardActivity.kt b/app/src/main/java/info/nightscout/androidaps/setupwizard/SetupWizardActivity.kt new file mode 100644 index 0000000000..a861b7e744 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/setupwizard/SetupWizardActivity.kt @@ -0,0 +1,215 @@ +package info.nightscout.androidaps.setupwizard + +import android.content.Intent +import android.content.pm.PackageManager +import android.os.Bundle +import android.view.View +import android.widget.TextView +import androidx.core.app.ActivityCompat +import dagger.android.HasAndroidInjector +import info.nightscout.androidaps.MainActivity +import info.nightscout.androidaps.R +import info.nightscout.androidaps.activities.NoSplashAppCompatActivity +import info.nightscout.androidaps.events.EventProfileNeedsUpdate +import info.nightscout.androidaps.events.EventProfileStoreChanged +import info.nightscout.androidaps.events.EventPumpStatusChanged +import info.nightscout.androidaps.plugins.bus.RxBusWrapper +import info.nightscout.androidaps.plugins.general.nsclient.events.EventNSClientStatus +import info.nightscout.androidaps.plugins.profile.local.LocalProfilePlugin +import info.nightscout.androidaps.setupwizard.elements.SWItem +import info.nightscout.androidaps.setupwizard.events.EventSWUpdate +import info.nightscout.androidaps.utils.AndroidPermission +import info.nightscout.androidaps.utils.FabricPrivacy +import info.nightscout.androidaps.utils.LocaleHelper.update +import info.nightscout.androidaps.utils.OKDialog.show +import info.nightscout.androidaps.utils.OKDialog.showConfirmation +import info.nightscout.androidaps.utils.resources.ResourceHelper +import info.nightscout.androidaps.utils.sharedPreferences.SP +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.CompositeDisposable +import kotlinx.android.synthetic.main.activity_setupwizard.* +import javax.inject.Inject +import kotlin.math.max +import kotlin.math.min + +class SetupWizardActivity : NoSplashAppCompatActivity() { + + @Inject lateinit var injector: HasAndroidInjector + @Inject lateinit var localProfilePlugin: LocalProfilePlugin + @Inject lateinit var swDefinition: SWDefinition + @Inject lateinit var rxBus: RxBusWrapper + @Inject lateinit var resourceHelper: ResourceHelper + @Inject lateinit var sp: SP + @Inject lateinit var fabricPrivacy: FabricPrivacy + + private val disposable = CompositeDisposable() + private lateinit var screens: List + private var currentWizardPage = 0 + + private val intentMessage = "WIZZARDPAGE" + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + update(applicationContext) + setContentView(R.layout.activity_setupwizard) + screens = swDefinition.getScreens() + val intent = intent + currentWizardPage = intent.getIntExtra(intentMessage, 0) + if (screens.isNotEmpty() && currentWizardPage < screens.size) { + val currentScreen = screens[currentWizardPage] + + //Set screen name + val screenName = findViewById(R.id.sw_content) + screenName.text = currentScreen.getHeader() + swDefinition.activity = this + //Generate layout first + generateLayout() + updateButtons() + } + } + + public override fun onPause() { + super.onPause() + disposable.clear() + } + + override fun onResume() { + super.onResume() + swDefinition.activity = this + disposable.add(rxBus + .toObservable(EventPumpStatusChanged::class.java) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ updateButtons() }) { exception: Throwable? -> fabricPrivacy.logException(exception!!) } + ) + disposable.add(rxBus + .toObservable(EventNSClientStatus::class.java) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ updateButtons() }) { exception: Throwable? -> fabricPrivacy.logException(exception!!) } + ) + disposable.add(rxBus + .toObservable(EventProfileNeedsUpdate::class.java) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ updateButtons() }) { exception: Throwable? -> fabricPrivacy.logException(exception!!) } + ) + disposable.add(rxBus + .toObservable(EventProfileStoreChanged::class.java) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ updateButtons() }) { exception: Throwable? -> fabricPrivacy.logException(exception!!) } + ) + disposable.add(rxBus + .toObservable(EventSWUpdate::class.java) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ event: EventSWUpdate -> + if (event.redraw) generateLayout() + updateButtons() + }) { exception: Throwable? -> fabricPrivacy.logException(exception!!) } + ) + } + + private fun generateLayout() { + val currentScreen = screens[currentWizardPage] + val layout = SWItem(injector, SWItem.Type.NONE).generateLayout(findViewById(R.id.sw_content_fields)) + for (i in currentScreen.items.indices) { + val currentItem = currentScreen.items[i] + currentItem.generateDialog(layout) + } + sw_scrollview?.smoothScrollTo(0, 0) + } + + private fun updateButtons() { + runOnUiThread { + val currentScreen = screens[currentWizardPage] + if (currentScreen.validator == null || currentScreen.validator!!.isValid || currentScreen.skippable) { + if (currentWizardPage == nextPage(null)) { + findViewById(R.id.finish_button).visibility = View.VISIBLE + findViewById(R.id.next_button).visibility = View.GONE + } else { + findViewById(R.id.finish_button).visibility = View.GONE + findViewById(R.id.next_button).visibility = View.VISIBLE + } + } else { + findViewById(R.id.finish_button).visibility = View.GONE + findViewById(R.id.next_button).visibility = View.GONE + } + if (currentWizardPage == 0) findViewById(R.id.previous_button).visibility = View.GONE else findViewById(R.id.previous_button).visibility = View.VISIBLE + currentScreen.processVisibility() + } + } + + override fun onBackPressed() { + if (currentWizardPage == 0) showConfirmation(this, resourceHelper.gs(R.string.exitwizard), Runnable { finish() }) else showPreviousPage(null) + } + + @Suppress("UNUSED_PARAMETER") + fun exitPressed(view: View?) { + sp.putBoolean(R.string.key_setupwizard_processed, true) + showConfirmation(this, resourceHelper.gs(R.string.exitwizard), Runnable { finish() }) + } + + @Suppress("UNUSED_PARAMETER") + fun showNextPage(view: View?) { + finish() + val intent = Intent(this, SetupWizardActivity::class.java) + intent.putExtra(intentMessage, nextPage(null)) + startActivity(intent) + } + + @Suppress("UNUSED_PARAMETER") + fun showPreviousPage(view: View?) { + finish() + val intent = Intent(this, SetupWizardActivity::class.java) + intent.putExtra(intentMessage, previousPage(null)) + startActivity(intent) + } + + // Go back to overview + @Suppress("UNUSED_PARAMETER") + fun finishSetupWizard(view: View?) { + sp.putBoolean(R.string.key_setupwizard_processed, true) + val intent = Intent(this, MainActivity::class.java) + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) + startActivity(intent) + finish() + } + + @Suppress("UNUSED_PARAMETER","SameParameterValue") + private fun nextPage(view: View?): Int { + var page = currentWizardPage + 1 + while (page < screens.size) { + if (screens[page].visibility == null || screens[page].visibility!!.isValid) return page + page++ + } + return min(currentWizardPage, screens.size - 1) + } + + @Suppress("UNUSED_PARAMETER","SameParameterValue") + private fun previousPage(view: View?): Int { + var page = currentWizardPage - 1 + while (page >= 0) { + if (screens[page].visibility == null || screens[page].visibility!!.isValid) return page + page-- + } + return max(currentWizardPage, 0) + } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + if (permissions.isNotEmpty()) { + if (ActivityCompat.checkSelfPermission(this, permissions[0]) == PackageManager.PERMISSION_GRANTED) { + when (requestCode) { + AndroidPermission.CASE_STORAGE -> //show dialog after permission is granted + show(this, resourceHelper.gs(R.string.permission), resourceHelper.gs(R.string.alert_dialog_storage_permission_text)) + + AndroidPermission.CASE_LOCATION, AndroidPermission.CASE_SMS, AndroidPermission.CASE_BATTERY -> { + } + } + } + } + updateButtons() + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == AndroidPermission.CASE_BATTERY) updateButtons() + } +} \ No newline at end of file