summaryrefslogtreecommitdiff
path: root/java/com/android/dialer/main
diff options
context:
space:
mode:
authorTreehugger Robot <treehugger-gerrit@google.com>2018-02-22 22:46:58 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2018-02-22 22:46:58 +0000
commitc6943fd4f2050576dd1688d7f22d9683478e114e (patch)
tree012b1dd73ba554b09be6eee250d9fc1a9311feb2 /java/com/android/dialer/main
parent494552349aefe18dd3dea0dd656d5cd48f813e64 (diff)
parentdde326ea2878112b0e59412cabd2ff98ce51d46e (diff)
Merge changes I099f22b7,Ia014e5e1,I3950071e,I1863a28e,I622b52f4, ...
* changes: Removed item animator in Call Log RecyclerView. NUI bug fixes: handling intents and onActivityResult. Use the vector spam icon in the new call log. Fixed some Dialer theming bugs in NUI. Make MarkDirtyObserver available to all call log data sources & PhoneLookups. Updating PrimaryInfo value class to use AutoValue with builder pattern. When there is no VM support hide the tab in the Old Main Activity Rebuild Call Log on first launch after NUI is enabled Changing the voicemail transcription font size Moved metrics related methods out of LoggingBindings. Record jank metrics in old and new call logs. Fixed some bugs in NUI search. Adding information section to voicemail settings Add Tracfone to Motorola menu, move existing menu to Sprint only Fixed some issues in NUI search bar. Disable VVM for tracfone USA Fix an NPE when ContactInfoHelper tries to retrieve remote directories. Merge searchfragment/remote into searchfragment/directories and renaming things accordingly. Initialize/Update the UI of New{CallLog|Voicemail}Fragment iff the fragment is truly visible. Use a broadcast receiver to refresh the annotated call log. Rename invalid resource folder Fix a few UI issues based around multiselect in new nav. Include the primary callback action in the new call log's bottom sheet. Implement read/write text stream to RttCall. Add configuration for when we show decimal and barcode device id Annotate RTT as @TargetApi(28).
Diffstat (limited to 'java/com/android/dialer/main')
-rw-r--r--java/com/android/dialer/main/MainActivityPeer.java2
-rw-r--r--java/com/android/dialer/main/impl/AndroidManifest.xml2
-rw-r--r--java/com/android/dialer/main/impl/MainActivity.java7
-rw-r--r--java/com/android/dialer/main/impl/MainSearchController.java65
-rw-r--r--java/com/android/dialer/main/impl/NewMainActivityPeer.java3
-rw-r--r--java/com/android/dialer/main/impl/OldMainActivityPeer.java206
-rw-r--r--java/com/android/dialer/main/impl/bottomnav/BottomNavBar.java4
-rw-r--r--java/com/android/dialer/main/impl/res/layout/main_activity.xml4
-rw-r--r--java/com/android/dialer/main/impl/res/values-v27/styles.xml26
-rw-r--r--java/com/android/dialer/main/impl/res/values/styles.xml23
-rw-r--r--java/com/android/dialer/main/impl/toolbar/MainToolbar.java46
-rw-r--r--java/com/android/dialer/main/impl/toolbar/SearchBarListener.java7
-rw-r--r--java/com/android/dialer/main/impl/toolbar/SearchBarView.java16
-rw-r--r--java/com/android/dialer/main/impl/toolbar/res/layout/expanded_search_bar.xml2
-rw-r--r--java/com/android/dialer/main/impl/toolbar/res/layout/toolbar_layout.xml9
-rw-r--r--java/com/android/dialer/main/impl/toolbar/res/values/dimens.xml4
16 files changed, 365 insertions, 61 deletions
diff --git a/java/com/android/dialer/main/MainActivityPeer.java b/java/com/android/dialer/main/MainActivityPeer.java
index c1a328a65..9c5627be8 100644
--- a/java/com/android/dialer/main/MainActivityPeer.java
+++ b/java/com/android/dialer/main/MainActivityPeer.java
@@ -26,6 +26,8 @@ public interface MainActivityPeer {
void onActivityResume();
+ void onUserLeaveHint();
+
void onActivityStop();
void onActivityDestroyed();
diff --git a/java/com/android/dialer/main/impl/AndroidManifest.xml b/java/com/android/dialer/main/impl/AndroidManifest.xml
index 6b7475f97..972c9d929 100644
--- a/java/com/android/dialer/main/impl/AndroidManifest.xml
+++ b/java/com/android/dialer/main/impl/AndroidManifest.xml
@@ -29,7 +29,7 @@
android:launchMode="singleTask"
android:name="com.android.dialer.main.impl.MainActivity"
android:resizeableActivity="true"
- android:theme="@style/NuiMainActivityTheme"
+ android:theme="@style/NuiActivityTheme"
android:windowSoftInputMode="stateAlwaysHidden|adjustNothing">
diff --git a/java/com/android/dialer/main/impl/MainActivity.java b/java/com/android/dialer/main/impl/MainActivity.java
index ac2cb389e..1646becf4 100644
--- a/java/com/android/dialer/main/impl/MainActivity.java
+++ b/java/com/android/dialer/main/impl/MainActivity.java
@@ -82,6 +82,7 @@ public class MainActivity extends TransactionSafeActivity
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
+ setIntent(intent);
activePeer.onNewIntent(intent);
}
@@ -92,6 +93,12 @@ public class MainActivity extends TransactionSafeActivity
}
@Override
+ protected void onUserLeaveHint() {
+ super.onUserLeaveHint();
+ activePeer.onUserLeaveHint();
+ }
+
+ @Override
protected void onStop() {
super.onStop();
activePeer.onActivityStop();
diff --git a/java/com/android/dialer/main/impl/MainSearchController.java b/java/com/android/dialer/main/impl/MainSearchController.java
index 9b734f40c..ccd7a4b49 100644
--- a/java/com/android/dialer/main/impl/MainSearchController.java
+++ b/java/com/android/dialer/main/impl/MainSearchController.java
@@ -68,8 +68,7 @@ import java.util.ArrayList;
public class MainSearchController implements SearchBarListener {
private static final String KEY_IS_FAB_HIDDEN = "is_fab_hidden";
- private static final String KEY_CURRENT_TAB = "current_tab";
- private static final String KEY_BOTTOM_NAV_VISIBILITY = "bottom_nav_visibility";
+ private static final String KEY_TOOLBAR_SHADOW_VISIBILITY = "toolbar_shadow_visibility";
private static final String KEY_IS_TOOLBAR_EXPANDED = "is_toolbar_expanded";
private static final String KEY_IS_TOOLBAR_SLIDE_UP = "is_toolbar_slide_up";
@@ -80,25 +79,30 @@ public class MainSearchController implements SearchBarListener {
private final BottomNavBar bottomNav;
private final FloatingActionButton fab;
private final MainToolbar toolbar;
+ private final View toolbarShadow;
public MainSearchController(
MainActivity mainActivity,
BottomNavBar bottomNav,
FloatingActionButton fab,
- MainToolbar toolbar) {
+ MainToolbar toolbar,
+ View toolbarShadow) {
this.mainActivity = mainActivity;
this.bottomNav = bottomNav;
this.fab = fab;
this.toolbar = toolbar;
+ this.toolbarShadow = toolbarShadow;
}
/** Should be called if we're showing the dialpad because of a new ACTION_DIAL intent. */
- public void showDialpadFromNewIntent(boolean animate) {
- showDialpad(animate, true);
+ public void showDialpadFromNewIntent() {
+ LogUtil.enterBlock("MainSearchController.showDialpadFromNewIntent");
+ showDialpad(/* animate=*/ false, /* fromNewIntent=*/ true);
}
/** Shows the dialpad, hides the FAB and slides the toolbar off screen. */
public void showDialpad(boolean animate) {
+ LogUtil.enterBlock("MainSearchController.showDialpad");
showDialpad(animate, false);
}
@@ -108,17 +112,22 @@ public class MainSearchController implements SearchBarListener {
fab.hide();
toolbar.slideUp(animate);
toolbar.expand(animate, Optional.absent());
+ toolbarShadow.setVisibility(View.VISIBLE);
mainActivity.setTitle(R.string.dialpad_activity_title);
FragmentTransaction transaction = mainActivity.getFragmentManager().beginTransaction();
+ NewSearchFragment searchFragment = getSearchFragment();
// Show Search
- if (getSearchFragment() == null) {
- NewSearchFragment searchFragment = NewSearchFragment.newInstance(false);
+ if (searchFragment == null) {
+ // TODO(a bug): zero suggest results aren't actually shown but this enabled the nearby
+ // places promo to be shown.
+ searchFragment = NewSearchFragment.newInstance(/* showZeroSuggest=*/ true);
transaction.add(R.id.fragment_container, searchFragment, SEARCH_FRAGMENT_TAG);
} else if (!isSearchVisible()) {
- transaction.show(getSearchFragment());
+ transaction.show(searchFragment);
}
+ searchFragment.setQuery("", CallInitiationType.Type.DIALPAD);
// Show Dialpad
if (getDialpadFragment() == null) {
@@ -143,6 +152,7 @@ public class MainSearchController implements SearchBarListener {
* @see {@link #closeSearch(boolean)} to "remove" the dialpad.
*/
private void hideDialpad(boolean animate, boolean bottomNavVisible) {
+ LogUtil.enterBlock("MainSearchController.hideDialpad");
Assert.checkArgument(isDialpadVisible());
fab.show();
@@ -188,6 +198,7 @@ public class MainSearchController implements SearchBarListener {
/** Should be called when {@link DialpadListener#onDialpadShown()} is called. */
public void onDialpadShown() {
+ LogUtil.enterBlock("MainSearchController.onDialpadShown");
getDialpadFragment().slideUp(true);
hideBottomNav();
}
@@ -203,6 +214,7 @@ public class MainSearchController implements SearchBarListener {
* </ol>
*/
public void onSearchListTouch() {
+ LogUtil.enterBlock("MainSearchController.onSearchListTouched");
if (isDialpadVisible()) {
if (TextUtils.isEmpty(getDialpadFragment().getQuery())) {
Logger.get(mainActivity)
@@ -234,13 +246,13 @@ public class MainSearchController implements SearchBarListener {
*/
public boolean onBackPressed() {
if (isDialpadVisible() && !TextUtils.isEmpty(getDialpadFragment().getQuery())) {
- LogUtil.i("MainSearchController#onBackPressed", "Dialpad visible with query");
+ LogUtil.i("MainSearchController.onBackPressed", "Dialpad visible with query");
Logger.get(mainActivity)
.logImpression(DialerImpression.Type.NUI_PRESS_BACK_BUTTON_TO_HIDE_DIALPAD);
hideDialpad(/* animate=*/ true, /* bottomNavVisible=*/ false);
return true;
} else if (isSearchVisible()) {
- LogUtil.i("MainSearchController#onBackPressed", "Search is visible");
+ LogUtil.i("MainSearchController.onBackPressed", "Search is visible");
Logger.get(mainActivity)
.logImpression(
isDialpadVisible()
@@ -258,6 +270,7 @@ public class MainSearchController implements SearchBarListener {
* dialpad.
*/
private void closeSearch(boolean animate) {
+ LogUtil.enterBlock("MainSearchController.closeSearch");
Assert.checkArgument(isSearchVisible());
if (isDialpadVisible()) {
hideDialpad(animate, /* bottomNavVisible=*/ true);
@@ -266,6 +279,7 @@ public class MainSearchController implements SearchBarListener {
}
showBottomNav();
toolbar.collapse(animate);
+ toolbarShadow.setVisibility(View.GONE);
mainActivity.getFragmentManager().beginTransaction().remove(getSearchFragment()).commit();
// Clear the dialpad so the phone number isn't persisted between search sessions.
@@ -311,31 +325,40 @@ public class MainSearchController implements SearchBarListener {
*/
@Override
public void onSearchBarClicked() {
+ LogUtil.enterBlock("MainSearchController.onSearchBarClicked");
Logger.get(mainActivity).logImpression(DialerImpression.Type.NUI_CLICK_SEARCH_BAR);
openSearch(Optional.absent());
}
private void openSearch(Optional<String> query) {
+ LogUtil.enterBlock("MainSearchController.openSearch");
fab.hide();
toolbar.expand(/* animate=*/ true, query);
toolbar.showKeyboard();
+ toolbarShadow.setVisibility(View.VISIBLE);
hideBottomNav();
FragmentTransaction transaction = mainActivity.getFragmentManager().beginTransaction();
+ NewSearchFragment searchFragment = getSearchFragment();
// Show Search
- if (getSearchFragment() == null) {
- NewSearchFragment searchFragment = NewSearchFragment.newInstance(false);
+ if (searchFragment == null) {
+ // TODO(a bug): zero suggest results aren't actually shown but this enabled the nearby
+ // places promo to be shown.
+ searchFragment = NewSearchFragment.newInstance(true);
transaction.add(R.id.fragment_container, searchFragment, SEARCH_FRAGMENT_TAG);
} else if (!isSearchVisible()) {
transaction.show(getSearchFragment());
}
+ searchFragment.setQuery(
+ query.isPresent() ? query.get() : "", CallInitiationType.Type.REGULAR_SEARCH);
transaction.commit();
}
@Override
public void onSearchBackButtonClicked() {
+ LogUtil.enterBlock("MainSearchController.onSearchBackButtonClicked");
closeSearch(true);
}
@@ -380,6 +403,18 @@ public class MainSearchController implements SearchBarListener {
return false;
}
+ @Override
+ public void onUserLeaveHint() {
+ if (isInSearch()) {
+ closeSearch(false);
+ }
+ }
+
+ @Override
+ public void onCallPlacedFromSearch() {
+ closeSearch(false);
+ }
+
public void onVoiceResults(int resultCode, Intent data) {
if (resultCode == AppCompatActivity.RESULT_OK) {
ArrayList<String> matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
@@ -396,15 +431,13 @@ public class MainSearchController implements SearchBarListener {
public void onSaveInstanceState(Bundle bundle) {
bundle.putBoolean(KEY_IS_FAB_HIDDEN, !fab.isShown());
- bundle.putInt(KEY_CURRENT_TAB, bottomNav.getSelectedTab());
- bundle.putInt(KEY_BOTTOM_NAV_VISIBILITY, bottomNav.getVisibility());
+ bundle.putInt(KEY_TOOLBAR_SHADOW_VISIBILITY, toolbarShadow.getVisibility());
bundle.putBoolean(KEY_IS_TOOLBAR_EXPANDED, toolbar.isExpanded());
bundle.putBoolean(KEY_IS_TOOLBAR_SLIDE_UP, toolbar.isSlideUp());
}
public void onRestoreInstanceState(Bundle savedInstanceState) {
- bottomNav.selectTab(savedInstanceState.getInt(KEY_CURRENT_TAB));
- bottomNav.setVisibility(savedInstanceState.getInt(KEY_BOTTOM_NAV_VISIBILITY));
+ toolbarShadow.setVisibility(savedInstanceState.getInt(KEY_TOOLBAR_SHADOW_VISIBILITY));
if (savedInstanceState.getBoolean(KEY_IS_FAB_HIDDEN, false)) {
fab.hide();
}
diff --git a/java/com/android/dialer/main/impl/NewMainActivityPeer.java b/java/com/android/dialer/main/impl/NewMainActivityPeer.java
index ed67df936..6f5c18623 100644
--- a/java/com/android/dialer/main/impl/NewMainActivityPeer.java
+++ b/java/com/android/dialer/main/impl/NewMainActivityPeer.java
@@ -57,6 +57,9 @@ public class NewMainActivityPeer implements MainActivityPeer {
public void onActivityResume() {}
@Override
+ public void onUserLeaveHint() {}
+
+ @Override
public void onActivityStop() {}
@Override
diff --git a/java/com/android/dialer/main/impl/OldMainActivityPeer.java b/java/com/android/dialer/main/impl/OldMainActivityPeer.java
index 07c7185ae..8762f5889 100644
--- a/java/com/android/dialer/main/impl/OldMainActivityPeer.java
+++ b/java/com/android/dialer/main/impl/OldMainActivityPeer.java
@@ -30,16 +30,24 @@ import android.provider.CallLog.Calls;
import android.provider.ContactsContract.QuickContact;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
+import android.support.design.widget.Snackbar;
+import android.support.v4.content.ContextCompat;
+import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.telecom.PhoneAccount;
+import android.telecom.PhoneAccountHandle;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import com.android.contacts.common.list.OnPhoneNumberPickerActionListener;
import com.android.dialer.animation.AnimUtils;
+import com.android.dialer.app.DialtactsActivity;
import com.android.dialer.app.calllog.CallLogAdapter;
import com.android.dialer.app.calllog.CallLogFragment;
import com.android.dialer.app.calllog.CallLogFragment.CallLogFragmentListener;
import com.android.dialer.app.calllog.CallLogNotificationsService;
+import com.android.dialer.app.calllog.IntentProvider;
import com.android.dialer.app.calllog.VisualVoicemailCallLogFragment;
import com.android.dialer.app.list.DragDropController;
import com.android.dialer.app.list.OldSpeedDialFragment;
@@ -47,6 +55,8 @@ import com.android.dialer.app.list.OnDragDropListener;
import com.android.dialer.app.list.OnListFragmentScrolledListener;
import com.android.dialer.app.list.PhoneFavoriteSquareTileView;
import com.android.dialer.app.list.RemoveView;
+import com.android.dialer.callcomposer.CallComposerActivity;
+import com.android.dialer.calldetails.CallDetailsActivity;
import com.android.dialer.callintent.CallIntentBuilder;
import com.android.dialer.callintent.CallSpecificAppData;
import com.android.dialer.common.FragmentUtils.FragmentUtilListener;
@@ -65,6 +75,7 @@ import com.android.dialer.dialpadview.DialpadFragment;
import com.android.dialer.dialpadview.DialpadFragment.DialpadListener;
import com.android.dialer.dialpadview.DialpadFragment.LastOutgoingCallCallback;
import com.android.dialer.dialpadview.DialpadFragment.OnDialpadQueryChangedListener;
+import com.android.dialer.duo.DuoComponent;
import com.android.dialer.interactions.PhoneNumberInteraction;
import com.android.dialer.logging.DialerImpression;
import com.android.dialer.logging.Logger;
@@ -81,6 +92,7 @@ import com.android.dialer.storage.StorageComponent;
import com.android.dialer.telecom.TelecomUtil;
import com.android.dialer.util.DialerUtils;
import com.android.dialer.util.TransactionSafeActivity;
+import com.android.voicemail.VoicemailComponent;
import com.google.common.util.concurrent.ListenableFuture;
import java.util.concurrent.TimeUnit;
@@ -190,13 +202,18 @@ public class OldMainActivityPeer implements MainActivityPeer, FragmentUtilListen
MainBottomNavBarBottomNavTabListener bottomNavTabListener =
new MainBottomNavBarBottomNavTabListener(mainActivity, mainActivity.getFragmentManager());
bottomNav.addOnTabSelectedListener(bottomNavTabListener);
+ // TODO(uabdullah): Handle case of when a sim is inserted/removed while the activity is open.
+ boolean showVoicemailTab = canVoicemailTabBeShown(mainActivity);
+ bottomNav.showVoicemail(showVoicemailTab);
callLogFragmentListener =
new MainCallLogFragmentListener(
mainActivity, mainActivity.getContentResolver(), bottomNav, toolbar);
bottomNav.addOnTabSelectedListener(callLogFragmentListener);
- searchController = getNewMainSearchController(bottomNav, fab, toolbar);
+ searchController =
+ getNewMainSearchController(
+ bottomNav, fab, toolbar, mainActivity.findViewById(R.id.toolbar_shadow));
toolbar.setSearchBarListener(searchController);
onDialpadQueryChangedListener = getNewOnDialpadQueryChangedListener(searchController);
@@ -216,7 +233,7 @@ public class OldMainActivityPeer implements MainActivityPeer, FragmentUtilListen
mainActivity.findViewById(R.id.remove_view),
mainActivity.findViewById(R.id.search_view_container));
- lastTabController = new LastTabController(mainActivity, bottomNav);
+ lastTabController = new LastTabController(mainActivity, bottomNav, showVoicemailTab);
// Restore our view state if needed, else initialize as if the app opened for the first time
if (savedInstanceState != null) {
@@ -224,39 +241,119 @@ public class OldMainActivityPeer implements MainActivityPeer, FragmentUtilListen
searchController.onRestoreInstanceState(savedInstanceState);
bottomNav.selectTab(savedInstanceState.getInt(KEY_CURRENT_TAB));
} else {
- showTabOnIntent(mainActivity.getIntent());
+ onHandleIntent(mainActivity.getIntent());
}
}
+ /**
+ * Check and return whether the voicemail tab should be shown or not. This includes the following
+ * criteria under which we show the voicemail tab:
+ * <li>The voicemail number exists (e.g we are able to dial into listen to voicemail or press and
+ * hold 1)
+ * <li>Visual voicemail is enabled from the settings tab
+ * <li>Visual voicemail carrier is supported by dialer
+ * <li>There is no voicemail carrier app installed.
+ *
+ * @param context
+ * @return return if voicemail tab should be shown or not depending on what the voicemail state is
+ * for the carrier.
+ */
+ private static boolean canVoicemailTabBeShown(Context context) {
+ PhoneAccountHandle defaultUserSelectedAccount =
+ TelecomUtil.getDefaultOutgoingPhoneAccount(context, PhoneAccount.SCHEME_VOICEMAIL);
+
+ if (isVoicemailAvailable(context, defaultUserSelectedAccount)) {
+ return true;
+ }
+ if (VoicemailComponent.get(context)
+ .getVoicemailClient()
+ .isVoicemailEnabled(context, defaultUserSelectedAccount)) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Check if voicemail is enabled/accessible.
+ *
+ * @return true if voicemail is enabled and accessible. Note that this can be false "temporarily"
+ * after the app boot e.g if the sim isn't fully recognized. TODO(uabdullah): Possibly add a
+ * listener of some kind to detect when a sim is recognized. TODO(uabdullah): Move this to a
+ * utility class or wrap it all in a static inner class.
+ */
+ private static boolean isVoicemailAvailable(
+ Context context, PhoneAccountHandle defaultUserSelectedAccount) {
+
+ if (!TelecomUtil.hasReadPhoneStatePermission(context)) {
+ LogUtil.i(
+ "OldMainActivityPeer.isVoicemailAvailable",
+ "No read phone permisison or not the default dialer.");
+ return false;
+ }
+
+ if (defaultUserSelectedAccount == null) {
+ // In a single-SIM phone, there is no default outgoing phone account selected by
+ // the user, so just call TelephonyManager#getVoicemailNumber directly.
+ return !TextUtils.isEmpty(getTelephonyManager(context).getVoiceMailNumber());
+ } else {
+ return !TextUtils.isEmpty(
+ TelecomUtil.getVoicemailNumber(context, defaultUserSelectedAccount));
+ }
+ }
+
+ private static TelephonyManager getTelephonyManager(Context context) {
+ return context.getSystemService(TelephonyManager.class);
+ }
+
@Override
public void onNewIntent(Intent intent) {
LogUtil.enterBlock("OldMainActivityPeer.onNewIntent");
- showTabOnIntent(intent);
+ onHandleIntent(intent);
}
- private void showTabOnIntent(Intent intent) {
- if (isShowTabIntent(intent)) {
+ private void onHandleIntent(Intent intent) {
+ // Some important implementation notes:
+ // 1) If the intent contains extra data to open to a specific screen (e.g. DIAL intent), when
+ // the user leaves that screen, they will return here and add see a blank screen unless we
+ // select a tab here.
+ // 2) Don't return early here in case the intent does contain extra data.
+ // 3) External intents should take priority over other intents (like Calls.CONTENT_TYPE).
+ if (Calls.CONTENT_TYPE.equals(intent.getType())) {
+ Bundle extras = intent.getExtras();
+ if (extras != null && extras.getInt(Calls.EXTRA_CALL_TYPE_FILTER) == Calls.VOICEMAIL_TYPE) {
+ LogUtil.i("OldMainActivityPeer.onHandleIntent", "Voicemail content type intent");
+ bottomNav.selectTab(TabIndex.VOICEMAIL);
+ Logger.get(mainActivity).logImpression(DialerImpression.Type.VVM_NOTIFICATION_CLICKED);
+ } else {
+ LogUtil.i("OldMainActivityPeer.onHandleIntent", "Call log content type intent");
+ bottomNav.selectTab(TabIndex.CALL_LOG);
+ }
+
+ } else if (isShowTabIntent(intent)) {
+ LogUtil.i("OldMainActivityPeer.onHandleIntent", "Show tab intent");
bottomNav.selectTab(getTabFromIntent(intent));
- return;
+ } else if (lastTabController.isEnabled) {
+ LogUtil.i("OldMainActivityPeer.onHandleIntent", "Show last tab");
+ lastTabController.selectLastTab();
+ } else {
+ bottomNav.selectTab(TabIndex.SPEED_DIAL);
}
- if (isDialIntent(intent)) {
- searchController.showDialpadFromNewIntent(false);
+ if (isDialOrAddCallIntent(intent)) {
+ LogUtil.i("OldMainActivityPeer.onHandleIntent", "Dial or add call intent");
// Dialpad will grab the intent and populate the number
- return;
+ searchController.showDialpadFromNewIntent();
}
- if (lastTabController.isEnabled) {
- lastTabController.selectLastTab();
- return;
+ if (intent.getBooleanExtra(DialtactsActivity.EXTRA_CLEAR_NEW_VOICEMAILS, false)) {
+ LogUtil.i("OldMainActivityPeer.onHandleIntent", "clearing all new voicemails");
+ CallLogNotificationsService.markAllNewVoicemailsAsOld(mainActivity);
}
-
- bottomNav.selectTab(TabIndex.SPEED_DIAL);
}
- /** Returns true if the given intent contains a phone number to populate the dialer with */
- private boolean isDialIntent(Intent intent) {
- if (intent == null || intent.getData() == null) {
+ /** Returns true if the given intent is a Dial intent with data or an Add Call intent. */
+ private boolean isDialOrAddCallIntent(Intent intent) {
+ if (intent == null) {
return false;
}
@@ -270,7 +367,7 @@ public class OldMainActivityPeer implements MainActivityPeer, FragmentUtilListen
return true;
}
}
- return false;
+ return DialpadFragment.isAddCallMode(intent);
}
@Override
@@ -284,6 +381,18 @@ public class OldMainActivityPeer implements MainActivityPeer, FragmentUtilListen
.getDatabaseHelper(mainActivity)
.startSmartDialUpdateThread(forceUpdate);
showPostCallPrompt();
+
+ if (searchController.isInSearch()
+ || callLogAdapterOnActionModeStateChangedListener.isActionModeStateEnabled()) {
+ bottomNav.setVisibility(View.GONE);
+ } else {
+ bottomNav.setVisibility(View.VISIBLE);
+ }
+ }
+
+ @Override
+ public void onUserLeaveHint() {
+ searchController.onUserLeaveHint();
}
@Override
@@ -328,6 +437,44 @@ public class OldMainActivityPeer implements MainActivityPeer, FragmentUtilListen
resultCode);
if (requestCode == ActivityRequestCodes.DIALTACTS_VOICE_SEARCH) {
searchController.onVoiceResults(resultCode, data);
+ } else if (requestCode == ActivityRequestCodes.DIALTACTS_CALL_COMPOSER) {
+ if (resultCode == AppCompatActivity.RESULT_FIRST_USER) {
+ LogUtil.i(
+ "OldMainActivityPeer.onActivityResult", "returned from call composer, error occurred");
+ String message =
+ mainActivity.getString(
+ R.string.call_composer_connection_failed,
+ data.getStringExtra(CallComposerActivity.KEY_CONTACT_NAME));
+ Snackbar.make(snackbarContainer, message, Snackbar.LENGTH_LONG).show();
+ } else {
+ LogUtil.i("OldMainActivityPeer.onActivityResult", "returned from call composer, no error");
+ }
+
+ } else if (requestCode == ActivityRequestCodes.DIALTACTS_CALL_DETAILS) {
+ if (resultCode == AppCompatActivity.RESULT_OK
+ && data != null
+ && data.getBooleanExtra(CallDetailsActivity.EXTRA_HAS_ENRICHED_CALL_DATA, false)) {
+ String number = data.getStringExtra(CallDetailsActivity.EXTRA_PHONE_NUMBER);
+ int snackbarDurationMillis = 5_000;
+ Snackbar.make(
+ snackbarContainer,
+ mainActivity.getString(R.string.ec_data_deleted),
+ snackbarDurationMillis)
+ .setAction(
+ R.string.view_conversation,
+ v ->
+ mainActivity.startActivity(
+ IntentProvider.getSendSmsIntentProvider(number).getIntent(mainActivity)))
+ .setActionTextColor(
+ ContextCompat.getColor(mainActivity, R.color.dialer_snackbar_action_text_color))
+ .show();
+ }
+
+ } else if (requestCode == ActivityRequestCodes.DIALTACTS_DUO) {
+ // We just returned from starting Duo for a task. Reload our reachability data since it
+ // may have changed after a user finished activating Duo.
+ DuoComponent.get(mainActivity).getDuo().reloadReachability(mainActivity);
+
} else {
LogUtil.e("OldMainActivityPeer.onActivityResult", "Unknown request code: " + requestCode);
}
@@ -335,6 +482,7 @@ public class OldMainActivityPeer implements MainActivityPeer, FragmentUtilListen
@Override
public boolean onBackPressed() {
+ LogUtil.enterBlock("OldMainActivityPeer.onBackPressed");
if (searchController.onBackPressed()) {
return true;
}
@@ -375,8 +523,11 @@ public class OldMainActivityPeer implements MainActivityPeer, FragmentUtilListen
}
public MainSearchController getNewMainSearchController(
- BottomNavBar bottomNavBar, FloatingActionButton fab, MainToolbar mainToolbar) {
- return new MainSearchController(mainActivity, bottomNavBar, fab, mainToolbar);
+ BottomNavBar bottomNavBar,
+ FloatingActionButton fab,
+ MainToolbar mainToolbar,
+ View toolbarShadow) {
+ return new MainSearchController(mainActivity, bottomNavBar, fab, mainToolbar, toolbarShadow);
}
public MainOnDialpadQueryChangedListener getNewOnDialpadQueryChangedListener(
@@ -448,6 +599,7 @@ public class OldMainActivityPeer implements MainActivityPeer, FragmentUtilListen
@Override
public void onCallPlacedFromDialpad() {
// TODO(calderwoodra): logging
+ searchController.onCallPlacedFromSearch();
}
}
@@ -468,6 +620,7 @@ public class OldMainActivityPeer implements MainActivityPeer, FragmentUtilListen
@Override
public void onCallPlacedFromSearch() {
// TODO(calderwoodra): logging
+ searchController.onCallPlacedFromSearch();
}
}
@@ -482,7 +635,6 @@ public class OldMainActivityPeer implements MainActivityPeer, FragmentUtilListen
}
/** @see CallLogAdapter.OnActionModeStateChangedListener */
- // TODO(calderwoodra): What is the purpose of this listener?
private static final class MainCallLogAdapterOnActionModeStateChangedListener
implements CallLogAdapter.OnActionModeStateChangedListener {
@@ -928,11 +1080,13 @@ public class OldMainActivityPeer implements MainActivityPeer, FragmentUtilListen
private final Context context;
private final BottomNavBar bottomNavBar;
private final boolean isEnabled;
+ private final boolean canShowVoicemailTab;
- LastTabController(Context context, BottomNavBar bottomNavBar) {
+ LastTabController(Context context, BottomNavBar bottomNavBar, boolean canShowVoicemailTab) {
this.context = context;
this.bottomNavBar = bottomNavBar;
isEnabled = ConfigProviderBindings.get(context).getBoolean("last_tab_enabled", false);
+ this.canShowVoicemailTab = canShowVoicemailTab;
}
/** Sets the last tab if the feature is enabled, otherwise defaults to speed dial. */
@@ -944,6 +1098,12 @@ public class OldMainActivityPeer implements MainActivityPeer, FragmentUtilListen
.unencryptedSharedPrefs()
.getInt(KEY_LAST_TAB, TabIndex.SPEED_DIAL);
}
+
+ // If the voicemail tab cannot be shown, default to showing speed dial
+ if (tabIndex == TabIndex.VOICEMAIL && !canShowVoicemailTab) {
+ tabIndex = TabIndex.SPEED_DIAL;
+ }
+
bottomNavBar.selectTab(tabIndex);
}
diff --git a/java/com/android/dialer/main/impl/bottomnav/BottomNavBar.java b/java/com/android/dialer/main/impl/bottomnav/BottomNavBar.java
index 2945e39a9..d9a446f84 100644
--- a/java/com/android/dialer/main/impl/bottomnav/BottomNavBar.java
+++ b/java/com/android/dialer/main/impl/bottomnav/BottomNavBar.java
@@ -123,6 +123,10 @@ public final class BottomNavBar extends LinearLayout {
}
}
+ public void showVoicemail(boolean showTab) {
+ voicemail.setVisibility(showTab ? View.VISIBLE : View.GONE);
+ }
+
public void setNotificationCount(@TabIndex int tab, int count) {
if (tab == TabIndex.SPEED_DIAL) {
speedDial.setNotificationCount(count);
diff --git a/java/com/android/dialer/main/impl/res/layout/main_activity.xml b/java/com/android/dialer/main/impl/res/layout/main_activity.xml
index d8b13a6c2..4f0284126 100644
--- a/java/com/android/dialer/main/impl/res/layout/main_activity.xml
+++ b/java/com/android/dialer/main/impl/res/layout/main_activity.xml
@@ -68,11 +68,13 @@
layout="@layout/toolbar_layout"/>
<ImageView
+ android:id="@+id/toolbar_shadow"
android:layout_width="match_parent"
android:layout_height="2dp"
android:scaleType="fitXY"
android:src="@drawable/search_shadow"
- android:layout_below="@+id/toolbar"/>
+ android:layout_below="@+id/toolbar"
+ android:visibility="gone"/>
<!-- TODO(calderwoodra): investigate what this is for and why we want it. -->
<!-- Host container for the contact tile drag shadow -->
diff --git a/java/com/android/dialer/main/impl/res/values-v27/styles.xml b/java/com/android/dialer/main/impl/res/values-v27/styles.xml
new file mode 100644
index 000000000..c91cba245
--- /dev/null
+++ b/java/com/android/dialer/main/impl/res/values-v27/styles.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 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
+ -->
+<resources>
+
+ <!-- Used on sdk 27 and above -->
+ <style name="NuiActivityTheme" parent="NuiActivityThemeBase">
+ <!-- Used to change the navigation bar color -->
+ <item name="android:windowLightNavigationBar">true</item>
+ <item name="android:navigationBarColor">?android:windowBackground</item>
+ <item name="android:navigationBarDividerColor">#E0E0E0</item>
+ </style>
+</resources> \ No newline at end of file
diff --git a/java/com/android/dialer/main/impl/res/values/styles.xml b/java/com/android/dialer/main/impl/res/values/styles.xml
index 2865f2587..47fdbac93 100644
--- a/java/com/android/dialer/main/impl/res/values/styles.xml
+++ b/java/com/android/dialer/main/impl/res/values/styles.xml
@@ -15,14 +15,35 @@
~ limitations under the License
-->
<resources>
- <style name="NuiMainActivityTheme" parent="Theme.AppCompat.Light.NoActionBar">
+
+ <!-- Activities should use this theme as their style -->
+ <style name="NuiActivityTheme" parent="NuiActivityThemeBase"/>
+
+ <!-- Used as a procy for values-v27/styles.xml -->
+ <style name="NuiActivityThemeBase" parent="Theme.AppCompat.Light.NoActionBar">
+ <!-- App colors -->
<item name="android:colorPrimary">@color/dialtacts_theme_color</item>
<item name="android:colorPrimaryDark">@color/dialer_theme_color_dark</item>
<item name="android:colorAccent">@color/dialer_secondary_color</item>
+ <!-- TODO(calderwoodra): figure out what this is used for, but I think it's for checkboxes -->
+ <item name="android:colorControlActivated">@color/dialer_theme_color</item>
+
+ <!-- Text colors -->
+ <item name="android:textColorPrimary">@color/dialer_primary_text_color</item>
+ <item name="android:textColorSecondary">@color/dialer_secondary_text_color</item>
+ <item name="android:textColorLink">@color/dialer_theme_color</item>
+
+ <!-- Themeing for material buttons and widgets -->
+ <item name="android:colorButtonNormal">@color/dialer_theme_color</item>
+ <item name="android:textAppearanceButton">@style/DialerButtonTextStyle</item>
+
<!-- Theme needed for DialpadFragment -->
<item name="dialpad_style">@style/Dialpad.Light</item>
+ <!-- Custom theme for Alert Dialogs-->
+ <item name="android:alertDialogTheme">@style/AlertDialogTheme</item>
+
<!-- Required for actionmode/multiselect to render properly. -->
<!-- TODO(calderwoodra): Check to see if we can remove this after NewVoicemailFragment launches -->
<item name="actionModeStyle">@style/ActionModeStyle</item>
diff --git a/java/com/android/dialer/main/impl/toolbar/MainToolbar.java b/java/com/android/dialer/main/impl/toolbar/MainToolbar.java
index 604422978..a129fca8b 100644
--- a/java/com/android/dialer/main/impl/toolbar/MainToolbar.java
+++ b/java/com/android/dialer/main/impl/toolbar/MainToolbar.java
@@ -16,13 +16,17 @@
package com.android.dialer.main.impl.toolbar;
+import android.animation.ValueAnimator;
+import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.content.Context;
+import android.support.annotation.StringRes;
import android.support.v7.widget.PopupMenu.OnMenuItemClickListener;
import android.support.v7.widget.Toolbar;
import android.util.AttributeSet;
import android.view.MenuItem;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.ImageButton;
+import android.widget.RelativeLayout;
import com.android.dialer.common.Assert;
import com.android.dialer.util.ViewUtil;
import com.google.common.base.Optional;
@@ -74,22 +78,40 @@ public final class MainToolbar extends Toolbar implements OnMenuItemClickListene
return;
}
isSlideUp = true;
- animate()
- .translationY(-getHeight())
- .setDuration(animate ? SLIDE_DURATION : 0)
- .setInterpolator(SLIDE_INTERPOLATOR)
- .start();
+ ValueAnimator animator = ValueAnimator.ofFloat(0, -getHeight());
+ animator.setDuration(animate ? SLIDE_DURATION : 0);
+ animator.setInterpolator(SLIDE_INTERPOLATOR);
+ animator.addUpdateListener(
+ new AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ int val = ((Float) animation.getAnimatedValue()).intValue();
+ RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) getLayoutParams();
+ params.topMargin = val;
+ requestLayout();
+ }
+ });
+ animator.start();
}
/** Slides the toolbar down and back onto the screen. */
public void slideDown(boolean animate) {
Assert.checkArgument(isSlideUp);
isSlideUp = false;
- animate()
- .translationY(0)
- .setDuration(animate ? SLIDE_DURATION : 0)
- .setInterpolator(SLIDE_INTERPOLATOR)
- .start();
+ ValueAnimator animator = ValueAnimator.ofFloat(-getHeight(), 0);
+ animator.setDuration(animate ? SLIDE_DURATION : 0);
+ animator.setInterpolator(SLIDE_INTERPOLATOR);
+ animator.addUpdateListener(
+ new AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ int val = ((Float) animation.getAnimatedValue()).intValue();
+ RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) getLayoutParams();
+ params.topMargin = val;
+ requestLayout();
+ }
+ });
+ animator.start();
}
/** @see SearchBarView#collapse(boolean) */
@@ -129,4 +151,8 @@ public final class MainToolbar extends Toolbar implements OnMenuItemClickListene
public MainToolbarMenu getOverflowMenu() {
return overflowMenu;
}
+
+ public void setHint(@StringRes int hint) {
+ searchBar.setHint(hint);
+ }
}
diff --git a/java/com/android/dialer/main/impl/toolbar/SearchBarListener.java b/java/com/android/dialer/main/impl/toolbar/SearchBarListener.java
index a074b5131..857c4b9c9 100644
--- a/java/com/android/dialer/main/impl/toolbar/SearchBarListener.java
+++ b/java/com/android/dialer/main/impl/toolbar/SearchBarListener.java
@@ -16,6 +16,7 @@
package com.android.dialer.main.impl.toolbar;
+import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;
/** Useful callback for {@link SearchBarView} listeners. */
@@ -36,6 +37,12 @@ public interface SearchBarListener {
/** Called when a toolbar menu item is clicked. */
boolean onMenuItemClicked(MenuItem menuItem);
+ /** Called when {@link AppCompatActivity#onUserLeaveHint()} is called. */
+ void onUserLeaveHint();
+
+ /** Called when the user places a call from search (regular or dialpad). */
+ void onCallPlacedFromSearch();
+
/** Interface for returning voice results to the search bar. */
interface VoiceSearchResultCallback {
diff --git a/java/com/android/dialer/main/impl/toolbar/SearchBarView.java b/java/com/android/dialer/main/impl/toolbar/SearchBarView.java
index 95929383b..37ffb9778 100644
--- a/java/com/android/dialer/main/impl/toolbar/SearchBarView.java
+++ b/java/com/android/dialer/main/impl/toolbar/SearchBarView.java
@@ -22,6 +22,7 @@ import android.animation.ValueAnimator;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
+import android.support.annotation.StringRes;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
@@ -29,6 +30,7 @@ import android.util.AttributeSet;
import android.view.View;
import android.widget.EditText;
import android.widget.FrameLayout;
+import android.widget.TextView;
import com.android.dialer.animation.AnimUtils;
import com.android.dialer.common.UiUtil;
import com.android.dialer.util.DialerUtils;
@@ -42,14 +44,15 @@ final class SearchBarView extends FrameLayout {
private final float margin;
private final float animationEndHeight;
+ private final float animationStartHeight;
private SearchBarListener listener;
private EditText searchBox;
+ private TextView searchBoxTextView;
// This useful for when the query didn't actually change. We want to avoid making excessive calls
// where we can since IPCs can take a long time on slow networks.
private boolean skipLatestTextChange;
- private int initialHeight;
private boolean isExpanded;
private View searchBoxCollapsed;
private View searchBoxExpanded;
@@ -60,6 +63,8 @@ final class SearchBarView extends FrameLayout {
margin = getContext().getResources().getDimension(R.dimen.search_bar_margin);
animationEndHeight =
getContext().getResources().getDimension(R.dimen.expanded_search_bar_height);
+ animationStartHeight =
+ getContext().getResources().getDimension(R.dimen.collapsed_search_bar_height);
}
@Override
@@ -67,6 +72,7 @@ final class SearchBarView extends FrameLayout {
super.onFinishInflate();
clearButton = findViewById(R.id.search_clear_button);
searchBox = findViewById(R.id.search_view);
+ searchBoxTextView = findViewById(R.id.search_box_start_search);
searchBoxCollapsed = findViewById(R.id.search_box_collapsed);
searchBoxExpanded = findViewById(R.id.search_box_expanded);
@@ -104,7 +110,6 @@ final class SearchBarView extends FrameLayout {
if (isExpanded) {
return;
}
- initialHeight = getHeight();
int duration = animate ? ANIMATION_DURATION : 0;
searchBoxExpanded.setVisibility(VISIBLE);
@@ -177,7 +182,7 @@ final class SearchBarView extends FrameLayout {
params.leftMargin = margin;
params.rightMargin = margin;
searchBoxExpanded.getLayoutParams().height =
- (int) (animationEndHeight - (animationEndHeight - initialHeight) * fraction);
+ (int) (animationEndHeight - (animationEndHeight - animationStartHeight) * fraction);
requestLayout();
}
@@ -207,6 +212,11 @@ final class SearchBarView extends FrameLayout {
UiUtil.openKeyboardFrom(getContext(), searchBox);
}
+ public void setHint(@StringRes int hint) {
+ searchBox.setHint(hint);
+ searchBoxTextView.setText(hint);
+ }
+
/** Handles logic for text changes in the search box. */
private class SearchBoxTextWatcher implements TextWatcher {
diff --git a/java/com/android/dialer/main/impl/toolbar/res/layout/expanded_search_bar.xml b/java/com/android/dialer/main/impl/toolbar/res/layout/expanded_search_bar.xml
index 4e49accae..3bd71b63a 100644
--- a/java/com/android/dialer/main/impl/toolbar/res/layout/expanded_search_bar.xml
+++ b/java/com/android/dialer/main/impl/toolbar/res/layout/expanded_search_bar.xml
@@ -17,7 +17,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/search_box_expanded"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
+ android:layout_height="@dimen/expanded_search_bar_height"
android:visibility="invisible">
<ImageButton
diff --git a/java/com/android/dialer/main/impl/toolbar/res/layout/toolbar_layout.xml b/java/com/android/dialer/main/impl/toolbar/res/layout/toolbar_layout.xml
index 59cc35451..378b20f47 100644
--- a/java/com/android/dialer/main/impl/toolbar/res/layout/toolbar_layout.xml
+++ b/java/com/android/dialer/main/impl/toolbar/res/layout/toolbar_layout.xml
@@ -17,7 +17,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
- android:layout_height="?attr/actionBarSize"
+ android:layout_height="@dimen/expanded_search_bar_height"
android:background="@color/dialer_theme_color"
app:contentInsetStart="0dp"
app:contentInsetEnd="0dp">
@@ -27,6 +27,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/search_bar_margin"
+ android:minHeight="@dimen/collapsed_search_bar_height"
android:background="@drawable/rounded_corner"
android:elevation="4dp">
@@ -58,8 +59,8 @@
android:layout_marginStart="8dp"
android:layout_centerVertical="true"
android:fontFamily="sans-serif"
- android:hint="@string/dialer_hint_find_contact"
- android:textColorHint="@color/dialer_secondary_text_color"
+ android:text="@string/dialer_hint_find_contact"
+ android:textColor="@color/dialer_secondary_text_color"
android:textSize="16dp"/>
<ImageView
@@ -128,4 +129,4 @@
android:textSize="16sp"/>
</LinearLayout>
</com.android.dialer.app.list.RemoveView>
-</com.android.dialer.main.impl.toolbar.MainToolbar> \ No newline at end of file
+</com.android.dialer.main.impl.toolbar.MainToolbar>
diff --git a/java/com/android/dialer/main/impl/toolbar/res/values/dimens.xml b/java/com/android/dialer/main/impl/toolbar/res/values/dimens.xml
index f54f053da..ed6f197fa 100644
--- a/java/com/android/dialer/main/impl/toolbar/res/values/dimens.xml
+++ b/java/com/android/dialer/main/impl/toolbar/res/values/dimens.xml
@@ -16,5 +16,7 @@
-->
<resources>
<dimen name="search_bar_margin">8dp</dimen>
- <dimen name="expanded_search_bar_height">60dp</dimen>
+ <dimen name="collapsed_search_bar_height">48dp</dimen>
+ <!-- collapsed + margin * 2 -->
+ <dimen name="expanded_search_bar_height">64dp</dimen>
</resources> \ No newline at end of file