summaryrefslogtreecommitdiffstats
path: root/src/com/android
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android')
-rwxr-xr-xsrc/com/android/dialer/calllog/CallLogActivity.java230
-rwxr-xr-xsrc/com/android/dialer/calllog/MSimCallLogFragment.java133
-rw-r--r--src/com/android/dialer/calllog/SpinnerContent.java127
-rw-r--r--src/com/android/dialer/callstats/CallStatsAdapter.java3
-rw-r--r--src/com/android/dialer/callstats/CallStatsDetailHelper.java3
-rw-r--r--src/com/android/dialer/callstats/CallStatsFragment.java90
-rw-r--r--src/com/android/dialer/callstats/CallStatsQueryHandler.java18
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),