com.tweetlanes.android.core.model.AccountDescriptor.java Source code

Java tutorial

Introduction

Here is the source code for com.tweetlanes.android.core.model.AccountDescriptor.java

Source

/*
 * 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;
    }
}