/* * Copyright (C) 2013 Chris Lacy 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.tweetlanes.android.core.view; import android.app.Activity; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.LinearLayout; import android.widget.RelativeLayout; import com.tweetlanes.android.core.R; import com.tweetlanes.android.core.util.LazyImageLoader; import org.socialnetlib.android.SocialNetConstant; import org.tweetalib.android.TwitterConstant; import org.tweetalib.android.TwitterContentHandle; import org.tweetalib.android.TwitterContentHandleBase; import org.tweetalib.android.TwitterFetchResult; import org.tweetalib.android.TwitterManager; import org.tweetalib.android.callback.TwitterFetchStatusesFinishedCallback; import org.tweetalib.android.model.TwitterStatus; import org.tweetalib.android.model.TwitterStatuses; public class ConversationView extends LinearLayout { private Callbacks mCallbacks; private TwitterStatus mTwitterStatus; private RelativeLayout mLoadingView; private TwitterContentHandle mContentHandle; private TwitterStatuses mConversationStatuses; private LinearLayout mConversationView; private LayoutInflater mInflater; private SocialNetConstant.Type mSocialNetType; private String mCurrentAccountKey; /* * */ public ConversationView(Context context) { super(context); } public ConversationView(Context context, AttributeSet attrs) { super(context, attrs); } public ConversationView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public interface Callbacks { Activity getActivity(); LazyImageLoader getProfileImageLoader(); LazyImageLoader getPreviewImageLoader(); } /* * */ public void configure(TwitterStatus twitterStatus, LayoutInflater inflater, Callbacks callbacks, SocialNetConstant.Type socialNetType, String currentAccountKey) { mTwitterStatus = twitterStatus; mInflater = inflater; mCallbacks = callbacks; mSocialNetType = socialNetType; mCurrentAccountKey = currentAccountKey; mLoadingView = (RelativeLayout) findViewById(R.id.conversation_feed_loading); mConversationView = (LinearLayout) findViewById(R.id.conversation_feed_loaded); TwitterContentHandleBase base = new TwitterContentHandleBase( TwitterConstant.ContentType.STATUSES, TwitterConstant.StatusesType.PREVIOUS_CONVERSATION); mContentHandle = new TwitterContentHandle(base, twitterStatus.mUserScreenName, Long.valueOf(mTwitterStatus.mId) .toString(), currentAccountKey); TwitterStatuses cachedStatuses = TwitterManager.get().getContentFeed( mContentHandle); if (cachedStatuses != null && cachedStatuses.getStatusCount() > 0) { setStatuses(cachedStatuses); updateViewVisibility(true); } else { TwitterManager.get().triggerFetchStatuses(mContentHandle, null, new TwitterFetchStatusesFinishedCallback() { @Override public void finished(TwitterFetchResult result, TwitterStatuses feed, TwitterContentHandle handle) { if (!mContentHandle.getKey().equals(handle.getKey())) { Log.w("Statuses", "content handle changed"); return; } if (result.isSuccessful()) { setStatuses(feed); } updateViewVisibility(true); } }, 1); } } /* * */ private void setStatuses(TwitterStatuses statuses) { if (statuses != null && statuses.getStatusCount() > 0) { mConversationStatuses = new TwitterStatuses(); for (int i = 0; i < statuses.getStatusCount(); i++) { TwitterStatus status = statuses.getStatus(i); if (status.mId != mTwitterStatus.mId) { mConversationStatuses.add(new TwitterStatus(status)); } } if (mConversationStatuses.getStatusCount() == 0) { mConversationStatuses = null; } } } /* * */ private void updateViewVisibility(boolean loadHasFinished) { if (!loadHasFinished && (mConversationStatuses == null || mConversationStatuses .getStatusCount() == 0)) { mLoadingView.setVisibility(View.VISIBLE); } else { mLoadingView.setVisibility(View.GONE); mConversationView.removeAllViews(); if (mConversationStatuses == null || mConversationStatuses.getStatusCount() == 0) { View view = getLoadMoreView(); mConversationView.addView(view); } else { for (int i = 0; i < mConversationStatuses.getStatusCount(); ++i) { View view = getTweetFeedView(i, mConversationStatuses.getStatus(i)); mConversationView.addView(view); } } } } /* * */ View getTweetFeedView(int position, TwitterStatus item) { View convertView = mInflater.inflate( R.layout.tweet_feed_conversation_item, null); TweetFeedItemView tweetFeedItemView = (TweetFeedItemView) convertView .findViewById(R.id.tweetFeedItem); TweetFeedItemView.Callbacks callbacks = new TweetFeedItemView.Callbacks() { @Override public boolean onSingleTapConfirmed(View view, int position) { return false; } @Override public void onLongPress(View view, int position) { } @Override public Activity getActivity() { return mCallbacks.getActivity(); } @Override public void onUrlClicked(TwitterStatus status) { } @Override public void onConversationViewToggle(long statusId, boolean show) { } @Override public LayoutInflater getLayoutInflater() { return null; } @Override public LazyImageLoader getProfileImageLoader() { return mCallbacks.getProfileImageLoader(); } @Override public LazyImageLoader getPreviewImageLoader() { return mCallbacks.getPreviewImageLoader(); } }; tweetFeedItemView.configure(item, position, callbacks, true, false, false, true, false, mSocialNetType, mCurrentAccountKey); return tweetFeedItemView; } /* * */ View getLoadMoreView() { View convertView = mInflater.inflate(R.layout.load_more, null); LoadMoreView loadMoreView = (LoadMoreView) convertView .findViewById(R.id.loadMoreView); loadMoreView.configure(LoadMoreView.Mode.NONE_FOUND); return loadMoreView; } }