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.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
     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
     95   protected void onResume() {
     96     mIsResumed = true;
     97     super.onResume();
     98     sendScreenViewForChildFragment(mViewPager.getCurrentItem());
     99   }
    100 
    101   @Override
    102   protected void onPause() {
    103     mIsResumed = false;
    104     super.onPause();
    105   }
    106 
    107   @Override
    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
    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
    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
    144   public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    145     mViewPagerTabs.onPageScrolled(position, positionOffset, positionOffsetPixels);
    146   }
    147 
    148   @Override
    149   public void onPageSelected(int position) {
    150     if (mIsResumed) {
    151       sendScreenViewForChildFragment(position);
    152     }
    153     mViewPagerTabs.onPageSelected(position);
    154   }
    155 
    156   @Override
    157   public void onPageScrollStateChanged(int state) {
    158     mViewPagerTabs.onPageScrollStateChanged(state);
    159   }
    160 
    161   private void sendScreenViewForChildFragment(int position) {
    162     Logger.get(this).logScreenView(ScreenEvent.Type.CALL_LOG_FILTER, this);
    163   }
    164 
    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 
    175     public ViewPagerAdapter(FragmentManager fm) {
    176       super(fm);
    177     }
    178 
    179     @Override
    180     public long getItemId(int position) {
    181       return getRtlPosition(position);
    182     }
    183 
    184     @Override
    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
    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
    211     public CharSequence getPageTitle(int position) {
    212       return mTabTitles[position];
    213     }
    214 
    215     @Override
    216     public int getCount() {
    217       return TAB_INDEX_COUNT;
    218     }
    219   }
    220 }
    221