An MVP Dribbble client for Android Mobile, Tablet, Wear and TV.

Related tags

App Bourbon
Overview

Bourbon

Build Status Android Arsenal ![Sidebar] (https://img.shields.io/badge/Sidebar-06%2F05%2F2016-orange.svg)

Get it on Google Play!

Bourbon Header

Bourbon is a simple Dribbble client built for Android Mobile, Wear and TV (it's also optimised for tablets). It was built as an experiment for sharing code through a common-code module when using an MVP architectural approach.

Structure


Bourbon uses a CoreCommon module to share code amongst the different application packages, you can see from the long list below that this allows us to re-use a lot of the code for our app! The CoreCommon modules contains:

  • BourbonApplication - This is a standard Android application class that I’ve simply re-used for each of the application modules. This essentially uses Dagger to set up our ApplicationComponent and Timber for logging purposes.

  • Data Models - Seeing as our application modules are all going to be displaying the same data, it makes sense for them to share the Data Models. There are only 4 (minimal) models used in the application (Shot, User, Comment, Image) but sharing them in this module makes it easier to maintain them if they change at any point.

  • DataManager - The DataManager class acts as a middle-man for communication with the BourbonService. Again, the application modules all access the same data so sharing the DataManager is just logical.

  • BourbonService - The BourbonService states the endpoints and manages the retrieval of data from them. So as above with the DataManager, the behaviour is the same across application modules.

  • Dagger Injection Components and Modules - Seeing as we now know our three application modules use the same DataManager, BourbonService etc - it only makes sense to also share the logic related to Dagger injection. If you look at the injection package, you’ll see that there are several classes declaring components and modules, meaning that the same dependancies can be injected across the applications.

  • Base Presenter and MvpView - Bourbon uses base classes for Presenters and MvpViews that should be used when created new classes of these kinds. For this purpose, using them through the CoreCommon module ensures that all classes are extending or implementing the same base classes - this again also reduces code duplication.

  • BrowseMvpView & BrowsePresenter - The Browse screen for each of our application modules behaves in exactly the same way. A list of shots is retrieved and that list if displayed to the user - however, showing / hiding progress indicators, making an API request and correctly displaying with any empty / error states to the user. This means that the Presenter classes will contain the same logic and the MvpView interfaces will define exactly the same interface methods. Fir this reason it makes sense for both the BrowseMvpView & BrowsePresenter to be kept in the CoreCommon module so that these classes only need to be defined once to be shared across our application modules.

  • ShotMvpView & ShotPresenter - The same applies to the screens used to display Shot Details. The class and interface used to handle the display of content on the screen, so we share the ShotMvpView and ShotPresenter through the CoreCommon module.

  • Colors, String & Dimension files - Bourbon has specific branding colors, so this isn’t going to change across it’s applications modules. The same also goes for the Strings used throughout the application, there are also some Dimension values that also hold true to this. Because of this, I’ve placed these values in resource files in the CoreCommon module — meaning that they can be shared across the application modules. Now if any of these colors or Strings needs to be changed, I only have to do it once!

  • TestDataFactory - The TestDataFactory is a class used to construct dummy data models that are used in both the Unit and Instrumentation tests. For this purpose this class exists in the CoreCommon module, which is where the AndroidTestCommon module can access this class from.

  • Unit Tests - Because the classes requiring unit test are found in the CoreCommon module, the Unit Tests can also be found here. A separate package contains tests for the DataManager and Presenter classes defined in the CoreCommon module.

Features


You can read more about bourbon here, but here's a quick look at the current features of the application:

Browse Shots

The user can browse the latest 20 shots on their mobile, tablet, wear or TV device:

Browse Screenshots

On these screens, we also account for error states:

Error Screenshots

and lets not forget about empty states either:

Empty Screenshots

Shot Details & Comments

Upon selecting a shot the user can view a shots image alongside any comments for that shot, as shown below:

Detail Screenshots

Comments on Wear and TV are also displayed, just in a different manner due to the nature of the devices:

Comments Screenshots

Coming Soon

I wanted to write about and ship this once V1 was finished, but soon I plan on:

  • Implementing animations / motion events for transitioning views and screens
  • Add user profile screens
  • Pagination when browsing shots
  • And anything else I think of...

Requirements

  • Android SDK.
  • Android 5.0 (API 21) .
  • Android SDK Tools
  • Android SDK Build tools 23.0.2
  • Android Support Repository
  • Android Support libraries

Building

To build, install and run a debug version, run this from the root of the project:

./gradlew app:assembleDebug

Testing

To run the Unit Test found in the CoreCommon module, run the following command from the root of the project:

./gradlew corecommon:testDebugUnitTest

As mentioned the the structure section above, each of the instrumentation tests are split into a seperate module. You can run the instrumentation tests for these modules by running the commands below from the root of the project:

To run instrumentation tests for mobile:

./gradlew mobile-androidTest:connectedAndroidTest

To run instrumentation tests for wear:

./gradlew wear-androidTest:connectedAndroidTest

To run instrumentation tests for TV:

./gradlew tv-androidTest:connectedAndroidTest
Comments
  • Fixed gson field name

    Fixed gson field name

    API response gson of user has html_url and avatar_url.

        "user": {
          "id": 285475,
          "name": "Markus Magnusson ",
          "username": "MarkusM",
          "html_url": "https://dribbble.com/MarkusM",
          "avatar_url": "https://d13yacurqjgara.cloudfront.net/users/285475/avatars/normal/7ab1fc9d69e079e2dc11095fd74908cf.png?1432660315",
          "bio": "<a href=\"https://instagram.com/motionmarkus/\" rel=\"nofollow noreferrer\">instagram.com/motionmarkus</a>\n",
          "location": "Sweden",
          "links": {
            "web": "http://markusmagnusson.tv",
            "twitter": "https://twitter.com/MotionMarkus"
          },
    
    

    But the field names of user model are different.

    public class User implements Parcelable {
    
        public String htmlUrl;
        public String avatarUrl;
    

    So I added @SerializedName annotation.

    opened by konifar 2
  • Fix broken headings in Markdown files

    Fix broken headings in Markdown files

    GitHub changed the way Markdown headings are parsed, so this change fixes it.

    See bryant1410/readmesfix for more information.

    Tackles bryant1410/readmesfix#1

    opened by bryant1410 1
  • Pagination support

    Pagination support

    I noticed that you don't yet have support for Pagination https://github.com/hitherejoe/Bourbon/blob/6467d8db064f00a9e6614f63744e98982c353a9d/CoreCommon/src/main/java/com/hitherejoe/bourboncorecommon/ui/shot/ShotPresenter.java#L20

    I am actually trying to set up Pagination myself in my own project. I have it completely set up and it works without an MVP design pattern. But now I am trying to set up MVP and trying to figure out where the logic for pagination should go.

    How would you go about this? Things like currentPage or isLastPage are some State variables I would like to keep track of to set up Pagination. But where should this logic be? In the view, the presenter, or the model?

    opened by lawloretienne 0
  • Benefit of using RxSchedulersOverrideRule instead of toBlocking

    Benefit of using RxSchedulersOverrideRule instead of toBlocking

    I would like to know what is the benefit of using the RxSchedulersOverrideRule TestRule instead of the toBlocking? Is it only to avoid attaching toBlocking to every call in every test method? Or the possibility to run the tests on the JVM avoiding the RxAndroid Scheduler?

    opened by akoufa 1
  • Could not find com.google.android.support:wearable:1.4.0

    Could not find com.google.android.support:wearable:1.4.0

    When I try to build it with ./gradlew app:assembleDebug I'm getting

    FAILURE: Build failed with an exception.What went wrong: A problem occurred configuring project ':wear-androidTest'. Could not resolve all dependencies for configuration ':wear-androidTest:_debugCompile'. Could not find com.google.android.support:wearable:1.4.0. Searched in the following locations: https://jcenter.bintray.com/com/google/android/support/wearable/1.4.0/wearable-1.4.0.pom https://jcenter.bintray.com/com/google/android/support/wearable/1.4.0/wearable-1.4.0.jar file:/home/fr/sdk/extras/android/m2repository/com/google/android/support/wearable/1.4.0/wearable-1.4.0.pom file:/home/fr/sdk/extras/android/m2repository/com/google/android/support/wearable/1.4.0/wearable-1.4.0.jar file:/home/fr/sdk/extras/google/m2repository/com/google/android/support/wearable/1.4.0/wearable-1.4.0.pom file:/home/fr/sdk/extras/google/m2repository/com/google/android/support/wearable/1.4.0/wearable-1.4.0.jar Required by: Bourbon:wear-androidTest:unspecified Could not find com.google.android.support:wearable:1.4.0. Searched in the following locations: https://jcenter.bintray.com/com/google/android/support/wearable/1.4.0/wearable-1.4.0.pom https://jcenter.bintray.com/com/google/android/support/wearable/1.4.0/wearable-1.4.0.jar file:/home/fr/sdk/extras/android/m2repository/com/google/android/support/wearable/1.4.0/wearable-1.4.0.pom file:/home/fr/sdk/extras/android/m2repository/com/google/android/support/wearable/1.4.0/wearable-1.4.0.jar file:/home/fr/sdk/extras/google/m2repository/com/google/android/support/wearable/1.4.0/wearable-1.4.0.pom file:/home/fr/sdk/extras/google/m2repository/com/google/android/support/wearable/1.4.0/wearable-1.4.0.jar Required by: Bourbon:wear-androidTest:unspecified > Bourbon:wear:unspecified Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. BUILD FAILED

    opened by farmazon3000 1
A project which demonstrate how to develop a custom client on android for dribbble.com

##What is this? This is a project with custom client app on android for https://dribbble.com, which you can browse the popular icon and animation, lik

ZhangLei 599 Nov 14, 2022
Linux GUI for Kuri's userspace tablet drivers. Supports non-wacom (XP-Pen, Huion, Gaomon) graphics tablets and pen displays

Kuri's Userspace tablet driver utility (GUI) This is a new GUI implementation for the userland driver I've written here: https://github.com/kurikaesu/

Aren Villanueva 12 Jan 4, 2023
🏀 An Android app for dribbble.com

Mango Mango is an Android application for Dribbble. Inspired by Resplash, Plaid and Protein. Features ✨ Kotlin and RxKotlin: Yes, fully written in Kot

Li Zhao Tai Lang 657 Dec 22, 2022
The implementation of https://dribbble.com/shots/2067564-Replace

FlyRefresh The Android implementation of Replace, designed by Zee Youn. I implement this as a FlyRefresh layout. The content of the layout can be any

吴晶 2.9k Nov 29, 2022
A free and open-source offline authenticator app for Wear OS.

Wristkey Need 2FA codes quickly, right on your Wear watch without needing a phone? Wristkey is an open-source 2FA client for Wear OS watches that does

Owais Shaikh 80 Jan 4, 2023
HackerNews reader app for Wear OS

HNReader Install by importing to Android Studio, building the apk, and Google the official Android documentation for loading the apps to Wear OS and f

Hikmat Jafarli 2 Sep 4, 2022
Android app built with MVP architectural approach and uses Marvel Comics API that allows developers everywhere to access information about Marvel's vast library of comics. :zap:

Villains & Heroes Android app built with MVP architectural approach and uses Marvel Comics API that allows developers everywhere to access information

André Mion 53 Jul 13, 2022
Movie discovery app showcasing MVP, RxJava, Dagger 2 and Clean Architecture

MovieGuide ?? Refactoring in progress ??‍♀️ ⛏ ?? ??️ ?? ?? ?? Comments and new issues are welcome. ?? Currently not accepting external PRs that touch

Arun Sasidharan 2.6k Dec 25, 2022
Simple Mvp Implementation

Froggy Simple Mvp Implementation Download Gragle: compile 'ru.bullyboo.mvp:froggy:1.0.2' Maven: <dependency> <groupId>ru.bullyboo.mvp</groupId>

Rostislav Sharafutdinov 15 Mar 17, 2019
This is a work-in-progress (🔧️) ultraviolet index viewer app for demonstrating Instant Apps + Kotlin + Dagger + MVP

UV Index A simple ultraviolet index viewer app for demonstrating: Instant Apps + Kotlin + Dagger + MVP Built With Weatherbit as weather API Android In

Mustafa Berkay Mutlu 65 Oct 31, 2022
Mobile client for official Nextcloud News App written as Kotlin Multiplatform Project

Newsout Android and iOS mobile client for Nextcloud news App. The Android client is already available to download in the Play Store. F-Droid and Apple

Simon Schubert 118 Oct 3, 2022
An unofficial Zerotier Android client patched from official client

An unofficial Zerotier Android client patched from official client

KAAAsS 819 Dec 29, 2022
MEGA Android Client - A fully-featured client to access your Cloud Storage provided by MEGA

A fully-featured client to access your Cloud Storage provided by MEGA. This document will guide you to build the application on a Linux machine with Android Studio.

Mega Limited 1.1k Jan 3, 2023
Tonomy ID is the cross-platform mobile wallet (Android and iOS) for public and private EOSIO blockchains

Tonomy ID is the cross-platform mobile wallet (Android and iOS) for public and private EOSIO blockchains. This application allows you to sign transactions on the block chain, share your DID and Verifiable Credentials containing your identity with others in a consensual way and log into web2 and web3 applications. If you lose your phone several mechanisms exist to allow you to recover your account without trusting anyone with custody of your private keys.

null 7 Dec 24, 2022
Open Super dApp - Your gateway to the new digital commons. Integrated mobile messenger, Ethereum wallet, and Web 3.0 browser built on open, decentralized, and encrypted protocols.

A fully open source, open standard, decentralized "super app" including a secure, encrypted Matrix compatible messenger based off of the Element Messenger, and an Ethereum crypto wallet and web3 browser based off of Alpha Wallet.

2Gather 6 Jul 25, 2022
Extensible Android mobile voice framework: wakeword, ASR, NLU, and TTS. Easily add voice to any Android app!

Spokestack is an all-in-one solution for mobile voice interfaces on Android. It provides every piece of the speech processing puzzle, including voice

Spokestack 57 Nov 20, 2022
Mobile translation application built using android studio and java.

Translate I'm here when you need translation ?? ?? Libraries used in the project : implementation 'com.google.mlkit:translate:16.1.2' implementation '

Nisa Efendioğlu 9 Aug 29, 2022
Clean Architecture Kotlin Multiplatform Mobile (KMM) with Android Instrument Test and Unit Test

The-Movies: Clean Architecture Kotlin Multiplatform Mobile What're inside? - Jetpack Compose - Hilt - Ktor - Android Instrument Test - Unit Test - SQL

null 17 Dec 5, 2022