This repository will not be updated. The repository will be kept available in read-only mode.
Virtual try on apps have the full potential to become the next big thing in e-commerce. They relieve much of the stress of going into a store and physically try on different products. They save consumers’ time and brands’ budget, serving as a cost-effective yet convenient alternative for trying on products.Most importantly, it makes choosing products we'll love as easy as watching in the mirror.
In this code pattern, we will develop a hybrid mobile application using IBM Mobile Foundation integrated with recommendation system , which takes in age and gender as input and based on this, it returns a personalized recommendation of jewellery products. The user can later try these jewellery products virtually using the virtual mirror feature.
When the reader has completed this Code Pattern, they will understand how to:
Please follow the below to setup and run this code pattern.
Clone this git repo. Else, in a terminal, run:
$ git clone https://github.com/IBM/virtual-mirror-for-ecommerce.git
In this step we will be building a recommendation engine which takes users's age and gender as input ,and gives out a recommendation accordingly.
We use IBM Cloud Object Storage to store the jewellery images required for recommendation and the dataset.
IBM Cloud Dashboard
, click on Catalog
and select Object Storage
service under Infrastructure
-> Storage
. Click on Create
as shown below.
Buckets
tab, click on Create bucket
. Give an unique name for the bucket. Set the selections for Resiliency (Cross Region
), Location (us-geo
) and Storage class (Standard
), and click on Create
as shown below.
Note: Make a note of the Bucket Name
as it is Important and will be used in step 4.4.2
Create Service ID
Identity & Access
(on the left side of the page), select Service IDs
and click Create
on the right top of the page. Give a name and description, and click Create.Note: Make a note of the name
of the Service ID as it is Important and will be used in step 5.4.2
Add Cloud Object Storage Writer role to that service ID
Bucket permissions
under Buckets
click on policies
.Service IDs
tab. Under Select a service ID
, select the service ID created in the above step. Under Assign a role to this service ID for this bucket
, select Writer
. Click Create policy as shown below.You should get a confirmation dialog saying “Service permission created“.
Create API Key
Service IDs
, click on the service ID created earlier. Under Access policies
, you should see the Writer
role for your bucket.API keys
tab and then click on Create
button. In the Create API key
dialog, give a name and description for the API key and click on Create
. You should get a confirmation dialog saying API key successfully created
as shown below.Download
and save the API key as shown below. Note: This is the only time you will see the key. You cannot retrieve it later.Note: Make a note of the API Key
as it is Important and will be used in step 4.4.2
To access the Cloud Object Storage service programmatically, you need to copy in your credentials, which you can find in your IBM Cloud Object Storage service credentials in IBM Cloud.
Open your IBM Cloud Data Resource list. A list of your provisioned resources is displayed.
Locate your Cloud Object Storage instance under Storage
tab and click on that.
Open the Service Credentials
tab on the right hand side of the page and give a name.
Select Include HMAC Credentials as shown bellow.
View your credentials by clicking View Credentials
.
Copy your credentials. Create a file credentials1.json
and paste the copied credentials into this file.Place this file in the directory JewelleryRecommendation
and also in the directory UploadProductsCOS
.
Replace xxxxxx
in the place holder bucket_name
with your corresponding bucket name in the file KMeans_200.py
.
xxxxxx
in the place holder bucket_name
with your corresponding bucket name in the file upload.py
.upload.py
locally to upload images and dataset to Cloud Object Storage.$ python3 upload.py
load
, as shown below.browse files
and upload data.csv
, as shown below. data.csv
can be found in the root folder of ProductDetailsDB2
.PRODUCTS
, as shown below.Next
, as shown below.Click on Next
.
Click on Begin Load
, as shown below.
NOTE: Make sure you note down the table name. In my case the table name is
ZJN44169.PRODUCTS
.
username
, password
, sg_service_url
, database
, host
, port
under credentials_1
in the file KMeans_200.py
.XXXX.YYYY
in the place holder insert
with your corresponding table name in the file KMeans_200.py
.NOTE: You can get username, password, sg_service_url, hostname, port number and Database credentials by creating/clicking New Credentials from your Db2 service instance on cloud.
Create a cloud foundry instance IBM Cloud Foundry Service and follow set of instructions for deploying python application to IBM Cloud Foundry.
NOTE: Make Sure the Cloud Foundry App gets at least 256MB
of Memory. You can verify it by going to IBM Cloud Dashboard > Resources > Cloud Foundry Apps > YOUR_APP_NAME
.
Use IBM Cloud command line interface to download, modify, and redeploy your Cloud Foundry applications and service instances.
Before you begin, download and install the IBM Cloud CLI.
After you install the command line interface, you can get started.
Change to the directory.
$ cd JewelleryRecommendation
Note : Make sure that
KMeans_200.py
,credentials1.json
,requirements.txt
,manifest.yml
andProcfile
is present in the directoryJewelleryRecommendation
.
$ ibmcloud api https://api.eu-gb.bluemix.net
$ ibmcloud login -u example@in.ibm.com -o example@in.ibm.com -s dev
NOTE: If you are using a federated ID, use the
-sso
option.$ ibmcloud login -o example@in.ibm.com -s dev -sso
NOTE: You must add single or double quotes around
username
,org_name
, andspace_name
if the value contains a space, for example,-o "my org"
.
Finally Deploy the application by following command.
$ ibmcloud cf push YOUR-APP-NAME
Example: ibmcloud cf push recommendation-engine
Once you have deployed the application Make a note of the URL
of the instance by right clicking on the Visit app URL
and copying the link.
Note: This URL
is Important as it will be used in step 4.4.2
To Test your deployment use any REST Clients like Postman. After Installing postman type https://YOUR-APP-URL/?age=40&name=Kavya&gender=F to test whether Recommendation engine works.
Now click on Send
button to run the GET /
API. The API response should be shown in the Response Body
as shown in snapshot below.
Create a cloud foundry instance IBM Cloud Foundry Service and follow set of instructions for deploying JavaScript application to IBM Cloud Foundry.
NOTE: Make Sure the Cloud Foundry App gets at least 256MB
of Memory. You can verify it by going to IBM Cloud Dashboard > Resources > Cloud Foundry Apps > YOUR_APP_NAME
.
Use IBM Cloud command line interface to download, modify, and redeploy your Cloud Foundry applications and service instances.
Before you begin, download and install the IBM Cloud CLI.
After you install the command line interface, you can get started.
Go to the VirtualMirror
directory.
$ cd VirtualMirror
$ ibmcloud api https://api.eu-gb.bluemix.net
$ ibmcloud login -u example@in.ibm.com -o example@in.ibm.com -s dev
NOTE: If you are using a federated ID, use the
-sso
option.$ ibmcloud login -o example@in.ibm.com -s dev -sso
NOTE: You must add single or double quotes around
username
,org_name
, andspace_name
if the value contains a space, for example,-o "my org"
.
Finally Deploy the application by following command.
$ ibmcloud cf push YOUR-APP-NAME
Example: ibmcloud cf push virtual-mirror
Once you have deployed the application Make a note of the URL
of the instance by right clicking on the Visit app URL
and copying the link.
Note: This URL is Important as it will be used in step 4.4.2.
The Mobile Application is the component that connects Virtual Mirror and Recommendation Engine.
Install Node.js
by downloading the setup from https://nodejs.org/en/ (Node.js 8.x or above)
$ node --version
v10.15.0
Install Cordova
$ sudo npm install -g cordova@9.0.0
$ cordova --version
9.0.0
Note: Please refer MFP documentation for compatible versions of Cordova - https://mobilefirstplatform.ibmcloud.com/tutorials/en/foundation/8.0/application-development/sdk/cordova/
Install Ionic
$ sudo npm install -g ionic@5.4.16
$ ionic --version
4.12.0
Install IBM Mobile Foundation Platform CLI
$ sudo npm install -g mfpdev-cli
$ mfpdev --version
8.0.0-2018121711
Note: If you are on Windows, instead of using sudo
, run the above command without sudo
in a command prompt opened in administrative mode.
Note: While installing MFP CLI, if you hit an error saying
npm ERR! package.json npm can't find a package.json file in your current directory.
, then it is most likely due to MFP CLI not being supported in your npm version. In such a case, downgrade your npm as below, and then install MFP CLI.$ sudo npm install -g npm@3.10.10
Install Java SDK 8 from https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
$ java -version
java version "1.8.0_101"
Note: Java version
1.8.x
is required for cordova to compile apks. Do not Download Java version11.x
. If you already have java version above1.8.x
then you can follow the guide inTROUBLESHOOTING.md
to uninstall the java and reinstall1.8.x
.
Install Maven:
On Mac, you can use brew install
for installing Maven as shown below:
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
$ brew install maven
$ mvn --version
Apache Maven 3.6.0 ...
On Windows, you can follow this Tutorial to install Maven.
Install Gradle:
On Mac, you can use brew install
for installing Maven as shown below:
$ brew install gradle
$ gradle --version
Gradle 6.3 ...
On Windows, you can follow this Tutorial to install Gradle.
In the IBM Cloud Dashboard, open Mobile Foundation. Click on Create
as shown below.
In the Mobile Foundation service overview page that gets shown, click on Service credentials
. Expand View credentials
and make a note of the url
, user
and password
as shown below.
NOTE: The
user
,password
andurl
is Important as it will be used in subsequent steps.
NOTE: Make Sure the Cloud Foundry App for Mobile Foundation-Server gets at least 768MB
of Memory.(Recommended is 1GB) You can verify it by going to IBM Cloud Dashboard > Resources > Cloud Foundry Apps > MobileFoundation-Server
as shown below.
Note: If Mobile Foundation service is not available with your current account type, then you can either:
- Upgrade your account, and avail the Mobile Foundation service's free Developer plan which allows the use of the service free for up to ten daily client devices for development and testing activities, or
Note: For
Enter the fully qualified URL of this server:
, enter theurl
mentioned in credentials followed by:443
(the default HTTPS port).$ mfpdev server add
? Enter the name of the new server profile: MyServer
? Enter the fully qualified URL of this server: https://mobilefoundation-xxxx-xxxxx.xx-xx.mybluemix.net:443
? Enter the IBM Mobile Foundation Server administrator login ID: admin
? Enter the IBM Mobile Foundation Server administrator password: **********
? Save the administrator password for this server?: Yes
? Enter the context root of the IBM Mobile Foundation administration services: mfpadmin
? Enter the IBM Mobile Foundation Server connection timeout in seconds: 30
? Make this server the default?: Yes
Verifying server configuration...
The following runtimes are currently installed on this server: mfp
Server profile 'MyServer' added successfully.
$ mfpdev server info
Name URL
---------------------------------------------------------------------------------------
MyServer https://mobilefoundation-xxxx-xxxxxx.xx-xx.mybluemix.net:443 [Default]
---------------------------------------------------------------------------------------
Note: If this step fails check
TROUBLESHOOTING.md
to fix commonly occuring errors.
NOTE: This URL is Important as it will be required in subsequent Steps.
Go to the JewelleryStoreApp
directory.
$ cd JewelleryStoreApp
Update App ID, Name and Description
in JewelleryStoreApp/config.xml
as below. Change id
, name
, description
and author
details as shown bellow.
<?xml version='1.0' encoding='utf-8'?>
<widget id="com.ibm.mfpthejewellerystore" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0" xmlns:mfp="http://www.ibm.com/mobilefirst/cordova-plugin-mfp">
<name>The Jewellery Store</name>
<description>A virtual mirror integration into ecommerce products with the help of IBM Mobile Foundation.</description>
<author email="example@in.ibm.com" href="https://github.com/IBM/virtual-mirror-for-ecommerce/blob/master/">Code Patterns Team </author>
...Specify Cloud Object Storage credentials in MFP Adapter
Recommendation Engine API & Virtual Mirror API in MFP Adapter
MobileFoundationAdapter
directory inside JewelleryStoreApp
directory.$ cd MobileFoundationAdapter
$ cd ImagesFetch
ImageFetch
adapter as shown below.
$ mfpdev adapter build
Building adapter...
Successfully built adapter
$ mfpdev adapter deploy
Verifying server configuration...
Deploying adapter to runtime mfp on https://mobilefoundation-xxxx-xxxxxx.xx-xx.mybluemix.net:443/mfpadmin...
Successfully deployed adapter
Note: In [Step 4.2], if you specified
No
toMake this server the default?
, then you need to specify the name of your server profile (MyServer
in our case) at the end ofmfpdev adapter deploy
command as shown below.$ mfpdev adapter deploy MyServer
4.4.2 Launch MFP dashboard and update adapter configurations
Launch MFP Dashboard as below:
- In the IBM Cloud dashboard, under
Cloud Foundry Services
, click on theMobile Foundation
service you created in [Step 4.2]. The service overview page that gets shown, will have the MFP dashboard embedded within it. You can also open the MFP dashboard in a separate browser tab by appending/mfpconsole
to the url mentioned in [Step 4].- Inside the MFP dashboard, in the list on the left, you will see the
ImageFetch
adapter listed.
Update MFP Adapter configuration as below:
Inside the MFP dashboard, click on the ImageFetch
adapter. Under Configurations
tab, you should see the various properties for accessing Cloud Object Storage, recommendation Engine Api and virtual Mirror Api as shown below.
The Cloud Object Storage Bucket Name
can be found in step 2.1.1, Cloud Object Storage API Key
can be found in step 2.1.2, Cloud Object Storage Endpoint
can be found by going to Cloud Object Storage Dashboard clicking on Endpoint
and the public link for Resiliency and Location as selected in step 2.1.1 and Cloud Object Storage Service ID
can be found in step 2.1.2.
The Recommendation Engine API URL
can be found in step 2.7, Virtual Mirror API URL
can be found in step 3.
NOTE: Example URL Would be something like this: https://appname.xx-xx.xx.appdomain.cloud
If the URL has a /
at the end of the link, remove the /
else it will cause problem with the mobile application.
Click on Resources
tab. You should see the various REST APIs exposed by ImageFetch
adapter as shown below.
To Test the adapter use any REST Clients like Postman.
After Installing postman type the url
created in [step 4.2] and append it with /mfp/api/adapters/ImagesFetch/resource
and /objectStorage
to test whether the adapter is establishing connection with Cloud Object Storage.
Example:
https://mobilefoundation-xxxx-xxxxxx.xx-xx.mybluemix.net/mfp/api/adapters/ImageFetch/resource/objectStorage
Now click on Send
button to run the GET /
API. The API response should get shown in the Response Body
as shown in snapshot below.
The GET API on /objectStorage
should return a JSON object containing baseUrl
and authorizationHeader
as shown below.
The GET API on /recommendationEngine
should return a JSON object containing recommendationEngineApi
as shown below.
Example:
https://mobilefoundation-xxxx-xxxxxx.xx-xx.mybluemix.net/mfp/api/adapters/ImageFetch/resource/recommendationEngine
The GET API on /virtualMirror
should return a JSON object containing VirtualMirrorApi
as shown below.
Example:
https://mobilefoundation-xxxx-xxxxxx.xx-xx.mybluemix.net/mfp/api/adapters/ImageFetch/resource/virtualMirror
Configure
-> SDK Manager
Android SDK Location
.SDK Platforms
, select Android 6.0 (Marshmallow) API Level 23
or higher. Click Apply
and then click OK
. This will install Android SDK Platform on your machine.About Device
-> Software Info
. Tap Build number
7 times to enable developer options.Developer options
and enable USB debugging
.allow
the access.Note: If you have android adb tools you can check whether your device is connected or not by entering
adb devices
.
Go back to JewelleryStoreApp
directory.
$ cd ../JewelleryStoreApp
Register the app as Shown bellow.
$ mfpdev app register
Verifying server configuration...
Registering to server:'https://mobilefoundation-xxxx-xxxxxx.xx-xx.mybluemix.net:443' runtime:'mfp'
Updated config.xml file located at: .../Ionic-MFP-App/IonicMobileApp/config.xml
Run 'cordova prepare' to propagate changes.
Registered app for platform: android
Note: In [Step 4.2], if you specified
No
toMake this server the default?
, then you need to specify the name of your server profile (MyServer
in our case) at the end ofmfpdev app deploy
command as shown below.$ mfpdev app register MyServer
Note: To Propagate changes by running
cordova prepare
$ ionic cordova build android
Note: The build
& run
commands should be executed in the JewelleryStoreApp
directory and not else where.
Note: Make sure you Connect the Android phone to your development machine by USB cable, and accept the adb access permissions.
Run application on Android device
$ ionic cordova run android
Allow the Camera Permission when prompted, we need this while using virtual mirror feature. Without this the virtual mirror will not work.
NOTE: If there is not camera prompt in your mobile device follow step 4 from
TROUBLESHOOTING.md
to fix it.
Reference: Automating Icons and Splash Screens https://blog.ionicframework.com/automating-icons-and-splash-screens/
Copy your desired app icon to JewelleryStoreApp/resources/icon.png
and app splash to JewelleryStoreApp/resources/splash.png
.
$ ionic cordova resources
For running ionic cordova resources
command, you would need to sign up on ionicframework.com and specify the credentials on the command line.
Reference: https://ionicframework.com/docs/intro/deploying/
Add following lines at the end of JewelleryStoreApp/platforms/android/app/src/main/proguard-project-mfp.txt
:
-dontwarn okhttp3.internal.huc.**
Create release build as below:
$ cd ../JewelleryStoreApp
$ ionic cordova build android --prod --release
* Set `ANDROID_HOME` environment variable as per instructions in [Step x.x]. On Mac, this is usually:
export ANDROID_HOME=/Users/
* Zip align release build as below:
$ cd ./platforms/android/build/outputs/apk/ $ ls android-release-unsigned.apk $ $ANDROID_HOME/build-tools/28.0.3/zipalign -v -p 4 android-release-unsigned.apk android-release-unsigned-aligned.apk $ ls android-release-unsigned-aligned.apk android-release-unsigned.apk
* Create self signing certificate as below:
Make a note of the `Keystore password` that you set. You would need it for signing your APK.
$ keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-alias
Enter keystore password: Re-enter new password: What is your first and last name? Unknown: XXXXX XXXXXXXX What is the name of your organizational unit?
What is the name of your organization?
What is the name of your City or Locality?
What is the name of your State or Province?
What is the two-letter country code for this unit?
Is CN=XXXXX XXXXXXXX, OU=XXX, O=XXX, L=Bangalore, ST=Karnataka, C=IN correct?
Generating 2,048 bit RSA key pair and self-signed certificate (SHA256withRSA) with a validity of 10,000 days
for: CN=XXXXX XXXXXXXX, OU=XXX, O=XXX, L=Bangalore, ST=Karnataka, C=IN
Enter key password for
$ ls android-release-unsigned-aligned.apk android-release-unsigned.apk my-release-key.jks
* Self sign APK as below:
$ $ANDROID_HOME/build-tools/28.0.3/apksigner sign --ks my-release-key.jks --out thejewellerystore.apk android-release-unsigned-aligned.apk Keystore password for signer #1: $ ls android-release-unsigned-aligned.apk my-release-key.jks android-release-unsigned.apk thejewellerystore.apk $
* Distribute `thejewellerystore.apk` by uploading to Google Play Store or to your company's internal App store.
<!--Optionally, include any troubleshooting tips (driver issues, etc)-->
<a href="https://www.freepik.com/free-photos-vectors/background">Background vector in the app and the app logo has been designed using resources from Freepik.com created by flatart - www.freepik.com</a>
# Troubleshooting
### Debugging Android hybrid app using Chrome Developer Tools
Please see [troubleshooting guide](TROUBLESHOOTING.md) for solutions to some commonly occuring problems.
* Install Google Chrome
* Open Google Chrome. Open URL `chrome://inspect/#devices`
* Connect your mobile phone to the deployment device via USB cable and you should see your device name listed on the page as shown.
<img src="https://github.com/IBM/virtual-mirror-for-ecommerce/raw/master/doc/source/images/DebugAndroidAppWithChromeDeveloperTools.png" alt="Debugging of Android app using Chrome Developer Tools" width="800" border="10" />
* Under `Devices`, click on `inspect` below your connected device.
<img src="https://github.com/IBM/virtual-mirror-for-ecommerce/raw/master/doc/source/images/DebugAndroidConsole.png" alt="Debugging of Android app using Chrome Developer Tools Console" width="800" border="10" />
* You can see the console logs here for every action that the app performs.
<!-- keep this -->
## License
This code pattern is licensed under the Apache License, Version 2. Separate third-party code objects invoked within this code pattern are licensed by their respective providers pursuant to their own separate licenses. Contributions are subject to the [Developer Certificate of Origin, Version 1.1](https://developercertificate.org/) and the [Apache License, Version 2](https://www.apache.org/licenses/LICENSE-2.0.txt).
[Apache License FAQ](https://www.apache.org/foundation/license-faq.html#WhatDoesItMEAN)