diff options
| -rw-r--r-- | AndroidManifest.xml | 2 | ||||
| -rw-r--r-- | res/layout/widget_conversation_list_item.xml | 12 | ||||
| -rw-r--r-- | res/layout/widget_message_item_incoming.xml | 13 | ||||
| -rw-r--r-- | res/layout/widget_message_item_outgoing.xml | 2 | ||||
| -rw-r--r-- | res/values/cm_dimens.xml | 4 | ||||
| -rw-r--r-- | src/com/android/messaging/BugleApplication.java | 4 | ||||
| -rw-r--r-- | src/com/android/messaging/widget/BaseWidgetFactory.java | 18 | ||||
| -rw-r--r-- | src/com/android/messaging/widget/BaseWidgetProvider.java | 1 | ||||
| -rw-r--r-- | src/com/android/messaging/widget/WidgetConversationListService.java | 51 | ||||
| -rw-r--r-- | src/com/android/messaging/widget/WidgetConversationService.java | 47 | ||||
| -rw-r--r-- | src/com/cyanogenmod/messaging/lookup/ILookupClient.java | 20 | ||||
| -rw-r--r-- | src/com/cyanogenmod/messaging/lookup/LookupProviderManager.java | 114 |
12 files changed, 263 insertions, 25 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml index d37b576..346f75b 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -541,6 +541,8 @@ <receiver android:name="com.cyanogenmod.messaging.quickmessage.ClearAllReceiver" /> + <receiver android:name="com.cyanogenmod.messaging.lookup.LookupProviderManager" /> + </application> </manifest> diff --git a/res/layout/widget_conversation_list_item.xml b/res/layout/widget_conversation_list_item.xml index ecb12ca..8d3f5d4 100644 --- a/res/layout/widget_conversation_list_item.xml +++ b/res/layout/widget_conversation_list_item.xml @@ -28,7 +28,7 @@ android:layout_centerVertical="true" android:layout_width="wrap_content" android:layout_height="wrap_content"> - <com.cyanogenmod.messaging.ui.AttributionContactIconView + <ImageView android:id="@+id/avatarView" style="@style/WidgetConversationListItemAvatar" android:layout_width="@dimen/contact_icon_view_normal_size" @@ -38,6 +38,16 @@ android:importantForAccessibility="no" android:contentDescription="@null" /> <ImageView + android:id="@+id/attribution_logo" + android:layout_width="@dimen/attribution_logo_size" + android:layout_height="@dimen/attribution_logo_size" + android:src="@null" + android:layout_gravity="bottom|right" + android:layout_marginRight="@dimen/convolist_attribution_logo_marginRight" + android:visibility="gone" + android:importantForAccessibility="no" + android:contentDescription="@null"/> + <ImageView android:id="@+id/conversation_failed_status_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" diff --git a/res/layout/widget_message_item_incoming.xml b/res/layout/widget_message_item_incoming.xml index 4dda740..c71e5ff 100644 --- a/res/layout/widget_message_item_incoming.xml +++ b/res/layout/widget_message_item_incoming.xml @@ -39,7 +39,7 @@ android:layout_marginTop="-4dp" android:importantForAccessibility="no" android:contentDescription="@null" /> - <com.cyanogenmod.messaging.ui.AttributionContactIconView + <ImageView android:id="@+id/avatarView" style="@style/WidgetConversationItemAvatarIncoming" android:layout_width="@dimen/contact_icon_view_normal_size" @@ -49,6 +49,17 @@ android:importantForAccessibility="no" android:contentDescription="@null" /> <ImageView + android:id="@+id/attribution_logo" + android:layout_width="@dimen/attribution_logo_size" + android:layout_height="@dimen/attribution_logo_size" + android:src="@null" + android:layout_gravity="bottom|right" + android:layout_marginRight="@dimen/convo_attribution_logo_marginRight" + android:layout_marginBottom="@dimen/convo_attribution_logo_marginBottom" + android:visibility="gone" + android:importantForAccessibility="no" + android:contentDescription="@null"/> + <ImageView android:id="@+id/conversation_failed_status_icon" style="@style/WidgetConversationItemFailed" android:layout_width="wrap_content" diff --git a/res/layout/widget_message_item_outgoing.xml b/res/layout/widget_message_item_outgoing.xml index 1c65ccb..472b5a2 100644 --- a/res/layout/widget_message_item_outgoing.xml +++ b/res/layout/widget_message_item_outgoing.xml @@ -40,7 +40,7 @@ android:layout_marginTop="-4dp" android:importantForAccessibility="no" android:contentDescription="@null" /> - <com.android.messaging.ui.AttributtionContactIconView + <ImageView android:id="@+id/avatarView" android:layout_width="@dimen/contact_icon_view_normal_size" android:layout_height="@dimen/contact_icon_view_normal_size" diff --git a/res/values/cm_dimens.xml b/res/values/cm_dimens.xml index 91a8488..2dc13c2 100644 --- a/res/values/cm_dimens.xml +++ b/res/values/cm_dimens.xml @@ -15,4 +15,8 @@ <dimen name="qm_message_count_height">18dp</dimen> <dimen name="qm_conversation_bubble_width_snap">15dp</dimen> <dimen name="qm_conversation_bubble_padding">5dp</dimen> + <dimen name="attribution_logo_size">16dp</dimen> + <dimen name="convolist_attribution_logo_marginRight">13dp</dimen> + <dimen name="convo_attribution_logo_marginRight">5dp</dimen> + <dimen name="convo_attribution_logo_marginBottom">5dp</dimen> </resources> diff --git a/src/com/android/messaging/BugleApplication.java b/src/com/android/messaging/BugleApplication.java index a3cdfa0..c95d75e 100644 --- a/src/com/android/messaging/BugleApplication.java +++ b/src/com/android/messaging/BugleApplication.java @@ -282,9 +282,9 @@ public class BugleApplication extends Application implements UncaughtExceptionHa } /** - * Get the reference to + * Get the reference to the lookup provider manager * - * @return {@link LookupProviderManager} or null + * @return {@link ILookupClient} or null */ public static ILookupClient getLookupProviderClient() { return mLookupProviderManager; diff --git a/src/com/android/messaging/widget/BaseWidgetFactory.java b/src/com/android/messaging/widget/BaseWidgetFactory.java index 30b80ae..c87a100 100644 --- a/src/com/android/messaging/widget/BaseWidgetFactory.java +++ b/src/com/android/messaging/widget/BaseWidgetFactory.java @@ -37,8 +37,10 @@ import com.android.messaging.datamodel.media.ImageRequestDescriptor; import com.android.messaging.datamodel.media.ImageResource; import com.android.messaging.datamodel.media.MediaRequest; import com.android.messaging.datamodel.media.MediaResourceManager; +import com.android.messaging.datamodel.media.UriImageRequestDescriptor; import com.android.messaging.util.AvatarUriUtil; import com.android.messaging.util.LogUtil; +import com.cyanogenmod.messaging.lookup.LookupProviderManager; /** * Remote Views Factory for Bugle Widget. @@ -79,6 +81,7 @@ abstract class BaseWidgetFactory implements RemoteViewsService.RemoteViewsFactor if (LogUtil.isLoggable(TAG, LogUtil.VERBOSE)) { LogUtil.v(TAG, "onCreate"); } + mContext.sendBroadcast(new Intent(LookupProviderManager.ACTION_CREATED)); } @Override @@ -91,6 +94,7 @@ abstract class BaseWidgetFactory implements RemoteViewsService.RemoteViewsFactor mCursor.close(); mCursor = null; } + mContext.sendBroadcast(new Intent(LookupProviderManager.ACTION_DESTROYED)); } } @@ -166,13 +170,23 @@ abstract class BaseWidgetFactory implements RemoteViewsService.RemoteViewsFactor } protected Bitmap getAvatarBitmap(final Uri avatarUri) { + if (avatarUri == null) { + return null; + } final String avatarType = avatarUri == null ? null : AvatarUriUtil.getAvatarType(avatarUri); + ImageRequestDescriptor descriptor; - if (AvatarUriUtil.TYPE_GROUP_URI.equals(avatarType)) { + boolean isAvatarUri = AvatarUriUtil.isAvatarUri(avatarUri); + boolean isGroupAvatar = AvatarUriUtil.TYPE_GROUP_URI.equals( + AvatarUriUtil.getAvatarType(avatarUri)); + + if (isAvatarUri && isGroupAvatar) { descriptor = new AvatarGroupRequestDescriptor(avatarUri, mIconSize, mIconSize); - } else { + } else if (isAvatarUri) { descriptor = new AvatarRequestDescriptor(avatarUri, mIconSize, mIconSize); + } else { + descriptor = new UriImageRequestDescriptor(avatarUri, mIconSize, mIconSize, true, 0, 0); } final MediaRequest<ImageResource> imageRequest = diff --git a/src/com/android/messaging/widget/BaseWidgetProvider.java b/src/com/android/messaging/widget/BaseWidgetProvider.java index 431a6c7..c56a36f 100644 --- a/src/com/android/messaging/widget/BaseWidgetProvider.java +++ b/src/com/android/messaging/widget/BaseWidgetProvider.java @@ -24,6 +24,7 @@ import android.content.Intent; import android.os.Bundle; import com.android.messaging.util.LogUtil; +import com.cyanogenmod.messaging.lookup.LookupProviderManager; public abstract class BaseWidgetProvider extends AppWidgetProvider { protected static final String TAG = LogUtil.BUGLE_WIDGET_TAG; diff --git a/src/com/android/messaging/widget/WidgetConversationListService.java b/src/com/android/messaging/widget/WidgetConversationListService.java index 264b98c..0748757 100644 --- a/src/com/android/messaging/widget/WidgetConversationListService.java +++ b/src/com/android/messaging/widget/WidgetConversationListService.java @@ -20,6 +20,7 @@ import android.content.Context; import android.content.Intent; import android.content.res.Resources; import android.database.Cursor; +import android.graphics.Bitmap; import android.graphics.Typeface; import android.net.Uri; import android.os.Bundle; @@ -31,8 +32,9 @@ import android.text.style.ForegroundColorSpan; import android.text.style.StyleSpan; import android.view.View; import android.widget.RemoteViews; -import android.widget.RemoteViewsService; +import android.widget.RemoteViewsService; +import com.android.messaging.BugleApplication; import com.android.messaging.R; import com.android.messaging.datamodel.MessagingContentProvider; import com.android.messaging.datamodel.data.ConversationListData; @@ -40,17 +42,19 @@ import com.android.messaging.datamodel.data.ConversationListItemData; import com.android.messaging.sms.MmsUtils; import com.android.messaging.ui.UIIntents; import com.android.messaging.ui.conversationlist.ConversationListItemView; +import com.android.messaging.util.ContactUtil; import com.android.messaging.util.ContentType; import com.android.messaging.util.Dates; import com.android.messaging.util.LogUtil; import com.android.messaging.util.OsUtil; import com.android.messaging.util.PhoneUtils; +import com.cyanogen.lookup.phonenumber.response.LookupResponse; public class WidgetConversationListService extends RemoteViewsService { private static final String TAG = LogUtil.BUGLE_WIDGET_TAG; @Override - public RemoteViewsFactory onGetViewFactory(Intent intent) { + public RemoteViewsService.RemoteViewsFactory onGetViewFactory(Intent intent) { if (LogUtil.isLoggable(TAG, LogUtil.VERBOSE)) { LogUtil.v(TAG, "onGetViewFactory intent: " + intent); } @@ -100,6 +104,14 @@ public class WidgetConversationListService extends RemoteViewsService { final ConversationListItemData conv = new ConversationListItemData(); conv.bind(mCursor); + LookupResponse lookupResponse = null; + if (!ContactUtil.isValidContactId(conv.getParticipantContactId())) { + // Make blocking call + lookupResponse = BugleApplication.getLookupProviderClient() + .blockingLookupInfoForPhoneNumber(conv + .getOtherParticipantNormalizedDestination()); + } + // Inflate and fill out the remote view final RemoteViews remoteViews = new RemoteViews( mContext.getPackageName(), R.layout.widget_conversation_list_item); @@ -117,8 +129,17 @@ public class WidgetConversationListService extends RemoteViewsService { boldifyIfUnread(timeStamp, hasUnreadMessages)); // From - remoteViews.setTextViewText(R.id.from, - boldifyIfUnread(conv.getName(), hasUnreadMessages)); + if (lookupResponse != null) { + // Fix default if blank + if (TextUtils.isEmpty(lookupResponse.mName)) { + lookupResponse.mName = conv.getOtherParticipantNormalizedDestination(); + } + remoteViews.setTextViewText(R.id.from, + boldifyIfUnread(lookupResponse.mName, hasUnreadMessages)); + } else { + remoteViews.setTextViewText(R.id.from, + boldifyIfUnread(conv.getName(), hasUnreadMessages)); + } // Notifications turned off mini-bell icon remoteViews.setViewVisibility(R.id.conversation_notification_bell, @@ -150,12 +171,30 @@ public class WidgetConversationListService extends RemoteViewsService { View.VISIBLE : View.GONE); Uri iconUri = null; - if (conv.getIcon() != null) { - iconUri = Uri.parse(conv.getIcon()); + if (lookupResponse != null + && !TextUtils.isEmpty(lookupResponse.mPhotoUrl)) { + iconUri = Uri.parse(lookupResponse.mPhotoUrl); + } else { + if (conv.getIcon() != null) { + iconUri = Uri.parse(conv.getIcon()); + } } remoteViews.setImageViewBitmap(R.id.avatarView, includeAvatar ? getAvatarBitmap(iconUri) : null); + // Attribution logo + if (lookupResponse != null) { + Bitmap bitmap = BugleApplication.getLookupProviderClient() + .getCachedAttributionLogoBitmap(lookupResponse.mProviderName); + if (bitmap != null) { + remoteViews.setImageViewBitmap(R.id.attribution_logo, bitmap); + } + remoteViews.setViewVisibility(R.id.attribution_logo, (bitmap == null) ? View + .GONE : View.VISIBLE); + } else { + remoteViews.setViewVisibility(R.id.attribution_logo, View.GONE); + } + // Error // Only show the fail icon if it is not a group conversation. // And also require that we be the default sms app. diff --git a/src/com/android/messaging/widget/WidgetConversationService.java b/src/com/android/messaging/widget/WidgetConversationService.java index 4fd3934..94dc545 100644 --- a/src/com/android/messaging/widget/WidgetConversationService.java +++ b/src/com/android/messaging/widget/WidgetConversationService.java @@ -30,8 +30,9 @@ import android.text.format.Formatter; import android.text.style.ForegroundColorSpan; import android.view.View; import android.widget.RemoteViews; -import android.widget.RemoteViewsService; +import android.widget.RemoteViewsService; +import com.android.messaging.BugleApplication; import com.android.messaging.R; import com.android.messaging.datamodel.MessagingContentProvider; import com.android.messaging.datamodel.data.ConversationMessageData; @@ -47,15 +48,20 @@ import com.android.messaging.datamodel.media.VideoThumbnailRequest; import com.android.messaging.sms.MmsUtils; import com.android.messaging.ui.UIIntents; import com.android.messaging.util.AvatarUriUtil; +import com.android.messaging.util.ContactUtil; import com.android.messaging.util.Dates; import com.android.messaging.util.LogUtil; import com.android.messaging.util.OsUtil; import com.android.messaging.util.PhoneUtils; +import com.cyanogen.lookup.phonenumber.response.LookupResponse; +import java.util.LinkedHashMap; import java.util.List; public class WidgetConversationService extends RemoteViewsService { private static final String TAG = LogUtil.BUGLE_WIDGET_TAG; + private static final LinkedHashMap<String, Bitmap> sAttributionLogoCache = new + LinkedHashMap<>(5); private static final int IMAGE_ATTACHMENT_SIZE = 400; @@ -140,13 +146,21 @@ public class WidgetConversationService extends RemoteViewsService { final ConversationMessageData message = new ConversationMessageData(); message.bind(mCursor); + LookupResponse lookupResponse = null; + if (!ContactUtil.isValidContactId(message.getSenderContactId())) { + // Make blocking call + lookupResponse = BugleApplication.getLookupProviderClient() + .blockingLookupInfoForPhoneNumber( + message.getSenderNormalizedDestination()); + } + // Inflate and fill out the remote view final RemoteViews remoteViews = new RemoteViews( mContext.getPackageName(), message.getIsIncoming() ? R.layout.widget_message_item_incoming : R.layout.widget_message_item_outgoing); - final boolean hasUnreadMessages = false; //!message.getIsRead(); + final boolean hasUnreadMessages = !message.getIsRead(); // Date remoteViews.setTextViewText(R.id.date, boldifyIfUnread( @@ -235,15 +249,34 @@ public class WidgetConversationService extends RemoteViewsService { remoteViews.setViewVisibility(R.id.avatarShadow, includeAvatar ? View.VISIBLE : View.GONE); - final Uri avatarUri = AvatarUriUtil.createAvatarUri( - message.getSenderProfilePhotoUri(), - message.getSenderFullName(), - message.getSenderNormalizedDestination(), - message.getSenderContactLookupKey()); + final Uri avatarUri; + if (lookupResponse != null + && !TextUtils.isEmpty(lookupResponse.mPhotoUrl)) { + avatarUri = Uri.parse(lookupResponse.mPhotoUrl); + } else { + avatarUri = AvatarUriUtil.createAvatarUri( + message.getSenderProfilePhotoUri(), + message.getSenderFullName(), + message.getSenderNormalizedDestination(), + message.getSenderContactLookupKey()); + } remoteViews.setImageViewBitmap(R.id.avatarView, includeAvatar ? getAvatarBitmap(avatarUri) : null); + // Attribution logo + if (lookupResponse != null) { + Bitmap bitmap = BugleApplication.getLookupProviderClient() + .getCachedAttributionLogoBitmap(lookupResponse.mProviderName); + if (bitmap != null) { + remoteViews.setImageViewBitmap(R.id.attribution_logo, bitmap); + } + remoteViews.setViewVisibility(R.id.attribution_logo, (bitmap == null) ? View + .GONE : View.VISIBLE); + } else { + remoteViews.setViewVisibility(R.id.attribution_logo, View.GONE); + } + String text = message.getText(); if (attachmentStringId != 0) { final String attachment = mContext.getString(attachmentStringId); diff --git a/src/com/cyanogenmod/messaging/lookup/ILookupClient.java b/src/com/cyanogenmod/messaging/lookup/ILookupClient.java index a66b230..e3cd13a 100644 --- a/src/com/cyanogenmod/messaging/lookup/ILookupClient.java +++ b/src/com/cyanogenmod/messaging/lookup/ILookupClient.java @@ -15,6 +15,9 @@ */ package com.cyanogenmod.messaging.lookup; +import android.graphics.Bitmap; +import com.cyanogen.lookup.phonenumber.response.LookupResponse; + /** * <pre> * Client interface for talking to lookup provider @@ -40,6 +43,23 @@ public interface ILookupClient { void lookupInfoForPhoneNumber(String phoneNumber, boolean requery); /** + * Will call for lookup and allow requery of possibly stale data + * + * @param phoneNumber {@link String} not null or empty + * + * @return {@link com.cyanogen.lookup.phonenumber.response.LookupResponse} + */ + LookupResponse blockingLookupInfoForPhoneNumber(String phoneNumber); + + /** + * Fetches the possibly cached bitmap for a lookup provider of the given name + * + * @param providerName {@link String } + * @return {@link Bitmap} or null + */ + Bitmap getCachedAttributionLogoBitmap(String providerName); + + /** * Will mark number as spam * * This will automatically format to E164 diff --git a/src/com/cyanogenmod/messaging/lookup/LookupProviderManager.java b/src/com/cyanogenmod/messaging/lookup/LookupProviderManager.java index 8649b6a..63e2689 100644 --- a/src/com/cyanogenmod/messaging/lookup/LookupProviderManager.java +++ b/src/com/cyanogenmod/messaging/lookup/LookupProviderManager.java @@ -17,6 +17,12 @@ package com.cyanogenmod.messaging.lookup; import android.app.Activity; import android.app.Application; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.graphics.Bitmap; +import android.graphics.Canvas; import android.os.Bundle; import android.os.Handler; import android.os.Looper; @@ -25,12 +31,14 @@ import android.text.TextUtils; import android.util.Log; import com.cyanogen.lookup.phonenumber.provider.LookupProviderImpl; +import com.cyanogen.lookup.phonenumber.response.StatusCode; import com.cyanogen.lookup.phonenumber.util.LookupHandlerThread; import com.cyanogen.lookup.phonenumber.request.LookupRequest; import com.cyanogen.lookup.phonenumber.response.LookupResponse; import java.util.ArrayList; import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.List; import java.util.concurrent.ConcurrentHashMap; @@ -44,20 +52,29 @@ import java.util.concurrent.ConcurrentHashMap; * @see {@link LookupRequest.Callback} * @see {@link ILookupClient} */ -public class LookupProviderManager implements Application.ActivityLifecycleCallbacks, - LookupRequest.Callback, ILookupClient { +public class LookupProviderManager extends BroadcastReceiver implements Application + .ActivityLifecycleCallbacks, LookupRequest.Callback, ILookupClient { private static final String TAG = "LookupProviderManager"; private static final String THREAD_NAME = "PhoneLookupProviderThread"; // Members private static final Handler sHandler = new Handler(Looper.getMainLooper()); + private static final LinkedHashMap<String, Bitmap> sAttributionLogoBitmapCache = new + LinkedHashMap<>(1); private Application mApplication; private ConcurrentHashMap<String, LookupResponse> mPhoneNumberLookupCache; private ConcurrentHashMap<String, HashSet<LookupProviderListener>> mLookupListeners; private LookupHandlerThread mLookupHandlerThread; private boolean mIsPhoneNumberLookupInitialized; private short mActivityCount = 0; + private short mServiceCount = 0; + + public static final String ACTION_CREATED = "service_created"; + public static final String ACTION_DESTROYED = "service_destroyed"; + + public LookupProviderManager() { + } /** * Constructor @@ -72,6 +89,10 @@ public class LookupProviderManager implements Application.ActivityLifecycleCallb mPhoneNumberLookupCache = new ConcurrentHashMap<String, LookupResponse>(); mLookupListeners = new ConcurrentHashMap<String, HashSet<LookupProviderListener>>(); application.registerActivityLifecycleCallbacks(this); + IntentFilter filter = new IntentFilter(); + filter.addAction(ACTION_CREATED); + filter.addAction(ACTION_DESTROYED); + application.registerReceiver(this, filter); mApplication = application; } @@ -103,7 +124,12 @@ public class LookupProviderManager implements Application.ActivityLifecycleCallb } mPhoneNumberLookupCache.clear(); mLookupListeners.clear(); - mIsPhoneNumberLookupInitialized = false; + for (Bitmap bitmap : sAttributionLogoBitmapCache.values()) { + if (bitmap != null && !bitmap.isRecycled()) { + bitmap.recycle(); + } + } + sAttributionLogoBitmapCache.clear(); } /** @@ -153,6 +179,17 @@ public class LookupProviderManager implements Application.ActivityLifecycleCallb public void onNewInfo(LookupRequest lookupRequest, final LookupResponse response) { log("onNewInfo(" + lookupRequest + ", " + response + ")"); mPhoneNumberLookupCache.put(lookupRequest.mPhoneNumber, response); + // Cache the attribution logo as a bitmap since needed by widget's remoteviews + if (!sAttributionLogoBitmapCache.containsKey(response.mProviderName)) { + Bitmap bitmap = Bitmap.createBitmap(response.mAttributionLogo + .getIntrinsicWidth(), response.mAttributionLogo + .getIntrinsicHeight(), Bitmap.Config.ARGB_8888); + Canvas c = new Canvas(bitmap); + response.mAttributionLogo + .setBounds(0, 0, c.getWidth(), c.getHeight()); + response.mAttributionLogo.draw(c); + sAttributionLogoBitmapCache.put(response.mProviderName, bitmap); + } if (mLookupListeners.containsKey(lookupRequest.mPhoneNumber)) { int i = 0; List<Integer> removalIndexes = new ArrayList<Integer>(); @@ -177,13 +214,46 @@ public class LookupProviderManager implements Application.ActivityLifecycleCallb } } + /* --------------------- Private level service count methods -------------------------------*/ + + private void onServiceCreated() { + ++mServiceCount; + if (mServiceCount == 1) { + if (!mIsPhoneNumberLookupInitialized) { + mIsPhoneNumberLookupInitialized = start(); + } + } + } + + private void onServiceDestroyed() { + --mServiceCount; + if (mServiceCount == 0 && mActivityCount == 0) { + if (mIsPhoneNumberLookupInitialized) { + stop(); + mIsPhoneNumberLookupInitialized = false; + } + } + } + + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if (ACTION_CREATED.equalsIgnoreCase(action)) { + onServiceCreated(); + } else if (ACTION_DESTROYED.equalsIgnoreCase(action)) { + onServiceDestroyed(); + } + } + /* --------------------- Activity callback interfaces -------------------------------------*/ @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { log("onActivityCreated(" + activity + ", " + savedInstanceState + ")"); ++mActivityCount; if (mActivityCount == 1) { - mIsPhoneNumberLookupInitialized = start(); + if (!mIsPhoneNumberLookupInitialized) { + mIsPhoneNumberLookupInitialized = start(); + } } } @@ -207,7 +277,7 @@ public class LookupProviderManager implements Application.ActivityLifecycleCallb public void onActivityDestroyed(Activity activity) { log("onActivityCreated(" + activity + ")"); --mActivityCount; - if (mActivityCount == 0) { + if (mActivityCount == 0 && mServiceCount == 0) { if (mIsPhoneNumberLookupInitialized) { stop(); mIsPhoneNumberLookupInitialized = false; @@ -216,6 +286,40 @@ public class LookupProviderManager implements Application.ActivityLifecycleCallb } @Override + public LookupResponse blockingLookupInfoForPhoneNumber(String phoneNumber) { + LookupResponse response = null; + if (mLookupHandlerThread != null) { + response = mLookupHandlerThread.blockingFetchInfoForPhoneNumber(new + LookupRequest(phoneNumber, this)); + if (response != null && response.mStatusCode != StatusCode.SUCCESS) { + response = null; + } + } + if (response != null) { + // Cache the attribution logos as bitmaps since widget needs it + if (!sAttributionLogoBitmapCache.containsKey(response.mProviderName)) { + Bitmap bitmap = Bitmap.createBitmap(response.mAttributionLogo + .getIntrinsicWidth(), response.mAttributionLogo + .getIntrinsicHeight(), Bitmap.Config.ARGB_8888); + Canvas c = new Canvas(bitmap); + response.mAttributionLogo + .setBounds(0, 0, c.getWidth(), c.getHeight()); + response.mAttributionLogo.draw(c); + sAttributionLogoBitmapCache.put(response.mProviderName, bitmap); + } + } + return response; + } + + @Override + public Bitmap getCachedAttributionLogoBitmap(String providerName) { + if (!TextUtils.isEmpty(providerName)) { + return sAttributionLogoBitmapCache.get(providerName); + } + return null; + } + + @Override public void lookupInfoForPhoneNumber(String phoneNumber) { log("lookupInfoForPhoneNumber(" + phoneNumber + ")"); lookupInfoForPhoneNumber(phoneNumber, false); |
