SlideShare ist ein Scribd-Unternehmen logo
1 von 72
Downloaden Sie, um offline zu lesen
Write once, ship multiple
times
ŽELJKO PLESAC
Independent design & development agency
107 people in 3 offices
18 Android engineers
WHITE LABEL SYSTEMS
A white label product is a product or
service produced by one company
(the producer) that other companies
(the marketers) rebrand to make it
appear as if they had made it.
- WIKIPEDIA
Provides your brand with a refined product.
Outsourcing the development to a trusted thirty-party company.
Saving time and money.
Lack of control.
Lack of customisation.
Unified product vision.
HOW TO BUILD WHITE LABEL APPS?
NO.
Carefully
designing the
system.
PREREQUISITES
THOU SHALL NOT USE FAT CLIENTS.
Fat clients
• not customisable on the fly
• new app version for each new
feature
• prone to errors
• hard to maintain
MOST OF THE SYSTEMS FAIL ON THIS
POINT.
SYSTEM ARCHITECTURE
Flavours.
Modules.
FLAVOUR ARCHITECTURE
Main flavour.
Product flavours.
MAIN FLAVOUR
• default product
• used only for demo purposes
• contains shared code
• uses default set of resources
• can be customised by configuration file
FLAVOURS
• each flavour is an application
• holds product specific resources
• contains only product specific code
• should be as minimal as possible
ADVANTAGES
Easy to maintain and develop.
Easy to configure.
Resource and code sharing between main flavour and product flavour.
DISADVANTAGES
Customisation is extremely hard.
Exponential increase of files and resources.
MODULE ARCHITECTURE
Main module.
Product module.
MAIN MODULE
• set of core functionalities
• default resources
• can be configured by configuration file
PRODUCT MODULES
• each module is one app
• product specific code and resources
ADVANTAGES
Easy to customise.
Apps are isolated.
Business logic can be product specific.
DISADVANTAGES
Hard to maintain.
Losing focus.
CUSTOMIZE APP BEHAVIOUR
BUILD CONFIG FILE
Customise constant values between the apps.
productFlavors {
white {
dimension ‘product’
applicationId ‘com.infinum.white’
buildConfigField STRING, GOOGLE_ANALYTICS_ID, ‘”analyticsIdForWhite”’
buildConfigField STRING, API_URL, ‘”www.api.co/white/v1”’
manifestPlaceholders = [urlScheme: “white”]
}
blue {
dimension ‘product’
applicationId ‘com.infinum.blue’
buildConfigField STRING, GOOGLE_ANALYTICS_ID, ‘”analyticsIdForBlue”’
buildConfigField STRING, API_URL, ‘”www.api.co/blue/v1”’
manifestPlaceholders = [urlScheme: “blue”]
}
}
HostModule.setEndpoint(BuildConfig.API_URL);
AnalyticsModule.setGoogleAnalyticsId(BuildConfig.
GOOGLE_ANALYTICS_ID);
BONUS - CUSTOMISE RESOURCES
applicationVariants.all {

resValue XML_STRING, SEARCH_AUTHORITY, applicationId + '.providers.SearchSuggestionsProvider'

}
CONFIGURATION FILE
Locally cached or obtained from the API.
More flexible that BuildConfig file.
Descriptive method naming.
CUSTOMISE APPLICATION ON THE FLY
• enable/disable features
• data flow
• screen flow
public interface AppConfig {
boolean isSocialLoginEnabled();
List<MenuItem> getLoggedInUserNavigationMenu();
}
public class WhiteConfiguration implements AppConfig {
private static final List<MenuItem> LOGGED_IN_USER_NAVIGATION_MENU = Collections.unmodifiableList(Arrays.asList(
new MenuItem(R.drawable.ic_gamepad, R.string.home),
new MenuItem(R.drawable.ic_settings, R.string.settings),
new MenuItem(R.drawable.ic_settings, R.string.info)
));
@Override
public boolean isSocialLoginEnabled() {
return !BuildConfig.DEBUG || BuildConfig.APPLICATION_ID.endsWith(STAGING_APP_ID);
}
@Override
public List<MenuItem> getLoggedInUserNavigationMenu() {
return LOGGED_IN_USER_NAVIGATION_MENU;
}
}
DESCRIPTIVE METHODS
Method names should be descriptive and should not contain product names.
public interface AppConfig {
boolean isWhite();
boolean isBlue();
}
PROGRAM TO INTERFACES
INTERFACES
Extract functionalities.
Integrate with external dependencies.
Default or product specific implementation.
public interface ImageLoader {
void displayImage(ImageView imageView, @NonNull String imageUrl);
void displayImage(ImageView imageView, @NonNull File imageFile);
}
@Module
public class ProvidersModule {
@Provides
public ImageLoader provideImageLoader(ImageLoaderType type) {
switch(type){
case GLIDE:
return new GlideImageLoader();
default:
return new PicassoImageLoader();
}
}
provided with
configuration file
Include external dependencies only for specific product types.
whiteCompile 'com.github.bumptech.glide:glide:3.6.1'
blueCompile 'com.github.bumptech.glide:glide:3.5.0’
GROUP FUNCTIONALITIES IN
FEATURES
Features
Each functionality is a feature.
Can be enabled/disabled.
Can be customised.
Feature
Contains everything what’s needed
for their integration.
Opened or closed.
CUSTOMISATION EXAMPLES
Default resources + product specific resources.
Default resources + product specific resources.
Same key is needed.
Provide presenter implementation per product.
Provide presenter implementation per product.
DI has to be handled per product (no default option).
Interfaces, features and configuration.
Interfaces, features and configuration.
Provide default and custom configuration.
Interfaces, features and configuration.
Provide default and custom configuration.
WHAT?
Feature has a default navigation flow, but it has to be customised only for one
or two products.
public interface Navigation {
<T> void createTrip(FragmentActivity activity, int
createTripRequestCode, Map<String, T> params);
}
public interface NavigationBehaviour {
<T> void startCreateTripScreen(FragmentActivity activity, int createTripRequestCode, Map<String, T>
params);
}
public class NavigationManager implements Navigation {
private NavigationBehaviour navigationBehaviour;
public NavigationManager(NavigationBehaviour navigationBehaviour) {
this.navigationBehaviour = navigationBehaviour;
}
@Override
public <T> void createTrip(FragmentActivity activity, int createTripRequestCode, Map<String, T>
params) {
navigationBehaviour.startCreateTripScreen(activity, createTripRequestCode, params);
}
}
public class DefaultNavigationBehaviour implements NavigationBehaviour {
@Override
public <Parcelable> void startCreateTripScreen(FragmentActivity activity, int createTripRequestCode,
Map<String, Parcelable> params) {
Intent intent = CreateTripActivity.newIntent(activity, TripType.WALKING, recentStops);
activity.startActivityForResult(intent, createTripRequestCode);
}
}
public class BlueNavigationBehaviour implements NavigationBehaviour {
@Override
public <Parcelable> void startCreateTripScreen(FragmentActivity activity, int createTripRequestCode,
Map<String, Parcelable> params) {
Intent intent = PlanTripActivity.newIntent(activity, TripType.CAR, recentStops);
activity.startActivityForResult(intent, createTripRequestCode);
}
}
CUSTOMIZE EVERYTHING?
When too much customisation is needed.
Different product vision.
FLAVOUR MODULE
STAND ALONE
APPLICATION
ROUNDUP
Thin clients.
Architecture planning.
Offer limited customisation.
Leave the system.
Visit infinum.co or find us on social networks:
infinum.co infinumco infinumco infinum
Thank you!
ZELJKO.PLESAC@INFINUM.CO
@ZELJKOPLESAC

Weitere ähnliche Inhalte

Was ist angesagt?

Case study: integrating azure with google app engine
Case study: integrating azure with google app engine Case study: integrating azure with google app engine
Case study: integrating azure with google app engine
Miguel Scotter
 

Was ist angesagt? (12)

Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android DevelopmentBeing Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
 
An api is not "yet another feature"
An api is not "yet another feature"An api is not "yet another feature"
An api is not "yet another feature"
 
What is java fx?
What is java fx?What is java fx?
What is java fx?
 
Evolve13 cq-commerce-framework
Evolve13 cq-commerce-frameworkEvolve13 cq-commerce-framework
Evolve13 cq-commerce-framework
 
Material Design Android
Material Design AndroidMaterial Design Android
Material Design Android
 
Case study: integrating azure with google app engine
Case study: integrating azure with google app engine Case study: integrating azure with google app engine
Case study: integrating azure with google app engine
 
Material design basics
Material design basicsMaterial design basics
Material design basics
 
AEM 6.0 Touch-optimized UI
AEM 6.0 Touch-optimized UIAEM 6.0 Touch-optimized UI
AEM 6.0 Touch-optimized UI
 
Developing Custom Controls with UI5 (OpenUI5 video lecture)
Developing Custom Controls with UI5 (OpenUI5 video lecture)Developing Custom Controls with UI5 (OpenUI5 video lecture)
Developing Custom Controls with UI5 (OpenUI5 video lecture)
 
Hacking the Explored App by Adding Custom Code (UI5con 2016)
Hacking the Explored App by Adding Custom Code (UI5con 2016)Hacking the Explored App by Adding Custom Code (UI5con 2016)
Hacking the Explored App by Adding Custom Code (UI5con 2016)
 
DEEPAK RAWAT
DEEPAK RAWATDEEPAK RAWAT
DEEPAK RAWAT
 
Selenium Based Visual Test Automation
Selenium Based Visual Test AutomationSelenium Based Visual Test Automation
Selenium Based Visual Test Automation
 

Ähnlich wie Write once, ship multiple times

Fundamentals of Product Definition Process - MRD PRD FRD
Fundamentals of Product Definition Process - MRD PRD FRDFundamentals of Product Definition Process - MRD PRD FRD
Fundamentals of Product Definition Process - MRD PRD FRD
Leon Kotovich
 
WSO2Con US 2013 - Keynote: Developing Enterprise Apps In the Cloud
WSO2Con US 2013 - Keynote: Developing Enterprise Apps In the CloudWSO2Con US 2013 - Keynote: Developing Enterprise Apps In the Cloud
WSO2Con US 2013 - Keynote: Developing Enterprise Apps In the Cloud
WSO2
 
Modeveast Appcelerator Presentation
Modeveast Appcelerator PresentationModeveast Appcelerator Presentation
Modeveast Appcelerator Presentation
Aaron Saunders
 

Ähnlich wie Write once, ship multiple times (20)

Better User Experience with .NET
Better User Experience with .NETBetter User Experience with .NET
Better User Experience with .NET
 
Justinmind prototyping: Interactive Requirements for your Software Developmen...
Justinmind prototyping: Interactive Requirements for your Software Developmen...Justinmind prototyping: Interactive Requirements for your Software Developmen...
Justinmind prototyping: Interactive Requirements for your Software Developmen...
 
VS Code and Modern Development Environment Preview
VS Code and Modern Development Environment PreviewVS Code and Modern Development Environment Preview
VS Code and Modern Development Environment Preview
 
Use AppDynamics SDK to Integrate with your Applications - AppSphere16
Use AppDynamics SDK to Integrate with your Applications - AppSphere16Use AppDynamics SDK to Integrate with your Applications - AppSphere16
Use AppDynamics SDK to Integrate with your Applications - AppSphere16
 
IBM MobileFirst - Hybrid Application Development with Worklight
IBM MobileFirst - Hybrid Application Development with WorklightIBM MobileFirst - Hybrid Application Development with Worklight
IBM MobileFirst - Hybrid Application Development with Worklight
 
apidays LIVE New York 2021 - Docs Driven API Development by Rahul Dighe, Paypal
apidays LIVE New York 2021 - Docs Driven API Development by Rahul Dighe, Paypalapidays LIVE New York 2021 - Docs Driven API Development by Rahul Dighe, Paypal
apidays LIVE New York 2021 - Docs Driven API Development by Rahul Dighe, Paypal
 
Leaner and Smarter: How Enterprises Can Develop Better Digital Products (v2)
Leaner and Smarter: How Enterprises Can Develop Better Digital Products (v2)Leaner and Smarter: How Enterprises Can Develop Better Digital Products (v2)
Leaner and Smarter: How Enterprises Can Develop Better Digital Products (v2)
 
Fundamentals of Product Definition Process - MRD PRD FRD
Fundamentals of Product Definition Process - MRD PRD FRDFundamentals of Product Definition Process - MRD PRD FRD
Fundamentals of Product Definition Process - MRD PRD FRD
 
Building Cross-Platform JavaScript Apps using Cordova
Building Cross-Platform JavaScript Apps using CordovaBuilding Cross-Platform JavaScript Apps using Cordova
Building Cross-Platform JavaScript Apps using Cordova
 
Failure is an Option: Scaling Resilient Feature Delivery
Failure is an Option: Scaling Resilient Feature DeliveryFailure is an Option: Scaling Resilient Feature Delivery
Failure is an Option: Scaling Resilient Feature Delivery
 
Automation for the Humans
Automation for the HumansAutomation for the Humans
Automation for the Humans
 
WSO2Con US 2013 - Keynote: Developing Enterprise Apps In the Cloud
WSO2Con US 2013 - Keynote: Developing Enterprise Apps In the CloudWSO2Con US 2013 - Keynote: Developing Enterprise Apps In the Cloud
WSO2Con US 2013 - Keynote: Developing Enterprise Apps In the Cloud
 
Open event presentation.3 2
Open event presentation.3 2Open event presentation.3 2
Open event presentation.3 2
 
Modeveast Appcelerator Presentation
Modeveast Appcelerator PresentationModeveast Appcelerator Presentation
Modeveast Appcelerator Presentation
 
Feature flag launchdarkly
Feature flag launchdarklyFeature flag launchdarkly
Feature flag launchdarkly
 
Managing Internal, Private External, and Open Developer Ecosystems
Managing Internal, Private External, and Open Developer EcosystemsManaging Internal, Private External, and Open Developer Ecosystems
Managing Internal, Private External, and Open Developer Ecosystems
 
Test & Learn: Building & Deploying Resilient Products - How Feature Flags & O...
Test & Learn: Building & Deploying Resilient Products - How Feature Flags & O...Test & Learn: Building & Deploying Resilient Products - How Feature Flags & O...
Test & Learn: Building & Deploying Resilient Products - How Feature Flags & O...
 
Do You Enjoy Espresso in Android App Testing?
Do You Enjoy Espresso in Android App Testing?Do You Enjoy Espresso in Android App Testing?
Do You Enjoy Espresso in Android App Testing?
 
James Turner (Caplin) - Enterprise HTML5 Patterns
James Turner (Caplin) - Enterprise HTML5 PatternsJames Turner (Caplin) - Enterprise HTML5 Patterns
James Turner (Caplin) - Enterprise HTML5 Patterns
 
A Test Automation Platform Designed for the Future
A Test Automation Platform Designed for the FutureA Test Automation Platform Designed for the Future
A Test Automation Platform Designed for the Future
 

Mehr von Željko Plesac (7)

What the hype
What the hypeWhat the hype
What the hype
 
Crash wars - The handling awakens v3.0
Crash wars - The handling awakens v3.0Crash wars - The handling awakens v3.0
Crash wars - The handling awakens v3.0
 
Crash wars - The handling awakens
Crash wars - The handling awakensCrash wars - The handling awakens
Crash wars - The handling awakens
 
Crash Wars - The handling awakens
Crash Wars  - The handling awakensCrash Wars  - The handling awakens
Crash Wars - The handling awakens
 
Android Lollipop
Android LollipopAndroid Lollipop
Android Lollipop
 
Android tips and tricks
Android tips and tricksAndroid tips and tricks
Android tips and tricks
 
Android studio
Android studioAndroid studio
Android studio
 

Kürzlich hochgeladen

AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
VictorSzoltysek
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
mohitmore19
 

Kürzlich hochgeladen (20)

AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTV
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docx
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
How to Choose the Right Laravel Development Partner in New York City_compress...
How to Choose the Right Laravel Development Partner in New York City_compress...How to Choose the Right Laravel Development Partner in New York City_compress...
How to Choose the Right Laravel Development Partner in New York City_compress...
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS LiveVip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 

Write once, ship multiple times