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