From 12b1521b7c070256727eaceed21a3ed527c1cfc7 Mon Sep 17 00:00:00 2001 From: Danny Baumann Date: Fri, 26 Sep 2014 14:50:52 +0200 Subject: Fix up screen rotation behaviour of call log activity. Make sure the search fragment is hidden if not needed, and save instance state of activity and fragments. Change-Id: I9dc6e6b7cc2403abf1ad4afbe0aa8d3f4c96f05c --- .../android/dialer/calllog/CallLogActivity.java | 56 ++++++++++++++++++---- .../android/dialer/calllog/CallLogFragment.java | 21 ++++---- .../dialer/calllog/CallLogSearchFragment.java | 31 ++++++------ .../dialer/callstats/CallStatsFragment.java | 26 ++++++++++ 4 files changed, 98 insertions(+), 36 deletions(-) diff --git a/src/com/android/dialer/calllog/CallLogActivity.java b/src/com/android/dialer/calllog/CallLogActivity.java index e1a5c64d6..1023c44d8 100755 --- a/src/com/android/dialer/calllog/CallLogActivity.java +++ b/src/com/android/dialer/calllog/CallLogActivity.java @@ -42,6 +42,7 @@ import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnFocusChangeListener; +import android.view.ViewGroup; import android.view.inputmethod.InputMethodManager; import android.view.Menu; import android.view.MenuInflater; @@ -82,6 +83,9 @@ public class CallLogActivity extends Activity implements private static final int TAB_INDEX_COUNT = 3; + private static final String STATE_KEY_SEARCH = "calllog:search"; + private static final String STATE_KEY_QUERY = "calllog:query"; + public class ViewPagerAdapter extends FragmentPagerAdapter { public ViewPagerAdapter(FragmentManager fm) { super(fm); @@ -91,11 +95,9 @@ public class CallLogActivity extends Activity implements public Fragment getItem(int position) { switch (position) { case TAB_INDEX_ALL: - mAllCallsFragment = new CallLogFragment(CallLogQueryHandler.CALL_TYPE_ALL); - return mAllCallsFragment; + return CallLogFragment.newInstance(CallLogQueryHandler.CALL_TYPE_ALL); case TAB_INDEX_MISSED: - mMissedCallsFragment = new CallLogFragment(Calls.MISSED_TYPE); - return mMissedCallsFragment; + return CallLogFragment.newInstance(Calls.MISSED_TYPE); case TAB_INDEX_STATS: mStatsFragment = new CallStatsFragment(); return mStatsFragment; @@ -103,6 +105,22 @@ public class CallLogActivity extends Activity implements throw new IllegalStateException("No fragment at position " + position); } + @Override + public Object instantiateItem(ViewGroup container, int position) { + // We can't distinguish the two fragments in onAttach, which is + // why we differentiate between them here + Object result = super.instantiateItem(container, position); + switch (position) { + case TAB_INDEX_ALL: + mAllCallsFragment = (CallLogFragment) result; + break; + case TAB_INDEX_MISSED: + mMissedCallsFragment = (CallLogFragment) result; + break; + } + return result; + } + @Override public int getCount() { return TAB_INDEX_COUNT; @@ -169,7 +187,7 @@ public class CallLogActivity extends Activity implements super.onCreate(savedInstanceState); if (MSimTelephonyManager.getDefault().isMultiSimEnabled()) { initMSimCallLog(); - addSearchFragment(); + initSearchFragment(); return; } @@ -208,7 +226,20 @@ public class CallLogActivity extends Activity implements mViewPager.setOnPageChangeListener(mOnPageChangeListener); mViewPager.setOffscreenPageLimit(2); - addSearchFragment(); + initSearchFragment(); + if (savedInstanceState != null && savedInstanceState.getBoolean(STATE_KEY_SEARCH, false)) { + enterSearchUi(); + mSearchView.setQuery(savedInstanceState.getString(STATE_KEY_QUERY), false); + } + } + + @Override + protected void onSaveInstanceState(Bundle state) { + super.onSaveInstanceState(state); + state.putBoolean(STATE_KEY_SEARCH, mInSearchUi); + if (mInSearchUi) { + state.putString(STATE_KEY_QUERY, mSearchFragment.getQueryString()); + } } @Override @@ -217,6 +248,8 @@ public class CallLogActivity extends Activity implements mSearchFragment = (CallLogSearchFragment) fragment; } else if (fragment instanceof MSimCallLogFragment) { mMSimCallsFragment = (MSimCallLogFragment) fragment; + } else if (fragment instanceof CallStatsFragment) { + mStatsFragment = (CallStatsFragment) fragment; } } @@ -366,14 +399,19 @@ public class CallLogActivity extends Activity implements } } - private void addSearchFragment() { + private void initSearchFragment() { + final FragmentManager fm = getFragmentManager(); + if (mSearchFragment == null) { + mSearchFragment = (CallLogSearchFragment) fm.findFragmentByTag("search"); + } if (mSearchFragment != null) { + fm.beginTransaction().hide(mSearchFragment).commit(); return; } - final FragmentTransaction ft = getFragmentManager().beginTransaction(); + final FragmentTransaction ft = fm.beginTransaction(); final Fragment searchFragment = new CallLogSearchFragment(); searchFragment.setUserVisibleHint(false); - ft.add(R.id.calllog_frame, searchFragment); + ft.add(R.id.calllog_frame, searchFragment, "search"); ft.hide(searchFragment); ft.commitAllowingStateLoss(); } diff --git a/src/com/android/dialer/calllog/CallLogFragment.java b/src/com/android/dialer/calllog/CallLogFragment.java index 3cdfb464b..dc3dfd434 100644 --- a/src/com/android/dialer/calllog/CallLogFragment.java +++ b/src/com/android/dialer/calllog/CallLogFragment.java @@ -140,24 +140,25 @@ public class CallLogFragment extends ListFragment // will be used. private int mLogLimit = -1; - public CallLogFragment() { - this(CallLogQueryHandler.CALL_TYPE_ALL, -1); - } - - public CallLogFragment(int filterType) { - this(filterType, -1); + public static CallLogFragment newInstance(int filterType) { + CallLogFragment f = new CallLogFragment(); + Bundle args = new Bundle(); + args.putInt("filter", filterType); + f.setArguments(args); + return f; } - public CallLogFragment(int filterType, int logLimit) { - super(); - mCallTypeFilter = filterType; - mLogLimit = logLimit; + public CallLogFragment() { } @Override public void onCreate(Bundle state) { super.onCreate(state); + Bundle args = getArguments(); + mCallTypeFilter = args != null ? args.getInt("filter", -1) : -1; + mLogLimit = args != null ? args.getInt("limit", -1) : -1; + mCallLogQueryHandler = new CallLogQueryHandler(getActivity().getContentResolver(), this, mLogLimit); mKeyguardManager = diff --git a/src/com/android/dialer/calllog/CallLogSearchFragment.java b/src/com/android/dialer/calllog/CallLogSearchFragment.java index 1f04539e7..674a99ec1 100755 --- a/src/com/android/dialer/calllog/CallLogSearchFragment.java +++ b/src/com/android/dialer/calllog/CallLogSearchFragment.java @@ -47,13 +47,9 @@ import com.android.dialerbind.ObjectFactory; public class CallLogSearchFragment extends CallLogFragment { - private String mQueryString; - private void updateCallList(int filterType) { - mCallLogQueryHandler.fetchCalls(CallLogQueryHandler.CALL_TYPE_ALL); - } - + @Override public void fetchCalls() { if (TextUtils.isEmpty(mQueryString)) { mCallLogQueryHandler.fetchCalls(CallLogQueryHandler.CALL_TYPE_ALL); @@ -62,29 +58,30 @@ public class CallLogSearchFragment extends CallLogFragment { } } + @Override public void startCallsQuery() { mAdapter.setLoading(true); - if (TextUtils.isEmpty(mQueryString)) { - mCallLogQueryHandler.fetchCalls(CallLogQueryHandler.CALL_TYPE_ALL); - } else { - mCallLogQueryHandler.fetchCalls(mQueryString); - } + fetchCalls(); + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + mAdapter.setQueryString(mQueryString); + startCallsQuery(); } public void setQueryString(String queryString) { if (!TextUtils.equals(mQueryString, queryString)) { mQueryString = queryString; if (mAdapter != null) { - mAdapter.setLoading(true); mAdapter.setQueryString(mQueryString); - if (TextUtils.isEmpty(queryString)) { - mCallLogQueryHandler - .fetchCalls(CallLogQueryHandler.CALL_TYPE_ALL); - } else { - mCallLogQueryHandler.fetchCalls(queryString); - } + startCallsQuery(); } } } + public String getQueryString() { + return mQueryString; + } } diff --git a/src/com/android/dialer/callstats/CallStatsFragment.java b/src/com/android/dialer/callstats/CallStatsFragment.java index fb1e075a9..0b0ad4664 100644 --- a/src/com/android/dialer/callstats/CallStatsFragment.java +++ b/src/com/android/dialer/callstats/CallStatsFragment.java @@ -62,6 +62,11 @@ public class CallStatsFragment extends ListFragment implements AdapterView.OnItemSelectedListener, DoubleDatePickerDialog.OnDateSetListener { private static final String TAG = "CallStatsFragment"; + private static final String STATE_KEY_FILTER = "callstats:filter"; + private static final String STATE_KEY_FROM = "callstats:from"; + private static final String STATE_KEY_TO = "callstats:to"; + private static final String STATE_KEY_SORT_DURATION = "callstats:sort_by_duration"; + private static final int[] CALL_DIRECTION_RESOURCES = new int[] { R.drawable.ic_call_inout_holo_dark, R.drawable.ic_call_incoming_holo_dark, @@ -156,6 +161,17 @@ public class CallStatsFragment extends ListFragment implements getListView().setItemsCanFocus(true); } + @Override + public void onViewStateRestored(Bundle savedInstanceState) { + super.onViewStateRestored(savedInstanceState); + if (savedInstanceState != null) { + mCallTypeFilter = savedInstanceState.getInt(STATE_KEY_FILTER); + mFilterFrom = savedInstanceState.getLong(STATE_KEY_FROM); + mFilterTo = savedInstanceState.getLong(STATE_KEY_TO); + mSortByDuration = savedInstanceState.getBoolean(STATE_KEY_SORT_DURATION); + } + } + @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.call_stats_options, menu); @@ -174,11 +190,21 @@ public class CallStatsFragment extends ListFragment implements android.R.layout.simple_list_item_1, getResources().getStringArray(R.array.call_stats_nav_items)); mFilterSpinner.setAdapter(filterAdapter); + mFilterSpinner.setSelection(mCallTypeFilter); mFilterSpinner.setOnItemSelectedListener(this); super.onCreateOptionsMenu(menu, inflater); } + @Override + public void onSaveInstanceState(Bundle state) { + super.onSaveInstanceState(state); + state.putInt(STATE_KEY_FILTER, mCallTypeFilter); + state.putLong(STATE_KEY_FROM, mFilterFrom); + state.putLong(STATE_KEY_TO, mFilterTo); + state.putBoolean(STATE_KEY_SORT_DURATION, mSortByDuration); + } + @Override public boolean onOptionsItemSelected(MenuItem item) { final int itemId = item.getItemId(); -- cgit v1.2.3