summaryrefslogtreecommitdiff
path: root/src/com/android/dialer/dialpad/NewDialpadFragment.java
diff options
context:
space:
mode:
authorYorke Lee <yorkelee@google.com>2013-06-26 18:24:32 -0700
committerYorke Lee <yorkelee@google.com>2013-07-16 12:28:32 -0700
commitdfb2eee7d98f8540fd1614db66bb03e8e1f3a26a (patch)
treea33447c38bbfa4a055e78c909176dde351b419d9 /src/com/android/dialer/dialpad/NewDialpadFragment.java
parent6b049128c51b90e17ae14856d98130a22d3a5433 (diff)
Initial commit of all new dialer activities, layouts and styles
As far as possible, this change does not modify any behavior/look of the existing dialer. All modifications to classes/layouts/style attributes that would affect functionality of the old dialer are instead done in separate new files. Added new versions of all activities, fragments, layouts, menus and resources that have been rewritten or modified. The activities do not have intent filters yet in order to not interfere with the existing dialer. Added some new values in colors/styles/dimens for the newly added layouts. Added NewCallLogActivity to separate the CallLogFragment from DialtactsActivity. All call log and voicemail entries are now presented in a separate (New)CallLogActivity. IntentProvider.getCallDetailIntent now takes a cursor instead of an adapter for more flexibility. Add OnListFragmentScrolledListener interface for DialtactsActivity to receive callback when one of its children fragment is scrolled. Added slide in and slide out animations for DialpadFragment. Add slide up and hide animations for search view All menu options now show up in a PopupMenu in NewPhoneFavoriteFragment. Added call log adapter into NewPhoneFavoriteMergedAdapter. Rewrote layout of DialpadFragment to show up as a fragment partially overlaying the screen. Removed some unused code in DialpadFragment (smart dialing, menu handling) Add fragments and adapters for SmartDial. - Update Dialer database to support highlight masking and record contact data Uri, as well as photo uri - Add a fragment and adapter for smart dialing - Add SmartDialCursorLoader to load SmartDial results. - Typing in the dialpad now returns smart dialing results instead of regular search results QuickContactTiles for all sub-adapters of PhoneFavoriteMergedAdapter now use light theme instead of the the default dark theme. Removed all redundant call log filter and contacts to display filter code Moved Dialer specific UI list-related classes to the Dialer package Change-Id: I34885813e4fa79b69e29ac870a87a56d6f08a5e7
Diffstat (limited to 'src/com/android/dialer/dialpad/NewDialpadFragment.java')
-rw-r--r--src/com/android/dialer/dialpad/NewDialpadFragment.java238
1 files changed, 87 insertions, 151 deletions
diff --git a/src/com/android/dialer/dialpad/NewDialpadFragment.java b/src/com/android/dialer/dialpad/NewDialpadFragment.java
index 707651726..46f5d06cb 100644
--- a/src/com/android/dialer/dialpad/NewDialpadFragment.java
+++ b/src/com/android/dialer/dialpad/NewDialpadFragment.java
@@ -32,7 +32,6 @@ import android.graphics.BitmapFactory;
import android.media.AudioManager;
import android.media.ToneGenerator;
import android.net.Uri;
-import android.os.AsyncTask;
import android.os.Bundle;
import android.os.RemoteException;
import android.os.ServiceManager;
@@ -50,6 +49,7 @@ import android.text.SpannableString;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.text.style.RelativeSizeSpan;
+import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.KeyEvent;
@@ -60,13 +60,15 @@ import android.view.MenuItem;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
+import android.view.ViewTreeObserver.OnPreDrawListener;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ImageView;
+import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.PopupMenu;
-import android.widget.RelativeLayout;
import android.widget.TextView;
import com.android.contacts.common.CallUtil;
@@ -76,6 +78,8 @@ import com.android.contacts.common.preference.ContactsPreferences;
import com.android.contacts.common.util.PhoneNumberFormatter;
import com.android.contacts.common.util.StopWatch;
import com.android.dialer.DialtactsActivity;
+import com.android.dialer.NeededForReflection;
+import com.android.dialer.NewDialtactsActivity;
import com.android.dialer.R;
import com.android.dialer.SpecialCharSequenceMgr;
import com.android.dialer.database.DialerDatabaseHelper;
@@ -86,8 +90,6 @@ import com.android.phone.common.CallLogAsync;
import com.android.phone.common.HapticFeedback;
import com.google.common.annotations.VisibleForTesting;
-import java.util.List;
-
/**
* Fragment that displays a twelve-key phone dialpad.
*/
@@ -96,10 +98,42 @@ public class NewDialpadFragment extends Fragment
View.OnLongClickListener, View.OnKeyListener,
AdapterView.OnItemClickListener, TextWatcher,
PopupMenu.OnMenuItemClickListener,
- DialpadImageButton.OnPressedListener,
- SmartDialLoaderTask.SmartDialLoaderCallback {
+ DialpadImageButton.OnPressedListener {
private static final String TAG = NewDialpadFragment.class.getSimpleName();
+ /**
+ * LinearLayout with getter and setter methods for the translationY property using floats,
+ * for animation purposes.
+ */
+ public static class DialpadSlidingLinearLayout extends LinearLayout {
+
+ public DialpadSlidingLinearLayout(Context context) {
+ super(context);
+ }
+
+ public DialpadSlidingLinearLayout(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public DialpadSlidingLinearLayout(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ @NeededForReflection
+ public float getYFraction() {
+ return getTranslationY() / getHeight();
+ }
+
+ @NeededForReflection
+ public void setYFraction(float yFraction) {
+ setTranslationY(yFraction * getHeight());
+ }
+ }
+
+ public interface OnDialpadQueryChangedListener {
+ void onDialpadQueryChanged(String query);
+ }
+
private static final boolean DEBUG = DialtactsActivity.DEBUG;
private static final String EMPTY_NUMBER = "";
@@ -118,6 +152,10 @@ public class NewDialpadFragment extends Fragment
private ContactsPreferences mContactsPrefs;
+ private OnDialpadQueryChangedListener mDialpadQueryListener;
+
+ private View mFragmentView;
+
/**
* View (usually FrameLayout) containing mDigits field. This can be null, in which mDigits
* isn't enclosed by the container.
@@ -145,25 +183,6 @@ public class NewDialpadFragment extends Fragment
private ListView mDialpadChooser;
private DialpadChooserAdapter mDialpadChooserAdapter;
- /** Will be set only if the view has the smart dialing section. */
- private RelativeLayout mSmartDialContainer;
-
- /**
- * Will be set only if the view has the smart dialing section.
- */
- private SmartDialController mSmartDialAdapter;
-
- /**
- * Use latin character map by default
- */
- private SmartDialMap mSmartDialMap = new LatinSmartDialMap();
-
- /**
- * Master switch controlling whether or not smart dialing is enabled, and whether the
- * smart dialing suggestion strip is visible.
- */
- private boolean mSmartDialEnabled = false;
-
private DialerDatabaseHelper mDialerDatabaseHelper;
/**
@@ -287,8 +306,10 @@ public class NewDialpadFragment extends Fragment
mDigits.setCursorVisible(false);
}
+ if (mDialpadQueryListener != null) {
+ mDialpadQueryListener.onDialpadQueryChanged(mDigits.getText().toString());
+ }
updateDialAndDeleteButtonEnabledState();
- loadSmartDialEntries();
}
@Override
@@ -308,8 +329,6 @@ public class NewDialpadFragment extends Fragment
Log.e(TAG, "Vibrate control bool missing.", nfe);
}
- setHasOptionsMenu(true);
-
mProhibitedPhoneNumberRegexp = getResources().getString(
R.string.config_prohibited_phone_number_regexp);
@@ -320,7 +339,29 @@ public class NewDialpadFragment extends Fragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
- View fragmentView = inflater.inflate(R.layout.dialpad_fragment, container, false);
+ View fragmentView = inflater.inflate(R.layout.new_dialpad_fragment, container, false);
+ mFragmentView = fragmentView;
+ mFragmentView.buildLayer();
+
+ // TODO krelease: Get rid of this ugly hack which is to prevent the first frame of the
+ // animation from drawing the fragment at translationY = 0
+ final ViewTreeObserver vto = mFragmentView.getViewTreeObserver();
+ final OnPreDrawListener preDrawListener = new OnPreDrawListener() {
+
+ @Override
+ public boolean onPreDraw() {
+ if (isHidden()) return true;
+ if (mFragmentView.getTranslationY() == 0) {
+ ((DialpadSlidingLinearLayout) mFragmentView).setYFraction(0.67f);
+ }
+ final ViewTreeObserver vto = mFragmentView.getViewTreeObserver();
+ vto.removeOnPreDrawListener(this);
+ return true;
+ }
+
+ };
+
+ vto.addOnPreDrawListener(preDrawListener);
// Load up the resources for the text field.
Resources r = getResources();
@@ -379,15 +420,6 @@ public class NewDialpadFragment extends Fragment
mDialpadChooser = (ListView) fragmentView.findViewById(R.id.dialpadChooser);
mDialpadChooser.setOnItemClickListener(this);
- // Smart dial container. This is null if in landscape mode since it is not present
- // in the landscape dialer layout.
- mSmartDialContainer = (RelativeLayout) fragmentView.findViewById(
- R.id.dialpad_smartdial_container);
-
- if (mSmartDialContainer != null) {
- mSmartDialAdapter = new SmartDialController(getActivity(), mSmartDialContainer,
- new OnSmartDialShortClick(), new OnSmartDialLongClick());
- }
return fragmentView;
}
@@ -560,6 +592,9 @@ public class NewDialpadFragment extends Fragment
public void onResume() {
super.onResume();
+ final NewDialtactsActivity activity = (NewDialtactsActivity) getActivity();
+ mDialpadQueryListener = activity;
+
final StopWatch stopWatch = StopWatch.start("Dialpad.onResume");
// Query the last dialed number. Do it first because hitting
@@ -574,10 +609,6 @@ public class NewDialpadFragment extends Fragment
mDTMFToneEnabled = Settings.System.getInt(contentResolver,
Settings.System.DTMF_TONE_WHEN_DIALING, 1) == 1;
- // retrieve dialpad autocomplete setting
- mSmartDialEnabled = Settings.Secure.getInt(contentResolver,
- Settings.Secure.DIALPAD_AUTOCOMPLETE, 0) == 1 && mSmartDialContainer != null;
-
stopWatch.lap("dtwd");
// Retrieve the haptic feedback setting.
@@ -678,6 +709,7 @@ public class NewDialpadFragment extends Fragment
@Override
public void onStop() {
super.onStop();
+
if (mClearDigitsOnStop) {
mClearDigitsOnStop = false;
mDigits.getText().clear();
@@ -690,28 +722,6 @@ public class NewDialpadFragment extends Fragment
outState.putBoolean(PREF_DIGITS_FILLED_BY_INTENT, mDigitsFilledByIntent);
}
- @Override
- public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
- super.onCreateOptionsMenu(menu, inflater);
- // Landscape dialer uses the real actionbar menu, whereas portrait uses a fake one
- // that is created using constructPopupMenu()
- if (OrientationUtil.isLandscape(this.getActivity()) ||
- ViewConfiguration.get(getActivity()).hasPermanentMenuKey() &&
- isLayoutReady() && mDialpadChooser != null) {
- inflater.inflate(R.menu.dialpad_options, menu);
- }
- }
-
- @Override
- public void onPrepareOptionsMenu(Menu menu) {
- // Hardware menu key should be available and Views should already be ready.
- if (OrientationUtil.isLandscape(this.getActivity()) ||
- ViewConfiguration.get(getActivity()).hasPermanentMenuKey() &&
- isLayoutReady() && mDialpadChooser != null) {
- setupMenuItems(menu);
- }
- }
-
private void setupMenuItems(Menu menu) {
final MenuItem callSettingsMenuItem = menu.findItem(R.id.menu_call_settings_dialpad);
final MenuItem addToContactMenuItem = menu.findItem(R.id.menu_add_contacts);
@@ -1481,24 +1491,6 @@ public class NewDialpadFragment extends Fragment
return getTelephonyManager().getCallState() == TelephonyManager.CALL_STATE_OFFHOOK;
}
- /**
- * Returns true whenever any one of the options from the menu is selected.
- * Code changes to support dialpad options
- */
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.menu_2s_pause:
- updateDialString(PAUSE);
- return true;
- case R.id.menu_add_wait:
- updateDialString(WAIT);
- return true;
- default:
- return false;
- }
- }
-
@Override
public boolean onMenuItemClick(MenuItem item) {
return onOptionsItemSelected(item);
@@ -1507,6 +1499,7 @@ public class NewDialpadFragment extends Fragment
/**
* Updates the dial string (mDigits) after inserting a Pause character (,)
* or Wait character (;).
+ * TODO krelease: add new dialpad buttons to add PAUSE and WAIT characters
*/
private void updateDialString(char newDigit) {
if(newDigit != WAIT && newDigit != PAUSE) {
@@ -1654,79 +1647,22 @@ public class NewDialpadFragment extends Fragment
return intent;
}
- private String mLastDigitsForSmartDial;
-
- private void loadSmartDialEntries() {
- if (!mSmartDialEnabled || mSmartDialAdapter == null) {
- // No smart dial views. Landscape?
- return;
- }
-
- // Update only when the digits have changed.
- final String digits = SmartDialNameMatcher.normalizeNumber(mDigits.getText().toString(),
- mSmartDialMap);
- if (TextUtils.equals(digits, mLastDigitsForSmartDial)) {
- return;
- }
- mLastDigitsForSmartDial = digits;
-
- if (digits.length() < 1) {
- mSmartDialAdapter.clear();
- } else {
- final SmartDialLoaderTask task = new SmartDialLoaderTask(this, digits, getActivity());
- task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, new String[] {});
- }
- }
-
- @Override
- public void setSmartDialAdapterEntries(List<SmartDialEntry> data, String query) {
- if (data == null || query == null || !query.equals(mLastDigitsForSmartDial)) {
- return;
- }
- mSmartDialAdapter.setEntries(data);
- }
-
private void initializeSmartDialingState() {
// Handle smart dialing related state
- if (mSmartDialEnabled) {
- mSmartDialContainer.setVisibility(View.VISIBLE);
-
- if (DEBUG) {
- Log.w(TAG, "Creating smart dial database");
- }
- mDialerDatabaseHelper.startSmartDialUpdateThread();
- } else {
- if (mSmartDialContainer != null) {
- mSmartDialContainer.setVisibility(View.GONE);
- }
- }
- }
-
- private class OnSmartDialLongClick implements View.OnLongClickListener {
- @Override
- public boolean onLongClick(View view) {
- final SmartDialEntry entry = (SmartDialEntry) view.getTag();
- if (entry == null) return false; // just in case.
- mClearDigitsOnStop = true;
- // Show the phone number disambiguation dialog without using the primary
- // phone number so that the user can decide which number to call
- PhoneNumberInteraction.startInteractionForPhoneCall(
- (TransactionSafeActivity) getActivity(), entry.contactUri, false);
- return true;
- }
+ // TODO krelease: This should probably be moved to somewhere more appropriate, maybe
+ // into DialtactsActivity
+ mDialerDatabaseHelper.startSmartDialUpdateThread();
}
- private class OnSmartDialShortClick implements View.OnClickListener {
- @Override
- public void onClick(View view) {
- final SmartDialEntry entry = (SmartDialEntry) view.getTag();
- if (entry == null) return; // just in case.
- // Dial the displayed phone number immediately
- final Intent intent = CallUtil.getCallIntent(entry.phoneNumber.toString(),
- (getActivity() instanceof DialtactsActivity ?
- ((DialtactsActivity) getActivity()).getCallOrigin() : null));
- startActivity(intent);
- mClearDigitsOnStop = true;
+ @Override
+ public void onHiddenChanged(boolean hidden) {
+ super.onHiddenChanged(hidden);
+ final NewDialtactsActivity activity = (NewDialtactsActivity) getActivity();
+ if (activity == null) return;
+ if (hidden) {
+ activity.showSearchBar();
+ } else {
+ activity.hideSearchBar();
}
}
}