1 /* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.dialer.calllog; 17 18 import android.app.ActionBar; 19 import android.app.Fragment; 20 import android.app.FragmentManager; 21 import android.content.Intent; 22 import android.database.Cursor; 23 import android.os.Bundle; 24 import android.os.Handler; 25 import android.provider.CallLog; 26 import android.provider.CallLog.Calls; 27 import android.support.v13.app.FragmentPagerAdapter; 28 import android.support.v4.view.ViewPager; 29 import android.view.Menu; 30 import android.view.MenuInflater; 31 import android.view.MenuItem; 32 import android.view.MotionEvent; 33 34 import com.android.contacts.common.interactions.TouchPointManager; 35 import com.android.contacts.common.list.ViewPagerTabs; 36 import com.android.dialer.DialtactsActivity; 37 import com.android.dialer.R; 38 import com.android.dialer.voicemail.VoicemailStatusHelper; 39 import com.android.dialer.voicemail.VoicemailStatusHelperImpl; 40 import com.android.dialerbind.analytics.AnalyticsActivity; 41 42 public class CallLogActivity extends AnalyticsActivity implements CallLogQueryHandler.Listener { 43 private Handler mHandler; 44 private ViewPager mViewPager; 45 private ViewPagerTabs mViewPagerTabs; 46 private ViewPagerAdapter mViewPagerAdapter; 47 private CallLogFragment mAllCallsFragment; 48 private CallLogFragment mMissedCallsFragment; 49 private CallLogFragment mVoicemailFragment; 50 private VoicemailStatusHelper mVoicemailStatusHelper; 51 52 private static final int WAIT_FOR_VOICEMAIL_PROVIDER_TIMEOUT_MS = 300; 53 private boolean mSwitchToVoicemailTab; 54 55 private String[] mTabTitles; 56 57 private static final int TAB_INDEX_ALL = 0; 58 private static final int TAB_INDEX_MISSED = 1; 59 private static final int TAB_INDEX_VOICEMAIL = 2; 60 61 private static final int TAB_INDEX_COUNT_DEFAULT = 2; 62 private static final int TAB_INDEX_COUNT_WITH_VOICEMAIL = 3; 63 64 private boolean mHasActiveVoicemailProvider; 65 66 private final Runnable mWaitForVoicemailTimeoutRunnable = new Runnable() { 67 @Override 68 public void run() { 69 mViewPagerTabs.setViewPager(mViewPager); 70 mViewPager.setCurrentItem(TAB_INDEX_ALL); 71 mSwitchToVoicemailTab = false; 72 } 73 }; 74 75 public class ViewPagerAdapter extends FragmentPagerAdapter { 76 public ViewPagerAdapter(FragmentManager fm) { 77 super(fm); 78 } 79 80 @Override 81 public Fragment getItem(int position) { 82 switch (position) { 83 case TAB_INDEX_ALL: 84 mAllCallsFragment = new CallLogFragment(CallLogQueryHandler.CALL_TYPE_ALL); 85 return mAllCallsFragment; 86 case TAB_INDEX_MISSED: 87 mMissedCallsFragment = new CallLogFragment(Calls.MISSED_TYPE); 88 return mMissedCallsFragment; 89 case TAB_INDEX_VOICEMAIL: 90 mVoicemailFragment = new CallLogFragment(Calls.VOICEMAIL_TYPE); 91 return mVoicemailFragment; 92 } 93 throw new IllegalStateException("No fragment at position " + position); 94 } 95 96 @Override 97 public CharSequence getPageTitle(int position) { 98 return mTabTitles[position]; 99 } 100 101 @Override 102 public int getCount() { 103 return mHasActiveVoicemailProvider ? TAB_INDEX_COUNT_WITH_VOICEMAIL : 104 TAB_INDEX_COUNT_DEFAULT; 105 } 106 } 107 108 @Override 109 public boolean dispatchTouchEvent(MotionEvent ev) { 110 if (ev.getAction() == MotionEvent.ACTION_DOWN) { 111 TouchPointManager.getInstance().setPoint((int) ev.getRawX(), (int) ev.getRawY()); 112 } 113 return super.dispatchTouchEvent(ev); 114 } 115 116 @Override 117 protected void onCreate(Bundle savedInstanceState) { 118 super.onCreate(savedInstanceState); 119 120 mHandler = new Handler(); 121 122 setContentView(R.layout.call_log_activity); 123 getWindow().setBackgroundDrawable(null); 124 125 final ActionBar actionBar = getActionBar(); 126 actionBar.setDisplayShowHomeEnabled(true); 127 actionBar.setDisplayHomeAsUpEnabled(true); 128 actionBar.setDisplayShowTitleEnabled(true); 129 actionBar.setElevation(0); 130 131 int startingTab = TAB_INDEX_ALL; 132 final Intent intent = getIntent(); 133 if (intent != null) { 134 final int callType = intent.getIntExtra(CallLog.Calls.EXTRA_CALL_TYPE_FILTER, -1); 135 if (callType == CallLog.Calls.MISSED_TYPE) { 136 startingTab = TAB_INDEX_MISSED; 137 } else if (callType == CallLog.Calls.VOICEMAIL_TYPE) { 138 startingTab = TAB_INDEX_VOICEMAIL; 139 } 140 } 141 142 mTabTitles = new String[TAB_INDEX_COUNT_WITH_VOICEMAIL]; 143 mTabTitles[0] = getString(R.string.call_log_all_title); 144 mTabTitles[1] = getString(R.string.call_log_missed_title); 145 mTabTitles[2] = getString(R.string.call_log_voicemail_title); 146 147 mViewPager = (ViewPager) findViewById(R.id.call_log_pager); 148 149 mViewPagerAdapter = new ViewPagerAdapter(getFragmentManager()); 150 mViewPager.setAdapter(mViewPagerAdapter); 151 mViewPager.setOffscreenPageLimit(2); 152 153 mViewPagerTabs = (ViewPagerTabs) findViewById(R.id.viewpager_header); 154 mViewPager.setOnPageChangeListener(mViewPagerTabs); 155 156 if (startingTab == TAB_INDEX_VOICEMAIL) { 157 // The addition of the voicemail tab is an asynchronous process, so wait till the tab 158 // is added, before attempting to switch to it. If the querying of CP2 for voicemail 159 // providers takes too long, give up and show the first tab instead. 160 mSwitchToVoicemailTab = true; 161 mHandler.postDelayed(mWaitForVoicemailTimeoutRunnable, 162 WAIT_FOR_VOICEMAIL_PROVIDER_TIMEOUT_MS); 163 } else { 164 mViewPagerTabs.setViewPager(mViewPager); 165 mViewPager.setCurrentItem(startingTab); 166 } 167 168 mVoicemailStatusHelper = new VoicemailStatusHelperImpl(); 169 } 170 171 @Override 172 protected void onResume() { 173 super.onResume(); 174 CallLogQueryHandler callLogQueryHandler = 175 new CallLogQueryHandler(this.getContentResolver(), this); 176 callLogQueryHandler.fetchVoicemailStatus(); 177 } 178 179 @Override 180 public boolean onCreateOptionsMenu(Menu menu) { 181 final MenuInflater inflater = getMenuInflater(); 182 inflater.inflate(R.menu.call_log_options, menu); 183 return true; 184 } 185 186 @Override 187 public boolean onPrepareOptionsMenu(Menu menu) { 188 final MenuItem itemDeleteAll = menu.findItem(R.id.delete_all); 189 190 // If onPrepareOptionsMenu is called before fragments loaded. Don't do anything. 191 if (mAllCallsFragment != null && itemDeleteAll != null) { 192 final CallLogAdapter adapter = mAllCallsFragment.getAdapter(); 193 itemDeleteAll.setVisible(adapter != null && !adapter.isEmpty()); 194 } 195 return true; 196 } 197 198 @Override 199 public boolean onOptionsItemSelected(MenuItem item) { 200 switch (item.getItemId()) { 201 case android.R.id.home: 202 final Intent intent = new Intent(this, DialtactsActivity.class); 203 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 204 startActivity(intent); 205 return true; 206 case R.id.delete_all: 207 ClearCallLogDialog.show(getFragmentManager()); 208 return true; 209 } 210 return super.onOptionsItemSelected(item); 211 } 212 213 @Override 214 public void onVoicemailStatusFetched(Cursor statusCursor) { 215 if (this.isFinishing()) { 216 return; 217 } 218 219 mHandler.removeCallbacks(mWaitForVoicemailTimeoutRunnable); 220 // Update mHasActiveVoicemailProvider, which controls the number of tabs displayed. 221 int activeSources = mVoicemailStatusHelper.getNumberActivityVoicemailSources(statusCursor); 222 if (activeSources > 0 != mHasActiveVoicemailProvider) { 223 mHasActiveVoicemailProvider = activeSources > 0; 224 mViewPagerAdapter.notifyDataSetChanged(); 225 mViewPagerTabs.setViewPager(mViewPager); 226 if (mSwitchToVoicemailTab) { 227 mViewPager.setCurrentItem(TAB_INDEX_VOICEMAIL, false); 228 } 229 } else if (mSwitchToVoicemailTab) { 230 // The voicemail tab was requested, but it does not exist because there are no 231 // voicemail sources. Just fallback to the first item instead. 232 mViewPagerTabs.setViewPager(mViewPager); 233 } 234 } 235 236 @Override 237 public boolean onCallsFetched(Cursor statusCursor) { 238 // Return false; did not take ownership of cursor 239 return false; 240 } 241 } 242