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.Fragment;
20import android.app.FragmentManager;
21import android.content.Intent;
22import android.database.Cursor;
23import android.os.Bundle;
24import android.os.Handler;
25import android.provider.CallLog;
26import android.provider.CallLog.Calls;
27import android.support.v13.app.FragmentPagerAdapter;
28import android.support.v4.view.ViewPager;
29import android.view.Menu;
30import android.view.MenuInflater;
31import android.view.MenuItem;
32import android.view.MotionEvent;
33
34import com.android.contacts.common.interactions.TouchPointManager;
35import com.android.contacts.common.list.ViewPagerTabs;
36import com.android.dialer.DialtactsActivity;
37import com.android.dialer.R;
38import com.android.dialer.voicemail.VoicemailStatusHelper;
39import com.android.dialer.voicemail.VoicemailStatusHelperImpl;
40import com.android.dialerbind.analytics.AnalyticsActivity;
41
42public 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