From 54bad9a608455c39cf524e8d414c2ca4c903973a Mon Sep 17 00:00:00 2001 From: twyen Date: Fri, 1 Sep 2017 11:24:02 -0700 Subject: Ignore invalid action for LegacyVociemailNotificationReceiver Somehow a null action will be sent to the receiver. Bug: 64934925 Test: LegacyVoicemailNotificationReceiveverTest PiperOrigin-RevId: 167300542 Change-Id: Ifa001d102d265e1dad42806b48f0a1710d05b195 --- .../dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'java/com/android') diff --git a/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java b/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java index d681df205..4e43704f1 100644 --- a/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java +++ b/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java @@ -55,6 +55,12 @@ public class LegacyVoicemailNotificationReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { + + if (!TelephonyManager.ACTION_SHOW_VOICEMAIL_NOTIFICATION.equals(intent.getAction()) + && !VoicemailClient.ACTION_SHOW_LEGACY_VOICEMAIL.equals(intent.getAction())) { + return; + } + LogUtil.i( "LegacyVoicemailNotificationReceiver.onReceive", "received legacy voicemail notification"); if (!BuildCompat.isAtLeastO()) { -- cgit v1.2.3 From b87a0dd2443df8b487232d310c889dc2ff2a47c5 Mon Sep 17 00:00:00 2001 From: calderwoodra Date: Fri, 1 Sep 2017 12:38:22 -0700 Subject: Removes the unused dialer/app/filterednumber package. Test: manual PiperOrigin-RevId: 167310802 Change-Id: Ie27a1b2f4daf73133edfb9de7f4e4aff1d87b6c8 --- java/com/android/dialer/app/AndroidManifest.xml | 12 - .../app/filterednumber/BlockedNumbersAdapter.java | 95 -------- .../app/filterednumber/BlockedNumbersFragment.java | 271 --------------------- .../BlockedNumbersSettingsActivity.java | 141 ----------- .../dialer/app/filterednumber/NumbersAdapter.java | 139 ----------- .../filterednumber/ViewNumbersToImportAdapter.java | 56 ----- .../ViewNumbersToImportFragment.java | 130 ---------- .../dialer/app/list/BlockedListSearchFragment.java | 247 ------------------- 8 files changed, 1091 deletions(-) delete mode 100644 java/com/android/dialer/app/filterednumber/BlockedNumbersAdapter.java delete mode 100644 java/com/android/dialer/app/filterednumber/BlockedNumbersFragment.java delete mode 100644 java/com/android/dialer/app/filterednumber/BlockedNumbersSettingsActivity.java delete mode 100644 java/com/android/dialer/app/filterednumber/NumbersAdapter.java delete mode 100644 java/com/android/dialer/app/filterednumber/ViewNumbersToImportAdapter.java delete mode 100644 java/com/android/dialer/app/filterednumber/ViewNumbersToImportFragment.java delete mode 100644 java/com/android/dialer/app/list/BlockedListSearchFragment.java (limited to 'java/com/android') diff --git a/java/com/android/dialer/app/AndroidManifest.xml b/java/com/android/dialer/app/AndroidManifest.xml index 4200082a6..1c04b764c 100644 --- a/java/com/android/dialer/app/AndroidManifest.xml +++ b/java/com/android/dialer/app/AndroidManifest.xml @@ -60,18 +60,6 @@ - - - - - - - , - View.OnClickListener, - VisualVoicemailEnabledChecker.Callback { - - private static final char ADD_BLOCKED_NUMBER_ICON_LETTER = '+'; - protected View migratePromoView; - private BlockedNumbersMigrator blockedNumbersMigratorForTest; - private TextView blockedNumbersText; - private TextView footerText; - private BlockedNumbersAdapter mAdapter; - private VisualVoicemailEnabledChecker mVoicemailEnabledChecker; - private View mImportSettings; - private View mBlockedNumbersDisabledForEmergency; - private View mBlockedNumberListDivider; - - @Override - public Context getContext() { - return getActivity(); - } - - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - - LayoutInflater inflater = - (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); - getListView().addHeaderView(inflater.inflate(R.layout.blocked_number_header, null)); - getListView().addFooterView(inflater.inflate(R.layout.blocked_number_footer, null)); - //replace the icon for add number with LetterTileDrawable(), so it will have identical style - ImageView addNumberIcon = (ImageView) getActivity().findViewById(R.id.add_number_icon); - LetterTileDrawable drawable = new LetterTileDrawable(getResources()); - drawable.setLetter(ADD_BLOCKED_NUMBER_ICON_LETTER); - drawable.setColor( - ActivityCompat.getColor(getActivity(), R.color.add_blocked_number_icon_color)); - drawable.setIsCircular(true); - addNumberIcon.setImageDrawable(drawable); - - if (mAdapter == null) { - mAdapter = - BlockedNumbersAdapter.newBlockedNumbersAdapter( - getContext(), getActivity().getFragmentManager()); - } - setListAdapter(mAdapter); - - blockedNumbersText = (TextView) getListView().findViewById(R.id.blocked_number_text_view); - migratePromoView = getListView().findViewById(R.id.migrate_promo); - getListView().findViewById(R.id.migrate_promo_allow_button).setOnClickListener(this); - mImportSettings = getListView().findViewById(R.id.import_settings); - mBlockedNumbersDisabledForEmergency = - getListView().findViewById(R.id.blocked_numbers_disabled_for_emergency); - mBlockedNumberListDivider = getActivity().findViewById(R.id.blocked_number_list_divider); - getListView().findViewById(R.id.import_button).setOnClickListener(this); - getListView().findViewById(R.id.view_numbers_button).setOnClickListener(this); - getListView().findViewById(R.id.add_number_linear_layout).setOnClickListener(this); - - footerText = (TextView) getActivity().findViewById(R.id.blocked_number_footer_textview); - mVoicemailEnabledChecker = new VisualVoicemailEnabledChecker(getContext(), this); - mVoicemailEnabledChecker.asyncUpdate(); - updateActiveVoicemailProvider(); - } - - @Override - public void onDestroy() { - setListAdapter(null); - super.onDestroy(); - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - getLoaderManager().initLoader(0, null, this); - } - - @Override - public void onResume() { - super.onResume(); - - ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); - ColorDrawable backgroundDrawable = - new ColorDrawable(ActivityCompat.getColor(getActivity(), R.color.dialer_theme_color)); - actionBar.setBackgroundDrawable(backgroundDrawable); - actionBar.setDisplayShowCustomEnabled(false); - actionBar.setDisplayHomeAsUpEnabled(true); - actionBar.setDisplayShowHomeEnabled(true); - actionBar.setDisplayShowTitleEnabled(true); - actionBar.setTitle(R.string.manage_blocked_numbers_label); - - // If the device can use the framework blocking solution, users should not be able to add - // new blocked numbers from the Blocked Management UI. They will be shown a promo card - // asking them to migrate to new blocking instead. - if (FilteredNumberCompat.canUseNewFiltering()) { - migratePromoView.setVisibility(View.VISIBLE); - blockedNumbersText.setVisibility(View.GONE); - getListView().findViewById(R.id.add_number_linear_layout).setVisibility(View.GONE); - getListView().findViewById(R.id.add_number_linear_layout).setOnClickListener(null); - mBlockedNumberListDivider.setVisibility(View.GONE); - mImportSettings.setVisibility(View.GONE); - getListView().findViewById(R.id.import_button).setOnClickListener(null); - getListView().findViewById(R.id.view_numbers_button).setOnClickListener(null); - mBlockedNumbersDisabledForEmergency.setVisibility(View.GONE); - footerText.setVisibility(View.GONE); - } else { - FilteredNumbersUtil.checkForSendToVoicemailContact( - getActivity(), - new CheckForSendToVoicemailContactListener() { - @Override - public void onComplete(boolean hasSendToVoicemailContact) { - final int visibility = hasSendToVoicemailContact ? View.VISIBLE : View.GONE; - mImportSettings.setVisibility(visibility); - } - }); - } - - // All views except migrate and the block list are hidden when new filtering is available - if (!FilteredNumberCompat.canUseNewFiltering() - && FilteredNumbersUtil.hasRecentEmergencyCall(getContext())) { - mBlockedNumbersDisabledForEmergency.setVisibility(View.VISIBLE); - } else { - mBlockedNumbersDisabledForEmergency.setVisibility(View.GONE); - } - - mVoicemailEnabledChecker.asyncUpdate(); - } - - @Override - public View onCreateView( - LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - return inflater.inflate(R.layout.blocked_number_fragment, container, false); - } - - @Override - public Loader onCreateLoader(int id, Bundle args) { - final String[] projection = { - FilteredNumberContract.FilteredNumberColumns._ID, - FilteredNumberContract.FilteredNumberColumns.COUNTRY_ISO, - FilteredNumberContract.FilteredNumberColumns.NUMBER, - FilteredNumberContract.FilteredNumberColumns.NORMALIZED_NUMBER - }; - final String selection = - FilteredNumberContract.FilteredNumberColumns.TYPE - + "=" - + FilteredNumberContract.FilteredNumberTypes.BLOCKED_NUMBER; - return new CursorLoader( - getContext(), - FilteredNumberContract.FilteredNumber.CONTENT_URI, - projection, - selection, - null, - null); - } - - @Override - public void onLoadFinished(Loader loader, Cursor data) { - mAdapter.swapCursor(data); - if (FilteredNumberCompat.canUseNewFiltering() || data.getCount() == 0) { - mBlockedNumberListDivider.setVisibility(View.INVISIBLE); - } else { - mBlockedNumberListDivider.setVisibility(View.VISIBLE); - } - } - - @Override - public void onLoaderReset(Loader loader) { - mAdapter.swapCursor(null); - } - - @Override - public void onClick(final View view) { - final BlockedNumbersSettingsActivity activity = (BlockedNumbersSettingsActivity) getActivity(); - if (activity == null) { - return; - } - - int resId = view.getId(); - if (resId == R.id.add_number_linear_layout) { - activity.showSearchUi(); - } else if (resId == R.id.view_numbers_button) { - activity.showNumbersToImportPreviewUi(); - } else if (resId == R.id.import_button) { - FilteredNumbersUtil.importSendToVoicemailContacts( - activity, - new ImportSendToVoicemailContactsListener() { - @Override - public void onImportComplete() { - mImportSettings.setVisibility(View.GONE); - } - }); - } else if (resId == R.id.migrate_promo_allow_button) { - view.setEnabled(false); - (blockedNumbersMigratorForTest != null - ? blockedNumbersMigratorForTest - : new BlockedNumbersMigrator(getContext())) - .migrate( - new Listener() { - @Override - public void onComplete() { - getContext() - .startActivity( - FilteredNumberCompat.createManageBlockedNumbersIntent(getContext())); - // Remove this activity from the backstack - activity.finish(); - } - }); - } - } - - @Override - public void onVisualVoicemailEnabledStatusChanged(boolean newStatus) { - updateActiveVoicemailProvider(); - } - - private void updateActiveVoicemailProvider() { - if (getActivity() == null || getActivity().isFinishing()) { - return; - } - if (mVoicemailEnabledChecker.isVisualVoicemailEnabled()) { - footerText.setText(R.string.block_number_footer_message_vvm); - } else { - footerText.setText(R.string.block_number_footer_message_no_vvm); - } - } - - void setBlockedNumbersMigratorForTest(BlockedNumbersMigrator blockedNumbersMigrator) { - blockedNumbersMigratorForTest = blockedNumbersMigrator; - } -} diff --git a/java/com/android/dialer/app/filterednumber/BlockedNumbersSettingsActivity.java b/java/com/android/dialer/app/filterednumber/BlockedNumbersSettingsActivity.java deleted file mode 100644 index 9310fcb22..000000000 --- a/java/com/android/dialer/app/filterednumber/BlockedNumbersSettingsActivity.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (C) 2015 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.filterednumber; - -import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; -import android.view.MenuItem; -import com.android.dialer.app.R; -import com.android.dialer.app.list.BlockedListSearchFragment; -import com.android.dialer.app.list.SearchFragment; -import com.android.dialer.logging.Logger; -import com.android.dialer.logging.ScreenEvent; - -public class BlockedNumbersSettingsActivity extends AppCompatActivity - implements SearchFragment.HostInterface { - - private static final String TAG_BLOCKED_MANAGEMENT_FRAGMENT = "blocked_management"; - private static final String TAG_BLOCKED_SEARCH_FRAGMENT = "blocked_search"; - private static final String TAG_VIEW_NUMBERS_TO_IMPORT_FRAGMENT = "view_numbers_to_import"; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.blocked_numbers_activity); - - // If savedInstanceState != null, the Activity will automatically restore the last fragment. - if (savedInstanceState == null) { - showManagementUi(); - } - } - - /** Shows fragment with the list of currently blocked numbers and settings related to blocking. */ - public void showManagementUi() { - BlockedNumbersFragment fragment = - (BlockedNumbersFragment) - getFragmentManager().findFragmentByTag(TAG_BLOCKED_MANAGEMENT_FRAGMENT); - if (fragment == null) { - fragment = new BlockedNumbersFragment(); - } - - getFragmentManager() - .beginTransaction() - .replace(R.id.blocked_numbers_activity_container, fragment, TAG_BLOCKED_MANAGEMENT_FRAGMENT) - .commit(); - - Logger.get(this).logScreenView(ScreenEvent.Type.BLOCKED_NUMBER_MANAGEMENT, this); - } - - /** Shows fragment with search UI for browsing/finding numbers to block. */ - public void showSearchUi() { - BlockedListSearchFragment fragment = - (BlockedListSearchFragment) - getFragmentManager().findFragmentByTag(TAG_BLOCKED_SEARCH_FRAGMENT); - if (fragment == null) { - fragment = new BlockedListSearchFragment(); - fragment.setHasOptionsMenu(false); - fragment.setShowEmptyListForNullQuery(true); - fragment.setDirectorySearchEnabled(false); - } - - getFragmentManager() - .beginTransaction() - .replace(R.id.blocked_numbers_activity_container, fragment, TAG_BLOCKED_SEARCH_FRAGMENT) - .addToBackStack(null) - .commit(); - - Logger.get(this).logScreenView(ScreenEvent.Type.BLOCKED_NUMBER_ADD_NUMBER, this); - } - - /** - * Shows fragment with UI to preview the numbers of contacts currently marked as send-to-voicemail - * in Contacts. These numbers can be imported into Dialer's blocked number list. - */ - public void showNumbersToImportPreviewUi() { - ViewNumbersToImportFragment fragment = - (ViewNumbersToImportFragment) - getFragmentManager().findFragmentByTag(TAG_VIEW_NUMBERS_TO_IMPORT_FRAGMENT); - if (fragment == null) { - fragment = new ViewNumbersToImportFragment(); - } - - getFragmentManager() - .beginTransaction() - .replace( - R.id.blocked_numbers_activity_container, fragment, TAG_VIEW_NUMBERS_TO_IMPORT_FRAGMENT) - .addToBackStack(null) - .commit(); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() == android.R.id.home) { - onBackPressed(); - return true; - } - return false; - } - - @Override - public void onBackPressed() { - // TODO: Achieve back navigation without overriding onBackPressed. - if (getFragmentManager().getBackStackEntryCount() > 0) { - getFragmentManager().popBackStack(); - } else { - super.onBackPressed(); - } - } - - @Override - public boolean isActionBarShowing() { - return false; - } - - @Override - public boolean isDialpadShown() { - return false; - } - - @Override - public int getDialpadHeight() { - return 0; - } - - @Override - public int getActionBarHeight() { - return 0; - } -} diff --git a/java/com/android/dialer/app/filterednumber/NumbersAdapter.java b/java/com/android/dialer/app/filterednumber/NumbersAdapter.java deleted file mode 100644 index 6e1d1a5a6..000000000 --- a/java/com/android/dialer/app/filterednumber/NumbersAdapter.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (C) 2015 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.filterednumber; - -import android.app.FragmentManager; -import android.content.Context; -import android.provider.ContactsContract; -import android.provider.ContactsContract.CommonDataKinds.Phone; -import android.text.BidiFormatter; -import android.text.TextDirectionHeuristics; -import android.text.TextUtils; -import android.view.View; -import android.widget.QuickContactBadge; -import android.widget.SimpleCursorAdapter; -import android.widget.TextView; -import com.android.dialer.app.R; -import com.android.dialer.compat.CompatUtils; -import com.android.dialer.contactphoto.ContactPhotoManager; -import com.android.dialer.contactphoto.ContactPhotoManager.DefaultImageRequest; -import com.android.dialer.lettertile.LetterTileDrawable; -import com.android.dialer.phonenumbercache.ContactInfo; -import com.android.dialer.phonenumbercache.ContactInfoHelper; -import com.android.dialer.phonenumberutil.PhoneNumberHelper; -import com.android.dialer.util.UriUtils; - -public class NumbersAdapter extends SimpleCursorAdapter { - - private Context mContext; - private FragmentManager mFragmentManager; - private ContactInfoHelper mContactInfoHelper; - private BidiFormatter mBidiFormatter = BidiFormatter.getInstance(); - private ContactPhotoManager mContactPhotoManager; - - public NumbersAdapter( - Context context, - FragmentManager fragmentManager, - ContactInfoHelper contactInfoHelper, - ContactPhotoManager contactPhotoManager) { - super(context, R.layout.blocked_number_item, null, new String[] {}, new int[] {}, 0); - mContext = context; - mFragmentManager = fragmentManager; - mContactInfoHelper = contactInfoHelper; - mContactPhotoManager = contactPhotoManager; - } - - public void updateView(View view, String number, String countryIso) { - final TextView callerName = (TextView) view.findViewById(R.id.caller_name); - final TextView callerNumber = (TextView) view.findViewById(R.id.caller_number); - final QuickContactBadge quickContactBadge = - (QuickContactBadge) view.findViewById(R.id.quick_contact_photo); - quickContactBadge.setOverlay(null); - if (CompatUtils.hasPrioritizedMimeType()) { - quickContactBadge.setPrioritizedMimeType(Phone.CONTENT_ITEM_TYPE); - } - - ContactInfo info = mContactInfoHelper.lookupNumber(number, countryIso); - if (info == null) { - info = new ContactInfo(); - info.number = number; - } - final CharSequence locationOrType = getNumberTypeOrLocation(info); - final String displayNumber = getDisplayNumber(info); - final String displayNumberStr = - mBidiFormatter.unicodeWrap(displayNumber, TextDirectionHeuristics.LTR); - - String nameForDefaultImage; - if (!TextUtils.isEmpty(info.name)) { - nameForDefaultImage = info.name; - callerName.setText(info.name); - callerNumber.setText(locationOrType + " " + displayNumberStr); - } else { - nameForDefaultImage = displayNumber; - callerName.setText(displayNumberStr); - if (!TextUtils.isEmpty(locationOrType)) { - callerNumber.setText(locationOrType); - callerNumber.setVisibility(View.VISIBLE); - } else { - callerNumber.setVisibility(View.GONE); - } - } - loadContactPhoto(info, nameForDefaultImage, quickContactBadge); - } - - private void loadContactPhoto(ContactInfo info, String displayName, QuickContactBadge badge) { - final String lookupKey = - info.lookupUri == null ? null : UriUtils.getLookupKeyFromUri(info.lookupUri); - final int contactType = - mContactInfoHelper.isBusiness(info.sourceType) - ? LetterTileDrawable.TYPE_BUSINESS - : LetterTileDrawable.TYPE_DEFAULT; - final DefaultImageRequest request = - new DefaultImageRequest(displayName, lookupKey, contactType, true /* isCircular */); - badge.assignContactUri(info.lookupUri); - badge.setContentDescription( - mContext.getResources().getString(R.string.description_contact_details, displayName)); - mContactPhotoManager.loadDirectoryPhoto( - badge, info.photoUri, false /* darkTheme */, true /* isCircular */, request); - } - - private String getDisplayNumber(ContactInfo info) { - if (!TextUtils.isEmpty(info.formattedNumber)) { - return info.formattedNumber; - } else if (!TextUtils.isEmpty(info.number)) { - return info.number; - } else { - return ""; - } - } - - private CharSequence getNumberTypeOrLocation(ContactInfo info) { - if (!TextUtils.isEmpty(info.name)) { - return ContactsContract.CommonDataKinds.Phone.getTypeLabel( - mContext.getResources(), info.type, info.label); - } else { - return PhoneNumberHelper.getGeoDescription(mContext, info.number); - } - } - - protected Context getContext() { - return mContext; - } - - protected FragmentManager getFragmentManager() { - return mFragmentManager; - } -} diff --git a/java/com/android/dialer/app/filterednumber/ViewNumbersToImportAdapter.java b/java/com/android/dialer/app/filterednumber/ViewNumbersToImportAdapter.java deleted file mode 100644 index 1e90eecb6..000000000 --- a/java/com/android/dialer/app/filterednumber/ViewNumbersToImportAdapter.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2015 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.filterednumber; - -import android.app.FragmentManager; -import android.content.Context; -import android.database.Cursor; -import android.view.View; -import com.android.dialer.app.R; -import com.android.dialer.blocking.FilteredNumbersUtil; -import com.android.dialer.contactphoto.ContactPhotoManager; -import com.android.dialer.location.GeoUtil; -import com.android.dialer.phonenumbercache.ContactInfoHelper; - -public class ViewNumbersToImportAdapter extends NumbersAdapter { - - private ViewNumbersToImportAdapter( - Context context, - FragmentManager fragmentManager, - ContactInfoHelper contactInfoHelper, - ContactPhotoManager contactPhotoManager) { - super(context, fragmentManager, contactInfoHelper, contactPhotoManager); - } - - public static ViewNumbersToImportAdapter newViewNumbersToImportAdapter( - Context context, FragmentManager fragmentManager) { - return new ViewNumbersToImportAdapter( - context, - fragmentManager, - new ContactInfoHelper(context, GeoUtil.getCurrentCountryIso(context)), - ContactPhotoManager.getInstance(context)); - } - - @Override - public void bindView(View view, Context context, Cursor cursor) { - super.bindView(view, context, cursor); - - final String number = cursor.getString(FilteredNumbersUtil.PhoneQuery.NUMBER_COLUMN_INDEX); - - view.findViewById(R.id.delete_button).setVisibility(View.GONE); - updateView(view, number, null /* countryIso */); - } -} diff --git a/java/com/android/dialer/app/filterednumber/ViewNumbersToImportFragment.java b/java/com/android/dialer/app/filterednumber/ViewNumbersToImportFragment.java deleted file mode 100644 index d45f61ed7..000000000 --- a/java/com/android/dialer/app/filterednumber/ViewNumbersToImportFragment.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (C) 2015 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.filterednumber; - -import android.app.ListFragment; -import android.app.LoaderManager; -import android.content.Context; -import android.content.CursorLoader; -import android.content.Loader; -import android.database.Cursor; -import android.os.Bundle; -import android.provider.ContactsContract.CommonDataKinds.Phone; -import android.support.v7.app.ActionBar; -import android.support.v7.app.AppCompatActivity; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import com.android.dialer.app.R; -import com.android.dialer.blocking.FilteredNumbersUtil; -import com.android.dialer.blocking.FilteredNumbersUtil.ImportSendToVoicemailContactsListener; - -public class ViewNumbersToImportFragment extends ListFragment - implements LoaderManager.LoaderCallbacks, View.OnClickListener { - - private ViewNumbersToImportAdapter mAdapter; - - @Override - public Context getContext() { - return getActivity(); - } - - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - - if (mAdapter == null) { - mAdapter = - ViewNumbersToImportAdapter.newViewNumbersToImportAdapter( - getContext(), getActivity().getFragmentManager()); - } - setListAdapter(mAdapter); - } - - @Override - public void onDestroy() { - setListAdapter(null); - super.onDestroy(); - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - getLoaderManager().initLoader(0, null, this); - } - - @Override - public void onResume() { - super.onResume(); - - ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); - actionBar.setTitle(R.string.import_send_to_voicemail_numbers_label); - actionBar.setDisplayShowCustomEnabled(false); - actionBar.setDisplayHomeAsUpEnabled(true); - actionBar.setDisplayShowHomeEnabled(true); - actionBar.setDisplayShowTitleEnabled(true); - - getActivity().findViewById(R.id.cancel_button).setOnClickListener(this); - getActivity().findViewById(R.id.import_button).setOnClickListener(this); - } - - @Override - public View onCreateView( - LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - return inflater.inflate(R.layout.view_numbers_to_import_fragment, container, false); - } - - @Override - public Loader onCreateLoader(int id, Bundle args) { - final CursorLoader cursorLoader = - new CursorLoader( - getContext(), - Phone.CONTENT_URI, - FilteredNumbersUtil.PhoneQuery.PROJECTION, - FilteredNumbersUtil.PhoneQuery.SELECT_SEND_TO_VOICEMAIL_TRUE, - null, - null); - return cursorLoader; - } - - @Override - public void onLoadFinished(Loader loader, Cursor data) { - mAdapter.swapCursor(data); - } - - @Override - public void onLoaderReset(Loader loader) { - mAdapter.swapCursor(null); - } - - @Override - public void onClick(final View view) { - if (view.getId() == R.id.import_button) { - FilteredNumbersUtil.importSendToVoicemailContacts( - getContext(), - new ImportSendToVoicemailContactsListener() { - @Override - public void onImportComplete() { - if (getActivity() != null) { - getActivity().onBackPressed(); - } - } - }); - } else if (view.getId() == R.id.cancel_button) { - getActivity().onBackPressed(); - } - } -} diff --git a/java/com/android/dialer/app/list/BlockedListSearchFragment.java b/java/com/android/dialer/app/list/BlockedListSearchFragment.java deleted file mode 100644 index 8d42221c0..000000000 --- a/java/com/android/dialer/app/list/BlockedListSearchFragment.java +++ /dev/null @@ -1,247 +0,0 @@ -/* - * Copyright (C) 2015 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.Activity; -import android.os.Bundle; -import android.support.v7.app.ActionBar; -import android.support.v7.app.AppCompatActivity; -import android.telephony.PhoneNumberUtils; -import android.text.Editable; -import android.text.TextUtils; -import android.text.TextWatcher; -import android.util.TypedValue; -import android.view.View; -import android.widget.AdapterView; -import android.widget.EditText; -import android.widget.Toast; -import com.android.contacts.common.list.ContactEntryListAdapter; -import com.android.contacts.common.util.ContactDisplayUtils; -import com.android.dialer.app.R; -import com.android.dialer.app.widget.SearchEditTextLayout; -import com.android.dialer.blocking.BlockNumberDialogFragment; -import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler; -import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler.OnCheckBlockedListener; -import com.android.dialer.common.LogUtil; -import com.android.dialer.location.GeoUtil; -import com.android.dialer.logging.InteractionEvent; -import com.android.dialer.logging.Logger; - -public class BlockedListSearchFragment extends RegularSearchFragment - implements BlockNumberDialogFragment.Callback { - - private final TextWatcher mPhoneSearchQueryTextListener = - new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) {} - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - setQueryString(s.toString()); - } - - @Override - public void afterTextChanged(Editable s) {} - }; - private final SearchEditTextLayout.Callback mSearchLayoutCallback = - new SearchEditTextLayout.Callback() { - @Override - public void onBackButtonClicked() { - getActivity().onBackPressed(); - } - - @Override - public void onSearchViewClicked() {} - }; - private FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler; - private EditText mSearchView; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - setShowEmptyListForNullQuery(true); - /* - * Pass in the empty string here so ContactEntryListFragment#setQueryString interprets it as - * an empty search query, rather than as an uninitalized value. In the latter case, the - * adapter returned by #createListAdapter is used, which populates the view with contacts. - * Passing in the empty string forces ContactEntryListFragment to interpret it as an empty - * query, which results in showing an empty view - */ - setQueryString(getQueryString() == null ? "" : getQueryString()); - mFilteredNumberAsyncQueryHandler = new FilteredNumberAsyncQueryHandler(getContext()); - } - - @Override - public void onResume() { - super.onResume(); - - ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); - actionBar.setCustomView(R.layout.search_edittext); - actionBar.setDisplayShowCustomEnabled(true); - actionBar.setDisplayHomeAsUpEnabled(false); - actionBar.setDisplayShowHomeEnabled(false); - - final SearchEditTextLayout searchEditTextLayout = - (SearchEditTextLayout) actionBar.getCustomView().findViewById(R.id.search_view_container); - searchEditTextLayout.expand(false, true); - searchEditTextLayout.setCallback(mSearchLayoutCallback); - searchEditTextLayout.setBackgroundDrawable(null); - - mSearchView = (EditText) searchEditTextLayout.findViewById(R.id.search_view); - mSearchView.addTextChangedListener(mPhoneSearchQueryTextListener); - mSearchView.setHint(R.string.block_number_search_hint); - - searchEditTextLayout - .findViewById(R.id.search_box_expanded) - .setBackgroundColor(getContext().getResources().getColor(android.R.color.white)); - - if (!TextUtils.isEmpty(getQueryString())) { - mSearchView.setText(getQueryString()); - } - - // TODO: Don't set custom text size; use default search text size. - mSearchView.setTextSize( - TypedValue.COMPLEX_UNIT_PX, - getResources().getDimension(R.dimen.blocked_number_search_text_size)); - } - - @Override - protected ContactEntryListAdapter createListAdapter() { - BlockedListSearchAdapter adapter = new BlockedListSearchAdapter(getActivity()); - adapter.setDisplayPhotos(true); - // Don't show SIP addresses. - adapter.setUseCallableUri(false); - // Keep in sync with the queryString set in #onCreate - adapter.setQueryString(getQueryString() == null ? "" : getQueryString()); - return adapter; - } - - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - super.onItemClick(parent, view, position, id); - final int adapterPosition = position - getListView().getHeaderViewsCount(); - final BlockedListSearchAdapter adapter = (BlockedListSearchAdapter) getAdapter(); - final int shortcutType = adapter.getShortcutTypeFromPosition(adapterPosition); - final Integer blockId = (Integer) view.getTag(R.id.block_id); - final String number; - switch (shortcutType) { - case DialerPhoneNumberListAdapter.SHORTCUT_INVALID: - // Handles click on a search result, either contact or nearby places result. - number = adapter.getPhoneNumber(adapterPosition); - blockContactNumber(number, blockId); - break; - case DialerPhoneNumberListAdapter.SHORTCUT_BLOCK_NUMBER: - // Handles click on 'Block number' shortcut to add the user query as a number. - number = adapter.getQueryString(); - blockNumber(number); - break; - default: - LogUtil.w( - "BlockedListSearchFragment.onItemClick", - "ignoring unsupported shortcut type: " + shortcutType); - break; - } - } - - @Override - protected void onItemClick(int position, long id) { - // Prevent SearchFragment.onItemClicked from being called. - } - - private void blockNumber(final String number) { - final String countryIso = GeoUtil.getCurrentCountryIso(getContext()); - final OnCheckBlockedListener onCheckListener = - new OnCheckBlockedListener() { - @Override - public void onCheckComplete(Integer id) { - if (id == null) { - BlockNumberDialogFragment.show( - id, - number, - countryIso, - PhoneNumberUtils.formatNumber(number, countryIso), - R.id.blocked_numbers_activity_container, - getFragmentManager(), - BlockedListSearchFragment.this); - } else if (id == FilteredNumberAsyncQueryHandler.INVALID_ID) { - Toast.makeText( - getContext(), - ContactDisplayUtils.getTtsSpannedPhoneNumber( - getResources(), R.string.invalidNumber, number), - Toast.LENGTH_SHORT) - .show(); - } else { - Toast.makeText( - getContext(), - ContactDisplayUtils.getTtsSpannedPhoneNumber( - getResources(), R.string.alreadyBlocked, number), - Toast.LENGTH_SHORT) - .show(); - } - } - }; - mFilteredNumberAsyncQueryHandler.isBlockedNumber(onCheckListener, number, countryIso); - } - - @Override - public void onFilterNumberSuccess() { - Logger.get(getContext()).logInteraction(InteractionEvent.Type.BLOCK_NUMBER_MANAGEMENT_SCREEN); - goBack(); - } - - @Override - public void onUnfilterNumberSuccess() { - LogUtil.e( - "BlockedListSearchFragment.onUnfilterNumberSuccess", - "unblocked a number from the BlockedListSearchFragment"); - goBack(); - } - - private void goBack() { - Activity activity = getActivity(); - if (activity == null) { - return; - } - activity.onBackPressed(); - } - - @Override - public void onChangeFilteredNumberUndo() { - getAdapter().notifyDataSetChanged(); - } - - private void blockContactNumber(final String number, final Integer blockId) { - if (blockId != null) { - Toast.makeText( - getContext(), - ContactDisplayUtils.getTtsSpannedPhoneNumber( - getResources(), R.string.alreadyBlocked, number), - Toast.LENGTH_SHORT) - .show(); - return; - } - - BlockNumberDialogFragment.show( - blockId, - number, - GeoUtil.getCurrentCountryIso(getContext()), - number, - R.id.blocked_numbers_activity_container, - getFragmentManager(), - this); - } -} -- cgit v1.2.3 From f84694f480627d6bfc2857f3d363bb5ea4236a68 Mon Sep 17 00:00:00 2001 From: mdooley Date: Fri, 1 Sep 2017 13:09:55 -0700 Subject: Adding dialer specific transcription error codes These new states will be used to show descriptive failure messages to the user. Also moved the VoicemailCompat class to avoid duplicate code. Bug: 37340510 Test: none PiperOrigin-RevId: 167314611 Change-Id: I618d7f196ea2b0161cbd33479553cae3521328d7 --- .../android/dialer/app/calllog/CallLogAdapter.java | 3 +- .../dialer/app/calllog/PhoneCallDetailsHelper.java | 15 ++--- .../compat/android/provider/VoicemailCompat.java | 75 ++++++++++++++++++++++ .../impl/transcribe/TranscriptionDbHelper.java | 1 + .../impl/transcribe/TranscriptionTask.java | 16 +++-- .../voicemail/impl/transcribe/VoicemailCompat.java | 59 ----------------- 6 files changed, 94 insertions(+), 75 deletions(-) create mode 100644 java/com/android/dialer/compat/android/provider/VoicemailCompat.java delete mode 100644 java/com/android/voicemail/impl/transcribe/VoicemailCompat.java (limited to 'java/com/android') diff --git a/java/com/android/dialer/app/calllog/CallLogAdapter.java b/java/com/android/dialer/app/calllog/CallLogAdapter.java index 61129a7ce..6540b6f95 100644 --- a/java/com/android/dialer/app/calllog/CallLogAdapter.java +++ b/java/com/android/dialer/app/calllog/CallLogAdapter.java @@ -70,6 +70,7 @@ import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; import com.android.dialer.common.concurrent.AsyncTaskExecutor; import com.android.dialer.common.concurrent.AsyncTaskExecutors; +import com.android.dialer.compat.android.provider.VoicemailCompat; import com.android.dialer.configprovider.ConfigProviderBindings; import com.android.dialer.enrichedcall.EnrichedCallCapabilities; import com.android.dialer.enrichedcall.EnrichedCallComponent; @@ -907,7 +908,7 @@ public class CallLogAdapter extends GroupingListAdapter final int transcriptionState = (VERSION.SDK_INT >= VERSION_CODES.O) ? cursor.getInt(CallLogQuery.TRANSCRIPTION_STATE) - : PhoneCallDetailsHelper.TRANSCRIPTION_NOT_STARTED; + : VoicemailCompat.TRANSCRIPTION_NOT_STARTED; final PhoneCallDetails details = new PhoneCallDetails(number, numberPresentation, postDialDigits); details.viaNumber = viaNumber; diff --git a/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java b/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java index c1a00e58d..a6e8f10f0 100644 --- a/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java +++ b/java/com/android/dialer/app/calllog/PhoneCallDetailsHelper.java @@ -31,6 +31,7 @@ import android.widget.TextView; import com.android.dialer.app.R; import com.android.dialer.app.calllog.calllogcache.CallLogCache; import com.android.dialer.calllogutils.PhoneCallDetails; +import com.android.dialer.compat.android.provider.VoicemailCompat; import com.android.dialer.logging.ContactSource; import com.android.dialer.oem.MotorolaUtils; import com.android.dialer.phonenumberutil.PhoneNumberHelper; @@ -45,13 +46,6 @@ public class PhoneCallDetailsHelper { /** The maximum number of icons will be shown to represent the call types in a group. */ private static final int MAX_CALL_TYPE_ICONS = 3; - // TODO(mdooley): remove when these api's become public - // Copied from android.provider.VoicemailContract - static final int TRANSCRIPTION_NOT_STARTED = 0; - static final int TRANSCRIPTION_IN_PROGRESS = 1; - static final int TRANSCRIPTION_FAILED = 2; - static final int TRANSCRIPTION_AVAILABLE = 3; - private final Context mContext; private final Resources mResources; private final CallLogCache mCallLogCache; @@ -159,12 +153,13 @@ public class PhoneCallDetailsHelper { // Set the branding text if the voicemail was transcribed by google // TODO(mdooley): the transcription state is only set by the google transcription code, // but a better solution would be to check the SOURCE_PACKAGE - showTranscriptBranding = details.transcriptionState == TRANSCRIPTION_AVAILABLE; + showTranscriptBranding = + details.transcriptionState == VoicemailCompat.TRANSCRIPTION_AVAILABLE; } else { - if (details.transcriptionState == TRANSCRIPTION_IN_PROGRESS) { + if (details.transcriptionState == VoicemailCompat.TRANSCRIPTION_IN_PROGRESS) { views.voicemailTranscriptionView.setText( mResources.getString(R.string.voicemail_transcription_in_progress)); - } else if (details.transcriptionState == TRANSCRIPTION_FAILED) { + } else if (details.transcriptionState == VoicemailCompat.TRANSCRIPTION_FAILED) { views.voicemailTranscriptionView.setText( mResources.getString(R.string.voicemail_transcription_failed)); } diff --git a/java/com/android/dialer/compat/android/provider/VoicemailCompat.java b/java/com/android/dialer/compat/android/provider/VoicemailCompat.java new file mode 100644 index 000000000..175ea5d95 --- /dev/null +++ b/java/com/android/dialer/compat/android/provider/VoicemailCompat.java @@ -0,0 +1,75 @@ +/* + * 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.compat.android.provider; + +/** + * Provide access to new API constants before they're publicly available + * + *

Copied from android.provider.VoicemailContract.Voicemails. These should become public in O-MR1 + * and these constants can be removed then. + */ +public class VoicemailCompat { + + /** + * The state of the voicemail transcription. + * + *

Possible values: {@link #TRANSCRIPTION_NOT_STARTED}, {@link #TRANSCRIPTION_IN_PROGRESS}, + * {@link #TRANSCRIPTION_FAILED}, {@link #TRANSCRIPTION_AVAILABLE}. + * + *

Type: INTEGER + */ + public static final String TRANSCRIPTION_STATE = "transcription_state"; + + /** + * Value of {@link #TRANSCRIPTION_STATE} when the voicemail transcription has not yet been + * attempted. + */ + public static final int TRANSCRIPTION_NOT_STARTED = 0; + + /** + * Value of {@link #TRANSCRIPTION_STATE} when the voicemail transcription has begun but is not yet + * complete. + */ + public static final int TRANSCRIPTION_IN_PROGRESS = 1; + + /** + * Value of {@link #TRANSCRIPTION_STATE} when the voicemail transcription has been attempted and + * failed for an unspecified reason. + */ + public static final int TRANSCRIPTION_FAILED = 2; + + /** + * Value of {@link #TRANSCRIPTION_STATE} when the voicemail transcription has completed and the + * result has been stored in the {@link #TRANSCRIPTION} column. + */ + public static final int TRANSCRIPTION_AVAILABLE = 3; + + /** + * Value of {@link #TRANSCRIPTION_STATE} when the voicemail transcription has been attempted and + * failed because no speech was detected. + * + *

Internal dialer use only, not part of the public SDK. + */ + public static final int TRANSCRIPTION_FAILED_NO_SPEECH_DETECTED = -1; + + /** + * Value of {@link #TRANSCRIPTION_STATE} when the voicemail transcription has been attempted and + * failed because the language was not supported. + * + *

Internal dialer use only, not part of the public SDK. + */ + public static final int TRANSCRIPTION_FAILED_LANGUAGE_NOT_SUPPORTED = -2; +} diff --git a/java/com/android/voicemail/impl/transcribe/TranscriptionDbHelper.java b/java/com/android/voicemail/impl/transcribe/TranscriptionDbHelper.java index 9d3c2e4a7..a9a37225b 100644 --- a/java/com/android/voicemail/impl/transcribe/TranscriptionDbHelper.java +++ b/java/com/android/voicemail/impl/transcribe/TranscriptionDbHelper.java @@ -30,6 +30,7 @@ import android.support.v4.os.BuildCompat; import android.util.Pair; import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; +import com.android.dialer.compat.android.provider.VoicemailCompat; import java.util.ArrayList; import java.util.List; diff --git a/java/com/android/voicemail/impl/transcribe/TranscriptionTask.java b/java/com/android/voicemail/impl/transcribe/TranscriptionTask.java index b5f29da00..fbab07655 100644 --- a/java/com/android/voicemail/impl/transcribe/TranscriptionTask.java +++ b/java/com/android/voicemail/impl/transcribe/TranscriptionTask.java @@ -22,6 +22,7 @@ import android.net.Uri; import android.text.TextUtils; import android.util.Pair; import com.android.dialer.common.concurrent.ThreadUtil; +import com.android.dialer.compat.android.provider.VoicemailCompat; import com.android.dialer.logging.DialerImpression; import com.android.dialer.logging.Logger; import com.android.voicemail.impl.VvmLog; @@ -124,24 +125,29 @@ public abstract class TranscriptionTask implements Runnable { } else { VvmLog.i(TAG, "transcribeVoicemail, transcription unsuccessful, " + status); switch (status) { + case FAILED_NO_SPEECH_DETECTED: + updateTranscriptionAndState( + transcript, VoicemailCompat.TRANSCRIPTION_FAILED_NO_SPEECH_DETECTED); + Logger.get(context) + .logImpression(DialerImpression.Type.VVM_TRANSCRIPTION_RESPONSE_NO_SPEECH_DETECTED); + break; case FAILED_LANGUAGE_NOT_SUPPORTED: + updateTranscriptionAndState( + transcript, VoicemailCompat.TRANSCRIPTION_FAILED_LANGUAGE_NOT_SUPPORTED); Logger.get(context) .logImpression( DialerImpression.Type.VVM_TRANSCRIPTION_RESPONSE_LANGUAGE_NOT_SUPPORTED); break; - case FAILED_NO_SPEECH_DETECTED: - Logger.get(context) - .logImpression(DialerImpression.Type.VVM_TRANSCRIPTION_RESPONSE_NO_SPEECH_DETECTED); - break; case EXPIRED: + updateTranscriptionAndState(transcript, VoicemailCompat.TRANSCRIPTION_FAILED); Logger.get(context) .logImpression(DialerImpression.Type.VVM_TRANSCRIPTION_RESPONSE_EXPIRED); break; default: + updateTranscriptionAndState(transcript, VoicemailCompat.TRANSCRIPTION_FAILED); Logger.get(context).logImpression(DialerImpression.Type.VVM_TRANSCRIPTION_RESPONSE_EMPTY); break; } - updateTranscriptionAndState(transcript, VoicemailCompat.TRANSCRIPTION_FAILED); } } diff --git a/java/com/android/voicemail/impl/transcribe/VoicemailCompat.java b/java/com/android/voicemail/impl/transcribe/VoicemailCompat.java deleted file mode 100644 index c6e30c6de..000000000 --- a/java/com/android/voicemail/impl/transcribe/VoicemailCompat.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * 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.voicemail.impl.transcribe; - -/** - * Provide access to new API constants before they're publicly available - * - *

Copied from android.provider.VoicemailContract.Voicemails. These should become public in O-MR1 - * and these constants can be removed then. - */ -public class VoicemailCompat { - - /** - * The state of the voicemail transcription. - * - *

Possible values: {@link #TRANSCRIPTION_NOT_STARTED}, {@link #TRANSCRIPTION_IN_PROGRESS}, - * {@link #TRANSCRIPTION_FAILED}, {@link #TRANSCRIPTION_AVAILABLE}. - * - *

Type: INTEGER - */ - public static final String TRANSCRIPTION_STATE = "transcription_state"; - - /** - * Value of {@link #TRANSCRIPTION_STATE} when the voicemail transcription has not yet been - * attempted. - */ - public static final int TRANSCRIPTION_NOT_STARTED = 0; - - /** - * Value of {@link #TRANSCRIPTION_STATE} when the voicemail transcription has begun but is not yet - * complete. - */ - public static final int TRANSCRIPTION_IN_PROGRESS = 1; - - /** - * Value of {@link #TRANSCRIPTION_STATE} when the voicemail transcription has been attempted and - * failed. - */ - public static final int TRANSCRIPTION_FAILED = 2; - - /** - * Value of {@link #TRANSCRIPTION_STATE} when the voicemail transcription has completed and the - * result has been stored in the {@link #TRANSCRIPTION} column. - */ - public static final int TRANSCRIPTION_AVAILABLE = 3; -} -- cgit v1.2.3 From 97fee1cd45fa46448b07b219d5e6f2e911d4f5f0 Mon Sep 17 00:00:00 2001 From: Android Dialer Date: Fri, 1 Sep 2017 14:40:48 -0700 Subject: Bump version code and name to Dialer v12.1 and Dialer v13 (again). This CL updates version codes and name for Dialer v12.1 to 17*****. Doing so also bumps v13 to 18*****. Test: N/A PiperOrigin-RevId: 167326768 Change-Id: I3765a9ae8b06669a3eb96fef03a8a1432b3fc278 --- AndroidManifest.xml | 2 +- java/com/android/dialer/binary/google/AndroidManifest.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'java/com/android') diff --git a/AndroidManifest.xml b/AndroidManifest.xml index b508401ca..68e1f5abc 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -16,7 +16,7 @@ Date: Fri, 1 Sep 2017 14:41:19 -0700 Subject: Fix crash when Context is null in InCallPresenter We need to use the Context to check if the device is a ODR device for a workaround (http://cl/165734624). It turns out the Context can be null (rarely). In those cases, we should not crash. Bug: 64954483 Test: manual PiperOrigin-RevId: 167326838 Change-Id: I4d8d8de86b5e3a4eca165a562f2ddc6106052c6e --- java/com/android/incallui/InCallPresenter.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'java/com/android') diff --git a/java/com/android/incallui/InCallPresenter.java b/java/com/android/incallui/InCallPresenter.java index 3f87a592d..4cc03f3dd 100644 --- a/java/com/android/incallui/InCallPresenter.java +++ b/java/com/android/incallui/InCallPresenter.java @@ -1682,18 +1682,23 @@ public class InCallPresenter implements CallList.Listener { VideoSurfaceTexture getLocalVideoSurfaceTexture() { if (mLocalVideoSurfaceTexture == null) { - mLocalVideoSurfaceTexture = - VideoSurfaceBindings.createLocalVideoSurfaceTexture( - mContext.getPackageManager().hasSystemFeature(PIXEL2017_SYSTEM_FEATURE)); + boolean isPixel2017 = false; + if (mContext != null) { + isPixel2017 = mContext.getPackageManager().hasSystemFeature(PIXEL2017_SYSTEM_FEATURE); + } + mLocalVideoSurfaceTexture = VideoSurfaceBindings.createLocalVideoSurfaceTexture(isPixel2017); } return mLocalVideoSurfaceTexture; } VideoSurfaceTexture getRemoteVideoSurfaceTexture() { if (mRemoteVideoSurfaceTexture == null) { + boolean isPixel2017 = false; + if (mContext != null) { + isPixel2017 = mContext.getPackageManager().hasSystemFeature(PIXEL2017_SYSTEM_FEATURE); + } mRemoteVideoSurfaceTexture = - VideoSurfaceBindings.createRemoteVideoSurfaceTexture( - mContext.getPackageManager().hasSystemFeature(PIXEL2017_SYSTEM_FEATURE)); + VideoSurfaceBindings.createRemoteVideoSurfaceTexture(isPixel2017); } return mRemoteVideoSurfaceTexture; } -- cgit v1.2.3 From ee5bce98231b96bc7f3ecf2d12276571786863f5 Mon Sep 17 00:00:00 2001 From: calderwoodra Date: Fri, 1 Sep 2017 15:25:00 -0700 Subject: Improved behavior of back button in search ui. Pressing the back button in the search UI now functions as follows: - If the keyboard is opened, the keyboard is minimized - If the dialpad is opened, the dialpad is closed - If the keyboard and dialpad is closed, the search ui is closed Our existing behavior was dependent on whether a query had been built yet. basically, if the user pressed back with no query selected, the search ui was closed. From the bugbash: 7. No scroll bar in the search results if the results do not fill the entire view. The keyboard overlaps the results and there is no way to get to the enter list without dismissing the keyboard. 10. Dismiss the keyboard on tapping the down arrow on the keyboard. Arrow points down but works like back button Bug: 64902476,64137632,62685859,63691995,63939331 Test: manual PiperOrigin-RevId: 167332236 Change-Id: I1c0b5b429316dae119b5fb21be4303d7fe052e35 --- java/com/android/dialer/app/DialtactsActivity.java | 113 ++++++++------------- .../dialer/app/widget/ActionBarController.java | 28 ++--- .../dialer/app/widget/SearchEditTextLayout.java | 67 +----------- .../dialer/dialpadview/DialpadFragment.java | 12 +-- 4 files changed, 55 insertions(+), 165 deletions(-) (limited to 'java/com/android') diff --git a/java/com/android/dialer/app/DialtactsActivity.java b/java/com/android/dialer/app/DialtactsActivity.java index 74bc8cc33..fc557f0b6 100644 --- a/java/com/android/dialer/app/DialtactsActivity.java +++ b/java/com/android/dialer/app/DialtactsActivity.java @@ -49,7 +49,6 @@ import android.text.TextUtils; import android.text.TextWatcher; import android.view.DragEvent; import android.view.Gravity; -import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; @@ -169,6 +168,7 @@ public class DialtactsActivity extends TransactionSafeActivity 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"; + private static final String KEY_IN_NEW_SEARCH_UI = "in_new_search_ui"; private static final String KEY_SEARCH_QUERY = "search_query"; private static final String KEY_FIRST_LAUNCH = "first_launch"; private static final String KEY_WAS_CONFIGURATION_CHANGE = "was_configuration_change"; @@ -213,6 +213,8 @@ public class DialtactsActivity extends TransactionSafeActivity */ private boolean mStateSaved; + private boolean mIsKeyboardOpen; + private boolean mInNewSearch; private boolean mIsRestarting; private boolean mInDialpadSearch; private boolean mInRegularSearch; @@ -333,27 +335,6 @@ public class DialtactsActivity extends TransactionSafeActivity private int mActionBarHeight; private int mPreviouslySelectedTabIndex; - /** Handles the user closing the soft keyboard. */ - private final View.OnKeyListener mSearchEditTextLayoutListener = - new View.OnKeyListener() { - @Override - public boolean onKey(View v, int keyCode, KeyEvent event) { - 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(); - } - } - return false; - } - }; /** * The text returned from a voice search query. Set in {@link #onActivityResult} and used in @@ -413,30 +394,20 @@ public class DialtactsActivity extends TransactionSafeActivity SearchEditTextLayout searchEditTextLayout = actionBar.getCustomView().findViewById(R.id.search_view_container); - searchEditTextLayout.setPreImeKeyListener(mSearchEditTextLayoutListener); mActionBarController = new ActionBarController(this, searchEditTextLayout); mSearchView = searchEditTextLayout.findViewById(R.id.search_view); mSearchView.addTextChangedListener(mPhoneSearchQueryTextListener); mSearchView.setHint(getSearchBoxHint()); + mVoiceSearchButton = searchEditTextLayout.findViewById(R.id.voice_search_button); searchEditTextLayout .findViewById(R.id.search_box_collapsed) .setOnClickListener(mSearchViewOnClickListener); - searchEditTextLayout.setCallback( - new SearchEditTextLayout.Callback() { - @Override - public void onBackButtonClicked() { - onBackPressed(); - } - - @Override - public void onSearchViewClicked() { - // Hide FAB, as the keyboard is shown. - mFloatingActionButtonController.scaleOut(); - } - }); + searchEditTextLayout + .findViewById(R.id.search_back_button) + .setOnClickListener(v -> exitSearchUi()); mIsLandscape = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; @@ -463,6 +434,7 @@ public class DialtactsActivity extends TransactionSafeActivity mSearchQuery = savedInstanceState.getString(KEY_SEARCH_QUERY); mInRegularSearch = savedInstanceState.getBoolean(KEY_IN_REGULAR_SEARCH_UI); mInDialpadSearch = savedInstanceState.getBoolean(KEY_IN_DIALPAD_SEARCH_UI); + mInNewSearch = savedInstanceState.getBoolean(KEY_IN_NEW_SEARCH_UI); mFirstLaunch = savedInstanceState.getBoolean(KEY_FIRST_LAUNCH); mWasConfigurationChange = savedInstanceState.getBoolean(KEY_WAS_CONFIGURATION_CHANGE); mShowDialpadOnResume = savedInstanceState.getBoolean(KEY_IS_DIALPAD_SHOWN); @@ -657,6 +629,7 @@ public class DialtactsActivity extends TransactionSafeActivity outState.putString(KEY_SEARCH_QUERY, mSearchQuery); outState.putBoolean(KEY_IN_REGULAR_SEARCH_UI, mInRegularSearch); outState.putBoolean(KEY_IN_DIALPAD_SEARCH_UI, mInDialpadSearch); + outState.putBoolean(KEY_IN_NEW_SEARCH_UI, mInNewSearch); outState.putBoolean(KEY_FIRST_LAUNCH, mFirstLaunch); outState.putBoolean(KEY_IS_DIALPAD_SHOWN, mIsDialpadShown); outState.putBoolean(KEY_WAS_CONFIGURATION_CHANGE, isChangingConfigurations()); @@ -896,14 +869,19 @@ public class DialtactsActivity extends TransactionSafeActivity updateSearchFragmentPosition(); } + @Override + public void onCallPlacedFromDialpad() { + hideDialpadFragment(false /* animate */, true /*clearDialpad */); + exitSearchUi(); + } + /** * Initiates animations and other visual updates to hide the dialpad. The fragment is hidden in a * callback after the hide animation ends. * * @see #commitDialpadFragmentHide */ - @Override - public void hideDialpadFragment(boolean animate, boolean clearDialpad) { + private void hideDialpadFragment(boolean animate, boolean clearDialpad) { LogUtil.enterBlock("DialtactsActivity.hideDialpadFragment"); if (mDialpadFragment == null || mDialpadFragment.getView() == null) { return; @@ -938,11 +916,6 @@ public class DialtactsActivity extends TransactionSafeActivity mActionBarController.onDialpadDown(); - if (isInSearchUi()) { - if (TextUtils.isEmpty(mSearchQuery)) { - exitSearchUi(); - } - } // reset the title to normal. setTitle(R.string.launcherActivityLabel); } @@ -990,7 +963,7 @@ public class DialtactsActivity extends TransactionSafeActivity @Override public boolean isInSearchUi() { - return mInDialpadSearch || mInRegularSearch; + return mInDialpadSearch || mInRegularSearch || mInNewSearch; } @Override @@ -1001,6 +974,7 @@ public class DialtactsActivity extends TransactionSafeActivity private void setNotInSearchUi() { mInDialpadSearch = false; mInRegularSearch = false; + mInNewSearch = false; } private void hideDialpadAndSearchUi() { @@ -1174,17 +1148,21 @@ public class DialtactsActivity extends TransactionSafeActivity } final String tag; + mInDialpadSearch = false; + mInRegularSearch = false; + mInNewSearch = false; boolean useNewSearch = ConfigProviderBindings.get(this).getBoolean("enable_new_search_fragment", false); if (useNewSearch) { tag = TAG_NEW_SEARCH_FRAGMENT; + mInNewSearch = true; } else if (smartDialSearch) { tag = TAG_SMARTDIAL_SEARCH_FRAGMENT; + mInDialpadSearch = true; } else { tag = TAG_REGULAR_SEARCH_FRAGMENT; + mInRegularSearch = true; } - mInDialpadSearch = smartDialSearch; - mInRegularSearch = !smartDialSearch; mFloatingActionButtonController.scaleOut(); @@ -1308,43 +1286,34 @@ public class DialtactsActivity extends TransactionSafeActivity return; } if (mIsDialpadShown) { - if (TextUtils.isEmpty(mSearchQuery) - || (mSmartDialSearchFragment != null - && mSmartDialSearchFragment.isVisible() - && mSmartDialSearchFragment.getAdapter().getCount() == 0)) { - exitSearchUi(); - } hideDialpadFragment(true, false); } else if (isInSearchUi()) { - exitSearchUi(); - DialerUtils.hideInputMethod(mParentLayout); + if (mIsKeyboardOpen) { + DialerUtils.hideInputMethod(mParentLayout); + PerformanceReport.recordClick(UiAction.Type.HIDE_KEYBOARD_IN_SEARCH); + } else { + exitSearchUi(); + } } else { super.onBackPressed(); } } - private void maybeEnterSearchUi() { - if (!isInSearchUi()) { - enterSearchUi(true /* isSmartDial */, mSearchQuery, false); + @Override + public void onConfigurationChanged(Configuration configuration) { + super.onConfigurationChanged(configuration); + // Checks whether a hardware keyboard is available + if (configuration.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) { + mIsKeyboardOpen = true; + } else if (configuration.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES) { + mIsKeyboardOpen = false; } } - /** @return True if the search UI was exited, false otherwise */ - private boolean maybeExitSearchUi() { - if (isInSearchUi() && TextUtils.isEmpty(mSearchQuery)) { - exitSearchUi(); - DialerUtils.hideInputMethod(mParentLayout); - return true; + private void maybeEnterSearchUi() { + if (!isInSearchUi()) { + enterSearchUi(true /* isSmartDial */, mSearchQuery, false); } - return false; - } - - private void showFabInSearchUi() { - mFloatingActionButtonController.changeIcon( - getResources().getDrawable(R.drawable.quantum_ic_dialpad_white_24, null), - getResources().getString(R.string.action_menu_dialpad_button)); - mFloatingActionButtonController.align(getFabAlignment(), false /* animate */); - mFloatingActionButtonController.scaleIn(FAB_SCALE_IN_DELAY_MS); } @Override diff --git a/java/com/android/dialer/app/widget/ActionBarController.java b/java/com/android/dialer/app/widget/ActionBarController.java index c1b4cc2b4..3daa0e2d4 100644 --- a/java/com/android/dialer/app/widget/ActionBarController.java +++ b/java/com/android/dialer/app/widget/ActionBarController.java @@ -49,18 +49,6 @@ public class ActionBarController { } }; - private final AnimationCallback mFadeInCallback = - new AnimationCallback() { - @Override - public void onAnimationEnd() { - slideActionBar(false /* slideUp */, false /* animate */); - } - - @Override - public void onAnimationCancel() { - slideActionBar(false /* slideUp */, false /* animate */); - } - }; private ValueAnimator mAnimator; public ActionBarController(ActivityUi activityUi, SearchEditTextLayout searchBox) { @@ -112,17 +100,13 @@ public class ActionBarController { mSearchBox.isFadedOut(), mSearchBox.isExpanded()); if (mActivityUi.isInSearchUi()) { - if (mActivityUi.hasSearchQuery()) { - if (mSearchBox.isFadedOut()) { - mSearchBox.setVisible(true); - } - if (!mSearchBox.isExpanded()) { - mSearchBox.expand(false /* animate */, false /* requestFocus */); - } - slideActionBar(false /* slideUp */, true /* animate */); - } else { - mSearchBox.fadeIn(mFadeInCallback); + if (mSearchBox.isFadedOut()) { + mSearchBox.setVisible(true); + } + if (!mSearchBox.isExpanded()) { + mSearchBox.expand(false /* animate */, false /* requestFocus */); } + slideActionBar(false /* slideUp */, true /* animate */); } } diff --git a/java/com/android/dialer/app/widget/SearchEditTextLayout.java b/java/com/android/dialer/app/widget/SearchEditTextLayout.java index 95bd12aa1..2051b65f2 100644 --- a/java/com/android/dialer/app/widget/SearchEditTextLayout.java +++ b/java/com/android/dialer/app/widget/SearchEditTextLayout.java @@ -23,7 +23,6 @@ import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; import android.util.AttributeSet; -import android.view.KeyEvent; import android.view.View; import android.widget.EditText; import android.widget.FrameLayout; @@ -38,7 +37,6 @@ public class SearchEditTextLayout extends FrameLayout { /* Subclass-visible for testing */ protected boolean mIsExpanded = false; protected boolean mIsFadedOut = false; - private OnKeyListener mPreImeKeyListener; private int mTopMargin; private int mBottomMargin; private int mLeftMargin; @@ -56,20 +54,10 @@ public class SearchEditTextLayout extends FrameLayout { private ValueAnimator mAnimator; - private Callback mCallback; - public SearchEditTextLayout(Context context, AttributeSet attrs) { super(context, attrs); } - public void setPreImeKeyListener(OnKeyListener listener) { - mPreImeKeyListener = listener; - } - - public void setCallback(Callback listener) { - mCallback = listener; - } - @Override protected void onFinishInflate() { MarginLayoutParams params = (MarginLayoutParams) getLayoutParams(); @@ -82,7 +70,7 @@ public class SearchEditTextLayout extends FrameLayout { mCollapsed = findViewById(R.id.search_box_collapsed); mExpanded = findViewById(R.id.search_box_expanded); - mSearchView = (EditText) mExpanded.findViewById(R.id.search_view); + mSearchView = mExpanded.findViewById(R.id.search_view); mSearchIcon = findViewById(R.id.search_magnifying_glass); mCollapsedSearchBox = findViewById(R.id.search_box_start_search); @@ -123,16 +111,6 @@ public class SearchEditTextLayout extends FrameLayout { } }); - mSearchView.setOnClickListener( - new View.OnClickListener() { - @Override - public void onClick(View v) { - if (mCallback != null) { - mCallback.onSearchViewClicked(); - } - } - }); - mSearchView.addTextChangedListener( new TextWatcher() { @Override @@ -147,43 +125,10 @@ public class SearchEditTextLayout extends FrameLayout { public void afterTextChanged(Editable s) {} }); - findViewById(R.id.search_close_button) - .setOnClickListener( - new OnClickListener() { - @Override - public void onClick(View v) { - mSearchView.setText(null); - } - }); - - findViewById(R.id.search_back_button) - .setOnClickListener( - new OnClickListener() { - @Override - public void onClick(View v) { - if (mCallback != null) { - mCallback.onBackButtonClicked(); - } - } - }); - + mClearButtonView.setOnClickListener(v -> mSearchView.setText(null)); super.onFinishInflate(); } - @Override - public boolean dispatchKeyEventPreIme(KeyEvent event) { - if (mPreImeKeyListener != null) { - if (mPreImeKeyListener.onKey(this, event.getKeyCode(), event)) { - return true; - } - } - return super.dispatchKeyEventPreIme(event); - } - - public void fadeOut() { - fadeOut(null); - } - public void fadeOut(AnimUtils.AnimationCallback callback) { AnimUtils.fadeOut(this, ANIMATION_DURATION, callback); mIsFadedOut = true; @@ -324,12 +269,4 @@ public class SearchEditTextLayout extends FrameLayout { params.rightMargin = (int) (mRightMargin * fraction); requestLayout(); } - - /** Listener for the back button next to the search view being pressed */ - public interface Callback { - - void onBackButtonClicked(); - - void onSearchViewClicked(); - } } diff --git a/java/com/android/dialer/dialpadview/DialpadFragment.java b/java/com/android/dialer/dialpadview/DialpadFragment.java index 86a83796e..837c3af90 100644 --- a/java/com/android/dialer/dialpadview/DialpadFragment.java +++ b/java/com/android/dialer/dialpadview/DialpadFragment.java @@ -1001,12 +1001,12 @@ public class DialpadFragment extends Fragment DialerUtils.startActivityWithErrorToast( getActivity(), new CallIntentBuilder(CallUtil.getVoicemailUri(), CallInitiationType.Type.DIALPAD).build()); - hideAndClearDialpad(false); + hideAndClearDialpad(); } - private void hideAndClearDialpad(boolean animate) { + private void hideAndClearDialpad() { LogUtil.enterBlock("DialpadFragment.hideAndClearDialpad"); - FragmentUtils.getParentUnsafe(this, DialpadListener.class).hideDialpadFragment(animate, true); + FragmentUtils.getParentUnsafe(this, DialpadListener.class).onCallPlacedFromDialpad(); } /** @@ -1053,7 +1053,7 @@ public class DialpadFragment extends Fragment final Intent intent = new CallIntentBuilder(number, CallInitiationType.Type.DIALPAD).build(); DialerUtils.startActivityWithErrorToast(getActivity(), intent); - hideAndClearDialpad(false); + hideAndClearDialpad(); } } } @@ -1297,7 +1297,7 @@ public class DialpadFragment extends Fragment return true; } else if (resId == R.id.menu_call_with_note) { CallSubjectDialog.start(getActivity(), mDigits.getText().toString()); - hideAndClearDialpad(false); + hideAndClearDialpad(); return true; } else { return false; @@ -1710,7 +1710,7 @@ public class DialpadFragment extends Fragment void onDialpadShown(); - void hideDialpadFragment(boolean animate, boolean value); + void onCallPlacedFromDialpad(); } /** Callback for async lookup of the last number dialed. */ -- cgit v1.2.3 From 34f1886107825b4495741a034f15e1f1edacf95c Mon Sep 17 00:00:00 2001 From: yueg Date: Fri, 1 Sep 2017 15:44:58 -0700 Subject: Disable action on bubble when hiding, and reable it when showing. Allowing click or moving bubble when hiding bubble makes no sense. Also, hide() and swapViewHolders() (called when expand/collapse) may add/remove the same view to windowManager and cause crash. Before: https://drive.google.com/a/google.com/file/d/0Bz1rQbdSCWSKRDEyT2JDdk9LVDA After: https://drive.google.com/a/google.com/file/d/0Bz1rQbdSCWSKUE53aldna0RFVFE Test: BubbleTest PiperOrigin-RevId: 167334496 Change-Id: Id7f5ce4bdfa074840c1e9fac981abad59e261c0e --- java/com/android/dialershared/bubble/Bubble.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'java/com/android') diff --git a/java/com/android/dialershared/bubble/Bubble.java b/java/com/android/dialershared/bubble/Bubble.java index cd2c9fc57..d24552245 100644 --- a/java/com/android/dialershared/bubble/Bubble.java +++ b/java/com/android/dialershared/bubble/Bubble.java @@ -241,6 +241,7 @@ public class Bubble { viewHolder.getPrimaryButton().setScaleY(0); } + viewHolder.setChildClickable(true); visibility = Visibility.ENTERING; viewHolder .getPrimaryButton() @@ -495,6 +496,9 @@ public class Bubble { return; } + // Make bubble non clickable to prevent further buggy actions + viewHolder.setChildClickable(false); + if (textShowing) { hideAfterText = true; return; @@ -822,6 +826,14 @@ public class Bubble { moveHandler = new MoveHandler(primaryButton, Bubble.this); } + private void setChildClickable(boolean clickable) { + firstButton.setClickable(clickable); + secondButton.setClickable(clickable); + thirdButton.setClickable(clickable); + + primaryButton.setOnTouchListener(clickable ? moveHandler : null); + } + public ViewGroup getRoot() { return root; } -- cgit v1.2.3 From af3cc176cdc652a05645cab9ad213696970c6e4d Mon Sep 17 00:00:00 2001 From: calderwoodra Date: Fri, 1 Sep 2017 23:28:21 -0700 Subject: Added search actions to the end of the dialpad search results. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Users can now create new contacts, add to existing contacts, send sms and make ViLTE calls from dialpad search results. screenshot: http://screen/7iR038nUvmh from the bugbash: 11. Missing “Create new contact” “Add to a contact” “Send SMS” from search results with a phone number search Bug: 64902476 Test: many PiperOrigin-RevId: 167362073 Change-Id: I2f94d863035c119ec526e02e088992c618a858a9 --- java/com/android/dialer/app/DialtactsActivity.java | 8 +- .../searchfragment/list/NewSearchFragment.java | 40 ++++-- .../list/SearchActionViewHolder.java | 145 +++++++++++++++++++++ .../dialer/searchfragment/list/SearchAdapter.java | 14 ++ .../searchfragment/list/SearchCursorManager.java | 35 ++++- .../list/res/layout/search_action_layout.xml | 39 ++++++ .../searchfragment/list/res/values/strings.xml | 14 ++ 7 files changed, 278 insertions(+), 17 deletions(-) create mode 100644 java/com/android/dialer/searchfragment/list/SearchActionViewHolder.java create mode 100644 java/com/android/dialer/searchfragment/list/res/layout/search_action_layout.xml (limited to 'java/com/android') diff --git a/java/com/android/dialer/app/DialtactsActivity.java b/java/com/android/dialer/app/DialtactsActivity.java index fc557f0b6..7f5a9b94a 100644 --- a/java/com/android/dialer/app/DialtactsActivity.java +++ b/java/com/android/dialer/app/DialtactsActivity.java @@ -309,10 +309,7 @@ public class DialtactsActivity extends TransactionSafeActivity } else if (mRegularSearchFragment != null && mRegularSearchFragment.isVisible()) { mRegularSearchFragment.setQueryString(mSearchQuery); } else if (mNewSearchFragment != null && mNewSearchFragment.isVisible()) { - mNewSearchFragment.setQuery(mSearchQuery); - // When the user switches between dialpad and the serachbar, we need to reset the - // call initiation type. - mNewSearchFragment.setCallInitiationType(getCallInitiationType()); + mNewSearchFragment.setQuery(mSearchQuery, getCallInitiationType()); } } @@ -1211,8 +1208,7 @@ public class DialtactsActivity extends TransactionSafeActivity if (!smartDialSearch && !useNewSearch) { ((SearchFragment) fragment).setQueryString(query); } else if (useNewSearch) { - ((NewSearchFragment) fragment).setQuery(query); - ((NewSearchFragment) fragment).setCallInitiationType(getCallInitiationType()); + ((NewSearchFragment) fragment).setQuery(query, getCallInitiationType()); } transaction.commit(); diff --git a/java/com/android/dialer/searchfragment/list/NewSearchFragment.java b/java/com/android/dialer/searchfragment/list/NewSearchFragment.java index 5b3532cdb..0623d394a 100644 --- a/java/com/android/dialer/searchfragment/list/NewSearchFragment.java +++ b/java/com/android/dialer/searchfragment/list/NewSearchFragment.java @@ -28,6 +28,7 @@ import android.support.annotation.VisibleForTesting; import android.support.v13.app.FragmentCompat; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; +import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -44,16 +45,19 @@ import com.android.dialer.enrichedcall.EnrichedCallComponent; import com.android.dialer.enrichedcall.EnrichedCallManager.CapabilitiesListener; import com.android.dialer.searchfragment.common.SearchCursor; import com.android.dialer.searchfragment.cp2.SearchContactsCursorLoader; +import com.android.dialer.searchfragment.list.SearchActionViewHolder.Action; import com.android.dialer.searchfragment.nearbyplaces.NearbyPlacesCursorLoader; import com.android.dialer.searchfragment.remote.RemoteContactsCursorLoader; import com.android.dialer.searchfragment.remote.RemoteDirectoriesCursorLoader; import com.android.dialer.searchfragment.remote.RemoteDirectoriesCursorLoader.Directory; +import com.android.dialer.util.CallUtil; import com.android.dialer.util.PermissionsUtil; import com.android.dialer.util.ViewUtil; import com.android.dialer.widget.EmptyContentView; import com.android.dialer.widget.EmptyContentView.OnEmptyViewActionButtonClickedListener; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; /** Fragment used for searching contacts. */ @@ -99,6 +103,7 @@ public final class NewSearchFragment extends Fragment View view = inflater.inflate(R.layout.fragment_search, parent, false); adapter = new SearchAdapter(getActivity(), new SearchCursorManager()); adapter.setCallInitiationType(callInitiationType); + adapter.setSearchActions(getActions()); emptyContentView = view.findViewById(R.id.empty_view); recyclerView = view.findViewById(R.id.recycler_view); recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); @@ -184,22 +189,18 @@ public final class NewSearchFragment extends Fragment recyclerView.setAdapter(null); } - public void setQuery(String query) { + public void setQuery(String query, CallInitiationType.Type callInitiationType) { this.query = query; + this.callInitiationType = callInitiationType; if (adapter != null) { adapter.setQuery(query); + adapter.setCallInitiationType(callInitiationType); + adapter.setSearchActions(getActions()); loadNearbyPlacesCursor(); loadRemoteContactsCursors(); } } - public void setCallInitiationType(CallInitiationType.Type callInitiationType) { - this.callInitiationType = callInitiationType; - if (adapter != null) { - adapter.setCallInitiationType(callInitiationType); - } - } - /** Translate the search fragment and resize it to fit on the screen. */ public void animatePosition(int start, int end, int duration) { // Called before the view is ready, prepare a runnable to run in onCreateView @@ -329,4 +330,27 @@ public final class NewSearchFragment extends Fragment public void setRemoteDirectoriesDisabled(boolean disabled) { remoteDirectoriesDisabledForTesting = disabled; } + + /** + * Returns a list of search actions to be shown in the search results. + * + *

List will be empty if query is 1 or 0 characters or the query isn't from the Dialpad. For + * the list of supported actions, see {@link SearchActionViewHolder.Action}. + */ + private List getActions() { + if (TextUtils.isEmpty(query) + || query.length() == 1 + || callInitiationType == CallInitiationType.Type.REGULAR_SEARCH) { + return Collections.emptyList(); + } + + List actions = new ArrayList<>(); + actions.add(Action.CREATE_NEW_CONTACT); + actions.add(Action.ADD_TO_CONTACT); + actions.add(Action.SEND_SMS); + if (CallUtil.isVideoEnabled(getContext())) { + actions.add(Action.MAKE_VILTE_CALL); + } + return actions; + } } diff --git a/java/com/android/dialer/searchfragment/list/SearchActionViewHolder.java b/java/com/android/dialer/searchfragment/list/SearchActionViewHolder.java new file mode 100644 index 000000000..62e5c72b0 --- /dev/null +++ b/java/com/android/dialer/searchfragment/list/SearchActionViewHolder.java @@ -0,0 +1,145 @@ +/* + * 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.searchfragment.list; + +import android.content.Context; +import android.content.Intent; +import android.support.annotation.IntDef; +import android.support.annotation.StringRes; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.ImageView; +import android.widget.TextView; +import com.android.dialer.callintent.CallInitiationType; +import com.android.dialer.callintent.CallIntentBuilder; +import com.android.dialer.callintent.CallSpecificAppData; +import com.android.dialer.common.Assert; +import com.android.dialer.logging.DialerImpression; +import com.android.dialer.logging.Logger; +import com.android.dialer.util.DialerUtils; +import com.android.dialer.util.IntentUtil; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * {@link RecyclerView.ViewHolder} for showing an {@link SearchActionViewHolder.Action} in a list. + */ +final class SearchActionViewHolder extends RecyclerView.ViewHolder implements OnClickListener { + + /** IntDef for the different types of actions that can be used. */ + @Retention(RetentionPolicy.SOURCE) + @IntDef({ + Action.INVALID, + Action.CREATE_NEW_CONTACT, + Action.ADD_TO_CONTACT, + Action.SEND_SMS, + Action.MAKE_VILTE_CALL + }) + @interface Action { + int INVALID = 0; + /** Opens the prompt to create a new contact. */ + int CREATE_NEW_CONTACT = 1; + /** Opens a prompt to add to an existing contact. */ + int ADD_TO_CONTACT = 2; + /** Opens the SMS conversation with the default SMS app. */ + int SEND_SMS = 3; + /** Attempts to make a VILTE call to the number. */ + int MAKE_VILTE_CALL = 4; + } + + private final Context context; + private final ImageView actionImage; + private final TextView actionText; + + private @Action int action; + private int position; + private String query; + + SearchActionViewHolder(View view) { + super(view); + context = view.getContext(); + actionImage = view.findViewById(R.id.search_action_image); + actionText = view.findViewById(R.id.search_action_text); + view.setOnClickListener(this); + } + + void setAction(@Action int action, int position, String query) { + this.action = action; + this.position = position; + this.query = query; + switch (action) { + case Action.ADD_TO_CONTACT: + actionText.setText(R.string.search_shortcut_add_to_contact); + actionImage.setImageResource(R.drawable.quantum_ic_person_add_vd_theme_24); + break; + case Action.CREATE_NEW_CONTACT: + actionText.setText(R.string.search_shortcut_create_new_contact); + actionImage.setImageResource(R.drawable.quantum_ic_person_add_vd_theme_24); + break; + case Action.MAKE_VILTE_CALL: + actionText.setText(R.string.search_shortcut_make_video_call); + actionImage.setImageResource(R.drawable.quantum_ic_videocam_vd_theme_24); + break; + case Action.SEND_SMS: + actionText.setText(R.string.search_shortcut_send_sms_message); + actionImage.setImageResource(R.drawable.quantum_ic_message_vd_theme_24); + break; + case Action.INVALID: + default: + throw Assert.createIllegalStateFailException("Invalid action: " + action); + } + } + + @Override + public void onClick(View v) { + switch (action) { + case Action.ADD_TO_CONTACT: + Logger.get(context).logImpression(DialerImpression.Type.ADD_TO_A_CONTACT_FROM_DIALPAD); + Intent intent = IntentUtil.getAddToExistingContactIntent(query); + @StringRes int errorString = R.string.add_contact_not_available; + DialerUtils.startActivityWithErrorToast(context, intent, errorString); + break; + + case Action.CREATE_NEW_CONTACT: + Logger.get(context).logImpression(DialerImpression.Type.CREATE_NEW_CONTACT_FROM_DIALPAD); + intent = IntentUtil.getNewContactIntent(query); + DialerUtils.startActivityWithErrorToast(context, intent); + break; + + case Action.MAKE_VILTE_CALL: + CallSpecificAppData callSpecificAppData = + CallSpecificAppData.newBuilder() + .setCallInitiationType(CallInitiationType.Type.DIALPAD) + .setPositionOfSelectedSearchResult(position) + .setCharactersInSearchString(query.length()) + .build(); + intent = new CallIntentBuilder(query, callSpecificAppData).setIsVideoCall(true).build(); + DialerUtils.startActivityWithErrorToast(context, intent); + break; + + case Action.SEND_SMS: + intent = IntentUtil.getSendSmsIntent(query); + DialerUtils.startActivityWithErrorToast(context, intent); + break; + + case Action.INVALID: + default: + throw Assert.createIllegalStateFailException("Invalid action: " + action); + } + } +} diff --git a/java/com/android/dialer/searchfragment/list/SearchAdapter.java b/java/com/android/dialer/searchfragment/list/SearchAdapter.java index f08d60e09..61055a0c1 100644 --- a/java/com/android/dialer/searchfragment/list/SearchAdapter.java +++ b/java/com/android/dialer/searchfragment/list/SearchAdapter.java @@ -40,6 +40,7 @@ import com.android.dialer.searchfragment.list.SearchCursorManager.RowType; import com.android.dialer.searchfragment.nearbyplaces.NearbyPlaceViewHolder; import com.android.dialer.searchfragment.remote.RemoteContactViewHolder; import com.android.dialer.util.DialerUtils; +import java.util.List; /** RecyclerView adapter for {@link NewSearchFragment}. */ @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE) @@ -75,6 +76,9 @@ public final class SearchAdapter extends RecyclerView.Adapter case RowType.DIRECTORY_ROW: return new RemoteContactViewHolder( LayoutInflater.from(activity).inflate(R.layout.search_contact_row, root, false)); + case RowType.SEARCH_ACTION: + return new SearchActionViewHolder( + LayoutInflater.from(activity).inflate(R.layout.search_action_layout, root, false)); case RowType.INVALID: default: throw Assert.createIllegalStateFailException("Invalid RowType: " + rowType); @@ -98,6 +102,9 @@ public final class SearchAdapter extends RecyclerView.Adapter String header = searchCursorManager.getCursor(position).getString(SearchCursor.HEADER_TEXT_POSITION); ((HeaderViewHolder) holder).setHeader(header); + } else if (holder instanceof SearchActionViewHolder) { + ((SearchActionViewHolder) holder) + .setAction(searchCursorManager.getSearchAction(position), position, query); } else { throw Assert.createIllegalStateFailException("Invalid ViewHolder: " + holder); } @@ -124,6 +131,13 @@ public final class SearchAdapter extends RecyclerView.Adapter } } + /** Sets the actions to be shown at the bottom of the search results. */ + void setSearchActions(List actions) { + if (searchCursorManager.setSearchActions(actions)) { + notifyDataSetChanged(); + } + } + void setCallInitiationType(CallInitiationType.Type callInitiationType) { this.callInitiationType = callInitiationType; } diff --git a/java/com/android/dialer/searchfragment/list/SearchCursorManager.java b/java/com/android/dialer/searchfragment/list/SearchCursorManager.java index a303425d3..95bede001 100644 --- a/java/com/android/dialer/searchfragment/list/SearchCursorManager.java +++ b/java/com/android/dialer/searchfragment/list/SearchCursorManager.java @@ -23,16 +23,19 @@ import com.android.dialer.common.Assert; import com.android.dialer.searchfragment.common.SearchCursor; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.ArrayList; +import java.util.List; /** * Manages all of the cursors needed for {@link SearchAdapter}. * - *

This class accepts three cursors: + *

This class accepts four data sources: * *

    *
  • A contacts cursor {@link #setContactsCursor(SearchCursor)} *
  • A google search results cursor {@link #setNearbyPlacesCursor(SearchCursor)} *
  • A work directory cursor {@link #setCorpDirectoryCursor(SearchCursor)} + *
  • A list of action to be performed on a number {@link #setSearchActions(List)} *
* *

The key purpose of this class is to compose three aforementioned cursors together to function @@ -56,7 +59,8 @@ public final class SearchCursorManager { SearchCursorManager.RowType.NEARBY_PLACES_HEADER, SearchCursorManager.RowType.NEARBY_PLACES_ROW, SearchCursorManager.RowType.DIRECTORY_HEADER, - SearchCursorManager.RowType.DIRECTORY_ROW + SearchCursorManager.RowType.DIRECTORY_ROW, + SearchCursorManager.RowType.SEARCH_ACTION }) @interface RowType { int INVALID = 0; @@ -73,11 +77,14 @@ public final class SearchCursorManager { int DIRECTORY_HEADER = 5; /** A row containing contact information for contacts stored externally in corp directories. */ int DIRECTORY_ROW = 6; + /** A row containing a search action */ + int SEARCH_ACTION = 7; } private SearchCursor contactsCursor = null; private SearchCursor nearbyPlacesCursor = null; private SearchCursor corpDirectoryCursor = null; + private List searchActions = new ArrayList<>(); /** Returns true if the cursor changed. */ boolean setContactsCursor(@Nullable SearchCursor cursor) { @@ -149,6 +156,20 @@ public final class SearchCursorManager { return updated; } + /** Sets search actions, returning true if different from existing actions. */ + boolean setSearchActions(List searchActions) { + if (!this.searchActions.equals(searchActions)) { + this.searchActions = searchActions; + return true; + } + return false; + } + + /** Returns {@link SearchActionViewHolder.Action}. */ + int getSearchAction(int position) { + return searchActions.get(position - getCount() + searchActions.size()); + } + /** Returns the sum of counts of all cursors, including headers. */ int getCount() { int count = 0; @@ -164,11 +185,19 @@ public final class SearchCursorManager { count += corpDirectoryCursor.getCount(); } - return count; + return count + searchActions.size(); } @RowType int getRowType(int position) { + int cursorCount = getCount(); + if (position >= cursorCount) { + throw Assert.createIllegalStateFailException( + String.format("Invalid position: %d, cursor count: %d", position, cursorCount)); + } else if (position >= cursorCount - searchActions.size()) { + return RowType.SEARCH_ACTION; + } + SearchCursor cursor = getCursor(position); if (cursor == contactsCursor) { return cursor.isHeader() ? RowType.CONTACT_HEADER : RowType.CONTACT_ROW; diff --git a/java/com/android/dialer/searchfragment/list/res/layout/search_action_layout.xml b/java/com/android/dialer/searchfragment/list/res/layout/search_action_layout.xml new file mode 100644 index 000000000..99d0fbf0c --- /dev/null +++ b/java/com/android/dialer/searchfragment/list/res/layout/search_action_layout.xml @@ -0,0 +1,39 @@ + + + + + + + + \ No newline at end of file diff --git a/java/com/android/dialer/searchfragment/list/res/values/strings.xml b/java/com/android/dialer/searchfragment/list/res/values/strings.xml index 0d25b8c7a..ea238fc92 100644 --- a/java/com/android/dialer/searchfragment/list/res/values/strings.xml +++ b/java/com/android/dialer/searchfragment/list/res/values/strings.xml @@ -17,4 +17,18 @@ To search your contacts, turn on the Contacts permissions. + + + Create new contact + + + Add to a contact + + + Send SMS + + + Make video call -- cgit v1.2.3