From 5e16adb54c4e442510d31c7d93fb862dc4154b15 Mon Sep 17 00:00:00 2001 From: calderwoodra Date: Tue, 13 Mar 2018 17:27:09 -0700 Subject: Fixed overlapping fragments issue. Fast consercutive calls to #showFragment can have undesirable effects because fragment manager doesn't handle transactions sychronously. This CL resolves one of the scanrios where voicemail fetch status was calling #showFragment nearly simulataniously to the #onHandleIntent call. This issue may show itself again and I'm looking into more long term solutions but we should be fine in the short term since the all of our fragment logic is implemented. Bug: 74051208,74621909 Test: manual PiperOrigin-RevId: 188956984 Change-Id: I0796e31b03e0b749ae7e81f82859ea6f814a5fb5 --- java/com/android/dialer/main/impl/OldMainActivityPeer.java | 6 ++++++ java/com/android/dialer/main/impl/bottomnav/BottomNavBar.java | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) (limited to 'java/com/android/dialer/main') diff --git a/java/com/android/dialer/main/impl/OldMainActivityPeer.java b/java/com/android/dialer/main/impl/OldMainActivityPeer.java index 2ea36ea20..03afef4b4 100644 --- a/java/com/android/dialer/main/impl/OldMainActivityPeer.java +++ b/java/com/android/dialer/main/impl/OldMainActivityPeer.java @@ -1186,8 +1186,12 @@ public class OldMainActivityPeer implements MainActivityPeer, FragmentUtilListen * *

Executes all fragment shows/hides in one transaction with no conflicting transactions * (like showing and hiding the same fragment in the same transaction). See a bug. + * + *

Special care should be taken to avoid calling this method several times in a short window + * as it can lead to fragments overlapping. */ private void showFragment(@NonNull Fragment fragment, String tag) { + LogUtil.enterBlock("MainBottomNavBarBottomNavTabListener.showFragment"); Fragment speedDial = fragmentManager.findFragmentByTag(SPEED_DIAL_TAG); Fragment callLog = fragmentManager.findFragmentByTag(CALL_LOG_TAG); Fragment contacts = fragmentManager.findFragmentByTag(CONTACTS_TAG); @@ -1200,6 +1204,8 @@ public class OldMainActivityPeer implements MainActivityPeer, FragmentUtilListen fragmentShown |= showIfEqualElseHide(transaction, fragment, voicemail); if (!fragmentShown) { + LogUtil.i( + "MainBottomNavBarBottomNavTabListener.showFragment", "Not added yet: " + fragment); transaction.add(R.id.fragment_container, fragment, tag); } transaction.commit(); diff --git a/java/com/android/dialer/main/impl/bottomnav/BottomNavBar.java b/java/com/android/dialer/main/impl/bottomnav/BottomNavBar.java index 903f51fd2..80aa38b3e 100644 --- a/java/com/android/dialer/main/impl/bottomnav/BottomNavBar.java +++ b/java/com/android/dialer/main/impl/bottomnav/BottomNavBar.java @@ -155,7 +155,8 @@ public final class BottomNavBar extends LinearLayout { int voicemailcurrentVisibility = voicemail.getVisibility(); if (voicemailpreviousVisibility != voicemailcurrentVisibility - && voicemailpreviousVisibility == View.VISIBLE) { + && voicemailpreviousVisibility == View.VISIBLE + && getSelectedTab() == TabIndex.VOICEMAIL) { LogUtil.i("OldMainActivityPeer.showVoicemail", "hid VM tab and moved to speed dial tab"); selectTab(TabIndex.SPEED_DIAL); } -- cgit v1.2.3