Home | History | Annotate | Download | only in calllog
      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