Share My Creation MashStudio: Diving deeper into FontAwesome

Hi

After being inspired by this post, I decided that today I will embark on MashStudio, a fontawesome tool that anyone can use to explore and export fontawesome icons. Well, I wanted a library like FontAwesome for my B4i app, but then again, decided that I will just create this instead.

With this tool, one is able to:

1. View all fonts in a categorized format.
2. Search for a font
3. Design your own font (by specifing its R[ed], G[reen], B[lue] and also Size)
4. Save the font image icon and share it (can save to your dropbox for later use)

The size of the created font icons is between 10-100 and they have a white background. Would be nice to have them transparent though.

Enjoy..

PS: here is the apk. Now updated to include functionality to specify hex values
 

Attachments

  • start.png
    start.png
    335.5 KB · Views: 3,262
  • categories.png
    categories.png
    177.8 KB · Views: 388
  • search.png
    search.png
    17.4 KB · Views: 329
  • font.png
    font.png
    21 KB · Views: 359
  • share.png
    share.png
    36.6 KB · Views: 409
Last edited:

NJDude

Expert
Licensed User
Longtime User
Make sure you target SDK < 23 or use the Runtime Permissions library, your app crashes on Marshmallow, also, check your layouts they do not look right.

See the screenshots (phone): Shot 1, Shot 2, Shot 3
Tablet: Shot 1, Shot 2

Also, try not to use DirRootExternal, because after uninstalling the app you leave behind orphan files, better to use DirDefaultExternal.

These are the logs:
B4X:
** Activity (main) Create, isFirst = true **
keyvaluestore_initialize (java line: 269)
android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
	at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
	at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:207)
	at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:191)
	at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
	at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
	at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
	at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:806)
	at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:791)
	at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)
	at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:669)
	at anywheresoftware.b4a.sql.SQL.Initialize(SQL.java:37)
	at com.Mash.MashStudio.keyvaluestore._initialize(keyvaluestore.java:269)
	at com.Mash.MashStudio.modmashiane._vvvvvvvvvvvvvvvvv5(modmashiane.java:2810)
	at com.Mash.MashStudio.modmashiane._initialize(modmashiane.java:2787)
	at com.Mash.MashStudio.main._activity_create(main.java:352)
	at java.lang.reflect.Method.invoke(Native Method)
	at anywheresoftware.b4a.BA.raiseEvent2(BA.java:169)
	at com.Mash.MashStudio.main.afterFirstLayout(main.java:102)
	at com.Mash.MashStudio.main.access$000(main.java:17)
	at com.Mash.MashStudio.main$WaitForLayout.run(main.java:80)
	at android.os.Handler.handleCallback(Handler.java:739)
	at android.os.Handler.dispatchMessage(Handler.java:95)
	at android.os.Looper.loop(Looper.java:148)
	at android.app.ActivityThread.main(ActivityThread.java:5422)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)


-----------------------------------

** Activity (frmfonts) Create, isFirst = false **
** Activity (frmfonts) Resume **
** Activity (frmfonts) Pause, UserClosed = true **
** Activity (frmcategories) Resume **
** Activity (frmcategories) Pause, UserClosed = true **
** Activity (main) Resume **
java.lang.IllegalStateException: Underflow in restore - more restores than saves
	at android.graphics.Canvas.native_restore(Native Method)
	at android.graphics.Canvas.restore(Canvas.java:540)
	at com.andexert.library.RippleView.draw(RippleView.java:146)
	at android.view.View.updateDisplayListIfDirty(View.java:15180)
	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
	at android.view.View.updateDisplayListIfDirty(View.java:15140)
	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
	at android.view.View.updateDisplayListIfDirty(View.java:15140)
	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
	at android.view.View.updateDisplayListIfDirty(View.java:15140)
	at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
	at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
	at android.view.View.updateDisplayListIfDirty(View.java:15140)
	at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:281)
	at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:287)
	at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:322)
	at android.view.ViewRootImpl.draw(ViewRootImpl.java:2623)
	at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2442)
	at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2075)
	at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1115)
	at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6023)
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
	at android.view.Choreographer.doCallbacks(Choreographer.java:670)
	at android.view.Choreographer.doFrame(Choreographer.java:606)
	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
	at android.os.Handler.handleCallback(Handler.java:739)
	at android.os.Handler.dispatchMessage(Handler.java:95)
	at android.os.Looper.loop(Looper.java:148)
	at android.app.ActivityThread.main(ActivityThread.java:5422)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
 
Last edited:

Mashiane

Expert
Licensed User
Longtime User
Make sure you target SDK < 23 or use the Runtime Permissions library, your app crashes on Marshmallow, also, check your layouts they do not look right.

See the screenshots (phone): Shot 1, Shot 2, Shot 3
Tablet: Shot 1, Shot 2

Also, try not to use DirRootExternal, because after uninstalling the app you leave behind orphan files, better to use DirDefaultExternal.

These are the logs:
B4X:
** Activity (main) Create, isFirst = true **
keyvaluestore_initialize (java line: 269)
android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
    at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
    at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:207)
    at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:191)
    at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
    at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
    at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
    at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:806)
    at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:791)
    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)
    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:669)
    at anywheresoftware.b4a.sql.SQL.Initialize(SQL.java:37)
    at com.Mash.MashStudio.keyvaluestore._initialize(keyvaluestore.java:269)
    at com.Mash.MashStudio.modmashiane._vvvvvvvvvvvvvvvvv5(modmashiane.java:2810)
    at com.Mash.MashStudio.modmashiane._initialize(modmashiane.java:2787)
    at com.Mash.MashStudio.main._activity_create(main.java:352)
    at java.lang.reflect.Method.invoke(Native Method)
    at anywheresoftware.b4a.BA.raiseEvent2(BA.java:169)
    at com.Mash.MashStudio.main.afterFirstLayout(main.java:102)
    at com.Mash.MashStudio.main.access$000(main.java:17)
    at com.Mash.MashStudio.main$WaitForLayout.run(main.java:80)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5422)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)


-----------------------------------

** Activity (frmfonts) Create, isFirst = false **
** Activity (frmfonts) Resume **
** Activity (frmfonts) Pause, UserClosed = true **
** Activity (frmcategories) Resume **
** Activity (frmcategories) Pause, UserClosed = true **
** Activity (main) Resume **
java.lang.IllegalStateException: Underflow in restore - more restores than saves
    at android.graphics.Canvas.native_restore(Native Method)
    at android.graphics.Canvas.restore(Canvas.java:540)
    at com.andexert.library.RippleView.draw(RippleView.java:146)
    at android.view.View.updateDisplayListIfDirty(View.java:15180)
    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
    at android.view.View.updateDisplayListIfDirty(View.java:15140)
    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
    at android.view.View.updateDisplayListIfDirty(View.java:15140)
    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
    at android.view.View.updateDisplayListIfDirty(View.java:15140)
    at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
    at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
    at android.view.View.updateDisplayListIfDirty(View.java:15140)
    at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:281)
    at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:287)
    at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:322)
    at android.view.ViewRootImpl.draw(ViewRootImpl.java:2623)
    at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2442)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2075)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1115)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6023)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
    at android.view.Choreographer.doCallbacks(Choreographer.java:670)
    at android.view.Choreographer.doFrame(Choreographer.java:606)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5422)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Thanks a lot, your advise is valuable, will look into this asap.
 
Top