From 979f38e37da9bdd4c51aceafe7bcc44b305e3d02 Mon Sep 17 00:00:00 2001 From: Yorke Lee Date: Fri, 6 Mar 2015 18:10:19 -0800 Subject: Improve InCallUI fragment management * Load some fragments on demand * ConferenceManagerFragment * DialpadFragment * Remove ConferenceManagerFragment from incall_screen.xml so that it is no longer loaded statically * Add helper methods to InCallActivity to facilitate dynamically loading fragments * Fix some bugs with fragment visibility and activity recreation Change-Id: I475e2302fae415817f06da209dd6484c89467480 --- .../res/layout/conference_manager_fragment.xml | 4 +- InCallUI/res/layout/incall_screen.xml | 9 -- .../src/com/android/incallui/AnswerFragment.java | 2 +- .../src/com/android/incallui/BaseFragment.java | 13 ++ .../src/com/android/incallui/CallCardFragment.java | 1 - .../incallui/ConferenceManagerFragment.java | 32 +++-- .../incallui/ConferenceManagerPresenter.java | 1 - .../src/com/android/incallui/DialpadFragment.java | 7 - .../android/incallui/FragmentDisplayManager.java | 23 ++++ .../src/com/android/incallui/InCallActivity.java | 150 +++++++++++++++------ 10 files changed, 172 insertions(+), 70 deletions(-) create mode 100644 InCallUI/src/com/android/incallui/FragmentDisplayManager.java (limited to 'InCallUI') diff --git a/InCallUI/res/layout/conference_manager_fragment.xml b/InCallUI/res/layout/conference_manager_fragment.xml index 8e55ad762..7350bee14 100644 --- a/InCallUI/res/layout/conference_manager_fragment.xml +++ b/InCallUI/res/layout/conference_manager_fragment.xml @@ -22,9 +22,7 @@ android:background="@color/conference_call_manager_background_color" android:layout_width="match_parent" android:layout_height="match_parent" - android:paddingTop="@dimen/conference_call_manager_padding_top" - android:visibility="gone"> - + android:paddingTop="@dimen/conference_call_manager_padding_top" > - - diff --git a/InCallUI/src/com/android/incallui/AnswerFragment.java b/InCallUI/src/com/android/incallui/AnswerFragment.java index 29747dabd..cb09dfdcc 100644 --- a/InCallUI/src/com/android/incallui/AnswerFragment.java +++ b/InCallUI/src/com/android/incallui/AnswerFragment.java @@ -247,7 +247,7 @@ public class AnswerFragment extends BaseFragment, U extends Ui> extends Fragment { + private static final String KEY_FRAGMENT_HIDDEN = "key_fragment_hidden"; + private T mPresenter; abstract T createPresenter(); @@ -54,6 +57,9 @@ public abstract class BaseFragment, U extends Ui> extends super.onCreate(savedInstanceState); if (savedInstanceState != null) { mPresenter.onRestoreInstanceState(savedInstanceState); + if (savedInstanceState.getBoolean(KEY_FRAGMENT_HIDDEN)) { + getFragmentManager().beginTransaction().hide(this).commit(); + } } } @@ -67,5 +73,12 @@ public abstract class BaseFragment, U extends Ui> extends public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mPresenter.onSaveInstanceState(outState); + outState.putBoolean(KEY_FRAGMENT_HIDDEN, isHidden()); + } + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + ((FragmentDisplayManager) activity).onFragmentAttached(this); } } diff --git a/InCallUI/src/com/android/incallui/CallCardFragment.java b/InCallUI/src/com/android/incallui/CallCardFragment.java index 00e619609..bdf39d59f 100644 --- a/InCallUI/src/com/android/incallui/CallCardFragment.java +++ b/InCallUI/src/com/android/incallui/CallCardFragment.java @@ -134,7 +134,6 @@ public class CallCardFragment extends BaseFragment implements ConferenceManagerPresenter.ConferenceManagerUi { + private static final String KEY_IS_VISIBLE = "key_conference_is_visible"; + private ListView mConferenceParticipantList; private int mActionBarElevation; private ContactPhotoManager mContactPhotoManager; private LayoutInflater mInflater; private ConferenceParticipantListAdapter mConferenceParticipantListAdapter; + private boolean mIsVisible; + private boolean mIsRecreating; @Override ConferenceManagerPresenter createPresenter() { - // having a singleton instance. return new ConferenceManagerPresenter(); } @@ -56,6 +59,10 @@ public class ConferenceManagerFragment @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + if (savedInstanceState != null) { + mIsRecreating = true; + mIsVisible = savedInstanceState.getBoolean(KEY_IS_VISIBLE); + } } @Override @@ -75,15 +82,23 @@ public class ConferenceManagerFragment } @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); + public void onResume() { + super.onResume(); + if (mIsRecreating) { + onVisibilityChanged(mIsVisible); + } } @Override - public void setVisible(boolean on) { - ActionBar actionBar = getActivity().getActionBar(); + public void onSaveInstanceState(Bundle outState) { + outState.putBoolean(KEY_IS_VISIBLE, mIsVisible); + super.onSaveInstanceState(outState); + } - if (on) { + public void onVisibilityChanged(boolean isVisible) { + mIsVisible = isVisible; + ActionBar actionBar = getActivity().getActionBar(); + if (isVisible) { actionBar.setTitle(R.string.manageConferenceLabel); actionBar.setElevation(mActionBarElevation); actionBar.setHideOffset(0); @@ -91,13 +106,10 @@ public class ConferenceManagerFragment final CallList calls = CallList.getInstance(); getPresenter().init(getActivity(), calls); - getView().setVisibility(View.VISIBLE); // Request focus on the list of participants for accessibility purposes. This ensures // that once the list of participants is shown, the first participant is announced. mConferenceParticipantList.requestFocus(); } else { - getView().setVisibility(View.GONE); - actionBar.setElevation(0); actionBar.setHideOffset(actionBar.getHeight()); } diff --git a/InCallUI/src/com/android/incallui/ConferenceManagerPresenter.java b/InCallUI/src/com/android/incallui/ConferenceManagerPresenter.java index 86fc18ff3..6fb6e5dda 100644 --- a/InCallUI/src/com/android/incallui/ConferenceManagerPresenter.java +++ b/InCallUI/src/com/android/incallui/ConferenceManagerPresenter.java @@ -137,7 +137,6 @@ public class ConferenceManagerPresenter } public interface ConferenceManagerUi extends Ui { - void setVisible(boolean on); boolean isFragmentVisible(); void update(Context context, List participants, boolean parentCanSeparate); void refreshCall(Call call); diff --git a/InCallUI/src/com/android/incallui/DialpadFragment.java b/InCallUI/src/com/android/incallui/DialpadFragment.java index 611815a33..5a02b8b0e 100644 --- a/InCallUI/src/com/android/incallui/DialpadFragment.java +++ b/InCallUI/src/com/android/incallui/DialpadFragment.java @@ -29,13 +29,11 @@ import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; -import android.view.ViewTreeObserver; import android.view.accessibility.AccessibilityManager; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; -import com.android.contacts.common.util.MaterialColorMapUtils.MaterialPalette; import com.android.phone.common.dialpad.DialpadKeyButton; import com.android.phone.common.dialpad.DialpadView; @@ -420,11 +418,6 @@ public class DialpadFragment extends BaseFragment