/*
* 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.model;
import android.content.Context;
import com.tweetlanes.android.core.Constant;
import com.tweetlanes.android.core.Constant.LaneType;
import com.tweetlanes.android.core.R;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.socialnetlib.android.SocialNetConstant;
import org.tweetalib.android.TwitterConstant;
import org.tweetalib.android.TwitterContentHandleBase;
import org.tweetalib.android.model.TwitterList;
import org.tweetalib.android.model.TwitterLists;
import org.tweetalib.android.model.TwitterUser;
import java.util.ArrayList;
import java.util.Vector;
public class AccountDescriptor {
private static final String KEY_ID = "id";
private static final String KEY_SCREEN_NAME = "screenName";
private static final String KEY_NAME = "name";
private static final String KEY_OAUTH_TOKEN = "oAuthToken";
private static final String KEY_OAUTH_SECRET = "oAuthSecret";
private static final String KEY_INITIAL_LANE_INDEX = "lastLaneIndex";
private static final String KEY_LISTS = "lists";
private static final String KEY_LIST_ID = "id";
private static final String KEY_LIST_NAME = "name";
private static final String KEY_DISPLAYED_LANES = "displayedLanes";
private static final String KEY_SOCIAL_NET_TYPE = "socialNetType";
private static final String KEY_PROFILE_IMAGE_URL = "profileImageUrl";
/*
*
*/
public AccountDescriptor(Context context, TwitterUser user, String oAuthToken,
String oAuthSecret, SocialNetConstant.Type oSocialNetType, String oprofileImageUrl) {
mId = user.getId();
mScreenName = user.getScreenName();
mName = user.getName();
mOAuthToken = oAuthToken;
mOAuthSecret = oAuthSecret;
mInitialLaneIndex = null;
mSocialNetType = oSocialNetType;
mContext = context;
mProfileImageUrl = oprofileImageUrl;
initCommon(null);
}
/*
*
*/
public AccountDescriptor(Context context, String jsonAsString) {
mContext = context;
try {
JSONObject object = new JSONObject(jsonAsString);
mId = object.getLong(KEY_ID);
mScreenName = object.getString(KEY_SCREEN_NAME);
if (object.has(KEY_NAME)) {
mName = object.getString(KEY_NAME);
}
mOAuthToken = object.getString(KEY_OAUTH_TOKEN);
if (object.has(KEY_OAUTH_SECRET)) {
mOAuthSecret = object.getString(KEY_OAUTH_SECRET);
}
if (object.has(KEY_INITIAL_LANE_INDEX)) {
mInitialLaneIndex = object.getInt(KEY_INITIAL_LANE_INDEX);
} else {
mInitialLaneIndex = null;
}
if (object.has(KEY_SOCIAL_NET_TYPE)) {
mSocialNetType = SocialNetConstant.Type.valueOf((String) object
.get(KEY_SOCIAL_NET_TYPE));
} else {
mSocialNetType = SocialNetConstant.Type.Twitter;
}
if (object.has(KEY_PROFILE_IMAGE_URL)) {
mProfileImageUrl = object.getString(KEY_PROFILE_IMAGE_URL);
}
if (object.has(KEY_LISTS)) {
mLists = new Vector<List>();
String listsAsString = object.getString(KEY_LISTS);
JSONArray jsonArray = new JSONArray(listsAsString);
for (int i = 0; i < jsonArray.length(); i++) {
// JSONObject listObject = jsonArray.getJSONObject(i);
String listString = jsonArray.getString(i);
List list = new List(listString);
mLists.add(list);
}
}
ArrayList<String> displayedLanes = new ArrayList<String>();
if (object.has(KEY_DISPLAYED_LANES)) {
String displayedLanedAsString = object
.getString(KEY_DISPLAYED_LANES);
JSONArray jsonArray = new JSONArray(displayedLanedAsString);
for (int i = 0; i < jsonArray.length(); i++) {
String laneIdentifier = jsonArray.getString(i);
displayedLanes.add(laneIdentifier);
}
}
initCommon(displayedLanes);
} catch (JSONException e) {
e.printStackTrace();
}
}
/*
*
*/
private void initCommon(ArrayList<String> displayedLanes) {
mShouldRefreshLists = true;
mLaneDefinitions = new ArrayList<LaneDescriptor>();
if (mLists == null) {
mLists = new Vector<List>();
}
configureLaneDefinitions(displayedLanes);
}
/*
*
*/
private void configureLaneDefinitions(ArrayList<String> displayedLanes) {
mLaneDefinitions.clear();
mLaneDefinitions
.add(new LaneDescriptor(Constant.LaneType.USER_PROFILE,
mContext.getString(R.string.lane_user_profile),
new TwitterContentHandleBase(
TwitterConstant.ContentType.USER)));
mLaneDefinitions.add(new LaneDescriptor(
Constant.LaneType.USER_PROFILE_TIMELINE, mContext
.getString(mSocialNetType == SocialNetConstant.Type.Twitter ? R.string.lane_user_tweets : R
.string.lane_user_tweets_adn),
new TwitterContentHandleBase(
TwitterConstant.ContentType.STATUSES,
TwitterConstant.StatusesType.USER_TIMELINE)));
mLaneDefinitions.add(new LaneDescriptor(
Constant.LaneType.RETWEETS_OF_ME, mContext
.getString(mSocialNetType == SocialNetConstant.Type.Twitter ? R.string
.lane_user_retweets_of_me : R.string.lane_user_retweets_of_me_adn),
new TwitterContentHandleBase(
TwitterConstant.ContentType.STATUSES,
TwitterConstant.StatusesType.RETWEETS_OF_ME)));
mLaneDefinitions.add(new LaneDescriptor(
Constant.LaneType.USER_HOME_TIMELINE, mContext
.getString(R.string.lane_user_home),
new TwitterContentHandleBase(
TwitterConstant.ContentType.STATUSES,
TwitterConstant.StatusesType.USER_HOME_TIMELINE)));
mLaneDefinitions.add(new LaneDescriptor(
Constant.LaneType.USER_MENTIONS, mContext
.getString(R.string.lane_user_mentions),
new TwitterContentHandleBase(
TwitterConstant.ContentType.STATUSES,
TwitterConstant.StatusesType.USER_MENTIONS)));
if (mSocialNetType == SocialNetConstant.Type.Appdotnet) {
mLaneDefinitions.add(new LaneDescriptor(
Constant.LaneType.GLOBAL_FEED, mContext.getString(
R.string.lane_user_global_feed),
new TwitterContentHandleBase(
TwitterConstant.ContentType.STATUSES,
TwitterConstant.StatusesType.GLOBAL_FEED)));
}
if (mSocialNetType == SocialNetConstant.Type.Twitter) {
mLaneDefinitions.add(new LaneDescriptor(
Constant.LaneType.DIRECT_MESSAGES, mContext
.getString(R.string.lane_direct_messages),
new TwitterContentHandleBase(
TwitterConstant.ContentType.DIRECT_MESSAGES,
TwitterConstant.DirectMessagesType.ALL_MESSAGES)));
// Add lists
synchronized (mLists) {
for (List list : mLists) {
if (list.mId != null) {
mLaneDefinitions
.add(new LaneDescriptor(
Constant.LaneType.USER_LIST_TIMELINE,
list.mName,
String.valueOf(list.mId),
new TwitterContentHandleBase(
TwitterConstant.ContentType.STATUSES,
TwitterConstant.StatusesType.USER_LIST_TIMELINE)));
}
}
}
}
// Add the final batch
mLaneDefinitions.add(new LaneDescriptor(Constant.LaneType.FRIENDS,
mContext.getString(R.string.lane_friends),
new TwitterContentHandleBase(TwitterConstant.ContentType.USERS,
TwitterConstant.UsersType.FRIENDS)));
mLaneDefinitions.add(new LaneDescriptor(Constant.LaneType.FOLLOWERS,
mContext.getString(R.string.lane_followers),
new TwitterContentHandleBase(TwitterConstant.ContentType.USERS,
TwitterConstant.UsersType.FOLLOWERS)));
mLaneDefinitions.add(new LaneDescriptor(
Constant.LaneType.USER_FAVORITES, mContext.getString(
R.string.lane_user_favorites),
new TwitterContentHandleBase(
TwitterConstant.ContentType.STATUSES,
TwitterConstant.StatusesType.USER_FAVORITES)));
if (displayedLanes != null && displayedLanes.size() > 0) {
for (LaneDescriptor lane : mLaneDefinitions) {
boolean display = false;
for (String laneTitle : displayedLanes) {
if (lane.getLaneTitle().equals(laneTitle)) {
display = true;
break;
}
}
if (lane.getDisplay() != display) {
lane.setDisplay(display);
mLaneDefinitionsDirty = true;
}
}
}
}
/*
*
*/
public boolean updateTwitterLists(TwitterLists twitterLists) {
mShouldRefreshLists = false;
if (mLists != null) {
mLists.clear();
} else {
mLists = new Vector<List>();
}
boolean changed = false;
if (twitterLists != null && twitterLists.getListCount() > 0) {
for (int i = 0; i < twitterLists.getListCount(); i++) {
TwitterList twitterList = twitterLists.getList(i);
mLists.add(new List(twitterList));
boolean exists = false;
for (LaneDescriptor lane : mLaneDefinitions) {
if (lane.getLaneType() == LaneType.USER_LIST_TIMELINE) {
try {
String laneIdAsString = lane.getIdentifier();
Long id = Long.valueOf(laneIdAsString);
if (id == twitterList.getId()) {
exists = true;
if (!lane.getLaneTitle().equals(
twitterList.getName())) {
changed = true;
lane.setLaneTitle(twitterList.getName());
}
break;
}
} catch (NumberFormatException e) {
changed = true;
break;
}
}
}
if (!exists) {
changed = true;
}
}
}
if (changed) {
ArrayList<String> activeLanes = new ArrayList<String>();
for (LaneDescriptor lane : mLaneDefinitions) {
if (lane.getDisplay()) {
activeLanes.add(lane.getLaneTitle());
}
}
configureLaneDefinitions(activeLanes);
}
return changed;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
public String toString() {
JSONObject object = new JSONObject();
try {
object.put(KEY_ID, mId);
object.put(KEY_SCREEN_NAME, mScreenName);
object.put(KEY_NAME, mName);
object.put(KEY_OAUTH_TOKEN, mOAuthToken);
object.put(KEY_OAUTH_SECRET, mOAuthSecret);
object.put(KEY_INITIAL_LANE_INDEX, mInitialLaneIndex);
object.put(KEY_SOCIAL_NET_TYPE, mSocialNetType);
object.put(KEY_PROFILE_IMAGE_URL, mProfileImageUrl);
if (mLists.size() > 0) {
JSONArray listArray = new JSONArray();
for (List list : mLists) {
listArray.put(list.toString());
}
object.put(KEY_LISTS, listArray);
}
if (mLaneDefinitions != null && mLaneDefinitions.size() > 0) {
JSONArray laneDisplayArray = new JSONArray();
for (LaneDescriptor lane : mLaneDefinitions) {
if (lane.getDisplay()) {
laneDisplayArray.put(lane.getLaneTitle());
}
}
object.put(KEY_DISPLAYED_LANES, laneDisplayArray);
}
} catch (JSONException e) {
e.printStackTrace();
}
return object.toString();
}
/*
*
*/
public long getId() {
return mId;
}
public String getScreenName() {
return mScreenName;
}
public String getName() {
if (mName == null) {
return getScreenName();
} else {
return mName;
}
}
public String getOAuthToken() {
return mOAuthToken;
}
public String getOAuthSecret() {
return mOAuthSecret;
}
public String getProfileImageUrl() {
return mProfileImageUrl;
}
public void setProfileImageUrl(String profileImageUrl) {
mProfileImageUrl = profileImageUrl;
}
public String getAccountKey() {
return mScreenName.toLowerCase() + "_" + (getSocialNetType() == SocialNetConstant.Type.Twitter ? "twitter" :
"appdotet");
}
public String getAccountKey30Chars() {
String key = (getSocialNetType() == SocialNetConstant.Type.Twitter ? "t" :
"a") + "_" + mScreenName.toLowerCase();
int length = 30;
if (key.length() < length) {
length = key.length();
}
return key.substring(0, length);
}
/*
*
*/
public int getInitialLaneIndex() {
if (mInitialLaneIndex != null
&& mInitialLaneIndex.intValue() < getDisplayedLaneDefinitionsSize()) {
return mInitialLaneIndex;
}
int displayIndex = 0;
for (LaneDescriptor lane : mLaneDefinitions) {
if (lane.getLaneType() == LaneType.USER_HOME_TIMELINE) {
return displayIndex;
}
displayIndex += 1;
}
return 0;
}
/*
*
*/
public void setCurrentLaneIndex(int index) {
mInitialLaneIndex = index;
}
public int getCurrentLaneIndex(LaneType laneType) {
int visibleIndex = -1;
for (int i = 0; i < mLaneDefinitions.size(); ++i) {
LaneDescriptor lane = mLaneDefinitions.get(i);
if (lane.getDisplay()) {
visibleIndex++;
}
if (lane.getLaneType() == laneType) {
return visibleIndex;
}
}
return -1;
}
/*
*
*/
public ArrayList<LaneDescriptor> getAllLaneDefinitions() {
return mLaneDefinitions;
}
/*
*
*/
public LaneDescriptor getDisplayedLaneDefinition(int index) {
int displayedSize = 0;
for (LaneDescriptor lane : mLaneDefinitions) {
if (lane.getDisplay()) {
if (displayedSize == index) {
return lane;
}
displayedSize += 1;
}
}
return null;
}
/*
*
*/
public int getDisplayedLaneDefinitionsSize() {
int displayedSize = 0;
for (LaneDescriptor lane : mLaneDefinitions) {
if (lane.getDisplay()) {
displayedSize += 1;
}
}
return displayedSize;
}
/*
*
*/
public boolean getDisplayedLaneDefinitionsDirty() {
return mLaneDefinitionsDirty;
}
/*
*
*/
public void setDisplayedLaneDefinitionsDirty(boolean value) {
mLaneDefinitionsDirty = value;
}
public SocialNetConstant.Type getSocialNetType() {
return mSocialNetType;
}
/*
*
*/
public boolean shouldRefreshLists() {
return mShouldRefreshLists;
}
/*
*
*/
private long mId;
private String mScreenName;
private String mName;
private String mOAuthToken;
private String mOAuthSecret;
private ArrayList<LaneDescriptor> mLaneDefinitions;
private boolean mLaneDefinitionsDirty;
private Integer mInitialLaneIndex;
private Vector<List> mLists;
private boolean mShouldRefreshLists;
private final Context mContext;
private SocialNetConstant.Type mSocialNetType;
private String mProfileImageUrl;
/*
* Stripped version of the List class. Possibly should use TwitterList, but
* I thought I thought it best to save the string space of that much larger
* structure
*/
private class List {
List(TwitterList twitterList) {
mId = twitterList.getId();
mName = twitterList.getName();
}
List(String jsonAsString) {
try {
JSONObject object = new JSONObject(jsonAsString);
mId = object.getInt(KEY_LIST_ID);
mName = object.getString(KEY_LIST_NAME);
} catch (JSONException e) {
e.printStackTrace();
}
}
public String toString() {
JSONObject object = new JSONObject();
try {
object.put(KEY_LIST_NAME, mName);
object.put(KEY_LIST_ID, mId);
} catch (JSONException e) {
e.printStackTrace();
}
return object.toString();
}
Integer mId;
String mName;
}
}