blob: 2129981c037026b92de4636dd2518744b3f65691 [file] [log] [blame]
/*
* 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.Log;
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.GeoUtil;
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.logging.Logger;
import com.android.dialer.logging.nano.InteractionEvent;
public class BlockedListSearchFragment extends RegularSearchFragment
implements BlockNumberDialogFragment.Callback {
private static final String TAG = BlockedListSearchFragment.class.getSimpleName();
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:
Log.w(TAG, "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() {
Log.wtf(TAG, "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);
}
}