summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/widget/FasttrackBadgeWidget.java253
-rw-r--r--core/res/res/drawable/fasttrack_badge_middle_large.xml (renamed from core/res/res/drawable/fasttrack_badge_middle.xml)4
-rw-r--r--core/res/res/drawable/fasttrack_badge_middle_large_normal.9.pngbin0 -> 612 bytes
-rw-r--r--core/res/res/drawable/fasttrack_badge_middle_large_pressed.9.pngbin0 -> 834 bytes
-rw-r--r--core/res/res/drawable/fasttrack_badge_middle_normal.9.pngbin606 -> 0 bytes
-rw-r--r--core/res/res/drawable/fasttrack_badge_middle_pressed.9.pngbin818 -> 0 bytes
-rw-r--r--core/res/res/layout/contact_header.xml6
-rw-r--r--core/res/res/values/attrs.xml16
-rw-r--r--core/res/res/values/styles.xml20
-rw-r--r--core/res/res/values/themes.xml3
10 files changed, 297 insertions, 5 deletions
diff --git a/core/java/android/widget/FasttrackBadgeWidget.java b/core/java/android/widget/FasttrackBadgeWidget.java
new file mode 100644
index 000000000000..22ca5fd7856a
--- /dev/null
+++ b/core/java/android/widget/FasttrackBadgeWidget.java
@@ -0,0 +1,253 @@
+/*
+ * Copyright (C) 2009 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 android.widget;
+
+import android.content.AsyncQueryHandler;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.TypedArray;
+import android.database.Cursor;
+import android.graphics.Rect;
+import android.net.Uri;
+import android.provider.ContactsContract.Contacts;
+import android.provider.ContactsContract.Intents;
+import android.provider.ContactsContract.PhoneLookup;
+import android.provider.ContactsContract.RawContacts;
+import android.provider.ContactsContract.CommonDataKinds.Email;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.ImageView;
+
+/**
+ * Widget used to show an image with the standard fasttrack badge
+ * and on-click behavior.
+ *
+ * @hide
+ */
+public class FasttrackBadgeWidget extends ImageView implements OnClickListener {
+
+ private Uri mContactUri;
+ private String mContactEmail;
+ private String mContactPhone;
+ private int mMode;
+ private QueryHandler mQueryHandler;
+
+ protected String[] mExcludeMimes = null;
+
+ static final private int TOKEN_EMAIL_LOOKUP = 0;
+ static final private int TOKEN_PHONE_LOOKUP = 1;
+ static final private int TOKEN_EMAIL_LOOKUP_AND_TRIGGER = 2;
+ static final private int TOKEN_PHONE_LOOKUP_AND_TRIGGER = 3;
+
+ static final String[] EMAIL_LOOKUP_PROJECTION = new String[] {
+ RawContacts.CONTACT_ID,
+ Contacts.LOOKUP_KEY,
+ };
+ static int EMAIL_ID_COLUMN_INDEX = 0;
+ static int EMAIL_LOOKUP_STRING_COLUMN_INDEX = 1;
+
+ static final String[] PHONE_LOOKUP_PROJECTION = new String[] {
+ PhoneLookup._ID,
+ PhoneLookup.LOOKUP_KEY,
+ };
+ static int PHONE_ID_COLUMN_INDEX = 0;
+ static int PHONE_LOOKUP_STRING_COLUMN_INDEX = 1;
+
+
+
+ public FasttrackBadgeWidget(Context context) {
+ this(context, null);
+ }
+
+ public FasttrackBadgeWidget(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public FasttrackBadgeWidget(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+
+ TypedArray a =
+ context.obtainStyledAttributes(attrs,
+ com.android.internal.R.styleable.FasttrackBadgeWidget, defStyle, 0);
+
+ mMode = a.getInt(com.android.internal.R.styleable.FasttrackBadgeWidget_fasttrackWindowSize,
+ Intents.MODE_MEDIUM);
+
+ a.recycle();
+
+ init();
+ }
+
+ private void init() {
+ mQueryHandler = new QueryHandler(mContext.getContentResolver());
+ setOnClickListener(this);
+ }
+
+ /**
+ * Assign the contact uri that this fasttrack badge should be associated with.
+ * Note that this is only used for displaying the fasttrack window and won't
+ * bind the contact's photo for you.
+ *
+ * @param conatctUri Either a {Contacts.CONTENT_URI} or {Contacts.CONTENT_LOOKUP_URI}
+ * style URI.
+ */
+ public void assignContactUri(Uri contactUri) {
+ mContactUri = contactUri;
+ }
+
+ /**
+ * Assign a contact based on an email address. This should only be used when
+ * the contact's URI is not available, as an extra query will have to be
+ * performed to lookup the URI based on the email.
+ *
+ * @param emailAddress The email address of the contact.
+ * @param lazyLookup If this is true, the lookup query will not be performed
+ * until this view is clicked.
+ */
+ public void assignContactFromEmail(String emailAddress, boolean lazyLookup) {
+ mContactEmail = emailAddress;
+ if (!lazyLookup) {
+ mQueryHandler.startQuery(TOKEN_EMAIL_LOOKUP, null,
+ Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, Uri.encode(mContactEmail)),
+ EMAIL_LOOKUP_PROJECTION, null, null, null);
+ }
+ }
+
+ /**
+ * Assign a contact based on a phone number. This should only be used when
+ * the contact's URI is not available, as an extra query will have to be
+ * performed to lookup the URI based on the phone number.
+ *
+ * @param phoneNumber The phone number of the contact.
+ * @param lazyLookup If this is true, the lookup query will not be performed
+ * until this view is clicked.
+ */
+ public void assignContactFromPhone(String phoneNumber, boolean lazyLookup) {
+ mContactPhone = phoneNumber;
+ if (!lazyLookup) {
+ mQueryHandler.startQuery(TOKEN_PHONE_LOOKUP, null,
+ Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, mContactPhone),
+ PHONE_LOOKUP_PROJECTION, null, null, null);
+ }
+ }
+
+ /**
+ * Set the fasttrack window mode. Options are {@link Intents.MODE_SMALL},
+ * {@link Intents.MODE_MEDIUM}, {@link Intents.MODE_LARGE}.
+ * @param size
+ */
+ public void setMode(int size) {
+ mMode = size;
+ }
+
+ public void onClick(View v) {
+ final Rect target = getTargetRect(v);
+
+ if (mContactUri != null) {
+ trigger(mContactUri, target);
+ } else if (mContactEmail != null) {
+ mQueryHandler.startQuery(TOKEN_EMAIL_LOOKUP_AND_TRIGGER, target,
+ Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, Uri.encode(mContactEmail)),
+ EMAIL_LOOKUP_PROJECTION, null, null, null);
+ } else if (mContactPhone != null) {
+ mQueryHandler.startQuery(TOKEN_PHONE_LOOKUP_AND_TRIGGER, target,
+ Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, mContactPhone),
+ PHONE_LOOKUP_PROJECTION, null, null, null);
+ } else {
+ // If a contact hasn't been assigned, don't react to click.
+ return;
+ }
+ }
+
+ /**
+ * Set a list of specific MIME-types to exclude and not display. For
+ * example, this can be used to hide the {@link Contacts#CONTENT_ITEM_TYPE}
+ * profile icon.
+ */
+ public void setExcludeMimes(String[] excludeMimes) {
+ mExcludeMimes = excludeMimes;
+ }
+
+ private void trigger(Uri contactUri, Rect target) {
+ Intent intent = new Intent(Intents.SHOW_OR_CREATE_CONTACT, contactUri);
+ intent.putExtra(Intents.EXTRA_TARGET_RECT, target);
+ intent.putExtra(Intents.EXTRA_MODE, mMode);
+ mContext.startActivity(intent);
+ }
+
+ private Rect getTargetRect(View anchor) {
+ final int[] location = new int[2];
+ anchor.getLocationOnScreen(location);
+
+ final Rect rect = new Rect();
+ rect.left = location[0];
+ rect.top = location[1];
+ rect.right = rect.left + anchor.getWidth();
+ rect.bottom = rect.top + anchor.getHeight();
+ return rect;
+ }
+
+ private class QueryHandler extends AsyncQueryHandler {
+
+ public QueryHandler(ContentResolver cr) {
+ super(cr);
+ }
+
+ @Override
+ protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
+ Uri contactUri = null;
+ boolean trigger = false;
+
+ try{
+ switch(token) {
+ case TOKEN_PHONE_LOOKUP_AND_TRIGGER:
+ trigger = true;
+ case TOKEN_PHONE_LOOKUP: {
+ if (cursor != null && cursor.moveToFirst()) {
+ long contactId = cursor.getLong(PHONE_ID_COLUMN_INDEX);
+ String lookupKey = cursor.getString(PHONE_LOOKUP_STRING_COLUMN_INDEX);
+ contactUri = Contacts.getLookupUri(contactId, lookupKey);
+ }
+ break;
+ }
+ case TOKEN_EMAIL_LOOKUP_AND_TRIGGER:
+ trigger = true;
+ case TOKEN_EMAIL_LOOKUP: {
+ if (cursor != null && cursor.moveToFirst()) {
+ long contactId = cursor.getLong(EMAIL_ID_COLUMN_INDEX);
+ String lookupKey = cursor.getString(EMAIL_LOOKUP_STRING_COLUMN_INDEX);
+ contactUri = Contacts.getLookupUri(contactId, lookupKey);
+ }
+ }
+ }
+ } finally {
+ if (cursor != null) {
+ cursor.close();
+ }
+ }
+
+ if (contactUri != null) {
+ mContactUri = contactUri;
+ if (trigger && cookie != null) {
+ trigger(contactUri, (Rect) cookie);
+ }
+ }
+ }
+ }
+}
diff --git a/core/res/res/drawable/fasttrack_badge_middle.xml b/core/res/res/drawable/fasttrack_badge_middle_large.xml
index 6df230aaf053..dd591bd7819b 100644
--- a/core/res/res/drawable/fasttrack_badge_middle.xml
+++ b/core/res/res/drawable/fasttrack_badge_middle_large.xml
@@ -19,10 +19,10 @@
android:state_focused="false"
android:state_selected="false"
android:state_pressed="false"
- android:drawable="@drawable/fasttrack_badge_middle_normal" />
+ android:drawable="@drawable/fasttrack_badge_middle_large_normal" />
<item
android:state_pressed="true"
- android:drawable="@drawable/fasttrack_badge_middle_pressed" />
+ android:drawable="@drawable/fasttrack_badge_middle_large_pressed" />
</selector> \ No newline at end of file
diff --git a/core/res/res/drawable/fasttrack_badge_middle_large_normal.9.png b/core/res/res/drawable/fasttrack_badge_middle_large_normal.9.png
new file mode 100644
index 000000000000..ca275cdd37d2
--- /dev/null
+++ b/core/res/res/drawable/fasttrack_badge_middle_large_normal.9.png
Binary files differ
diff --git a/core/res/res/drawable/fasttrack_badge_middle_large_pressed.9.png b/core/res/res/drawable/fasttrack_badge_middle_large_pressed.9.png
new file mode 100644
index 000000000000..b69ccbd9f0af
--- /dev/null
+++ b/core/res/res/drawable/fasttrack_badge_middle_large_pressed.9.png
Binary files differ
diff --git a/core/res/res/drawable/fasttrack_badge_middle_normal.9.png b/core/res/res/drawable/fasttrack_badge_middle_normal.9.png
deleted file mode 100644
index 07df063d1827..000000000000
--- a/core/res/res/drawable/fasttrack_badge_middle_normal.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable/fasttrack_badge_middle_pressed.9.png b/core/res/res/drawable/fasttrack_badge_middle_pressed.9.png
deleted file mode 100644
index ded95f699167..000000000000
--- a/core/res/res/drawable/fasttrack_badge_middle_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/layout/contact_header.xml b/core/res/res/layout/contact_header.xml
index ba91e00e6c0e..8d7e470fb93d 100644
--- a/core/res/res/layout/contact_header.xml
+++ b/core/res/res/layout/contact_header.xml
@@ -24,12 +24,12 @@
android:gravity="center_vertical">
<ImageView android:id="@+id/photo"
- android:layout_width="48dip"
- android:layout_height="52dip"
+ android:layout_width="56dip"
+ android:layout_height="62dip"
android:layout_marginRight="10dip"
android:layout_marginLeft="10dip"
android:scaleType="fitCenter"
- android:background="@drawable/fasttrack_badge_middle"/>
+ android:background="@drawable/fasttrack_badge_middle_large"/>
<LinearLayout
android:layout_width="0dip"
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 568ed920dd29..a1a179bfd813 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -396,6 +396,14 @@
<attr name="spinnerItemStyle" format="reference" />
<!-- Default MapView style. -->
<attr name="mapViewStyle" format="reference" />
+ <!-- Dark Fasttrack badge style. -->
+ <attr name="fasttrackBadgeWidgetStyle" format="reference" />
+ <!-- Dark Fasttrack badge style with small fasttrack window. -->
+ <attr name="fasttrackBadgeWidgetStyleWindowSmall" format="reference" />
+ <!-- Dark Fasttrack badge style with medium fasttrack window. -->
+ <attr name="fasttrackBadgeWidgetStyleWindowMedium" format="reference" />
+ <!-- Dark Fasttrack badge style with large fasttrack window. -->
+ <attr name="fasttrackBadgeWidgetStyleWindowLarge" format="reference" />
<!-- =================== -->
<!-- Preference styles -->
@@ -2197,6 +2205,14 @@
<attr name="orientation" />
</declare-styleable>
+ <declare-styleable name="FasttrackBadgeWidget">
+ <attr name="fasttrackWindowSize">
+ <enum name="modeSmall" value="1" />
+ <enum name="modeMedium" value="2" />
+ <enum name="modeLarge" value="3" />
+ </attr>
+ </declare-styleable>
+
<!-- ======================================= -->
<!-- Widget package parent layout attributes -->
<!-- ======================================= -->
diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml
index a2ceb8f38446..fae612c8bada 100644
--- a/core/res/res/values/styles.xml
+++ b/core/res/res/values/styles.xml
@@ -517,6 +517,26 @@
<item name="android:shadowRadius">2.75</item>
</style>
+ <style name="Widget.FasttrackBadgeWidget">
+ <item name="android:layout_width">48dip</item>
+ <item name="android:layout_height">52dip</item>
+ <item name="android:background">@android:drawable/fasttrack_badge_dark</item>
+ <item name="android:clickable">true</item>
+ <item name="android:scaleType">fitCenter</item>
+ </style>
+
+ <style name="Widget.FasttrackBadgeWidget.WindowSmall">
+ <item name="android:fasttrackWindowSize">modeSmall</item>
+ </style>
+
+ <style name="Widget.FasttrackBadgeWidget.WindowMedium">
+ <item name="android:fasttrackWindowSize">modeMedium</item>
+ </style>
+
+ <style name="Widget.FasttrackBadgeWidget.WindowLarge">
+ <item name="android:fasttrackWindowSize">modeLarge</item>
+ </style>
+
<!-- Text Appearances -->
<eat-comment />
diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml
index 3b9590d24652..4f76c5605349 100644
--- a/core/res/res/values/themes.xml
+++ b/core/res/res/values/themes.xml
@@ -176,6 +176,9 @@
<item name="spinnerItemStyle">@android:style/Widget.TextView.SpinnerItem</item>
<item name="dropDownHintAppearance">@android:style/TextAppearance.Widget.DropDownHint</item>
<item name="keyboardViewStyle">@android:style/Widget.KeyboardView</item>
+ <item name="fasttrackBadgeWidgetStyleWindowSmall">@android:style/Widget.FasttrackBadgeWidget.WindowSmall</item>
+ <item name="fasttrackBadgeWidgetStyleWindowMedium">@android:style/Widget.FasttrackBadgeWidget.WindowMedium</item>
+ <item name="fasttrackBadgeWidgetStyleWindowLarge">@android:style/Widget.FasttrackBadgeWidget.WindowLarge</item>
<!-- Preference styles -->
<item name="preferenceScreenStyle">@android:style/Preference.PreferenceScreen</item>