summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzachh <zachh@google.com>2017-12-20 14:32:47 -0800
committerEric Erfanian <erfanian@google.com>2017-12-22 08:55:15 -0800
commit128d859aa0e678971c85d00d4417c9ca79a8b702 (patch)
treea321c959b6c0042126f6f44d95a4b7fc8cd4789f
parent6456d8302885e9c6f24d678fca798b730d101a17 (diff)
Fixed crash in UiListener when launching activity with screen off.
When launching MainActivity with the screen off (e.g. from Android Studio) the application would crash due to: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState Also use FragmentPagerAdapter in MainPagerAdapter as the number of tabs is small and can be stored in memory. Test: manual PiperOrigin-RevId: 179734952 Change-Id: Ib2ca9674f3174493da55bbbf0ef4053fcf73ab47
-rw-r--r--java/com/android/dialer/calllog/ui/NewCallLogFragment.java6
-rw-r--r--java/com/android/dialer/common/concurrent/UiListener.java8
-rw-r--r--java/com/android/dialer/main/impl/MainPagerAdapter.java4
3 files changed, 12 insertions, 6 deletions
diff --git a/java/com/android/dialer/calllog/ui/NewCallLogFragment.java b/java/com/android/dialer/calllog/ui/NewCallLogFragment.java
index c10b52123..719878cec 100644
--- a/java/com/android/dialer/calllog/ui/NewCallLogFragment.java
+++ b/java/com/android/dialer/calllog/ui/NewCallLogFragment.java
@@ -58,10 +58,10 @@ public final class NewCallLogFragment extends Fragment
}
@Override
- public void onCreate(Bundle state) {
- super.onCreate(state);
+ public void onActivityCreated(@Nullable Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
- LogUtil.enterBlock("NewCallLogFragment.onCreate");
+ LogUtil.enterBlock("NewCallLogFragment.onActivityCreated");
CallLogComponent component = CallLogComponent.get(getContext());
CallLogFramework callLogFramework = component.callLogFramework();
diff --git a/java/com/android/dialer/common/concurrent/UiListener.java b/java/com/android/dialer/common/concurrent/UiListener.java
index 9541dbc0c..df791301f 100644
--- a/java/com/android/dialer/common/concurrent/UiListener.java
+++ b/java/com/android/dialer/common/concurrent/UiListener.java
@@ -71,7 +71,10 @@ public class UiListener<OutputT> extends Fragment {
if (uiListener == null) {
LogUtil.i("UiListener.create", "creating new UiListener for " + taskId);
uiListener = new UiListener<>();
- fragmentManager.beginTransaction().add(uiListener, taskId).commit();
+ // When launching an activity with the screen off, its onSaveInstanceState() is called before
+ // its fragments are created, which means we can't use commit() and need to use
+ // commitAllowingStateLoss(). This is not a problem for UiListener which saves no state.
+ fragmentManager.beginTransaction().add(uiListener, taskId).commitAllowingStateLoss();
}
return uiListener;
}
@@ -130,6 +133,9 @@ public class UiListener<OutputT> extends Fragment {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
+ // Note: We use commitAllowingStateLoss when attaching the fragment so it may not be safe to
+ // read savedInstanceState in all situations. (But it's not anticipated that this fragment
+ // should need to rely on saved state.)
}
@Override
diff --git a/java/com/android/dialer/main/impl/MainPagerAdapter.java b/java/com/android/dialer/main/impl/MainPagerAdapter.java
index 2d224f69c..d294640ee 100644
--- a/java/com/android/dialer/main/impl/MainPagerAdapter.java
+++ b/java/com/android/dialer/main/impl/MainPagerAdapter.java
@@ -20,7 +20,7 @@ import android.content.Context;
import android.support.annotation.IntDef;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
-import android.support.v4.app.FragmentStatePagerAdapter;
+import android.support.v4.app.FragmentPagerAdapter;
import com.android.dialer.calllog.ui.NewCallLogFragment;
import com.android.dialer.common.Assert;
import com.android.dialer.voicemail.listui.NewVoicemailFragment;
@@ -28,7 +28,7 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/** Adapter for {@link MainActivity} ViewPager. */
-final class MainPagerAdapter extends FragmentStatePagerAdapter {
+final class MainPagerAdapter extends FragmentPagerAdapter {
@Retention(RetentionPolicy.SOURCE)
@IntDef({