From c56bc5ae6144848ef54f44fe2566d57eea2e9639 Mon Sep 17 00:00:00 2001 From: Bart Sopers Date: Thu, 13 Aug 2020 12:22:36 +0200 Subject: [PATCH] Temporary workaround for pod activation and deactivation wizard crashes on rotation --- .../OmnipodCommunicationManagerInterface.java | 1 - .../omnipod/dialogs/PodManagementActivity.kt | 3 + .../wizard/initpod/InitActionFragment.java | 120 +++++++----------- .../dialogs/wizard/initpod/InitPodTask.java | 11 +- .../wizard/model/InitPodWizardModel.java | 3 +- .../wizard/model/RemovePodWizardModel.java | 7 +- .../dialogs/wizard/pages/PodInfoFragment.java | 38 +++--- .../removepod/RemoveActionFragment.java | 16 +-- .../events/EventOmnipodDeviceStatusChange.kt | 3 +- 9 files changed, 82 insertions(+), 120 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/defs/OmnipodCommunicationManagerInterface.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/defs/OmnipodCommunicationManagerInterface.java index d345a3c385..7ad3b58799 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/defs/OmnipodCommunicationManagerInterface.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/defs/OmnipodCommunicationManagerInterface.java @@ -5,7 +5,6 @@ import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.plugins.pump.common.data.TempBasalPair; import info.nightscout.androidaps.plugins.pump.omnipod.comm.message.response.podinfo.PodInfoRecentPulseLog; -import info.nightscout.androidaps.plugins.pump.omnipod.driver.OmnipodPumpStatus; public interface OmnipodCommunicationManagerInterface { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dialogs/PodManagementActivity.kt b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dialogs/PodManagementActivity.kt index 95efcd6c00..56f7f1a14a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dialogs/PodManagementActivity.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dialogs/PodManagementActivity.kt @@ -2,6 +2,7 @@ package info.nightscout.androidaps.plugins.pump.omnipod.dialogs import android.content.Intent import android.os.Bundle +import androidx.fragment.app.FragmentStatePagerAdapter import com.atech.android.library.wizardpager.WizardPagerActivity import com.atech.android.library.wizardpager.WizardPagerContext import com.atech.android.library.wizardpager.data.WizardPagerSettings @@ -97,6 +98,7 @@ class PodManagementActivity : NoSplashAppCompatActivity() { pagerSettings.setBackStringResourceId(R.string.cancel) pagerSettings.cancelAction = refreshAction pagerSettings.finishAction = refreshAction + pagerSettings.pagerAdapterBehavior = FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT val wizardPagerContext = WizardPagerContext.getInstance() @@ -124,6 +126,7 @@ class PodManagementActivity : NoSplashAppCompatActivity() { pagerSettings.setBackStringResourceId(R.string.cancel) pagerSettings.cancelAction = refreshAction pagerSettings.finishAction = refreshAction + pagerSettings.pagerAdapterBehavior = FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT val wizardPagerContext = WizardPagerContext.getInstance(); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dialogs/wizard/initpod/InitActionFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dialogs/wizard/initpod/InitActionFragment.java index 29145d9e6a..8dce02d7e0 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dialogs/wizard/initpod/InitActionFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dialogs/wizard/initpod/InitActionFragment.java @@ -1,6 +1,8 @@ package info.nightscout.androidaps.plugins.pump.omnipod.dialogs.wizard.initpod; -import android.app.Activity; +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.pm.ActivityInfo; import android.graphics.Color; import android.os.AsyncTask; import android.os.Bundle; @@ -13,7 +15,7 @@ import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; -import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; import com.atech.android.library.wizardpager.util.WizardPagesUtil; import com.tech.freak.wizardpager.model.Page; @@ -30,7 +32,6 @@ import dagger.android.HasAndroidInjector; import dagger.android.support.DaggerFragment; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.PumpEnactResult; -import info.nightscout.androidaps.plugins.configBuilder.ProfileFunction; import info.nightscout.androidaps.plugins.pump.omnipod.defs.PodInitActionType; import info.nightscout.androidaps.plugins.pump.omnipod.defs.PodInitReceiver; @@ -38,7 +39,10 @@ import info.nightscout.androidaps.plugins.pump.omnipod.defs.PodInitReceiver; * Created by andy on 12/11/2019 */ public class InitActionFragment extends DaggerFragment implements PodInitReceiver { - private static final String ARG_KEY = "key"; + protected static final String ARG_KEY = "key"; + protected static final String ARG_POD_INIT_ACTION_TYPE = "podInitActionType"; + + private static boolean isFirstView; protected PageFragmentCallbacks mCallbacks; protected String mKey; @@ -51,39 +55,42 @@ public class InitActionFragment extends DaggerFragment implements PodInitReceive protected PodInitActionType podInitActionType; protected List children; protected Map mapCheckBoxes; - protected InitActionFragment instance; protected PumpEnactResult callResult; @Inject HasAndroidInjector injector; - public static InitActionFragment create(String key, PodInitActionType podInitActionType) { Bundle args = new Bundle(); args.putString(ARG_KEY, key); + args.putSerializable(ARG_POD_INIT_ACTION_TYPE, podInitActionType); InitActionFragment fragment = new InitActionFragment(); fragment.setArguments(args); - fragment.setPodInitActionType(podInitActionType); return fragment; } - public InitActionFragment() { - this.instance = this; - } - + @SuppressLint("SourceLockedOrientationActivity") @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + if (savedInstanceState == null) { + isFirstView = true; + } + + getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); Bundle args = getArguments(); mKey = args.getString(ARG_KEY); + podInitActionType = (PodInitActionType) args.getSerializable(ARG_POD_INIT_ACTION_TYPE); mPage = (InitActionPage) mCallbacks.onGetPage(mKey); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState); + View rootView = inflater.inflate(R.layout.omnipod_initpod_init_action, container, false); WizardPagesUtil.setTitle(mPage, rootView); @@ -98,7 +105,6 @@ public class InitActionFragment extends DaggerFragment implements PodInitReceive mapCheckBoxes = new HashMap<>(); for (PodInitActionType child : children) { - CheckBox checkBox1 = new CheckBox(getContext()); checkBox1.setText(child.getResourceId()); checkBox1.setClickable(false); @@ -129,15 +135,17 @@ public class InitActionFragment extends DaggerFragment implements PodInitReceive } }); - new InitPodTask(injector, instance).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + new InitPodTask(injector, this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); }); return rootView; } @Override - public void onAttach(Activity activity) { - super.onAttach(activity); + public void onAttach(Context context) { + super.onAttach(context); + + FragmentActivity activity = getActivity(); if (!(activity instanceof PageFragmentCallbacks)) { throw new ClassCastException("Activity must implement PageFragmentCallbacks"); @@ -152,46 +160,16 @@ public class InitActionFragment extends DaggerFragment implements PodInitReceive mCallbacks = null; } - - public PodInitActionType getPodInitActionType() { - return podInitActionType; - } - - - public void setPodInitActionType(PodInitActionType podInitActionType) { - this.podInitActionType = podInitActionType; - } - - @Override - public void setUserVisibleHint(boolean isVisibleToUser) { - super.setUserVisibleHint(isVisibleToUser); - //System.out.println("ACTION: setUserVisibleHint="+ isVisibleToUser); - if (isVisibleToUser) { - //System.out.println("ACTION: Visible"); + public void onResume() { + super.onResume(); + if (isFirstView) { + isFirstView = false; new InitPodTask(injector, this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - - } else { - System.out.println("ACTION: Not visible"); } } public void actionOnReceiveResponse(String result) { -// System.out.println("ACTION: actionOnReceiveResponse: " + result); -// -// boolean isOk = callResult.success; -// -// progressBar.setVisibility(View.GONE); -// -// if (!isOk) { -// errorView.setVisibility(View.VISIBLE); -// errorView.setText(callResult.comment); -// } -// -// mPage.setActionCompleted(isOk); -// -// mPage.getData().putString(Page.SIMPLE_DATA_KEY, "ddd"); -// mPage.notifyDataChanged(); } @Override @@ -209,37 +187,37 @@ public class InitActionFragment extends DaggerFragment implements PodInitReceive } } - private void processOnFinishedActions(boolean isOk, String errorMessage) { + FragmentActivity activity = getActivity(); + if (activity != null) { + activity.runOnUiThread(() -> { + progressBar.setVisibility(View.GONE); - getActivity().runOnUiThread(() -> { + if (!isOk) { + errorView.setVisibility(View.VISIBLE); + errorView.setText(errorMessage); - progressBar.setVisibility(View.GONE); + retryButton.setVisibility(View.VISIBLE); + } - if (!isOk) { - errorView.setVisibility(View.VISIBLE); - errorView.setText(errorMessage); + mPage.setActionCompleted(isOk); - retryButton.setVisibility(View.VISIBLE); - } - - mPage.setActionCompleted(isOk); - - mPage.getData().putString(Page.SIMPLE_DATA_KEY, UUID.randomUUID().toString()); - mPage.notifyDataChanged(); - - }); + mPage.getData().putString(Page.SIMPLE_DATA_KEY, UUID.randomUUID().toString()); + mPage.notifyDataChanged(); + }); + } } - public void setCheckBox(PodInitActionType podInitActionType, boolean isSuccess) { - getActivity().runOnUiThread(() -> { - mapCheckBoxes.get(podInitActionType).setChecked(isSuccess); - mapCheckBoxes.get(podInitActionType).setTextColor(isSuccess ? Color.rgb(34, 135, 91) : - Color.rgb(168, 36, 15)); - }); + FragmentActivity activity = getActivity(); + if (activity != null) { + activity.runOnUiThread(() -> { + mapCheckBoxes.get(podInitActionType).setChecked(isSuccess); + mapCheckBoxes.get(podInitActionType).setTextColor(isSuccess ? Color.rgb(34, 135, 91) : + Color.rgb(168, 36, 15)); + }); + } } - } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dialogs/wizard/initpod/InitPodTask.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dialogs/wizard/initpod/InitPodTask.java index d014ca09c7..39a150a55d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dialogs/wizard/initpod/InitPodTask.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dialogs/wizard/initpod/InitPodTask.java @@ -1,7 +1,6 @@ package info.nightscout.androidaps.plugins.pump.omnipod.dialogs.wizard.initpod; import android.os.AsyncTask; -import android.os.SystemClock; import android.view.View; import javax.inject.Inject; @@ -24,7 +23,9 @@ public class InitPodTask extends AsyncTask { this.initActionFragment = initActionFragment; } + @Override protected void onPreExecute() { + super.onPreExecute(); initActionFragment.progressBar.setVisibility(View.VISIBLE); initActionFragment.errorView.setVisibility(View.GONE); initActionFragment.retryButton.setVisibility(View.GONE); @@ -32,21 +33,20 @@ public class InitPodTask extends AsyncTask { @Override protected String doInBackground(Void... params) { - if (initActionFragment.podInitActionType == PodInitActionType.PairAndPrimeWizardStep) { initActionFragment.callResult = AapsOmnipodManager.getInstance().initPod( initActionFragment.podInitActionType, - initActionFragment.instance, + initActionFragment, null ); } else if (initActionFragment.podInitActionType == PodInitActionType.FillCannulaSetBasalProfileWizardStep) { initActionFragment.callResult = AapsOmnipodManager.getInstance().initPod( initActionFragment.podInitActionType, - initActionFragment.instance, + initActionFragment, profileFunction.getProfile() ); } else if (initActionFragment.podInitActionType == PodInitActionType.DeactivatePodWizardStep) { - initActionFragment.callResult = AapsOmnipodManager.getInstance().deactivatePod(initActionFragment.instance); + initActionFragment.callResult = AapsOmnipodManager.getInstance().deactivatePod(initActionFragment); } return "OK"; @@ -59,5 +59,4 @@ public class InitPodTask extends AsyncTask { initActionFragment.actionOnReceiveResponse(result); } - } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dialogs/wizard/model/InitPodWizardModel.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dialogs/wizard/model/InitPodWizardModel.java index f5208a48d8..405b4dd063 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dialogs/wizard/model/InitPodWizardModel.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dialogs/wizard/model/InitPodWizardModel.java @@ -15,7 +15,6 @@ public abstract class InitPodWizardModel extends AbstractWizardModel { @Override public Fragment getReviewFragment() { - PodInfoFragment.isInitPod = true; - return new PodInfoFragment(); + return PodInfoFragment.create("initPodInfoFragment", true); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dialogs/wizard/model/RemovePodWizardModel.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dialogs/wizard/model/RemovePodWizardModel.java index 57a7f81414..1350ae1a49 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dialogs/wizard/model/RemovePodWizardModel.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dialogs/wizard/model/RemovePodWizardModel.java @@ -40,9 +40,7 @@ public class RemovePodWizardModel extends AbstractWizardModel { @Override protected PageList onNewRootPageList() { - return new PageList( - new DisplayTextPage(this, R.string.omnipod_remove_pod_wizard_step1_title, R.string.omnipod_remove_pod_wizard_step1_desc, @@ -56,11 +54,8 @@ public class RemovePodWizardModel extends AbstractWizardModel { ); } - public Fragment getReviewFragment() { - PodInfoFragment.isInitPod = false; - return new PodInfoFragment(); + return PodInfoFragment.create("removePodInfoFragment", false); } - } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dialogs/wizard/pages/PodInfoFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dialogs/wizard/pages/PodInfoFragment.java index a0369832bd..128211c6fd 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dialogs/wizard/pages/PodInfoFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dialogs/wizard/pages/PodInfoFragment.java @@ -1,7 +1,8 @@ package info.nightscout.androidaps.plugins.pump.omnipod.dialogs.wizard.pages; -import android.app.Activity; +import android.annotation.SuppressLint; import android.content.Context; +import android.content.pm.ActivityInfo; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -10,6 +11,8 @@ import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; +import androidx.fragment.app.FragmentActivity; + import com.tech.freak.wizardpager.model.ReviewItem; import com.tech.freak.wizardpager.ui.PageFragmentCallbacks; @@ -28,32 +31,35 @@ import info.nightscout.androidaps.plugins.pump.omnipod.util.OmnipodUtil; */ public class PodInfoFragment extends DaggerFragment { private static final String ARG_KEY = "key"; + private static final String ARG_INIT_POD = "initPod"; @Inject OmnipodUtil omnipodUtil; @Inject PodStateManager podStateManager; private PageFragmentCallbacks mCallbacks; private String mKey; - private PodInfoPage mPage; - public static boolean isInitPod = false; + public boolean isInitPod; private ArrayList mCurrentReviewItems; public static PodInfoFragment create(String key, boolean initPod) { Bundle args = new Bundle(); args.putString(ARG_KEY, key); - isInitPod = initPod; + args.putBoolean(ARG_INIT_POD, initPod); PodInfoFragment fragment = new PodInfoFragment(); fragment.setArguments(args); return fragment; } - public PodInfoFragment() { - } - - @Override + @SuppressLint("SourceLockedOrientationActivity") @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + + getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + + Bundle args = getArguments(); + mKey = args.getString(ARG_KEY); + isInitPod = args.getBoolean(ARG_INIT_POD); } @Override @@ -61,7 +67,7 @@ public class PodInfoFragment extends DaggerFragment { Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.omnipod_initpod_pod_info, container, false); - TextView titleView = (TextView) rootView.findViewById(R.id.podInfoTitle); + TextView titleView = rootView.findViewById(R.id.podInfoTitle); titleView.setText(R.string.omnipod_init_pod_wizard_pod_info_title); titleView.setTextColor(getResources().getColor(com.tech.freak.wizardpager.R.color.review_green)); @@ -70,7 +76,6 @@ public class PodInfoFragment extends DaggerFragment { R.string.omnipod_init_pod_wizard_pod_info_init_pod_description : // R.string.omnipod_init_pod_wizard_pod_info_remove_pod_description); - if (isInitPod) { if (createDataOfPod()) { @@ -80,7 +85,6 @@ public class PodInfoFragment extends DaggerFragment { } } - return rootView; } @@ -108,8 +112,10 @@ public class PodInfoFragment extends DaggerFragment { } @Override - public void onAttach(Activity activity) { - super.onAttach(activity); + public void onAttach(Context context) { + super.onAttach(context); + + FragmentActivity activity = getActivity(); if (!(activity instanceof PageFragmentCallbacks)) { throw new ClassCastException("Activity must implement PageFragmentCallbacks"); @@ -124,12 +130,6 @@ public class PodInfoFragment extends DaggerFragment { mCallbacks = null; } - @Override - public void onViewCreated(View view, Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - } - - private class PodInfoAdapter extends ArrayAdapter { private ArrayList dataSet; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dialogs/wizard/removepod/RemoveActionFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dialogs/wizard/removepod/RemoveActionFragment.java index 2531185697..beea880d6f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dialogs/wizard/removepod/RemoveActionFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dialogs/wizard/removepod/RemoveActionFragment.java @@ -15,27 +15,17 @@ import info.nightscout.androidaps.plugins.pump.omnipod.dialogs.wizard.initpod.In * Created by andy on 29/11/2019 */ public class RemoveActionFragment extends InitActionFragment implements PodInitReceiver { - private static final String ARG_KEY = "key"; - public static RemoveActionFragment create(String key, PodInitActionType podInitActionType) { Bundle args = new Bundle(); - args.putString(ARG_KEY, key); + args.putString(InitActionFragment.ARG_KEY, key); + args.putSerializable(InitActionFragment.ARG_POD_INIT_ACTION_TYPE, podInitActionType); RemoveActionFragment fragment = new RemoveActionFragment(); fragment.setArguments(args); - fragment.setPodInitActionType(podInitActionType); return fragment; } - public RemoveActionFragment() { - this.instance = this; - } - @Override - public void setUserVisibleHint(boolean isVisibleToUser) { - super.setUserVisibleHint(isVisibleToUser); - } - public void actionOnReceiveResponse(String result) { System.out.println("ACTION: actionOnReceiveResponse: " + result); @@ -67,6 +57,4 @@ public class RemoveActionFragment extends InitActionFragment implements PodInitR setCheckBox(podInitActionType, isSuccess); } } - - } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/events/EventOmnipodDeviceStatusChange.kt b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/events/EventOmnipodDeviceStatusChange.kt index 75669ae351..792ced5f32 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/events/EventOmnipodDeviceStatusChange.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/events/EventOmnipodDeviceStatusChange.kt @@ -11,7 +11,8 @@ import info.nightscout.androidaps.plugins.pump.omnipod.defs.state.PodStateManage /** * Created by andy on 4.8.2019 */ -// FIXME can be removed, we should just use EventOmnipodPumpValuesChanged +// FIXME Rename this class to EventRileyLinkStatusChanged and use EventOmnipodPumpValuesChanged +// for changes in Pod status class EventOmnipodDeviceStatusChange : Event { var rileyLinkServiceState: RileyLinkServiceState? = null