diff --git a/apps/toolbox/src/main-page.xml b/apps/toolbox/src/main-page.xml
index 0342597aa1..152bbd68f6 100644
--- a/apps/toolbox/src/main-page.xml
+++ b/apps/toolbox/src/main-page.xml
@@ -13,6 +13,7 @@
+
diff --git a/apps/toolbox/src/pages/vector-image.xml b/apps/toolbox/src/pages/vector-image.xml
new file mode 100644
index 0000000000..99efa1ee8d
--- /dev/null
+++ b/apps/toolbox/src/pages/vector-image.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/packages/core/platforms/android/widgets-release.aar b/packages/core/platforms/android/widgets-release.aar
index c7c7e005da..8e54d3a15b 100644
Binary files a/packages/core/platforms/android/widgets-release.aar and b/packages/core/platforms/android/widgets-release.aar differ
diff --git a/packages/core/platforms/ios/TNSWidgets.xcframework/Info.plist b/packages/core/platforms/ios/TNSWidgets.xcframework/Info.plist
index 9534135682..83ff73fcd9 100644
--- a/packages/core/platforms/ios/TNSWidgets.xcframework/Info.plist
+++ b/packages/core/platforms/ios/TNSWidgets.xcframework/Info.plist
@@ -8,32 +8,32 @@
DebugSymbolsPath
dSYMs
LibraryIdentifier
- ios-arm64
+ ios-arm64_x86_64-simulator
LibraryPath
TNSWidgets.framework
SupportedArchitectures
arm64
+ x86_64
SupportedPlatform
ios
+ SupportedPlatformVariant
+ simulator
DebugSymbolsPath
dSYMs
LibraryIdentifier
- ios-arm64_x86_64-simulator
+ ios-arm64
LibraryPath
TNSWidgets.framework
SupportedArchitectures
arm64
- x86_64
SupportedPlatform
ios
- SupportedPlatformVariant
- simulator
CFBundlePackageType
diff --git a/packages/core/platforms/ios/TNSWidgets.xcframework/ios-arm64/TNSWidgets.framework/Info.plist b/packages/core/platforms/ios/TNSWidgets.xcframework/ios-arm64/TNSWidgets.framework/Info.plist
index 9d14283bd1..e78f57b5fd 100644
Binary files a/packages/core/platforms/ios/TNSWidgets.xcframework/ios-arm64/TNSWidgets.framework/Info.plist and b/packages/core/platforms/ios/TNSWidgets.xcframework/ios-arm64/TNSWidgets.framework/Info.plist differ
diff --git a/packages/core/platforms/ios/TNSWidgets.xcframework/ios-arm64/TNSWidgets.framework/TNSWidgets b/packages/core/platforms/ios/TNSWidgets.xcframework/ios-arm64/TNSWidgets.framework/TNSWidgets
index 4f06a4952e..e83f289111 100755
Binary files a/packages/core/platforms/ios/TNSWidgets.xcframework/ios-arm64/TNSWidgets.framework/TNSWidgets and b/packages/core/platforms/ios/TNSWidgets.xcframework/ios-arm64/TNSWidgets.framework/TNSWidgets differ
diff --git a/packages/core/platforms/ios/TNSWidgets.xcframework/ios-arm64/dSYMs/TNSWidgets.framework.dSYM/Contents/Resources/DWARF/TNSWidgets b/packages/core/platforms/ios/TNSWidgets.xcframework/ios-arm64/dSYMs/TNSWidgets.framework.dSYM/Contents/Resources/DWARF/TNSWidgets
index 53faaccc39..d2bf3e1483 100644
Binary files a/packages/core/platforms/ios/TNSWidgets.xcframework/ios-arm64/dSYMs/TNSWidgets.framework.dSYM/Contents/Resources/DWARF/TNSWidgets and b/packages/core/platforms/ios/TNSWidgets.xcframework/ios-arm64/dSYMs/TNSWidgets.framework.dSYM/Contents/Resources/DWARF/TNSWidgets differ
diff --git a/packages/core/platforms/ios/TNSWidgets.xcframework/ios-arm64_x86_64-simulator/TNSWidgets.framework/Info.plist b/packages/core/platforms/ios/TNSWidgets.xcframework/ios-arm64_x86_64-simulator/TNSWidgets.framework/Info.plist
index ff19c39faf..05d9989145 100644
Binary files a/packages/core/platforms/ios/TNSWidgets.xcframework/ios-arm64_x86_64-simulator/TNSWidgets.framework/Info.plist and b/packages/core/platforms/ios/TNSWidgets.xcframework/ios-arm64_x86_64-simulator/TNSWidgets.framework/Info.plist differ
diff --git a/packages/core/platforms/ios/TNSWidgets.xcframework/ios-arm64_x86_64-simulator/TNSWidgets.framework/TNSWidgets b/packages/core/platforms/ios/TNSWidgets.xcframework/ios-arm64_x86_64-simulator/TNSWidgets.framework/TNSWidgets
index 3c516846bb..db772dbd86 100755
Binary files a/packages/core/platforms/ios/TNSWidgets.xcframework/ios-arm64_x86_64-simulator/TNSWidgets.framework/TNSWidgets and b/packages/core/platforms/ios/TNSWidgets.xcframework/ios-arm64_x86_64-simulator/TNSWidgets.framework/TNSWidgets differ
diff --git a/packages/core/platforms/ios/TNSWidgets.xcframework/ios-arm64_x86_64-simulator/TNSWidgets.framework/_CodeSignature/CodeResources b/packages/core/platforms/ios/TNSWidgets.xcframework/ios-arm64_x86_64-simulator/TNSWidgets.framework/_CodeSignature/CodeResources
index 3d278e102e..d7582fadc0 100644
--- a/packages/core/platforms/ios/TNSWidgets.xcframework/ios-arm64_x86_64-simulator/TNSWidgets.framework/_CodeSignature/CodeResources
+++ b/packages/core/platforms/ios/TNSWidgets.xcframework/ios-arm64_x86_64-simulator/TNSWidgets.framework/_CodeSignature/CodeResources
@@ -34,7 +34,7 @@
Info.plist
- Xj1cG5BPcNRo2kinT2TzpxSuwlc=
+ WsLLFjQ3sruW6pvEfLRTXorurcg=
Modules/module.modulemap
diff --git a/packages/core/platforms/ios/TNSWidgets.xcframework/ios-arm64_x86_64-simulator/dSYMs/TNSWidgets.framework.dSYM/Contents/Resources/DWARF/TNSWidgets b/packages/core/platforms/ios/TNSWidgets.xcframework/ios-arm64_x86_64-simulator/dSYMs/TNSWidgets.framework.dSYM/Contents/Resources/DWARF/TNSWidgets
index c3dde82aa9..06242ccb3a 100644
Binary files a/packages/core/platforms/ios/TNSWidgets.xcframework/ios-arm64_x86_64-simulator/dSYMs/TNSWidgets.framework.dSYM/Contents/Resources/DWARF/TNSWidgets and b/packages/core/platforms/ios/TNSWidgets.xcframework/ios-arm64_x86_64-simulator/dSYMs/TNSWidgets.framework.dSYM/Contents/Resources/DWARF/TNSWidgets differ
diff --git a/packages/ui-mobile-base/android/gradle/wrapper/gradle-wrapper.properties b/packages/ui-mobile-base/android/gradle/wrapper/gradle-wrapper.properties
index 79d8461365..2aa9a6ed40 100644
--- a/packages/ui-mobile-base/android/gradle/wrapper/gradle-wrapper.properties
+++ b/packages/ui-mobile-base/android/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.7-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-all.zip
diff --git a/packages/ui-mobile-base/android/widgets/build.gradle b/packages/ui-mobile-base/android/widgets/build.gradle
index a8b2f37b64..f81817404f 100644
--- a/packages/ui-mobile-base/android/widgets/build.gradle
+++ b/packages/ui-mobile-base/android/widgets/build.gradle
@@ -79,6 +79,7 @@ dependencies {
implementation 'androidx.fragment:fragment:' + androidxVersion
implementation 'androidx.transition:transition:' + androidxVersion
implementation "androidx.exifinterface:exifinterface:1.3.2"
+ implementation "androidx.appcompat:appcompat:1.1.0"
} else {
println 'Using support library'
implementation 'com.android.support:support-v4:' + computeSupportVersion()
diff --git a/packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/ImageView.java b/packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/ImageView.java
index 492391870a..b4e1ecbec4 100644
--- a/packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/ImageView.java
+++ b/packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/ImageView.java
@@ -7,6 +7,9 @@
import android.graphics.*;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.shapes.RoundRectShape;
+import android.util.Log;
+
+import androidx.appcompat.app.AppCompatDelegate;
import org.nativescript.widgets.image.BitmapOwner;
import org.nativescript.widgets.image.Fetcher;
@@ -14,7 +17,7 @@
/**
* @author hhristov
*/
-public class ImageView extends android.widget.ImageView implements BitmapOwner {
+public class ImageView extends androidx.appcompat.widget.AppCompatImageView implements BitmapOwner {
private static final double EPSILON = 1E-05;
private Path path = new Path();
@@ -36,6 +39,10 @@ public class ImageView extends android.widget.ImageView implements BitmapOwner {
private Worker.OnImageLoadedListener mListener;
private boolean mAttachedToWindow = false;
+ static {
+ AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
+ }
+
public float getRotationAngle() {
return rotationAngle;
}
@@ -214,7 +221,9 @@ public void setImageBitmap(Bitmap bm) {
@Override
protected void onDraw(Canvas canvas) {
BorderDrawable background = this.getBackground() instanceof BorderDrawable ? (BorderDrawable) this.getBackground() : null;
-
+ if(this.mBitmap == null && this.getDrawable() != null) {
+ super.onDraw(canvas);
+ }
if (this.mBitmap != null) {
float borderTopLeftRadius, borderTopRightRadius, borderBottomRightRadius, borderBottomLeftRadius;
@@ -332,4 +341,4 @@ public void setBitmap(Bitmap value) {
public void setDrawable(Drawable asyncDrawable) {
this.setImageDrawable(asyncDrawable);
}
-}
\ No newline at end of file
+}
diff --git a/packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/Utils.java b/packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/Utils.java
index 63ff20ed3a..14eb2fcf7f 100644
--- a/packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/Utils.java
+++ b/packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/Utils.java
@@ -2,6 +2,7 @@
import android.content.ContentResolver;
import android.content.Context;
+import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
@@ -18,6 +19,7 @@
import android.view.View;
import android.view.ViewGroup;
+import androidx.appcompat.content.res.AppCompatResources;
import androidx.exifinterface.media.ExifInterface;
import org.json.JSONException;
@@ -31,7 +33,18 @@
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
+
public class Utils {
+ public static Drawable getDrawable(String uri, Context context){
+ String resPath = uri.substring("res://".length());
+ int resId = context.getResources().getIdentifier(resPath, "drawable", context.getPackageName());
+ if (resId > 0) {
+ return AppCompatResources.getDrawable(context, resId);
+ } else {
+ Log.v("JS", "Missing Image with resourceID: " + uri);
+ return null;
+ }
+ }
public static void drawBoxShadow(View view, String value) {
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.M) {
return;
diff --git a/packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/Image/AsyncTask.java b/packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/image/AsyncTask.java
similarity index 100%
rename from packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/Image/AsyncTask.java
rename to packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/image/AsyncTask.java
diff --git a/packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/Image/BitmapOwner.java b/packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/image/BitmapOwner.java
similarity index 100%
rename from packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/Image/BitmapOwner.java
rename to packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/image/BitmapOwner.java
diff --git a/packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/Image/Cache.java b/packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/image/Cache.java
similarity index 100%
rename from packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/Image/Cache.java
rename to packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/image/Cache.java
diff --git a/packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/Image/DiskLruCache.java b/packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/image/DiskLruCache.java
similarity index 100%
rename from packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/Image/DiskLruCache.java
rename to packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/image/DiskLruCache.java
diff --git a/packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/Image/Fetcher.java b/packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/image/Fetcher.java
similarity index 98%
rename from packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/Image/Fetcher.java
rename to packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/image/Fetcher.java
index d182946e24..e570f61382 100644
--- a/packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/Image/Fetcher.java
+++ b/packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/image/Fetcher.java
@@ -20,16 +20,15 @@
import android.content.ContentResolver;
import android.content.Context;
import android.content.res.Resources;
-import android.graphics.Matrix;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
-import androidx.exifinterface.media.ExifInterface;
+import android.graphics.Matrix;
import android.net.Uri;
import android.os.Build;
import android.os.ParcelFileDescriptor;
-import android.os.RemoteException;
import android.util.Log;
import android.util.TypedValue;
+import androidx.exifinterface.media.ExifInterface;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
@@ -377,13 +376,12 @@ public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, i
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
Bitmap bitmap = null;
- InputStream is = null;
+ InputStream is = null;
try {
- final TypedValue value = new TypedValue();
- is = res.openRawResource(resId, value);
-
- bitmap = BitmapFactory.decodeResourceStream(res, value, is, null, options);
+ final TypedValue value = new TypedValue();
+ is = res.openRawResource(resId, value);
+ bitmap = BitmapFactory.decodeResourceStream(res, value, is, null, options);
} catch (Exception e) {
/* do nothing.
If the exception happened on open, bm will be null.
@@ -391,8 +389,10 @@ public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, i
*/
}
- if (bitmap == null && options != null && options.inBitmap != null) {
- throw new IllegalArgumentException("Problem decoding into existing bitmap");
+
+ if (bitmap == null) {
+ // throw new IllegalArgumentException("Problem decoding into existing bitmap");
+ return null;
}
ExifInterface ei = getExifInterface(is);
@@ -449,7 +449,7 @@ private static ExifInterface getExifInterface(String fileName) {
/**
* Decode and sample down a bitmap from a file to the requested width and height.
*
- * @param filename The full path of the file to decode
+ * @param fileName The full path of the file to decode
* @param reqWidth The requested width of the resulting bitmap
* @param reqHeight The requested height of the resulting bitmap
* @param cache The Cache used to find candidate bitmaps for use with inBitmap
diff --git a/packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/Image/Utils.java b/packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/image/Utils.java
similarity index 100%
rename from packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/Image/Utils.java
rename to packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/image/Utils.java
diff --git a/packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/Image/Worker.java b/packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/image/Worker.java
similarity index 94%
rename from packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/Image/Worker.java
rename to packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/image/Worker.java
index 5d6b214b5c..217dc3989b 100644
--- a/packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/Image/Worker.java
+++ b/packages/ui-mobile-base/android/widgets/src/main/java/org/nativescript/widgets/image/Worker.java
@@ -26,9 +26,10 @@
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.Log;
-import android.widget.ImageView;
import java.lang.ref.WeakReference;
+import org.nativescript.widgets.Utils;
+
/**
* This class wraps up completing some arbitrary long running work when loading a bitmap to an
* ImageView. It handles things like using a memory and disk cache, running the work in a background
@@ -52,6 +53,7 @@ public abstract class Worker {
protected boolean mPauseWork = false;
protected Resources mResources;
protected ContentResolver mResolver;
+ protected Context mContext;
private static final int MESSAGE_CLEAR = 0;
private static final int MESSAGE_INIT_DISK_CACHE = 1;
private static final int MESSAGE_FLUSH = 2;
@@ -62,6 +64,7 @@ public abstract class Worker {
protected Worker(Context context) {
mResources = context.getResources();
mResolver = context.getContentResolver();
+ mContext = context;
// Negative means not initialized.
if (debuggable < 0) {
try {
@@ -102,7 +105,7 @@ public void loadImage(String uri, BitmapOwner owner, int decodeWidth, int decode
return;
}
- Bitmap value = null;
+ Object value = null;
String cacheUri = uri;
if (debuggable > 0) {
@@ -124,9 +127,14 @@ public void loadImage(String uri, BitmapOwner owner, int decodeWidth, int decode
if (debuggable > 0) {
Log.v(TAG, "loadImage.addBitmapToCache: " + owner + ", src: " + cacheUri);
}
- mCache.addBitmapToCache(cacheUri, value);
+ mCache.addBitmapToCache(cacheUri, (Bitmap) value);
}
}
+
+ /* Try loading as drawable */
+ if(value == null){
+ value = Utils.getDrawable(uri, mContext);
+ }
}
if (value != null) {
@@ -134,7 +142,12 @@ public void loadImage(String uri, BitmapOwner owner, int decodeWidth, int decode
if (debuggable > 0) {
Log.v(TAG, "Set ImageBitmap on: " + owner + " to: " + uri);
}
- owner.setBitmap(value);
+ if(value instanceof Drawable){
+ owner.setDrawable((Drawable) value);
+ }else {
+ owner.setBitmap((Bitmap) value);
+ }
+
if (listener != null) {
if (debuggable > 0) {
Log.v(TAG, "OnImageLoadedListener on: " + owner + " to: " + uri);
@@ -145,6 +158,8 @@ public void loadImage(String uri, BitmapOwner owner, int decodeWidth, int decode
final BitmapWorkerTask task = new BitmapWorkerTask(uri, owner, decodeWidth, decodeHeight, keepAspectRatio, useCache, listener);
final AsyncDrawable asyncDrawable =
new AsyncDrawable(mResources, mLoadingBitmap, task);
+
+
owner.setDrawable(asyncDrawable);
// NOTE: This uses a custom version of AsyncTask that has been pulled from the
@@ -277,7 +292,7 @@ private static String createCacheUri(String uri, int decodeHeight, int decodeWid
/**
* The actual AsyncTask that will asynchronously process the image.
*/
- private class BitmapWorkerTask extends AsyncTask {
+ private class BitmapWorkerTask extends AsyncTask {
private int mDecodeWidth;
private int mDecodeHeight;
private boolean mKeepAspectRatio;
@@ -306,13 +321,13 @@ public BitmapWorkerTask(String uri, BitmapOwner owner, int decodeWidth, int deco
* Background processing.
*/
@Override
- protected Bitmap doInBackground(Void... params) {
+ protected Object doInBackground(Void... params) {
if (debuggable > 0) {
Log.v(TAG, "doInBackground - starting work: " + imageViewReference.get() + ", on: " + mUri);
}
- Bitmap bitmap = null;
+ Object bitmap = null;
// Wait here if work is paused and the task is not cancelled
synchronized (mPauseWorkLock) {
@@ -327,8 +342,7 @@ protected Bitmap doInBackground(Void... params) {
// another thread and the ImageView that was originally bound to this task is still
// bound back to this task and our "exit early" flag is not set, then call the main
// process method (as implemented by a subclass)
- if (bitmap == null && !isCancelled() && getAttachedOwner() != null
- && !mExitTasksEarly) {
+ if (!isCancelled() && getAttachedOwner() != null && !mExitTasksEarly) {
bitmap = processBitmap(mUri, mDecodeWidth, mDecodeHeight, mKeepAspectRatio, mCacheImage);
}
@@ -341,10 +355,15 @@ protected Bitmap doInBackground(Void... params) {
if (debuggable > 0) {
Log.v(TAG, "addBitmapToCache: " + imageViewReference.get() + ", src: " + mCacheUri);
}
- mCache.addBitmapToCache(mCacheUri, bitmap);
+ mCache.addBitmapToCache(mCacheUri, (Bitmap) bitmap);
}
}
+ /* Try loading as Drawable */
+ if (bitmap == null){
+ bitmap = Utils.getDrawable(mUri, mContext);
+ }
+
if (debuggable > 0) {
Log.v(TAG, "doInBackground - finished work");
}
@@ -356,7 +375,7 @@ protected Bitmap doInBackground(Void... params) {
* Once the image is processed, associates it to the imageView
*/
@Override
- protected void onPostExecute(Bitmap value) {
+ protected void onPostExecute(Object value) {
boolean success = false;
// if cancel was called on this task or the "exit early" flag is set then we're done
if (isCancelled() || mExitTasksEarly) {
@@ -377,7 +396,11 @@ protected void onPostExecute(Bitmap value) {
if (debuggable > 0) {
Log.v(TAG, "Set ImageDrawable on: " + owner + " to: " + mUri);
}
- owner.setBitmap(value);
+ if(value instanceof Drawable){
+ owner.setDrawable((Drawable) value);
+ } else if(value instanceof Bitmap){
+ owner.setBitmap((Bitmap) value);
+ }
}
if (mOnImageLoadedListener != null) {
@@ -389,7 +412,7 @@ protected void onPostExecute(Bitmap value) {
}
@Override
- protected void onCancelled(Bitmap value) {
+ protected void onCancelled(Object value) {
super.onCancelled(value);
synchronized (mPauseWorkLock) {
mPauseWorkLock.notifyAll();
diff --git a/tools/assets/App_Resources/Android/src/main/res/drawable/outline_face_24.xml b/tools/assets/App_Resources/Android/src/main/res/drawable/outline_face_24.xml
new file mode 100644
index 0000000000..f65a88e8c8
--- /dev/null
+++ b/tools/assets/App_Resources/Android/src/main/res/drawable/outline_face_24.xml
@@ -0,0 +1,10 @@
+
+
+