/SimpleTwitterClient

A simple twitter client leveraging the twitter API

Primary LanguageJava

Project 4 - Simple Twitter Client Part II

Simple Twitter Client is an android app that allows a user to view home and mentions timelines, view user profiles with user timelines, as well as compose and post a new tweet. The app utilizes Twitter REST API.

Time spent: 15 hours spent in total

User Stories

The following required functionality is completed:

  • The app includes all required user stories from Week 3 Twitter Client
  • User can switch between Timeline and Mention views using tabs
    • User can view their home timeline tweets.
    • User can view the recent mentions of their username.
  • User can navigate to view their own profile
    • User can see picture, tagline, # of followers, # of following, and tweets on their profile.
  • User can click on the profile image in any tweet to see another user's profile.
  • User can see picture, tagline, # of followers, # of following, and tweets of clicked user.
  • Profile view includes that user's timeline
  • User can infinitely paginate any of these timelines (home, mentions, user) by scrolling to the bottom

The following optional features are implemented:

  • User can view following / followers list through the profile

  • Implements robust error handling, check if internet is available, handle error cases, network failures

  • When a network request is sent, user sees an indeterminate progress indicator

  • User can "reply" to any tweet on their home timeline

    • The user that wrote the original tweet is automatically "@" replied in compose
  • User can click on a tweet to be taken to a "detail view" of that tweet

  • User can take favorite (and unfavorite) or retweet actions on a tweet

  • Improve the user interface and theme the app to feel twitter branded

  • User can search for tweets matching a particular query and see results

  • User can see a counter with total number of characters left for tweet on compose tweet page

  • User can click a link within a tweet body on tweet details view. The click will launch the web browser with relevant page opened.

  • User can pull down to refresh tweets timeline

  • User can open the twitter app offline and see last loaded tweets. Persisted in SQLite tweets are refreshed on every application launch. While "live data" is displayed when app can get it from Twitter API, it is also saved for use in offline mode.

The following bonus features are implemented:

  • Use Parcelable instead of Serializable using the popular Parceler library.
  • Apply the popular Butterknife annotation library to reduce view boilerplate.
  • User can view their direct messages (or send new ones)
  • User can see embedded image media within the tweet detail view
  • User can watch embedded video within the tweet
  • Compose tweet functionality is build using modal overlay
  • Leverage the popular GSON library to streamline the parsing of JSON data.
  • Leverage RecyclerView as a replacement for the ListView and ArrayAdapter for all lists of tweets.
  • Move the "Compose" action to a FloatingActionButton instead of on the AppBar.
  • Replace Picasso with Glide for more efficient image rendering.

The following additional features are implemented:

  • Created a User profile fragment to reduce the responsibilities of the profile fragment
  • Implemented a progress bar at the end of the RecyclerView using a heterogeneous RecyclerView where one of the view types is the progress bar.
  • When viewing a user's profile page, include their twitter wallpaper as the background header.
  • Used Nate's smart fragment pager adapter class!
  • Used the Ribot style guide - https://github.com/ribot/android-guidelines/blob/master/project_and_code_guidelines.md
  • Created a TwitterManager that encapsulates twitter logic and reduce code smells in the TimelineActivity. The twitter manager interacts with the twitter client.
  • Added functional action buttons for reply, retweet and favorite to both the timeline view and the details activity for every tweet.
  • Error handling for offline mode and failed network requests
  • The floating action bar disappears as you scroll the recylcer view.
  • Use the verify_credentials end point to get and store a current user object
  • Use high res profile pic images by using the _bigger version for user profile pictures
  • Add a back button to the tweet details screen
  • Add a back button to the profile activity
  • Round media images embedded inside of tweets like twitter does
  • Make liberal use of include XML files to re-use XML layouts between the timeline and the activity for rendering tweets. For instance I created an XML layout for the tweet action buttons (reply, retweet, favorite) and then included that in the tweet item for the RecyclerView and in the tweet details layout.
  • RecyclerView uses a heterogenous layout - one for tweets, one for tweets with media, one for the progress bar. XML includes and ViewHolder inheritance were used to minimize code bloat with the two layouts.
  • After posting a new tweet - auto scroll the recycler view so the new post is in view
  • Preserve bitmap quality when using Glide
  • Add an adapter animation (AlphaInAnimationAdapter) using the RecyclerView animations library which I thought looked pretty slick.

Video Walkthrough

Here's a walkthrough of implemented user stories:

Video Walkthrough

Here's a walkthrough of offline mode:

Offline Walkthrough

GIF created with LiceCap.

Notes

This assignment went fairly smoothly. I liked how we got to build on top of the week 3 assignment!

Open-source libraries used

  • Android Async HTTP - Simple asynchronous HTTP requests with JSON parsing
  • Glide - Image loading and caching library for Android
  • Parceler - Remove boilerplate around making model objects parcelable
  • RecyclerView Animators - Make RecyclerView animations easy!
  • Gson - streamline JSON parsing into models
  • Butterknife - Remove view binding boilerplate
  • RoundedImageView - For rounding profile pictures and rich media in the twitter timeline

License

Copyright 2016 Scott MacGregor

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.