summaryrefslogtreecommitdiff
path: root/java/com/android/dialer/app/DialtactsActivity.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/com/android/dialer/app/DialtactsActivity.java')
-rw-r--r--java/com/android/dialer/app/DialtactsActivity.java159
1 files changed, 120 insertions, 39 deletions
diff --git a/java/com/android/dialer/app/DialtactsActivity.java b/java/com/android/dialer/app/DialtactsActivity.java
index 6e2c6be7d..527dbff18 100644
--- a/java/com/android/dialer/app/DialtactsActivity.java
+++ b/java/com/android/dialer/app/DialtactsActivity.java
@@ -71,10 +71,12 @@ import com.android.contacts.common.widget.FloatingActionButtonController;
import com.android.dialer.animation.AnimUtils;
import com.android.dialer.animation.AnimationListenerAdapter;
import com.android.dialer.app.calllog.CallLogActivity;
+import com.android.dialer.app.calllog.CallLogAdapter;
import com.android.dialer.app.calllog.CallLogFragment;
import com.android.dialer.app.calllog.CallLogNotificationsService;
import com.android.dialer.app.dialpad.DialpadFragment;
import com.android.dialer.app.list.DialtactsPagerAdapter;
+import com.android.dialer.app.list.DialtactsPagerAdapter.TabIndex;
import com.android.dialer.app.list.DragDropController;
import com.android.dialer.app.list.ListsFragment;
import com.android.dialer.app.list.OldSpeedDialFragment;
@@ -92,6 +94,7 @@ import com.android.dialer.callintent.CallIntentBuilder;
import com.android.dialer.callintent.CallSpecificAppData;
import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
+import com.android.dialer.configprovider.ConfigProviderBindings;
import com.android.dialer.database.Database;
import com.android.dialer.database.DialerDatabaseHelper;
import com.android.dialer.interactions.PhoneNumberInteraction;
@@ -99,20 +102,24 @@ import com.android.dialer.interactions.PhoneNumberInteraction.InteractionErrorCo
import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.Logger;
import com.android.dialer.logging.ScreenEvent;
+import com.android.dialer.logging.UiAction;
+import com.android.dialer.main.Main;
+import com.android.dialer.main.MainComponent;
import com.android.dialer.p13n.inference.P13nRanking;
import com.android.dialer.p13n.inference.protocol.P13nRanker;
import com.android.dialer.p13n.inference.protocol.P13nRanker.P13nRefreshCompleteListener;
import com.android.dialer.p13n.logging.P13nLogger;
import com.android.dialer.p13n.logging.P13nLogging;
+import com.android.dialer.performancereport.PerformanceReport;
import com.android.dialer.postcall.PostCall;
import com.android.dialer.proguard.UsedByReflection;
+import com.android.dialer.searchfragment.list.NewSearchFragment;
import com.android.dialer.simulator.Simulator;
import com.android.dialer.simulator.SimulatorComponent;
import com.android.dialer.smartdial.SmartDialNameMatcher;
import com.android.dialer.smartdial.SmartDialPrefix;
import com.android.dialer.telecom.TelecomUtil;
import com.android.dialer.util.DialerUtils;
-import com.android.dialer.util.IntentUtil;
import com.android.dialer.util.PermissionsUtil;
import com.android.dialer.util.TouchPointManager;
import com.android.dialer.util.TransactionSafeActivity;
@@ -130,6 +137,7 @@ public class DialtactsActivity extends TransactionSafeActivity
DialpadFragment.OnDialpadQueryChangedListener,
OnListFragmentScrolledListener,
CallLogFragment.HostInterface,
+ CallLogAdapter.OnActionModeStateChangedListener,
DialpadFragment.HostInterface,
OldSpeedDialFragment.HostInterface,
SearchFragment.HostInterface,
@@ -147,6 +155,7 @@ public class DialtactsActivity extends TransactionSafeActivity
private static final String ACTION_SHOW_TAB = "ACTION_SHOW_TAB";
@VisibleForTesting public static final String EXTRA_SHOW_TAB = "EXTRA_SHOW_TAB";
public static final String EXTRA_CLEAR_NEW_VOICEMAILS = "EXTRA_CLEAR_NEW_VOICEMAILS";
+ private static final String KEY_LAST_TAB = "last_tab";
private static final String TAG = "DialtactsActivity";
private static final String KEY_IN_REGULAR_SEARCH_UI = "in_regular_search_ui";
private static final String KEY_IN_DIALPAD_SEARCH_UI = "in_dialpad_search_ui";
@@ -154,6 +163,7 @@ public class DialtactsActivity extends TransactionSafeActivity
private static final String KEY_FIRST_LAUNCH = "first_launch";
private static final String KEY_WAS_CONFIGURATION_CHANGE = "was_configuration_change";
private static final String KEY_IS_DIALPAD_SHOWN = "is_dialpad_shown";
+ private static final String TAG_NEW_SEARCH_FRAGMENT = "new_search";
private static final String TAG_REGULAR_SEARCH_FRAGMENT = "search";
private static final String TAG_SMARTDIAL_SEARCH_FRAGMENT = "smartdial";
private static final String TAG_FAVORITES_FRAGMENT = "favorites";
@@ -162,6 +172,7 @@ public class DialtactsActivity extends TransactionSafeActivity
private static final int ACTIVITY_REQUEST_CODE_VOICE_SEARCH = 1;
public static final int ACTIVITY_REQUEST_CODE_CALL_COMPOSE = 2;
+ public static final int ACTIVITY_REQUEST_CODE_LIGHTBRINGER = 3;
private static final int FAB_SCALE_IN_DELAY_MS = 300;
@@ -180,6 +191,9 @@ public class DialtactsActivity extends TransactionSafeActivity
/** Fragment for searching phone numbers using the dialpad. */
private SmartDialSearchFragment mSmartDialSearchFragment;
+ /** new Fragment for search phone numbers using the keyboard and the dialpad. */
+ private NewSearchFragment mNewSearchFragment;
+
/** Animation that slides in. */
private Animation mSlideIn;
@@ -225,6 +239,9 @@ public class DialtactsActivity extends TransactionSafeActivity
private P13nLogger mP13nLogger;
private P13nRanker mP13nRanker;
+ public boolean isMultiSelectModeEnabled;
+
+ private boolean isLastTabEnabled;
AnimationListenerAdapter mSlideInListener =
new AnimationListenerAdapter() {
@@ -256,12 +273,18 @@ public class DialtactsActivity extends TransactionSafeActivity
// no need to do anything here.
return;
}
+
+ if (count != 0) {
+ PerformanceReport.recordClick(UiAction.Type.TEXT_CHANGE_WITH_INPUT);
+ }
+
if (DEBUG) {
LogUtil.v("DialtactsActivity.onTextChanged", "called with new query: " + newText);
LogUtil.v("DialtactsActivity.onTextChanged", "previous query: " + mSearchQuery);
}
mSearchQuery = newText;
+ // TODO: show p13n when newText is empty.
// Show search fragment only when the query string is changed to non-empty text.
if (!TextUtils.isEmpty(newText)) {
// Call enterSearchUi only if we are switching search modes, or showing a search
@@ -277,6 +300,8 @@ public class DialtactsActivity extends TransactionSafeActivity
mSmartDialSearchFragment.setQueryString(mSearchQuery);
} else if (mRegularSearchFragment != null && mRegularSearchFragment.isVisible()) {
mRegularSearchFragment.setQueryString(mSearchQuery);
+ } else if (mNewSearchFragment != null) {
+ mNewSearchFragment.setQuery(mSearchQuery);
}
}
@@ -289,6 +314,7 @@ public class DialtactsActivity extends TransactionSafeActivity
@Override
public void onClick(View v) {
if (!isInSearchUi()) {
+ PerformanceReport.recordClick(UiAction.Type.OPEN_SEARCH);
mActionBarController.onSearchBoxTapped();
enterSearchUi(
false /* smartDialSearch */, mSearchView.getText().toString(), true /* animate */);
@@ -306,9 +332,13 @@ public class DialtactsActivity extends TransactionSafeActivity
if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
if (TextUtils.isEmpty(mSearchView.getText().toString())) {
// If the search term is empty, close the search UI.
+ PerformanceReport.recordClick(UiAction.Type.CLOSE_SEARCH_WITH_HIDE_BUTTON);
maybeExitSearchUi();
} else {
// If the search term is not empty, show the dialpad fab.
+ if (!mFloatingActionButtonController.isVisible()) {
+ PerformanceReport.recordClick(UiAction.Type.HIDE_KEYBOARD_IN_SEARCH);
+ }
showFabInSearchUi();
}
}
@@ -355,6 +385,7 @@ public class DialtactsActivity extends TransactionSafeActivity
super.onCreate(savedInstanceState);
mFirstLaunch = true;
+ isLastTabEnabled = ConfigProviderBindings.get(this).getBoolean("last_tab_enabled", false);
final Resources resources = getResources();
mActionBarHeight = resources.getDimensionPixelSize(R.dimen.action_bar_height_large);
@@ -480,6 +511,13 @@ public class DialtactsActivity extends TransactionSafeActivity
Trace.beginSection(TAG + " onResume");
super.onResume();
+ // Some calls may not be recorded (eg. from quick contact),
+ // so we should restart recording after these calls. (Recorded call is stopped)
+ PostCall.restartPerformanceRecordingIfARecentCallExist(this);
+ if (!PerformanceReport.isRecording()) {
+ PerformanceReport.startRecording();
+ }
+
mStateSaved = false;
if (mFirstLaunch) {
displayFragment(getIntent());
@@ -542,7 +580,8 @@ public class DialtactsActivity extends TransactionSafeActivity
}
if (getIntent().getBooleanExtra(EXTRA_CLEAR_NEW_VOICEMAILS, false)) {
- CallLogNotificationsService.markNewVoicemailsAsOld(this, null);
+ LogUtil.i("DialtactsActivity.onResume", "clearing all new voicemails");
+ CallLogNotificationsService.markAllNewVoicemailsAsOld(this);
}
}
@@ -593,6 +632,10 @@ public class DialtactsActivity extends TransactionSafeActivity
&& !getSystemService(KeyguardManager.class).isKeyguardLocked()) {
mListsFragment.markMissedCallsAsReadAndRemoveNotifications();
}
+ DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(this)
+ .edit()
+ .putInt(KEY_LAST_TAB, mListsFragment.getCurrentTabIndex())
+ .apply();
}
@Override
@@ -630,6 +673,8 @@ public class DialtactsActivity extends TransactionSafeActivity
} else if (fragment instanceof ListsFragment) {
mListsFragment = (ListsFragment) fragment;
mListsFragment.addOnPageChangeListener(this);
+ } else if (fragment instanceof NewSearchFragment) {
+ mNewSearchFragment = (NewSearchFragment) fragment;
}
if (fragment instanceof SearchFragment) {
final SearchFragment searchFragment = (SearchFragment) fragment;
@@ -664,13 +709,8 @@ public class DialtactsActivity extends TransactionSafeActivity
public void onClick(View view) {
int resId = view.getId();
if (resId == R.id.floating_action_button) {
- if (mListsFragment.getCurrentTabIndex() == DialtactsPagerAdapter.TAB_INDEX_ALL_CONTACTS
- && !mInRegularSearch
- && !mInDialpadSearch) {
- DialerUtils.startActivityWithErrorToast(
- this, IntentUtil.getNewContactIntent(), R.string.add_contact_not_available);
- Logger.get(this).logImpression(DialerImpression.Type.NEW_CONTACT_FAB);
- } else if (!mIsDialpadShown) {
+ if (!mIsDialpadShown) {
+ PerformanceReport.recordClick(UiAction.Type.OPEN_DIALPAD);
mInCallDialpadUp = false;
showDialpadFragment(true);
PostCall.closePrompt();
@@ -700,6 +740,7 @@ public class DialtactsActivity extends TransactionSafeActivity
int resId = item.getItemId();
if (resId == R.id.menu_history) {
+ PerformanceReport.recordClick(UiAction.Type.OPEN_CALL_HISTORY);
final Intent intent = new Intent(this, CallLogActivity.class);
startActivity(intent);
} else if (resId == R.id.menu_clear_frequents) {
@@ -710,6 +751,9 @@ public class DialtactsActivity extends TransactionSafeActivity
handleMenuSettings();
Logger.get(this).logScreenView(ScreenEvent.Type.SETTINGS, this);
return true;
+ } else if (resId == R.id.menu_new_ui_launcher_shortcut) {
+ MainComponent.get(this).getMain().createNewUiLauncherShortcut(this);
+ return true;
}
return false;
}
@@ -785,6 +829,7 @@ public class DialtactsActivity extends TransactionSafeActivity
if (animate) {
mFloatingActionButtonController.scaleOut();
+ maybeEnterSearchUi();
} else {
mFloatingActionButtonController.setVisible(false);
maybeEnterSearchUi();
@@ -1007,6 +1052,16 @@ public class DialtactsActivity extends TransactionSafeActivity
if (showDialpadChooser && !mDialpadFragment.isVisible()) {
mInCallDialpadUp = true;
}
+ } else if (isLastTabEnabled) {
+ @TabIndex
+ int tabIndex =
+ DialerUtils.getDefaultSharedPreferenceForDeviceProtectedStorageContext(this)
+ .getInt(KEY_LAST_TAB, DialtactsPagerAdapter.TAB_INDEX_SPEED_DIAL);
+ // If voicemail tab is saved and its availability changes, we still move to the voicemail tab
+ // but it is quickly removed and shown the contacts tab.
+ if (mListsFragment != null) {
+ mListsFragment.showTab(tabIndex);
+ }
}
}
@@ -1057,7 +1112,11 @@ public class DialtactsActivity extends TransactionSafeActivity
}
final String tag;
- if (smartDialSearch) {
+ boolean useNewSearch =
+ ConfigProviderBindings.get(this).getBoolean("enable_new_search_fragment", false);
+ if (useNewSearch) {
+ tag = TAG_NEW_SEARCH_FRAGMENT;
+ } else if (smartDialSearch) {
tag = TAG_SMARTDIAL_SEARCH_FRAGMENT;
} else {
tag = TAG_REGULAR_SEARCH_FRAGMENT;
@@ -1067,40 +1126,52 @@ public class DialtactsActivity extends TransactionSafeActivity
mFloatingActionButtonController.scaleOut();
- SearchFragment fragment = (SearchFragment) getFragmentManager().findFragmentByTag(tag);
if (animate) {
transaction.setCustomAnimations(android.R.animator.fade_in, 0);
} else {
transaction.setTransition(FragmentTransaction.TRANSIT_NONE);
}
+
+ Fragment fragment = getFragmentManager().findFragmentByTag(tag);
if (fragment == null) {
- if (smartDialSearch) {
+ if (useNewSearch) {
+ fragment = new NewSearchFragment();
+ } else if (smartDialSearch) {
fragment = new SmartDialSearchFragment();
} else {
fragment = Bindings.getLegacy(this).newRegularSearchFragment();
- fragment.setOnTouchListener(
- new View.OnTouchListener() {
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- // Show the FAB when the user touches the lists fragment and the soft
- // keyboard is hidden.
- hideDialpadFragment(true, false);
- showFabInSearchUi();
- v.performClick();
- return false;
- }
- });
+ ((SearchFragment) fragment)
+ .setOnTouchListener(
+ (v, event) -> {
+ // Show the FAB when the user touches the lists fragment and the soft
+ // keyboard is hidden.
+ hideDialpadFragment(true, false);
+ v.performClick();
+ return false;
+ });
}
transaction.add(R.id.dialtacts_frame, fragment, tag);
} else {
+ // TODO: if this is a transition from dialpad to searchbar, animate fragment
+ // down, and vice versa. Perhaps just add a coordinator behavior with the search bar.
transaction.show(fragment);
}
+
// DialtactsActivity will provide the options menu
fragment.setHasOptionsMenu(false);
+
// Will show empty list if P13nRanker is not enabled. Else, re-ranked list by the ranker.
- fragment.setShowEmptyListForNullQuery(mP13nRanker.shouldShowEmptyListForNullQuery());
- if (!smartDialSearch) {
- fragment.setQueryString(query);
+ if (!useNewSearch) {
+ ((SearchFragment) fragment)
+ .setShowEmptyListForNullQuery(mP13nRanker.shouldShowEmptyListForNullQuery());
+ } else {
+ // TODO: add p13n ranker to new search.
+ }
+
+ if (!smartDialSearch && !useNewSearch) {
+ ((SearchFragment) fragment).setQueryString(query);
+ } else if (useNewSearch) {
+ ((NewSearchFragment) fragment).setQuery(query);
}
transaction.commit();
@@ -1146,6 +1217,9 @@ public class DialtactsActivity extends TransactionSafeActivity
if (mRegularSearchFragment != null) {
transaction.remove(mRegularSearchFragment);
}
+ if (mNewSearchFragment != null) {
+ transaction.remove(mNewSearchFragment);
+ }
transaction.commit();
Assert.isNotNull(mListsFragment.getView()).animate().alpha(1).withLayer();
@@ -1163,6 +1237,8 @@ public class DialtactsActivity extends TransactionSafeActivity
@Override
public void onBackPressed() {
+ PerformanceReport.recordClick(UiAction.Type.PRESS_ANDROID_BACK_BUTTON);
+
if (mStateSaved) {
return;
}
@@ -1247,6 +1323,7 @@ public class DialtactsActivity extends TransactionSafeActivity
if (mInDialpadSearch
&& mSmartDialSearchFragment != null
&& !mSmartDialSearchFragment.isShowingPermissionRequest()) {
+ PerformanceReport.recordClick(UiAction.Type.CLOSE_DIALPAD);
hideDialpadFragment(true /* animate */, true /* clearDialpad */);
return true;
}
@@ -1255,6 +1332,7 @@ public class DialtactsActivity extends TransactionSafeActivity
@Override
public void onListFragmentScrollStateChange(int scrollState) {
+ PerformanceReport.recordScrollStateChange(scrollState);
if (scrollState == OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
hideDialpadFragment(true, false);
DialerUtils.hideInputMethod(mParentLayout);
@@ -1381,18 +1459,6 @@ public class DialtactsActivity extends TransactionSafeActivity
int tabIndex = mListsFragment.getCurrentTabIndex();
mPreviouslySelectedTabIndex = tabIndex;
mFloatingActionButtonController.setVisible(true);
- if (tabIndex == DialtactsPagerAdapter.TAB_INDEX_ALL_CONTACTS
- && !mInRegularSearch
- && !mInDialpadSearch) {
- mFloatingActionButtonController.changeIcon(
- getResources().getDrawable(R.drawable.quantum_ic_person_add_white_24, null),
- getResources().getString(R.string.search_shortcut_create_new_contact));
- } else {
- mFloatingActionButtonController.changeIcon(
- getResources().getDrawable(R.drawable.quantum_ic_dialpad_white_24, null),
- getResources().getString(R.string.action_menu_dialpad_button));
- }
-
timeTabSelected = SystemClock.elapsedRealtime();
}
@@ -1477,6 +1543,17 @@ public class DialtactsActivity extends TransactionSafeActivity
Arrays.toString(grantResults)));
}
+ @Override
+ public void onActionModeStateChanged(boolean isEnabled) {
+ isMultiSelectModeEnabled = isEnabled;
+ }
+
+ @Override
+ public boolean isActionModeStateEnabled() {
+ return isMultiSelectModeEnabled;
+ }
+
+ /** Popup menu accessible from the search bar */
protected class OptionsPopupMenu extends PopupMenu {
public OptionsPopupMenu(Context context, View anchor) {
@@ -1505,6 +1582,10 @@ public class DialtactsActivity extends TransactionSafeActivity
simulatorMenuItem.setVisible(false);
}
+ Main dialtacts = MainComponent.get(context).getMain();
+ menu.findItem(R.id.menu_new_ui_launcher_shortcut)
+ .setVisible(dialtacts.isNewUiEnabled(context));
+
super.show();
}
}