Roll forward cl/172154863: Do not load every DialtactsActivity fragment on app open
With this change we now only load the Favorites and Call Log Fragments when the
app opens.
Paging to the CallLogFragment makes the ContactsFragment load as we would want.
This should result in a faster app start time. I'll need to verify the impact
of this using the same method as http://cl/170422671
I verified the change in behavior by adding my own log line to the onCreate of each Fragment. I saw all of them get created before the change, and only the expected 2 with this change.
This change also fixes flaky test of voicemailTabVisibleNotVisible_volumeStreamCorrect.
Bug: 64541209,65460373,67297718
Test: DialtactsActivityIntegrationTest
PiperOrigin-RevId: 173734472
Change-Id: Ifd4a3064a6fdcffe5a373eaad6ee4aeebdadda1e
diff --git a/java/com/android/dialer/app/calllog/CallLogAdapter.java b/java/com/android/dialer/app/calllog/CallLogAdapter.java
index 5890298..47ef32d 100644
--- a/java/com/android/dialer/app/calllog/CallLogAdapter.java
+++ b/java/com/android/dialer/app/calllog/CallLogAdapter.java
@@ -610,29 +610,31 @@
// Restoring multi selected entries
ArrayList<String> listOfSelectedItems =
savedInstanceState.getStringArrayList(KEY_ACTION_MODE);
- LogUtil.i(
- "CallLogAdapter.onRestoreInstanceState",
- "restored selectedItemsList:%d",
- listOfSelectedItems.size());
-
- if (!listOfSelectedItems.isEmpty()) {
- for (int i = 0; i < listOfSelectedItems.size(); i++) {
- String voicemailUri = listOfSelectedItems.get(i);
- int id = getVoicemailId(voicemailUri);
- LogUtil.i(
- "CallLogAdapter.onRestoreInstanceState",
- "restoring selected index %d, id=%d, uri=%s ",
- i,
- id,
- voicemailUri);
- selectedItems.put(id, voicemailUri);
- }
-
+ if (listOfSelectedItems != null) {
LogUtil.i(
- "CallLogAdapter.onRestoreInstance",
- "restored selectedItems %s",
- selectedItems.toString());
- updateActionBar();
+ "CallLogAdapter.onRestoreInstanceState",
+ "restored selectedItemsList:%d",
+ listOfSelectedItems.size());
+
+ if (!listOfSelectedItems.isEmpty()) {
+ for (int i = 0; i < listOfSelectedItems.size(); i++) {
+ String voicemailUri = listOfSelectedItems.get(i);
+ int id = getVoicemailId(voicemailUri);
+ LogUtil.i(
+ "CallLogAdapter.onRestoreInstanceState",
+ "restoring selected index %d, id=%d, uri=%s ",
+ i,
+ id,
+ voicemailUri);
+ selectedItems.put(id, voicemailUri);
+ }
+
+ LogUtil.i(
+ "CallLogAdapter.onRestoreInstance",
+ "restored selectedItems %s",
+ selectedItems.toString());
+ updateActionBar();
+ }
}
}
}
diff --git a/java/com/android/dialer/app/calllog/CallLogFragment.java b/java/com/android/dialer/app/calllog/CallLogFragment.java
index 5cb0244..5e8da03 100644
--- a/java/com/android/dialer/app/calllog/CallLogFragment.java
+++ b/java/com/android/dialer/app/calllog/CallLogFragment.java
@@ -450,7 +450,9 @@
@Override
public void onDestroy() {
LogUtil.enterBlock("CallLogFragment.onDestroy");
- mAdapter.changeCursor(null);
+ if (mAdapter != null) {
+ mAdapter.changeCursor(null);
+ }
getActivity().getContentResolver().unregisterContentObserver(mCallLogObserver);
getActivity().getContentResolver().unregisterContentObserver(mContactsObserver);
@@ -467,7 +469,9 @@
outState.putBoolean(KEY_HAS_READ_CALL_LOG_PERMISSION, mHasReadCallLogPermission);
outState.putBoolean(KEY_REFRESH_DATA_REQUIRED, mRefreshDataRequired);
outState.putBoolean(KEY_SELECT_ALL_MODE, selectAllMode);
- mAdapter.onSaveInstanceState(outState);
+ if (mAdapter != null) {
+ mAdapter.onSaveInstanceState(outState);
+ }
}
@Override
diff --git a/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java b/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java
index 96d9173..9d8b040 100644
--- a/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java
+++ b/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java
@@ -128,19 +128,23 @@
@Override
public void onDestroy() {
- getActivity()
- .getContentResolver()
- .unregisterContentObserver(mVoicemailErrorManager.getContentObserver());
- mVoicemailPlaybackPresenter.onDestroy();
- mVoicemailErrorManager.onDestroy();
- getActivity().getContentResolver().unregisterContentObserver(mVoicemailStatusObserver);
+ if (isAdded()) {
+ getActivity()
+ .getContentResolver()
+ .unregisterContentObserver(mVoicemailErrorManager.getContentObserver());
+ mVoicemailPlaybackPresenter.onDestroy();
+ mVoicemailErrorManager.onDestroy();
+ getActivity().getContentResolver().unregisterContentObserver(mVoicemailStatusObserver);
+ }
super.onDestroy();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
- mVoicemailPlaybackPresenter.onSaveInstanceState(outState);
+ if (mVoicemailPlaybackPresenter != null) {
+ mVoicemailPlaybackPresenter.onSaveInstanceState(outState);
+ }
}
@Override
diff --git a/java/com/android/dialer/app/list/DialtactsPagerAdapter.java b/java/com/android/dialer/app/list/DialtactsPagerAdapter.java
index 1fbf0f0..484ab0b 100644
--- a/java/com/android/dialer/app/list/DialtactsPagerAdapter.java
+++ b/java/com/android/dialer/app/list/DialtactsPagerAdapter.java
@@ -65,7 +65,7 @@
private ContactsFragment contactsFragment;
private CallLogFragment voicemailFragment;
- public boolean hasActiveVoicemailProvider;
+ private boolean hasActiveVoicemailProvider;
public DialtactsPagerAdapter(
Context context, FragmentManager fm, String[] tabTitles, boolean hasVoicemailProvider) {
diff --git a/java/com/android/dialer/app/list/ListsFragment.java b/java/com/android/dialer/app/list/ListsFragment.java
index 362997a..05c647a 100644
--- a/java/com/android/dialer/app/list/ListsFragment.java
+++ b/java/com/android/dialer/app/list/ListsFragment.java
@@ -203,7 +203,11 @@
mPrefs.getBoolean(
VisualVoicemailEnabledChecker.PREF_KEY_HAS_ACTIVE_VOICEMAIL_PROVIDER, false));
mViewPager.setAdapter(mAdapter);
- mViewPager.setOffscreenPageLimit(DialtactsPagerAdapter.TAB_COUNT_WITH_VOICEMAIL - 1);
+
+ // This is deliberate. See cl/172018946 for the app startup implications of using 1 here
+ // versus loading more fragments upfront.
+ mViewPager.setOffscreenPageLimit(1);
+
mViewPager.addOnPageChangeListener(this);
showTab(DialtactsPagerAdapter.TAB_INDEX_SPEED_DIAL);
diff --git a/java/com/android/dialer/databasepopulator/VoicemailPopulator.java b/java/com/android/dialer/databasepopulator/VoicemailPopulator.java
index e99f7c7..9e0f453 100644
--- a/java/com/android/dialer/databasepopulator/VoicemailPopulator.java
+++ b/java/com/android/dialer/databasepopulator/VoicemailPopulator.java
@@ -19,9 +19,12 @@
import android.content.ComponentName;
import android.content.ContentValues;
import android.content.Context;
+import android.os.Build.VERSION;
+import android.os.Build.VERSION_CODES;
import android.provider.VoicemailContract.Status;
import android.provider.VoicemailContract.Voicemails;
import android.support.annotation.NonNull;
+import android.support.annotation.VisibleForTesting;
import android.support.annotation.WorkerThread;
import android.telecom.PhoneAccountHandle;
import android.telephony.TelephonyManager;
@@ -98,13 +101,16 @@
.delete(Voicemails.buildSourceUri(context.getPackageName()), "", new String[] {});
}
- private static void enableVoicemail(@NonNull Context context) {
+ @VisibleForTesting
+ public static void enableVoicemail(@NonNull Context context) {
PhoneAccountHandle handle =
new PhoneAccountHandle(new ComponentName(context, VoicemailPopulator.class), ACCOUNT_ID);
ContentValues values = new ContentValues();
values.put(Status.SOURCE_PACKAGE, handle.getComponentName().getPackageName());
- values.put(Status.SOURCE_TYPE, TelephonyManager.VVM_TYPE_OMTP);
+ if (VERSION.SDK_INT >= VERSION_CODES.N_MR1) {
+ values.put(Status.SOURCE_TYPE, TelephonyManager.VVM_TYPE_OMTP);
+ }
values.put(Status.PHONE_ACCOUNT_COMPONENT_NAME, handle.getComponentName().flattenToString());
values.put(Status.PHONE_ACCOUNT_ID, handle.getId());
values.put(Status.CONFIGURATION_STATE, Status.CONFIGURATION_STATE_OK);