blob: 364ae6fad41dcdb7e6e8199e8aa66d6f454e6546 [file] [log] [blame]
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.dialer.app.list;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.Context;
import android.support.annotation.IntDef;
import android.support.v13.app.FragmentPagerAdapter;
import android.view.ViewGroup;
import com.android.dialer.app.calllog.CallLogFragment;
import com.android.dialer.app.calllog.VisualVoicemailCallLogFragment;
import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
import com.android.dialer.configprovider.ConfigProviderBindings;
import com.android.dialer.contactsfragment.ContactsFragment;
import com.android.dialer.contactsfragment.ContactsFragment.Header;
import com.android.dialer.database.CallLogQueryHandler;
import com.android.dialer.speeddial.SpeedDialFragment;
import com.android.dialer.util.ViewUtil;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/** ViewPager adapter for {@link com.android.dialer.app.DialtactsActivity}. */
public class DialtactsPagerAdapter extends FragmentPagerAdapter {
/** IntDef for indices of ViewPager tabs. */
@Retention(RetentionPolicy.SOURCE)
@IntDef({TAB_INDEX_SPEED_DIAL, TAB_INDEX_HISTORY, TAB_INDEX_ALL_CONTACTS, TAB_INDEX_VOICEMAIL})
public @interface TabIndex {}
public static final int TAB_INDEX_SPEED_DIAL = 0;
public static final int TAB_INDEX_HISTORY = 1;
public static final int TAB_INDEX_ALL_CONTACTS = 2;
public static final int TAB_INDEX_VOICEMAIL = 3;
public static final int TAB_COUNT_DEFAULT = 3;
public static final int TAB_COUNT_WITH_VOICEMAIL = 4;
private final List<Fragment> fragments = new ArrayList<>();
private final String[] tabTitles;
private final boolean useNewSpeedDialTab;
private OldSpeedDialFragment oldSpeedDialFragment;
private SpeedDialFragment speedDialFragment;
private CallLogFragment callLogFragment;
private ContactsFragment contactsFragment;
private CallLogFragment voicemailFragment;
private boolean hasActiveVoicemailProvider;
public DialtactsPagerAdapter(
Context context, FragmentManager fm, String[] tabTitles, boolean hasVoicemailProvider) {
super(fm);
useNewSpeedDialTab =
ConfigProviderBindings.get(context).getBoolean("enable_new_favorites_tab", false);
this.tabTitles = tabTitles;
hasActiveVoicemailProvider = hasVoicemailProvider;
fragments.addAll(Collections.nCopies(TAB_COUNT_WITH_VOICEMAIL, null));
}
@Override
public long getItemId(int position) {
return getRtlPosition(position);
}
@Override
public Fragment getItem(int position) {
LogUtil.d("ViewPagerAdapter.getItem", "position: %d", position);
switch (getRtlPosition(position)) {
case TAB_INDEX_SPEED_DIAL:
if (useNewSpeedDialTab) {
if (speedDialFragment == null) {
speedDialFragment = SpeedDialFragment.newInstance();
}
return speedDialFragment;
} else {
if (oldSpeedDialFragment == null) {
oldSpeedDialFragment = new OldSpeedDialFragment();
}
return oldSpeedDialFragment;
}
case TAB_INDEX_HISTORY:
if (callLogFragment == null) {
callLogFragment = new CallLogFragment(CallLogQueryHandler.CALL_TYPE_ALL);
}
return callLogFragment;
case TAB_INDEX_ALL_CONTACTS:
if (contactsFragment == null) {
contactsFragment = ContactsFragment.newInstance(Header.ADD_CONTACT);
}
return contactsFragment;
case TAB_INDEX_VOICEMAIL:
if (voicemailFragment == null) {
voicemailFragment = new VisualVoicemailCallLogFragment();
LogUtil.v(
"ViewPagerAdapter.getItem",
"new VisualVoicemailCallLogFragment: %s",
voicemailFragment);
}
return voicemailFragment;
default:
throw Assert.createIllegalStateFailException("No fragment at position " + position);
}
}
@Override
public Fragment instantiateItem(ViewGroup container, int position) {
LogUtil.d("ViewPagerAdapter.instantiateItem", "position: %d", position);
// On rotation the FragmentManager handles rotation. Therefore getItem() isn't called.
// Copy the fragments that the FragmentManager finds so that we can store them in
// instance variables for later.
final Fragment fragment = (Fragment) super.instantiateItem(container, position);
if (fragment instanceof OldSpeedDialFragment) {
oldSpeedDialFragment = (OldSpeedDialFragment) fragment;
} else if (fragment instanceof SpeedDialFragment) {
speedDialFragment = (SpeedDialFragment) fragment;
} else if (fragment instanceof CallLogFragment && position == TAB_INDEX_HISTORY) {
callLogFragment = (CallLogFragment) fragment;
} else if (fragment instanceof ContactsFragment) {
contactsFragment = (ContactsFragment) fragment;
} else if (fragment instanceof CallLogFragment && position == TAB_INDEX_VOICEMAIL) {
voicemailFragment = (CallLogFragment) fragment;
LogUtil.v("ViewPagerAdapter.instantiateItem", voicemailFragment.toString());
}
fragments.set(position, fragment);
return fragment;
}
/**
* When {@link android.support.v4.view.PagerAdapter#notifyDataSetChanged} is called, this method
* is called on all pages to determine whether they need to be recreated. When the voicemail tab
* is removed, the view needs to be recreated by returning POSITION_NONE. If notifyDataSetChanged
* is called for some other reason, the voicemail tab is recreated only if it is active. All other
* tabs do not need to be recreated and POSITION_UNCHANGED is returned.
*/
@Override
public int getItemPosition(Object object) {
return !hasActiveVoicemailProvider && fragments.indexOf(object) == TAB_INDEX_VOICEMAIL
? POSITION_NONE
: POSITION_UNCHANGED;
}
@Override
public int getCount() {
return hasActiveVoicemailProvider ? TAB_COUNT_WITH_VOICEMAIL : TAB_COUNT_DEFAULT;
}
@Override
public CharSequence getPageTitle(@TabIndex int position) {
return tabTitles[position];
}
public int getRtlPosition(int position) {
if (ViewUtil.isRtl()) {
return getCount() - 1 - position;
}
return position;
}
public void removeVoicemailFragment(FragmentManager manager) {
if (voicemailFragment != null) {
manager.beginTransaction().remove(voicemailFragment).commitAllowingStateLoss();
voicemailFragment = null;
}
}
public boolean hasActiveVoicemailProvider() {
return hasActiveVoicemailProvider;
}
public void setHasActiveVoicemailProvider(boolean hasActiveVoicemailProvider) {
this.hasActiveVoicemailProvider = hasActiveVoicemailProvider;
}
}