diff options
Diffstat (limited to 'src/com/android/contacts')
4 files changed, 119 insertions, 12 deletions
diff --git a/src/com/android/contacts/common/activity/BlockContactActivity.java b/src/com/android/contacts/common/activity/BlockContactActivity.java index 4dff6180..a9514a63 100644 --- a/src/com/android/contacts/common/activity/BlockContactActivity.java +++ b/src/com/android/contacts/common/activity/BlockContactActivity.java @@ -44,7 +44,7 @@ public class BlockContactActivity extends Activity implements BlockContactDialog return; } - mBlockContactHelper = new BlockContactHelper(this, new LookupProviderImpl(this)); + mBlockContactHelper = new BlockContactHelper(this); mBlockContactHelper.setContactInfo(phoneNumber); } diff --git a/src/com/android/contacts/common/util/BlockContactHelper.java b/src/com/android/contacts/common/util/BlockContactHelper.java index e5867b32..f04a12cb 100644 --- a/src/com/android/contacts/common/util/BlockContactHelper.java +++ b/src/com/android/contacts/common/util/BlockContactHelper.java @@ -42,7 +42,6 @@ public class BlockContactHelper { private BlockRequest mBlockRequest; private LookupProvider mLookupProvider; private volatile boolean mIsBlacklisted; - private volatile boolean mIsProviderInitialized; private boolean mBackgroundTaskCompleted; private StatusCallbacks mListener; @@ -51,9 +50,9 @@ public class BlockContactHelper { UNBLOCK } - public BlockContactHelper(Context context, LookupProvider lookupProvider) { + public BlockContactHelper(Context context) { mContext = context; - mLookupProvider = lookupProvider; + mLookupProvider = LookupProviderImpl.INSTANCE.get(context); } public void setContactInfo(Contact contact) { @@ -102,10 +101,6 @@ public class BlockContactHelper { break; } } - - if (mLookupProvider.initialize()) { - mIsProviderInitialized = true; - } } public boolean isContactBlacklisted() { @@ -118,7 +113,7 @@ public class BlockContactHelper { } public String getLookupProviderName() { - if (mIsProviderInitialized) { + if (mLookupProvider.isEnabled()) { return mLookupProvider.getDisplayName(); } else { return null; @@ -163,7 +158,7 @@ public class BlockContactHelper { for (String phoneNumber : mBlockRequest.phoneNumbers) { toggleBlacklistStatus(phoneNumber, true /*block contact*/); - if (notifyLookupProvider && mIsProviderInitialized && + if (notifyLookupProvider && mLookupProvider.isEnabled() && mLookupProvider.supportsSpamReporting()) { mLookupProvider.markAsSpam(phoneNumber); } @@ -184,7 +179,7 @@ public class BlockContactHelper { for (String phoneNumber : mBlockRequest.phoneNumbers) { toggleBlacklistStatus(phoneNumber, false /*unblock contact*/); - if (notifyLookupProvider && mIsProviderInitialized && + if (notifyLookupProvider && mLookupProvider.isEnabled() && mLookupProvider.supportsSpamReporting()) { mLookupProvider.unmarkAsSpam(phoneNumber); } @@ -238,7 +233,7 @@ public class BlockContactHelper { if (mBackgroundTask != null) { mBackgroundTask.cancel(true /*interrupt*/); } - mLookupProvider.disable(); + LookupProviderImpl.INSTANCE.release(); } public interface StatusCallbacks { diff --git a/src/com/android/contacts/common/util/SingletonHolder.java b/src/com/android/contacts/common/util/SingletonHolder.java new file mode 100644 index 00000000..c1a183d4 --- /dev/null +++ b/src/com/android/contacts/common/util/SingletonHolder.java @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2016 The CyanogenMod 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 com.android.contacts.common.util; + +/** + * Encapsulates a threadsafe singleton pattern. + * + * This class is designed to be used as a public constant, living within a class that has a private constructor. + * It defines a {@link #create(I)} method that will only ever be called once, upon the first call of {@link #get(I)}. + * That method is responsible for creating the actual singleton instance, and that instance will be returned for all + * future calls of {@link #get(I)}. + * + * Example: + * <code> + * public class FooSingleton { + * public static final SingletonHolder<FooSingleton, ParamObject> HOLDER = + * new SingletonHolder<FooSingleton, ParamObject>() { + * @Override + * protected FooSingleton create(ParamObject param) { + * return new FooSingleton(param); + * } + * }; + * + * private FooSingleton(ParamObject param) { + * + * } + * } + * + * // somewhere else + * FooSingleton.HOLDER.get(params).doStuff(); + * </code> + * @param <E> The type of the class to hold as a singleton. + * @param <I> A parameter object to use during creation of the singleton object. + */ +public abstract class SingletonHolder<E, I> { + E mInstance; + final Object LOCK = new Object(); + + public E get(I initializer) { + if (null == mInstance) { + synchronized (LOCK) { + if (null == mInstance) { + mInstance = create(initializer); + } + } + } + + return mInstance; + } + + protected abstract E create(I initializer); + + /** + * Specialized version of {@link SingletonHolder} which will keep a count of referring + * objects, and clear the instance when all references have been removed. + * + * @param <E> The type of the class to hold as a singleton. + * @param <I> A parameter object to use during creation of the singleton object. + */ + public static abstract class RefCountedSingletonHolder<E, I> extends SingletonHolder<E, I> { + private int mRefCount; + + public E get(I initializer) { + synchronized (LOCK) { + mRefCount++; + } + return super.get(initializer); + } + + public void release() { + synchronized (LOCK) { + if(--mRefCount == 0) { + destroy(mInstance); + mInstance = null; + } + } + } + + protected abstract void destroy(E instance); + } +} diff --git a/src/com/android/contacts/common/util/UriUtils.java b/src/com/android/contacts/common/util/UriUtils.java index 41ef62f6..bc098d36 100644 --- a/src/com/android/contacts/common/util/UriUtils.java +++ b/src/com/android/contacts/common/util/UriUtils.java @@ -75,6 +75,25 @@ public class UriUtils { } /** + * @return true if this uri represents a local contact, false otherwise. + */ + public static boolean isLocalContactUri(Uri uri) { + if (uri == null) { + return false; + } + + if (isEncodedContactUri(uri)) { + return false; + } + + if (!uri.getScheme().equals(ContactsContract.AUTHORITY)) { + return false; + } + + return true; + } + + /** * Parses the given URI to determine the original lookup key of the contact. */ public static String getLookupKeyFromUri(Uri lookupUri) { |