Projects
Venyoo app icon

Venyoo

Sole developer (iOS + Android) · iOS Dec 2018 – Feb 2019 · Android Oct 2018 – May 2019

The native iOS and Android companion clients for Venyoo, a website callback / live-chat lead-capture SaaS - turning the leads a business's site generates into a mobile inbox with push deep-linking, a per-project pipeline, and a rich filter builder.

iOSAndroidCRMLive chatSwiftJava
Venyoo login screen with email and password fields and a red Login buttonNavigation menu with the signed-in user profile and sections for chats and settingsChats list showing active client conversationsAn open chat conversation with a client showing the message threadComposing a reply in a chat with the on-screen keyboard openComposing a message with the template picker for canned responsesMessage composer with quick-reply suggestions above the keyboardQuick replies settings listing saved canned responsesSettings screen with account and chat optionsChat settings with quick answers enabled

Venyoo (venyoo.ru) is a SaaS that puts a callback / live-chat lead-capture widget on business websites. When a visitor requests a callback, sends an SMS, or messages through a social channel, the widget captures that as a lead. These two apps - one native iOS, one native Android - are the mobile companion clients for the business owner / sales agent, not the end consumer.

They turn the leads a website generates into a mobile inbox: browse an infinite-scroll feed of incoming leads, open one to see the prospect's contact details, question, region, and source, one-tap dial or email them, move each lead through a color-coded per-project pipeline status, and slice the stream with a rich date / project / status / device / social-network filter builder. Alongside the lead inbox they surface visitor conversations with saved response templates and quick replies for frequent questions.

Both apps were built solo and share the same REST backend, Firebase Cloud Messaging push with deep-linking straight to a lead, resource localization for the market, and Crashlytics reporting. The iOS client is 100% Swift on UIKit + storyboards in a classic MVC arrangement, with cross-cutting concerns behind singleton services and a NotificationCenter event bus; the Android client is Java on a single-Activity AndroidX Navigation Component architecture with fragment-centric MVC and greenrobot EventBus.

Architecture & engineering highlights

  • Transparent 401 re-authentication with request replay (both platforms) - on any HTTP 401 the networking layer silently re-authenticates with stored credentials, swaps in the fresh token, and re-issues the original request so callers never see an expired session. iOS rewrites the stale token= query param via regex over a generic URLSession core; Android recursively retries the original Volley request.
  • Generic, protocol-constrained networking core (iOS) - a single request<T: JSONDecodable> funnel powers the app's typed endpoints over the Gloss JSON library, with a dedicated empty-response sentinel.
  • Push → deep-link → precise navigation (both) - parses a deep_link from the FCM payload and navigates to the exact lead detail screen while correctly handling every app state (cold launch, an already-showing detail, another tab/screen selected).
  • CRC-8 deterministic avatar generator (Android) - computes a CRC-8 hash of a client's initial to index a 22-color × 48-animal-icon palette, producing stable placeholder avatars with no server round-trips.
  • TLS-1.2 back-port + public-key-pinning scaffolding (Android) - installs a Play-Services security provider to force TLS 1.2 on KitKat; a hand-written X509TrustManager does RSA public-key pinning.
  • Reusable composable cell system - InfoItem / EditableInfoItem / SpinnerItem primitives (on FlexibleAdapter on Android, a CellData-driven selection UI on iOS) compose both lead-detail and client-info screens, with PorterDuff-tinted status swatches drawn from server-supplied hex colors.
  • Runtime EN/RU localization (iOS) - a custom LocalizationManager doing runtime language switching, not just NSLocalizedString; the Android app ships RU + RO localization. iOS also couples FCM token refresh and deferred server-side deletion to reachability and login state.

Tech stack

iOS

Swift 4.0UIKit + Storyboards (MVC)iOS 10+GlossCustom URLSession core (auto-401 replay)KingfisherGoogle Material ComponentsIQKeyboardManagerTinyConstraintslibPhoneNumberReachabilitySwiftCocoaPods 1.5.3

Android

Java 8 + LombokminSdk 21 / target 28AndroidX Navigation Component (single-Activity)VolleyGsonhandy-uri-templatesFlexibleAdapterGlideButterKnifegreenrobot EventBusTimberMaterial ComponentstransitionseverywhereGradle (AGP 3.4.0), two flavors

Shared

Firebase Cloud Messaging + APNsFabric / CrashlyticsREST backend

Some information sourced from apkpure.com. All rights belong to their respective owners.