Merge "Import translations. DO NOT MERGE" into lmp-dev
diff --git a/res/layout-sw600dp-land/contact_list_content.xml b/res/layout-sw600dp/contact_list_content.xml
similarity index 92%
rename from res/layout-sw600dp-land/contact_list_content.xml
rename to res/layout-sw600dp/contact_list_content.xml
index 7a23430..1b52068 100644
--- a/res/layout-sw600dp-land/contact_list_content.xml
+++ b/res/layout-sw600dp/contact_list_content.xml
@@ -25,18 +25,18 @@
<View
android:layout_width="0dp"
android:layout_height="match_parent"
- android:layout_weight="@integer/people_activity_land_space_layout_weight"
+ android:layout_weight="@integer/people_activity_space_layout_weight"
android:background="@color/background_primary"/>
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:background="@color/contact_all_list_background_color"
- android:layout_weight="@integer/people_activity_land_list_view_layout_weight"
+ android:layout_weight="@integer/people_activity_list_view_layout_weight"
android:elevation="@dimen/people_activity_card_elevation"/>
<View
android:layout_width="0dp"
android:layout_height="match_parent"
- android:layout_weight="@integer/people_activity_land_space_layout_weight"
+ android:layout_weight="@integer/people_activity_space_layout_weight"
android:background="@color/background_primary"/>
</LinearLayout>
<LinearLayout
diff --git a/res/layout-sw600dp-land/contact_tile_list.xml b/res/layout-sw600dp/contact_tile_list.xml
similarity index 90%
rename from res/layout-sw600dp-land/contact_tile_list.xml
rename to res/layout-sw600dp/contact_tile_list.xml
index 5b8200e..102a58d 100644
--- a/res/layout-sw600dp-land/contact_tile_list.xml
+++ b/res/layout-sw600dp/contact_tile_list.xml
@@ -26,18 +26,18 @@
<View
android:layout_width="0dp"
android:layout_height="match_parent"
- android:layout_weight="@integer/people_activity_land_space_layout_weight"
+ android:layout_weight="@integer/people_activity_space_layout_weight"
android:background="@color/background_primary"/>
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:background="@color/contact_favorites_list_background_color"
- android:layout_weight="@integer/people_activity_land_list_view_layout_weight"
+ android:layout_weight="@integer/people_activity_list_view_layout_weight"
android:elevation="@dimen/people_activity_card_elevation"/>
<View
android:layout_width="0dp"
android:layout_height="match_parent"
- android:layout_weight="@integer/people_activity_land_space_layout_weight"
+ android:layout_weight="@integer/people_activity_space_layout_weight"
android:background="@color/background_primary"/>
</LinearLayout>
<FrameLayout
diff --git a/res/layout-sw600dp-land/contacts_unavailable_fragment.xml b/res/layout-sw600dp/contacts_unavailable_fragment.xml
similarity index 87%
rename from res/layout-sw600dp-land/contacts_unavailable_fragment.xml
rename to res/layout-sw600dp/contacts_unavailable_fragment.xml
index eb3e5f2..8727359 100644
--- a/res/layout-sw600dp-land/contacts_unavailable_fragment.xml
+++ b/res/layout-sw600dp/contacts_unavailable_fragment.xml
@@ -26,18 +26,18 @@
<View
android:layout_width="0dp"
android:layout_height="match_parent"
- android:layout_weight="@integer/people_activity_land_space_layout_weight"
+ android:layout_weight="@integer/people_activity_space_layout_weight"
android:background="@color/background_primary"/>
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:background="@color/contact_favorites_list_background_color"
- android:layout_weight="@integer/people_activity_land_list_view_layout_weight"
+ android:layout_weight="@integer/people_activity_list_view_layout_weight"
android:elevation="@dimen/people_activity_card_elevation"/>
<View
android:layout_width="0dp"
android:layout_height="match_parent"
- android:layout_weight="@integer/people_activity_land_space_layout_weight"
+ android:layout_weight="@integer/people_activity_space_layout_weight"
android:background="@color/background_primary"/>
</LinearLayout>
<ScrollView
diff --git a/res/layout/edit_date_picker.xml b/res/layout/edit_date_picker.xml
index ce9a85f..e2c4278 100644
--- a/res/layout/edit_date_picker.xml
+++ b/res/layout/edit_date_picker.xml
@@ -30,5 +30,5 @@
android:layout_marginStart="@dimen/editor_field_left_padding"
android:layout_marginEnd="@dimen/editor_field_right_padding"
android:textAppearance="?android:attr/textAppearanceMedium"
- android:paddingLeft="12dip"
- android:paddingStart="12dip" />
+ android:paddingStart="12dip"
+ android:paddingEnd="@dimen/editor_spinner_end_padding_workaround" />
diff --git a/res/layout/item_group_membership.xml b/res/layout/item_group_membership.xml
index 7f58c2d..fa447bb 100644
--- a/res/layout/item_group_membership.xml
+++ b/res/layout/item_group_membership.xml
@@ -37,7 +37,7 @@
android:textAppearance="?android:attr/textAppearanceMedium"
android:gravity="start|center_vertical"
android:focusable="true"
- android:paddingLeft="12dip"
- android:paddingStart="12dip" />
+ android:paddingStart="12dip"
+ android:paddingEnd="@dimen/editor_spinner_end_padding_workaround"/>
</com.android.contacts.editor.GroupMembershipView>
diff --git a/res/layout/quickcontact_content.xml b/res/layout/quickcontact_content.xml
index 494b93b..5ead702 100644
--- a/res/layout/quickcontact_content.xml
+++ b/res/layout/quickcontact_content.xml
@@ -23,7 +23,7 @@
android:background="@color/card_margin_color">
<!-- All the cards should be inserted into this LinearLayout -->
- <LinearLayout
+ <view class="com.android.contacts.common.widget.ActivityTouchLinearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
@@ -54,6 +54,6 @@
android:visibility="gone"
cardview:cardCornerRadius="@dimen/expanding_entry_card_card_corner_radius" />
- </LinearLayout>
+ </view>
</com.android.contacts.widget.TouchlessScrollView>
\ No newline at end of file
diff --git a/res/values-sw600dp-land/integers.xml b/res/values-sw600dp-land/integers.xml
index bcc008d..4bf44c0 100644
--- a/res/values-sw600dp-land/integers.xml
+++ b/res/values-sw600dp-land/integers.xml
@@ -18,4 +18,11 @@
<integer name="contact_tile_column_count_in_favorites">4</integer>
<integer name="contact_tile_column_count">3</integer>
+
+ <!-- Layout weight of space elements in PeopleActivity for favorites list and all
+ contacts list-->
+ <integer name="people_activity_space_layout_weight">1</integer>
+ <!-- Layout weight of ListViews in PeopleActivityfor tile favorites list and all
+ contacts list in PeopleActivity -->
+ <integer name="people_activity_list_view_layout_weight">3</integer>
</resources>
diff --git a/res/values-sw600dp/bools.xml b/res/values-sw600dp/bools.xml
new file mode 100644
index 0000000..2ef703c
--- /dev/null
+++ b/res/values-sw600dp/bools.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources>
+
+ <bool name="contact_all_list_show_card_frame">true</bool>
+
+</resources>
diff --git a/res/values-sw600dp/integers.xml b/res/values-sw600dp/integers.xml
index c629f7e..ab2a52d 100644
--- a/res/values-sw600dp/integers.xml
+++ b/res/values-sw600dp/integers.xml
@@ -15,4 +15,10 @@
-->
<resources>
<integer name="contact_tile_column_count">2</integer>
+ <!-- Layout weight of space elements in PeopleActivity for favorites list and all
+ contacts list-->
+ <integer name="people_activity_space_layout_weight">1</integer>
+ <!-- Layout weight of ListViews in PeopleActivityfor tile favorites list and all
+ contacts list in PeopleActivity -->
+ <integer name="people_activity_list_view_layout_weight">5</integer>
</resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 6439c1d..52918d5 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -47,6 +47,13 @@
<!-- Left padding of a field in the Editor -->
<dimen name="editor_field_left_padding">4dip</dimen>
+ <!-- End padding added to spinners in the editor. This separates the spinner text from the
+ spinner graphic when Button gravity is incorrectly set in RTL mode
+ (see framework bug b/17011078. In LTR mode this shouldn't have an observable affect.
+ We set paddingEnd instead of drawablePadding since the spinner graphic is not a normal
+ drawable. -->
+ <dimen name="editor_spinner_end_padding_workaround">24dip</dimen>
+
<!-- Width of the Type-Label in the Editor -->
<dimen name="editor_type_label_width">100dip</dimen>
@@ -144,6 +151,8 @@
<dimen name="expanding_entry_card_title_text_size">16sp</dimen>
<!-- Padding for the title text for a ExpandingEntryCardView -->
<dimen name="expanding_entry_card_title_padding">16dp</dimen>
+ <!-- Extra top padding if the title is set to null -->
+ <dimen name="expanding_entry_card_null_title_top_extra_padding">2dp</dimen>
<!-- Height of the separator between entries in an ExpandingEntryCardView -->
<dimen name="expanding_entry_card_item_separator_height">1dp</dimen>
diff --git a/res/values/integers.xml b/res/values/integers.xml
index 3cd5711..0de1de1 100644
--- a/res/values/integers.xml
+++ b/res/values/integers.xml
@@ -24,10 +24,4 @@
<!-- Number of lines the QuickContact title can have -->
<integer name="quickcontact_title_lines">1</integer>
- <!-- Layout weight of space elements in PeopleActivity for favorites list and all
- contacts list when in sw600dp landscape. -->
- <integer name="people_activity_land_space_layout_weight">2</integer>
- <!-- Layout weight of ListViews in PeopleActivityfor tile favorites list and all
- contacts list in PeopleActivity when in sw600dp landscape. -->
- <integer name="people_activity_land_list_view_layout_weight">6</integer>
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 4d07bc7..5f17bcd 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -46,8 +46,8 @@
<!-- Activity title when the user is selecting a contact. [CHAR LIMIT=128] -->
<string name="contactPickerActivityTitle">Choose a contact</string>
- <!-- Activity title when the user is selecting a contact. [CHAR LIMIT=30] -->
- <string name="header_entry_contact_list_adapter_header_title">Select new contact</string>
+ <!-- Entry that prompts user to select a newly created contact. [CHAR LIMIT=30] -->
+ <string name="header_entry_contact_list_adapter_header_title">Create new contact</string>
<!-- Title for the activity that shows only starred contacts -->
<string name="starredList">Starred</string>
diff --git a/src/com/android/contacts/list/ContactTileListFragment.java b/src/com/android/contacts/list/ContactTileListFragment.java
index 622c090..bce7bfe 100644
--- a/src/com/android/contacts/list/ContactTileListFragment.java
+++ b/src/com/android/contacts/list/ContactTileListFragment.java
@@ -97,15 +97,22 @@
mListView.setItemsCanFocus(true);
mListView.setAdapter(mAdapter);
- // If the device is in the sw600dp class and in landscape mode, set a padding on the list
+ // If the device is in the sw600dp class, set a padding on the list
// view so it appears in the center of the card in the layout.
if (mContactAllListShowCardFrame) {
SchedulingUtils.doOnPreDraw(mListView, true, new Runnable() {
@Override
public void run() {
+ Resources res = getResources();
+ int listSpaceWeight = res.getInteger(R.integer
+ .people_activity_space_layout_weight);
+ int listViewWeight = res.getInteger(R.integer
+ .people_activity_list_view_layout_weight);
+ double paddingPercent = (double) listSpaceWeight / (double)
+ (listSpaceWeight * 2 + listViewWeight);
int width = mListView.getWidth();
- mListView.setPadding(width / 4, mListView.getPaddingTop(),
- width / 4, mListView.getPaddingBottom());
+ mListView.setPadding((int) (width * paddingPercent), mListView.getPaddingTop(),
+ (int)(width * paddingPercent), mListView.getPaddingBottom());
}
});
}
diff --git a/src/com/android/contacts/list/HeaderEntryContactListAdapter.java b/src/com/android/contacts/list/HeaderEntryContactListAdapter.java
index 6d6c3c3..a76a4a1 100644
--- a/src/com/android/contacts/list/HeaderEntryContactListAdapter.java
+++ b/src/com/android/contacts/list/HeaderEntryContactListAdapter.java
@@ -81,6 +81,17 @@
}
@Override
+ public boolean isEnabled(int position) {
+ return position < getHeaderEntryCount() || super
+ .isEnabled(position - getHeaderEntryCount());
+ }
+
+ @Override
+ public int getPartitionForPosition(int position) {
+ return super.getPartitionForPosition(position - getHeaderEntryCount());
+ }
+
+ @Override
protected void bindView(View itemView, int partition, Cursor cursor, int position) {
super.bindView(itemView, partition, cursor, position + getHeaderEntryCount());
}
diff --git a/src/com/android/contacts/quickcontact/ExpandingEntryCardView.java b/src/com/android/contacts/quickcontact/ExpandingEntryCardView.java
index a536f8c..7501bb8 100644
--- a/src/com/android/contacts/quickcontact/ExpandingEntryCardView.java
+++ b/src/com/android/contacts/quickcontact/ExpandingEntryCardView.java
@@ -67,7 +67,7 @@
*/
public static final class Entry {
- private final int mViewId;
+ private final int mId;
private final Drawable mIcon;
private final String mHeader;
private final String mSubHeader;
@@ -82,21 +82,21 @@
private final boolean mIsEditable;
private final EntryContextMenuInfo mEntryContextMenuInfo;
- public Entry(int viewId, Drawable icon, String header, String subHeader, String text,
+ public Entry(int id, Drawable icon, String header, String subHeader, String text,
Intent intent, Drawable alternateIcon, Intent alternateIntent,
String alternateContentDescription, boolean shouldApplyColor,
boolean isEditable, EntryContextMenuInfo entryContextMenuInfo) {
- this(viewId, icon, header, subHeader, null, text, null, intent, alternateIcon,
+ this(id, icon, header, subHeader, null, text, null, intent, alternateIcon,
alternateIntent, alternateContentDescription, shouldApplyColor, isEditable,
entryContextMenuInfo);
}
- public Entry(int viewId, Drawable mainIcon, String header, String subHeader,
+ public Entry(int id, Drawable mainIcon, String header, String subHeader,
Drawable subHeaderIcon, String text, Drawable textIcon, Intent intent,
Drawable alternateIcon, Intent alternateIntent, String alternateContentDescription,
boolean shouldApplyColor, boolean isEditable,
EntryContextMenuInfo entryContextMenuInfo) {
- mViewId = viewId;
+ mId = id;
mIcon = mainIcon;
mHeader = header;
mSubHeader = subHeader;
@@ -160,8 +160,8 @@
return mIsEditable;
}
- int getViewId() {
- return mViewId;
+ int getId() {
+ return mId;
}
EntryContextMenuInfo getEntryContextMenuInfo() {
@@ -182,6 +182,10 @@
private OnClickListener mOnClickListener;
private OnCreateContextMenuListener mOnCreateContextMenuListener;
private boolean mIsExpanded = false;
+ /**
+ * The max number of entries to show in a collapsed card. If there are less entries passed in,
+ * then they are all shown.
+ */
private int mCollapsedEntriesCount;
private ExpandingEntryCardViewListener mListener;
private List<List<Entry>> mEntries;
@@ -255,11 +259,6 @@
mEntryViews.add(new ArrayList<View>());
}
mCollapsedEntriesCount = Math.min(numInitialVisibleEntries, mNumEntries);
- // Only show the head of each entry list if the initial visible number falls between the
- // number of lists and the total number of entries
- if (mCollapsedEntriesCount > mEntries.size()) {
- mCollapsedEntriesCount = mEntries.size();
- }
mListener = listener;
mAnimationViewGroup = animationViewGroup;
@@ -321,11 +320,28 @@
}
}
} else {
- for (int i = 0; i < mCollapsedEntriesCount; i++) {
+ // We want to insert mCollapsedEntriesCount entries into the group. extraEntries is the
+ // number of entries that need to be added that are not the head element of a list
+ // to reach mCollapsedEntriesCount.
+ int numInViewGroup = 0;
+ int extraEntries = mCollapsedEntriesCount - mEntryViews.size();
+ for (int i = 0; i < mEntryViews.size() && numInViewGroup < mCollapsedEntriesCount;
+ i++) {
+ List<View> entryViewList = mEntryViews.get(i);
if (i > 0) {
- addSeparator(mEntryViews.get(i).get(0));
+ addSeparator(entryViewList.get(0));
}
- addEntry(mEntryViews.get(i).get(0));
+ addEntry(entryViewList.get(0));
+ numInViewGroup++;
+ // Insert entries in this list to hit mCollapsedEntriesCount.
+ for (int j = 1;
+ j < entryViewList.size() && numInViewGroup < mCollapsedEntriesCount &&
+ extraEntries > 0;
+ j++) {
+ addEntry(entryViewList.get(j));
+ numInViewGroup++;
+ extraEntries--;
+ }
}
}
@@ -337,6 +353,15 @@
}
private void addEntry(View entry) {
+ // If no title and the first entry in the group, add extra padding
+ if (TextUtils.isEmpty(mTitleTextView.getText()) &&
+ mEntriesViewGroup.getChildCount() == 0) {
+ entry.setPadding(entry.getPaddingLeft(),
+ entry.getPaddingTop() + getResources().getDimensionPixelSize(
+ R.dimen.expanding_entry_card_null_title_top_extra_padding),
+ entry.getPaddingRight(),
+ entry.getPaddingBottom());
+ }
mEntriesViewGroup.addView(entry);
}
@@ -392,9 +417,24 @@
inflateAllEntries(layoutInflater);
} else {
// Otherwise inflate the top entry from each list
- for (int i = 0; i < mCollapsedEntriesCount; i++) {
- mEntryViews.get(i).add(createEntryView(layoutInflater, mEntries.get(i).get(0),
+ // extraEntries is used to add extra entries until mCollapsedEntriesCount is reached.
+ int numInflated = 0;
+ int extraEntries = mCollapsedEntriesCount - mEntries.size();
+ for (int i = 0; i < mEntries.size() && numInflated < mCollapsedEntriesCount; i++) {
+ List<Entry> entryList = mEntries.get(i);
+ List<View> entryViewList = mEntryViews.get(i);
+
+ entryViewList.add(createEntryView(layoutInflater, entryList.get(0),
/* showIcon = */ View.VISIBLE));
+ numInflated++;
+ // Inflate entries in this list to hit mCollapsedEntriesCount.
+ for (int j = 1; j < entryList.size() && numInflated < mCollapsedEntriesCount &&
+ extraEntries > 0; j++) {
+ entryViewList.add(createEntryView(layoutInflater, entryList.get(j),
+ /* showIcon = */ View.VISIBLE));
+ numInflated++;
+ extraEntries--;
+ }
}
}
}
@@ -491,7 +531,6 @@
R.layout.expanding_entry_card_item, this, false);
view.setContextMenuInfo(entry.getEntryContextMenuInfo());
- view.setId(entry.getViewId());
final ImageView icon = (ImageView) view.findViewById(R.id.icon);
icon.setVisibility(iconVisibility);
@@ -535,7 +574,7 @@
if (entry.getIntent() != null) {
view.setOnClickListener(mOnClickListener);
- view.setTag(entry.getIntent());
+ view.setTag(new EntryTag(entry.getId(), entry.getIntent()));
}
// If only the header is visible, add a top margin to match icon's top margin.
@@ -555,8 +594,7 @@
if (entry.getAlternateIcon() != null && entry.getAlternateIntent() != null) {
alternateIcon.setImageDrawable(entry.getAlternateIcon());
alternateIcon.setOnClickListener(mOnClickListener);
- alternateIcon.setTag(entry.getAlternateIntent());
- alternateIcon.setId(entry.getViewId());
+ alternateIcon.setTag(new EntryTag(entry.getId(), entry.getAlternateIntent()));
alternateIcon.setVisibility(View.VISIBLE);
alternateIcon.setContentDescription(entry.getAlternateContentDescription());
@@ -757,13 +795,30 @@
if (mTitleTextView == null) {
Log.e(TAG, "mTitleTextView is null");
}
- if (title == null) {
- mTitleTextView.setVisibility(View.GONE);
- findViewById(R.id.title_separator).setVisibility(View.GONE);
- }
mTitleTextView.setText(title);
- mTitleTextView.setVisibility(View.VISIBLE);
- findViewById(R.id.title_separator).setVisibility(View.VISIBLE);
+ mTitleTextView.setVisibility(TextUtils.isEmpty(title) ? View.GONE : View.VISIBLE);
+ findViewById(R.id.title_separator).setVisibility(TextUtils.isEmpty(title) ?
+ View.GONE : View.VISIBLE);
+ // If the title is set after children have been added, reset the top entry's padding to
+ // the default. Else if the title is cleared after children have been added, set
+ // the extra top padding
+ if (!TextUtils.isEmpty(title) && mEntriesViewGroup.getChildCount() > 0) {
+ View firstEntry = mEntriesViewGroup.getChildAt(0);
+ firstEntry.setPadding(firstEntry.getPaddingLeft(),
+ getResources().getDimensionPixelSize(
+ R.dimen.expanding_entry_card_item_padding_top),
+ firstEntry.getPaddingRight(),
+ firstEntry.getPaddingBottom());
+ } else if (!TextUtils.isEmpty(title) && mEntriesViewGroup.getChildCount() > 0) {
+ View firstEntry = mEntriesViewGroup.getChildAt(0);
+ firstEntry.setPadding(firstEntry.getPaddingLeft(),
+ getResources().getDimensionPixelSize(
+ R.dimen.expanding_entry_card_item_padding_top) +
+ getResources().getDimensionPixelSize(
+ R.dimen.expanding_entry_card_null_title_top_extra_padding),
+ firstEntry.getPaddingRight(),
+ firstEntry.getPaddingBottom());
+ }
}
public boolean shouldShow() {
@@ -808,4 +863,22 @@
return mCopyLabel;
}
}
+
+ static final class EntryTag {
+ private final int mId;
+ private final Intent mIntent;
+
+ public EntryTag(int id, Intent intent) {
+ mId = id;
+ mIntent = intent;
+ }
+
+ public int getId() {
+ return mId;
+ }
+
+ public Intent getIntent() {
+ return mIntent;
+ }
+ }
}
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index f5d4951..357cae6 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -16,9 +16,6 @@
package com.android.contacts.quickcontact;
-import android.animation.Animator;
-import android.animation.Animator.AnimatorListener;
-import android.animation.AnimatorListenerAdapter;
import android.animation.ArgbEvaluator;
import android.animation.ObjectAnimator;
import android.app.Activity;
@@ -34,6 +31,7 @@
import android.content.pm.ResolveInfo;
import android.graphics.Bitmap;
import android.graphics.Color;
+import android.graphics.Point;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.BitmapDrawable;
@@ -67,6 +65,7 @@
import android.provider.ContactsContract.QuickContact;
import android.provider.ContactsContract.RawContacts;
import android.support.v7.graphics.Palette;
+import android.telecomm.TelecommManager;
import android.text.TextUtils;
import android.util.Log;
import android.util.Pair;
@@ -80,7 +79,6 @@
import android.view.View.OnCreateContextMenuListener;
import android.view.WindowManager;
import android.widget.ImageView;
-import android.widget.LinearLayout;
import android.widget.Toast;
import android.widget.Toolbar;
@@ -93,6 +91,7 @@
import com.android.contacts.common.Collapser;
import com.android.contacts.common.ContactsUtils;
import com.android.contacts.common.editor.SelectAccountDialogFragment;
+import com.android.contacts.common.interactions.TouchPointManager;
import com.android.contacts.common.lettertiles.LetterTileDrawable;
import com.android.contacts.common.list.ShortcutIntentBuilder;
import com.android.contacts.common.list.ShortcutIntentBuilder.OnShortcutIntentCreatedListener;
@@ -128,6 +127,7 @@
import com.android.contacts.interactions.SmsInteractionsLoader;
import com.android.contacts.quickcontact.ExpandingEntryCardView.Entry;
import com.android.contacts.quickcontact.ExpandingEntryCardView.EntryContextMenuInfo;
+import com.android.contacts.quickcontact.ExpandingEntryCardView.EntryTag;
import com.android.contacts.quickcontact.ExpandingEntryCardView.ExpandingEntryCardViewListener;
import com.android.contacts.util.ImageViewDrawableSetter;
import com.android.contacts.util.PhoneCapabilityTester;
@@ -135,6 +135,7 @@
import com.android.contacts.util.StructuredPostalUtils;
import com.android.contacts.widget.MultiShrinkScroller;
import com.android.contacts.widget.MultiShrinkScroller.MultiShrinkScrollerListener;
+
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
@@ -212,9 +213,15 @@
private SelectAccountDialogFragmentListener mSelectAccountFragmentListener;
private AsyncTask<Void, Void, Pair<List<List<DataItem>>, Map<String, List<DataItem>>>>
mEntriesAndActionsTask;
+ /**
+ * This scrim's opacity is controlled in two different ways. 1) Before the initial entrance
+ * animation finishes, the opacity is animated by a value animator. This is designed to
+ * distract the user from the length of the initial loading time. 2) After the initial
+ * entrance animation, the opacity is directly related to scroll position.
+ */
private ColorDrawable mWindowScrim;
+ private boolean mIsEntranceAnimationFinished;
private MaterialColorMapUtils mMaterialColorMapUtils;
- private boolean mIsWaitingForOtherPieceOfExitAnimation;
private boolean mIsExitAnimationInProgress;
private boolean mHasComputedThemeColor;
@@ -287,18 +294,19 @@
final OnClickListener mEntryClickHandler = new OnClickListener() {
@Override
public void onClick(View v) {
- // Data Id is stored as the entry view id
- final int dataId = v.getId();
+ final Object entryTagObject = v.getTag();
+ if (entryTagObject == null || !(entryTagObject instanceof EntryTag)) {
+ Log.w(TAG, "EntryTag was not used correctly");
+ return;
+ }
+ final EntryTag entryTag = (EntryTag) entryTagObject;
+ final Intent intent = entryTag.getIntent();
+ final int dataId = entryTag.getId();
+
if (dataId == CARD_ENTRY_ID_EDIT_CONTACT) {
editContact();
return;
}
- final Object intentObject = v.getTag();
- if (intentObject == null || !(intentObject instanceof Intent)) {
- Log.w(TAG, "Intent tag was not used correctly");
- return;
- }
- final Intent intent = (Intent) intentObject;
// Default to USAGE_TYPE_CALL. Usage is summed among all types for sorting each data id
// so the exact usage type is not necessary in all cases
@@ -326,6 +334,17 @@
Log.w(TAG, "Invalid Data ID");
}
+ // Pass the touch point through the intent for use in the InCallUI
+ if (Intent.ACTION_CALL.equals(intent.getAction())) {
+ final Point touchPoint = TouchPointManager.getInstance().getPoint();
+
+ if (touchPoint.x != 0 || touchPoint.y != 0) {
+ Bundle extras = new Bundle();
+ extras.putParcelable(TouchPointManager.TOUCH_POINT, touchPoint);
+ intent.putExtra(TelecommManager.EXTRA_OUTGOING_CALL_EXTRAS, extras);
+ }
+ }
+
startActivity(intent);
}
};
@@ -404,11 +423,7 @@
= new MultiShrinkScrollerListener() {
@Override
public void onScrolledOffBottom() {
- if (!mIsWaitingForOtherPieceOfExitAnimation) {
- finish();
- return;
- }
- mIsWaitingForOtherPieceOfExitAnimation = false;
+ finish();
}
@Override
@@ -423,24 +438,19 @@
@Override
public void onStartScrollOffBottom() {
- // Remove the window shim now that we are starting an Activity exit animation.
- final int duration = getResources().getInteger(android.R.integer.config_shortAnimTime);
- final ObjectAnimator animator = ObjectAnimator.ofInt(mWindowScrim, "alpha", 0xFF, 0);
- animator.addListener(mExitWindowShimAnimationListener);
- animator.setDuration(duration).start();
- mIsWaitingForOtherPieceOfExitAnimation = true;
mIsExitAnimationInProgress = true;
}
- };
- final AnimatorListener mExitWindowShimAnimationListener = new AnimatorListenerAdapter() {
@Override
- public void onAnimationEnd(Animator animation) {
- if (!mIsWaitingForOtherPieceOfExitAnimation) {
- finish();
- return;
+ public void onEntranceAnimationDone() {
+ mIsEntranceAnimationFinished = true;
+ }
+
+ @Override
+ public void onTransparentViewHeightChange(float ratio) {
+ if (mIsEntranceAnimationFinished) {
+ mWindowScrim.setAlpha((int) (0xFF * ratio));
}
- mIsWaitingForOtherPieceOfExitAnimation = false;
}
};
@@ -582,13 +592,10 @@
toolbar.addView(getLayoutInflater().inflate(R.layout.quickcontact_title_placeholder, null));
mHasAlreadyBeenOpened = savedInstanceState != null;
-
+ mIsEntranceAnimationFinished = mHasAlreadyBeenOpened;
mWindowScrim = new ColorDrawable(SCRIM_COLOR);
+ mWindowScrim.setAlpha(0);
getWindow().setBackgroundDrawable(mWindowScrim);
- if (!mHasAlreadyBeenOpened) {
- final int duration = getResources().getInteger(android.R.integer.config_shortAnimTime);
- ObjectAnimator.ofInt(mWindowScrim, "alpha", 0, 0xFF).setDuration(duration).start();
- }
mScroller.initialize(mMultiShrinkScrollerListener, mExtraMode == MODE_FULLY_EXPANDED);
// mScroller needs to perform asynchronous measurements after initalize(), therefore
@@ -607,6 +614,26 @@
}
mSelectAccountFragmentListener.setQuickContactActivity(this);
+ SchedulingUtils.doOnPreDraw(mScroller, /* drawNextFrame = */ true,
+ new Runnable() {
+ @Override
+ public void run() {
+ if (!mHasAlreadyBeenOpened) {
+ // The initial scrim opacity must match the scrim opacity that would be
+ // achieved by scrolling to the starting position.
+ final float alphaRatio = mExtraMode == MODE_FULLY_EXPANDED ?
+ 1 : mScroller.getStartingTransparentHeightRatio();
+ final int duration = getResources().getInteger(
+ android.R.integer.config_shortAnimTime);
+ final int desiredAlpha = (int) (0xFF * alphaRatio);
+ ObjectAnimator o = ObjectAnimator.ofInt(mWindowScrim, "alpha", 0,
+ desiredAlpha).setDuration(duration);
+
+ o.start();
+ }
+ }
+ });
+
if (savedInstanceState != null) {
final int color = savedInstanceState.getInt(KEY_THEME_COLOR, 0);
SchedulingUtils.doOnPreDraw(mScroller, /* drawNextFrame = */ false,
@@ -646,6 +673,7 @@
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
mHasAlreadyBeenOpened = true;
+ mIsEntranceAnimationFinished = true;
mHasComputedThemeColor = false;
processIntent(intent);
}
@@ -1141,6 +1169,7 @@
event.getLabel()).toString();
}
text = DateUtils.formatDate(this, dataString);
+ entryContextMenuInfo = new EntryContextMenuInfo(text, header);
} else if (dataItem instanceof RelationDataItem) {
final RelationDataItem relation = (RelationDataItem) dataItem;
final String dataString = relation.buildDataString(this, kind);
@@ -1309,6 +1338,7 @@
return null;
}
+ // Ignore dataIds from the Me profile.
final int dataId = dataItem.getId() > Integer.MAX_VALUE ?
-1 : (int) dataItem.getId();
diff --git a/src/com/android/contacts/widget/MultiShrinkScroller.java b/src/com/android/contacts/widget/MultiShrinkScroller.java
index ff84b2f..82b3970 100644
--- a/src/com/android/contacts/widget/MultiShrinkScroller.java
+++ b/src/com/android/contacts/widget/MultiShrinkScroller.java
@@ -9,6 +9,8 @@
import android.animation.Animator.AnimatorListener;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
+import android.animation.ValueAnimator;
+import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.TypedArray;
@@ -163,6 +165,10 @@
void onStartScrollOffBottom();
+ void onTransparentViewHeightChange(float ratio);
+
+ void onEntranceAnimationDone();
+
void onEnterFullscreen();
void onExitFullscreen();
@@ -560,6 +566,19 @@
}
}
+ /**
+ * Return ratio of non-transparent:viewgroup-height for this viewgroup at the starting position.
+ */
+ public float getStartingTransparentHeightRatio() {
+ return getTransparentHeightRatio(mTransparentStartHeight);
+ }
+
+ private float getTransparentHeightRatio(int transparentHeight) {
+ final float heightRatio = (float) transparentHeight / getHeight();
+ // Clamp between [0, 1] in case this is called before height is initialized.
+ return 1.0f - Math.max(Math.min(1.0f, heightRatio), 0f);
+ }
+
public void scrollOffBottom() {
final Interpolator interpolator = new AcceleratingFlingInterpolator(
EXIT_FLING_ANIMATION_DURATION_MS, getCurrentVelocity(),
@@ -588,10 +607,19 @@
- (getHeight() - getTransparentViewHeight()) + 1;
final Interpolator interpolator = AnimationUtils.loadInterpolator(getContext(),
android.R.interpolator.linear_out_slow_in);
+ final int desiredValue = currentPosition + (scrollToCurrentPosition ? currentPosition
+ : getTransparentViewHeight());
final ObjectAnimator animator = ObjectAnimator.ofInt(this, "scroll", bottomScrollPosition,
- currentPosition + (scrollToCurrentPosition ? currentPosition
- : getTransparentViewHeight()));
+ desiredValue);
animator.setInterpolator(interpolator);
+ animator.addUpdateListener(new AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ if (animation.getAnimatedValue().equals(desiredValue) && mListener != null) {
+ mListener.onEntranceAnimationDone();
+ }
+ }
+ });
animator.start();
}
@@ -614,6 +642,10 @@
} else if (!wasFullscreen && isFullscreen) {
mListener.onEnterFullscreen();
}
+ if (!isFullscreen || !wasFullscreen) {
+ mListener.onTransparentViewHeightChange(
+ getTransparentHeightRatio(getTransparentViewHeight()));
+ }
}
}
@@ -954,10 +986,14 @@
// How offset the title should be from the bottom of the toolbar
final int pretendBottomMargin = (int) (mCollapsedTitleBottomMargin * (1 - x)
+ mMaximumTitleMargin * x) ;
- // Calculate how offset the title should be from the top of the screen.
+ // Calculate how offset the title should be from the top of the screen. Instead of
+ // calling mLargeTextView.getHeight() use the mMaximumHeaderTextSize for this calculation.
+ // The getHeight() value acts unexpectedly when mLargeTextView is partially clipped by
+ // its parent.
titleLayoutParams.topMargin = getTransparentViewHeight()
+ toolbarLayoutParams.height - pretendBottomMargin
- - mLargeTextView.getHeight();
+ - mMaximumHeaderTextSize;
+ titleLayoutParams.bottomMargin = 0;
mLargeTextView.setLayoutParams(titleLayoutParams);
}