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