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