diff options
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/ui/suggestion/util')
3 files changed, 169 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/suggestion/util/SuggestionServiceConnectionManager.java b/WordPress/src/main/java/org/wordpress/android/ui/suggestion/util/SuggestionServiceConnectionManager.java new file mode 100644 index 000000000..bcbdebe30 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/suggestion/util/SuggestionServiceConnectionManager.java @@ -0,0 +1,55 @@ +package org.wordpress.android.ui.suggestion.util; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.os.IBinder; + +import org.wordpress.android.ui.suggestion.service.SuggestionService; + +public class SuggestionServiceConnectionManager implements ServiceConnection { + + private final Context mContext; + private final int mRemoteBlogId; + private boolean mAttemptingToBind = false; + private boolean mBindCalled = false; + + public SuggestionServiceConnectionManager(Context context, int remoteBlogId) { + mContext = context; + mRemoteBlogId = remoteBlogId; + } + + public void bindToService() { + if (!mAttemptingToBind) { + mAttemptingToBind = true; + mBindCalled = true; + Intent intent = new Intent(mContext, SuggestionService.class); + mContext.bindService(intent, this, Context.BIND_AUTO_CREATE); + } + } + + public void unbindFromService() { + mAttemptingToBind = false; + if (mBindCalled) { + mContext.unbindService(this); + mBindCalled = false; + } + } + + @Override + public void onServiceConnected(ComponentName componentName, IBinder iBinder) { + SuggestionService.SuggestionBinder b = (SuggestionService.SuggestionBinder) iBinder; + SuggestionService suggestionService = b.getService(); + + suggestionService.updateSuggestions(mRemoteBlogId); + suggestionService.updateTags(mRemoteBlogId); + + mAttemptingToBind = false; + } + + @Override + public void onServiceDisconnected(ComponentName componentName) { + // noop + } +} diff --git a/WordPress/src/main/java/org/wordpress/android/ui/suggestion/util/SuggestionTokenizer.java b/WordPress/src/main/java/org/wordpress/android/ui/suggestion/util/SuggestionTokenizer.java new file mode 100644 index 000000000..7dbf8da8e --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/suggestion/util/SuggestionTokenizer.java @@ -0,0 +1,52 @@ +package org.wordpress.android.ui.suggestion.util; + +import android.text.SpannableString; +import android.text.Spanned; +import android.text.TextUtils; +import android.widget.MultiAutoCompleteTextView; + +public class SuggestionTokenizer implements MultiAutoCompleteTextView.Tokenizer { + + @Override + public CharSequence terminateToken(CharSequence text) { + int i = text.length(); + while (i > 0 && text.charAt(i - 1) == ' ') { + i--; + } + if (text instanceof Spanned) { + SpannableString sp = new SpannableString(text + " "); + TextUtils.copySpansFrom((Spanned) text, 0, text.length(), Object.class, sp, 0); + return sp; + } else { + return text + " "; + } + } + + @Override + public int findTokenStart(CharSequence text, int cursor) { + int i = cursor; + while (i > 0 && text.charAt(i - 1) != '@') { + i--; + } + + if (i < 1 || text.charAt(i - 1) != '@') { + return cursor; + } + + return i; + } + + @Override + public int findTokenEnd(CharSequence text, int cursor) { + int i = cursor; + int len = text.length(); + while (i < len) { + if (text.charAt(i) == ' ') { + return i; + } else { + i++; + } + } + return len; + } +} diff --git a/WordPress/src/main/java/org/wordpress/android/ui/suggestion/util/SuggestionUtils.java b/WordPress/src/main/java/org/wordpress/android/ui/suggestion/util/SuggestionUtils.java new file mode 100644 index 000000000..be0e7fd00 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/suggestion/util/SuggestionUtils.java @@ -0,0 +1,62 @@ +package org.wordpress.android.ui.suggestion.util; + +import android.content.Context; + +import org.wordpress.android.WordPress; +import org.wordpress.android.datasets.SuggestionTable; +import org.wordpress.android.models.Blog; +import org.wordpress.android.models.Suggestion; +import org.wordpress.android.models.Tag; +import org.wordpress.android.ui.suggestion.adapters.SuggestionAdapter; +import org.wordpress.android.ui.suggestion.adapters.TagSuggestionAdapter; + +import java.util.List; + +public class SuggestionUtils { + + public static SuggestionAdapter setupSuggestions(final int remoteBlogId, Context context, SuggestionServiceConnectionManager serviceConnectionManager) { + Blog blog = WordPress.wpDB.getBlogForDotComBlogId(Integer.toString(remoteBlogId)); + boolean isDotComFlag = (blog != null && blog.isDotcomFlag()); + + return SuggestionUtils.setupSuggestions(remoteBlogId, context, serviceConnectionManager, isDotComFlag); + } + + public static SuggestionAdapter setupSuggestions(final int remoteBlogId, Context context, SuggestionServiceConnectionManager serviceConnectionManager, boolean isDotcomFlag) { + if (!isDotcomFlag) { + return null; + } + + SuggestionAdapter suggestionAdapter = new SuggestionAdapter(context); + + List<Suggestion> suggestions = SuggestionTable.getSuggestionsForSite(remoteBlogId); + // if the suggestions are not stored yet, we want to trigger an update for it + if (suggestions.isEmpty()) { + serviceConnectionManager.bindToService(); + } + suggestionAdapter.setSuggestionList(suggestions); + return suggestionAdapter; + } + + public static TagSuggestionAdapter setupTagSuggestions(final int remoteBlogId, Context context, SuggestionServiceConnectionManager serviceConnectionManager) { + Blog blog = WordPress.wpDB.getBlogForDotComBlogId(Integer.toString(remoteBlogId)); + boolean isDotComFlag = (blog != null && blog.isDotcomFlag()); + + return SuggestionUtils.setupTagSuggestions(remoteBlogId, context, serviceConnectionManager, isDotComFlag); + } + + public static TagSuggestionAdapter setupTagSuggestions(final int remoteBlogId, Context context, SuggestionServiceConnectionManager serviceConnectionManager, boolean isDotcomFlag) { + if (!isDotcomFlag) { + return null; + } + + TagSuggestionAdapter tagSuggestionAdapter = new TagSuggestionAdapter(context); + + List<Tag> tags = SuggestionTable.getTagsForSite(remoteBlogId); + // if the tags are not stored yet, we want to trigger an update for it + if (tags.isEmpty()) { + serviceConnectionManager.bindToService(); + } + tagSuggestionAdapter.setTagList(tags); + return tagSuggestionAdapter; + } +} |