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.Activity; 20 import android.app.Fragment; 21 import android.app.FragmentManager; 22 import android.content.Intent; 23 import android.database.Cursor; 24 import android.os.Bundle; 25 import android.os.Handler; 26 import android.provider.CallLog; 27 import android.provider.CallLog.Calls; 28 import android.support.v13.app.FragmentPagerAdapter; 29 import android.support.v4.view.ViewPager; 30 import android.view.Menu; 31 import android.view.MenuInflater; 32 import android.view.MenuItem; 33 import android.view.MotionEvent; 34 import android.view.ViewGroup; 35 36 import com.android.contacts.common.interactions.TouchPointManager; 37 import com.android.contacts.common.list.ViewPagerTabs; 38 import com.android.contacts.common.util.PermissionsUtil; 39 import com.android.contacts.commonbind.analytics.AnalyticsUtil; 40 import com.android.dialer.DialtactsActivity; 41 import com.android.dialer.R; 42 import com.android.dialer.voicemail.VoicemailStatusHelper; 43 import com.android.dialer.voicemail.VoicemailStatusHelperImpl; 44 45 public class CallLogActivity extends Activity implements ViewPager.OnPageChangeListener { 46 private ViewPager mViewPager; 47 private ViewPagerTabs mViewPagerTabs; 48 private ViewPagerAdapter mViewPagerAdapter; 49 private CallLogFragment mAllCallsFragment; 50 private CallLogFragment mMissedCallsFragment; 51 52 private String[] mTabTitles; 53 54 private static final int TAB_INDEX_ALL = 0; 55 private static final int TAB_INDEX_MISSED = 1; 56 57 private static final int TAB_INDEX_COUNT = 2; 58 59 private boolean mIsResumed; 60 61 public class ViewPagerAdapter extends FragmentPagerAdapter { 62 public ViewPagerAdapter(FragmentManager fm) { 63 super(fm); 64 } 65 66 @Override 67 public Fragment getItem(int position) { 68 switch (position) { 69 case TAB_INDEX_ALL: 70 return new CallLogFragment(CallLogQueryHandler.CALL_TYPE_ALL); 71 case TAB_INDEX_MISSED: 72 return new CallLogFragment(Calls.MISSED_TYPE); 73 } 74 throw new IllegalStateException("No fragment at position " + position); 75 } 76 77 @Override 78 public Object instantiateItem(ViewGroup container, int position) { 79 final CallLogFragment fragment = 80 (CallLogFragment) super.instantiateItem(container, position); 81 switch (position) { 82 case TAB_INDEX_ALL: 83 mAllCallsFragment = fragment; 84 break; 85 case TAB_INDEX_MISSED: 86 mMissedCallsFragment = fragment; 87 break; 88 } 89 return fragment; 90 } 91 92 @Override 93 public CharSequence getPageTitle(int position) { 94 return mTabTitles[position]; 95 } 96 97 @Override 98 public int getCount() { 99 return TAB_INDEX_COUNT; 100 } 101 } 102 103 @Override 104 public boolean dispatchTouchEvent(MotionEvent ev) { 105 if (ev.getAction() == MotionEvent.ACTION_DOWN) { 106 TouchPointManager.getInstance().setPoint((int) ev.getRawX(), (int) ev.getRawY()); 107 } 108 return super.dispatchTouchEvent(ev); 109 } 110 111 @Override 112 protected void onCreate(Bundle savedInstanceState) { 113 super.onCreate(savedInstanceState); 114 115 setContentView(R.layout.call_log_activity); 116 getWindow().setBackgroundDrawable(null); 117 118 final ActionBar actionBar = getActionBar(); 119 actionBar.setDisplayShowHomeEnabled(true); 120 actionBar.setDisplayHomeAsUpEnabled(true); 121 actionBar.setDisplayShowTitleEnabled(true); 122 actionBar.setElevation(0); 123 124 int startingTab = TAB_INDEX_ALL; 125 final Intent intent = getIntent(); 126 if (intent != null) { 127 final int callType = intent.getIntExtra(CallLog.Calls.EXTRA_CALL_TYPE_FILTER, -1); 128 if (callType == CallLog.Calls.MISSED_TYPE) { 129 startingTab = TAB_INDEX_MISSED; 130 } 131 } 132 133 mTabTitles = new String[TAB_INDEX_COUNT]; 134 mTabTitles[0] = getString(R.string.call_log_all_title); 135 mTabTitles[1] = getString(R.string.call_log_missed_title); 136 137 mViewPager = (ViewPager) findViewById(R.id.call_log_pager); 138 139 mViewPagerAdapter = new ViewPagerAdapter(getFragmentManager()); 140 mViewPager.setAdapter(mViewPagerAdapter); 141 mViewPager.setOffscreenPageLimit(1); 142 mViewPager.setOnPageChangeListener(this); 143 144 mViewPagerTabs = (ViewPagerTabs) findViewById(R.id.viewpager_header); 145 146 mViewPagerTabs.setViewPager(mViewPager); 147 mViewPager.setCurrentItem(startingTab); 148 } 149 150 @Override 151 protected void onResume() { 152 mIsResumed = true; 153 super.onResume(); 154 sendScreenViewForChildFragment(mViewPager.getCurrentItem()); 155 } 156 157 @Override 158 protected void onPause() { 159 mIsResumed = false; 160 super.onPause(); 161 } 162 163 @Override 164 public boolean onCreateOptionsMenu(Menu menu) { 165 final MenuInflater inflater = getMenuInflater(); 166 inflater.inflate(R.menu.call_log_options, menu); 167 return true; 168 } 169 170 @Override 171 public boolean onPrepareOptionsMenu(Menu menu) { 172 final MenuItem itemDeleteAll = menu.findItem(R.id.delete_all); 173 if (mAllCallsFragment != null && itemDeleteAll != null) { 174 // If onPrepareOptionsMenu is called before fragments are loaded, don't do anything. 175 final CallLogAdapter adapter = mAllCallsFragment.getAdapter(); 176 itemDeleteAll.setVisible(adapter != null && !adapter.isEmpty()); 177 } 178 return true; 179 } 180 181 @Override 182 public boolean onOptionsItemSelected(MenuItem item) { 183 switch (item.getItemId()) { 184 case android.R.id.home: 185 final Intent intent = new Intent(this, DialtactsActivity.class); 186 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 187 startActivity(intent); 188 return true; 189 case R.id.delete_all: 190 ClearCallLogDialog.show(getFragmentManager()); 191 return true; 192 } 193 return super.onOptionsItemSelected(item); 194 } 195 196 @Override 197 public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 198 mViewPagerTabs.onPageScrolled(position, positionOffset, positionOffsetPixels); 199 } 200 201 @Override 202 public void onPageSelected(int position) { 203 if (mIsResumed) { 204 sendScreenViewForChildFragment(position); 205 } 206 mViewPagerTabs.onPageSelected(position); 207 } 208 209 @Override 210 public void onPageScrollStateChanged(int state) { 211 mViewPagerTabs.onPageScrollStateChanged(state); 212 } 213 214 private void sendScreenViewForChildFragment(int position) { 215 AnalyticsUtil.sendScreenView(CallLogFragment.class.getSimpleName(), this, 216 getFragmentTagForPosition(position)); 217 } 218 219 /** 220 * Returns the fragment located at the given position in the {@link ViewPagerAdapter}. May 221 * be null if the position is invalid. 222 */ 223 private String getFragmentTagForPosition(int position) { 224 switch (position) { 225 case TAB_INDEX_ALL: 226 return "All"; 227 case TAB_INDEX_MISSED: 228 return "Missed"; 229 } 230 return null; 231 } 232 } 233