diff options
Diffstat (limited to 'src/com/android/dialer')
7 files changed, 276 insertions, 328 deletions
diff --git a/src/com/android/dialer/calllog/CallLogActivity.java b/src/com/android/dialer/calllog/CallLogActivity.java index 10a77e10d..fe79ea6c0 100755 --- a/src/com/android/dialer/calllog/CallLogActivity.java +++ b/src/com/android/dialer/calllog/CallLogActivity.java @@ -22,12 +22,7 @@ import android.app.FragmentManager; import android.app.FragmentTransaction; import android.content.Context; import android.content.Intent; -import android.database.Cursor; import android.os.Bundle; -import android.os.Handler; -import android.provider.CallLog; -import android.provider.CallLog.Calls; -import android.telephony.TelephonyManager; import android.support.v13.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.text.TextUtils; @@ -41,80 +36,49 @@ import android.view.MotionEvent; import android.widget.SearchView; import android.widget.SearchView.OnCloseListener; import android.widget.SearchView.OnQueryTextListener; -import android.util.Log; import com.android.contacts.common.interactions.TouchPointManager; import com.android.contacts.common.list.ViewPagerTabs; import com.android.dialer.DialtactsActivity; import com.android.dialer.R; -import com.android.dialer.voicemail.VoicemailStatusHelper; -import com.android.dialer.voicemail.VoicemailStatusHelperImpl; import com.android.dialerbind.analytics.AnalyticsActivity; -import com.android.dialer.calllog.CallLogFragment; import com.android.dialer.callstats.CallStatsFragment; import com.android.dialer.widget.DoubleDatePickerDialog; -public class CallLogActivity extends AnalyticsActivity implements CallLogQueryHandler.Listener, +public class CallLogActivity extends AnalyticsActivity implements DoubleDatePickerDialog.OnDateSetListener { - private Handler mHandler; private ViewPager mViewPager; private ViewPagerTabs mViewPagerTabs; private FragmentPagerAdapter mViewPagerAdapter; - private CallLogFragment mAllCallsFragment; - private CallLogFragment mMissedCallsFragment; private CallStatsFragment mStatsFragment; - private CallLogFragment mVoicemailFragment; - private VoicemailStatusHelper mVoicemailStatusHelper; - - private static final int WAIT_FOR_VOICEMAIL_PROVIDER_TIMEOUT_MS = 300; - private boolean mSwitchToVoicemailTab; private MSimCallLogFragment mMSimCallsFragment; private CallLogSearchFragment mSearchFragment; private SearchView mSearchView; private boolean mInSearchUi; - private String[] mTabTitles; - - private static final int TAB_INDEX_ALL = 0; - private static final int TAB_INDEX_MISSED = 1; - private static final int TAB_INDEX_STATS = 2; - private static final int TAB_INDEX_VOICEMAIL = 3; - - private static final int TAB_INDEX_COUNT_DEFAULT = 3; - private static final int TAB_INDEX_COUNT_WITH_VOICEMAIL = 4; - - private boolean mHasActiveVoicemailProvider; - - private final Runnable mWaitForVoicemailTimeoutRunnable = new Runnable() { - @Override - public void run() { - mViewPagerTabs.setViewPager(mViewPager); - mViewPager.setCurrentItem(TAB_INDEX_ALL); - mSwitchToVoicemailTab = false; - } - }; private static final int TAB_INDEX_MSIM = 0; - private static final int TAB_INDEX_COUNT_MSIM = 1; + private static final int TAB_INDEX_MSIM_STATS = 1; + private static final int TAB_INDEX_COUNT_MSIM = 2; - public class ViewPagerAdapter extends FragmentPagerAdapter { - public ViewPagerAdapter(FragmentManager fm) { + public class MSimViewPagerAdapter extends FragmentPagerAdapter { + private String[] mTabTitles; + + public MSimViewPagerAdapter(FragmentManager fm) { super(fm); + + mTabTitles = new String[TAB_INDEX_COUNT_MSIM]; + mTabTitles[0] = getString(R.string.call_log_all_title); + mTabTitles[1] = getString(R.string.call_log_stats_title); } @Override public Fragment getItem(int position) { switch (position) { - case TAB_INDEX_ALL: - mAllCallsFragment = new CallLogFragment(CallLogQueryHandler.CALL_TYPE_ALL); - return mAllCallsFragment; - case TAB_INDEX_MISSED: - mMissedCallsFragment = new CallLogFragment(Calls.MISSED_TYPE); - return mMissedCallsFragment; - case TAB_INDEX_VOICEMAIL: - mVoicemailFragment = new CallLogFragment(Calls.VOICEMAIL_TYPE); - return mVoicemailFragment; - case TAB_INDEX_STATS: + case TAB_INDEX_MSIM: + mMSimCallsFragment = new MSimCallLogFragment(); + return mMSimCallsFragment; + case TAB_INDEX_MSIM_STATS: mStatsFragment = new CallStatsFragment(); return mStatsFragment; } @@ -128,28 +92,6 @@ public class CallLogActivity extends AnalyticsActivity implements CallLogQueryHa @Override public int getCount() { - return mHasActiveVoicemailProvider ? TAB_INDEX_COUNT_WITH_VOICEMAIL : - TAB_INDEX_COUNT_DEFAULT; - } - } - - public class MSimViewPagerAdapter extends FragmentPagerAdapter { - public MSimViewPagerAdapter(FragmentManager fm) { - super(fm); - } - - @Override - public Fragment getItem(int position) { - switch (position) { - case TAB_INDEX_MSIM: - mMSimCallsFragment = new MSimCallLogFragment(); - return mMSimCallsFragment; - } - throw new IllegalStateException("No fragment at position " + position); - } - - @Override - public int getCount() { return TAB_INDEX_COUNT_MSIM; } } @@ -166,14 +108,6 @@ public class CallLogActivity extends AnalyticsActivity implements CallLogQueryHa protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (getTelephonyManager().isMultiSimEnabled()) { - initMSimCallLog(); - addSearchFragment(); - return; - } - - mHandler = new Handler(); - setContentView(R.layout.call_log_activity); getWindow().setBackgroundDrawable(null); @@ -183,57 +117,15 @@ public class CallLogActivity extends AnalyticsActivity implements CallLogQueryHa actionBar.setDisplayShowTitleEnabled(true); actionBar.setElevation(0); - int startingTab = TAB_INDEX_ALL; - final Intent intent = getIntent(); - if (intent != null) { - final int callType = intent.getIntExtra(CallLog.Calls.EXTRA_CALL_TYPE_FILTER, -1); - if (callType == CallLog.Calls.MISSED_TYPE) { - startingTab = TAB_INDEX_MISSED; - } else if (callType == CallLog.Calls.VOICEMAIL_TYPE) { - startingTab = TAB_INDEX_VOICEMAIL; - } - } - - mTabTitles = new String[TAB_INDEX_COUNT_WITH_VOICEMAIL]; - mTabTitles[0] = getString(R.string.call_log_all_title); - mTabTitles[1] = getString(R.string.call_log_missed_title); - mTabTitles[2] = getString(R.string.call_log_stats_title); - mTabTitles[3] = getString(R.string.call_log_voicemail_title); - mViewPager = (ViewPager) findViewById(R.id.call_log_pager); - mViewPagerAdapter = new ViewPagerAdapter(getFragmentManager()); + mViewPagerAdapter = new MSimViewPagerAdapter(getFragmentManager()); mViewPager.setAdapter(mViewPagerAdapter); - mViewPager.setOffscreenPageLimit(2); mViewPagerTabs = (ViewPagerTabs) findViewById(R.id.viewpager_header); mViewPager.setOnPageChangeListener(mViewPagerTabs); - - if (startingTab == TAB_INDEX_VOICEMAIL) { - // The addition of the voicemail tab is an asynchronous process, so wait till the tab - // is added, before attempting to switch to it. If the querying of CP2 for voicemail - // providers takes too long, give up and show the first tab instead. - mSwitchToVoicemailTab = true; - mHandler.postDelayed(mWaitForVoicemailTimeoutRunnable, - WAIT_FOR_VOICEMAIL_PROVIDER_TIMEOUT_MS); - } else { - mViewPagerTabs.setViewPager(mViewPager); - mViewPager.setCurrentItem(startingTab); - } + mViewPagerTabs.setViewPager(mViewPager); addSearchFragment(); - mVoicemailStatusHelper = new VoicemailStatusHelperImpl(); - } - - @Override - protected void onResume() { - super.onResume(); - - if (getTelephonyManager().isMultiSimEnabled()) - return; - - CallLogQueryHandler callLogQueryHandler = - new CallLogQueryHandler(this.getContentResolver(), this); - callLogQueryHandler.fetchVoicemailStatus(); } @Override @@ -243,25 +135,6 @@ public class CallLogActivity extends AnalyticsActivity implements CallLogQueryHa } } - private TelephonyManager getTelephonyManager() { - return (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); - } - - private void initMSimCallLog() { - setContentView(R.layout.msim_call_log_activity); - getWindow().setBackgroundDrawable(null); - - final ActionBar actionBar = getActionBar(); - actionBar.setDisplayShowHomeEnabled(true); - actionBar.setDisplayHomeAsUpEnabled(true); - actionBar.setDisplayShowTitleEnabled(true); - - mViewPager = (ViewPager) findViewById(R.id.call_log_pager); - - mViewPagerAdapter = new MSimViewPagerAdapter(getFragmentManager()); - mViewPager.setAdapter(mViewPagerAdapter); - } - @Override public boolean onCreateOptionsMenu(Menu menu) { final MenuInflater inflater = getMenuInflater(); @@ -286,16 +159,12 @@ public class CallLogActivity extends AnalyticsActivity implements CallLogQueryHa itemSearchCallLog.setVisible(adapter != null && !adapter.isEmpty()); } - // If onPrepareOptionsMenu is called before fragments loaded. Don't do anything. - if (mAllCallsFragment != null && itemDeleteAll != null) { - final CallLogAdapter adapter = mAllCallsFragment.getAdapter(); - itemDeleteAll.setVisible(adapter != null && !adapter.isEmpty()); - } - if (mMSimCallsFragment != null && itemDeleteAll != null) { - final CallLogAdapter adapter = mMSimCallsFragment.getAdapter(); - itemDeleteAll.setVisible(adapter != null && !adapter.isEmpty()); - } + // If onPrepareOptionsMenu is called before fragments loaded. Don't do anything. + if (mMSimCallsFragment != null && itemDeleteAll != null) { + final CallLogAdapter adapter = mMSimCallsFragment.getAdapter(); + itemDeleteAll.setVisible(adapter != null && !adapter.isEmpty()); + } } return true; } @@ -325,35 +194,6 @@ public class CallLogActivity extends AnalyticsActivity implements CallLogQueryHa startActivity(intent); } - @Override - public void onVoicemailStatusFetched(Cursor statusCursor) { - if (this.isFinishing()) { - return; - } - - mHandler.removeCallbacks(mWaitForVoicemailTimeoutRunnable); - // Update mHasActiveVoicemailProvider, which controls the number of tabs displayed. - int activeSources = mVoicemailStatusHelper.getNumberActivityVoicemailSources(statusCursor); - if (activeSources > 0 != mHasActiveVoicemailProvider) { - mHasActiveVoicemailProvider = activeSources > 0; - mViewPagerAdapter.notifyDataSetChanged(); - mViewPagerTabs.setViewPager(mViewPager); - if (mSwitchToVoicemailTab) { - mViewPager.setCurrentItem(TAB_INDEX_VOICEMAIL, false); - } - } else if (mSwitchToVoicemailTab) { - // The voicemail tab was requested, but it does not exist because there are no - // voicemail sources. Just fallback to the first item instead. - mViewPagerTabs.setViewPager(mViewPager); - } - } - - @Override - public boolean onCallsFetched(Cursor statusCursor) { - // Return false; did not take ownership of cursor - return false; - } - private void enterSearchUi() { if (mSearchFragment == null) { return; @@ -379,9 +219,8 @@ public class CallLogActivity extends AnalyticsActivity implements CallLogQueryHa transaction.commitAllowingStateLoss(); getFragmentManager().executePendingTransactions(); mViewPager.setVisibility(View.GONE); - if (!getTelephonyManager().isMultiSimEnabled()) { - mViewPagerTabs.setVisibility(View.GONE); - } + mViewPagerTabs.setVisibility(View.GONE); + // We need to call this and onActionViewCollapsed() manually, since we // are using a custom // layout instead of asking the search menu item to take care of @@ -391,7 +230,7 @@ public class CallLogActivity extends AnalyticsActivity implements CallLogQueryHa } private void updateFragmentVisibility(int position, boolean visibility) { - if (position >= TAB_INDEX_ALL) { + if (position >= TAB_INDEX_MSIM) { final Fragment fragment = getFragmentAt(position); if (fragment != null) { fragment.setMenuVisibility(visibility); @@ -402,17 +241,9 @@ public class CallLogActivity extends AnalyticsActivity implements CallLogQueryHa private Fragment getFragmentAt(int position) { switch (position) { - case TAB_INDEX_ALL: - if (getTelephonyManager().isMultiSimEnabled()) { - return mMSimCallsFragment; - } else { - return mAllCallsFragment; - } - case TAB_INDEX_MISSED: - return mMissedCallsFragment; - case TAB_INDEX_VOICEMAIL: - return mVoicemailFragment; - case TAB_INDEX_STATS: + case TAB_INDEX_MSIM: + return mMSimCallsFragment; + case TAB_INDEX_MSIM_STATS: return mStatsFragment; default: throw new IllegalStateException("Unknown fragment index: " @@ -548,9 +379,8 @@ public class CallLogActivity extends AnalyticsActivity implements CallLogQueryHa } mViewPager.setVisibility(View.VISIBLE); - if (!getTelephonyManager().isMultiSimEnabled()) { - mViewPagerTabs.setVisibility(View.VISIBLE); - } + mViewPagerTabs.setVisibility(View.VISIBLE); + hideInputMethod(getCurrentFocus()); // Request to update option menu. diff --git a/src/com/android/dialer/calllog/MSimCallLogFragment.java b/src/com/android/dialer/calllog/MSimCallLogFragment.java index 36fca8782..4f5c48deb 100755 --- a/src/com/android/dialer/calllog/MSimCallLogFragment.java +++ b/src/com/android/dialer/calllog/MSimCallLogFragment.java @@ -74,13 +74,6 @@ public class MSimCallLogFragment extends CallLogFragment { // Default to all slots. private int mCallSubFilter = CallLogQueryHandler.CALL_SUB_ALL; - // The index for call type spinner. - private static final int INDEX_CALL_TYPE_ALL = 0; - private static final int INDEX_CALL_TYPE_INCOMING = 1; - private static final int INDEX_CALL_TYPE_OUTGOING = 2; - private static final int INDEX_CALL_TYPE_MISSED = 3; - private static final int INDEX_CALL_TYPE_VOICEMAIL = 4; - private OnItemSelectedListener mSubSelectedListener = new OnItemSelectedListener() { @Override @@ -104,23 +97,7 @@ public class MSimCallLogFragment extends CallLogFragment { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { Log.i(TAG, "Status selected, position: " + position); - switch (position) { - case INDEX_CALL_TYPE_ALL: - mCallTypeFilter = CallLogQueryHandler.CALL_TYPE_ALL; - break; - case INDEX_CALL_TYPE_INCOMING: - mCallTypeFilter = Calls.INCOMING_TYPE; - break; - case INDEX_CALL_TYPE_OUTGOING: - mCallTypeFilter = Calls.OUTGOING_TYPE; - break; - case INDEX_CALL_TYPE_MISSED: - mCallTypeFilter = Calls.MISSED_TYPE; - break; - case INDEX_CALL_TYPE_VOICEMAIL: - mCallTypeFilter = Calls.VOICEMAIL_TYPE; - break; - } + mCallTypeFilter = ((SpinnerContent)parent.getItemAtPosition(position)).value; mCallLogQueryHandler.fetchCalls(mCallTypeFilter, 0, mCallSubFilter); } @@ -182,72 +159,35 @@ public class MSimCallLogFragment extends CallLogFragment { return; } - // Update the sub filter's content. - mCallSubFilter = getSelectedSub(); - ArrayAdapter<SpinnerContent> filterSubAdapter = new ArrayAdapter<SpinnerContent>( - this.getActivity(), R.layout.call_log_spinner_item, setupSubFilterContent()); - mFilterSubSpinnerView.setAdapter(filterSubAdapter); - mFilterSubSpinnerView.setOnItemSelectedListener(mSubSelectedListener); - SpinnerContent.setSpinnerContentValue(mFilterSubSpinnerView, mCallSubFilter); + final TelephonyManager telephony = (TelephonyManager) getActivity().getSystemService( + Context.TELEPHONY_SERVICE); + if (!telephony.isMultiSimEnabled()) { + mFilterSubSpinnerView.setVisibility(View.GONE); + } else { + // Update the sub filter's content. + ArrayAdapter<SpinnerContent> filterSubAdapter = new ArrayAdapter<SpinnerContent>( + this.getActivity(), R.layout.call_log_spinner_item, + SpinnerContent.setupSubFilterContent(getActivity())); + + if (filterSubAdapter.getCount() <= 1) { + mFilterSubSpinnerView.setVisibility(View.GONE); + } else { + mCallSubFilter = getSelectedSub(); + mFilterSubSpinnerView.setAdapter(filterSubAdapter); + mFilterSubSpinnerView.setOnItemSelectedListener(mSubSelectedListener); + SpinnerContent.setSpinnerContentValue(mFilterSubSpinnerView, mCallSubFilter); + } + } // Update the status filter's content. ArrayAdapter<SpinnerContent> filterStatusAdapter = new ArrayAdapter<SpinnerContent>( - this.getActivity(), R.layout.call_log_spinner_item, setupStatusFilterContent()); + this.getActivity(), R.layout.call_log_spinner_item, + SpinnerContent.setupStatusFilterContent(getActivity(), mVoicemailSourcesAvailable)); mFilterStatusSpinnerView.setAdapter(filterStatusAdapter); mFilterStatusSpinnerView.setOnItemSelectedListener(mStatusSelectedListener); SpinnerContent.setSpinnerContentValue(mFilterStatusSpinnerView, mCallTypeFilter); } - private SpinnerContent[] setupSubFilterContent() { - TelephonyManager telephonyManager = - (TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE); - int count = telephonyManager.getPhoneCount(); - // Update the filter sub content. - SpinnerContent filterSub[] = new SpinnerContent[count + 1]; - filterSub[0] = new SpinnerContent(CallLogQueryHandler.CALL_SUB_ALL, - getString(R.string.call_log_show_all_slots)); - for (int i = 0; i < count; i++) { - String subDisplayName = PhoneAccountUtils.getAccountLabel(getActivity(), - MoreContactUtils.getAccount(i)); - filterSub[i + 1] = new SpinnerContent(i, subDisplayName); - } - return filterSub; - } - - private SpinnerContent[] setupStatusFilterContent() { - // Didn't show the voice mail item if not available. - int statusCount = mVoicemailSourcesAvailable ? 5 : 4; - SpinnerContent filterStatus[] = new SpinnerContent[statusCount]; - for (int i = 0; i < statusCount; i++) { - int value = CallLogQueryHandler.CALL_TYPE_ALL; - String label = null; - switch (i) { - case INDEX_CALL_TYPE_ALL: - value = CallLogQueryHandler.CALL_TYPE_ALL; - label = getString(R.string.call_log_all_calls_header); - break; - case INDEX_CALL_TYPE_INCOMING: - value = Calls.INCOMING_TYPE; - label = getString(R.string.call_log_incoming_header); - break; - case INDEX_CALL_TYPE_OUTGOING: - value = Calls.OUTGOING_TYPE; - label = getString(R.string.call_log_outgoing_header); - break; - case INDEX_CALL_TYPE_MISSED: - value = Calls.MISSED_TYPE; - label = getString(R.string.call_log_missed_header); - break; - case INDEX_CALL_TYPE_VOICEMAIL: - value = Calls.VOICEMAIL_TYPE; - label = getString(R.string.call_log_voicemail_header); - break; - } - filterStatus[i] = new SpinnerContent(value, label); - } - return filterStatus; - } - /** * @return the saved selected subscription. */ @@ -266,33 +206,4 @@ public class MSimCallLogFragment extends CallLogFragment { PreferenceManager.getDefaultSharedPreferences(this.getActivity()).edit() .putInt(PREFERENCE_KEY_CALLLOG_SUB, sub).commit(); } - - /** - * To save the spinner content. - */ - private static class SpinnerContent { - public final int value; - public final String label; - - public static void setSpinnerContentValue(Spinner spinner, int value) { - for (int i = 0, count = spinner.getCount(); i < count; i++) { - SpinnerContent sc = (SpinnerContent) spinner.getItemAtPosition(i); - if (sc.value == value) { - spinner.setSelection(i, true); - Log.i(TAG, "Set selection for spinner(" + sc + ") with the value: " + value); - return; - } - } - } - - public SpinnerContent(int value, String label) { - this.value = value; - this.label = label; - } - - @Override - public String toString() { - return label; - } - } } diff --git a/src/com/android/dialer/calllog/SpinnerContent.java b/src/com/android/dialer/calllog/SpinnerContent.java new file mode 100644 index 000000000..614b594db --- /dev/null +++ b/src/com/android/dialer/calllog/SpinnerContent.java @@ -0,0 +1,127 @@ +/* + * Copyright (C) 2014 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ +package com.android.dialer.calllog; + +import android.content.Context; +import android.provider.CallLog; +import android.telephony.TelephonyManager; +import android.text.TextUtils; +import android.util.Log; +import android.widget.Spinner; + +import com.android.contacts.common.MoreContactUtils; +import com.android.dialer.R; + +import java.util.ArrayList; +import java.util.List; + +/** + * To save the spinner content. + */ +public class SpinnerContent { + private static String TAG = SpinnerContent.class.getSimpleName(); + + public final int value; + public final String label; + + // The index for call type spinner. + private static final int INDEX_CALL_TYPE_ALL = 0; + private static final int INDEX_CALL_TYPE_INCOMING = 1; + private static final int INDEX_CALL_TYPE_OUTGOING = 2; + private static final int INDEX_CALL_TYPE_MISSED = 3; + private static final int INDEX_CALL_TYPE_VOICEMAIL = 4; + + public static void setSpinnerContentValue(Spinner spinner, int value) { + for (int i = 0, count = spinner.getCount(); i < count; i++) { + SpinnerContent sc = (SpinnerContent) spinner.getItemAtPosition(i); + if (sc.value == value) { + spinner.setSelection(i, true); + Log.i(TAG, "Set selection for spinner(" + sc + ") with the value: " + value); + return; + } + } + } + + public SpinnerContent(int value, String label) { + this.value = value; + this.label = label; + } + + @Override + public String toString() { + return label; + } + + /** + * @return the spinner contents for the different sims (all, sim0, sim1 etc) + */ + public static List<SpinnerContent> setupSubFilterContent(Context context) { + TelephonyManager telephonyManager = + (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); + int count = telephonyManager.getPhoneCount(); + // Update the filter sub content. + ArrayList<SpinnerContent> values = new ArrayList<SpinnerContent>(count + 1); + values.add(new SpinnerContent(CallLogQueryHandler.CALL_SUB_ALL, + context.getString(R.string.call_log_show_all_slots))); + for (int i = 0; i < count; i++) { + String subDisplayName = PhoneAccountUtils.getAccountLabel(context, + MoreContactUtils.getAccount(i)); + if (!TextUtils.isEmpty(subDisplayName)) { + values.add(new SpinnerContent(i, subDisplayName)); + } + } + return values; + } + + /** + * @param voicemailAvailable true if voicemail should be included in the return values + * @return the spinner contents for the different call types (incoming, outgoing etc) + */ + public static List<SpinnerContent> setupStatusFilterContent(Context context, + boolean voicemailAvailable) { + // Didn't show the voice mail item if not available. + int statusCount = voicemailAvailable ? 5 : 4; + ArrayList<SpinnerContent> values = new ArrayList<SpinnerContent>(statusCount); + for (int i = 0; i < statusCount; i++) { + int value = CallLogQueryHandler.CALL_TYPE_ALL; + String label = null; + switch (i) { + case INDEX_CALL_TYPE_ALL: + value = CallLogQueryHandler.CALL_TYPE_ALL; + label = context.getString(R.string.call_log_all_calls_header); + break; + case INDEX_CALL_TYPE_INCOMING: + value = CallLog.Calls.INCOMING_TYPE; + label = context.getString(R.string.call_log_incoming_header); + break; + case INDEX_CALL_TYPE_OUTGOING: + value = CallLog.Calls.OUTGOING_TYPE; + label = context.getString(R.string.call_log_outgoing_header); + break; + case INDEX_CALL_TYPE_MISSED: + value = CallLog.Calls.MISSED_TYPE; + label = context.getString(R.string.call_log_missed_header); + break; + case INDEX_CALL_TYPE_VOICEMAIL: + value = CallLog.Calls.VOICEMAIL_TYPE; + label = context.getString(R.string.call_log_voicemail_header); + break; + } + values.add(new SpinnerContent(value, label)); + } + return values; + } +} diff --git a/src/com/android/dialer/callstats/CallStatsAdapter.java b/src/com/android/dialer/callstats/CallStatsAdapter.java index de9a71379..7cf35ef19 100644 --- a/src/com/android/dialer/callstats/CallStatsAdapter.java +++ b/src/com/android/dialer/callstats/CallStatsAdapter.java @@ -32,6 +32,7 @@ import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest; import com.android.contacts.common.GeoUtil; import com.android.dialer.R; import com.android.dialer.calllog.CallLogAdapterHelper; +import com.android.dialer.calllog.CallLogQueryHandler; import com.android.dialer.calllog.ContactInfo; import com.android.dialer.calllog.ContactInfoHelper; import com.android.dialer.calllog.PhoneNumberDisplayHelper; @@ -72,7 +73,7 @@ class CallStatsAdapter extends ArrayAdapter<CallStatsDetails> private CallStatsDetails mTotalItem; private Map<ContactInfo, CallStatsDetails> mInfoLookup; - private int mType = CallStatsQueryHandler.CALL_TYPE_ALL; + private int mType = CallLogQueryHandler.CALL_TYPE_ALL; private long mFilterFrom; private long mFilterTo; private boolean mSortByDuration; diff --git a/src/com/android/dialer/callstats/CallStatsDetailHelper.java b/src/com/android/dialer/callstats/CallStatsDetailHelper.java index c636451e6..b6acc92c9 100644 --- a/src/com/android/dialer/callstats/CallStatsDetailHelper.java +++ b/src/com/android/dialer/callstats/CallStatsDetailHelper.java @@ -26,6 +26,7 @@ import android.view.View; import android.widget.TextView; import com.android.dialer.R; +import com.android.dialer.calllog.CallLogQueryHandler; import com.android.dialer.calllog.PhoneNumberDisplayHelper; import com.android.dialer.calllog.PhoneNumberUtilsWrapper; @@ -81,7 +82,7 @@ public class CallStatsDetailHelper { float ratio = getDetailValue(details, type, byDuration) / getDetailValue(first, type, byDuration); - if (type == CallStatsQueryHandler.CALL_TYPE_ALL) { + if (type == CallLogQueryHandler.CALL_TYPE_ALL) { float full = getDetailValue(details, type, byDuration); in = getDetailValue(details, Calls.INCOMING_TYPE, byDuration) * ratio / full; out = getDetailValue(details, Calls.OUTGOING_TYPE, byDuration) * ratio / full; diff --git a/src/com/android/dialer/callstats/CallStatsFragment.java b/src/com/android/dialer/callstats/CallStatsFragment.java index c67e746ba..a1f87be9f 100644 --- a/src/com/android/dialer/callstats/CallStatsFragment.java +++ b/src/com/android/dialer/callstats/CallStatsFragment.java @@ -25,7 +25,9 @@ import android.os.Bundle; import android.os.Handler; import android.provider.CallLog; import android.provider.ContactsContract; +import android.telephony.TelephonyManager; import android.text.format.DateUtils; +import android.util.Log; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.Menu; @@ -34,12 +36,15 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; +import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.Spinner; import android.widget.TextView; import com.android.dialer.R; +import com.android.dialer.calllog.CallLogQueryHandler; import com.android.dialer.calllog.ContactInfo; +import com.android.dialer.calllog.SpinnerContent; import com.android.dialer.widget.DoubleDatePickerDialog; import java.util.List; @@ -50,9 +55,7 @@ public class CallStatsFragment extends ListFragment implements AdapterView.OnItemSelectedListener, DoubleDatePickerDialog.OnDateSetListener { private static final String TAG = "CallStatsFragment"; - private Spinner mFilterSpinner; - - private int mCallTypeFilter = CallStatsQueryHandler.CALL_TYPE_ALL; + private int mCallTypeFilter = CallLogQueryHandler.CALL_TYPE_ALL; private long mFilterFrom = -1; private long mFilterTo = -1; private boolean mSortByDuration = true; @@ -61,6 +64,13 @@ public class CallStatsFragment extends ListFragment implements private CallStatsAdapter mAdapter; private CallStatsQueryHandler mCallStatsQueryHandler; + // Add and change for filter call stats. + private Spinner mFilterSubSpinnerView; + private Spinner mFilterStatusSpinnerView; + + // Default to all slots. + private int mCallSubFilter = CallStatsQueryHandler.CALL_SUB_ALL; + private TextView mSumHeaderView; private TextView mDateFilterView; @@ -72,6 +82,23 @@ public class CallStatsFragment extends ListFragment implements } }; + private OnItemSelectedListener mSubSelectedListener = new OnItemSelectedListener() { + + @Override + public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { + Log.i(TAG, "Sub selected, position: " + position); + int sub = position - 1; + mCallSubFilter = sub; + mCallStatsQueryHandler.fetchCalls(mFilterFrom, mFilterTo, mCallSubFilter); + } + + @Override + public void onNothingSelected(AdapterView<?> parent) { + // Do nothing. + } + + }; + public static class CallStatsNavAdapter extends ArrayAdapter<String> { private LayoutInflater mMainInflater; private LayoutInflater mDropdownInflater; @@ -123,9 +150,54 @@ public class CallStatsFragment extends ListFragment implements View view = inflater.inflate(R.layout.call_stats_fragment, container, false); mSumHeaderView = (TextView) view.findViewById(R.id.sum_header); mDateFilterView = (TextView) view.findViewById(R.id.date_filter); + mFilterSubSpinnerView = (Spinner) view.findViewById(R.id.filter_sub_spinner); + mFilterStatusSpinnerView = (Spinner) view.findViewById(R.id.filter_status_spinner); + + // Update the filter views. + updateFilterSpinnerViews(); + return view; } + /** + * Initialize the filter views content. + */ + private void updateFilterSpinnerViews() { + if (mFilterSubSpinnerView == null + || mFilterStatusSpinnerView == null) { + Log.w(TAG, "The filter spinner view is null!"); + return; + } + + final TelephonyManager telephony = (TelephonyManager) getActivity().getSystemService( + Context.TELEPHONY_SERVICE); + if (!telephony.isMultiSimEnabled()) { + mFilterSubSpinnerView.setVisibility(View.GONE); + } else { + // Update the sub filter's content. + ArrayAdapter<SpinnerContent> filterSubAdapter = new ArrayAdapter<SpinnerContent>( + this.getActivity(), R.layout.call_log_spinner_item, + SpinnerContent.setupSubFilterContent(getActivity())); + + if (filterSubAdapter.getCount() <= 1) { + mFilterSubSpinnerView.setVisibility(View.GONE); + } else { + mFilterSubSpinnerView.setAdapter(filterSubAdapter); + mFilterSubSpinnerView.setOnItemSelectedListener(mSubSelectedListener); + SpinnerContent.setSpinnerContentValue(mFilterSubSpinnerView, mCallSubFilter); + } + } + + + // Update the status filter's content. + ArrayAdapter<SpinnerContent> filterStatusAdapter = new ArrayAdapter<SpinnerContent>( + this.getActivity(), R.layout.call_log_spinner_item, + SpinnerContent.setupStatusFilterContent(getActivity(), false)); + mFilterStatusSpinnerView.setAdapter(filterStatusAdapter); + mFilterStatusSpinnerView.setOnItemSelectedListener(this); + SpinnerContent.setSpinnerContentValue(mFilterStatusSpinnerView, mCallTypeFilter); + } + @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); @@ -142,19 +214,11 @@ public class CallStatsFragment extends ListFragment implements final MenuItem resetItem = menu.findItem(R.id.reset_date_filter); final MenuItem sortDurationItem = menu.findItem(R.id.sort_by_duration); final MenuItem sortCountItem = menu.findItem(R.id.sort_by_count); - final MenuItem filterItem = menu.findItem(R.id.filter); resetItem.setVisible(mFilterFrom != -1); sortDurationItem.setVisible(!mSortByDuration); sortCountItem.setVisible(mSortByDuration); - mFilterSpinner = (Spinner) filterItem.getActionView(); - CallStatsNavAdapter filterAdapter = new CallStatsNavAdapter(getActivity(), - android.R.layout.simple_list_item_1, - getResources().getStringArray(R.array.call_stats_nav_items)); - mFilterSpinner.setAdapter(filterAdapter); - mFilterSpinner.setOnItemSelectedListener(this); - super.onCreateOptionsMenu(menu, inflater); } @@ -190,7 +254,7 @@ public class CallStatsFragment extends ListFragment implements @Override public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { - mCallTypeFilter = pos; + mCallTypeFilter = ((SpinnerContent)parent.getItemAtPosition(pos)).value; mAdapter.updateDisplayedData(mCallTypeFilter, mSortByDuration); if (mDataLoaded) { updateHeader(); @@ -251,7 +315,7 @@ public class CallStatsFragment extends ListFragment implements } private void fetchCalls() { - mCallStatsQueryHandler.fetchCalls(mFilterFrom, mFilterTo); + mCallStatsQueryHandler.fetchCalls(mFilterFrom, mFilterTo, mCallSubFilter); } private void updateHeader() { diff --git a/src/com/android/dialer/callstats/CallStatsQueryHandler.java b/src/com/android/dialer/callstats/CallStatsQueryHandler.java index f3590554e..9cc02874d 100644 --- a/src/com/android/dialer/callstats/CallStatsQueryHandler.java +++ b/src/com/android/dialer/callstats/CallStatsQueryHandler.java @@ -28,6 +28,7 @@ import android.os.Handler; import android.os.Looper; import android.os.Message; import android.provider.CallLog.Calls; +import android.telephony.SubscriptionManager; import android.util.Log; import com.android.contacts.common.CallUtil; @@ -51,7 +52,10 @@ public class CallStatsQueryHandler extends AsyncQueryHandler { private static final int QUERY_CALLS_TOKEN = 100; - public static final int CALL_TYPE_ALL = 0; + /** + * To specify all slots. + */ + public static final int CALL_SUB_ALL = -1; private static final String TAG = "CallStatsQueryHandler"; @@ -103,7 +107,7 @@ public class CallStatsQueryHandler extends AsyncQueryHandler { mListener = new WeakReference<Listener>(listener); } - public void fetchCalls(long from, long to) { + public void fetchCalls(long from, long to, int slotId) { cancelOperation(QUERY_CALLS_TOKEN); StringBuilder selection = new StringBuilder(); @@ -120,6 +124,16 @@ public class CallStatsQueryHandler extends AsyncQueryHandler { selection.append(String.format("(%s < ?)", Calls.DATE)); selectionArgs.add(String.valueOf(to)); } + if (slotId > CALL_SUB_ALL) { + long[] subId = SubscriptionManager.getSubId(slotId); + if (subId != null && subId.length >= 1) { + if (selection.length() > 0) { + selection.append(" AND "); + } + selection.append(String.format("(%s = ?)", Calls.PHONE_ACCOUNT_ID)); + selectionArgs.add(Long.toString(subId[0])); + } + } startQuery(QUERY_CALLS_TOKEN, null, Calls.CONTENT_URI, CallStatsQuery._PROJECTION, selection.toString(), selectionArgs.toArray(EMPTY_STRING_ARRAY), |