summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Brabham <optedoblivion@cyngn.com>2016-02-23 17:31:10 -0500
committerMartin Brabham <optedoblivion@cyngn.com>2016-04-25 13:17:27 -0700
commit4052475dd64ecd5445c2f60edb6b644e47315a79 (patch)
treed5804b7ac9f8517ab97a667242a70038216c38f2
parent33e931646d82761758478375d13b27d9cd0c3302 (diff)
downloadandroid_packages_apps_Messaging-4052475dd64ecd5445c2f60edb6b644e47315a79.tar.gz
android_packages_apps_Messaging-4052475dd64ecd5445c2f60edb6b644e47315a79.tar.bz2
android_packages_apps_Messaging-4052475dd64ecd5445c2f60edb6b644e47315a79.zip
Implement lookup provider for 4x3 and 3x3 widget
Change-Id: Ia44ac2c75172f10459d191dbca4731d00d8e542f Ticket-Id: MMS-213
-rw-r--r--AndroidManifest.xml2
-rw-r--r--res/layout/widget_conversation_list_item.xml12
-rw-r--r--res/layout/widget_message_item_incoming.xml13
-rw-r--r--res/layout/widget_message_item_outgoing.xml2
-rw-r--r--res/values/cm_dimens.xml4
-rw-r--r--src/com/android/messaging/BugleApplication.java4
-rw-r--r--src/com/android/messaging/widget/BaseWidgetFactory.java18
-rw-r--r--src/com/android/messaging/widget/BaseWidgetProvider.java1
-rw-r--r--src/com/android/messaging/widget/WidgetConversationListService.java51
-rw-r--r--src/com/android/messaging/widget/WidgetConversationService.java47
-rw-r--r--src/com/cyanogenmod/messaging/lookup/ILookupClient.java20
-rw-r--r--src/com/cyanogenmod/messaging/lookup/LookupProviderManager.java114
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);