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