From 49083a4ece59ac79f1f192bf97e8485c000a0caf Mon Sep 17 00:00:00 2001 From: Ephraim Muhia Date: Tue, 25 Jul 2017 14:17:21 +0300 Subject: [PATCH] Added native json form and sample app Signed-off-by: Ephraim Muhia --- .travis.yml | 62 + README.md | 20 +- android-json-form-wizard/.gitignore | 1 + android-json-form-wizard/build.gradle | 53 + android-json-form-wizard/proguard-rules.pro | 17 + .../com/vijay/jsonwizard/ApplicationTest.java | 13 + .../src/main/AndroidManifest.xml | 7 + .../material/fonts/material-icon-font.eot | Bin 0 -> 48704 bytes .../material/fonts/material-icon-font.svg | 443 +++ .../material/fonts/material-icon-font.ttf | Bin 0 -> 48492 bytes .../material/fonts/material-icon-font.woff | Bin 0 -> 22932 bytes .../fonts/material/icons-reference.html | 3533 +++++++++++++++++ .../fonts/material/source/access-alarms.svg | 9 + .../fonts/material/source/access-time.svg | 10 + .../fonts/material/source/accessibility.svg | 9 + .../fonts/material/source/account-box.svg | 9 + .../fonts/material/source/account-circle.svg | 9 + .../main/assets/fonts/material/source/adb.svg | 9 + .../fonts/material/source/add-alarm.svg | 9 + .../assets/fonts/material/source/add-box.svg | 9 + .../material/source/add-circle-outline.svg | 9 + .../fonts/material/source/add-circle.svg | 9 + .../main/assets/fonts/material/source/add.svg | 9 + .../material/source/airplane-mode-off.svg | 9 + .../material/source/airplane-mode-on.svg | 9 + .../assets/fonts/material/source/android.svg | 9 + .../assets/fonts/material/source/apps.svg | 9 + .../assets/fonts/material/source/archive.svg | 9 + .../fonts/material/source/arrow-back.svg | 9 + .../source/arrow-drop-down-circle.svg | 9 + .../fonts/material/source/arrow-drop-down.svg | 9 + .../fonts/material/source/arrow-drop-up.svg | 9 + .../fonts/material/source/arrow-forward.svg | 9 + .../fonts/material/source/attachment.svg | 9 + .../assets/fonts/material/source/auto-fix.svg | 12 + .../fonts/material/source/backspace.svg | 9 + .../assets/fonts/material/source/backup.svg | 9 + .../assets/fonts/material/source/beenhere.svg | 9 + .../assets/fonts/material/source/block.svg | 9 + .../fonts/material/source/bluetooth-audio.svg | 9 + .../material/source/bluetooth-connected.svg | 9 + .../material/source/bluetooth-disabled.svg | 9 + .../material/source/bluetooth-searching.svg | 9 + .../fonts/material/source/bluetooth.svg | 9 + .../assets/fonts/material/source/bold.svg | 9 + .../assets/fonts/material/source/book.svg | 9 + .../material/source/bookmark-outline.svg | 9 + .../assets/fonts/material/source/bookmark.svg | 9 + .../fonts/material/source/brightness-auto.svg | 9 + .../fonts/material/source/brightness-high.svg | 9 + .../fonts/material/source/brightness-low.svg | 9 + .../material/source/brightness-medium.svg | 9 + .../fonts/material/source/bug-report.svg | 9 + .../assets/fonts/material/source/cake.svg | 9 + .../assets/fonts/material/source/call-end.svg | 9 + .../fonts/material/source/call-made.svg | 9 + .../fonts/material/source/call-merge.svg | 9 + .../fonts/material/source/call-missed.svg | 9 + .../fonts/material/source/call-received.svg | 9 + .../fonts/material/source/call-split.svg | 10 + .../assets/fonts/material/source/call.svg | 9 + .../fonts/material/source/camera-alt.svg | 10 + .../fonts/material/source/camera-roll.svg | 9 + .../assets/fonts/material/source/camera.svg | 9 + .../assets/fonts/material/source/cancel.svg | 9 + .../fonts/material/source/cast-connected.svg | 9 + .../assets/fonts/material/source/cast.svg | 9 + .../assets/fonts/material/source/chat.svg | 9 + .../fonts/material/source/check-box-blank.svg | 9 + .../source/check-box-outline-blank.svg | 9 + .../material/source/check-box-outline.svg | 9 + .../fonts/material/source/check-box.svg | 9 + .../material/source/check-circle-blank.svg | 9 + .../source/check-circle-outline-blank.svg | 9 + .../material/source/check-circle-outline.svg | 9 + .../fonts/material/source/check-circle.svg | 9 + .../assets/fonts/material/source/check.svg | 9 + .../fonts/material/source/chevron-left.svg | 9 + .../fonts/material/source/chevron-right.svg | 9 + .../fonts/material/source/chromecast.svg | 9 + .../fonts/material/source/circles-add.svg | 10 + .../material/source/circles-extended.svg | 9 + .../assets/fonts/material/source/circles.svg | 10 + .../assets/fonts/material/source/clear.svg | 9 + .../fonts/material/source/close-caption.svg | 9 + .../assets/fonts/material/source/close.svg | 9 + .../fonts/material/source/cloud-circle.svg | 9 + .../fonts/material/source/cloud-done.svg | 9 + .../fonts/material/source/cloud-download.svg | 9 + .../fonts/material/source/cloud-off.svg | 9 + .../fonts/material/source/cloud-queue.svg | 9 + .../fonts/material/source/cloud-upload.svg | 9 + .../assets/fonts/material/source/cloud.svg | 9 + .../assets/fonts/material/source/comment.svg | 9 + .../fonts/material/source/communities.svg | 9 + .../fonts/material/source/content-copy.svg | 9 + .../fonts/material/source/content-cut.svg | 9 + .../fonts/material/source/content-paste.svg | 9 + .../assets/fonts/material/source/create.svg | 9 + .../fonts/material/source/credit-card.svg | 9 + .../fonts/material/source/crop-free.svg | 9 + .../fonts/material/source/crop-landscape.svg | 9 + .../fonts/material/source/crop-portrait.svg | 9 + .../fonts/material/source/crop-square.svg | 9 + .../assets/fonts/material/source/crop.svg | 9 + .../fonts/material/source/data-usage.svg | 9 + .../assets/fonts/material/source/delete.svg | 9 + .../fonts/material/source/developer-mode.svg | 9 + .../assets/fonts/material/source/dialpad.svg | 9 + .../fonts/material/source/directions-bike.svg | 9 + .../fonts/material/source/directions-bus.svg | 9 + .../fonts/material/source/directions-car.svg | 9 + .../material/source/directions-subway.svg | 9 + .../material/source/directions-train.svg | 9 + .../material/source/directions-transit.svg | 9 + .../fonts/material/source/directions.svg | 9 + .../fonts/material/source/directionswalk.svg | 9 + .../fonts/material/source/disc-full.svg | 9 + .../fonts/material/source/do-not-disturb.svg | 9 + .../assets/fonts/material/source/dock.svg | 9 + .../assets/fonts/material/source/domain.svg | 9 + .../assets/fonts/material/source/done-all.svg | 9 + .../assets/fonts/material/source/done.svg | 9 + .../assets/fonts/material/source/drafts.svg | 9 + .../fonts/material/source/drive-apk.svg | 11 + .../fonts/material/source/drive-audio.svg | 9 + .../fonts/material/source/drive-code.svg | 9 + .../fonts/material/source/drive-document.svg | 9 + .../fonts/material/source/drive-drawing.svg | 9 + .../fonts/material/source/drive-eta.svg | 9 + .../fonts/material/source/drive-file.svg | 9 + .../fonts/material/source/drive-font.svg | 11 + .../fonts/material/source/drive-form.svg | 9 + .../material/source/drive-fusiontable.svg | 9 + .../fonts/material/source/drive-image.svg | 9 + .../fonts/material/source/drive-ms-excel.svg | 9 + .../material/source/drive-ms-powerpoint.svg | 10 + .../fonts/material/source/drive-ms-word.svg | 9 + .../fonts/material/source/drive-pdf.svg | 9 + .../material/source/drive-presentation.svg | 9 + .../fonts/material/source/drive-script.svg | 9 + .../fonts/material/source/drive-site.svg | 9 + .../material/source/drive-spreadsheet.svg | 9 + .../fonts/material/source/drive-video.svg | 9 + .../fonts/material/source/drive-zip.svg | 10 + .../assets/fonts/material/source/drive.svg | 9 + .../assets/fonts/material/source/earth.svg | 9 + .../assets/fonts/material/source/email.svg | 9 + .../assets/fonts/material/source/error.svg | 9 + .../assets/fonts/material/source/event.svg | 9 + .../fonts/material/source/exit-to-app.svg | 9 + .../fonts/material/source/expand-less.svg | 9 + .../fonts/material/source/expand-more.svg | 9 + .../assets/fonts/material/source/explore.svg | 9 + .../fonts/material/source/extension.svg | 9 + .../fonts/material/source/fast-forward.svg | 9 + .../fonts/material/source/fast-rewind.svg | 9 + .../material/source/favorite-outline.svg | 9 + .../assets/fonts/material/source/favorite.svg | 9 + .../fonts/material/source/file-download.svg | 9 + .../fonts/material/source/file-upload.svg | 10 + .../assets/fonts/material/source/filter.svg | 9 + .../assets/fonts/material/source/flag.svg | 9 + .../fonts/material/source/flash-auto.svg | 9 + .../fonts/material/source/flash-off.svg | 9 + .../assets/fonts/material/source/flash-on.svg | 9 + .../assets/fonts/material/source/flights.svg | 9 + .../fonts/material/source/flip-to-back.svg | 9 + .../fonts/material/source/flip-to-front.svg | 9 + .../fonts/material/source/folder-mydrive.svg | 9 + .../fonts/material/source/folder-shared.svg | 9 + .../assets/fonts/material/source/folder.svg | 9 + .../assets/fonts/material/source/forum.svg | 9 + .../assets/fonts/material/source/forward.svg | 9 + .../fonts/material/source/fullscreen-exit.svg | 9 + .../fonts/material/source/fullscreen.svg | 9 + .../assets/fonts/material/source/gamepad.svg | 9 + .../assets/fonts/material/source/games.svg | 9 + .../assets/fonts/material/source/gesture.svg | 9 + .../assets/fonts/material/source/glass.svg | 9 + .../assets/fonts/material/source/gmail.svg | 9 + .../fonts/material/source/google-plus.svg | 9 + .../assets/fonts/material/source/google.svg | 9 + .../fonts/material/source/gps-fixed.svg | 9 + .../fonts/material/source/gps-not-fixed.svg | 9 + .../assets/fonts/material/source/gps-off.svg | 9 + .../fonts/material/source/group-add.svg | 9 + .../assets/fonts/material/source/group.svg | 9 + .../material/source/hangout-video-off.svg | 9 + .../fonts/material/source/hangout-video.svg | 9 + .../assets/fonts/material/source/hangout.svg | 9 + .../fonts/material/source/headset-mic.svg | 9 + .../assets/fonts/material/source/headset.svg | 9 + .../assets/fonts/material/source/help.svg | 9 + .../fonts/material/source/high-quality.svg | 9 + .../assets/fonts/material/source/history.svg | 9 + .../assets/fonts/material/source/home.svg | 9 + .../assets/fonts/material/source/hotel.svg | 9 + .../assets/fonts/material/source/https.svg | 9 + .../assets/fonts/material/source/image.svg | 9 + .../fonts/material/source/import-export.svg | 9 + .../assets/fonts/material/source/inbox.svg | 9 + .../fonts/material/source/info-outline.svg | 9 + .../assets/fonts/material/source/info.svg | 9 + .../fonts/material/source/invert-colors.svg | 9 + .../assets/fonts/material/source/italics.svg | 9 + .../assets/fonts/material/source/keep.svg | 9 + .../fonts/material/source/keyboard-alt.svg | 9 + .../material/source/keyboard-arrow-down.svg | 9 + .../material/source/keyboard-arrow-left.svg | 9 + .../material/source/keyboard-arrow-right.svg | 9 + .../material/source/keyboard-arrow-up.svg | 9 + .../material/source/keyboard-backspace.svg | 9 + .../material/source/keyboard-capslock.svg | 9 + .../material/source/keyboard-control.svg | 9 + .../fonts/material/source/keyboard-hide.svg | 9 + .../fonts/material/source/keyboard-return.svg | 9 + .../fonts/material/source/keyboard-tab.svg | 9 + .../fonts/material/source/keyboard-voice.svg | 9 + .../assets/fonts/material/source/keyboard.svg | 9 + .../fonts/material/source/label-outline.svg | 9 + .../assets/fonts/material/source/label.svg | 9 + .../fonts/material/source/landscape.svg | 9 + .../assets/fonts/material/source/language.svg | 9 + .../assets/fonts/material/source/laptop.svg | 9 + .../assets/fonts/material/source/launch.svg | 9 + .../assets/fonts/material/source/link.svg | 9 + .../assets/fonts/material/source/list.svg | 9 + .../fonts/material/source/live-help.svg | 9 + .../fonts/material/source/location-city.svg | 9 + .../material/source/location-disabled.svg | 9 + .../material/source/location-searching.svg | 9 + .../assets/fonts/material/source/location.svg | 9 + .../fonts/material/source/lock-open.svg | 9 + .../fonts/material/source/lock-outline.svg | 9 + .../assets/fonts/material/source/lock.svg | 9 + .../assets/fonts/material/source/loop.svg | 9 + .../assets/fonts/material/source/mail.svg | 9 + .../main/assets/fonts/material/source/map.svg | 9 + .../fonts/material/source/mark-unread.svg | 9 + .../assets/fonts/material/source/memory.svg | 9 + .../assets/fonts/material/source/menu.svg | 9 + .../assets/fonts/material/source/message.svg | 9 + .../fonts/material/source/messenger.svg | 9 + .../assets/fonts/material/source/mic-none.svg | 9 + .../assets/fonts/material/source/mic-off.svg | 11 + .../main/assets/fonts/material/source/mic.svg | 9 + .../main/assets/fonts/material/source/mms.svg | 9 + .../assets/fonts/material/source/mood.svg | 9 + .../fonts/material/source/more-horiz.svg | 9 + .../fonts/material/source/more-vert.svg | 9 + .../assets/fonts/material/source/more.svg | 9 + .../assets/fonts/material/source/mouse.svg | 9 + .../assets/fonts/material/source/movie.svg | 9 + .../fonts/material/source/nest-protect.svg | 10 + .../fonts/material/source/nest-thermostat.svg | 9 + .../fonts/material/source/network-cell.svg | 9 + .../fonts/material/source/network-wifi.svg | 9 + .../assets/fonts/material/source/news.svg | 9 + .../main/assets/fonts/material/source/nfc.svg | 9 + .../material/source/notifications-none.svg | 9 + .../material/source/notifications-off.svg | 9 + .../material/source/notifications-on.svg | 9 + .../material/source/notifications-paused.svg | 9 + .../fonts/material/source/notifications.svg | 9 + .../assets/fonts/material/source/pages.svg | 9 + .../assets/fonts/material/source/palette.svg | 9 + .../assets/fonts/material/source/panorama.svg | 9 + .../fonts/material/source/party-mode.svg | 9 + .../material/source/pause-circle-fill.svg | 9 + .../material/source/pause-circle-outline.svg | 9 + .../assets/fonts/material/source/pause.svg | 9 + .../assets/fonts/material/source/people.svg | 9 + .../fonts/material/source/person-add.svg | 9 + .../fonts/material/source/person-location.svg | 9 + .../fonts/material/source/person-outline.svg | 9 + .../assets/fonts/material/source/person.svg | 9 + .../source/phone-bluetooth-speaker.svg | 9 + .../fonts/material/source/phone-forwarded.svg | 9 + .../fonts/material/source/phone-in-talk.svg | 9 + .../fonts/material/source/phone-locked.svg | 9 + .../fonts/material/source/phone-missed.svg | 9 + .../fonts/material/source/phone-paused.svg | 9 + .../assets/fonts/material/source/phone.svg | 9 + .../assets/fonts/material/source/phone2.svg | 9 + .../fonts/material/source/photo-album.svg | 9 + .../fonts/material/source/photo-library.svg | 9 + .../assets/fonts/material/source/photo.svg | 9 + .../assets/fonts/material/source/place.svg | 9 + .../fonts/material/source/play-arrow.svg | 9 + .../material/source/play-circle-fill.svg | 9 + .../material/source/play-circle-outline.svg | 9 + .../fonts/material/source/play-download.svg | 9 + .../fonts/material/source/play-install.svg | 9 + .../assets/fonts/material/source/plus-one.svg | 10 + .../assets/fonts/material/source/poll.svg | 9 + .../assets/fonts/material/source/polymer.svg | 9 + .../assets/fonts/material/source/portrait.svg | 9 + .../fonts/material/source/post-blogger.svg | 9 + .../fonts/material/source/post-facebook.svg | 9 + .../fonts/material/source/post-gplus.svg | 9 + .../fonts/material/source/post-instagram.svg | 9 + .../fonts/material/source/post-linkedin.svg | 9 + .../fonts/material/source/post-pinterest.svg | 9 + .../fonts/material/source/post-tumblr.svg | 9 + .../fonts/material/source/post-twitter.svg | 9 + .../assets/fonts/material/source/print.svg | 9 + .../assets/fonts/material/source/public.svg | 9 + .../assets/fonts/material/source/queue.svg | 9 + .../material/source/radio-button-off.svg | 9 + .../fonts/material/source/radio-button-on.svg | 9 + .../assets/fonts/material/source/receipt.svg | 9 + .../assets/fonts/material/source/refresh.svg | 9 + .../assets/fonts/material/source/reminder.svg | 9 + .../material/source/remove-circle-outline.svg | 9 + .../fonts/material/source/remove-circle.svg | 9 + .../assets/fonts/material/source/remove.svg | 9 + .../assets/fonts/material/source/replay.svg | 9 + .../fonts/material/source/reply-all.svg | 9 + .../assets/fonts/material/source/reply.svg | 9 + .../assets/fonts/material/source/report.svg | 9 + .../fonts/material/source/ring-volume.svg | 9 + .../fonts/material/source/rotate-left.svg | 9 + .../fonts/material/source/rotate-right.svg | 9 + .../fonts/material/source/satellite.svg | 9 + .../assets/fonts/material/source/save.svg | 9 + .../assets/fonts/material/source/schedule.svg | 10 + .../assets/fonts/material/source/school.svg | 9 + .../material/source/screen-lock-landscape.svg | 9 + .../material/source/screen-lock-portrait.svg | 9 + .../material/source/screen-lock-rotation.svg | 9 + .../fonts/material/source/screen-rotation.svg | 9 + .../assets/fonts/material/source/sd-card.svg | 9 + .../fonts/material/source/sd-storage.svg | 9 + .../assets/fonts/material/source/search.svg | 9 + .../fonts/material/source/select-all.svg | 9 + .../assets/fonts/material/source/send.svg | 9 + .../material/source/settings-application.svg | 9 + .../material/source/settings-bluetooth.svg | 9 + .../fonts/material/source/settings-cell.svg | 9 + .../fonts/material/source/settings-phone.svg | 9 + .../fonts/material/source/settings-power.svg | 9 + .../fonts/material/source/settings-voice.svg | 9 + .../assets/fonts/material/source/settings.svg | 9 + .../fonts/material/source/share-alt.svg | 9 + .../assets/fonts/material/source/share.svg | 9 + .../fonts/material/source/shopping-basket.svg | 9 + .../fonts/material/source/shopping-cart.svg | 9 + .../assets/fonts/material/source/shuffle.svg | 9 + .../material/source/signal-cellular-1-bar.svg | 9 + .../material/source/signal-cellular-2-bar.svg | 9 + .../material/source/signal-cellular-3-bar.svg | 9 + .../material/source/signal-cellular-4-bar.svg | 9 + .../material/source/signal-wifi-1-bar.svg | 9 + .../material/source/signal-wifi-2-bar.svg | 9 + .../material/source/signal-wifi-3-bar.svg | 9 + .../material/source/signal-wifi-4-bar.svg | 9 + .../fonts/material/source/sim-card-alert.svg | 9 + .../fonts/material/source/skip-next.svg | 9 + .../fonts/material/source/skip-previous.svg | 10 + .../fonts/material/source/slideshow.svg | 9 + .../fonts/material/source/sms-failed.svg | 9 + .../main/assets/fonts/material/source/sms.svg | 9 + .../assets/fonts/material/source/sort.svg | 9 + .../assets/fonts/material/source/speaker.svg | 9 + .../fonts/material/source/star-half.svg | 9 + .../fonts/material/source/star-outline.svg | 9 + .../fonts/material/source/star-rate.svg | 9 + .../assets/fonts/material/source/star.svg | 9 + .../assets/fonts/material/source/stop.svg | 9 + .../assets/fonts/material/source/storage.svg | 9 + .../assets/fonts/material/source/store.svg | 9 + .../material/source/swap-driving-apps.svg | 11 + .../fonts/material/source/swap-horiz.svg | 9 + .../material/source/swap-vert-circle.svg | 9 + .../fonts/material/source/swap-vert.svg | 9 + .../fonts/material/source/switch-camera.svg | 9 + .../fonts/material/source/switch-video.svg | 9 + .../fonts/material/source/sync-disabled.svg | 9 + .../fonts/material/source/sync-green.svg | 9 + .../material/source/sync-problem-red.svg | 9 + .../fonts/material/source/sync-problem.svg | 9 + .../assets/fonts/material/source/sync.svg | 9 + .../fonts/material/source/system-update.svg | 9 + .../fonts/material/source/tab-unselected.svg | 9 + .../main/assets/fonts/material/source/tab.svg | 9 + .../assets/fonts/material/source/tablet.svg | 9 + .../fonts/material/source/tag-faces.svg | 9 + .../fonts/material/source/tap-and-play.svg | 9 + .../assets/fonts/material/source/terrain.svg | 9 + .../fonts/material/source/text-format.svg | 9 + .../assets/fonts/material/source/text-sms.svg | 9 + .../assets/fonts/material/source/theaters.svg | 9 + .../fonts/material/source/thumbs-down.svg | 9 + .../fonts/material/source/thumbs-up.svg | 9 + .../fonts/material/source/time-to-leave.svg | 9 + .../fonts/material/source/timelapse.svg | 9 + .../assets/fonts/material/source/timer.svg | 9 + .../assets/fonts/material/source/today.svg | 10 + .../assets/fonts/material/source/traffic.svg | 9 + .../fonts/material/source/translate.svg | 9 + .../main/assets/fonts/material/source/tv.svg | 9 + .../fonts/material/source/underline.svg | 9 + .../assets/fonts/material/source/undo.svg | 9 + .../fonts/material/source/unfold-less.svg | 9 + .../fonts/material/source/unfold-more.svg | 9 + .../fonts/material/source/unknown-1.svg | 9 + .../fonts/material/source/unknown-3.svg | 9 + .../fonts/material/source/unknown-4.svg | 9 + .../fonts/material/source/unknown-5.svg | 9 + .../fonts/material/source/unknown-6.svg | 9 + .../fonts/material/source/unknown-7.svg | 9 + .../assets/fonts/material/source/unkown-2.svg | 9 + .../main/assets/fonts/material/source/usb.svg | 9 + .../fonts/material/source/vibration.svg | 9 + .../fonts/material/source/video-youtube.svg | 9 + .../fonts/material/source/videocam-off.svg | 9 + .../assets/fonts/material/source/videocam.svg | 9 + .../fonts/material/source/view-array.svg | 9 + .../fonts/material/source/view-column.svg | 9 + .../fonts/material/source/view-headline.svg | 9 + .../fonts/material/source/view-list.svg | 9 + .../fonts/material/source/view-module.svg | 9 + .../fonts/material/source/view-quilt.svg | 9 + .../fonts/material/source/view-stream.svg | 9 + .../fonts/material/source/visibility-off.svg | 9 + .../fonts/material/source/visibility.svg | 9 + .../assets/fonts/material/source/voice.svg | 9 + .../fonts/material/source/voicemail.svg | 9 + .../fonts/material/source/volume-down.svg | 9 + .../fonts/material/source/volume-mute.svg | 9 + .../fonts/material/source/volume-off.svg | 9 + .../fonts/material/source/volume-up.svg | 9 + .../main/assets/fonts/material/source/vpn.svg | 9 + .../assets/fonts/material/source/warning.svg | 9 + .../assets/fonts/material/source/watch.svg | 9 + .../assets/fonts/material/source/wb-auto.svg | 9 + .../fonts/material/source/wb-cloudy.svg | 9 + .../fonts/material/source/wb-incandescent.svg | 9 + .../fonts/material/source/wb-irradescent.svg | 9 + .../assets/fonts/material/source/wb-sunny.svg | 9 + .../main/assets/fonts/material/source/web.svg | 9 + .../assets/fonts/material/source/whatshot.svg | 9 + .../fonts/material/source/wifi-tethering.svg | 9 + .../assets/fonts/material/source/work.svg | 9 + .../main/assets/fonts/material/strings.xml | 438 ++ .../src/main/assets/fonts/material/styles.css | 1339 +++++++ .../activities/JsonFormActivity.java | 653 +++ .../jsonwizard/comparisons/Comparison.java | 22 + .../comparisons/EqualToComparison.java | 71 + .../comparisons/GreaterThanComparison.java | 37 + .../GreaterThanEqualToComparison.java | 37 + .../comparisons/LessThanComparison.java | 38 + .../LessThanEqualToComparison.java | 37 + .../comparisons/NotEqualToComparison.java | 74 + .../comparisons/RegexComparison.java | 24 + .../constants/JsonFormConstants.java | 37 + .../jsonwizard/customviews/CheckBox.java | 68 + .../customviews/CompoundButton.java | 117 + .../customviews/DatePickerDialog.java | 143 + .../customviews/GenericTextWatcher.java | 88 + .../customviews/MaterialSpinner.java | 949 +++++ .../jsonwizard/customviews/RadioButton.java | 79 + .../customviews/SelectableItemHolder.java | 96 + .../customviews/TreeViewDialog.java | 184 + .../fragments/JsonFormFragment.java | 385 ++ .../interactors/JsonFormInteractor.java | 147 + .../jsonwizard/interfaces/CommonListener.java | 11 + .../interfaces/FormWidgetFactory.java | 17 + .../vijay/jsonwizard/interfaces/JsonApi.java | 65 + .../interfaces/OnActivityResultListener.java | 11 + .../vijay/jsonwizard/mvp/BaseActivity.java | 58 + .../vijay/jsonwizard/mvp/BaseFragment.java | 73 + .../com/vijay/jsonwizard/mvp/MvpActivity.java | 24 + .../jsonwizard/mvp/MvpBasePresenter.java | 37 + .../com/vijay/jsonwizard/mvp/MvpFragment.java | 48 + .../vijay/jsonwizard/mvp/MvpPresenter.java | 8 + .../com/vijay/jsonwizard/mvp/MvpView.java | 4 + .../com/vijay/jsonwizard/mvp/ViewState.java | 38 + .../presenters/JsonFormFragmentPresenter.java | 319 ++ .../jsonwizard/utils/DatePickerUtils.java | 75 + .../com/vijay/jsonwizard/utils/FormUtils.java | 162 + .../vijay/jsonwizard/utils/ImageUtils.java | 145 + .../jsonwizard/utils/PropertyManager.java | 109 + .../jsonwizard/utils/ValidationStatus.java | 46 + .../utils/zxing/IntentIntegrator.java | 508 +++ .../jsonwizard/utils/zxing/IntentResult.java | 93 + .../validators/edittext/LengthValidator.java | 28 + .../edittext/MaxLengthValidator.java | 13 + .../edittext/MaxNumericValidator.java | 29 + .../edittext/MinLengthValidator.java | 13 + .../edittext/MinNumericValidator.java | 29 + .../edittext/RequiredValidator.java | 24 + .../views/JsonFormFragmentView.java | 82 + .../viewstates/JsonFormFragmentViewState.java | 39 + .../jsonwizard/widgets/BarcodeFactory.java | 194 + .../jsonwizard/widgets/ButtonFactory.java | 122 + .../jsonwizard/widgets/CheckBoxFactory.java | 113 + .../jsonwizard/widgets/DatePickerFactory.java | 386 ++ .../jsonwizard/widgets/EditTextFactory.java | 212 + .../widgets/ImagePickerFactory.java | 148 + .../jsonwizard/widgets/LabelFactory.java | 39 + .../widgets/RadioButtonFactory.java | 98 + .../jsonwizard/widgets/SectionFactory.java | 38 + .../jsonwizard/widgets/SpinnerFactory.java | 122 + .../jsonwizard/widgets/TreeViewFactory.java | 203 + .../src/main/res/anim/enter_from_left.xml | 9 + .../src/main/res/anim/enter_from_right.xml | 6 + .../src/main/res/anim/exit_to_left.xml | 14 + .../src/main/res/anim/exit_to_right.xml | 6 + .../src/main/res/anim/pop_enter_from_left.xml | 14 + .../src/main/res/anim/pop_exit_to_right.xml | 6 + .../main/res/layout/activity_json_form.xml | 30 + .../main/res/layout/dialog_date_picker.xml | 34 + .../src/main/res/layout/dialog_tree_view.xml | 10 + .../main/res/layout/fragment_json_wizard.xml | 17 + .../src/main/res/layout/item_barcode.xml | 31 + .../src/main/res/layout/item_button.xml | 7 + .../src/main/res/layout/item_checkbox.xml | 24 + .../src/main/res/layout/item_date_picker.xml | 28 + .../src/main/res/layout/item_edit_text.xml | 18 + .../src/main/res/layout/item_radiobutton.xml | 6 + .../main/res/layout/item_section_label.xml | 16 + .../src/main/res/layout/item_spinner.xml | 15 + .../res/layout/layout_selectable_item.xml | 64 + .../main/res/layout/simple_list_item_1.xml | 11 + .../src/main/res/menu/menu_toolbar.xml | 17 + .../src/main/res/mipmap-hdpi/grey_bg.png | Bin 0 -> 5049 bytes .../src/main/res/values-v21/dimens.xml | 4 + .../src/main/res/values-v21/styles.xml | 9 + .../src/main/res/values-w820dp/dimens.xml | 5 + .../src/main/res/values/attrs.xml | 26 + .../src/main/res/values/color.xml | 18 + .../src/main/res/values/dimens.xml | 22 + .../src/main/res/values/ids.xml | 20 + .../src/main/res/values/strings.xml | 18 + .../src/main/res/values/styles.xml | 32 + build.gradle | 65 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 52141 bytes gradle/wrapper/gradle-wrapper.properties | 10 + gradlew | 164 + sample/.gitignore | 1 + sample/build.gradle | 38 + sample/proguard-rules.pro | 17 + .../nativeform/ApplicationTest.java | 13 + sample/src/main/AndroidManifest.xml | 29 + .../assets/json.form/child_enrollment.json | 498 +++ .../nativeform/MainActivity.java | 151 + sample/src/main/res/layout/activity_main.xml | 34 + sample/src/main/res/layout/content_main.xml | 18 + sample/src/main/res/menu/menu_main.xml | 9 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3418 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2206 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4842 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7718 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10486 bytes sample/src/main/res/values-v21/styles.xml | 7 + sample/src/main/res/values-w820dp/dimens.xml | 6 + sample/src/main/res/values/colors.xml | 6 + sample/src/main/res/values/dimens.xml | 6 + sample/src/main/res/values/strings.xml | 4 + sample/src/main/res/values/styles.xml | 17 + .../nativeform/ExampleUnitTest.java | 15 + settings.gradle | 2 + 564 files changed, 18554 insertions(+), 9 deletions(-) create mode 100644 .travis.yml create mode 100644 android-json-form-wizard/.gitignore create mode 100644 android-json-form-wizard/build.gradle create mode 100644 android-json-form-wizard/proguard-rules.pro create mode 100644 android-json-form-wizard/src/androidTest/java/com/vijay/jsonwizard/ApplicationTest.java create mode 100644 android-json-form-wizard/src/main/AndroidManifest.xml create mode 100644 android-json-form-wizard/src/main/assets/fonts/material/fonts/material-icon-font.eot create mode 100644 android-json-form-wizard/src/main/assets/fonts/material/fonts/material-icon-font.svg create mode 100644 android-json-form-wizard/src/main/assets/fonts/material/fonts/material-icon-font.ttf create mode 100644 android-json-form-wizard/src/main/assets/fonts/material/fonts/material-icon-font.woff create mode 100644 android-json-form-wizard/src/main/assets/fonts/material/icons-reference.html create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/access-alarms.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/access-time.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/accessibility.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/account-box.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/account-circle.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/adb.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/add-alarm.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/add-box.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/add-circle-outline.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/add-circle.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/add.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/airplane-mode-off.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/airplane-mode-on.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/android.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/apps.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/archive.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/arrow-back.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/arrow-drop-down-circle.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/arrow-drop-down.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/arrow-drop-up.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/arrow-forward.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/attachment.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/auto-fix.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/backspace.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/backup.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/beenhere.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/block.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/bluetooth-audio.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/bluetooth-connected.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/bluetooth-disabled.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/bluetooth-searching.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/bluetooth.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/bold.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/book.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/bookmark-outline.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/bookmark.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/brightness-auto.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/brightness-high.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/brightness-low.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/brightness-medium.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/bug-report.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/cake.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/call-end.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/call-made.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/call-merge.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/call-missed.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/call-received.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/call-split.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/call.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/camera-alt.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/camera-roll.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/camera.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/cancel.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/cast-connected.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/cast.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/chat.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/check-box-blank.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/check-box-outline-blank.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/check-box-outline.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/check-box.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/check-circle-blank.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/check-circle-outline-blank.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/check-circle-outline.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/check-circle.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/check.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/chevron-left.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/chevron-right.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/chromecast.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/circles-add.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/circles-extended.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/circles.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/clear.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/close-caption.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/close.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/cloud-circle.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/cloud-done.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/cloud-download.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/cloud-off.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/cloud-queue.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/cloud-upload.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/cloud.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/comment.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/communities.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/content-copy.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/content-cut.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/content-paste.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/create.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/credit-card.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/crop-free.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/crop-landscape.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/crop-portrait.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/crop-square.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/crop.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/data-usage.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/delete.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/developer-mode.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/dialpad.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/directions-bike.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/directions-bus.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/directions-car.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/directions-subway.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/directions-train.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/directions-transit.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/directions.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/directionswalk.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/disc-full.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/do-not-disturb.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/dock.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/domain.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/done-all.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/done.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/drafts.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/drive-apk.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/drive-audio.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/drive-code.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/drive-document.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/drive-drawing.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/drive-eta.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/drive-file.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/drive-font.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/drive-form.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/drive-fusiontable.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/drive-image.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/drive-ms-excel.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/drive-ms-powerpoint.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/drive-ms-word.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/drive-pdf.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/drive-presentation.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/drive-script.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/drive-site.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/drive-spreadsheet.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/drive-video.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/drive-zip.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/drive.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/earth.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/email.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/error.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/event.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/exit-to-app.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/expand-less.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/expand-more.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/explore.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/extension.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/fast-forward.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/fast-rewind.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/favorite-outline.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/favorite.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/file-download.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/file-upload.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/filter.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/flag.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/flash-auto.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/flash-off.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/flash-on.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/flights.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/flip-to-back.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/flip-to-front.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/folder-mydrive.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/folder-shared.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/folder.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/forum.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/forward.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/fullscreen-exit.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/fullscreen.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/gamepad.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/games.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/gesture.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/glass.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/gmail.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/google-plus.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/google.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/gps-fixed.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/gps-not-fixed.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/gps-off.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/group-add.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/group.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/hangout-video-off.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/hangout-video.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/hangout.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/headset-mic.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/headset.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/help.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/high-quality.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/history.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/home.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/hotel.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/https.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/image.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/import-export.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/inbox.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/info-outline.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/info.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/invert-colors.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/italics.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/keep.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-alt.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-arrow-down.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-arrow-left.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-arrow-right.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-arrow-up.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-backspace.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-capslock.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-control.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-hide.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-return.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-tab.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-voice.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/keyboard.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/label-outline.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/label.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/landscape.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/language.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/laptop.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/launch.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/link.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/list.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/live-help.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/location-city.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/location-disabled.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/location-searching.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/location.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/lock-open.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/lock-outline.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/lock.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/loop.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/mail.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/map.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/mark-unread.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/memory.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/menu.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/message.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/messenger.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/mic-none.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/mic-off.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/mic.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/mms.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/mood.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/more-horiz.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/more-vert.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/more.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/mouse.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/movie.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/nest-protect.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/nest-thermostat.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/network-cell.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/network-wifi.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/news.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/nfc.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/notifications-none.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/notifications-off.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/notifications-on.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/notifications-paused.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/notifications.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/pages.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/palette.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/panorama.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/party-mode.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/pause-circle-fill.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/pause-circle-outline.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/pause.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/people.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/person-add.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/person-location.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/person-outline.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/person.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/phone-bluetooth-speaker.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/phone-forwarded.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/phone-in-talk.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/phone-locked.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/phone-missed.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/phone-paused.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/phone.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/phone2.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/photo-album.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/photo-library.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/photo.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/place.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/play-arrow.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/play-circle-fill.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/play-circle-outline.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/play-download.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/play-install.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/plus-one.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/poll.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/polymer.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/portrait.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/post-blogger.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/post-facebook.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/post-gplus.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/post-instagram.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/post-linkedin.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/post-pinterest.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/post-tumblr.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/post-twitter.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/print.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/public.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/queue.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/radio-button-off.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/radio-button-on.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/receipt.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/refresh.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/reminder.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/remove-circle-outline.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/remove-circle.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/remove.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/replay.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/reply-all.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/reply.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/report.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/ring-volume.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/rotate-left.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/rotate-right.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/satellite.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/save.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/schedule.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/school.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/screen-lock-landscape.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/screen-lock-portrait.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/screen-lock-rotation.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/screen-rotation.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/sd-card.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/sd-storage.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/search.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/select-all.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/send.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/settings-application.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/settings-bluetooth.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/settings-cell.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/settings-phone.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/settings-power.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/settings-voice.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/settings.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/share-alt.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/share.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/shopping-basket.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/shopping-cart.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/shuffle.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/signal-cellular-1-bar.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/signal-cellular-2-bar.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/signal-cellular-3-bar.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/signal-cellular-4-bar.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/signal-wifi-1-bar.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/signal-wifi-2-bar.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/signal-wifi-3-bar.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/signal-wifi-4-bar.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/sim-card-alert.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/skip-next.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/skip-previous.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/slideshow.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/sms-failed.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/sms.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/sort.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/speaker.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/star-half.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/star-outline.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/star-rate.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/star.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/stop.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/storage.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/store.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/swap-driving-apps.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/swap-horiz.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/swap-vert-circle.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/swap-vert.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/switch-camera.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/switch-video.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/sync-disabled.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/sync-green.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/sync-problem-red.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/sync-problem.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/sync.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/system-update.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/tab-unselected.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/tab.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/tablet.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/tag-faces.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/tap-and-play.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/terrain.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/text-format.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/text-sms.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/theaters.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/thumbs-down.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/thumbs-up.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/time-to-leave.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/timelapse.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/timer.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/today.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/traffic.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/translate.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/tv.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/underline.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/undo.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/unfold-less.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/unfold-more.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/unknown-1.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/unknown-3.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/unknown-4.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/unknown-5.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/unknown-6.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/unknown-7.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/unkown-2.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/usb.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/vibration.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/video-youtube.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/videocam-off.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/videocam.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/view-array.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/view-column.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/view-headline.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/view-list.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/view-module.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/view-quilt.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/view-stream.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/visibility-off.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/visibility.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/voice.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/voicemail.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/volume-down.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/volume-mute.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/volume-off.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/volume-up.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/vpn.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/warning.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/watch.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/wb-auto.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/wb-cloudy.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/wb-incandescent.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/wb-irradescent.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/wb-sunny.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/web.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/whatshot.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/wifi-tethering.svg create mode 100755 android-json-form-wizard/src/main/assets/fonts/material/source/work.svg create mode 100644 android-json-form-wizard/src/main/assets/fonts/material/strings.xml create mode 100644 android-json-form-wizard/src/main/assets/fonts/material/styles.css create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/activities/JsonFormActivity.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/Comparison.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/EqualToComparison.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/GreaterThanComparison.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/GreaterThanEqualToComparison.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/LessThanComparison.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/LessThanEqualToComparison.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/NotEqualToComparison.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/RegexComparison.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/constants/JsonFormConstants.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/CheckBox.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/CompoundButton.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/DatePickerDialog.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/GenericTextWatcher.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/MaterialSpinner.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/RadioButton.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/SelectableItemHolder.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/TreeViewDialog.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/fragments/JsonFormFragment.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/interactors/JsonFormInteractor.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/interfaces/CommonListener.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/interfaces/FormWidgetFactory.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/interfaces/JsonApi.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/interfaces/OnActivityResultListener.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/BaseActivity.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/BaseFragment.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/MvpActivity.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/MvpBasePresenter.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/MvpFragment.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/MvpPresenter.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/MvpView.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/ViewState.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/presenters/JsonFormFragmentPresenter.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/DatePickerUtils.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/FormUtils.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/ImageUtils.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/PropertyManager.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/ValidationStatus.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/zxing/IntentIntegrator.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/zxing/IntentResult.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/validators/edittext/LengthValidator.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/validators/edittext/MaxLengthValidator.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/validators/edittext/MaxNumericValidator.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/validators/edittext/MinLengthValidator.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/validators/edittext/MinNumericValidator.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/validators/edittext/RequiredValidator.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/views/JsonFormFragmentView.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/viewstates/JsonFormFragmentViewState.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/BarcodeFactory.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/ButtonFactory.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/CheckBoxFactory.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/DatePickerFactory.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/EditTextFactory.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/ImagePickerFactory.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/LabelFactory.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/RadioButtonFactory.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/SectionFactory.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/SpinnerFactory.java create mode 100644 android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/TreeViewFactory.java create mode 100644 android-json-form-wizard/src/main/res/anim/enter_from_left.xml create mode 100644 android-json-form-wizard/src/main/res/anim/enter_from_right.xml create mode 100644 android-json-form-wizard/src/main/res/anim/exit_to_left.xml create mode 100644 android-json-form-wizard/src/main/res/anim/exit_to_right.xml create mode 100644 android-json-form-wizard/src/main/res/anim/pop_enter_from_left.xml create mode 100644 android-json-form-wizard/src/main/res/anim/pop_exit_to_right.xml create mode 100644 android-json-form-wizard/src/main/res/layout/activity_json_form.xml create mode 100644 android-json-form-wizard/src/main/res/layout/dialog_date_picker.xml create mode 100644 android-json-form-wizard/src/main/res/layout/dialog_tree_view.xml create mode 100644 android-json-form-wizard/src/main/res/layout/fragment_json_wizard.xml create mode 100644 android-json-form-wizard/src/main/res/layout/item_barcode.xml create mode 100644 android-json-form-wizard/src/main/res/layout/item_button.xml create mode 100644 android-json-form-wizard/src/main/res/layout/item_checkbox.xml create mode 100644 android-json-form-wizard/src/main/res/layout/item_date_picker.xml create mode 100644 android-json-form-wizard/src/main/res/layout/item_edit_text.xml create mode 100644 android-json-form-wizard/src/main/res/layout/item_radiobutton.xml create mode 100644 android-json-form-wizard/src/main/res/layout/item_section_label.xml create mode 100644 android-json-form-wizard/src/main/res/layout/item_spinner.xml create mode 100644 android-json-form-wizard/src/main/res/layout/layout_selectable_item.xml create mode 100644 android-json-form-wizard/src/main/res/layout/simple_list_item_1.xml create mode 100644 android-json-form-wizard/src/main/res/menu/menu_toolbar.xml create mode 100644 android-json-form-wizard/src/main/res/mipmap-hdpi/grey_bg.png create mode 100644 android-json-form-wizard/src/main/res/values-v21/dimens.xml create mode 100644 android-json-form-wizard/src/main/res/values-v21/styles.xml create mode 100644 android-json-form-wizard/src/main/res/values-w820dp/dimens.xml create mode 100644 android-json-form-wizard/src/main/res/values/attrs.xml create mode 100644 android-json-form-wizard/src/main/res/values/color.xml create mode 100644 android-json-form-wizard/src/main/res/values/dimens.xml create mode 100644 android-json-form-wizard/src/main/res/values/ids.xml create mode 100644 android-json-form-wizard/src/main/res/values/strings.xml create mode 100644 android-json-form-wizard/src/main/res/values/styles.xml create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 sample/.gitignore create mode 100644 sample/build.gradle create mode 100644 sample/proguard-rules.pro create mode 100644 sample/src/androidTest/java/org/smartregister/nativeform/ApplicationTest.java create mode 100644 sample/src/main/AndroidManifest.xml create mode 100644 sample/src/main/assets/json.form/child_enrollment.json create mode 100644 sample/src/main/java/org/smartregister/nativeform/MainActivity.java create mode 100644 sample/src/main/res/layout/activity_main.xml create mode 100644 sample/src/main/res/layout/content_main.xml create mode 100644 sample/src/main/res/menu/menu_main.xml create mode 100644 sample/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 sample/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 sample/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 sample/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 sample/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 sample/src/main/res/values-v21/styles.xml create mode 100644 sample/src/main/res/values-w820dp/dimens.xml create mode 100644 sample/src/main/res/values/colors.xml create mode 100644 sample/src/main/res/values/dimens.xml create mode 100644 sample/src/main/res/values/strings.xml create mode 100644 sample/src/main/res/values/styles.xml create mode 100644 sample/src/test/java/org/smartregister/nativeform/ExampleUnitTest.java create mode 100644 settings.gradle diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..7392c8788 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,62 @@ +language: android +# sudo set to required because of an issue with how TravisCI handles builds in Docker containers https://github.com/travis-ci/travis-ci/issues/3695. +# Setting sudo to required prevents Travis from testing the project in a Docker container. +sudo: required +jdk: oraclejdk8 +dist: precise + +env: + matrix: + - ANDROID_TARGET=android-22 ANDROID_ABI=armeabi-v7a + global: + # wait up to 10 minutes for adb to connect to emulator + - ADB_INSTALL_TIMEOUT=10 + - MALLOC_ARENA_MAX=2 + +android: + components: + # tools required + - tools + # The BuildTools version used by your project + - build-tools-26.0.1 + # The SDK version used to compile your projects + - android-21 + - android-22 + # Additional components + - extra-google-google_play_services + - extra-google-m2repository + - extra-android-m2repository + - addon-google_apis-google-19 + + # Specify at least one system image, + # if you need to run emulator(s) during your tests + - sys-img-armeabi-v7a-android-22 + +addons: + apt_packages: + - pandoc + +before_script: + # Emulator Management: Create, Start and Wait + - echo no | android create avd --force -n test -t $ANDROID_TARGET --abi $ANDROID_ABI + - emulator -avd test -no-skin -no-audio -no-window & + - adb wait-for-device + - adb shell input keyevent 82 & + +script: + - echo "Travis branch is $TRAVIS_BRANCH" + - echo "Travis branch is in pull request $TRAVIS_PULL+REQUEST" + - chmod 755 gradlew + - ls -la + # Enable the line below once we get all the test passing, currently most of the tests are failing + # so we'll just if the project compiles + #Run All tests Unit and Instrumentation + - travis_wait ./gradlew build -i --stacktrace + +after_failure: + - pandoc android-json-form-wizard/build/reports/tests/index.html -t plain + + +notifications: + slack: + secure: fAiZ4yA7DM6nUKh7nqsCTqZBb03VEAvi5NcRu5mNh5coNn/50XNeZl+qpv7Dw70Ef85Y/k68uc6KwTGVqPXEmVq9Hk3e7lqpBNN8rufvgCYDDGPmywBmU5BhSeykKo0Ee7llM3mRR/EipjIWw1+YvMcS3hCoygf/UlMDDhG0Jo0= \ No newline at end of file diff --git a/README.md b/README.md index db11434da..68ec14753 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,28 @@ -[![Build Status](https://travis-ci.org/OpenSRP/opensrp-client.svg?branch=path)](https://travis-ci.org/OpenSRP/opensrp-client) [![Coverage Status](https://coveralls.io/repos/github/OpenSRP/opensrp-client/badge.svg?branch=path)](https://coveralls.io/github/OpenSRP/opensrp-client?branch=path) +[![Build Status](https://travis-ci.org/OpenSRP/opensrp-client-path.svg?branch=master)](https://travis-ci.org/OpenSRP/opensrp-client-path) [![Coverage Status](https://coveralls.io/repos/github/OpenSRP/opensrp-client-path/badge.svg?branch=master)](https://coveralls.io/github/OpenSRP/opensrp-client-path?branch=master) -[![Dristhi](opensrp-app/res/drawable-mdpi/login_logo.png)](https://smartregister.atlassian.net/wiki/dashboard.action) +[![Dristhi](https://raw.githubusercontent.com/OpenSRP/opensrp-client/master/opensrp-app/res/drawable-mdpi/login_logo.png)](https://smartregister.atlassian.net/wiki/dashboard.action) To run this project, you need to do this: -======================================== +========================================= -1. Set the ANDROID\_HOME environment variable to point to the location of your installed Android SDK 4.1.2 API level 16. For more information, look at [the documentation of maven-android-plugin](http://code.google.com/p/maven-android-plugin/wiki/GettingStarted). +1. Set the `ANDROID_HOME` environment variable to point to the location of your installed Android SDK 4.1.2 API level 16. For more information, look at [the documentation of maven-android-plugin](http://code.google.com/p/maven-android-plugin/wiki/GettingStarted). -2. Start an Android Virtual Device. Normally, this means you need to run "android avd" and then start one of the devices there. +2. Start an Android Virtual Device. Normally, this means you need to run `android avd` and then start one of the devices there. -Then, you can run "mvn clean install" in the main directory. +Then, you can run `mvn clean install` in the main directory. Tips and tricks (to be completed): ================================= * How to setup your Android SDK so that Maven finds it: http://pivotal.github.com/robolectric/maven-quick-start.html -* Adding an external Android library (apklib) as a submodule, and making it work with both Maven and IntelliJ. Write about "mvn clean" trick. +* Adding an external Android library (apklib) as a submodule, and making it work with both Maven and IntelliJ. TODO: Write about `mvn clean` trick. Login (for demo server): ================================= -login-username - demotest, +``` +login-username - demotest login-password - Demot123 +``` -Check app.properties file in "drishti-app/asset/" folder to change the demo server url to your own instance of opensrp server. +Check `app.properties` file in `drishti-app/asset/` folder to change the demo server url to your own instance of opensrp server. diff --git a/android-json-form-wizard/.gitignore b/android-json-form-wizard/.gitignore new file mode 100644 index 000000000..796b96d1c --- /dev/null +++ b/android-json-form-wizard/.gitignore @@ -0,0 +1 @@ +/build diff --git a/android-json-form-wizard/build.gradle b/android-json-form-wizard/build.gradle new file mode 100644 index 000000000..ede543799 --- /dev/null +++ b/android-json-form-wizard/build.gradle @@ -0,0 +1,53 @@ +buildscript { + repositories { + jcenter() + } + dependencies { + classpath "com.android.tools.build:gradle:1.2.3" + classpath 'org.apache.commons:commons-lang3:3.3.2' + classpath 'org.robolectric:robolectric-gradle-plugin:1.1.0' + } +} + +apply plugin: 'com.android.library' + +android { + compileSdkVersion 22 + buildToolsVersion "26.0.1" + + defaultConfig { + minSdkVersion 11 + targetSdkVersion 21 + versionCode 1 + versionName "1.0" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + + lintOptions { + abortOnError false + } +} + +repositories { + maven { url "https://clojars.org/repo/" } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + compile group: 'com.github.bmelnychuk', name: 'atv', version: '1.2.9' + compile 'com.github.johnkil.print:print:1.3.1' + compile 'com.android.support:appcompat-v7:22.0.0' + compile 'com.github.rey5137:material:1.1.0' + compile 'com.rengwuxian.materialedittext:library:2.1.4' + compile('com.github.riadhnet:MaterialSpinner:1.2@aar') { + exclude group: 'com.nineoldandroids', module: 'library' + exclude group: 'com.android.support', module: 'appcompat-v7' + exclude group: 'com.android.support', module: 'support-v4' + exclude group: 'com.android.support', module: 'support-annotations' + } +} diff --git a/android-json-form-wizard/proguard-rules.pro b/android-json-form-wizard/proguard-rules.pro new file mode 100644 index 000000000..67d26d719 --- /dev/null +++ b/android-json-form-wizard/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/vijay/android-sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/android-json-form-wizard/src/androidTest/java/com/vijay/jsonwizard/ApplicationTest.java b/android-json-form-wizard/src/androidTest/java/com/vijay/jsonwizard/ApplicationTest.java new file mode 100644 index 000000000..4880a9ea9 --- /dev/null +++ b/android-json-form-wizard/src/androidTest/java/com/vijay/jsonwizard/ApplicationTest.java @@ -0,0 +1,13 @@ +package com.vijay.jsonwizard; + +import android.app.Application; +import android.test.ApplicationTestCase; + +/** + * Testing Fundamentals + */ +public class ApplicationTest extends ApplicationTestCase { + public ApplicationTest() { + super(Application.class); + } +} \ No newline at end of file diff --git a/android-json-form-wizard/src/main/AndroidManifest.xml b/android-json-form-wizard/src/main/AndroidManifest.xml new file mode 100644 index 000000000..c3985ea3f --- /dev/null +++ b/android-json-form-wizard/src/main/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/fonts/material-icon-font.eot b/android-json-form-wizard/src/main/assets/fonts/material/fonts/material-icon-font.eot new file mode 100644 index 0000000000000000000000000000000000000000..12bc9e71e5ed417ca0f79a3abb20d9b983ea47cb GIT binary patch literal 48704 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 Yu-~NCU-IhGm;UZcBCpNqTQHRV8`&Bye*gdg literal 0 HcmV?d00001 diff --git a/android-json-form-wizard/src/main/assets/fonts/material/fonts/material-icon-font.svg b/android-json-form-wizard/src/main/assets/fonts/material/fonts/material-icon-font.svg new file mode 100644 index 000000000..287b5126e --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/fonts/material-icon-font.svg @@ -0,0 +1,443 @@ + + + +Generated by Fontastic.me + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/fonts/material-icon-font.ttf b/android-json-form-wizard/src/main/assets/fonts/material/fonts/material-icon-font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..06300f9bf0bb7b2f52990cae609a721e514ac463 GIT binary patch literal 48492 zcmd?S3wRsnc`i6VZi5R!5C8`tKoA580w6J@cmY9B5(SMUin>s;B-@~5*>z||QWV0D z<;1u6I5~4%ubbF$94CR2x>-MZw5gL2P2;3-lJ&YN>Uz_rJ|{V812&r{oBH@<-BU5C zleX?9CkNX1`~MjNpyaftP1}8*1&Nu#T>kt2UEc5ezmb?ENnS~ptkThig&Pmw`TDPZ zOp<>4D9*S0%}wz`28O zyX{@)uUtV&(r*vry7O(fzx(XbhpzjAB)PsLNf$@Yow@Ba`>o)w;@bD{ojHdSwrLAW zz`F5!=-eH5-@o;nQ;*{Jvyx;zfBT(py)AIhs4=pSL)r^SC~X`xEcD z?T#~t?)txuOVX-Mk}O^4?|j$YfBRo^|GOmp2Ga8fB&r*}J+t<=n?b7&#*5_cSr$#if&~5F3q@wStRx$$u2qB zA$At$_8I#(q=@t|N-No2#+}%8H4mkuXZN0#v{$76@+^Dh$}18t11?it@G*->dwf;= zY4}s6GXCh8&WOJfewCyOepRqnr5H~@+)K~U^*gYoCw<0WNm6iD!uLLW%ltW!nu05; zbO2|?pP5Tl`m&LqC<8sM;%k1)`{*f^r*5W8sh6Zl+$c&)zjU4!Z4XE;Y@-|b(erfQ zwf~wmr|Y_rPD#r1^r(iEE0uuSgYGfQCF)PV=J>gj$dl?ye-gisT7>Qw&rm7NwCLQ; z8)c@J&~Zk`9h9EJbJVb>_7EvhN_0lSJ>rkjpsONvQBr!ETBXiY5?3Uirun?NSB=~$ zJu0VJHgR3z>C%<5ROQc8%5;y%$d7)v{!v+}M9o&AyD1$>I*zk+jcP_IDv||f=sKO7 z#J0@qPtVdhQA;y*B)~t^$2xz4(kkOg`V&1yPc_e#q@t0!nI5$PT z1iPJGU|(XdTDmM#mQPr|ZFO4X)~t26^*ZZm>r>WOZ2{Yy?X>NKwlCU#Y#*{;XMfcG z75jJXf9VJ~ijMP+k2}69cgQE?hvcuw-;n>C+;9e*6V7)!SDin0gpO1A z9e3|{-|l|Y{R#IUxLRa+X=zG@pZQtK?MY|4mt#m!(kNM~Qzv=(Wz)axYz%zl@f<3{7;Q8Rk zgFg&5x)a^IyO+CPRT9dw@^deZKb_y+4k1#Nsh6_KDbQeYU=B zedqfw^nJST8-0Hr?}^XFKNiwOdph@}+;^tk z({s}&r{6dI$?5OsC-SHAug+|lxqIe67utFu4e>fAcI z^}4O6w(46yx%Dr%jcz-;?a^&t+4jn|pKhPq{^0iS%*E#R&)q$DX-8nk(2frjZN+WH z+l!wrzOpm6b7JSp&PzLgs0FkkZARO#-KgEIeN_8`_L6p4``NC}U9-DR?|O9CrCqP= z`n%oH-Me?6*nM{Qhj)KzPhijJo`pTP@42++kLE4&3-kBRKRbVUZ)oq_-jDA6%0lPD zp@rpz2NyoQ@Y=q>zT&=z_WkC*SNC`CzkmNz`(NDu>H*t<_$-0Gy4$b&;B{ZS?q^4KA31;I(viP78Uhuu6ZK+s_FYgb84{i%^@Gf0zdCaBAvZ}fQnw7IDe>+M&y$^a_C4=; z_B~I0;LMp1oVl2|)4$B>`2C(|8~+0*&V1nW`rgV{0V*CZXgKLl z=93C-2VNhHMhBzox|&sWrn7p)ABaQ({s$ZDy3Q0L-Y6HSJJPA4RAFj^puanm8{hrrDPgwfe4dQGpW?fubnu0;)=v7bjrAVh|Z_h`%Yv^yd0;TZo7rfCAM+HRyfl8(bvGG}uwy9Jn@aV@8gJ~SgehGcIF!OF z>{YaDj}(`NB&k5Xwu24qM0ci>gEBhRfr97Jk@@KxAfQCQg#XdtR^~E^kSV(En%#Qxk6(%*zCEs zw8XewF;Wp@_73rQOW%9&Je8`Yw&pA|=K)iAL6-KkOaxZu>DF3j0?HxEMRULnsZ?V5 zX*6sf>u32?SXK%OzTtc(A1*Ma1f#)E%{TP2zM4I_s6G&De4c6dc!NRjk!O_b^W`Ji z{5^?;q9hVW9*D6cNQ~E+(uS^-LMkHdmSkD2ibPj=dev;1Cw5PHBb|Fl@Aie8m52Yl$!F#5C~HI#xFz4VpwrI8%Q zw}3%Szv&o<$2`mKv)|e8kWVOG|6`Yo$*?^l=>RnIW>|LnAbYwVdHo zFjW``v*+Rt{}svS>Gg;)T)XGs(!s{x`I!`CPY!uJLtbCwZ#bE9`~LnORjp91sK3p6 zIq_qlfSFpz46thBzuzCPR^#_GJ5$6F-CL1rtjtu5Kq(k5RLVFmm)quvyJenaat2AO zmsSl*_RFXmPp6J_G)iYD3nQI6lG#)iIXs{YpfpU1-{1J}%#Knp6ex>5PXpQk##otT z?E+Ei?F`(+p)$_3Fw&BP7-Tp(Go8jsur!>zII(x{#4E|EspNCv{{HaAi=htpbD{qJ z5I^^_zIS;cw=mTo3il^Mu8#PYe*8*+rp2Tf@)A6Z#&m}2pDD`>w7@zTH2T8)NS`u71(jqu%0Zt_yc|PV((M z?xa?eG~fs|sguut8W!OV=4A!p&lHezAuO|cqo#P@^)A1kY3Tdw3(w@I zF>FHJG98VBA6%9E_@v9FMMI%z;;xpAoWuAqX)+x34QjFMQZ_oN6=Od)U#sLtOB0PU z`0v%36;QKER#lm=B`aPh$O9@^fvWz>Re9Wsv(#45q(Kksk`pZjQbMg$Kzm^Z7!8J> z`7l#P2IJZTO7>FxacZ+$CgT@I*u%p(`R*09%uimrc{1)gHu7)QW>(-`8v6+5QwLfM zco;+HfN1!05C^9-IYC#5>(CK9u|?Zb{oU;LZ(r~4>G5B`yu6G(=KRRy^Gs{<$%Ws#?b8y5<(}6+gHv!AiYdxX)(8ZC$-t*{7(A&!P4u zlYOd#|B!Xee_l2qU2Gln*^L>HBh89aDA_@UA;k*At~;y@VuE#6qF|ID0JUwRVn=yJhczL}GS0 z7kl!_SZ;W>;=^t91?TPG!s$E%9Tjpt#$hlNF3f<_O+iLP?xdcA!J}9q`SG#kakpn+ zROxVi?Asl#Ma65CS@dLX-0kox2V5QB{+O#n85(hWP*+0LK5LO6I}lACl$CDTA!>sZ z3p0r@_y(AGaxjz5q<641lg9Gifr!KDa?IEq=h)CWhhxU!lAZlg?-bK~yS)y74^BB9 zF2|WO4wn;G9lf1$$8I0;qVkj81o|^%$LlB(#_oO6VfKFZ z9A;n#A8QcsFy#vQT!xk72jUMc-W}H$mk-DH$7}b!E3Ut9nWz6a_-dKc1`-G{a!B;Q zbm_iRRkeaEm+n)mrz$n7H|cOSj6ag~GMIfNn6g^D@mJaU`6~bo{vV#k+*;PxwL|T7ZYk4{@#m7D$W_r?wE( zknAS{YtPVt%E@sCf+C|+3z@HYOMTJ+ z>N_Hhkp+Vh7s*dU{KT{tIg>z|&-ty!OeUs6GuqrUHR@MFB_%|KsQRO;b#Pl1^fQ}X zq9axbL`Wxxwp!!m)Eet*MK!+bTLTHGRM1|Hd2J{*R#cDgJbGSzlz5J& zHP%!^_^fHYsZzE$Ry@9>o9!759zyqTCc4#Todxe2K zsZHS6C8nZl8ZR;Fid3yuOF)RA4TGEOCDd2~%T_hD1ft7e&7%28HI_*8Vwu{>zWX5f zKXWopJM=*-t^xi-?cbsRrdtJP(VP)ObZ!GQ8ufDg@FhyGNl$5JZ%VBV$!dp0@Mud} z?7*C)APIcX()<{~%~I`P$>+vtIHrDEO6Bkq22%Y@OzhhZ+yTD&o+tajiiQ7Nm zr`~L>BbAC}TQD1OVj~@b<=V!*7YQ3klU*nlV#HsOgjOL?n%^^<1Z`sWvD|#p&>M`I z(UQKM#(=1MLC_WG8${kXYMK|7uMujw5LE`%^a%nsjp|1i2;Y9<|z*(A+3vm}|RFsdeJX29PKK(s(CxFBx<;pXyjNat^;%5L>xQLF--+EH;!vkHHmqlDC!DvH^{9U&+?(2W zTF`Kn%Oga2Fj-QaAfd$Z3*ga07lnA_NCu3amia|U=%n+V_U_K+7bjAl`CHB(-FLgE zzdygSxVW;Y$A&nRT1!nV=0|q<mOCk&8V~+Fe zU;_0~xPW?%^KJC(g@mdmI^3G8qr;`SJ1YDq9r1Il+REE6cr*_Hpbpm(Z9;9os6Cqa z$hFXst6-5$hzK5Up(k?d$bx{vp{ydKk!*}+gI~W)K$X`q9#2k@cwmgKk3&}OP34l* zgFM}4*+8SOh202}xEZ?n$-(&Oo$*a2{qSOZ>`pF+TUzRje6Eo$L=5VJt15qUxvVX1 zN_VbYE|oC9V1tJoUWIg#q&d!01vG+sL&%`1%yE)*D$FPRb`Tt(+`Nf$JfEp#qI+Os zZz47{m>ApEcwlaN|DoxhW@C*{?5}>4U_Qz>n(*zN@T7W&eTn|rk>a^+)`PkHVz!r^ z(W_GnP<2}CmcC})=h>OzMH<>v=}#fE)C3h}Ce@bbwcGQ5 z9%H+ftRjqAf}MslkWtJ(E|EZ5fvl^RxQs$_3YS%?boPoAh?G`UD2(WsRvzJk929|+ zi_@UJ9LNW8;&co4Cxb4T6cW_TxZ_)#GHIOX>}#=coaE=31p6Fv4eaMX+bkXn#wAXV z1%~JZmm-{oOA0wZ1TY~oaOoPzh&2hA1C{bevJiMKlN2I0mpP5!0(8*)zbp$d!pdiYI^*ZA%ep_g?kAJIpZ)i7Mi z_CR*qB%lMM>Za{-5M>BLCL=n@DmVE~`ff6Xu*eJ9ETppRT9!er5b%;vb+V0Bwxnsu zL&%%Yv*#iCLI;J^UC4xI#u-rUuy$!WW5G_~*Eq&wyl+V7BHB%* zGy0}!Q?(i+PsqrohDG_(x1Ibp>N?5C7RcKIlW>yEmCA8cPRYqoK8WpdNFUYAvvL;N zQgsa$w1^+u8b)w-jlrk_fDBud&xW?s4BgicOpB~G)I=n@0&JnA^2q_N)IfqI?FLt; z(-71Fs-dw0r4q~X<5EeDunKMe%)A5vk}gp@Q2UWgU*YY*TY(H()H`5TX=;Twt^`?_ z0R}*^Y4~GvMOqW-m>3?lCwlrC1DxPL^Fe{+ZP=kPqO&NAsmF^nHp$i20sjEgn+h#4 zKxis$jIdD$vom$dKZZsR<1>TqWm0CVA(9yaSs~*9N^rnk2)^TO#p4GG*T3UECsy{% zj_Lx>#E z(Umof95iG0ix7tA=a=T^Ar*hoJPCNFL^PuGpZHaNF=w1YC%HHBCHYWj$m78Ec1ruC zBXC^ZpoOMCMf-k+OjEeWl=4j4N$1G_V)LH)Ic$?MwVvY{_dPIwvxb=qP&Uj#)0jYE_RX5lSMz%L z_VY_wrF@WW{KnaQUMq$2i%1WiZ=CnP25C45T9!kr(RriZVa_)={tmE_q+cNm5xxaO zD7S-l_Y;%`bIP0C%l0P1;Y8@{Xt6jtRxFOiM@QrRqoeoVG(YT7e4Zm7|AF-QT0 z1ji;siHnf0l1)a#rL13=qx`WK$*M zkJod9gSmBBzRmwT%4ot3T36wGny@H|kqy*G7CcdyfsG^Erc$H;>a&kHdM@`k#*mY% zgGqeX_zutJPx!X6mbjc?IxOl{E+BJRxmq%df$|(*UWQ(2wg*WJeH<4f9f}h~8BlVD z6GfAI7J#B`v;~gY4bPky?N2Z%(LdVY*}~ZT5I=yCu|Al4IX;^3coL)WmvfC*dER%F zMQez5AR86o?dx1(0p$W^$u;xE{89o&?FqdpnVF&CU*OY-i$%|wxxA7~CUaLLK1Uv0 zK|B9j*Uuv9kOwO4XYfu)pgc5ph))1jHD?JXNWq#DxNU*;Vq|yuLnG%7sotP$dslkw zhIDZRqeSPrgxExzx~^ zdPRbrhW;VHZ93rgn|}@rw^&&yAQi^ z{8!??{$Dv3`F>LB@gZ4&Rm$XCC^pACbi?2wL0Z{Zvt_DCgJ*d*o1+)_kP0dbIUH_RAx2E1SC zh9-$Uj&qsmLMC09fnkEcyqS=X(Y?42H;5-+@p$qckKO`9{-sNHxZMuf^_T~{u22_# zd2~J6X|dRBzAmrN+hucDJ9|~Shwf!d9*^hlR>k9WN??&TH+xdDt1Ff2a>*%A*%Mbf zZ8nRgOLlhIoYu}@;_SwqP5Ms0izM%)&<~qy9fAcbgJB0xup;EnOg;{iS)1hfL|?cbE6$+s^~-Zz``wqs<6 zl}x?>Tn3h%LO!g>d76f8*n_dWRFJ~{{h zI^UGP@W8q%f3lK7AmP^1wk+q?@X;<@XwOJj;kXEGgT}UI=mdg$I3m_X7i_uND6M7}LTm+HXt z35LSuG((Ck&;$hf(;bG{ znPuz_+$l4kYpH9X>vvij{0puzS1=nGDO#ArCObQvvfCN-*&KG+W(~UBzAmSWS-M%! zZpR$7+d7oV$&Z?b2QnDE-rM`mcP4BWtIcV#IphwnLzZQm&1SVT%vIUhnUbwG2&qJG zL|uhmD?I)TOIWkn2y$rBe$$#qbiZww{29@8Q1%P_vuUJ2CkJU?<6HDmGv8}y(`3)f z!^NvD^?+W&M{iH|sVA3~w56pdH;r%dMln2{&03`3F*eZtaN~`cgUgMza?|rU@+;c1 zz9}up1e$?M!npSBVy7h_}1;1e^3Z!GWkq* zlE%72p4my#x)R!M$q!yNi9mre4jGe$oG&nuW(q|{|1$-!FUa(=|b=kZ&yAuwxinYV$2-rrP7G{5(bz58(i)FOeZVR&mT~=GbYOz`a&)O_OpEZ?m zA&nokw)@X)K8MG$+v2d;9X$$@Esm%hNe##Sw%|5PQn5HK7N5<noc(RfD5r3q3b!!`0~-RDmc$ zTcQuv@L2(QGs)`r5jiU6s4}Vmlv`w&O(1QWqGm;gaNLY z-&PI)w;c^MN>j60EgRzE@RC2ms^puzw6tL*0mp3efu`RBkSZ#fND!nQj+qSXV#Do|#_ZM~vyY?3+-Z^pOMB^_|^d`K%AC)HqQb6HtZ+OOQ~@a=9FWJ%A%`V4#tJqHydIDh0Wwv`%rgpEtW{hL4B>ATJ`cK7#XSeaJ!B|nr^xt?Q)CL)d3&_l;Xz?cTd#@A`Pfdz z+}&Ppw|5seUp(`Iy!f032nzUrnK?rab zON*dF6AObL&7Mm{{7e0#{g`lxo`C^aWBtblCkBtSchh`0x?>$$Lhoo+$X;Y%N)6$P&M0+CH& z8gU4Yo93WD$#712>y3M+wx?3tr}o_V)Ycd>5@~5pdHj7J=)9bHd!&4L5>iGs$>-HoG&l=R+3D&TSKFqDOTPJJp_qIx)*? zMn1j0(X?B%uzS5!sQ`7? zbiIO+i&iK@r>#K8=l4QY$w7dX;n-87I|=!3tX1L4R8{%BfrN#&Gjvx{Y%)mJjyZyL zLlvesYNWI3D&)Bes!nZ5_%`M+v~K9!uuXvw!fKIo*0T3IFM!}SDwQm0!{j6XUG6*A z2?+sf(sD`=IusU`0F{GC9o94yN6+pZAwS!@!cexaU`d8ltEuXN!-tWV!0IbV!wC(Y z{8T`IY33yh@XcQ6UC|Do=!KnR?Mti{TRBpD=tS)K)$!+0#tL)-z-old2JsB?t!NjP zmRS8VG63fkV?y{XKzbY^-!_ATQ1R$H1>N7w|#Z8LNe=6jMSo9HB{ljQodZn~6a~G5zJW7c8L~ELN?nCL5Ld5Acy5Vg@Tk8^_D|3t zwNdA~q3f!0cVo@nFl4w1fia=9$uO19iUV@kCD4hGP64DmzdV?iQnOPaC*B|z$i9l z1LUwiR^E2&j7KjoBQMh*vx+gz{V}i3$-(`02Xk~0Jbf;h%- z&gCoF6%8`g3M|qqinQx{tda5~1g&*jS+5<@aNp3G)f zs@jU4U4f@#R>yBDds9ZTf$DTZP9mHVt26L)K}HI&n-C4sbZz;bd$a_0nsyH}k8ujW z^7+x4&xedW6mcMTL;+P@yQ3&L6iyRUuhG_`DlSjw~`v?9gq<=bVf_L1Av} zgnygE-BpZ*6E>IZwtH-ymhF8`uft)n7UqUygF77gynT42e`}Y$Ct&e+I_#a0%z}eG z!5`V({c(GY-4VB2`)Wt!uDHea&KQgHH z_V>qvjaOZc&Xg-Ngt0;L!poqSq@61{?wy8#YkC55rp}c2x{uB7ddpiL+LA6Fha=#L z<99P9zjfbR9(v1UT7%T^;7t$$TV=v)>e6{RgN4ncOt(vhs*btvtA3v^)Zq)HLR(Vt{nNumw?_{4*!%jXhG!RZ{UhHQ7&?*}iXUjK zjwYSn4wuvJfU@cd1!G4(CS+|BRp&bRE&?s}sQ=CLN-_+f?%ZVp4jh zcs#*GF|1t)_wiz6Adwu*K9L=p6*YIH)EGO}csX&rIFsh%3sGd?b4qL6srDl%8AJ@j zs1`~#kK>GZ`v8hED3hxi?qMavxAY0VRDWpb;4SBv3S+IRpJNIZ?+edUW1r0qlDyrvQ2fsKa4z82EsWd3_AqD zcQ7s)I5*V4Tp0KR7CA4CcN{218u!Fh1?u)TwYO3AeFDM~&ToIXWFvB_#Z-5cyky`p z==(L&vcbT)pDL~Qpt&ieJO~FupF@XnyEZ#|@qDURD`9Sxu+o67pFet`H&sVsnAhk&?zL$Q}E7Q#!xVceq@qy(za218Dk@pXP((#icUVdT{%1sPQ7dT z`oLJ=j)fcVz3*KJb;9a}@yW;LMke2~Yxk|&CU)I;-;Foiw{pi^EC=RFG62cnd|f6M zX%QEK;;7V@RhorY}J} z<)4z+v1&Hk&;jb`jmxc81L}KW+gaxnjO-NX>?Zsmz!sA2O`d^CE97lm!Ez>ryF_BJ zM|Cc7hab+&WLQZhCmDDQu8~H8O^qAzpHX`=8H|D^&f}xC-TzFxg6Rw9APaR6&52fp zVx=U*g<47Dj`h&UYo!Yp)-GHCs!4U$44sl}k_ps#(+IRC$( z+Tt|znTd3orQb`J8x7$>vtYFC3uxPuBqam^amtye1$=qZgfG$lRp~LT1$vC`Ns*@` zj4}M`XZWp12KRhfdKhbg9;SPM3?iW~^IJZ-OkgPQ!woDIaXFBP$Vc3T>l$#w8q@ju z(T!LkwZ^v&({iK349myG5zz!4_v(CYn+sWU>{linS)#lU4+AI+JIs&Ed^{trA!H1d zw=tvvvn9IwB83`Vihpeq%JRLB8RKN(_Nd zG`^yZP%NQa*RAYfKW8EShf$8^GlWk7voZyssh!YqFt6Jl)h}OOY(8FI zE2A!qx4}BvfG`>?Ov=auOg*+^a9L+-OfMgc=vAt-8*NLnA+2%i;5bwQeluBkaBY(y zIyNbJIupu-!pRvqJzdC=LJavN6iyeCuqg%8nVh4Lq$?1@I}y$Uw`53^fahYjY{*c% zi*k6^{c+Fr-uKD!ev1VNM|f8fOQyru(Mjc$4RH%CR(r@;i~N*)um7>UG4?ildqVzpsN zE@@f`tpqfBvv@7s!88qv%K1tZ_1z?Br$fD-AT?_;m*avq%`Xk*AU{Oz-5#`SHKhvI zK;Zuv;%?(Q;r@iGck>l82?L`BN6x@$0`@k$!5ueqP5N!RC^8MuA4JPK@kkyUuH}F! zIutl~N3L=|#5&&^Zi&2)P5j{hTe|(f4zBU9FMBuTeOdTdo2v>)t|$F2XDFrZauoSX zh$x9w68lFW<-fQg`tx-l6+^@)A(6!V7U`dssF1HaG&1O|VMyFVu!Bf%qG@b_jtAps zJ~>ThWK&#%^LU%O@f$Olhb%7=hY}3_YMtW_lmYtr^J^D)$uQQ))+yF~baHJ!FNgC4 zS^_>o-K`ud%5Y3mfp@D^Dor2qC8B2*j2$^&XiFvS&~ze}m{b?eH0m3NI8W)D{u2Lu zTYXbUA`fD;6&MxKk?ru9Ef5v4Qm~}wY3(2%_8$pNP{IF`(cj8vH5Ka{QwiASWzkL2PBV>A9h=+ttquV zEc*QyFT07jXF?tflWx-{5eoXj73gbAhiP93xW4bPYY2(|tHWOUGlZJR2?!PHU zh+QN$WaCn*Z9Jy?dQ+Amk0GjB{5L_Mp?NK2K`-}VZ*P5?F|A$D_}oD_LAG_o6=_*p z)?3DhSpOvuJg%j{o=Gh>jVP~tk992&9Ss5TV=WrtN3Y-I{R^)t0Ji9YFHWRV=x`gp z8s>Qoa&-uHa^Tb$Em({xLh(WR*t~$pTtY*!|NMT${tL1qBnhk~rDZ~5MUe=U*%|`y zm6oiKkIsb{Q^cdN0!rw14r4Dk(_D*I$4Z>&&-1NVz9z~? z^#9M%N+i>h9S%S|bpXPOQjmxoQ!XrBk+AHfv3fyUy1@SYGrN`>e~Ks^3#D&6mv`Zj z4I2N8@rffEqw#SqRs>RSwYXPLr%j|M&Bw*eR2%a7E*^+X#Aj$nq8c?Gk?c4(@NimY zj$s)bcmQXNw#!iPLvGi@9vDQJ^b;Nm(HMR8TxLAjlbni-jUNBhSfpc1+!%d3;#)eV zlIhS`7U7#4W07P}a6FUS**ae=q-7NbD11>tWvkhJ`><{3-#UOfCD!xRd0$9ULWZ>l zam`>6mDz_HubijXV0`Yu+GJ^&4G(qX z-3E}77M3Aon<+)T}g8w zsb*9E(W+TmbKS=s-U&y}fMrn`AYQjY0tnv+&$zNb62hnrX{!Ji!LM7FU4z*yK~tJ^ zM@jaIx+meMd4<|rM@PdDL`X6c)ShnbH&@OX4;S!v0nv+L^)vfagsLE_u~$Qv6KvC3aR2V>poSg}8Y z8WCMo3>r>;7yZORg79?C&DeA4j2x1i*_mwxWS$%e(2|eGuXm~rb|&jM7T=R>X}!l> zipy4tu-}UBc>7H^t<1&8Pj8gKXi8PLhTJj_%ebjchnjW0Mo*Dl0Fwseq@}{V&-A&u zGXCGBT|ajqojw4f-&}X&1f?_AuV(;^H`lLY(SDNoKx009f?r zWZhsvuz;OE>J7S_L2r7jXe=Qe&`B~dJd_?G?oDG=$oF;3^Z{;%=IhPd>9x$` zAHh8$$*Jie!hzD9CjiL7s(aIVOTf4nX8KFLDchK(IJR*_rW(^RiklN*rE_&Sd}GD6 zjU!$!9r&3J{ETE%;1&KP!FX8FQ7r*aAx~RgUK7K*%HNk@Z-c^LhDRB|904kQ7Rwxw zep8nHx%LOL#R2*Lc#Hkv0@kan>KvdlB2W2{AkDvjD_c3~ebC(uIf5cpno`XoOovFspQaZ0w|LymnX&#EE zBa!qoegv3=U+hnL%%{i4Gn$q`!+=?vatzt~e=%`433pb2JFjz0ULuERfuvzZaTv{r zO>5d2*Lbj&=0w&p2TVFhu^uQ!Ga{8S0Fk8JiulGbYAE0@SO5nvh%vDa{aJrL^jg|1nkzj2fMyBiTQm6E%|?F)rqZnU6m zyDc`zk8Z+3U?GFt2tuah?CAth76gibUts~<9}BIpR*c*ZDTE#Ofq3kmilQ$s>Irt| z+Zx|}8;|Vjln2A!k*yO`UP$RKr<`}N$L_s=+YM=$l5i#ht(?gUaMc2r&2M;T@CgAMcCa1o=5L}fL9Aj zodH#BXN3e+g#nKkp{hAUZM?3HX*aNXGhnq4y&D&9n7#2%8Z#yyOl5?Id`<5FA>Cs^ zhzQTb{g!DB{u}wlWds8PHcnzXEz38S=+i31%Z)097%idy1twAlMSvCuO-SjETl!hi zM(;l13wB|KeeihysOsx-bWdjz|9-R|>m^wIc(MQJ!dxIAhZnT#`-|_w$^KE$zAAWI z1-uv|E9fs&FLN^oewn&~jFGmXaoGXfnE@tsgX?~!woG+5@3-K7m}+2iHO-l(8d%r$ zUv6Qx7nhgsX=SxM4bqM3Xh-4Okjx_}jzG?uc5$+Y2QlUWp22wujtpdz<DUvy<9&N-`BrZXlJI_p zOR@AjLy_KYSc6&}QFuJ3rVQr;)<4E^)lJ$dVp)sm*f6E?&;^Ev)f5FGh73zn1Ewny zVbg8O>f1u_1LU9?{229FMVVE~Joq7P+O^gSlx2;Kz!h>S1PZKmxG4&Z8#d^cIpX8g z@2c`8!4SxK1Mn|8AN-)L7@2HHBmY2}oUNL2RtsgZa$n11dO|-j=amO@Vnn)Lx)mde zTAf3NMVO9hH92=CM?J6V25uO@a#*-;a(_~2Gcxz8bad0o*|;5|Jv1m$LJZQ^dz4s6 zvAX?UM^`v87!UV#eWAtl|I_SPB9@k|uKv_m_GFK*JLz;XC)TlI8LM^rY2i-7b}Q;o zIAisnlwG~SSk&(cFmG!O8&75;gMluq+$r1A(fD{zpl?XQB3ov&I9P}5?Q{-KJw;9f zt++H{Oe3&iUo{_0kyEDN7St3%X+g+~AR=JkB-T+(0Xu7{#-DQ8aM3en0n%g{L#PVX z?N&YQ{h)IX;%|7KbNCSDe%j}F&chOPn+JX0IzEG-_2XBU3zQ|7=Dsmx+e!r9qIL1OG@&18&;T_pn2e9M7pQTeHbgOP!ik^WMUcl`wP>7H!Zm5NPuhKT zIj~NYM|j5^!D{RLbPiGEnz6Pr!{RGiU+$q zgUS5CyvL#-6#U`B%ypKnn~M3Z?!7ior`uw?-y0l{`7&;gf3%OhDE&P)N66Ec%r73A zp4`_~ZbHR3&mR%HOd(Kw2b!&DL(G%*DfBkY((sU z_~|+3@$@*oT3epi=rdYA?#P5_{W!3dP;Lt=z#(EL6rL(zv3jAsVRl=V7Su^)+&AnE zk62xuKCfqbmz&Bqh* zr5b26t(Q-T_8|H(K(r%G)*-z6hj$VBFGEfaApWr-AZ?|gTUJ+ju-8yWKiOhfX($GD z8Xgu>Cq)ZM_-En0htY07z}&tfP=L7WF`704~Dr8{bccgKana z#=N^mi2O|r@4dk8n}&JeKp`~&vYFm{0d*pKT7v7j9iY$TK|}18h)O@LQ0D7Y_I%5RRa7 zP;1ekXW4aVge`NK-cq*Fzub;$#1V$IR6s*_;DM%$DsUn4^UQDV&&pa`S1NFz+}w}U zhP1|Y9XdI@O}HhVkO{(Dg|s1+%hQM8tfQj2PP58Vxx9p5i+PF@ws2b1OM@&{gN*3J zJm6_y#Y??XdHQhRE~a5A?(sWr{tr|~iTgWMAPLYKSGp4~sG&S@e+4Uc&1XtlrJ|LZ zPf~p~l=DT<6dM0j)+F$PTp@2N3IM-z?8wu1-F5Mfp!02PRel))N~F#G9dofB^wF?CKYeyH!@ zZ)CF{=sTFOqywLLbItQdeTU+f#hU?GA5NqLDBE%AIPVLwCNY6F;@CK(9IQ_Zhr;=E zhPN68g_5z1V>EK->Cs*>Us)U11ywUrBaxMrX=Sho zKk)0^JF*TAwIQp+>~BPn|NK?Fg?o{hG}EM&7!5=P#N7PHy#G|e_+3X??XYSRX$}(Au+^`cJQ-x-Y}2MlMz~Eu z*#7Z~m?oSaog-RPTT&EQwG^`bPq%td!#Aj=XyW}PP!km0)7j}kXPNIS6|oq3>?^p> zy-9w2T_X3f1L-i3!Fp?s|BJa00Z`#u_3HevfV){@SlI|SBtHB1ARQr$&1po9gO@Z6 zQKZji(iBfL%tC|+P1~^;4NF9}!#}#cfV{!bBoGH7v9g~O;^Pnes7*R$l&rMMUtU^EJvq!+ya!~FQT08 zJd~$%TaOLO{*}ba?C?lo77MHboQDv-ux)r-nlTKrKt}1^UfU7Rb`RnJFM{@pI0oWX zpoB}3i!0_UG;rdMbcO;RQ2YXNh~-fYAl~AX2o^v=4JdE`*0Lovic>(=9sI*R69Eny zFYzz}I$WX<-J8cTz#(0S-DYhKM1WOPMEd%VphSTO5Jx~40T6JX2zG!2 z$QNXf7c@pHj4{QF!B%T%Ol#D%TCGBUu@=0sVvKzY{BMr@r&H5p6f1~8;puTU14(&M zk+Jwn#0e(lDopQi#d|Rk0)!CZd;#7({56>->t#d#L zD>mn%)836oN3jsVlnba&$)DmF&KP!-t0HhIVMK>?Br~1N$4HmXBRC3t`4A#~Cqj{B zu${?;5yOjX*n}rgSV;;fX~b{FGJTVOL}n9qYutiz2e8t8&f&5I>?t~9OPCiB;cU(! zH_uy))efKA;5g7VYQCu5nzQ??9yaW73^R|_XLaUmwy4jzVDYw}x4}|T1|@j_#6`&6 z5$IP?o5?{BvMzsXZP2i&5N|1ri??5{b1bc@s@pcdF_Olc%5Hw(5?+OQfBe*?2X1+I zWcY~@YDv4KBQJd;FCK4*atfO{89*}!rVM(IQMN>}J5*(rnoDdjz9|>P>>wS7bRZ1p zDnlNoU8u(EL(xPa*`eI{{v1OL?B#j9c$x6QHv!;5xzy!rLGX{!ETFo9%|q6r=q)61 zb0pBL8%=Ax?Gvgg7a<_{7)T6FXHh}GXNTi+P#p$ii35m`TSk7U;cER-d}M)q-UqjL zC1#FOK;7ewkE+Oz`i*R8^p-~Q_s@u41Nuld7S7g*lu+9SjdgG4at>s9l#47N6=>Pg z(1y#NT7z=T7k0!NKcNChhQHpveNO5^&;$|JzRK7BkYp#%;AJ1R%DKA&ho2@lE8l-O zdHZpG-x&KU+Jkz49Doef2lf{D@_`5l{fgsJ1)KzC%D^l>W`RRrs<$WjF^lD6fk<>{ zXnM%MVJD;X>u zqpA;Z9wU%=Cp7uw07_um1Ma-l>FTiGde+@BW5w%5LY-l2ULnM3Tr4Wm9(Ot)?{LXq z^9BQ*Uz3$vZ>@6YGqi4OlY(v$OAmf@GSnR z3{8JBAoJXx%x?ITr8gYPu1Lw@``}Ub?m@$)>=V9=Gc%V^{eSH9+qNIZ^M?V~5u8#g z#m>&moQt&SD@)xrHaOwxLfmF@|`zXb1)h19V493d%?5~xfX_&)JK zdhaWQ_MozpwW&hzs)r4uj*!$%9wy#kQCclEl_0PrG$z3jpvz|eHswa1r0GLV$i#-+ z$RSp^h+@e94D?ADZU`|nU!8{<zuq8EkW2+$FRBs*i z)^Ws96B5J7C)^IL2+rr+D;$cQ8Pbb%8CpL_YhA@#AEeE`3?}|=#+Nq{75?sB;ol%a z8lB)snV`z;*l3oMo5o8VH@kzV;|%I8WHXvCSXG&VIc^+c2wW_shm&{z>fGF~-kto= z(Ft);zybnt>>Gnbx)?EUlSY15y@WaX5hHl-bunF%6KZr+< z9=#C%+LCj}EoK^o!&07vm~5osgR8?%wmF@n%D!8Ncw*Z{IViEon~Tn+C1>$wUI$%5 zoHVReHR?dYVyO;C;zyPfiRB~lZ*IGFc6oUgW*r9E0Uf~mM#6h-1~5Qac0SsD+7Lsc;z z#A*!y%Yc{$WMQ&|(7^FDj4cMOw6UrvYbCXcfl|eyv2vMa9gt>}k7Jt_@^JM5SDr+) zcnx+!5(h}LHufA^26&aj`c2^~VeU=;I@6!d%8jOlD))x_AAAed{|!z1DdJYZDu>08 zA*Jm_4H_`;7rDP3zdLwAf$vhbgcw)!sV<4Le9KN?1qF&nV@B}$3Tgn_ix_f5j8fdI zMX8jq@*b~@!iE|xTc$Pn^h_DFqXOE&pGiS|!Ge7&ydGiW1@F>Ir8?bNp*8#b@zyyk z12s~RvmtZa3t=+9K|3dlwtrj4%Fxbsbdl&jLnZB7BdQAv#A9LJ^IN?TIv2Ms2J6PDi zIUgPI#1sXwU`mY_;Lb%^z>k*Y7ZnAe?UltP7P^0fkRlNGU(P(_Sy zJEVTtJA!!%y^}$F6v$^7+`zjaDG^i$Kiw33NzFx7nR;(`qT{2v*z~kMp7wp#-qG8g zi#2|e-AF$Z(P{QT*5OOIl$<)ge;oG=%?w6AYq5*lPbcZ%0#R;p?}8 z8=21(@||YBC+V46urCc}GtS>MffQSvw(_1(N}VN&P>Vjk1G z3h2GO(xyB}NQR0)^)vG!?MKVycowt!tJ!SbILuuF`;`uC;kBX+J8$`Qb=}Oe^OkM< zCLYzf9`di9C)pbmt`iUigumWqZbYv`1I3~#*}{MTorN$X;Z3_4En8h#A#jH1fX3y4 zYp#ETC_uJH*d8|YS;zv2ta+6nfcbfK+(+^=66;gxUCI1S8l<;?UXbiF=%62%|4ANH zk#spI5~MfL>qp3eflEl#ThxgfmkS8i5XeV_&8MB=yn8xG%M;gBh za>pYqf>uLbA$+6(X&ZnDNf@nu#>DfkAqHKIind3n;qT6ZtYxg+6N;C%3?H+~R2+s6RxLx>E8N$r8ou8!jU&P6TNd-Qzv{eKF4Hr}zOby>$C$|2;@ z*v{iiT5PDwU$Knw_O#QkH`cLC+|SB>j9Bn_1$=%Td>$StCcCQ-O#m%<^ zKtknFj=;o>_&(rcxwd!2kjyK_F!-aca%2M=8n5)BL5L5l(H4ju9mCkmjhSnFOY>9M zj%$!YVP(Xu2QbxVAqOA$0U^*XM+C@?oN2X~TeC;~k0`G2Ul0 z!xMVk=d1HKtkF22bP4|>i~;GAFS?z)H?ac6eA^3<8sJj@&+=*MgxlGzEP5w!8&_Wc)4-9fy|l5D<;9D;}F7HH@sB{VJBCx>QErpoCQ8*Vjb zpG@l~Q>oO-#WpjjY0IW|lewJ%eF9q_`Wa3pFiK(G2y3XogUCR|pkF}GSxs~X;`!Z2 z&toCPLn2t;I+%+$?(@Y}oI8JX;d`(LBXZbIlAAP6muc;_5xbjcJAK>+a2gBRk4U1OJwHy9t|PaHFF5woq3lIPg;;Ep1q!ybFLQAXM`I0X<11lt}2Q6nJF2q>^=9eie z6TcR#ZQ<907K2L4RQM>i4=^jna+_e$_=cLm zJ2q5?H&rn3tace=nJ%ey8qHfB0>>gibv+CF^<-ZWBnNFux-aQF#0Lqp@BzIC6iW1l>PkKa+|0D8o%uKgz2T-J z2urO#ZG62VGD3JRY~ViBd^M;Tw>HRWl;>l}o&1@hv7yE}ENvqahaC@64sd~~D;gpQ zYnLzIJ5Q0yhv&z7!qt^~@2#op2xnHipNA@M;mO3ydAw0-K{N7G>zDwB&xLfjzLZ4+ z!*-R(W)rGDKl9gl(I}*r3cy7vlZT&+$pX60Lx|}zfL9tscAHrN(L69glUn8GJ+Vrfh*7Pcw^Qvp5 zptr#OBd6&h5XK^f4mWJWptvw3BT{w(3uQW7YqVJ`UB;Lu8cCQq z+0P)saW)Z#B*%qC?x{}NWUbWUe)#pqBfVRFA}!fAA7l5FklO2PzIPi>5~t907}?}A zUNhFj5tV`@0;R*xut!84rfQA#T1{t4V_kgTGCXB50*DKB$xV&lHH&1V8C`XP%BWBtG7r9$JxXe10CJ zo(y0cty0$MQEExOLJt$2YCg-`giukVE%5RL+(fpJWyp#bf#uPfG{SJ?IP|l^Muf=? z?DNRedMu{X=29!_dGW;l{U`AKtyZLy{54ee=ioIIS2PRC1D#305C#5D7mimTCo(J1 zTj9C8H&6@i(On4B2<~RmSkYCS3di&#!(&_gzrA&92!|6}7GjM@P9`XJM4~4=R(#v; zR4;``jChOLZTnC7#$8*tj_%xl!oSeV9(XcA5hN1c;#l|SZW|7%T}=MsB^oH?feqvt zFj;;hYOTPsMbO$-9Q%s2cW+h1td*pS1%M{zT|d&L_5%u&6x4}N8@Qx!$%)*MyB)cf zWA=Y6FT_s87MAz!onWDfy^VW}cijH1`7&F5@5FF2IXtm<@AAUJ^1mCUH{8-oaE(3H zr3||9m?;M!ieyHaNx_EYm)T?So}NYnL+l5$TRf|tM|HgErHm5NyCO=6BS`oW`3vIS z3SLPAQC8eQaC>h1Es>tF!E6k1aF{d~8PEHAV~OO<{7UCo*O3p#PV40-ZVoud+sMX8)@$K8k0ZbYNfAIduD)WzZ9yxuabF6da zePmj}{4xD=X>{+9_Mc?_9FI4Z>r!W#L+GnwCeZ{EAVd++=1yM0X~W7MOzTyT9Yn%!i^sFC}8HOlKd8-uz) zcMvn22(%TR^L{}J8+nhr^nYW5u3E1;TyK-5eR6ze ze9DCMVL?=Aa>*o}9gnvrhTjOLJES*!1K#j+yl?Y zS^53M-8vq(9ux|G@z;Ma*}lio^E-R?NtG66q_LxGz9jMs=CzGoVA-Coj=5nB$XNfa zXL?!ohOd24r;28^3g;~f%iN$&Xz9vw8(W0c;87nSuvi`%{9 z?G*0-_bzlNdcEAQTJXGd?3r_+z_rAApYm({Y$HrQu6k8Wt8QT!+jSa>6J-61QS^HzFVuP^( z&-I1rhFEOf$_>3k{VUgY^sgEm=;#|9@MRzHv3I>&=TC!lD7M-GasO#My}LHI)eFf@+L#un^sm^44e*FEb=L=Jrj$%hDY5w^Sy^Tx5 z9kbrIHP|6>rw3aQTiQFczJG8aZk_((Lw~tT;av}TS3bG|4Z zj?DF$x)QRVba<&gPm*GilC)$bD>)B%El5%3d$8^S9(&j2W4XGeBxR{cRcca~1LYvU zC-TA4BMW7bES5v$P&rJN$l-E?*I$;(QL;>qmSf~tSuV%P3OQa*kd@xUu}V&oUg?w7 zaaAY>sPAJlWlUoTp$<9 zMRKuRBA3c#Ucb6Ru9U0fYPm+PmFwhsxxw3{H_6R%i`*)=$?bB7+$r1TF4-Y>%RO?h z+~@b*zF!`Y2R)|#AurD!kw@h*d0d{5C*>)5TAp!lJS)%1r{y#9S^1oNUcTT_S6}p+ z&zF33!aKbN=U7amddOZk=8!GG=E_>KHlekZ?|Kgb{DPx7|>*~iTOMgA&( zlfV0n;{SBh|67J-mq#j#PX_9fcIp_P;j_Upt43 zO*%>U)yXMU*1+1jdYI!EVfyC!r$?a)r0r%5$UX<9Ry)tu(F zphcap`|APvaqZGiXt$QMtQDgjrh zZqhS#v!10}^lUvx&(*DZo^I3g^#Z+6FVc(k61`L})64Y=y;85ztMwYaR)_e3`y-z=>_v-`tpnggp(uegCeN-RQ$Mp$)QlDzr zIM847nKDU@G)0;w&5&kEbEJ9F0%?)7L|P`TkXA`+r1dB@_y*tL8+?Or@D0AfH~0qM z;2V5{Z}1Ji!B4?Y!B4?Y!B4?Y!B4?Y!B4?Y!B4?Y!B4?Y!B4?Y!B4|a!%xFc!%xHa zI%4>HrQv%>X!II>8h#pn8h#pn8h#pn8h!?T27U&927U&927U&927U&92ELEe4A(0I zKLbAlKLbAlKMOw#KMUU@Zo==$!q39b!q39b!q39b!q39b!uNp+(f7g6!q36a!Oy|Z z!Oy|Z!Oy|Z!Oy|Z!Oy|Z!Oy|Z!Oy|Z!Oz3b!_UL_xe&wk&BONrI?-$RdH8wwdH8ww zdH8wwdH8wwdH4nR1^5N{1^5N{1^5N{1^5N{1^5N{1^5N{1^5N{1^7kyMfgSdMfgSd zMfgSdMfgSdMfgSdMfgSdMfgSdMffH7CHN)yCHN)yCHN)yCHN)yCHN)yCHN)yCHN)y zCHQ6dW%y{^5Va|Azk!{~P`{{BQW*@W0`I!~cf=4gVYdH~eq--|)ZT zf5ZQV{|)~e{x|$@_}}oq;eW&bhW`!!8~!)^Z}{Kvzu|ww|Azk!{~P`{{BQW*@W0`I z!~cf=4gVYdH~eq--|)ZTf5ZQV{|)~e{x|$@_}}oq;eRW8UrNy9v1^z2hy}eN9*q{> le=O)Blh`PE+Mh@JvZ&uA>@Rs`#f$&&C9ziz>R&vP{s*cO6VU(w literal 0 HcmV?d00001 diff --git a/android-json-form-wizard/src/main/assets/fonts/material/fonts/material-icon-font.woff b/android-json-form-wizard/src/main/assets/fonts/material/fonts/material-icon-font.woff new file mode 100644 index 0000000000000000000000000000000000000000..e506e2cede8c654900d7fe0d0428a1fcd6bd5b52 GIT binary patch literal 22932 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 literal 0 HcmV?d00001 diff --git a/android-json-form-wizard/src/main/assets/fonts/material/icons-reference.html b/android-json-form-wizard/src/main/assets/fonts/material/icons-reference.html new file mode 100644 index 000000000..adc863e9e --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/icons-reference.html @@ -0,0 +1,3533 @@ + + + + + + + Font Reference - Material Icon Font + + + + + +
+

Material Icon Font

+

This font was created with Fontastic

+

CSS mapping

+
    +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • + + +
  • +
  • + + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • + + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • + + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • + + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • + + +
  • +
  • + + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
+

Character mapping

+
    +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
  • +
    + +
  • +
+
+ + \ No newline at end of file diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/access-alarms.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/access-alarms.svg new file mode 100755 index 000000000..7b53ea8dd --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/access-alarms.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/access-time.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/access-time.svg new file mode 100755 index 000000000..464557e9b --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/access-time.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/accessibility.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/accessibility.svg new file mode 100755 index 000000000..def82bec5 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/accessibility.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/account-box.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/account-box.svg new file mode 100755 index 000000000..0b2782d31 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/account-box.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/account-circle.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/account-circle.svg new file mode 100755 index 000000000..860dbd52d --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/account-circle.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/adb.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/adb.svg new file mode 100755 index 000000000..01d93e58c --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/adb.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/add-alarm.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/add-alarm.svg new file mode 100755 index 000000000..3619b84ca --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/add-alarm.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/add-box.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/add-box.svg new file mode 100755 index 000000000..a150dc090 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/add-box.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/add-circle-outline.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/add-circle-outline.svg new file mode 100755 index 000000000..3bd845330 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/add-circle-outline.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/add-circle.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/add-circle.svg new file mode 100755 index 000000000..476e0dafc --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/add-circle.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/add.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/add.svg new file mode 100755 index 000000000..1ef425c27 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/add.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/airplane-mode-off.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/airplane-mode-off.svg new file mode 100755 index 000000000..09ff74d7d --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/airplane-mode-off.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/airplane-mode-on.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/airplane-mode-on.svg new file mode 100755 index 000000000..3bc107b28 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/airplane-mode-on.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/android.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/android.svg new file mode 100755 index 000000000..8cb431088 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/android.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/apps.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/apps.svg new file mode 100755 index 000000000..95b6d6f19 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/apps.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/archive.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/archive.svg new file mode 100755 index 000000000..fec4a52bd --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/archive.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/arrow-back.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/arrow-back.svg new file mode 100755 index 000000000..e8d18fb4b --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/arrow-back.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/arrow-drop-down-circle.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/arrow-drop-down-circle.svg new file mode 100755 index 000000000..dd3559c50 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/arrow-drop-down-circle.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/arrow-drop-down.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/arrow-drop-down.svg new file mode 100755 index 000000000..7f0b35701 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/arrow-drop-down.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/arrow-drop-up.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/arrow-drop-up.svg new file mode 100755 index 000000000..64343f8c6 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/arrow-drop-up.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/arrow-forward.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/arrow-forward.svg new file mode 100755 index 000000000..6d5743285 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/arrow-forward.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/attachment.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/attachment.svg new file mode 100755 index 000000000..7762ab8e9 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/attachment.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/auto-fix.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/auto-fix.svg new file mode 100755 index 000000000..0bd9ac65f --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/auto-fix.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/backspace.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/backspace.svg new file mode 100755 index 000000000..bf1de3bfd --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/backspace.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/backup.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/backup.svg new file mode 100755 index 000000000..ffa7397d2 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/backup.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/beenhere.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/beenhere.svg new file mode 100755 index 000000000..5530c79d6 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/beenhere.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/block.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/block.svg new file mode 100755 index 000000000..9471a3965 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/block.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/bluetooth-audio.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/bluetooth-audio.svg new file mode 100755 index 000000000..6440f5c7a --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/bluetooth-audio.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/bluetooth-connected.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/bluetooth-connected.svg new file mode 100755 index 000000000..c4d3c643f --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/bluetooth-connected.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/bluetooth-disabled.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/bluetooth-disabled.svg new file mode 100755 index 000000000..20f43ab8e --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/bluetooth-disabled.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/bluetooth-searching.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/bluetooth-searching.svg new file mode 100755 index 000000000..6440f5c7a --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/bluetooth-searching.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/bluetooth.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/bluetooth.svg new file mode 100755 index 000000000..190531045 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/bluetooth.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/bold.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/bold.svg new file mode 100755 index 000000000..28fe5c819 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/bold.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/book.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/book.svg new file mode 100755 index 000000000..4a3ea3281 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/book.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/bookmark-outline.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/bookmark-outline.svg new file mode 100755 index 000000000..0359e0ee3 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/bookmark-outline.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/bookmark.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/bookmark.svg new file mode 100755 index 000000000..d3ecc841b --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/bookmark.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/brightness-auto.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/brightness-auto.svg new file mode 100755 index 000000000..20f45373b --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/brightness-auto.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/brightness-high.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/brightness-high.svg new file mode 100755 index 000000000..165d1e113 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/brightness-high.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/brightness-low.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/brightness-low.svg new file mode 100755 index 000000000..97508c0ac --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/brightness-low.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/brightness-medium.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/brightness-medium.svg new file mode 100755 index 000000000..c7de09319 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/brightness-medium.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/bug-report.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/bug-report.svg new file mode 100755 index 000000000..da0ff45b2 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/bug-report.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/cake.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/cake.svg new file mode 100755 index 000000000..f12c535b3 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/cake.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/call-end.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/call-end.svg new file mode 100755 index 000000000..b02893fb0 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/call-end.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/call-made.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/call-made.svg new file mode 100755 index 000000000..f30659a24 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/call-made.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/call-merge.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/call-merge.svg new file mode 100755 index 000000000..f08f1ba3d --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/call-merge.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/call-missed.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/call-missed.svg new file mode 100755 index 000000000..566782bbb --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/call-missed.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/call-received.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/call-received.svg new file mode 100755 index 000000000..d51426e93 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/call-received.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/call-split.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/call-split.svg new file mode 100755 index 000000000..d56bbd7bb --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/call-split.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/call.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/call.svg new file mode 100755 index 000000000..0a87d72d9 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/call.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/camera-alt.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/camera-alt.svg new file mode 100755 index 000000000..897edcdb4 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/camera-alt.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/camera-roll.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/camera-roll.svg new file mode 100755 index 000000000..96e0198bd --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/camera-roll.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/camera.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/camera.svg new file mode 100755 index 000000000..df4cab219 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/camera.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/cancel.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/cancel.svg new file mode 100755 index 000000000..e69c2cdd0 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/cancel.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/cast-connected.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/cast-connected.svg new file mode 100755 index 000000000..cd4d1146c --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/cast-connected.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/cast.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/cast.svg new file mode 100755 index 000000000..4ee859a99 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/cast.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/chat.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/chat.svg new file mode 100755 index 000000000..e5429e8c6 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/chat.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/check-box-blank.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/check-box-blank.svg new file mode 100755 index 000000000..f905d0083 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/check-box-blank.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/check-box-outline-blank.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/check-box-outline-blank.svg new file mode 100755 index 000000000..492808c23 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/check-box-outline-blank.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/check-box-outline.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/check-box-outline.svg new file mode 100755 index 000000000..1afac96a7 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/check-box-outline.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/check-box.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/check-box.svg new file mode 100755 index 000000000..668fe94a0 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/check-box.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/check-circle-blank.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/check-circle-blank.svg new file mode 100755 index 000000000..78dd6a677 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/check-circle-blank.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/check-circle-outline-blank.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/check-circle-outline-blank.svg new file mode 100755 index 000000000..0b69cf48a --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/check-circle-outline-blank.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/check-circle-outline.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/check-circle-outline.svg new file mode 100755 index 000000000..28d8117a0 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/check-circle-outline.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/check-circle.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/check-circle.svg new file mode 100755 index 000000000..a087a3d70 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/check-circle.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/check.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/check.svg new file mode 100755 index 000000000..dfbaaa100 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/check.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/chevron-left.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/chevron-left.svg new file mode 100755 index 000000000..e5c45b228 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/chevron-left.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/chevron-right.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/chevron-right.svg new file mode 100755 index 000000000..9d47ad23e --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/chevron-right.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/chromecast.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/chromecast.svg new file mode 100755 index 000000000..d1344e5be --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/chromecast.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/circles-add.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/circles-add.svg new file mode 100755 index 000000000..090b52465 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/circles-add.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/circles-extended.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/circles-extended.svg new file mode 100755 index 000000000..89c30ac15 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/circles-extended.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/circles.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/circles.svg new file mode 100755 index 000000000..90e21d40b --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/circles.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/clear.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/clear.svg new file mode 100755 index 000000000..32a6fdf9b --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/clear.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/close-caption.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/close-caption.svg new file mode 100755 index 000000000..1bcaf5aa8 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/close-caption.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/close.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/close.svg new file mode 100755 index 000000000..32a6fdf9b --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/close.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/cloud-circle.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/cloud-circle.svg new file mode 100755 index 000000000..879846371 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/cloud-circle.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/cloud-done.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/cloud-done.svg new file mode 100755 index 000000000..6235fff6f --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/cloud-done.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/cloud-download.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/cloud-download.svg new file mode 100755 index 000000000..3877c4867 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/cloud-download.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/cloud-off.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/cloud-off.svg new file mode 100755 index 000000000..e32faba29 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/cloud-off.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/cloud-queue.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/cloud-queue.svg new file mode 100755 index 000000000..429444346 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/cloud-queue.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/cloud-upload.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/cloud-upload.svg new file mode 100755 index 000000000..ffa7397d2 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/cloud-upload.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/cloud.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/cloud.svg new file mode 100755 index 000000000..b3a93c51c --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/cloud.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/comment.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/comment.svg new file mode 100755 index 000000000..616a443ea --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/comment.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/communities.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/communities.svg new file mode 100755 index 000000000..00e79fc60 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/communities.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/content-copy.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/content-copy.svg new file mode 100755 index 000000000..c2adbfa3e --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/content-copy.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/content-cut.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/content-cut.svg new file mode 100755 index 000000000..603edd923 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/content-cut.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/content-paste.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/content-paste.svg new file mode 100755 index 000000000..aad8a3fb0 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/content-paste.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/create.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/create.svg new file mode 100755 index 000000000..a263b3ee6 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/create.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/credit-card.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/credit-card.svg new file mode 100755 index 000000000..bec52804e --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/credit-card.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/crop-free.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/crop-free.svg new file mode 100755 index 000000000..a2b3ed19b --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/crop-free.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/crop-landscape.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/crop-landscape.svg new file mode 100755 index 000000000..d98507abb --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/crop-landscape.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/crop-portrait.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/crop-portrait.svg new file mode 100755 index 000000000..681aa3e21 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/crop-portrait.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/crop-square.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/crop-square.svg new file mode 100755 index 000000000..2e8a013ed --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/crop-square.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/crop.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/crop.svg new file mode 100755 index 000000000..ca7cc1c6b --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/crop.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/data-usage.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/data-usage.svg new file mode 100755 index 000000000..0aa3a55be --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/data-usage.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/delete.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/delete.svg new file mode 100755 index 000000000..e2755b067 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/delete.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/developer-mode.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/developer-mode.svg new file mode 100755 index 000000000..ebf247401 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/developer-mode.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/dialpad.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/dialpad.svg new file mode 100755 index 000000000..c9fb4a01c --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/dialpad.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/directions-bike.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/directions-bike.svg new file mode 100755 index 000000000..f8bf9943d --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/directions-bike.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/directions-bus.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/directions-bus.svg new file mode 100755 index 000000000..2c9bc8472 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/directions-bus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/directions-car.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/directions-car.svg new file mode 100755 index 000000000..2b3fa3db8 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/directions-car.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/directions-subway.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/directions-subway.svg new file mode 100755 index 000000000..a5c4aa10d --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/directions-subway.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/directions-train.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/directions-train.svg new file mode 100755 index 000000000..69c51d8aa --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/directions-train.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/directions-transit.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/directions-transit.svg new file mode 100755 index 000000000..a5c4aa10d --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/directions-transit.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/directions.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/directions.svg new file mode 100755 index 000000000..003bfff2c --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/directions.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/directionswalk.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/directionswalk.svg new file mode 100755 index 000000000..1d74f9453 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/directionswalk.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/disc-full.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/disc-full.svg new file mode 100755 index 000000000..1d42a7893 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/disc-full.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/do-not-disturb.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/do-not-disturb.svg new file mode 100755 index 000000000..9471a3965 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/do-not-disturb.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/dock.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/dock.svg new file mode 100755 index 000000000..c960d640c --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/dock.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/domain.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/domain.svg new file mode 100755 index 000000000..282b36f6f --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/domain.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/done-all.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/done-all.svg new file mode 100755 index 000000000..d6c4a08e1 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/done-all.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/done.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/done.svg new file mode 100755 index 000000000..dfbaaa100 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/done.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/drafts.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/drafts.svg new file mode 100755 index 000000000..e466a10a8 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/drafts.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/drive-apk.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-apk.svg new file mode 100755 index 000000000..4205a4647 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-apk.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/drive-audio.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-audio.svg new file mode 100755 index 000000000..b15d01e58 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-audio.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/drive-code.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-code.svg new file mode 100755 index 000000000..717fa5303 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-code.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/drive-document.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-document.svg new file mode 100755 index 000000000..39114e673 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-document.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/drive-drawing.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-drawing.svg new file mode 100755 index 000000000..38330c0c3 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-drawing.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/drive-eta.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-eta.svg new file mode 100755 index 000000000..fa4826156 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-eta.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/drive-file.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-file.svg new file mode 100755 index 000000000..cc363d5c3 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-file.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/drive-font.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-font.svg new file mode 100755 index 000000000..d448d89ff --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-font.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/drive-form.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-form.svg new file mode 100755 index 000000000..5fc99039c --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-form.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/drive-fusiontable.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-fusiontable.svg new file mode 100755 index 000000000..c65fb99f8 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-fusiontable.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/drive-image.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-image.svg new file mode 100755 index 000000000..c96c26cf4 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-image.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/drive-ms-excel.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-ms-excel.svg new file mode 100755 index 000000000..282e41dd4 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-ms-excel.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/drive-ms-powerpoint.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-ms-powerpoint.svg new file mode 100755 index 000000000..5ca5da3da --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-ms-powerpoint.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/drive-ms-word.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-ms-word.svg new file mode 100755 index 000000000..e9f27c532 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-ms-word.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/drive-pdf.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-pdf.svg new file mode 100755 index 000000000..441000e6d --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-pdf.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/drive-presentation.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-presentation.svg new file mode 100755 index 000000000..398f2728b --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-presentation.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/drive-script.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-script.svg new file mode 100755 index 000000000..0766f7a4e --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-script.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/drive-site.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-site.svg new file mode 100755 index 000000000..59925966e --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-site.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/drive-spreadsheet.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-spreadsheet.svg new file mode 100755 index 000000000..60f38760e --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-spreadsheet.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/drive-video.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-video.svg new file mode 100755 index 000000000..32c10b3ff --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-video.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/drive-zip.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-zip.svg new file mode 100755 index 000000000..6ec12bd10 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/drive-zip.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/drive.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/drive.svg new file mode 100755 index 000000000..84ae7757a --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/drive.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/earth.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/earth.svg new file mode 100755 index 000000000..6e288b0d8 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/earth.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/email.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/email.svg new file mode 100755 index 000000000..18eb9e88f --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/email.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/error.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/error.svg new file mode 100755 index 000000000..c7f3b696c --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/error.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/event.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/event.svg new file mode 100755 index 000000000..a4447c50d --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/event.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/exit-to-app.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/exit-to-app.svg new file mode 100755 index 000000000..9f6aff35a --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/exit-to-app.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/expand-less.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/expand-less.svg new file mode 100755 index 000000000..c02e45a37 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/expand-less.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/expand-more.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/expand-more.svg new file mode 100755 index 000000000..54bd632b1 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/expand-more.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/explore.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/explore.svg new file mode 100755 index 000000000..0d29e720a --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/explore.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/extension.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/extension.svg new file mode 100755 index 000000000..47bfabe8b --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/extension.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/fast-forward.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/fast-forward.svg new file mode 100755 index 000000000..3978d8794 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/fast-forward.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/fast-rewind.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/fast-rewind.svg new file mode 100755 index 000000000..ecb5b153e --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/fast-rewind.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/favorite-outline.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/favorite-outline.svg new file mode 100755 index 000000000..d20e4769c --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/favorite-outline.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/favorite.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/favorite.svg new file mode 100755 index 000000000..4934a9989 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/favorite.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/file-download.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/file-download.svg new file mode 100755 index 000000000..1e3292359 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/file-download.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/file-upload.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/file-upload.svg new file mode 100755 index 000000000..2d4fef76f --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/file-upload.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/filter.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/filter.svg new file mode 100755 index 000000000..c83fca18a --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/filter.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/flag.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/flag.svg new file mode 100755 index 000000000..4985f1c6f --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/flag.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/flash-auto.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/flash-auto.svg new file mode 100755 index 000000000..aaf24c5f1 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/flash-auto.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/flash-off.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/flash-off.svg new file mode 100755 index 000000000..a517425f9 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/flash-off.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/flash-on.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/flash-on.svg new file mode 100755 index 000000000..934fe1388 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/flash-on.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/flights.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/flights.svg new file mode 100755 index 000000000..e486203e6 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/flights.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/flip-to-back.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/flip-to-back.svg new file mode 100755 index 000000000..1e80dbec6 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/flip-to-back.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/flip-to-front.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/flip-to-front.svg new file mode 100755 index 000000000..fc438d652 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/flip-to-front.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/folder-mydrive.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/folder-mydrive.svg new file mode 100755 index 000000000..a4eb3137b --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/folder-mydrive.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/folder-shared.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/folder-shared.svg new file mode 100755 index 000000000..206fadb61 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/folder-shared.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/folder.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/folder.svg new file mode 100755 index 000000000..0143f95cf --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/folder.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/forum.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/forum.svg new file mode 100755 index 000000000..c8e7dc26c --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/forum.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/forward.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/forward.svg new file mode 100755 index 000000000..162d0adf3 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/forward.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/fullscreen-exit.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/fullscreen-exit.svg new file mode 100755 index 000000000..da36beb63 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/fullscreen-exit.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/fullscreen.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/fullscreen.svg new file mode 100755 index 000000000..d43062c4d --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/fullscreen.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/gamepad.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/gamepad.svg new file mode 100755 index 000000000..98bfc5a2d --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/gamepad.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/games.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/games.svg new file mode 100755 index 000000000..98bfc5a2d --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/games.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/gesture.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/gesture.svg new file mode 100755 index 000000000..2bdb82cf5 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/gesture.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/glass.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/glass.svg new file mode 100755 index 000000000..ea27851e3 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/glass.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/gmail.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/gmail.svg new file mode 100755 index 000000000..89732b7e3 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/gmail.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/google-plus.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/google-plus.svg new file mode 100755 index 000000000..74f6a87d9 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/google-plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/google.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/google.svg new file mode 100755 index 000000000..ecba2ba97 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/google.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/gps-fixed.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/gps-fixed.svg new file mode 100755 index 000000000..e5e8394b9 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/gps-fixed.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/gps-not-fixed.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/gps-not-fixed.svg new file mode 100755 index 000000000..7ca2c0bb7 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/gps-not-fixed.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/gps-off.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/gps-off.svg new file mode 100755 index 000000000..bcf43dd19 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/gps-off.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/group-add.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/group-add.svg new file mode 100755 index 000000000..aff1d971a --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/group-add.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/group.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/group.svg new file mode 100755 index 000000000..641ee99f2 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/group.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/hangout-video-off.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/hangout-video-off.svg new file mode 100755 index 000000000..98125097d --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/hangout-video-off.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/hangout-video.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/hangout-video.svg new file mode 100755 index 000000000..e195c8604 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/hangout-video.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/hangout.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/hangout.svg new file mode 100755 index 000000000..70317f87f --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/hangout.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/headset-mic.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/headset-mic.svg new file mode 100755 index 000000000..436ecf911 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/headset-mic.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/headset.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/headset.svg new file mode 100755 index 000000000..c15c574e8 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/headset.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/help.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/help.svg new file mode 100755 index 000000000..b0bbca9cc --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/help.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/high-quality.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/high-quality.svg new file mode 100755 index 000000000..4507fab0c --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/high-quality.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/history.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/history.svg new file mode 100755 index 000000000..0031077de --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/history.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/home.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/home.svg new file mode 100755 index 000000000..c7cd08b55 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/home.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/hotel.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/hotel.svg new file mode 100755 index 000000000..774ed8bb5 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/hotel.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/https.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/https.svg new file mode 100755 index 000000000..dd371776f --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/https.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/image.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/image.svg new file mode 100755 index 000000000..c96c26cf4 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/image.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/import-export.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/import-export.svg new file mode 100755 index 000000000..d278c1e13 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/import-export.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/inbox.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/inbox.svg new file mode 100755 index 000000000..dcb981219 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/inbox.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/info-outline.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/info-outline.svg new file mode 100755 index 000000000..3729cfa47 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/info-outline.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/info.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/info.svg new file mode 100755 index 000000000..ad9801f44 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/info.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/invert-colors.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/invert-colors.svg new file mode 100755 index 000000000..add811be5 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/invert-colors.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/italics.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/italics.svg new file mode 100755 index 000000000..988f0cd5d --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/italics.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/keep.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/keep.svg new file mode 100755 index 000000000..41a2fcfbc --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/keep.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-alt.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-alt.svg new file mode 100755 index 000000000..cc68fbfaf --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-alt.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-arrow-down.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-arrow-down.svg new file mode 100755 index 000000000..e57d0dd88 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-arrow-down.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-arrow-left.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-arrow-left.svg new file mode 100755 index 000000000..06c92d95a --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-arrow-left.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-arrow-right.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-arrow-right.svg new file mode 100755 index 000000000..9891b561e --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-arrow-right.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-arrow-up.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-arrow-up.svg new file mode 100755 index 000000000..ff866b37d --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-arrow-up.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-backspace.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-backspace.svg new file mode 100755 index 000000000..a405fe9af --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-backspace.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-capslock.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-capslock.svg new file mode 100755 index 000000000..1f545a4ef --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-capslock.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-control.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-control.svg new file mode 100755 index 000000000..0f7aae400 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-control.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-hide.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-hide.svg new file mode 100755 index 000000000..727ebe141 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-hide.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-return.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-return.svg new file mode 100755 index 000000000..e8919b928 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-return.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-tab.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-tab.svg new file mode 100755 index 000000000..5c59e927c --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-tab.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-voice.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-voice.svg new file mode 100755 index 000000000..f5d5ef3fb --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard-voice.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard.svg new file mode 100755 index 000000000..be1445cfb --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/keyboard.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/label-outline.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/label-outline.svg new file mode 100755 index 000000000..74841ee2a --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/label-outline.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/label.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/label.svg new file mode 100755 index 000000000..3e7570aa8 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/label.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/landscape.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/landscape.svg new file mode 100755 index 000000000..a19742687 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/landscape.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/language.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/language.svg new file mode 100755 index 000000000..cf1fb2af1 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/language.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/laptop.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/laptop.svg new file mode 100755 index 000000000..ea4a9f80d --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/laptop.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/launch.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/launch.svg new file mode 100755 index 000000000..cab265e49 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/launch.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/link.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/link.svg new file mode 100755 index 000000000..a2a5dddb0 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/link.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/list.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/list.svg new file mode 100755 index 000000000..5ddd7ffd4 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/list.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/live-help.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/live-help.svg new file mode 100755 index 000000000..2f87d9bc5 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/live-help.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/location-city.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/location-city.svg new file mode 100755 index 000000000..eec6c69b8 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/location-city.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/location-disabled.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/location-disabled.svg new file mode 100755 index 000000000..bcf43dd19 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/location-disabled.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/location-searching.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/location-searching.svg new file mode 100755 index 000000000..c457e9c92 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/location-searching.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/location.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/location.svg new file mode 100755 index 000000000..726207d9c --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/location.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/lock-open.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/lock-open.svg new file mode 100755 index 000000000..88f0b5945 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/lock-open.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/lock-outline.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/lock-outline.svg new file mode 100755 index 000000000..d67215017 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/lock-outline.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/lock.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/lock.svg new file mode 100755 index 000000000..dd371776f --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/lock.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/loop.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/loop.svg new file mode 100755 index 000000000..716b5b912 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/loop.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/mail.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/mail.svg new file mode 100755 index 000000000..18eb9e88f --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/mail.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/map.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/map.svg new file mode 100755 index 000000000..7c74421a9 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/map.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/mark-unread.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/mark-unread.svg new file mode 100755 index 000000000..4d8c39fdf --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/mark-unread.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/memory.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/memory.svg new file mode 100755 index 000000000..52df20a47 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/memory.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/menu.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/menu.svg new file mode 100755 index 000000000..1a496e569 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/menu.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/message.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/message.svg new file mode 100755 index 000000000..87cca23be --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/message.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/messenger.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/messenger.svg new file mode 100755 index 000000000..2d61f0e5c --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/messenger.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/mic-none.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/mic-none.svg new file mode 100755 index 000000000..be92c1554 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/mic-none.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/mic-off.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/mic-off.svg new file mode 100755 index 000000000..68b98db66 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/mic-off.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/mic.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/mic.svg new file mode 100755 index 000000000..f5d5ef3fb --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/mic.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/mms.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/mms.svg new file mode 100755 index 000000000..7853bdb0f --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/mms.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/mood.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/mood.svg new file mode 100755 index 000000000..d88c616b1 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/mood.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/more-horiz.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/more-horiz.svg new file mode 100755 index 000000000..0f7aae400 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/more-horiz.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/more-vert.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/more-vert.svg new file mode 100755 index 000000000..55966212d --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/more-vert.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/more.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/more.svg new file mode 100755 index 000000000..9ac17b9c4 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/more.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/mouse.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/mouse.svg new file mode 100755 index 000000000..6a0c7c9b1 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/mouse.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/movie.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/movie.svg new file mode 100755 index 000000000..32c10b3ff --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/movie.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/nest-protect.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/nest-protect.svg new file mode 100755 index 000000000..aad2d081c --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/nest-protect.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/nest-thermostat.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/nest-thermostat.svg new file mode 100755 index 000000000..a140276a1 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/nest-thermostat.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/network-cell.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/network-cell.svg new file mode 100755 index 000000000..bd9e6a154 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/network-cell.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/network-wifi.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/network-wifi.svg new file mode 100755 index 000000000..6c3293f34 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/network-wifi.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/news.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/news.svg new file mode 100755 index 000000000..6b5a6e3a8 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/news.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/nfc.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/nfc.svg new file mode 100755 index 000000000..8a52ab707 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/nfc.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/notifications-none.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/notifications-none.svg new file mode 100755 index 000000000..adf3e8ee0 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/notifications-none.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/notifications-off.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/notifications-off.svg new file mode 100755 index 000000000..c9ac469f6 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/notifications-off.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/notifications-on.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/notifications-on.svg new file mode 100755 index 000000000..852b6ff3a --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/notifications-on.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/notifications-paused.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/notifications-paused.svg new file mode 100755 index 000000000..1fb0ebe5c --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/notifications-paused.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/notifications.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/notifications.svg new file mode 100755 index 000000000..cdb616ab4 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/notifications.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/pages.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/pages.svg new file mode 100755 index 000000000..7594663a8 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/pages.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/palette.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/palette.svg new file mode 100755 index 000000000..7cbcbcf6e --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/palette.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/panorama.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/panorama.svg new file mode 100755 index 000000000..cd92bc735 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/panorama.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/party-mode.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/party-mode.svg new file mode 100755 index 000000000..74660bc44 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/party-mode.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/pause-circle-fill.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/pause-circle-fill.svg new file mode 100755 index 000000000..2ef2ea9be --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/pause-circle-fill.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/pause-circle-outline.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/pause-circle-outline.svg new file mode 100755 index 000000000..39d0c6be9 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/pause-circle-outline.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/pause.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/pause.svg new file mode 100755 index 000000000..1ab0afcac --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/pause.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/people.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/people.svg new file mode 100755 index 000000000..641ee99f2 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/people.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/person-add.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/person-add.svg new file mode 100755 index 000000000..b4a4c4684 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/person-add.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/person-location.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/person-location.svg new file mode 100755 index 000000000..f6a170ca5 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/person-location.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/person-outline.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/person-outline.svg new file mode 100755 index 000000000..286ac9001 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/person-outline.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/person.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/person.svg new file mode 100755 index 000000000..9e25f1d19 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/person.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/phone-bluetooth-speaker.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/phone-bluetooth-speaker.svg new file mode 100755 index 000000000..a5540ce2a --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/phone-bluetooth-speaker.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/phone-forwarded.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/phone-forwarded.svg new file mode 100755 index 000000000..873acc176 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/phone-forwarded.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/phone-in-talk.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/phone-in-talk.svg new file mode 100755 index 000000000..497cef535 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/phone-in-talk.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/phone-locked.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/phone-locked.svg new file mode 100755 index 000000000..901d663e5 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/phone-locked.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/phone-missed.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/phone-missed.svg new file mode 100755 index 000000000..eaee2018a --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/phone-missed.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/phone-paused.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/phone-paused.svg new file mode 100755 index 000000000..1217fdc91 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/phone-paused.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/phone.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/phone.svg new file mode 100755 index 000000000..0a87d72d9 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/phone.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/phone2.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/phone2.svg new file mode 100755 index 000000000..cc20b677a --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/phone2.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/photo-album.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/photo-album.svg new file mode 100755 index 000000000..cb903abb7 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/photo-album.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/photo-library.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/photo-library.svg new file mode 100755 index 000000000..bd5040dcf --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/photo-library.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/photo.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/photo.svg new file mode 100755 index 000000000..c96c26cf4 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/photo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/place.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/place.svg new file mode 100755 index 000000000..5ea534323 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/place.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/play-arrow.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/play-arrow.svg new file mode 100755 index 000000000..1473247dd --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/play-arrow.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/play-circle-fill.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/play-circle-fill.svg new file mode 100755 index 000000000..112aed74f --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/play-circle-fill.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/play-circle-outline.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/play-circle-outline.svg new file mode 100755 index 000000000..9dd819412 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/play-circle-outline.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/play-download.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/play-download.svg new file mode 100755 index 000000000..6f2c8c81d --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/play-download.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/play-install.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/play-install.svg new file mode 100755 index 000000000..fecf61c31 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/play-install.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/plus-one.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/plus-one.svg new file mode 100755 index 000000000..72fc7adf3 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/plus-one.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/poll.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/poll.svg new file mode 100755 index 000000000..04a056d55 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/poll.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/polymer.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/polymer.svg new file mode 100755 index 000000000..66dfca062 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/polymer.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/portrait.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/portrait.svg new file mode 100755 index 000000000..503068e97 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/portrait.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/post-blogger.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/post-blogger.svg new file mode 100755 index 000000000..dfba0e650 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/post-blogger.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/post-facebook.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/post-facebook.svg new file mode 100755 index 000000000..15bbcf2e0 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/post-facebook.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/post-gplus.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/post-gplus.svg new file mode 100755 index 000000000..404ebc0c6 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/post-gplus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/post-instagram.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/post-instagram.svg new file mode 100755 index 000000000..19f67438f --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/post-instagram.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/post-linkedin.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/post-linkedin.svg new file mode 100755 index 000000000..d279a80af --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/post-linkedin.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/post-pinterest.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/post-pinterest.svg new file mode 100755 index 000000000..16b2eecc1 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/post-pinterest.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/post-tumblr.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/post-tumblr.svg new file mode 100755 index 000000000..fed109ba7 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/post-tumblr.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/post-twitter.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/post-twitter.svg new file mode 100755 index 000000000..c43e2d984 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/post-twitter.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/print.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/print.svg new file mode 100755 index 000000000..c3d7fecaf --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/print.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/public.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/public.svg new file mode 100755 index 000000000..99821bc67 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/public.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/queue.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/queue.svg new file mode 100755 index 000000000..cb86f2171 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/queue.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/radio-button-off.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/radio-button-off.svg new file mode 100755 index 000000000..0b69cf48a --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/radio-button-off.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/radio-button-on.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/radio-button-on.svg new file mode 100755 index 000000000..ca92c6425 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/radio-button-on.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/receipt.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/receipt.svg new file mode 100755 index 000000000..84e737831 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/receipt.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/refresh.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/refresh.svg new file mode 100755 index 000000000..41ea03c27 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/refresh.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/reminder.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/reminder.svg new file mode 100755 index 000000000..895fe1e58 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/reminder.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/remove-circle-outline.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/remove-circle-outline.svg new file mode 100755 index 000000000..d8e8a7c91 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/remove-circle-outline.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/remove-circle.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/remove-circle.svg new file mode 100755 index 000000000..faecb257a --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/remove-circle.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/remove.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/remove.svg new file mode 100755 index 000000000..636b2c4c9 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/remove.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/replay.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/replay.svg new file mode 100755 index 000000000..5c85ce6fb --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/replay.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/reply-all.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/reply-all.svg new file mode 100755 index 000000000..82bf8101e --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/reply-all.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/reply.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/reply.svg new file mode 100755 index 000000000..ca3b05a1f --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/reply.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/report.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/report.svg new file mode 100755 index 000000000..6494cbba1 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/report.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/ring-volume.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/ring-volume.svg new file mode 100755 index 000000000..443def8d4 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/ring-volume.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/rotate-left.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/rotate-left.svg new file mode 100755 index 000000000..dc437d958 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/rotate-left.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/rotate-right.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/rotate-right.svg new file mode 100755 index 000000000..cd0745f12 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/rotate-right.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/satellite.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/satellite.svg new file mode 100755 index 000000000..96351ff1f --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/satellite.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/save.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/save.svg new file mode 100755 index 000000000..2e0cef55e --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/save.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/schedule.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/schedule.svg new file mode 100755 index 000000000..464557e9b --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/schedule.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/school.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/school.svg new file mode 100755 index 000000000..3c4ee8158 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/school.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/screen-lock-landscape.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/screen-lock-landscape.svg new file mode 100755 index 000000000..eadf10d22 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/screen-lock-landscape.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/screen-lock-portrait.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/screen-lock-portrait.svg new file mode 100755 index 000000000..3e785b0e9 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/screen-lock-portrait.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/screen-lock-rotation.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/screen-lock-rotation.svg new file mode 100755 index 000000000..cfa177060 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/screen-lock-rotation.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/screen-rotation.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/screen-rotation.svg new file mode 100755 index 000000000..cf0b669fa --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/screen-rotation.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/sd-card.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/sd-card.svg new file mode 100755 index 000000000..b5947a8df --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/sd-card.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/sd-storage.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/sd-storage.svg new file mode 100755 index 000000000..b5947a8df --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/sd-storage.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/search.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/search.svg new file mode 100755 index 000000000..95d61f5be --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/search.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/select-all.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/select-all.svg new file mode 100755 index 000000000..0916574f5 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/select-all.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/send.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/send.svg new file mode 100755 index 000000000..c73d3da15 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/send.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/settings-application.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/settings-application.svg new file mode 100755 index 000000000..0f7060ebc --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/settings-application.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/settings-bluetooth.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/settings-bluetooth.svg new file mode 100755 index 000000000..233b6127a --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/settings-bluetooth.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/settings-cell.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/settings-cell.svg new file mode 100755 index 000000000..f98ab561e --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/settings-cell.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/settings-phone.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/settings-phone.svg new file mode 100755 index 000000000..a4a42c6cc --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/settings-phone.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/settings-power.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/settings-power.svg new file mode 100755 index 000000000..f8d8ce83b --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/settings-power.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/settings-voice.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/settings-voice.svg new file mode 100755 index 000000000..e1b7f77d3 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/settings-voice.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/settings.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/settings.svg new file mode 100755 index 000000000..f82c90bb8 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/settings.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/share-alt.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/share-alt.svg new file mode 100755 index 000000000..7b6987f11 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/share-alt.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/share.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/share.svg new file mode 100755 index 000000000..d5aafc4fd --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/share.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/shopping-basket.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/shopping-basket.svg new file mode 100755 index 000000000..15693905e --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/shopping-basket.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/shopping-cart.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/shopping-cart.svg new file mode 100755 index 000000000..33a4c318d --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/shopping-cart.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/shuffle.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/shuffle.svg new file mode 100755 index 000000000..ec1c24c4f --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/shuffle.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/signal-cellular-1-bar.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/signal-cellular-1-bar.svg new file mode 100755 index 000000000..a6b21de72 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/signal-cellular-1-bar.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/signal-cellular-2-bar.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/signal-cellular-2-bar.svg new file mode 100755 index 000000000..f3494d9d8 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/signal-cellular-2-bar.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/signal-cellular-3-bar.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/signal-cellular-3-bar.svg new file mode 100755 index 000000000..bd9e6a154 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/signal-cellular-3-bar.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/signal-cellular-4-bar.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/signal-cellular-4-bar.svg new file mode 100755 index 000000000..ff3161c5f --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/signal-cellular-4-bar.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/signal-wifi-1-bar.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/signal-wifi-1-bar.svg new file mode 100755 index 000000000..28974d4f6 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/signal-wifi-1-bar.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/signal-wifi-2-bar.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/signal-wifi-2-bar.svg new file mode 100755 index 000000000..1ea2c8c32 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/signal-wifi-2-bar.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/signal-wifi-3-bar.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/signal-wifi-3-bar.svg new file mode 100755 index 000000000..6c3293f34 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/signal-wifi-3-bar.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/signal-wifi-4-bar.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/signal-wifi-4-bar.svg new file mode 100755 index 000000000..df299d722 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/signal-wifi-4-bar.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/sim-card-alert.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/sim-card-alert.svg new file mode 100755 index 000000000..90bd04adf --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/sim-card-alert.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/skip-next.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/skip-next.svg new file mode 100755 index 000000000..c2aeeb2b8 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/skip-next.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/skip-previous.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/skip-previous.svg new file mode 100755 index 000000000..faf2aaa16 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/skip-previous.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/slideshow.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/slideshow.svg new file mode 100755 index 000000000..7c3986b61 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/slideshow.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/sms-failed.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/sms-failed.svg new file mode 100755 index 000000000..e01f80359 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/sms-failed.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/sms.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/sms.svg new file mode 100755 index 000000000..e1eec006f --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/sms.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/sort.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/sort.svg new file mode 100755 index 000000000..1f393986a --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/sort.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/speaker.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/speaker.svg new file mode 100755 index 000000000..21cfdf935 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/speaker.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/star-half.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/star-half.svg new file mode 100755 index 000000000..02c6e17bd --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/star-half.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/star-outline.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/star-outline.svg new file mode 100755 index 000000000..6ff609706 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/star-outline.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/star-rate.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/star-rate.svg new file mode 100755 index 000000000..77dd425b3 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/star-rate.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/star.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/star.svg new file mode 100755 index 000000000..488bd551d --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/star.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/stop.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/stop.svg new file mode 100755 index 000000000..092cea1c1 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/stop.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/storage.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/storage.svg new file mode 100755 index 000000000..c90ed9bdb --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/storage.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/store.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/store.svg new file mode 100755 index 000000000..f65e9d8ca --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/store.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/swap-driving-apps.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/swap-driving-apps.svg new file mode 100755 index 000000000..05506a66f --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/swap-driving-apps.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/swap-horiz.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/swap-horiz.svg new file mode 100755 index 000000000..ab3d7aaab --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/swap-horiz.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/swap-vert-circle.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/swap-vert-circle.svg new file mode 100755 index 000000000..5d58d2a56 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/swap-vert-circle.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/swap-vert.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/swap-vert.svg new file mode 100755 index 000000000..b5daa8deb --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/swap-vert.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/switch-camera.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/switch-camera.svg new file mode 100755 index 000000000..bdd0a955f --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/switch-camera.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/switch-video.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/switch-video.svg new file mode 100755 index 000000000..169b4445b --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/switch-video.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/sync-disabled.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/sync-disabled.svg new file mode 100755 index 000000000..5b567e73d --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/sync-disabled.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/sync-green.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/sync-green.svg new file mode 100755 index 000000000..f62978db3 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/sync-green.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/sync-problem-red.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/sync-problem-red.svg new file mode 100755 index 000000000..153645990 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/sync-problem-red.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/sync-problem.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/sync-problem.svg new file mode 100755 index 000000000..153645990 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/sync-problem.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/sync.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/sync.svg new file mode 100755 index 000000000..716b5b912 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/sync.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/system-update.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/system-update.svg new file mode 100755 index 000000000..1805539c7 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/system-update.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/tab-unselected.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/tab-unselected.svg new file mode 100755 index 000000000..937db30b2 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/tab-unselected.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/tab.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/tab.svg new file mode 100755 index 000000000..7165ebbf6 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/tab.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/tablet.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/tablet.svg new file mode 100755 index 000000000..fd4c3cc18 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/tablet.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/tag-faces.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/tag-faces.svg new file mode 100755 index 000000000..4c5e8621c --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/tag-faces.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/tap-and-play.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/tap-and-play.svg new file mode 100755 index 000000000..d7a132575 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/tap-and-play.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/terrain.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/terrain.svg new file mode 100755 index 000000000..a19742687 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/terrain.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/text-format.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/text-format.svg new file mode 100755 index 000000000..7051d56d0 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/text-format.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/text-sms.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/text-sms.svg new file mode 100755 index 000000000..e1eec006f --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/text-sms.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/theaters.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/theaters.svg new file mode 100755 index 000000000..0f670bb63 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/theaters.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/thumbs-down.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/thumbs-down.svg new file mode 100755 index 000000000..288559f78 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/thumbs-down.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/thumbs-up.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/thumbs-up.svg new file mode 100755 index 000000000..a133db61a --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/thumbs-up.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/time-to-leave.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/time-to-leave.svg new file mode 100755 index 000000000..fa4826156 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/time-to-leave.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/timelapse.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/timelapse.svg new file mode 100755 index 000000000..8232bae58 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/timelapse.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/timer.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/timer.svg new file mode 100755 index 000000000..d67919385 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/timer.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/today.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/today.svg new file mode 100755 index 000000000..4e4e9bce6 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/today.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/traffic.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/traffic.svg new file mode 100755 index 000000000..a69bc285a --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/traffic.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/translate.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/translate.svg new file mode 100755 index 000000000..b9a47dfaa --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/translate.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/tv.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/tv.svg new file mode 100755 index 000000000..c07853d22 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/tv.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/underline.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/underline.svg new file mode 100755 index 000000000..fefddc0d6 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/underline.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/undo.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/undo.svg new file mode 100755 index 000000000..431b20a32 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/undo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/unfold-less.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/unfold-less.svg new file mode 100755 index 000000000..0271c7da9 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/unfold-less.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/unfold-more.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/unfold-more.svg new file mode 100755 index 000000000..afe1b68b0 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/unfold-more.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/unknown-1.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/unknown-1.svg new file mode 100755 index 000000000..e72dd2d55 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/unknown-1.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/unknown-3.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/unknown-3.svg new file mode 100755 index 000000000..376c6aa32 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/unknown-3.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/unknown-4.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/unknown-4.svg new file mode 100755 index 000000000..3e265a1ea --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/unknown-4.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/unknown-5.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/unknown-5.svg new file mode 100755 index 000000000..576bc90c0 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/unknown-5.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/unknown-6.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/unknown-6.svg new file mode 100755 index 000000000..069d95a80 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/unknown-6.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/unknown-7.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/unknown-7.svg new file mode 100755 index 000000000..be4c863aa --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/unknown-7.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/unkown-2.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/unkown-2.svg new file mode 100755 index 000000000..c0219b1c8 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/unkown-2.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/usb.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/usb.svg new file mode 100755 index 000000000..17f0670eb --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/usb.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/vibration.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/vibration.svg new file mode 100755 index 000000000..d54e9b14b --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/vibration.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/video-youtube.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/video-youtube.svg new file mode 100755 index 000000000..db4cceaf7 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/video-youtube.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/videocam-off.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/videocam-off.svg new file mode 100755 index 000000000..c325277f1 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/videocam-off.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/videocam.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/videocam.svg new file mode 100755 index 000000000..79d5b627f --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/videocam.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/view-array.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/view-array.svg new file mode 100755 index 000000000..6e357ec95 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/view-array.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/view-column.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/view-column.svg new file mode 100755 index 000000000..3357760bc --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/view-column.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/view-headline.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/view-headline.svg new file mode 100755 index 000000000..ead6fc5f3 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/view-headline.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/view-list.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/view-list.svg new file mode 100755 index 000000000..2893589b0 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/view-list.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/view-module.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/view-module.svg new file mode 100755 index 000000000..4c11535f1 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/view-module.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/view-quilt.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/view-quilt.svg new file mode 100755 index 000000000..d6fcfa56e --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/view-quilt.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/view-stream.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/view-stream.svg new file mode 100755 index 000000000..fb7392abe --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/view-stream.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/visibility-off.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/visibility-off.svg new file mode 100755 index 000000000..e47d0cec7 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/visibility-off.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/visibility.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/visibility.svg new file mode 100755 index 000000000..66e3d0e78 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/visibility.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/voice.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/voice.svg new file mode 100755 index 000000000..c894e5261 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/voice.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/voicemail.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/voicemail.svg new file mode 100755 index 000000000..c067f128a --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/voicemail.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/volume-down.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/volume-down.svg new file mode 100755 index 000000000..c9a0d1de2 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/volume-down.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/volume-mute.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/volume-mute.svg new file mode 100755 index 000000000..354a45bbc --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/volume-mute.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/volume-off.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/volume-off.svg new file mode 100755 index 000000000..c053660cf --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/volume-off.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/volume-up.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/volume-up.svg new file mode 100755 index 000000000..b0daa28ed --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/volume-up.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/vpn.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/vpn.svg new file mode 100755 index 000000000..e9658adde --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/vpn.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/warning.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/warning.svg new file mode 100755 index 000000000..8f93f7432 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/warning.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/watch.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/watch.svg new file mode 100755 index 000000000..2a317445b --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/watch.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/wb-auto.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/wb-auto.svg new file mode 100755 index 000000000..84811fb4e --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/wb-auto.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/wb-cloudy.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/wb-cloudy.svg new file mode 100755 index 000000000..b3a93c51c --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/wb-cloudy.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/wb-incandescent.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/wb-incandescent.svg new file mode 100755 index 000000000..c01007341 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/wb-incandescent.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/wb-irradescent.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/wb-irradescent.svg new file mode 100755 index 000000000..65c8d0439 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/wb-irradescent.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/wb-sunny.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/wb-sunny.svg new file mode 100755 index 000000000..f6f412392 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/wb-sunny.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/web.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/web.svg new file mode 100755 index 000000000..b208ff72a --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/web.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/whatshot.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/whatshot.svg new file mode 100755 index 000000000..f01d21436 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/whatshot.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/wifi-tethering.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/wifi-tethering.svg new file mode 100755 index 000000000..d9b1c012f --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/wifi-tethering.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/source/work.svg b/android-json-form-wizard/src/main/assets/fonts/material/source/work.svg new file mode 100755 index 000000000..ee585ef12 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/source/work.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/android-json-form-wizard/src/main/assets/fonts/material/strings.xml b/android-json-form-wizard/src/main/assets/fonts/material/strings.xml new file mode 100644 index 000000000..7dd71e769 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/strings.xml @@ -0,0 +1,438 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android-json-form-wizard/src/main/assets/fonts/material/styles.css b/android-json-form-wizard/src/main/assets/fonts/material/styles.css new file mode 100644 index 000000000..26f0645a5 --- /dev/null +++ b/android-json-form-wizard/src/main/assets/fonts/material/styles.css @@ -0,0 +1,1339 @@ +@charset "UTF-8"; + +@font-face { + font-family: "material-icon-font"; + src:url("fonts/material-icon-font.eot"); + src:url("fonts/material-icon-font.eot?#iefix") format("embedded-opentype"), + url("fonts/material-icon-font.woff") format("woff"), + url("fonts/material-icon-font.ttf") format("truetype"), + url("fonts/material-icon-font.svg#material-icon-font") format("svg"); + font-weight: normal; + font-style: normal; + +} + +[data-icon]:before { + font-family: "material-icon-font" !important; + content: attr(data-icon); + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + speak: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +[class^="ic-"]:before, +[class*=" ic-"]:before { + font-family: "material-icon-font" !important; + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + speak: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.ic-access-alarms:before { + content: "\e000"; +} +.ic-access-time:before { + content: "\e001"; +} +.ic-accessibility:before { + content: "\e002"; +} +.ic-account-box:before { + content: "\e003"; +} +.ic-account-circle:before { + content: "\e004"; +} +.ic-adb:before { + content: "\e005"; +} +.ic-add:before { + content: "\e006"; +} +.ic-add-alarm:before { + content: "\e007"; +} +.ic-add-box:before { + content: "\e008"; +} +.ic-add-circle:before { + content: "\e009"; +} +.ic-add-circle-outline:before { + content: "\e00a"; +} +.ic-airplane-mode-off:before { + content: "\e00b"; +} +.ic-airplane-mode-on:before { + content: "\e00c"; +} +.ic-android:before { + content: "\e00d"; +} +.ic-apps:before { + content: "\e00e"; +} +.ic-archive:before { + content: "\e00f"; +} +.ic-arrow-back:before { + content: "\e010"; +} +.ic-arrow-drop-down:before { + content: "\e011"; +} +.ic-arrow-drop-down-circle:before { + content: "\e012"; +} +.ic-arrow-drop-up:before { + content: "\e013"; +} +.ic-arrow-forward:before { + content: "\e014"; +} +.ic-attachment:before { + content: "\e015"; +} +.ic-auto-fix:before { + content: "\e016"; +} +.ic-backspace:before { + content: "\e017"; +} +.ic-backup:before { + content: "\e018"; +} +.ic-beenhere:before { + content: "\e019"; +} +.ic-block:before { + content: "\e01a"; +} +.ic-bluetooth:before { + content: "\e01b"; +} +.ic-bluetooth-audio:before { + content: "\e01c"; +} +.ic-bluetooth-connected:before { + content: "\e01d"; +} +.ic-bluetooth-disabled:before { + content: "\e01e"; +} +.ic-bluetooth-searching:before { + content: "\e01f"; +} +.ic-bold:before { + content: "\e020"; +} +.ic-book:before { + content: "\e021"; +} +.ic-bookmark:before { + content: "\e022"; +} +.ic-bookmark-outline:before { + content: "\e023"; +} +.ic-brightness-auto:before { + content: "\e024"; +} +.ic-brightness-high:before { + content: "\e025"; +} +.ic-brightness-low:before { + content: "\e026"; +} +.ic-brightness-medium:before { + content: "\e027"; +} +.ic-bug-report:before { + content: "\e028"; +} +.ic-cake:before { + content: "\e029"; +} +.ic-call:before { + content: "\e02a"; +} +.ic-call-end:before { + content: "\e02b"; +} +.ic-call-made:before { + content: "\e02c"; +} +.ic-call-merge:before { + content: "\e02d"; +} +.ic-call-missed:before { + content: "\e02e"; +} +.ic-call-received:before { + content: "\e02f"; +} +.ic-call-split:before { + content: "\e030"; +} +.ic-camera:before { + content: "\e031"; +} +.ic-camera-alt:before { + content: "\e032"; +} +.ic-camera-roll:before { + content: "\e033"; +} +.ic-cancel:before { + content: "\e034"; +} +.ic-cast:before { + content: "\e035"; +} +.ic-cast-connected:before { + content: "\e036"; +} +.ic-chat:before { + content: "\e037"; +} +.ic-check:before { + content: "\e038"; +} +.ic-check-box:before { + content: "\e039"; +} +.ic-check-box-blank:before { + content: "\e03a"; +} +.ic-check-box-outline:before { + content: "\e03b"; +} +.ic-check-box-outline-blank:before { + content: "\e03c"; +} +.ic-check-circle:before { + content: "\e03d"; +} +.ic-check-circle-blank:before { + content: "\e03e"; +} +.ic-check-circle-outline:before { + content: "\e03f"; +} +.ic-check-circle-outline-blank:before { + content: "\e040"; +} +.ic-chevron-left:before { + content: "\e041"; +} +.ic-chevron-right:before { + content: "\e042"; +} +.ic-chromecast:before { + content: "\e043"; +} +.ic-circles:before { + content: "\e044"; +} +.ic-circles-add:before { + content: "\e045"; +} +.ic-circles-extended:before { + content: "\e046"; +} +.ic-clear:before { + content: "\e047"; +} +.ic-close:before { + content: "\e048"; +} +.ic-close-caption:before { + content: "\e049"; +} +.ic-cloud:before { + content: "\e04a"; +} +.ic-cloud-circle:before { + content: "\e04b"; +} +.ic-cloud-done:before { + content: "\e04c"; +} +.ic-cloud-download:before { + content: "\e04d"; +} +.ic-cloud-off:before { + content: "\e04e"; +} +.ic-cloud-queue:before { + content: "\e04f"; +} +.ic-cloud-upload:before { + content: "\e050"; +} +.ic-comment:before { + content: "\e051"; +} +.ic-communities:before { + content: "\e052"; +} +.ic-content-copy:before { + content: "\e053"; +} +.ic-content-cut:before { + content: "\e054"; +} +.ic-content-paste:before { + content: "\e055"; +} +.ic-create:before { + content: "\e056"; +} +.ic-credit-card:before { + content: "\e057"; +} +.ic-crop:before { + content: "\e058"; +} +.ic-crop-free:before { + content: "\e059"; +} +.ic-crop-landscape:before { + content: "\e05a"; +} +.ic-crop-portrait:before { + content: "\e05b"; +} +.ic-crop-square:before { + content: "\e05c"; +} +.ic-data-usage:before { + content: "\e05d"; +} +.ic-delete:before { + content: "\e05e"; +} +.ic-developer-mode:before { + content: "\e05f"; +} +.ic-dialpad:before { + content: "\e060"; +} +.ic-directions:before { + content: "\e061"; +} +.ic-directions-bike:before { + content: "\e062"; +} +.ic-directions-bus:before { + content: "\e063"; +} +.ic-directions-car:before { + content: "\e064"; +} +.ic-directions-subway:before { + content: "\e065"; +} +.ic-directions-train:before { + content: "\e066"; +} +.ic-directions-transit:before { + content: "\e067"; +} +.ic-directionswalk:before { + content: "\e068"; +} +.ic-disc-full:before { + content: "\e069"; +} +.ic-do-not-disturb:before { + content: "\e06a"; +} +.ic-dock:before { + content: "\e06b"; +} +.ic-domain:before { + content: "\e06c"; +} +.ic-done:before { + content: "\e06d"; +} +.ic-done-all:before { + content: "\e06e"; +} +.ic-drafts:before { + content: "\e06f"; +} +.ic-drive:before { + content: "\e070"; +} +.ic-drive-apk:before { + content: "\e071"; +} +.ic-drive-audio:before { + content: "\e072"; +} +.ic-drive-code:before { + content: "\e073"; +} +.ic-drive-document:before { + content: "\e074"; +} +.ic-drive-drawing:before { + content: "\e075"; +} +.ic-drive-eta:before { + content: "\e076"; +} +.ic-drive-file:before { + content: "\e077"; +} +.ic-drive-font:before { + content: "\e078"; +} +.ic-drive-form:before { + content: "\e079"; +} +.ic-drive-fusiontable:before { + content: "\e07a"; +} +.ic-drive-image:before { + content: "\e07b"; +} +.ic-drive-ms-excel:before { + content: "\e07c"; +} +.ic-drive-ms-powerpoint:before { + content: "\e07d"; +} +.ic-drive-ms-word:before { + content: "\e07e"; +} +.ic-drive-pdf:before { + content: "\e07f"; +} +.ic-drive-presentation:before { + content: "\e080"; +} +.ic-drive-script:before { + content: "\e081"; +} +.ic-drive-site:before { + content: "\e082"; +} +.ic-drive-spreadsheet:before { + content: "\e083"; +} +.ic-drive-video:before { + content: "\e084"; +} +.ic-drive-zip:before { + content: "\e085"; +} +.ic-earth:before { + content: "\e086"; +} +.ic-email:before { + content: "\e087"; +} +.ic-error:before { + content: "\e088"; +} +.ic-event:before { + content: "\e089"; +} +.ic-exit-to-app:before { + content: "\e08a"; +} +.ic-expand-less:before { + content: "\e08b"; +} +.ic-expand-more:before { + content: "\e08c"; +} +.ic-explore:before { + content: "\e08d"; +} +.ic-extension:before { + content: "\e08e"; +} +.ic-fast-forward:before { + content: "\e08f"; +} +.ic-fast-rewind:before { + content: "\e090"; +} +.ic-favorite:before { + content: "\e091"; +} +.ic-favorite-outline:before { + content: "\e092"; +} +.ic-file-download:before { + content: "\e093"; +} +.ic-file-upload:before { + content: "\e094"; +} +.ic-filter:before { + content: "\e095"; +} +.ic-flag:before { + content: "\e096"; +} +.ic-flash-auto:before { + content: "\e097"; +} +.ic-flash-off:before { + content: "\e098"; +} +.ic-flash-on:before { + content: "\e099"; +} +.ic-flights:before { + content: "\e09a"; +} +.ic-flip-to-back:before { + content: "\e09b"; +} +.ic-flip-to-front:before { + content: "\e09c"; +} +.ic-folder:before { + content: "\e09d"; +} +.ic-folder-mydrive:before { + content: "\e09e"; +} +.ic-folder-shared:before { + content: "\e09f"; +} +.ic-forum:before { + content: "\e0a0"; +} +.ic-forward:before { + content: "\e0a1"; +} +.ic-fullscreen:before { + content: "\e0a2"; +} +.ic-fullscreen-exit:before { + content: "\e0a3"; +} +.ic-gamepad:before { + content: "\e0a4"; +} +.ic-games:before { + content: "\e0a5"; +} +.ic-gesture:before { + content: "\e0a6"; +} +.ic-glass:before { + content: "\e0a7"; +} +.ic-gmail:before { + content: "\e0a8"; +} +.ic-google:before { + content: "\e0a9"; +} +.ic-google-plus:before { + content: "\e0aa"; +} +.ic-gps-fixed:before { + content: "\e0ab"; +} +.ic-gps-not-fixed:before { + content: "\e0ac"; +} +.ic-gps-off:before { + content: "\e0ad"; +} +.ic-group:before { + content: "\e0ae"; +} +.ic-group-add:before { + content: "\e0af"; +} +.ic-hangout:before { + content: "\e0b0"; +} +.ic-hangout-video:before { + content: "\e0b1"; +} +.ic-hangout-video-off:before { + content: "\e0b2"; +} +.ic-headset:before { + content: "\e0b3"; +} +.ic-headset-mic:before { + content: "\e0b4"; +} +.ic-help:before { + content: "\e0b5"; +} +.ic-high-quality:before { + content: "\e0b6"; +} +.ic-history:before { + content: "\e0b7"; +} +.ic-home:before { + content: "\e0b8"; +} +.ic-hotel:before { + content: "\e0b9"; +} +.ic-https:before { + content: "\e0ba"; +} +.ic-image:before { + content: "\e0bb"; +} +.ic-import-export:before { + content: "\e0bc"; +} +.ic-inbox:before { + content: "\e0bd"; +} +.ic-info:before { + content: "\e0be"; +} +.ic-info-outline:before { + content: "\e0bf"; +} +.ic-invert-colors:before { + content: "\e0c0"; +} +.ic-italics:before { + content: "\e0c1"; +} +.ic-keep:before { + content: "\e0c2"; +} +.ic-keyboard:before { + content: "\e0c3"; +} +.ic-keyboard-alt:before { + content: "\e0c4"; +} +.ic-keyboard-arrow-down:before { + content: "\e0c5"; +} +.ic-keyboard-arrow-left:before { + content: "\e0c6"; +} +.ic-keyboard-arrow-right:before { + content: "\e0c7"; +} +.ic-keyboard-arrow-up:before { + content: "\e0c8"; +} +.ic-keyboard-backspace:before { + content: "\e0c9"; +} +.ic-keyboard-capslock:before { + content: "\e0ca"; +} +.ic-keyboard-control:before { + content: "\e0cb"; +} +.ic-keyboard-hide:before { + content: "\e0cc"; +} +.ic-keyboard-return:before { + content: "\e0cd"; +} +.ic-keyboard-tab:before { + content: "\e0ce"; +} +.ic-keyboard-voice:before { + content: "\e0cf"; +} +.ic-label:before { + content: "\e0d0"; +} +.ic-label-outline:before { + content: "\e0d1"; +} +.ic-landscape:before { + content: "\e0d2"; +} +.ic-language:before { + content: "\e0d3"; +} +.ic-laptop:before { + content: "\e0d4"; +} +.ic-launch:before { + content: "\e0d5"; +} +.ic-link:before { + content: "\e0d6"; +} +.ic-list:before { + content: "\e0d7"; +} +.ic-live-help:before { + content: "\e0d8"; +} +.ic-location:before { + content: "\e0d9"; +} +.ic-location-city:before { + content: "\e0da"; +} +.ic-location-disabled:before { + content: "\e0db"; +} +.ic-location-searching:before { + content: "\e0dc"; +} +.ic-lock:before { + content: "\e0dd"; +} +.ic-lock-open:before { + content: "\e0de"; +} +.ic-lock-outline:before { + content: "\e0df"; +} +.ic-loop:before { + content: "\e0e0"; +} +.ic-mail:before { + content: "\e0e1"; +} +.ic-map:before { + content: "\e0e2"; +} +.ic-mark-unread:before { + content: "\e0e3"; +} +.ic-memory:before { + content: "\e0e4"; +} +.ic-menu:before { + content: "\e0e5"; +} +.ic-message:before { + content: "\e0e6"; +} +.ic-messenger:before { + content: "\e0e7"; +} +.ic-mic:before { + content: "\e0e8"; +} +.ic-mic-none:before { + content: "\e0e9"; +} +.ic-mic-off:before { + content: "\e0ea"; +} +.ic-mms:before { + content: "\e0eb"; +} +.ic-mood:before { + content: "\e0ec"; +} +.ic-more:before { + content: "\e0ed"; +} +.ic-more-horiz:before { + content: "\e0ee"; +} +.ic-more-vert:before { + content: "\e0ef"; +} +.ic-mouse:before { + content: "\e0f0"; +} +.ic-movie:before { + content: "\e0f1"; +} +.ic-nest-protect:before { + content: "\e0f2"; +} +.ic-nest-thermostat:before { + content: "\e0f3"; +} +.ic-network-cell:before { + content: "\e0f4"; +} +.ic-network-wifi:before { + content: "\e0f5"; +} +.ic-news:before { + content: "\e0f6"; +} +.ic-nfc:before { + content: "\e0f7"; +} +.ic-notifications:before { + content: "\e0f8"; +} +.ic-notifications-none:before { + content: "\e0f9"; +} +.ic-notifications-off:before { + content: "\e0fa"; +} +.ic-notifications-on:before { + content: "\e0fb"; +} +.ic-notifications-paused:before { + content: "\e0fc"; +} +.ic-pages:before { + content: "\e0fd"; +} +.ic-palette:before { + content: "\e0fe"; +} +.ic-panorama:before { + content: "\e0ff"; +} +.ic-party-mode:before { + content: "\e100"; +} +.ic-pause:before { + content: "\e101"; +} +.ic-pause-circle-fill:before { + content: "\e102"; +} +.ic-pause-circle-outline:before { + content: "\e103"; +} +.ic-people:before { + content: "\e104"; +} +.ic-person:before { + content: "\e105"; +} +.ic-person-add:before { + content: "\e106"; +} +.ic-person-location:before { + content: "\e107"; +} +.ic-person-outline:before { + content: "\e108"; +} +.ic-phone:before { + content: "\e109"; +} +.ic-phone2:before { + content: "\e10a"; +} +.ic-phone-bluetooth-speaker:before { + content: "\e10b"; +} +.ic-phone-forwarded:before { + content: "\e10c"; +} +.ic-phone-in-talk:before { + content: "\e10d"; +} +.ic-phone-locked:before { + content: "\e10e"; +} +.ic-phone-missed:before { + content: "\e10f"; +} +.ic-phone-paused:before { + content: "\e110"; +} +.ic-photo:before { + content: "\e111"; +} +.ic-photo-album:before { + content: "\e112"; +} +.ic-photo-library:before { + content: "\e113"; +} +.ic-place:before { + content: "\e114"; +} +.ic-play-arrow:before { + content: "\e115"; +} +.ic-play-circle-fill:before { + content: "\e116"; +} +.ic-play-circle-outline:before { + content: "\e117"; +} +.ic-play-download:before { + content: "\e118"; +} +.ic-play-install:before { + content: "\e119"; +} +.ic-plus-one:before { + content: "\e11a"; +} +.ic-poll:before { + content: "\e11b"; +} +.ic-polymer:before { + content: "\e11c"; +} +.ic-portrait:before { + content: "\e11d"; +} +.ic-post-blogger:before { + content: "\e11e"; +} +.ic-post-facebook:before { + content: "\e11f"; +} +.ic-post-gplus:before { + content: "\e120"; +} +.ic-post-instagram:before { + content: "\e121"; +} +.ic-post-linkedin:before { + content: "\e122"; +} +.ic-post-pinterest:before { + content: "\e123"; +} +.ic-post-tumblr:before { + content: "\e124"; +} +.ic-post-twitter:before { + content: "\e125"; +} +.ic-print:before { + content: "\e126"; +} +.ic-public:before { + content: "\e127"; +} +.ic-queue:before { + content: "\e128"; +} +.ic-radio-button-off:before { + content: "\e129"; +} +.ic-radio-button-on:before { + content: "\e12a"; +} +.ic-receipt:before { + content: "\e12b"; +} +.ic-refresh:before { + content: "\e12c"; +} +.ic-reminder:before { + content: "\e12d"; +} +.ic-remove:before { + content: "\e12e"; +} +.ic-remove-circle:before { + content: "\e12f"; +} +.ic-remove-circle-outline:before { + content: "\e130"; +} +.ic-replay:before { + content: "\e131"; +} +.ic-reply:before { + content: "\e132"; +} +.ic-reply-all:before { + content: "\e133"; +} +.ic-report:before { + content: "\e134"; +} +.ic-ring-volume:before { + content: "\e135"; +} +.ic-rotate-left:before { + content: "\e136"; +} +.ic-rotate-right:before { + content: "\e137"; +} +.ic-satellite:before { + content: "\e138"; +} +.ic-save:before { + content: "\e139"; +} +.ic-schedule:before { + content: "\e13a"; +} +.ic-school:before { + content: "\e13b"; +} +.ic-screen-lock-landscape:before { + content: "\e13c"; +} +.ic-screen-lock-portrait:before { + content: "\e13d"; +} +.ic-screen-lock-rotation:before { + content: "\e13e"; +} +.ic-screen-rotation:before { + content: "\e13f"; +} +.ic-sd-card:before { + content: "\e140"; +} +.ic-sd-storage:before { + content: "\e141"; +} +.ic-search:before { + content: "\e142"; +} +.ic-select-all:before { + content: "\e143"; +} +.ic-send:before { + content: "\e144"; +} +.ic-settings:before { + content: "\e145"; +} +.ic-settings-application:before { + content: "\e146"; +} +.ic-settings-bluetooth:before { + content: "\e147"; +} +.ic-settings-cell:before { + content: "\e148"; +} +.ic-settings-phone:before { + content: "\e149"; +} +.ic-settings-power:before { + content: "\e14a"; +} +.ic-settings-voice:before { + content: "\e14b"; +} +.ic-share:before { + content: "\e14c"; +} +.ic-share-alt:before { + content: "\e14d"; +} +.ic-shopping-basket:before { + content: "\e14e"; +} +.ic-shopping-cart:before { + content: "\e14f"; +} +.ic-shuffle:before { + content: "\e150"; +} +.ic-signal-cellular-1-bar:before { + content: "\e151"; +} +.ic-signal-cellular-2-bar:before { + content: "\e152"; +} +.ic-signal-cellular-3-bar:before { + content: "\e153"; +} +.ic-signal-cellular-4-bar:before { + content: "\e154"; +} +.ic-signal-wifi-1-bar:before { + content: "\e155"; +} +.ic-signal-wifi-2-bar:before { + content: "\e156"; +} +.ic-signal-wifi-3-bar:before { + content: "\e157"; +} +.ic-signal-wifi-4-bar:before { + content: "\e158"; +} +.ic-sim-card-alert:before { + content: "\e159"; +} +.ic-skip-next:before { + content: "\e15a"; +} +.ic-skip-previous:before { + content: "\e15b"; +} +.ic-slideshow:before { + content: "\e15c"; +} +.ic-sms:before { + content: "\e15d"; +} +.ic-sms-failed:before { + content: "\e15e"; +} +.ic-sort:before { + content: "\e15f"; +} +.ic-speaker:before { + content: "\e160"; +} +.ic-star:before { + content: "\e161"; +} +.ic-star-half:before { + content: "\e162"; +} +.ic-star-outline:before { + content: "\e163"; +} +.ic-star-rate:before { + content: "\e164"; +} +.ic-stop:before { + content: "\e165"; +} +.ic-storage:before { + content: "\e166"; +} +.ic-store:before { + content: "\e167"; +} +.ic-swap-driving-apps:before { + content: "\e168"; +} +.ic-swap-horiz:before { + content: "\e169"; +} +.ic-swap-vert:before { + content: "\e16a"; +} +.ic-swap-vert-circle:before { + content: "\e16b"; +} +.ic-switch-camera:before { + content: "\e16c"; +} +.ic-switch-video:before { + content: "\e16d"; +} +.ic-sync:before { + content: "\e16e"; +} +.ic-sync-disabled:before { + content: "\e16f"; +} +.ic-sync-green:before { + content: "\e170"; +} +.ic-sync-problem:before { + content: "\e171"; +} +.ic-sync-problem-red:before { + content: "\e172"; +} +.ic-system-update:before { + content: "\e173"; +} +.ic-tab:before { + content: "\e174"; +} +.ic-tab-unselected:before { + content: "\e175"; +} +.ic-tablet:before { + content: "\e176"; +} +.ic-tag-faces:before { + content: "\e177"; +} +.ic-tap-and-play:before { + content: "\e178"; +} +.ic-terrain:before { + content: "\e179"; +} +.ic-text-format:before { + content: "\e17a"; +} +.ic-text-sms:before { + content: "\e17b"; +} +.ic-theaters:before { + content: "\e17c"; +} +.ic-thumbs-down:before { + content: "\e17d"; +} +.ic-thumbs-up:before { + content: "\e17e"; +} +.ic-time-to-leave:before { + content: "\e17f"; +} +.ic-timelapse:before { + content: "\e180"; +} +.ic-timer:before { + content: "\e181"; +} +.ic-today:before { + content: "\e182"; +} +.ic-traffic:before { + content: "\e183"; +} +.ic-translate:before { + content: "\e184"; +} +.ic-tv:before { + content: "\e185"; +} +.ic-underline:before { + content: "\e186"; +} +.ic-undo:before { + content: "\e187"; +} +.ic-unfold-less:before { + content: "\e188"; +} +.ic-unfold-more:before { + content: "\e189"; +} +.ic-unknown-1:before { + content: "\e18a"; +} +.ic-unknown-3:before { + content: "\e18b"; +} +.ic-unknown-4:before { + content: "\e18c"; +} +.ic-unknown-5:before { + content: "\e18d"; +} +.ic-unknown-6:before { + content: "\e18e"; +} +.ic-unknown-7:before { + content: "\e18f"; +} +.ic-unkown-2:before { + content: "\e190"; +} +.ic-usb:before { + content: "\e191"; +} +.ic-vibration:before { + content: "\e192"; +} +.ic-video-youtube:before { + content: "\e193"; +} +.ic-videocam:before { + content: "\e194"; +} +.ic-videocam-off:before { + content: "\e195"; +} +.ic-view-array:before { + content: "\e196"; +} +.ic-view-column:before { + content: "\e197"; +} +.ic-view-headline:before { + content: "\e198"; +} +.ic-view-list:before { + content: "\e199"; +} +.ic-view-module:before { + content: "\e19a"; +} +.ic-view-quilt:before { + content: "\e19b"; +} +.ic-view-stream:before { + content: "\e19c"; +} +.ic-visibility:before { + content: "\e19d"; +} +.ic-visibility-off:before { + content: "\e19e"; +} +.ic-voice:before { + content: "\e19f"; +} +.ic-voicemail:before { + content: "\e1a0"; +} +.ic-volume-down:before { + content: "\e1a1"; +} +.ic-volume-mute:before { + content: "\e1a2"; +} +.ic-volume-off:before { + content: "\e1a3"; +} +.ic-volume-up:before { + content: "\e1a4"; +} +.ic-vpn:before { + content: "\e1a5"; +} +.ic-warning:before { + content: "\e1a6"; +} +.ic-watch:before { + content: "\e1a7"; +} +.ic-wb-auto:before { + content: "\e1a8"; +} +.ic-wb-cloudy:before { + content: "\e1a9"; +} +.ic-wb-incandescent:before { + content: "\e1aa"; +} +.ic-wb-irradescent:before { + content: "\e1ab"; +} +.ic-wb-sunny:before { + content: "\e1ac"; +} +.ic-web:before { + content: "\e1ad"; +} +.ic-whatshot:before { + content: "\e1ae"; +} +.ic-wifi-tethering:before { + content: "\e1af"; +} +.ic-work:before { + content: "\e1b0"; +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/activities/JsonFormActivity.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/activities/JsonFormActivity.java new file mode 100644 index 000000000..ef34faa63 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/activities/JsonFormActivity.java @@ -0,0 +1,653 @@ +package com.vijay.jsonwizard.activities; + +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.app.AlertDialog; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; +import android.widget.Toast; + +import com.rengwuxian.materialedittext.MaterialEditText; +import com.vijay.jsonwizard.R; +import com.vijay.jsonwizard.comparisons.Comparison; +import com.vijay.jsonwizard.comparisons.EqualToComparison; +import com.vijay.jsonwizard.comparisons.GreaterThanComparison; +import com.vijay.jsonwizard.comparisons.GreaterThanEqualToComparison; +import com.vijay.jsonwizard.comparisons.LessThanComparison; +import com.vijay.jsonwizard.comparisons.LessThanEqualToComparison; +import com.vijay.jsonwizard.comparisons.NotEqualToComparison; +import com.vijay.jsonwizard.comparisons.RegexComparison; +import com.vijay.jsonwizard.constants.JsonFormConstants; +import com.vijay.jsonwizard.customviews.CheckBox; +import com.vijay.jsonwizard.fragments.JsonFormFragment; +import com.vijay.jsonwizard.interfaces.JsonApi; +import com.vijay.jsonwizard.interfaces.OnActivityResultListener; +import com.vijay.jsonwizard.utils.FormUtils; +import com.vijay.jsonwizard.utils.PropertyManager; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static android.view.inputmethod.InputMethodManager.HIDE_NOT_ALWAYS; + +public class JsonFormActivity extends AppCompatActivity implements JsonApi { + + private static final String TAG = "JsonFormActivity"; + + private Toolbar mToolbar; + + private JSONObject mJSONObject; + private PropertyManager propertyManager; + private HashMap skipLogicViews; + private HashMap constrainedViews; + private ArrayList formDataViews; + private String functionRegex; + private HashMap comparisons; + private HashMap onActivityResultListeners; + + public void init(String json) { + try { + mJSONObject = new JSONObject(json); + if (!mJSONObject.has("encounter_type")) { + mJSONObject = new JSONObject(); + throw new JSONException("Form encounter_type not set"); + } + } catch (JSONException e) { + Log.d(TAG, "Initialization error. Json passed is invalid : " + e.getMessage()); + } + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_json_form); + mToolbar = (Toolbar) findViewById(R.id.tb_top); + setSupportActionBar(mToolbar); + skipLogicViews = new HashMap<>(); + onActivityResultListeners = new HashMap<>(); + if (savedInstanceState == null) { + init(getIntent().getStringExtra("json")); + initializeFormFragment(); + onFormStart(); + } else { + init(savedInstanceState.getString("jsonState")); + } + } + + public void initializeFormFragment() { + getSupportFragmentManager().beginTransaction() + .add(R.id.container, JsonFormFragment.getFormFragment(JsonFormConstants.FIRST_STEP_NAME)).commit(); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (onActivityResultListeners.containsKey(requestCode)) { + onActivityResultListeners.get(requestCode).onActivityResult(requestCode, resultCode, data); + } else { + super.onActivityResult(requestCode, resultCode, data); + } + } + + public Toolbar getToolbar() { + return mToolbar; + } + + @Override + public synchronized JSONObject getStep(String name) { + synchronized (mJSONObject) { + try { + return mJSONObject.getJSONObject(name); + } catch (JSONException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public void writeValue(String stepName, String key, String value, String openMrsEntityParent, + String openMrsEntity, String openMrsEntityId) throws JSONException { + synchronized (mJSONObject) { + JSONObject jsonObject = mJSONObject.getJSONObject(stepName); + JSONArray fields = fetchFields(jsonObject); + for (int i = 0; i < fields.length(); i++) { + JSONObject item = fields.getJSONObject(i); + String keyAtIndex = item.getString("key"); + if (key.equals(keyAtIndex)) { + if(item.has("text")){ + item.put("text", value); + }else{ + item.put("value", value); + + } + + item.put("openmrs_entity_parent", openMrsEntityParent); + item.put("openmrs_entity", openMrsEntity); + item.put("openmrs_entity_id", openMrsEntityId); + refreshSkipLogic(key, null); + refreshConstraints(key, null); + return; + } + } + } + } + + @Override + public void writeValue(String stepName, String parentKey, String childObjectKey, String childKey, + String value, String openMrsEntityParent, String openMrsEntity, + String openMrsEntityId) + throws JSONException { + synchronized (mJSONObject) { + JSONObject jsonObject = mJSONObject.getJSONObject(stepName); + JSONArray fields = fetchFields(jsonObject); + for (int i = 0; i < fields.length(); i++) { + JSONObject item = fields.getJSONObject(i); + String keyAtIndex = item.getString("key"); + if (parentKey.equals(keyAtIndex)) { + JSONArray jsonArray = item.getJSONArray(childObjectKey); + for (int j = 0; j < jsonArray.length(); j++) { + JSONObject innerItem = jsonArray.getJSONObject(j); + String anotherKeyAtIndex = innerItem.getString("key"); + if (childKey.equals(anotherKeyAtIndex)) { + innerItem.put("value", value); + refreshSkipLogic(parentKey, childKey); + refreshConstraints(parentKey, childKey); + return; + } + } + } + } + } + } + + @Override + public void writeMetaDataValue(String metaDataKey, Map values) throws JSONException { + synchronized (mJSONObject) { + if (mJSONObject.has(FormUtils.METADATA_PROPERTY) && !values.isEmpty()) { + if (mJSONObject.getJSONObject(FormUtils.METADATA_PROPERTY).has(metaDataKey)) { + JSONObject metaData = mJSONObject.getJSONObject(FormUtils.METADATA_PROPERTY).getJSONObject(metaDataKey); + for (Map.Entry entry : values.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + if (value == null) value = ""; + metaData.put(key, value); + } + } + + } + } + } + + @Override + public String currentJsonState() { + synchronized (mJSONObject) { + return mJSONObject.toString(); + } + } + + @Override + public String getCount() { + synchronized (mJSONObject) { + return mJSONObject.optString("count"); + } + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putString("jsonState", mJSONObject.toString()); + } + + @Override + public void onFormStart() { + try { + if (propertyManager == null) { + propertyManager = new PropertyManager(this); + } + FormUtils.updateStartProperties(propertyManager, mJSONObject); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void onFormFinish() { + try { + if (propertyManager == null) { + propertyManager = new PropertyManager(this); + } + FormUtils.updateEndProperties(propertyManager, mJSONObject); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void clearSkipLogicViews() { + skipLogicViews = new HashMap<>(); + } + + @Override + public void clearConstrainedViews() { + constrainedViews = new HashMap<>(); + } + + @Override + public void clearFormDataViews() { + formDataViews = new ArrayList<>(); + clearSkipLogicViews(); + clearConstrainedViews(); + } + + @Override + public void refreshHiddenViews() { + for (View curView : formDataViews) { + String addressString = (String) curView.getTag(R.id.address); + String[] address = addressString.split(":"); + try { + JSONObject viewData = getObjectUsingAddress(address); + if (viewData.has("hidden") && viewData.getBoolean("hidden")) { + toggleViewVisibility(curView, false); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + @Override + public void addSkipLogicView(View view) { + skipLogicViews.put(getViewKey(view), view); + } + + @Override + public void addConstrainedView(View view) { + constrainedViews.put(getViewKey(view), view); + } + + private String getViewKey(View view) { + String key = (String) view.getTag(R.id.key); + if (view.getTag(R.id.childKey) != null) { + key = key + ":" + (String) view.getTag(R.id.childKey); + } + + return key; + } + + @Override + public void addFormDataView(View view) { + formDataViews.add(view); + } + + @Override + public ArrayList getFormDataViews() { + return formDataViews; + } + + @Override + public void onBackPressed() { + AlertDialog dialog = new AlertDialog.Builder(this, R.style.AppThemeAlertDialog) + .setTitle(R.string.confirm_form_close) + .setMessage(R.string.confirm_form_close_explanation) + .setNegativeButton(R.string.yes, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + JsonFormActivity.this.finish(); + } + }) + .setPositiveButton(R.string.no, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + } + }) + .create(); + + dialog.show(); + } + + @Override + public void refreshSkipLogic(String parentKey, String childKey) { + initComparisons(); + for (View curView : skipLogicViews.values()) { + String relevanceTag = (String) curView.getTag(R.id.relevance); + if (relevanceTag != null && relevanceTag.length() > 0) { + try { + JSONObject relevance = new JSONObject(relevanceTag); + Iterator keys = relevance.keys(); + boolean ok = true; + while (keys.hasNext()) { + String curKey = keys.next(); + String[] address = curKey.split(":"); + if (address.length == 2) { + JSONObject curRelevance = relevance.getJSONObject(curKey); + String curValue = getValueFromAddress(address); + try { + boolean comparison = doComparison(curValue, curRelevance); + ok = ok && comparison; + if (!ok) break; + } catch (Exception e) { + e.printStackTrace(); + } + } + } + toggleViewVisibility(curView, ok); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + private void toggleViewVisibility(View view, boolean visible) { + try { + JSONArray canvasViewIds = new JSONArray((String) view.getTag(R.id.canvas_ids)); + String addressString = (String) view.getTag(R.id.address); + String[] address = addressString.split(":"); + JSONObject object = getObjectUsingAddress(address); + boolean enabled = visible; + if (object.has("read_only") && object.getBoolean("read_only") && visible) { + enabled = false; + } + view.setEnabled(enabled); + for (int i = 0; i < canvasViewIds.length(); i++) { + int curId = canvasViewIds.getInt(i); + View curCanvasView = findViewById(curId); + if (visible) { + curCanvasView.setEnabled(true); + curCanvasView.setVisibility(View.VISIBLE); + } else { + curCanvasView.setEnabled(false); + curCanvasView.setVisibility(View.GONE); + } + } + } catch (Exception e) { + Log.e(TAG, Log.getStackTraceString(e)); + } + } + + /** + * This method checks if all views being watched for constraints enforce those constraints + * This library currently only supports constraints on views that store the value in {@link MaterialEditText} + * (ie TreeViews, DatePickers, and EditTexts), and {@link CheckBox} + */ + @Override + public void refreshConstraints(String parentKey, String childKey) { + initComparisons(); + + // Priorities constraints on the view that has just been changed + String changedViewKey = parentKey; + if (changedViewKey != null && childKey != null) { + changedViewKey = changedViewKey + ":" + childKey; + } + + if (changedViewKey != null && constrainedViews.containsKey(changedViewKey)) { + checkViewConstraints(constrainedViews.get(changedViewKey)); + } + + for (View curView : constrainedViews.values()) { + if (changedViewKey == null || !getViewKey(curView).equals(changedViewKey)) { + checkViewConstraints(curView); + } + } + } + + @Override + public void addOnActivityResultListener(final Integer requestCode, + OnActivityResultListener onActivityResultListener) { + onActivityResultListeners.put(requestCode, onActivityResultListener); + } + + @Override + public void resetFocus() { + EditText defaultFocusView = (EditText) findViewById(R.id.default_focus_view); + defaultFocusView.requestFocus(); + InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), HIDE_NOT_ALWAYS); + } + + private void checkViewConstraints(View curView) { + String constraintTag = (String) curView.getTag(R.id.constraints); + if (constraintTag != null && constraintTag.length() > 0) { + try { + String addressString = (String) curView.getTag(R.id.address); + String[] address = addressString.split(":"); + + JSONArray constraint = new JSONArray(constraintTag); + String errorMessage = null; + for (int i = 0; i < constraint.length(); i++) { + JSONObject curConstraint = constraint.getJSONObject(i); + if (address.length == 2) { + String value = getValueFromAddress(address); + errorMessage = enforceConstraint(value, curView, curConstraint); + if (errorMessage != null) break; + } + } + + if (errorMessage != null) { + if (curView instanceof MaterialEditText) { + ((MaterialEditText) curView).setText(null); + ((MaterialEditText) curView).setError(errorMessage); + } else if (curView instanceof CheckBox) { + ((CheckBox) curView).setChecked(false); + Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT).show(); + String checkBoxKey = (String) curView.getTag(R.id.childKey); + JSONObject questionObject = getObjectUsingAddress(address); + for (int i = 0; i < questionObject.getJSONArray("options").length(); i++) { + JSONObject curOption = questionObject.getJSONArray("options").getJSONObject(i); + if (curOption.getString("key").equals(checkBoxKey)) { + curOption.put("value", "false"); + break; + } + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + private String getValueFromAddress(String[] address) throws Exception { + String result = null; + JSONObject object = getObjectUsingAddress(address); + if (object != null) { + if (object.getString("type").equals("check_box")) { + JSONArray resultArray = new JSONArray(); + JSONArray options = object.getJSONArray("options"); + for (int j = 0; j < options.length(); j++) { + if (options.getJSONObject(j).getString("value").toLowerCase().equals("true")) { + resultArray.put(options.getJSONObject(j).getString("key")); + } + } + + if (resultArray.length() > 0) { + result = resultArray.toString(); + } + } else { + result = object.optString("value"); + } + } + + return result; + } + + @Override + public JSONObject getObjectUsingAddress(String[] address) throws JSONException { + if (address != null && address.length == 2) { + JSONArray fields = fetchFields(mJSONObject.getJSONObject(address[0])); + for (int i = 0; i < fields.length(); i++) { + if (fields.getJSONObject(i).getString("key").equals(address[1])) { + return fields.getJSONObject(i); + } + } + } + + return null; + } + + private void initComparisons() { + if (comparisons == null) { + functionRegex = ""; + comparisons = new HashMap<>(); + + LessThanComparison lessThanComparison = new LessThanComparison(); + functionRegex += lessThanComparison.getFunctionName(); + comparisons.put(lessThanComparison.getFunctionName(), lessThanComparison); + + LessThanEqualToComparison lessThanEqualToComparison = new LessThanEqualToComparison(); + functionRegex += "|" + lessThanEqualToComparison.getFunctionName(); + comparisons.put(lessThanEqualToComparison.getFunctionName(), lessThanEqualToComparison); + + EqualToComparison equalToComparison = new EqualToComparison(); + functionRegex += "|" + equalToComparison.getFunctionName(); + comparisons.put(equalToComparison.getFunctionName(), equalToComparison); + + NotEqualToComparison notEqualToComparer = new NotEqualToComparison(); + functionRegex += "|" + notEqualToComparer.getFunctionName(); + comparisons.put(notEqualToComparer.getFunctionName(), notEqualToComparer); + + GreaterThanComparison greaterThanComparison = new GreaterThanComparison(); + functionRegex += "|" + greaterThanComparison.getFunctionName(); + comparisons.put(greaterThanComparison.getFunctionName(), greaterThanComparison); + + GreaterThanEqualToComparison greaterThanEqualToComparison = new GreaterThanEqualToComparison(); + functionRegex += "|" + greaterThanEqualToComparison.getFunctionName(); + comparisons.put(greaterThanEqualToComparison.getFunctionName(), greaterThanEqualToComparison); + + RegexComparison regexComparison = new RegexComparison(); + functionRegex += "|" + regexComparison.getFunctionName(); + comparisons.put(regexComparison.getFunctionName(), regexComparison); + } + } + + private boolean doComparison(String value, JSONObject comparison) throws Exception { + String type = comparison.getString("type").toLowerCase(); + String ex = comparison.getString("ex"); + + Pattern pattern = Pattern.compile("(" + functionRegex + ")\\((.*)\\)"); + Matcher matcher = pattern.matcher(ex); + if (matcher.find()) { + String functionName = matcher.group(1); + String b = matcher.group(2);//functions arguments should be two, and should either be addresses or values (enclosed using "") + String[] args = getFunctionArgs(b, value); + return comparisons.get(functionName).compare(args[0], type, args[1]); + } + + return false; + } + + private String[] getFunctionArgs(String functionArgs, String value) { + String[] args = new String[2]; + String[] splitArgs = functionArgs.split(","); + if (splitArgs.length == 2) { + Pattern valueRegex = Pattern.compile("\"(.*)\""); + for (int i = 0; i < splitArgs.length; i++) { + String curArg = splitArgs[i].trim(); + + if (curArg.equals(".")) { + args[i] = value; + } else { + Matcher valueMatcher = valueRegex.matcher(curArg); + if (valueMatcher.find()) { + args[i] = valueMatcher.group(1); + } else { + try { + args[i] = getValueFromAddress(curArg.split(":")); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + } + + return args; + } + + /** + * This method checks whether a constraint has been enforced and returns an error message if not + * The error message should be displayable to the user + * + * @param value The value to be checked + * @param constraint The constraint expression to use + * @return An error message if constraint has not been enfored or NULL if constraint enforced + * @throws Exception + */ + private String enforceConstraint(String value, View view, JSONObject constraint) throws Exception { + String type = constraint.getString("type").toLowerCase(); + String ex = constraint.getString("ex"); + String errorMessage = constraint.getString("err"); + Pattern pattern = Pattern.compile("(" + functionRegex + ")\\((.*)\\)"); + Matcher matcher = pattern.matcher(ex); + if (matcher.find()) { + String functionName = matcher.group(1); + String b = matcher.group(2); + String[] args = getFunctionArgs(b, value); + + boolean viewDoesntHaveValue = TextUtils.isEmpty(value); + if (view instanceof CheckBox) { + viewDoesntHaveValue = !((CheckBox) view).isChecked(); + } + + if (viewDoesntHaveValue + || TextUtils.isEmpty(args[0]) + || TextUtils.isEmpty(args[1]) + || comparisons.get(functionName).compare(args[0], type, args[1])) { + return null; + } + } else { + Log.d(TAG, "Matcher didn't work with function"); + } + + return errorMessage; + } + + private JSONArray fetchFields(JSONObject parentJson) { + JSONArray fields = new JSONArray(); + try { + if (parentJson.has(JsonFormConstants.SECTIONS) && parentJson.get(JsonFormConstants.SECTIONS) instanceof JSONArray) { + JSONArray sections = parentJson.getJSONArray(JsonFormConstants.SECTIONS); + + for (int i = 0; i < sections.length(); i++) { + JSONObject sectionJson = sections.getJSONObject(i); + if (sectionJson.has(JsonFormConstants.FIELDS)) { + fields = concatArray(fields, sectionJson.getJSONArray(JsonFormConstants.FIELDS)); + } + } + } else if (parentJson.has(JsonFormConstants.FIELDS) && parentJson.get(JsonFormConstants.FIELDS) instanceof JSONArray) { + fields = parentJson.getJSONArray(JsonFormConstants.FIELDS); + } + } catch (JSONException e) { + + } + + return fields; + } + + private JSONArray concatArray(JSONArray... arrs) + throws JSONException { + JSONArray result = new JSONArray(); + for (JSONArray arr : arrs) { + for (int i = 0; i < arr.length(); i++) { + result.put(arr.get(i)); + } + } + return result; + } + +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/Comparison.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/Comparison.java new file mode 100644 index 000000000..2febde0da --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/Comparison.java @@ -0,0 +1,22 @@ +package com.vijay.jsonwizard.comparisons; + +/** + * @author Jason Rogena - jrogena@ona.io + * @since 09/02/2017 + */ +public abstract class Comparison { + protected static final String TYPE_STRING = "string"; + protected static final String TYPE_NUMERIC = "numeric"; + protected static final String TYPE_DATE = "date"; + protected static final String TYPE_ARRAY = "array"; + protected static final String DEFAULT_STRING = ""; + protected static final String DEFAULT_NUMERIC = "0"; + protected static final String DEFAULT_DATE = "01-01-1900"; + protected static final String DEFAULT_ARRAY = "[]"; + + public abstract boolean compare(String a, String type, String b); + + public abstract String getFunctionName(); + + +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/EqualToComparison.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/EqualToComparison.java new file mode 100644 index 000000000..511624753 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/EqualToComparison.java @@ -0,0 +1,71 @@ +package com.vijay.jsonwizard.comparisons; + +import android.util.Log; + +import com.vijay.jsonwizard.widgets.DatePickerFactory; + +import org.json.JSONArray; +import org.json.JSONException; + +import java.util.ArrayList; +import java.util.Date; + +public class EqualToComparison extends Comparison { + private static final String TAG = "EqualToComparison"; + @Override + public boolean compare(String a, String type, String b) { + try { + switch (type) { + case TYPE_STRING: + if (a == null) a = DEFAULT_STRING; + return a.compareTo(b) == 0; + case TYPE_NUMERIC: + if (a == null) a = DEFAULT_NUMERIC; + if (b == null) b = DEFAULT_NUMERIC; + return Double.valueOf(a) == Double.valueOf(b); + case TYPE_DATE: + if (a == null) a = DEFAULT_DATE; + if (b == null) b = DEFAULT_DATE; + Date dateA = DatePickerFactory.DATE_FORMAT.parse(a); + Date dateB = DatePickerFactory.DATE_FORMAT.parse(b); + return dateA.getTime() == dateB.getTime(); + case TYPE_ARRAY: + if (a == null) a = DEFAULT_ARRAY; + if (b == null) b = DEFAULT_ARRAY; + + // An array is only equal to another if they have the same number of items + // and all these items are in both arrays + try { + JSONArray aArray = new JSONArray(a); + JSONArray bArray = new JSONArray(b); + + ArrayList aList = new ArrayList<>(); + for(int i = 0; i < aArray.length(); i++) { + aList.add(aArray.getString(i)); + } + + ArrayList bList = new ArrayList<>(); + for(int i = 0; i < bArray.length(); i++) { + bList.add(bArray.getString(i)); + } + + aList.removeAll(bList); + + return aList.size() == 0; + } catch (JSONException e) { + Log.e(TAG, Log.getStackTraceString(e)); + } + return false; + } + } catch (Exception e) { + e.printStackTrace(); + } + + return false; + } + + @Override + public String getFunctionName() { + return "equalTo"; + } +} \ No newline at end of file diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/GreaterThanComparison.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/GreaterThanComparison.java new file mode 100644 index 000000000..91fe46f40 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/GreaterThanComparison.java @@ -0,0 +1,37 @@ +package com.vijay.jsonwizard.comparisons; + +import com.vijay.jsonwizard.widgets.DatePickerFactory; + +import java.util.Date; + +public class GreaterThanComparison extends Comparison { + @Override + public boolean compare(String a, String type, String b) { + try { + switch (type) { + case TYPE_STRING: + if (a == null) a = DEFAULT_STRING; + return a.compareTo(b) > 0; + case TYPE_NUMERIC: + if (a == null) a = DEFAULT_NUMERIC; + if (b == null) b = DEFAULT_NUMERIC; + return Double.valueOf(a) > Double.valueOf(b); + case TYPE_DATE: + if (a == null) a = DEFAULT_DATE; + if (b == null) b = DEFAULT_DATE; + Date dateA = DatePickerFactory.DATE_FORMAT.parse(a); + Date dateB = DatePickerFactory.DATE_FORMAT.parse(b); + return dateA.getTime() > dateB.getTime(); + } + } catch (Exception e) { + e.printStackTrace(); + } + + return false; + } + + @Override + public String getFunctionName() { + return "greaterThan"; + } +} \ No newline at end of file diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/GreaterThanEqualToComparison.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/GreaterThanEqualToComparison.java new file mode 100644 index 000000000..96579ca25 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/GreaterThanEqualToComparison.java @@ -0,0 +1,37 @@ +package com.vijay.jsonwizard.comparisons; + +import com.vijay.jsonwizard.widgets.DatePickerFactory; + +import java.util.Date; + +public class GreaterThanEqualToComparison extends Comparison { + @Override + public boolean compare(String a, String type, String b) { + try { + switch (type) { + case TYPE_STRING: + if (a == null) a = DEFAULT_STRING; + return a.compareTo(b) >= 0; + case TYPE_NUMERIC: + if (a == null) a = DEFAULT_NUMERIC; + if (b == null) b = DEFAULT_NUMERIC; + return Double.valueOf(a) >= Double.valueOf(b); + case TYPE_DATE: + if (a == null) a = DEFAULT_DATE; + if (b == null) b = DEFAULT_DATE; + Date dateA = DatePickerFactory.DATE_FORMAT.parse(a); + Date dateB = DatePickerFactory.DATE_FORMAT.parse(b); + return dateA.getTime() >= dateB.getTime(); + } + } catch (Exception e) { + e.printStackTrace(); + } + + return false; + } + + @Override + public String getFunctionName() { + return "greaterThanEqualTo"; + } +} \ No newline at end of file diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/LessThanComparison.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/LessThanComparison.java new file mode 100644 index 000000000..2db4e7660 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/LessThanComparison.java @@ -0,0 +1,38 @@ +package com.vijay.jsonwizard.comparisons; + +import com.vijay.jsonwizard.widgets.DatePickerFactory; + +import java.util.Date; + +public class LessThanComparison extends Comparison { + + @Override + public boolean compare(String a, String type, String b) { + try { + switch (type) { + case TYPE_STRING: + if (a == null) a = DEFAULT_STRING; + return a.compareTo(b) < 0; + case TYPE_NUMERIC: + if (a == null) a = DEFAULT_NUMERIC; + if (b == null) b = DEFAULT_NUMERIC; + return Double.valueOf(a) < Double.valueOf(b); + case TYPE_DATE: + if (a == null) a = DEFAULT_DATE; + if (b == null) b = DEFAULT_DATE; + Date dateA = DatePickerFactory.DATE_FORMAT.parse(a); + Date dateB = DatePickerFactory.DATE_FORMAT.parse(b); + return dateA.getTime() < dateB.getTime(); + } + } catch (Exception e) { + e.printStackTrace(); + } + + return false; + } + + @Override + public String getFunctionName() { + return "lessThan"; + } +} \ No newline at end of file diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/LessThanEqualToComparison.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/LessThanEqualToComparison.java new file mode 100644 index 000000000..d9f3ddc68 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/LessThanEqualToComparison.java @@ -0,0 +1,37 @@ +package com.vijay.jsonwizard.comparisons; + +import com.vijay.jsonwizard.widgets.DatePickerFactory; + +import java.util.Date; + +public class LessThanEqualToComparison extends Comparison { + @Override + public boolean compare(String a, String type, String b) { + try { + switch (type) { + case TYPE_STRING: + if (a == null) a = DEFAULT_STRING; + return a.compareTo(b) <= 0; + case TYPE_NUMERIC: + if (a == null) a = DEFAULT_NUMERIC; + if (b == null) b = DEFAULT_NUMERIC; + return Double.valueOf(a) <= Double.valueOf(b); + case TYPE_DATE: + if (a == null) a = DEFAULT_DATE; + if (b == null) b = DEFAULT_DATE; + Date dateA = DatePickerFactory.DATE_FORMAT.parse(a); + Date dateB = DatePickerFactory.DATE_FORMAT.parse(b); + return dateA.getTime() <= dateB.getTime(); + } + } catch (Exception e) { + e.printStackTrace(); + } + + return false; + } + + @Override + public String getFunctionName() { + return "lessThanEqualTo"; + } +} \ No newline at end of file diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/NotEqualToComparison.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/NotEqualToComparison.java new file mode 100644 index 000000000..11e2a94f8 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/NotEqualToComparison.java @@ -0,0 +1,74 @@ +package com.vijay.jsonwizard.comparisons; + +import android.util.Log; + +import com.vijay.jsonwizard.widgets.DatePickerFactory; + +import org.json.JSONArray; +import org.json.JSONException; + +import java.util.ArrayList; +import java.util.Date; + +public class NotEqualToComparison extends Comparison { + private static final String TAG = "NotEqualToComparison"; + @Override + public boolean compare(String a, String type, String b) { + try { + switch (type) { + case TYPE_STRING: + if (a == null) a = DEFAULT_STRING; + return a.compareTo(b) != 0; + case TYPE_NUMERIC: + if (a == null) a = DEFAULT_NUMERIC; + if (b == null) b = DEFAULT_NUMERIC; + return Double.valueOf(a) != Double.valueOf(b); + case TYPE_DATE: + if (a == null) a = DEFAULT_DATE; + if (b == null) b = DEFAULT_DATE; + Date dateA = DatePickerFactory.DATE_FORMAT.parse(a); + Date dateB = DatePickerFactory.DATE_FORMAT.parse(b); + return dateA.getTime() != dateB.getTime(); + case TYPE_ARRAY: + if (a == null) a = DEFAULT_ARRAY; + if (b == null) b = DEFAULT_ARRAY; + + // An array is only equal to another if they have the same number of items + // and all these items are in both arrays + try { + JSONArray aArray = new JSONArray(a); + JSONArray bArray = new JSONArray(b); + + ArrayList aList1 = new ArrayList<>(); + for(int i = 0; i < aArray.length(); i++) { + aList1.add(aArray.getString(i)); + } + ArrayList aList2 = new ArrayList<>(aList1); + + ArrayList bList1 = new ArrayList<>(); + for (int i = 0; i < bArray.length(); i++) { + bList1.add(bArray.getString(i)); + } + ArrayList bList2 = new ArrayList<>(bList1); + + aList1.removeAll(bList2); + bList1.removeAll(aList2); + + return aList1.size() == aList2.size() && bList1.size() == bList2.size(); + } catch (JSONException e) { + Log.e(TAG, Log.getStackTraceString(e)); + } + return false; + } + } catch (Exception e) { + e.printStackTrace(); + } + + return false; + } + + @Override + public String getFunctionName() { + return "notEqualTo"; + } +} \ No newline at end of file diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/RegexComparison.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/RegexComparison.java new file mode 100644 index 000000000..777c4965d --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/comparisons/RegexComparison.java @@ -0,0 +1,24 @@ +package com.vijay.jsonwizard.comparisons; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class RegexComparison extends Comparison { + @Override + public boolean compare(String a, String type, String b) { + try { + Pattern pattern = Pattern.compile(b); + Matcher matcher = pattern.matcher(a); + return matcher.matches(); + } catch (Exception e) { + e.printStackTrace(); + } + + return false; + } + + @Override + public String getFunctionName() { + return "regex"; + } +} \ No newline at end of file diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/constants/JsonFormConstants.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/constants/JsonFormConstants.java new file mode 100644 index 000000000..b7b199a6f --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/constants/JsonFormConstants.java @@ -0,0 +1,37 @@ +package com.vijay.jsonwizard.constants; + +/** + * Created by vijay on 5/7/15. + */ +public class JsonFormConstants { + public static final String FIRST_STEP_NAME = "step1"; + public static final String SECTION_LABEL = "section_label"; + public static final String EDIT_TEXT = "edit_text"; + public static final String CHECK_BOX = "check_box"; + public static final String RADIO_BUTTON = "radio"; + public static final String LABEL = "label"; + public static final String CHOOSE_IMAGE = "choose_image"; + public static final String OPTIONS_FIELD_NAME = "options"; + public static final String SPINNER = "spinner"; + public static final String DATE_PICKER = "date_picker"; + public static final String TREE = "tree"; + public static final String BARCODE = "barcode"; + public static final String BUTTON = "button"; + public static final String SECTIONS = "sections"; + public static final String FIELDS = "fields"; + public static final String NAME = "name"; + public static final String TYPE = "type"; + public static final String READ_ONLY = "read_only"; + public static final String BEHAVIOUR_FINISH_FORM = "finish_form"; + public static final String BEHAVIOUR_NEXT_STEP = "next_step"; + public static final String HINT = "hint"; + public static final String KEY = "key"; + public static final String ACTION = "action"; + public static final String BEHAVIOUR = "behaviour"; + public static final String RESULT = "result"; + public static final String VALUE = "value"; + public static final String OPENMRS_ENTITY_PARENT = "openmrs_entity_parent"; + public static final String OPENMRS_ENTITY = "openmrs_entity"; + public static final String OPENMRS_ENTITY_ID = "openmrs_entity_id"; + public static final String RELEVANCE = "relevance"; +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/CheckBox.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/CheckBox.java new file mode 100644 index 000000000..1e07137af --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/CheckBox.java @@ -0,0 +1,68 @@ +package com.vijay.jsonwizard.customviews; + +import android.content.Context; +import android.util.AttributeSet; + +import com.rey.material.drawable.CheckBoxDrawable; + +public class CheckBox extends CompoundButton { + + public CheckBox(Context context) { + super(context); + + init(context, null, 0, 0); + } + + public CheckBox(Context context, AttributeSet attrs) { + super(context, attrs); + + init(context, attrs, 0, 0); + } + + public CheckBox(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + init(context, attrs, defStyleAttr, 0); + } + + public CheckBox(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr); + + init(context, attrs, defStyleAttr, defStyleRes); + } + + private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + applyStyle(context, attrs, defStyleAttr, defStyleRes); + } + + public void applyStyle(int resId) { + applyStyle(getContext(), null, 0, resId); + } + + private void applyStyle(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + CheckBoxDrawable drawable = new CheckBoxDrawable.Builder(context, attrs, defStyleAttr, defStyleRes).build(); + drawable.setInEditMode(isInEditMode()); + drawable.setAnimEnable(false); + setButtonDrawable(null); + setCompoundDrawablesWithIntrinsicBounds(null, null, drawable, null); + drawable.setAnimEnable(true); + } + + /** + * Change the checked state of this button immediately without showing + * animation. + * + * @param checked + * The checked state. + */ + public void setCheckedImmediately(boolean checked) { + if (mButtonDrawable instanceof CheckBoxDrawable) { + CheckBoxDrawable drawable = (CheckBoxDrawable) mButtonDrawable; + drawable.setAnimEnable(false); + setChecked(checked); + drawable.setAnimEnable(true); + } else + setChecked(checked); + } + +} \ No newline at end of file diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/CompoundButton.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/CompoundButton.java new file mode 100644 index 000000000..bda83f9da --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/CompoundButton.java @@ -0,0 +1,117 @@ +package com.vijay.jsonwizard.customviews; + +import android.annotation.TargetApi; +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.support.annotation.NonNull; +import android.util.AttributeSet; +import android.view.MotionEvent; + +import com.rey.material.drawable.RippleDrawable; +import com.rey.material.widget.RippleManager; + +public class CompoundButton extends android.widget.CompoundButton { + + private RippleManager mRippleManager = new RippleManager(); + protected Drawable mButtonDrawable; + + public CompoundButton(Context context) { + super(context); + + init(context, null, 0, 0); + } + + public CompoundButton(Context context, AttributeSet attrs) { + super(context, attrs); + + init(context, attrs, 0, 0); + } + + public CompoundButton(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + init(context, attrs, defStyleAttr, 0); + } + + public CompoundButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr); + + init(context, attrs, defStyleAttr, defStyleRes); + } + + @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) + private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + // a fix to reset paddingLeft attribute + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) { + TypedArray a = context.obtainStyledAttributes(attrs, new int[] { android.R.attr.padding, + android.R.attr.paddingLeft }, defStyleAttr, defStyleRes); + + if (!a.hasValue(0) && !a.hasValue(1)) + setPadding(0, getPaddingTop(), getPaddingRight(), getPaddingBottom()); + + a.recycle(); + } + + setClickable(true); + applyStyle(context, attrs, defStyleAttr, defStyleRes); + } + + public void applyStyle(int resId) { + applyStyle(getContext(), null, 0, resId); + } + + private void applyStyle(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + mRippleManager.onCreate(this, context, attrs, defStyleAttr, defStyleRes); + } + + @Override + public void setBackgroundDrawable(Drawable drawable) { + Drawable background = getBackground(); + if (background instanceof RippleDrawable && !(drawable instanceof RippleDrawable)) + ((RippleDrawable) background).setBackgroundDrawable(drawable); + else + super.setBackgroundDrawable(drawable); + } + + @Override + public void setOnClickListener(OnClickListener l) { + if (l == mRippleManager) + super.setOnClickListener(l); + else { + mRippleManager.setOnClickListener(l); + setOnClickListener(mRippleManager); + } + } + + @Override + public boolean onTouchEvent(@NonNull MotionEvent event) { + boolean result = super.onTouchEvent(event); + return mRippleManager.onTouchEvent(event) || result; + } + + @Override + public void setButtonDrawable(Drawable d) { + mButtonDrawable = d; + super.setButtonDrawable(d); + } + + @Override + public int getCompoundPaddingLeft() { + int padding = super.getCompoundPaddingLeft(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) + return padding; + + if (mButtonDrawable != null) + padding += mButtonDrawable.getIntrinsicWidth(); + + return padding; + } + + @Override + public void setCompoundDrawablesWithIntrinsicBounds(Drawable left, Drawable top, Drawable right, Drawable bottom) { + mButtonDrawable = right; + super.setCompoundDrawablesWithIntrinsicBounds(left, top, right, bottom); + } +} \ No newline at end of file diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/DatePickerDialog.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/DatePickerDialog.java new file mode 100644 index 000000000..8a693f1d8 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/DatePickerDialog.java @@ -0,0 +1,143 @@ +package com.vijay.jsonwizard.customviews; + +import android.app.Activity; +import android.app.DialogFragment; +import android.content.Context; +import android.content.DialogInterface; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.inputmethod.InputMethodManager; +import android.widget.Button; +import android.widget.DatePicker; + +import com.vijay.jsonwizard.R; +import com.vijay.jsonwizard.utils.DatePickerUtils; + +import java.util.Calendar; +import java.util.Date; + +import static android.view.inputmethod.InputMethodManager.HIDE_NOT_ALWAYS; + +/** + * Created by Jason Rogena - jrogena@ona.io on 08/05/2017. + */ + +public class DatePickerDialog extends DialogFragment { + private DatePicker datePicker; + private Button cancelButton, okButton; + private android.app.DatePickerDialog.OnDateSetListener onDateSetListener; + private DialogInterface.OnShowListener onShowListener; + private Date date; + private long minDate; + private long maxDate; + private boolean calendarViewShown; + private Context context; + + public DatePickerDialog(Context context) { + this.context = context; + this.minDate = -1; + this.maxDate = -1; + this.calendarViewShown = true; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setStyle(DialogFragment.STYLE_NO_TITLE, android.R.style.Theme_Holo_Light_Dialog); + } + + public void setOnShowListener(DialogInterface.OnShowListener onShowListener) { + this.onShowListener = onShowListener; + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + ViewGroup dialogView = (ViewGroup) inflater.inflate(R.layout.dialog_date_picker, container, false); + + this.setOnShowListener(new DialogInterface.OnShowListener() { + @Override + public void onShow(DialogInterface dialog) { + InputMethodManager inputManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); + inputManager.hideSoftInputFromWindow(((Activity) context).getCurrentFocus().getWindowToken(), + HIDE_NOT_ALWAYS); + } + }); + + datePicker = (DatePicker) dialogView.findViewById(R.id.date_picker); + if (minDate != -1) { + datePicker.setMinDate(minDate); + } + if (maxDate != -1) { + datePicker.setMaxDate(maxDate); + } + datePicker.setCalendarViewShown(calendarViewShown); + if (date != null) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + setDate(calendar); + } + DatePickerUtils.themeDatePicker(datePicker, new char[]{'d', 'm', 'y'}); + + cancelButton = (Button) dialogView.findViewById(R.id.cancel_button); + cancelButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + DatePickerDialog.this.dismiss(); + } + }); + + okButton = (Button) dialogView.findViewById(R.id.ok_button); + okButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (onDateSetListener != null) { + DatePickerDialog.this.dismiss(); + onDateSetListener.onDateSet(datePicker, datePicker.getYear(), + datePicker.getMonth(), datePicker.getDayOfMonth()); + } + } + }); + + return dialogView; + } + + public void setMinDate(long minDate) { + this.minDate = minDate; + } + + public void setMaxDate(long maxDate) { + this.maxDate = maxDate; + } + + public void setCalendarViewShown(boolean calendarViewShown) { + this.calendarViewShown = calendarViewShown; + } + + public void setDate(Date date) { + this.date = date; + Calendar calendar = Calendar.getInstance(); + calendar.setTime(this.date); + setDate(calendar); + } + + private void setDate(Calendar calendar) { + if (this.datePicker != null) { + datePicker.updateDate(calendar.get(Calendar.YEAR), + calendar.get(Calendar.MONTH), + calendar.get(Calendar.DAY_OF_MONTH)); + } + } + + public void setOnDateSetListener(android.app.DatePickerDialog.OnDateSetListener onDateSetListener) { + this.onDateSetListener = onDateSetListener; + } + + public DatePicker getDatePicker() { + return this.datePicker; + } +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/GenericTextWatcher.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/GenericTextWatcher.java new file mode 100644 index 000000000..cd1467c12 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/GenericTextWatcher.java @@ -0,0 +1,88 @@ +package com.vijay.jsonwizard.customviews; + +import org.json.JSONException; + +import android.support.v7.internal.widget.TintContextWrapper; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.util.Log; +import android.view.View; + +import com.rengwuxian.materialedittext.MaterialEditText; +import com.vijay.jsonwizard.R; +import com.vijay.jsonwizard.activities.JsonFormActivity; +import com.vijay.jsonwizard.fragments.JsonFormFragment; +import com.vijay.jsonwizard.interfaces.JsonApi; +import com.vijay.jsonwizard.presenters.JsonFormFragmentPresenter; +import com.vijay.jsonwizard.utils.ValidationStatus; +import com.vijay.jsonwizard.views.JsonFormFragmentView; +import com.vijay.jsonwizard.widgets.EditTextFactory; + +import java.util.ArrayList; + +public class GenericTextWatcher implements TextWatcher, View.OnFocusChangeListener { + + private View mView; + private String mStepName; + private ArrayList onFocusChangeListeners; + private JsonFormFragment formFragment; + + public GenericTextWatcher(String stepName, JsonFormFragment formFragment, View view) { + this.formFragment = formFragment; + mView = view; + mStepName = stepName; + onFocusChangeListeners = new ArrayList<>(); + mView.setOnFocusChangeListener(this); + } + + public void addOnFocusChangeListener(View.OnFocusChangeListener onFocusChangeListener) { + onFocusChangeListeners.add(onFocusChangeListener); + } + + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + } + + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + } + + public void afterTextChanged(Editable editable) { + String text = (String) mView.getTag(R.id.raw_value); + + if (text == null) { + text = editable.toString(); + } + + Log.d("RealtimeValidation", "afterTextChanged called"); + JsonApi api = null; + if(mView.getContext() instanceof JsonApi) { + api = (JsonApi) mView.getContext(); + } else if(mView.getContext() instanceof TintContextWrapper) { + TintContextWrapper tintContextWrapper = (TintContextWrapper) mView.getContext(); + api = (JsonApi) tintContextWrapper.getBaseContext(); + } else { + throw new RuntimeException("Could not fetch context"); + } + + String key = (String) mView.getTag(R.id.key); + String openMrsEntityParent = (String) mView.getTag(R.id.openmrs_entity_parent); + String openMrsEntity = (String) mView.getTag(R.id.openmrs_entity); + String openMrsEntityId = (String) mView.getTag(R.id.openmrs_entity_id); + try { + api.writeValue(mStepName, key, text, openMrsEntityParent, openMrsEntity, openMrsEntityId); + } catch (JSONException e) { + // TODO- handle + e.printStackTrace(); + } + } + + @Override + public void onFocusChange(View v, boolean hasFocus) { + if(!hasFocus) { + JsonFormFragmentPresenter.validate(formFragment, mView, false); + } + for (View.OnFocusChangeListener curListener : onFocusChangeListeners) { + curListener.onFocusChange(v, hasFocus); + } + } +} \ No newline at end of file diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/MaterialSpinner.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/MaterialSpinner.java new file mode 100644 index 000000000..7dcaad040 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/MaterialSpinner.java @@ -0,0 +1,949 @@ +package com.vijay.jsonwizard.customviews; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.Point; +import android.graphics.Typeface; +import android.os.Build; +import android.support.v7.widget.AppCompatSpinner; +import android.text.Layout; +import android.text.StaticLayout; +import android.text.TextPaint; +import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.util.Log; +import android.util.TypedValue; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.LinearInterpolator; +import android.widget.AdapterView; +import android.widget.BaseAdapter; +import android.widget.SpinnerAdapter; +import android.widget.TextView; +import android.widget.Toast; + +import com.nineoldandroids.animation.ObjectAnimator; +import com.nineoldandroids.animation.ValueAnimator; +import com.vijay.jsonwizard.R; + + +public class MaterialSpinner extends AppCompatSpinner implements ValueAnimator.AnimatorUpdateListener { + + public static final int DEFAULT_ARROW_WIDTH_DP = 12; + + private static final String TAG = MaterialSpinner.class.getSimpleName(); + + private Context context; + + //Paint objects + private Paint paint; + private TextPaint textPaint; + private StaticLayout staticLayout; + + + private Path selectorPath; + private Point[] selectorPoints; + + //Inner padding = "Normal" android padding + private int innerPaddingLeft; + private int innerPaddingRight; + private int innerPaddingTop; + private int innerPaddingBottom; + + //Private padding to add space for FloatingLabel and ErrorLabel + private int extraPaddingTop; + private int extraPaddingBottom; + + //@see dimens.xml + private int underlineTopSpacing; + private int underlineBottomSpacing; + private int errorLabelSpacing; + private int floatingLabelTopSpacing; + private int floatingLabelBottomSpacing; + private int floatingLabelInsideSpacing; + private int rightLeftSpinnerPadding; + private int minContentHeight; + + //Properties about Error Label + private int lastPosition; + private ObjectAnimator errorLabelAnimator; + private int errorLabelPosX; + private int minNbErrorLines; + private float currentNbErrorLines; + + + //Properties about Floating Label ( + private float floatingLabelPercent; + private ObjectAnimator floatingLabelAnimator; + private boolean isSelected; + private boolean floatingLabelVisible; + private int baseAlpha; + + + //AttributeSet + private int baseColor; + private int highlightColor; + private int errorColor; + private int disabledColor; + private CharSequence error; + private CharSequence hint; + private int hintColor; + private CharSequence floatingLabelText; + private int floatingLabelColor; + private boolean multiline; + private Typeface typeface; + private boolean alignLabels; + private float thickness; + private float thicknessError; + private int arrowColor; + private float arrowSize; + private boolean enableErrorLabel; + private boolean enableFloatingLabel; + private boolean isRtl; + + private HintAdapter hintAdapter; + + //Default hint views + private Integer mDropDownHintView; + private Integer mHintView; + + /* + * ********************************************************************************** + * CONSTRUCTORS + * ********************************************************************************** + */ + + public MaterialSpinner(Context context) { + super(context); + init(context, null); + } + + public MaterialSpinner(Context context, AttributeSet attrs) { + super(context, attrs); + init(context, attrs); + + } + + public MaterialSpinner(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context, attrs); + } + + + /* + * ********************************************************************************** + * INITIALISATION METHODS + * ********************************************************************************** + */ + + private void init(Context context, AttributeSet attrs) { + this.context = context; + initAttributes(context, attrs); + initPaintObjects(); + initDimensions(); + initPadding(); + initFloatingLabelAnimator(); + initOnItemSelectedListener(); + setMinimumHeight(getPaddingTop() + getPaddingBottom() + minContentHeight); + //Erase the drawable selector not to be affected by new size (extra paddings) + setBackgroundResource(R.drawable.my_background); + + } + + private void initAttributes(Context context, AttributeSet attrs) { + + TypedArray defaultArray = context.obtainStyledAttributes(new int[]{R.attr.colorControlNormal, R.attr.colorAccent}); + int defaultBaseColor = defaultArray.getColor(0, 0); + int defaultHighlightColor = defaultArray.getColor(1, 0); + int defaultErrorColor = context.getResources().getColor(R.color.error_color); + defaultArray.recycle(); + + TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.MaterialSpinner); + baseColor = array.getColor(R.styleable.MaterialSpinner_ms_baseColor, defaultBaseColor); + highlightColor = array.getColor(R.styleable.MaterialSpinner_ms_highlightColor, defaultHighlightColor); + errorColor = array.getColor(R.styleable.MaterialSpinner_ms_errorColor, defaultErrorColor); + disabledColor = context.getResources().getColor(R.color.disabled_color); + error = array.getString(R.styleable.MaterialSpinner_ms_error); + hint = array.getString(R.styleable.MaterialSpinner_ms_hint); + hintColor = array.getColor(R.styleable.MaterialSpinner_ms_hintColor, baseColor); + floatingLabelText = array.getString(R.styleable.MaterialSpinner_ms_floatingLabelText); + floatingLabelColor = array.getColor(R.styleable.MaterialSpinner_ms_floatingLabelColor, baseColor); + multiline = array.getBoolean(R.styleable.MaterialSpinner_ms_multiline, true); + minNbErrorLines = array.getInt(R.styleable.MaterialSpinner_ms_nbErrorLines, 1); + alignLabels = array.getBoolean(R.styleable.MaterialSpinner_ms_alignLabels, true); + thickness = array.getDimension(R.styleable.MaterialSpinner_ms_thickness, 1); + thicknessError = array.getDimension(R.styleable.MaterialSpinner_ms_thickness_error, 2); + arrowColor = array.getColor(R.styleable.MaterialSpinner_ms_arrowColor, baseColor); + arrowSize = array.getDimension(R.styleable.MaterialSpinner_ms_arrowSize, dpToPx(DEFAULT_ARROW_WIDTH_DP)); + enableErrorLabel = array.getBoolean(R.styleable.MaterialSpinner_ms_enableErrorLabel, true); + enableFloatingLabel = array.getBoolean(R.styleable.MaterialSpinner_ms_enableFloatingLabel, true); + isRtl = array.getBoolean(R.styleable.MaterialSpinner_ms_isRtl, false); + mHintView = array.getResourceId(R.styleable.MaterialSpinner_ms_hintView, android.R.layout.simple_spinner_item); + mDropDownHintView = array.getResourceId(R.styleable.MaterialSpinner_ms_dropDownHintView, android.R.layout.simple_spinner_dropdown_item); + + String typefacePath = array.getString(R.styleable.MaterialSpinner_ms_typeface); + if (typefacePath != null) { + typeface = Typeface.createFromAsset(getContext().getAssets(), typefacePath); + } + + array.recycle(); + + floatingLabelPercent = 0f; + errorLabelPosX = 0; + isSelected = false; + floatingLabelVisible = false; + lastPosition = -1; + currentNbErrorLines = minNbErrorLines; + + } + + + @Override + public void setSelection(final int position) { + this.post(new Runnable() { + @Override + public void run() { + MaterialSpinner.super.setSelection(position); + } + }); + } + + private void initPaintObjects() { + + int labelTextSize = getResources().getDimensionPixelSize(R.dimen.label_text_size); + + paint = new Paint(Paint.ANTI_ALIAS_FLAG); + + textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); + textPaint.setTextSize(labelTextSize); + if (typeface != null) { + textPaint.setTypeface(typeface); + } + textPaint.setColor(baseColor); + baseAlpha = textPaint.getAlpha(); + + selectorPath = new Path(); + selectorPath.setFillType(Path.FillType.EVEN_ODD); + + selectorPoints = new Point[3]; + for (int i = 0; i < 3; i++) { + selectorPoints[i] = new Point(); + } + } + + @Override + public int getSelectedItemPosition() { + return super.getSelectedItemPosition(); + } + + private void initPadding() { + + innerPaddingTop = getPaddingTop(); + innerPaddingLeft = getPaddingLeft(); + innerPaddingRight = getPaddingRight(); + innerPaddingBottom = getPaddingBottom(); + + extraPaddingTop = enableFloatingLabel ? floatingLabelTopSpacing + floatingLabelInsideSpacing + floatingLabelBottomSpacing : floatingLabelBottomSpacing; + updateBottomPadding(); + + } + + private void updateBottomPadding() { + Paint.FontMetrics textMetrics = textPaint.getFontMetrics(); + extraPaddingBottom = underlineTopSpacing + underlineBottomSpacing; + if (enableErrorLabel) { + extraPaddingBottom += (int) ((textMetrics.descent - textMetrics.ascent) * currentNbErrorLines); + } + updatePadding(); + } + + private void initDimensions() { + underlineTopSpacing = getResources().getDimensionPixelSize(R.dimen.underline_top_spacing); + underlineBottomSpacing = getResources().getDimensionPixelSize(R.dimen.underline_bottom_spacing); + floatingLabelTopSpacing = getResources().getDimensionPixelSize(R.dimen.floating_label_top_spacing); + floatingLabelBottomSpacing = getResources().getDimensionPixelSize(R.dimen.floating_label_bottom_spacing); + rightLeftSpinnerPadding = alignLabels ? getResources().getDimensionPixelSize(R.dimen.right_left_spinner_padding) : 0; + floatingLabelInsideSpacing = getResources().getDimensionPixelSize(R.dimen.floating_label_inside_spacing); + errorLabelSpacing = (int) getResources().getDimension(R.dimen.error_label_spacing); + minContentHeight = (int) getResources().getDimension(R.dimen.min_content_height); + } + + private void initOnItemSelectedListener() { + setOnItemSelectedListener(null); + } + + /* + * ********************************************************************************** + * ANIMATION METHODS + * ********************************************************************************** + */ + + private void initFloatingLabelAnimator() { + if (floatingLabelAnimator == null) { + floatingLabelAnimator = ObjectAnimator.ofFloat(this, "floatingLabelPercent", 0f, 1f); + floatingLabelAnimator.addUpdateListener(this); + } + } + + private void showFloatingLabel() { + if (floatingLabelAnimator != null) { + floatingLabelVisible = true; + if (floatingLabelAnimator.isRunning()) { + floatingLabelAnimator.reverse(); + } else { + floatingLabelAnimator.start(); + } + } + } + + private void hideFloatingLabel() { + if (floatingLabelAnimator != null) { + floatingLabelVisible = false; + floatingLabelAnimator.reverse(); + } + } + + private void startErrorScrollingAnimator() { + + int textWidth = Math.round(textPaint.measureText(error.toString())); + if (errorLabelAnimator == null) { + errorLabelAnimator = ObjectAnimator.ofInt(this, "errorLabelPosX", 0, textWidth + getWidth() / 2); + errorLabelAnimator.setStartDelay(1000); + errorLabelAnimator.setInterpolator(new LinearInterpolator()); + errorLabelAnimator.setDuration(150 * error.length()); + errorLabelAnimator.addUpdateListener(this); + errorLabelAnimator.setRepeatCount(ValueAnimator.INFINITE); + } else { + errorLabelAnimator.setIntValues(0, textWidth + getWidth() / 2); + } + errorLabelAnimator.start(); + } + + + private void startErrorMultilineAnimator(float destLines) { + if (errorLabelAnimator == null) { + errorLabelAnimator = ObjectAnimator.ofFloat(this, "currentNbErrorLines", destLines); + + } else { + errorLabelAnimator.setFloatValues(destLines); + } + errorLabelAnimator.start(); + } + + + /* + * ********************************************************************************** + * UTILITY METHODS + * ********************************************************************************** + */ + + private int dpToPx(float dp) { + final DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics(); + float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, displayMetrics); + return Math.round(px); + } + + private float pxToDp(float px) { + final DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics(); + return px * displayMetrics.density; + } + + private void updatePadding() { + int left = innerPaddingLeft; + int top = innerPaddingTop + extraPaddingTop; + int right = innerPaddingRight; + int bottom = innerPaddingBottom + extraPaddingBottom; + super.setPadding(left, top, right, bottom); + setMinimumHeight(top + bottom + minContentHeight); + } + + private boolean needScrollingAnimation() { + if (error != null) { + float screenWidth = getWidth() - rightLeftSpinnerPadding; + float errorTextWidth = textPaint.measureText(error.toString(), 0, error.length()); + return errorTextWidth > screenWidth ? true : false; + } + return false; + } + + private int prepareBottomPadding() { + + int targetNbLines = minNbErrorLines; + if (error != null) { + staticLayout = new StaticLayout(error, textPaint, getWidth() - getPaddingRight() - getPaddingLeft(), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, true); + int nbErrorLines = staticLayout.getLineCount(); + targetNbLines = Math.max(minNbErrorLines, nbErrorLines); + } + return targetNbLines; + } + + private boolean isSpinnerEmpty() { + return (hintAdapter.getCount() == 0 && hint == null) || (hintAdapter.getCount() == 1 && hint != null); + } + + /* + * ********************************************************************************** + * DRAWING METHODS + * ********************************************************************************** + */ + + + @Override + protected void onDraw(Canvas canvas) { + + super.onDraw(canvas); + int startX = 0; + int endX = getWidth(); + int lineHeight; + + int startYLine = getHeight() - getPaddingBottom() + underlineTopSpacing; + int startYFloatingLabel = (int) (getPaddingTop() - floatingLabelPercent * floatingLabelBottomSpacing); + + + if (error != null && enableErrorLabel) { + int errorLeftMargin = (int) context.getResources().getDimension(R.dimen.spinner_error_left_margin); + lineHeight = dpToPx(thicknessError); + int startYErrorLabel = startYLine + errorLabelSpacing + lineHeight; + paint.setColor(errorColor); + textPaint.setColor(errorColor); + //Error Label Drawing + if (multiline) { + canvas.save(); + canvas.translate(startX + errorLeftMargin + rightLeftSpinnerPadding, startYErrorLabel - errorLabelSpacing); + staticLayout.draw(canvas); + canvas.restore(); + + } else { + //scrolling + canvas.drawText(error.toString(), startX + errorLeftMargin + rightLeftSpinnerPadding - errorLabelPosX, startYErrorLabel, textPaint); + if (errorLabelPosX > 0) { + canvas.save(); + canvas.translate(textPaint.measureText(error.toString()) + getWidth() / 2, 0); + canvas.drawText(error.toString(), startX + errorLeftMargin + rightLeftSpinnerPadding - errorLabelPosX, startYErrorLabel, textPaint); + canvas.restore(); + } + } + + } else { + lineHeight = dpToPx(thickness); + if (isSelected || hasFocus()) { + paint.setColor(highlightColor); + } else { + paint.setColor(isEnabled() ? baseColor : disabledColor); + } + } + + // Underline Drawing + canvas.drawRect(startX, startYLine, endX, startYLine + lineHeight, paint); + + //Floating Label Drawing + if ((hint != null || floatingLabelText != null) && enableFloatingLabel) { + if (isSelected || hasFocus()) { + textPaint.setColor(highlightColor); + } else { + textPaint.setColor(isEnabled() ? floatingLabelColor : disabledColor); + } + if (floatingLabelAnimator.isRunning() || !floatingLabelVisible) { + textPaint.setAlpha((int) ((0.8 * floatingLabelPercent + 0.2) * baseAlpha * floatingLabelPercent)); + } + String textToDraw = floatingLabelText != null ? floatingLabelText.toString() : hint.toString(); + if (isRtl) { + canvas.drawText(textToDraw, getWidth() - rightLeftSpinnerPadding - textPaint.measureText(textToDraw), startYFloatingLabel, textPaint); + } else { + canvas.drawText(textToDraw, startX + rightLeftSpinnerPadding, startYFloatingLabel, textPaint); + } + } + + drawSelector(canvas, getWidth() - rightLeftSpinnerPadding, getPaddingTop() + dpToPx(8)); + + + } + + private void drawSelector(Canvas canvas, int posX, int posY) { + if (isSelected || hasFocus()) { + paint.setColor(highlightColor); + } else { + paint.setColor(isEnabled() ? arrowColor : disabledColor); + } + + Point point1 = selectorPoints[0]; + Point point2 = selectorPoints[1]; + Point point3 = selectorPoints[2]; + + point1.set(posX, posY); + point2.set((int) (posX - (arrowSize)), posY); + point3.set((int) (posX - (arrowSize / 2)), (int) (posY + (arrowSize / 2))); + + selectorPath.reset(); + selectorPath.moveTo(point1.x, point1.y); + selectorPath.lineTo(point2.x, point2.y); + selectorPath.lineTo(point3.x, point3.y); + selectorPath.close(); + canvas.drawPath(selectorPath, paint); + } + + /* + * ********************************************************************************** + * LISTENER METHODS + * ********************************************************************************** + */ + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (isEnabled()) { + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + isSelected = true; + break; + + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + isSelected = false; + break; + } + invalidate(); + } + return super.onTouchEvent(event); + } + + @Override + public void setOnItemSelectedListener(final OnItemSelectedListener listener) { + + final OnItemSelectedListener onItemSelectedListener = new OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + + if (hint != null || floatingLabelText != null) { + if (!floatingLabelVisible && position != 0) { + showFloatingLabel(); + } else if (floatingLabelVisible && position == 0) { + hideFloatingLabel(); + } + } + + if (position != lastPosition && error != null) { + setError(null); + } + lastPosition = position; + + if (listener != null) { + position = hint != null ? position - 1 : position; + listener.onItemSelected(parent, view, position, id); + } + } + + @Override + public void onNothingSelected(AdapterView parent) { + if (listener != null) { + listener.onNothingSelected(parent); + } + } + }; + + super.setOnItemSelectedListener(onItemSelectedListener); + } + + @Override + public void onAnimationUpdate(ValueAnimator animation) { + invalidate(); + } + + + /* + * ********************************************************************************** + * GETTERS AND SETTERS + * ********************************************************************************** + */ + + public int getBaseColor() { + return baseColor; + } + + public void setBaseColor(int baseColor) { + this.baseColor = baseColor; + textPaint.setColor(baseColor); + baseAlpha = textPaint.getAlpha(); + invalidate(); + } + + public int getHighlightColor() { + return highlightColor; + } + + public void setHighlightColor(int highlightColor) { + this.highlightColor = highlightColor; + invalidate(); + } + + public int getHintColor() { + return hintColor; + } + + public void setHintColor(int hintColor) { + this.hintColor = hintColor; + invalidate(); + } + + public int getErrorColor() { + return errorColor; + } + + public void setErrorColor(int errorColor) { + this.errorColor = errorColor; + invalidate(); + } + + public int getDisabledColor() { + return disabledColor; + } + + public void setDisabledColor(int disabledColor) { + this.disabledColor = disabledColor; + invalidate(); + } + + public void setHint(CharSequence hint) { + this.hint = hint; + invalidate(); + } + + public void setHint(int resid) { + CharSequence hint = getResources().getString(resid); + setHint(hint); + } + + public CharSequence getHint() { + return hint; + } + + public void setHintView(Integer resId){ + this.mHintView = resId; + } + + public void setDripDownHintView(Integer resId){ + this.mDropDownHintView = resId; + } + + public void setFloatingLabelText(CharSequence floatingLabelText) { + this.floatingLabelText = floatingLabelText; + invalidate(); + } + + public void setFloatingLabelText(int resid) { + String floatingLabelText = getResources().getString(resid); + setFloatingLabelText(floatingLabelText); + } + + public CharSequence getFloatingLabelText() { + return this.floatingLabelText; + } + public int getFloatingLabelColor() { + return floatingLabelColor; + } + + public void setFloatingLabelColor(int floatingLabelColor) { + this.floatingLabelColor = floatingLabelColor; + invalidate(); + } + + public boolean isMultiline() { + return multiline; + } + + public void setMultiline(boolean multiline) { + this.multiline = multiline; + invalidate(); + } + + public Typeface getTypeface() { + return typeface; + } + + public void setTypeface(Typeface typeface) { + this.typeface = typeface; + if (typeface != null) { + textPaint.setTypeface(typeface); + } + invalidate(); + } + + public boolean isAlignLabels() { + return alignLabels; + } + + public void setAlignLabels(boolean alignLabels) { + this.alignLabels = alignLabels; + rightLeftSpinnerPadding = alignLabels ? getResources().getDimensionPixelSize(R.dimen.right_left_spinner_padding) : 0; + invalidate(); + } + + public float getThickness() { + return thickness; + } + + public void setThickness(float thickness) { + this.thickness = thickness; + invalidate(); + } + + public float getThicknessError() { + return thicknessError; + } + + public void setThicknessError(float thicknessError) { + this.thicknessError = thicknessError; + invalidate(); + } + + public int getArrowColor() { + return arrowColor; + } + + public void setArrowColor(int arrowColor) { + this.arrowColor = arrowColor; + invalidate(); + } + + public float getArrowSize() { + return arrowSize; + } + + public void setArrowSize(float arrowSize) { + this.arrowSize = arrowSize; + invalidate(); + } + + public boolean isEnableErrorLabel() { + return enableErrorLabel; + } + + public void setEnableErrorLabel(boolean enableErrorLabel) { + this.enableErrorLabel = enableErrorLabel; + updateBottomPadding(); + invalidate(); + } + + public boolean isEnableFloatingLabel() { + return enableFloatingLabel; + } + + public void setEnableFloatingLabel(boolean enableFloatingLabel) { + this.enableFloatingLabel = enableFloatingLabel; + extraPaddingTop = enableFloatingLabel ? floatingLabelTopSpacing + floatingLabelInsideSpacing + floatingLabelBottomSpacing : floatingLabelBottomSpacing; + updateBottomPadding(); + invalidate(); + } + + public void setError(CharSequence error) { + this.error = error; + if (errorLabelAnimator != null) { + errorLabelAnimator.end(); + } + + if (multiline) { + startErrorMultilineAnimator(prepareBottomPadding()); + } else if (needScrollingAnimation()) { + startErrorScrollingAnimator(); + } + requestLayout(); + } + + public void setError(int resid) { + CharSequence error = getResources().getString(resid); + setError(error); + } + + @Override + public void setEnabled(boolean enabled) { + if (!enabled) { + isSelected = false; + invalidate(); + } + super.setEnabled(enabled); + } + + public CharSequence getError() { + return this.error; + } + + public void setRtl() { + isRtl = true; + invalidate(); + } + + public boolean isRtl() { + return isRtl; + } + + /** + * @deprecated {use @link #setPaddingSafe(int, int, int, int)} to keep internal computation OK + */ + @Deprecated + @Override + public void setPadding(int left, int top, int right, int bottom) { + super.setPadding(left, top, right, bottom); + } + + + public void setPaddingSafe(int left, int top, int right, int bottom) { + innerPaddingRight = right; + innerPaddingLeft = left; + innerPaddingTop = top; + innerPaddingBottom = bottom; + + updatePadding(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + + @Override + public void setAdapter(SpinnerAdapter adapter) { + hintAdapter = new HintAdapter(adapter, getContext()); + super.setAdapter(hintAdapter); + } + + @Override + public SpinnerAdapter getAdapter() { + return hintAdapter != null ? hintAdapter.getWrappedAdapter() : null; + } + + private float getFloatingLabelPercent() { + return floatingLabelPercent; + } + + private void setFloatingLabelPercent(float floatingLabelPercent) { + this.floatingLabelPercent = floatingLabelPercent; + } + + private int getErrorLabelPosX() { + return errorLabelPosX; + } + + private void setErrorLabelPosX(int errorLabelPosX) { + this.errorLabelPosX = errorLabelPosX; + } + + private float getCurrentNbErrorLines() { + return currentNbErrorLines; + } + + private void setCurrentNbErrorLines(float currentNbErrorLines) { + this.currentNbErrorLines = currentNbErrorLines; + updateBottomPadding(); + } + + @Override + public Object getItemAtPosition(int position) { + if (hint != null) { + position++; + } + return (hintAdapter == null || position < 0) ? null : hintAdapter.getItem(position); + } + + @Override + public long getItemIdAtPosition(int position) { + if (hint != null) { + position++; + } + return (hintAdapter == null || position < 0) ? INVALID_ROW_ID : hintAdapter.getItemId(position); + } + + /* + * ********************************************************************************** + * INNER CLASS + * ********************************************************************************** + */ + + private class HintAdapter extends BaseAdapter { + + private static final int HINT_TYPE = -1; + + private SpinnerAdapter mSpinnerAdapter; + private Context mContext; + + public HintAdapter(SpinnerAdapter spinnerAdapter, Context context) { + mSpinnerAdapter = spinnerAdapter; + mContext = context; + } + + + @Override + public int getViewTypeCount() { + //Workaround waiting for a Google correction (https://code.google.com/p/android/issues/detail?id=79011) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + return 1; + } + int viewTypeCount = mSpinnerAdapter.getViewTypeCount(); + return viewTypeCount; + } + + @Override + public int getItemViewType(int position) { + position = hint != null ? position - 1 : position; + return (position == -1) ? HINT_TYPE : mSpinnerAdapter.getItemViewType(position); + } + + @Override + public int getCount() { + int count = mSpinnerAdapter.getCount(); + return hint != null ? count + 1 : count; + } + + @Override + public Object getItem(int position) { + position = hint != null ? position - 1 : position; + return (position == -1) ? hint : mSpinnerAdapter.getItem(position); + } + + @Override + public long getItemId(int position) { + position = hint != null ? position - 1 : position; + return (position == -1) ? 0 : mSpinnerAdapter.getItemId(position); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + return buildView(position, convertView, parent, false); + } + + @Override + public View getDropDownView(int position, View convertView, ViewGroup parent) { + return buildView(position, convertView, parent, true); + } + + private View buildView(int position, View convertView, ViewGroup parent, boolean isDropDownView) { + if (getItemViewType(position) == HINT_TYPE) { + return getHintView(convertView, parent, isDropDownView); + } + //workaround to have multiple types in spinner + if (convertView != null) { + convertView = (convertView.getTag() != null && convertView.getTag() instanceof Integer && (Integer) convertView.getTag() != HINT_TYPE) ? convertView : null; + } + position = hint != null ? position - 1 : position; + return isDropDownView ? mSpinnerAdapter.getDropDownView(position, convertView, parent) : mSpinnerAdapter.getView(position, convertView, parent); + } + + private View getHintView(final View convertView, final ViewGroup parent, final boolean isDropDownView) { + + final LayoutInflater inflater = LayoutInflater.from(mContext); + final int resid = isDropDownView ? mDropDownHintView : mHintView; + final TextView textView = (TextView) inflater.inflate(resid, parent, false); + textView.setText(hint); + textView.setTextColor(MaterialSpinner.this.isEnabled() ? hintColor : disabledColor); + textView.setTag(HINT_TYPE); + return textView; + } + + private SpinnerAdapter getWrappedAdapter() { + return mSpinnerAdapter; + } + } +} \ No newline at end of file diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/RadioButton.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/RadioButton.java new file mode 100644 index 000000000..991f27bc0 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/RadioButton.java @@ -0,0 +1,79 @@ +package com.vijay.jsonwizard.customviews; + +import android.content.Context; +import android.util.AttributeSet; + +import com.rey.material.drawable.RadioButtonDrawable; + +/** + * Created by vijay on 5/18/15. + */ +public class RadioButton extends CompoundButton { + public RadioButton(Context context) { + super(context); + + init(context, null, 0, 0); + } + + public RadioButton(Context context, AttributeSet attrs) { + super(context, attrs); + + init(context, attrs, 0, 0); + } + + public RadioButton(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + init(context, attrs, defStyleAttr, 0); + } + + public RadioButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr); + + init(context, attrs, defStyleAttr, defStyleRes); + } + + private void init(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + applyStyle(context, attrs, defStyleAttr, defStyleRes); + } + + public void applyStyle(int resId) { + applyStyle(getContext(), null, 0, resId); + } + + private void applyStyle(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + RadioButtonDrawable drawable = new RadioButtonDrawable.Builder(context, attrs, defStyleAttr, defStyleRes) + .build(); + drawable.setInEditMode(isInEditMode()); + drawable.setAnimEnable(false); + setButtonDrawable(null); + setCompoundDrawablesWithIntrinsicBounds(null, null, drawable, null); + drawable.setAnimEnable(true); + } + + @Override + public void toggle() { + // we override to prevent toggle when the radio is already + // checked (as opposed to check boxes widgets) + if (!isChecked()) { + super.toggle(); + } + } + + /** + * Change the checked state of this button immediately without showing + * animation. + * + * @param checked + * The checked state. + */ + public void setCheckedImmediately(boolean checked) { + if (mButtonDrawable instanceof RadioButtonDrawable) { + RadioButtonDrawable drawable = (RadioButtonDrawable) mButtonDrawable; + drawable.setAnimEnable(false); + setChecked(checked); + drawable.setAnimEnable(true); + } else + setChecked(checked); + } +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/SelectableItemHolder.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/SelectableItemHolder.java new file mode 100644 index 000000000..92d33cfdf --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/SelectableItemHolder.java @@ -0,0 +1,96 @@ +package com.vijay.jsonwizard.customviews; + +import android.content.Context; +import android.text.TextUtils; +import android.util.TypedValue; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.github.johnkil.print.PrintView; +import com.unnamed.b.atv.model.TreeNode; +import com.vijay.jsonwizard.R; + +import java.util.ArrayList; +import java.util.List; + + +/** + * Created by Bogdan Melnychuk on 2/15/15. + */ +public class SelectableItemHolder extends TreeNode.BaseNodeViewHolder { + private RelativeLayout canvas; + private TextView tvValue; + private CheckBox nodeSelector; + private String levelLabel; + private int level; + private PrintView arrowView; + private Context context; + private TreeNode treeNode; + + public SelectableItemHolder(Context context, String levelLabel) { + super(context); + + this.context = context; + this.levelLabel = levelLabel; + } + + @Override + public View createNodeView(final TreeNode node, String value) { + final LayoutInflater inflater = LayoutInflater.from(context); + final View view = inflater.inflate(R.layout.layout_selectable_item, null, false); + + this.treeNode = node; + tvValue = (TextView) view.findViewById(R.id.node_value); + if(TextUtils.isEmpty(levelLabel)) { + tvValue.setText(value); + } else { + tvValue.setText(levelLabel + ": " + value); + } + tvValue.setTextSize(TypedValue.COMPLEX_UNIT_PX, + context.getResources().getDimension(R.dimen.default_text_size)); + arrowView = (PrintView) view.findViewById(R.id.arrowview); + arrowView.setIconFont("fonts/material/fonts/material-icon-font.ttf"); + + nodeSelector = (CheckBox) view.findViewById(R.id.node_selector); + nodeSelector.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + node.setSelected(isChecked); + if (isChecked) { + node.setExpanded(isChecked); + } + } + }); + nodeSelector.setChecked(node.isSelected()); + + view.findViewById(R.id.top_line).setVisibility(View.INVISIBLE); + view.findViewById(R.id.bot_line).setVisibility(View.INVISIBLE); + if (node.isLeaf()) { + arrowView.setIconText(context.getResources().getString(R.string.ic_check_circle_blank)); + } + + if (node.isFirstChild()) { + view.findViewById(R.id.top_line).setVisibility(View.INVISIBLE); + } + + return view; + } + + @Override + public void toggleSelectionMode(boolean editModeEnabled) { + nodeSelector.setVisibility(editModeEnabled ? View.VISIBLE : View.GONE); + nodeSelector.setChecked(mNode.isSelected()); + } + + @Override + public void toggle(boolean active) { + if (!mNode.isLeaf()) { + arrowView.setIconText(context.getResources().getString(active ? + R.string.ic_keyboard_arrow_down : R.string.ic_keyboard_arrow_right)); + } + } +} \ No newline at end of file diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/TreeViewDialog.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/TreeViewDialog.java new file mode 100644 index 000000000..984e65025 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/customviews/TreeViewDialog.java @@ -0,0 +1,184 @@ +package com.vijay.jsonwizard.customviews; + +import android.app.Dialog; +import android.content.Context; +import android.view.Window; +import android.widget.LinearLayout; + +import com.unnamed.b.atv.model.TreeNode; +import com.unnamed.b.atv.view.AndroidTreeView; +import com.vijay.jsonwizard.R; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; + +public class TreeViewDialog extends Dialog implements TreeNode.TreeNodeClickListener { + private static final String KEY_NODES = "nodes"; + private static final String KEY_LEVEL = "level"; + private static final String KEY_NAME = "name"; + private static final String KEY_KEY = "key"; + + private final Context context; + private ArrayList value; + private ArrayList name; + private HashMap treeNodeHashMap; + private TreeNode rootNode; + + public TreeViewDialog(Context context, JSONArray structure, ArrayList defaultValue, ArrayList value) throws + JSONException { + super(context); + this.context = context; + init(structure, defaultValue, value); + } + + public TreeViewDialog(Context context, int theme, JSONArray structure, ArrayList defaultValue, ArrayList value) throws JSONException { + super(context, theme); + this.context = context; + init(structure, defaultValue, value); + } + + protected TreeViewDialog(Context context, boolean cancelable, OnCancelListener + cancelListener, JSONArray structure, ArrayList defaultValue, ArrayList value) throws JSONException { + super(context, cancelable, cancelListener); + this.context = context; + init(structure, defaultValue, value); + } + + private void init(JSONArray nodes, ArrayList defaultValue, + final ArrayList value) throws JSONException { + requestWindowFeature(Window.FEATURE_NO_TITLE); + this.setContentView(R.layout.dialog_tree_view); + LinearLayout canvas = (LinearLayout) this.findViewById(R.id.canvas); + + + this.value = new ArrayList<>(); + this.name = new ArrayList<>(); + this.treeNodeHashMap = new HashMap<>(); + + JSONObject rootObject = new JSONObject(); + rootObject.put(KEY_KEY, ""); + rootObject.put(KEY_NAME, ""); + rootObject.put(KEY_LEVEL, ""); + rootObject.put(KEY_NODES, nodes); + rootNode = constructTreeView(rootObject, null, value == null || value.size() == 0 ? defaultValue : value); + + AndroidTreeView androidTreeView = new AndroidTreeView(context, rootNode); + androidTreeView.setDefaultContainerStyle(R.style.TreeNodeStyle); + + canvas.addView(androidTreeView.getView()); + + setValue(value); + } + + private TreeNode constructTreeView(JSONObject structure, TreeNode parent, ArrayList defaultValue) throws + JSONException { + String name = structure.getString(KEY_NAME); + String key = structure.getString(KEY_KEY); + TreeNode curNode = new TreeNode(name); + treeNodeHashMap.put(curNode, key); + curNode.setClickListener(this); + curNode.setViewHolder(new SelectableItemHolder(context, structure.getString(KEY_LEVEL))); + if (parent == null) { + curNode.setSelectable(false); + } + if (structure.has(KEY_NODES)) { + JSONArray options = structure.getJSONArray(KEY_NODES); + for (int i = 0; i < options.length(); i++) { + constructTreeView(options.getJSONObject(i), curNode, defaultValue); + } + } + + if (parent != null) { + if(parent.getLevel() == 0) { + setSelectedValue(curNode, 0, defaultValue, treeNodeHashMap); + } + parent.addChild(curNode); + } + + return curNode; + } + + private void extractName() { + if (value != null && value.size() > 0) { + HashMap reverseHashMap = new HashMap<>(); + for (TreeNode curNode : treeNodeHashMap.keySet()) { + reverseHashMap.put(treeNodeHashMap.get(curNode), curNode); + } + + for (String curLevel : value) { + name.add((String) reverseHashMap.get(curLevel).getValue()); + } + } + } + + @Override + public void onClick(TreeNode node, Object value) { + this.value = new ArrayList<>(); + this.name = new ArrayList<>(); + if (node.getChildren().size() == 0) { + ArrayList reversedValue = new ArrayList<>(); + retrieveValue(treeNodeHashMap, node, reversedValue); + + Collections.reverse(reversedValue); + this.value = reversedValue; + extractName(); + + dismiss(); + } + } + + private static void retrieveValue(HashMap treeNodeHashMap,TreeNode node, + ArrayList value) { + if (node.getParent() != null) { + value.add(getTreeNodeKey(treeNodeHashMap, node)); + retrieveValue(treeNodeHashMap, node.getParent(), value); + } + } + + private static String getTreeNodeKey(HashMap treeNodeHashMap,TreeNode node) { + if (treeNodeHashMap.containsKey(node)) { + return treeNodeHashMap.get(node); + } + return null; + } + + public ArrayList getValue() { + return this.value; + } + + public ArrayList getName() { + return this.name; + } + + private void setValue(final ArrayList value) { + this.value = value; + extractName(); + } + + private static void setSelectedValue(TreeNode treeNode, int level, ArrayList defaultValue, HashMap treeNodeHashMap) { + if (treeNode != null) { + if (defaultValue != null) { + if (level >= 0 && level < defaultValue.size()) { + String levelValue = defaultValue.get(level); + String nodeValue = getTreeNodeKey(treeNodeHashMap, treeNode); + if (nodeValue != null && nodeValue.equals(levelValue)) { + treeNode.setExpanded(true); + List children = treeNode.getChildren(); + for (TreeNode curChild : children) { + setSelectedValue(curChild, level + 1, defaultValue, treeNodeHashMap); + } + return; + } + } + } + + treeNode.setExpanded(false); + } + } +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/fragments/JsonFormFragment.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/fragments/JsonFormFragment.java new file mode 100644 index 000000000..f06ad87bf --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/fragments/JsonFormFragment.java @@ -0,0 +1,385 @@ +package com.vijay.jsonwizard.fragments; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v7.app.ActionBar; +import android.support.v7.widget.Toolbar; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.CompoundButton; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ScrollView; +import android.widget.Toast; + +import com.rengwuxian.materialedittext.MaterialEditText; +import com.vijay.jsonwizard.R; +import com.vijay.jsonwizard.activities.JsonFormActivity; +import com.vijay.jsonwizard.customviews.RadioButton; +import com.vijay.jsonwizard.interfaces.CommonListener; +import com.vijay.jsonwizard.interfaces.JsonApi; +import com.vijay.jsonwizard.mvp.MvpFragment; +import com.vijay.jsonwizard.presenters.JsonFormFragmentPresenter; +import com.vijay.jsonwizard.views.JsonFormFragmentView; +import com.vijay.jsonwizard.viewstates.JsonFormFragmentViewState; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by vijay on 5/7/15. + */ +public class JsonFormFragment extends MvpFragment implements + CommonListener, JsonFormFragmentView { + private static final String TAG = "JsonFormFragment"; + private LinearLayout mMainView; + private ScrollView mScrollView; + private Menu mMenu; + private JsonApi mJsonApi; + private Map> lookUpMap = new HashMap<>(); + + @Override + public void onAttach(Activity activity) { + mJsonApi = (JsonApi) activity; + super.onAttach(activity); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + setHasOptionsMenu(true); + super.onCreate(savedInstanceState); + } + + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_json_wizard, null); + mMainView = (LinearLayout) rootView.findViewById(R.id.main_layout); + mScrollView = (ScrollView) rootView.findViewById(R.id.scroll_view); + return rootView; + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + mJsonApi.clearFormDataViews(); + presenter.addFormElements(); + mJsonApi.refreshSkipLogic(null, null); + mJsonApi.refreshConstraints(null, null); + } + + @Override + protected JsonFormFragmentViewState createViewState() { + return new JsonFormFragmentViewState(); + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + super.onCreateOptionsMenu(menu, inflater); + mMenu = menu; + menu.clear(); + inflater.inflate(R.menu.menu_toolbar, menu); + presenter.setUpToolBar(); + } + + @Override + public void setActionBarTitle(String title) { + getSupportActionBar().setTitle(title); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == android.R.id.home) { + presenter.onBackClick(); + return true; + } else if (item.getItemId() == R.id.action_next) { + return next(); + } else if (item.getItemId() == R.id.action_save) { + return save(); + } + return super.onOptionsItemSelected(item); + } + + public boolean save() { + try { + presenter.onSaveClick(mMainView); + return true; + } catch (Exception e) { + Log.e(TAG, Log.getStackTraceString(e)); + } + + return false; + } + + public boolean next() { + try { + presenter.onNextClick(mMainView); + return true; + } catch (Exception e) { + Log.e(TAG, Log.getStackTraceString(e)); + } + + return false; + } + + @Override + public void onClick(View v) { + presenter.onClick(v); + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + presenter.onActivityResult(requestCode, resultCode, data); + super.onActivityResult(requestCode, resultCode, data); + } + + @Override + public void onDetach() { + mJsonApi = null; + super.onDetach(); + } + + @Override + public void updateRelevantImageView(Bitmap bitmap, String imagePath, String currentKey) { + int childCount = mMainView.getChildCount(); + for (int i = 0; i < childCount; i++) { + View view = mMainView.getChildAt(i); + if (view instanceof ImageView) { + ImageView imageView = (ImageView) view; + String key = (String) imageView.getTag(R.id.key); + if (key.equals(currentKey)) { + imageView.setImageBitmap(bitmap); + imageView.setVisibility(View.VISIBLE); + imageView.setTag(R.id.imagePath, imagePath); + } + } + } + } + + @Override + public void writeValue(String stepName, String key, String s, String openMrsEntityParent, + String openMrsEntity, String openMrsEntityId) { + try { + mJsonApi.writeValue(stepName, key, s, openMrsEntityParent, openMrsEntity, openMrsEntityId); + } catch (JSONException e) { + // TODO - handle + e.printStackTrace(); + } + } + + @Override + public void writeValue(String stepName, String prentKey, String childObjectKey, String childKey, + String value, String openMrsEntityParent, String openMrsEntity, + String openMrsEntityId) { + Log.d("RealtimeValidation", "Fragment write value called"); + try { + mJsonApi.writeValue(stepName, prentKey, childObjectKey, childKey, value, + openMrsEntityParent, openMrsEntity, openMrsEntityId); + } catch (JSONException e) { + // TODO - handle + e.printStackTrace(); + } + } + + @Override + public void writeMetaDataValue(String metaDataKey, Map values) { + Log.d("RealtimeValidation", "Fragment write value called"); + try { + mJsonApi.writeMetaDataValue(metaDataKey, values); + } catch (JSONException e) { + // TODO - handle + e.printStackTrace(); + } + } + + @Override + public JSONObject getStep(String stepName) { + return mJsonApi.getStep(stepName); + } + + @Override + public String getCurrentJsonState() { + return mJsonApi.currentJsonState(); + } + + @Override + protected JsonFormFragmentPresenter createPresenter() { + return new JsonFormFragmentPresenter(this); + } + + @Override + public Context getContext() { + return getActivity(); + } + + @Override + public void showToast(String message) { + Toast.makeText(getActivity(), message, Toast.LENGTH_SHORT).show(); + } + + + @Override + public CommonListener getCommonListener() { + return this; + } + + @Override + public void addFormElements(List views) { + for (View view : views) { + mMainView.addView(view); + } + mJsonApi.refreshHiddenViews(); + mJsonApi.resetFocus(); + } + + @Override + public ActionBar getSupportActionBar() { + return ((JsonFormActivity) getActivity()).getSupportActionBar(); + } + + @Override + public Toolbar getToolbar() { + return ((JsonFormActivity) getActivity()).getToolbar(); + } + + @Override + public void setToolbarTitleColor(int colorId) { + getToolbar().setTitleTextColor(getContext().getResources().getColor(colorId)); + } + + @Override + public void updateVisibilityOfNextAndSave(boolean next, boolean save) { + mMenu.findItem(R.id.action_next).setVisible(next); + mMenu.findItem(R.id.action_save).setVisible(save); + } + + @Override + public void hideKeyBoard() { + super.hideSoftKeyboard(); + } + + @Override + public void backClick() { + getActivity().onBackPressed(); + } + + @Override + public void unCheckAllExcept(String parentKey, String childKey) { + int childCount = mMainView.getChildCount(); + for (int i = 0; i < childCount; i++) { + View view = mMainView.getChildAt(i); + if (view instanceof RadioButton) { + RadioButton radio = (RadioButton) view; + String parentKeyAtIndex = (String) radio.getTag(R.id.key); + String childKeyAtIndex = (String) radio.getTag(R.id.childKey); + if (parentKeyAtIndex.equals(parentKey) && !childKeyAtIndex.equals(childKey)) { + radio.setChecked(false); + } + } + } + } + + @Override + public String getCount() { + return mJsonApi.getCount(); + } + + @Override + public void onFormStart() { + mJsonApi.onFormStart(); + } + + @Override + public void onFormFinish() { + mJsonApi.onFormFinish(); + } + + @Override + public void scrollToView(final View view) { + view.requestFocus(); + if (!(view instanceof MaterialEditText)) { + mScrollView.post(new Runnable() { + @Override + public void run() { + int y = view.getBottom() - view.getHeight(); + if (y < 0) y = 0; + mScrollView.scrollTo(0, y); + } + }); + } + } + + @Override + public void finishWithResult(Intent returnIntent) { + getActivity().setResult(Activity.RESULT_OK, returnIntent); + getActivity().finish(); + } + + @Override + public void setUpBackButton() { + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + } + + @Override + public void transactThis(JsonFormFragment next) { + getActivity() + .getSupportFragmentManager() + .beginTransaction() + .setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left, R.anim.enter_from_left, + R.anim.exit_to_right).replace(R.id.container, next) + .addToBackStack(next.getClass().getSimpleName()).commit(); + } + + public static JsonFormFragment getFormFragment(String stepName) { + JsonFormFragment jsonFormFragment = new JsonFormFragment(); + Bundle bundle = new Bundle(); + bundle.putString("stepName", stepName); + jsonFormFragment.setArguments(bundle); + return jsonFormFragment; + } + + public Menu getMenu() { + return mMenu; + } + + public JsonApi getJsonApi() { + return mJsonApi; + } + + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + presenter.onCheckedChanged(buttonView, isChecked); + } + + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + presenter.onItemSelected(parent, view, position, id); + } + + @Override + public void onNothingSelected(AdapterView parent) { + + } + + public LinearLayout getMainView() { + return mMainView; + } + + public Map> getLookUpMap() { + return lookUpMap; + } +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/interactors/JsonFormInteractor.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/interactors/JsonFormInteractor.java new file mode 100644 index 000000000..f178414d4 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/interactors/JsonFormInteractor.java @@ -0,0 +1,147 @@ +package com.vijay.jsonwizard.interactors; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import android.content.Context; +import android.util.Log; +import android.view.View; + +import com.vijay.jsonwizard.constants.JsonFormConstants; +import com.vijay.jsonwizard.fragments.JsonFormFragment; +import com.vijay.jsonwizard.interfaces.CommonListener; +import com.vijay.jsonwizard.interfaces.FormWidgetFactory; +import com.vijay.jsonwizard.widgets.BarcodeFactory; +import com.vijay.jsonwizard.widgets.ButtonFactory; +import com.vijay.jsonwizard.widgets.CheckBoxFactory; +import com.vijay.jsonwizard.widgets.DatePickerFactory; +import com.vijay.jsonwizard.widgets.EditTextFactory; +import com.vijay.jsonwizard.widgets.ImagePickerFactory; +import com.vijay.jsonwizard.widgets.LabelFactory; +import com.vijay.jsonwizard.widgets.RadioButtonFactory; +import com.vijay.jsonwizard.widgets.SectionFactory; +import com.vijay.jsonwizard.widgets.SpinnerFactory; +import com.vijay.jsonwizard.widgets.TreeViewFactory; + +/** + * Created by vijay on 5/19/15. + */ +public class JsonFormInteractor { + + private static final String TAG = "JsonFormInteractor"; + protected static final Map map = new HashMap<>(); + private static final JsonFormInteractor INSTANCE = new JsonFormInteractor(); + + protected JsonFormInteractor() { + registerWidgets(); + } + + protected void registerWidgets() { + map.put(JsonFormConstants.SECTION_LABEL, new SectionFactory()); + map.put(JsonFormConstants.EDIT_TEXT, new EditTextFactory()); + map.put(JsonFormConstants.LABEL, new LabelFactory()); + map.put(JsonFormConstants.CHECK_BOX, new CheckBoxFactory()); + map.put(JsonFormConstants.RADIO_BUTTON, new RadioButtonFactory()); + map.put(JsonFormConstants.CHOOSE_IMAGE, new ImagePickerFactory()); + map.put(JsonFormConstants.SPINNER, new SpinnerFactory()); + map.put(JsonFormConstants.DATE_PICKER, new DatePickerFactory()); + map.put(JsonFormConstants.TREE, new TreeViewFactory()); + map.put(JsonFormConstants.BARCODE, new BarcodeFactory()); + map.put(JsonFormConstants.BUTTON, new ButtonFactory()); + } + + public List fetchFormElements(String stepName, JsonFormFragment formFragment, + JSONObject parentJson, CommonListener listener) { + Log.d(TAG, "fetchFormElements called"); + List viewsFromJson = new ArrayList<>(5); + try { + + if (parentJson.has(JsonFormConstants.SECTIONS) && parentJson.get(JsonFormConstants.SECTIONS) instanceof JSONArray) { + JSONArray sections = parentJson.getJSONArray(JsonFormConstants.SECTIONS); + fetchSections(viewsFromJson, stepName, formFragment, sections, listener); + + } else if (parentJson.has(JsonFormConstants.FIELDS) && parentJson.get(JsonFormConstants.FIELDS) instanceof JSONArray) { + JSONArray fields = parentJson.getJSONArray(JsonFormConstants.FIELDS); + fetchFields(viewsFromJson, stepName, formFragment, fields, listener); + } + + } catch (JSONException e) { + Log.d(TAG, "Json exception occurred : " + e.getMessage()); + e.printStackTrace(); + } + return viewsFromJson; + } + + private void fetchSections(List viewsFromJson, String stepName, JsonFormFragment formFragment, + JSONArray sections, CommonListener listener) { + + try { + if (sections == null || sections.length() == 0) { + return; + } + + for (int i = 0; i < sections.length(); i++) { + JSONObject sectionJson = sections.getJSONObject(i); + + if (sectionJson.has(JsonFormConstants.NAME)) { + fetchViews(viewsFromJson, stepName, formFragment, JsonFormConstants.SECTION_LABEL, sectionJson, listener); + } + + if (sectionJson.has(JsonFormConstants.FIELDS)) { + JSONArray fields = sectionJson.getJSONArray(JsonFormConstants.FIELDS); + fetchFields(viewsFromJson, stepName, formFragment, fields, listener); + } + + + } + } catch (JSONException e) { + Log.d(TAG, "Json exception occurred : " + e.getMessage()); + e.printStackTrace(); + } + } + + private void fetchFields(List viewsFromJson, String stepName, JsonFormFragment formFragment, + JSONArray fields, CommonListener listener) { + + try { + if (fields == null || fields.length() == 0) { + return; + } + + for (int i = 0; i < fields.length(); i++) { + JSONObject childJson = fields.getJSONObject(i); + fetchViews(viewsFromJson, stepName, formFragment, childJson.getString(JsonFormConstants.TYPE), childJson, listener); + } + } catch (JSONException e) { + Log.d(TAG, "Json exception occurred : " + e.getMessage()); + e.printStackTrace(); + } + } + + private void fetchViews(List viewsFromJson, String stepName, JsonFormFragment formFragment, + String type, JSONObject jsonObject, CommonListener listener) { + + try { + List views = map.get(type).getViewsFromJson(stepName, formFragment.getContext(), formFragment, jsonObject, listener); + if (views.size() > 0) { + viewsFromJson.addAll(views); + } + } catch (Exception e) { + Log.d(TAG, + "Exception occurred in making view : Exception is : " + + e.getMessage()); + e.printStackTrace(); + } + + } + + public static JsonFormInteractor getInstance() { + return INSTANCE; + } +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/interfaces/CommonListener.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/interfaces/CommonListener.java new file mode 100644 index 000000000..b941d94c9 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/interfaces/CommonListener.java @@ -0,0 +1,11 @@ +package com.vijay.jsonwizard.interfaces; + +import android.view.View; +import android.widget.CompoundButton; +import android.widget.Spinner; + +/** + * Created by vijay on 5/17/15. + */ +public interface CommonListener extends View.OnClickListener, CompoundButton.OnCheckedChangeListener, Spinner.OnItemSelectedListener { +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/interfaces/FormWidgetFactory.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/interfaces/FormWidgetFactory.java new file mode 100644 index 000000000..fd21a644a --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/interfaces/FormWidgetFactory.java @@ -0,0 +1,17 @@ +package com.vijay.jsonwizard.interfaces; + +import android.content.Context; +import android.view.View; + +import com.vijay.jsonwizard.fragments.JsonFormFragment; + +import org.json.JSONObject; + +import java.util.List; + +/** + * Created by vijay on 24-05-2015. + */ +public interface FormWidgetFactory { + List getViewsFromJson(String stepName, Context context, JsonFormFragment formFragment, JSONObject jsonObject, CommonListener listener) throws Exception; +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/interfaces/JsonApi.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/interfaces/JsonApi.java new file mode 100644 index 000000000..9ddc26f8c --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/interfaces/JsonApi.java @@ -0,0 +1,65 @@ +package com.vijay.jsonwizard.interfaces; + +import android.view.View; + +import com.vijay.jsonwizard.interactors.JsonFormInteractor; +import com.vijay.jsonwizard.views.JsonFormFragmentView; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +/** + * Created by vijay on 5/16/15. + */ +public interface JsonApi { + JSONObject getStep(String stepName); + + void writeValue(String stepName, String key, String value, String openMrsEntityParent, + String openMrsEntity, String openMrsEntityId) throws JSONException; + + void writeValue(String stepName, String prentKey, String childObjectKey, String childKey, + String value, String openMrsEntityParent, String openMrsEntity, + String openMrsEntityId) + throws JSONException; + + void writeMetaDataValue(String metaDataKey, Map values) + throws JSONException; + + String currentJsonState(); + + String getCount(); + + void onFormStart(); + + void onFormFinish(); + + void clearSkipLogicViews(); + + void clearConstrainedViews(); + + void clearFormDataViews(); + + void addSkipLogicView(View view); + + void addConstrainedView(View view); + + void refreshHiddenViews(); + + void refreshSkipLogic(String parentKey, String childKey); + + void addFormDataView(View view); + + ArrayList getFormDataViews(); + + JSONObject getObjectUsingAddress(String[] address) throws JSONException; + + void refreshConstraints(String parentKey, String childKey); + + void addOnActivityResultListener(Integer requestCode, OnActivityResultListener onActivityResultListener); + + void resetFocus(); +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/interfaces/OnActivityResultListener.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/interfaces/OnActivityResultListener.java new file mode 100644 index 000000000..7bd9cbb9d --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/interfaces/OnActivityResultListener.java @@ -0,0 +1,11 @@ +package com.vijay.jsonwizard.interfaces; + +import android.content.Intent; + +/** + * Created by Jason Rogena - jrogena@ona.io on 20/03/2017. + */ + +public interface OnActivityResultListener { + void onActivityResult(int requestCode, int resultCode, Intent data); +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/BaseActivity.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/BaseActivity.java new file mode 100644 index 000000000..e2f14b478 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/BaseActivity.java @@ -0,0 +1,58 @@ +package com.vijay.jsonwizard.mvp; + +import android.os.Bundle; +import android.support.v7.app.ActionBarActivity; +import android.view.View; +import android.view.ViewGroup; + +/** + * Created by vijay on 4/21/15. + */ +public abstract class BaseActivity extends ActionBarActivity { + // @Icicle + VS mViewState; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + // Icepick.restoreInstanceState(this, savedInstanceState); + if (savedInstanceState == null) { + mViewState = createViewState(); + mViewState.setSavedInstance(false); + } else { + mViewState.setSavedInstance(true); + } + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + // Icepick.saveInstanceState(this, outState); + } + + @Override + public void setContentView(int layoutResID) { + super.setContentView(layoutResID); + } + + @Override + public void setContentView(View view) { + super.setContentView(view); + } + + @Override + public void setContentView(View view, ViewGroup.LayoutParams params) { + super.setContentView(view, params); + } + + @Override + public void addContentView(View view, ViewGroup.LayoutParams params) { + super.addContentView(view, params); + } + + protected abstract VS createViewState(); + + public VS getViewState() { + return mViewState; + } +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/BaseFragment.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/BaseFragment.java new file mode 100644 index 000000000..6ba0409de --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/BaseFragment.java @@ -0,0 +1,73 @@ +package com.vijay.jsonwizard.mvp; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +/** + * Created by vijay on 4/19/15. + */ +public abstract class BaseFragment extends Fragment { + + // @Icicle + VS mViewState; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + // Icepick.restoreInstanceState(this, savedInstanceState); + if (savedInstanceState == null) { + mViewState = createViewState(); + mViewState.setSavedInstance(false); + } else if(mViewState != null){ + mViewState.setSavedInstance(true); + } + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + // Icepick.saveInstanceState(this, outState); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + int layoutRes = getLayoutRes(); + if (layoutRes == 0) { + throw new IllegalArgumentException("getLayoutRes() returned 0, which is not allowed. " + + "If you don't want to use getLayoutRes() but implement your own view for this " + + "fragment manually, then you have to override onCreateView();"); + } else { + View v = inflater.inflate(layoutRes, container, false); + return v; + } + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + } + + /** + * Return the layout resource like R.layout.my_layout + * + * @return the layout resource or null, if you don't want to have an UI + */ + protected int getLayoutRes() { + return 0; + } + + protected abstract VS createViewState(); + + public VS getViewState() { + return mViewState; + } +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/MvpActivity.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/MvpActivity.java new file mode 100644 index 000000000..2d598083e --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/MvpActivity.java @@ -0,0 +1,24 @@ +package com.vijay.jsonwizard.mvp; + +import android.os.Bundle; + +public abstract class MvpActivity

extends BaseActivity implements + MvpView { + + protected P presenter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + presenter = createPresenter(); + presenter.attachView(this); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + presenter.detachView(false); + } + + protected abstract P createPresenter(); +} \ No newline at end of file diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/MvpBasePresenter.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/MvpBasePresenter.java new file mode 100644 index 000000000..5ec36ca16 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/MvpBasePresenter.java @@ -0,0 +1,37 @@ +package com.vijay.jsonwizard.mvp; + +import java.lang.ref.WeakReference; + +public class MvpBasePresenter implements MvpPresenter { + + private WeakReference viewRef; + + @Override + public void attachView(V view) { + viewRef = new WeakReference(view); + } + + /** + * Get the attached view. You should always call {@link #isViewAttached()} + * to check if the view is attached to avoid NullPointerExceptions + */ + protected V getView() { + return viewRef.get(); + } + + /** + * Checks if a view is attached to this presenter. You should always call + * this method before calling {@link #getView()} to get the view instance. + */ + protected boolean isViewAttached() { + return viewRef != null && viewRef.get() != null; + } + + @Override + public void detachView(boolean retainInstance) { + if (viewRef != null) { + viewRef.clear(); + viewRef = null; + } + } +} \ No newline at end of file diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/MvpFragment.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/MvpFragment.java new file mode 100644 index 000000000..8350f5d63 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/MvpFragment.java @@ -0,0 +1,48 @@ +package com.vijay.jsonwizard.mvp; + +import android.content.Context; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.View; +import android.view.inputmethod.InputMethodManager; + +public abstract class MvpFragment

extends BaseFragment implements + MvpView { + + protected P presenter; + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + // Create the presenter if needed + if (presenter == null) { + presenter = createPresenter(); + } + presenter.attachView(this); + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + presenter.detachView(getRetainInstance()); + } + + protected abstract P createPresenter(); + + public void hideSoftKeyboard() { + // Check if no view has focus: + View view = getActivity().getCurrentFocus(); + if (view != null) { + InputMethodManager inputManager = (InputMethodManager) getActivity().getSystemService( + Context.INPUT_METHOD_SERVICE); + inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); + } + } +} \ No newline at end of file diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/MvpPresenter.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/MvpPresenter.java new file mode 100644 index 000000000..a9508a571 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/MvpPresenter.java @@ -0,0 +1,8 @@ +package com.vijay.jsonwizard.mvp; + +public interface MvpPresenter { + + public void attachView(V view); + + public void detachView(boolean retainInstance); +} \ No newline at end of file diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/MvpView.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/MvpView.java new file mode 100644 index 000000000..971479299 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/MvpView.java @@ -0,0 +1,4 @@ +package com.vijay.jsonwizard.mvp; + +public interface MvpView { +} \ No newline at end of file diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/ViewState.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/ViewState.java new file mode 100644 index 000000000..626cd6a78 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/mvp/ViewState.java @@ -0,0 +1,38 @@ +package com.vijay.jsonwizard.mvp; + +import android.os.Parcel; +import android.os.Parcelable; + +/** + * Created by vijay on 4/25/15. + */ +public class ViewState implements Parcelable { + + private boolean mIsSavedInstance; + + public boolean isSavedInstance() { + return mIsSavedInstance; + } + + public void setSavedInstance(boolean isSavedInstance) { + mIsSavedInstance = isSavedInstance; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeByte(mIsSavedInstance ? (byte) 1 : (byte) 0); + } + + public ViewState() { + } + + protected ViewState(Parcel in) { + this.mIsSavedInstance = in.readByte() != 0; + } + +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/presenters/JsonFormFragmentPresenter.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/presenters/JsonFormFragmentPresenter.java new file mode 100644 index 000000000..951a067e3 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/presenters/JsonFormFragmentPresenter.java @@ -0,0 +1,319 @@ +package com.vijay.jsonwizard.presenters; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.net.Uri; +import android.os.Environment; +import android.provider.MediaStore; +import android.support.v4.content.FileProvider; +import android.util.Log; +import android.view.View; +import android.widget.AdapterView; +import android.widget.CompoundButton; +import android.widget.DatePicker; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.Toast; + +import com.rengwuxian.materialedittext.MaterialEditText; +import com.vijay.jsonwizard.R; +import com.vijay.jsonwizard.constants.JsonFormConstants; +import com.vijay.jsonwizard.customviews.CheckBox; +import com.vijay.jsonwizard.customviews.MaterialSpinner; +import com.vijay.jsonwizard.customviews.RadioButton; +import com.vijay.jsonwizard.fragments.JsonFormFragment; +import com.vijay.jsonwizard.interactors.JsonFormInteractor; +import com.vijay.jsonwizard.mvp.MvpBasePresenter; +import com.vijay.jsonwizard.utils.ImageUtils; +import com.vijay.jsonwizard.utils.ValidationStatus; +import com.vijay.jsonwizard.views.JsonFormFragmentView; +import com.vijay.jsonwizard.viewstates.JsonFormFragmentViewState; +import com.vijay.jsonwizard.widgets.DatePickerFactory; +import com.vijay.jsonwizard.widgets.EditTextFactory; +import com.vijay.jsonwizard.widgets.ImagePickerFactory; +import com.vijay.jsonwizard.widgets.SpinnerFactory; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.File; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +import static com.vijay.jsonwizard.utils.FormUtils.dpToPixels; + +/** + * Created by vijay on 5/14/15. + */ +public class JsonFormFragmentPresenter extends MvpBasePresenter> { + private static final String TAG = "FormFragmentPresenter"; + private static final int RESULT_LOAD_IMG = 1; + private String mStepName; + private JSONObject mStepDetails; + private String mCurrentKey; + private String mCurrentPhotoPath; + private JsonFormInteractor mJsonFormInteractor; + private final JsonFormFragment formFragment; + + public JsonFormFragmentPresenter(JsonFormFragment formFragment) { + this.formFragment = formFragment; + mJsonFormInteractor = JsonFormInteractor.getInstance(); + } + + public JsonFormFragmentPresenter(JsonFormFragment formFragment, JsonFormInteractor jsonFormInteractor) { + this(formFragment); + mJsonFormInteractor = jsonFormInteractor; + } + + public void addFormElements() { + mStepName = getView().getArguments().getString("stepName"); + JSONObject step = getView().getStep(mStepName); + try { + mStepDetails = new JSONObject(step.toString()); + } catch (JSONException e) { + e.printStackTrace(); + } + List views = mJsonFormInteractor.fetchFormElements(mStepName, formFragment, mStepDetails, + getView().getCommonListener()); + getView().addFormElements(views); + + } + + @SuppressLint("ResourceAsColor") + public void setUpToolBar() { + if (!mStepName.equals(JsonFormConstants.FIRST_STEP_NAME)) { + getView().setUpBackButton(); + } + getView().setActionBarTitle(mStepDetails.optString("title")); + if (mStepDetails.has("next")) { + getView().updateVisibilityOfNextAndSave(true, false); + } else { + getView().updateVisibilityOfNextAndSave(false, true); + } + getView().setToolbarTitleColor(R.color.white); + } + + public void onBackClick() { + getView().hideKeyBoard(); + getView().backClick(); + } + + public void onNextClick(LinearLayout mainView) { + ValidationStatus validationStatus = writeValuesAndValidate(mainView); + if (validationStatus.isValid()) { + JsonFormFragment next = JsonFormFragment.getFormFragment(mStepDetails.optString("next")); + getView().hideKeyBoard(); + getView().transactThis(next); + } else { + validationStatus.requestAttention(); + getView().showToast(validationStatus.getErrorMessage()); + } + } + + public ValidationStatus writeValuesAndValidate(LinearLayout mainView) { + ValidationStatus firstError = null; + for (View childAt : formFragment.getJsonApi().getFormDataViews()) { + String key = (String) childAt.getTag(R.id.key); + String openMrsEntityParent = (String) childAt.getTag(R.id.openmrs_entity_parent); + String openMrsEntity = (String) childAt.getTag(R.id.openmrs_entity); + String openMrsEntityId = (String) childAt.getTag(R.id.openmrs_entity_id); + + ValidationStatus validationStatus = validate(getView(), childAt, firstError == null); + if (firstError == null && !validationStatus.isValid()) { + firstError = validationStatus; + } + + if (childAt instanceof MaterialEditText) { + MaterialEditText editText = (MaterialEditText) childAt; + + String rawValue = (String) editText.getTag(R.id.raw_value); + if (rawValue == null) { + rawValue = editText.getText().toString(); + } + + getView().writeValue(mStepName, key, rawValue, + openMrsEntityParent, openMrsEntity, openMrsEntityId); + } else if (childAt instanceof ImageView) { + Object path = childAt.getTag(R.id.imagePath); + if (path instanceof String) { + getView().writeValue(mStepName, key, (String) path, openMrsEntityParent, + openMrsEntity, openMrsEntityId); + } + } else if (childAt instanceof CheckBox) { + String parentKey = (String) childAt.getTag(R.id.key); + String childKey = (String) childAt.getTag(R.id.childKey); + getView().writeValue(mStepName, parentKey, JsonFormConstants.OPTIONS_FIELD_NAME, childKey, + String.valueOf(((CheckBox) childAt).isChecked()), openMrsEntityParent, + openMrsEntity, openMrsEntityId); + } else if (childAt instanceof RadioButton) { + String parentKey = (String) childAt.getTag(R.id.key); + String childKey = (String) childAt.getTag(R.id.childKey); + if (((RadioButton) childAt).isChecked()) { + getView().writeValue(mStepName, parentKey, childKey, openMrsEntityParent, + openMrsEntity, openMrsEntityId); + } + } else if (childAt instanceof MaterialSpinner) { + } + } + + if (firstError == null) { + return new ValidationStatus(true, null, null, null); + } else { + return firstError; + } + } + + public static ValidationStatus validate(JsonFormFragmentView formFragmentView, View childAt, boolean requestFocus) { + if (childAt instanceof MaterialEditText) { + MaterialEditText editText = (MaterialEditText) childAt; + ValidationStatus validationStatus = EditTextFactory.validate(formFragmentView, editText); + if (!validationStatus.isValid()) { + if (requestFocus) validationStatus.requestAttention(); + return validationStatus; + } + } else if (childAt instanceof ImageView) { + ValidationStatus validationStatus = ImagePickerFactory.validate(formFragmentView, + (ImageView) childAt); + if (!validationStatus.isValid()) { + if (requestFocus) validationStatus.requestAttention(); + return validationStatus; + } + } else if (childAt instanceof MaterialSpinner) { + MaterialSpinner spinner = (MaterialSpinner) childAt; + ValidationStatus validationStatus = SpinnerFactory.validate(formFragmentView, spinner); + if (!validationStatus.isValid()) { + if (requestFocus) validationStatus.requestAttention(); + spinner.setError(validationStatus.getErrorMessage()); + return validationStatus; + } else { + spinner.setError(null); + } + } + + return new ValidationStatus(true, null, null, null); + } + + public void onSaveClick(LinearLayout mainView) { + ValidationStatus validationStatus = writeValuesAndValidate(mainView); + if (validationStatus.isValid()) { + Intent returnIntent = new Intent(); + getView().onFormFinish(); + returnIntent.putExtra("json", getView().getCurrentJsonState()); + getView().finishWithResult(returnIntent); + } else { + Toast.makeText(getView().getContext(), validationStatus.getErrorMessage(), Toast.LENGTH_LONG); + validationStatus.requestAttention(); + } + } + + public void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == RESULT_LOAD_IMG && resultCode == Activity.RESULT_OK) { + String imagePath = mCurrentPhotoPath; + getView().updateRelevantImageView(ImageUtils.loadBitmapFromFile(getView().getContext(), imagePath, ImageUtils.getDeviceWidth(getView().getContext()), dpToPixels(getView().getContext(), 200)), imagePath, mCurrentKey); + //cursor.close(); + } + } + + public void onClick(View v) { + String key = (String) v.getTag(R.id.key); + String type = (String) v.getTag(R.id.type); + if (JsonFormConstants.CHOOSE_IMAGE.equals(type)) { + getView().hideKeyBoard(); + mCurrentKey = key; + Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + if (takePictureIntent.resolveActivity(getView().getContext().getPackageManager()) != null) { + File imageFile = null; + try { + imageFile = createImageFile(); + } catch (IOException e) { + Log.e(TAG, Log.getStackTraceString(e)); + } + + if (imageFile != null) { + Uri photoURI = FileProvider.getUriForFile(getView().getContext(), + "com.vijay.jsonwizard.fileprovider", + imageFile); + + // Grant permission to the default camera app + PackageManager packageManager = getView().getContext().getPackageManager(); + Context applicationContext = getView().getContext().getApplicationContext(); + + applicationContext.grantUriPermission( + takePictureIntent.resolveActivity(packageManager).getPackageName(), + photoURI, + Intent.FLAG_GRANT_READ_URI_PERMISSION + | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + + applicationContext.grantUriPermission( + "com.vijay.jsonwizard", + photoURI, + Intent.FLAG_GRANT_READ_URI_PERMISSION + | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + + takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); + getView().startActivityForResult(takePictureIntent, RESULT_LOAD_IMG); + } + } + } + } + + private File createImageFile() throws IOException { + // Create an image file name + String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); + String imageFileName = "JPEG_" + timeStamp + "_"; + File storageDir = getView().getContext().getExternalFilesDir(Environment.DIRECTORY_PICTURES); + File image = File.createTempFile( + imageFileName, + ".jpg", + storageDir + ); + + // Save a file: path for use with ACTION_VIEW intents + mCurrentPhotoPath = image.getAbsolutePath(); + return image; + } + + public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { + Log.d(TAG, "onCheckedChanged called"); + if (compoundButton instanceof CheckBox) { + String parentKey = (String) compoundButton.getTag(R.id.key); + String openMrsEntityParent = (String) compoundButton.getTag(R.id.openmrs_entity_parent); + String openMrsEntity = (String) compoundButton.getTag(R.id.openmrs_entity); + String openMrsEntityId = (String) compoundButton.getTag(R.id.openmrs_entity_id); + String childKey = (String) compoundButton.getTag(R.id.childKey); + getView().writeValue(mStepName, parentKey, JsonFormConstants.OPTIONS_FIELD_NAME, childKey, + String.valueOf(((CheckBox) compoundButton).isChecked()), openMrsEntityParent, + openMrsEntity, openMrsEntityId); + } else if (compoundButton instanceof RadioButton) { + if (isChecked) { + String parentKey = (String) compoundButton.getTag(R.id.key); + String openMrsEntityParent = (String) compoundButton.getTag(R.id.openmrs_entity_parent); + String openMrsEntity = (String) compoundButton.getTag(R.id.openmrs_entity); + String openMrsEntityId = (String) compoundButton.getTag(R.id.openmrs_entity_id); + String childKey = (String) compoundButton.getTag(R.id.childKey); + getView().unCheckAllExcept(parentKey, childKey); + getView().writeValue(mStepName, parentKey, childKey, openMrsEntityParent, + openMrsEntity, openMrsEntityId); + } + } + } + + public void onItemSelected(AdapterView parent, View view, int position, long id) { + String parentKey = (String) parent.getTag(R.id.key); + String openMrsEntityParent = (String) parent.getTag(R.id.openmrs_entity_parent); + String openMrsEntity = (String) parent.getTag(R.id.openmrs_entity); + String openMrsEntityId = (String) parent.getTag(R.id.openmrs_entity_id); + if (position >= 0) { + String value = (String) parent.getItemAtPosition(position); + getView().writeValue(mStepName, parentKey, value, openMrsEntityParent, openMrsEntity, + openMrsEntityId); + } + } +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/DatePickerUtils.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/DatePickerUtils.java new file mode 100644 index 000000000..2695e04e3 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/DatePickerUtils.java @@ -0,0 +1,75 @@ +package com.vijay.jsonwizard.utils; + +import android.app.DatePickerDialog; +import android.content.res.Resources; +import android.view.ViewGroup; +import android.view.inputmethod.EditorInfo; +import android.widget.DatePicker; +import android.widget.LinearLayout; +import android.widget.NumberPicker; +import android.widget.TextView; + +/** + * Created by keyman on 25/04/2017. + */ +public class DatePickerUtils { + + private static final int SPINNER_COUNT = 3; + + public static void themeDatePicker(DatePickerDialog dialog, char[] ymdOrder) { + if (!dialog.isShowing()) { + throw new IllegalStateException("Dialog must be showing"); + } + + themeDatePicker(dialog.getDatePicker(), ymdOrder); + } + + public static void preventShowingKeyboard(DatePicker datePicker) { + datePicker.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); + } + + public static void themeDatePicker(DatePicker datePicker, char[] ymdOrder) { + preventShowingKeyboard(datePicker); + final int idYear = Resources.getSystem().getIdentifier("year", "id", "android"); + final int idMonth = Resources.getSystem().getIdentifier("month", "id", "android"); + final int idDay = Resources.getSystem().getIdentifier("day", "id", "android"); + final int idLayout = Resources.getSystem().getIdentifier("pickers", "id", "android"); + + final NumberPicker spinnerYear = (NumberPicker) datePicker.findViewById(idYear); + final NumberPicker spinnerMonth = (NumberPicker) datePicker.findViewById(idMonth); + final NumberPicker spinnerDay = (NumberPicker) datePicker.findViewById(idDay); + final LinearLayout layout = (LinearLayout) datePicker.findViewById(idLayout); + + layout.removeAllViews(); + for (int i = 0; i < SPINNER_COUNT; i++) { + switch (ymdOrder[i]) { + case 'y': + layout.addView(spinnerYear); + setImeOptions(spinnerYear, i); + break; + case 'm': + layout.addView(spinnerMonth); + setImeOptions(spinnerMonth, i); + break; + case 'd': + layout.addView(spinnerDay); + setImeOptions(spinnerDay, i); + break; + default: + throw new IllegalArgumentException("Invalid char[] ymdOrder"); + } + } + } + + private static void setImeOptions(NumberPicker spinner, int spinnerIndex) { + final int imeOptions; + if (spinnerIndex < SPINNER_COUNT - 1) { + imeOptions = EditorInfo.IME_ACTION_NEXT; + } else { + imeOptions = EditorInfo.IME_ACTION_DONE; + } + int idPickerInput = Resources.getSystem().getIdentifier("numberpicker_input", "id", "android"); + TextView input = (TextView) spinner.findViewById(idPickerInput); + input.setImeOptions(imeOptions); + } +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/FormUtils.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/FormUtils.java new file mode 100644 index 000000000..f91717ca7 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/FormUtils.java @@ -0,0 +1,162 @@ +package com.vijay.jsonwizard.utils; + +import android.content.Context; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.rey.material.util.ViewUtil; +import com.vijay.jsonwizard.R; +import com.vijay.jsonwizard.interfaces.JsonApi; + +import org.json.JSONObject; + +import java.text.SimpleDateFormat; +import java.util.Calendar; + +/** + * Created by vijay on 24-05-2015. + */ +public class FormUtils { + public static final String FONT_BOLD_PATH = "fonts/Roboto-Bold.ttf"; + public static final String FONT_REGULAR_PATH = "fonts/Roboto-Regular.ttf"; + public static final int MATCH_PARENT = -1; + public static final int WRAP_CONTENT = -2; + public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("dd-MM-yyyy"); + public static final SimpleDateFormat DATE_TIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + public static final String METADATA_PROPERTY = "metadata"; + private static final String START_JAVAROSA_PROPERTY = "start"; + private static final String END_JAVAROSA_PROPERTY = "end"; + private static final String TODAY_JAVAROSA_PROPERTY = "today"; + public static final String LOOK_UP_JAVAROSA_PROPERTY = "look_up"; + + public static LinearLayout.LayoutParams getLayoutParams(int width, int height, int left, int top, int right, int bottom) { + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(width, height); + layoutParams.setMargins(left, top, right, bottom); + return layoutParams; + } + + public static TextView getTextViewWith(Context context, int textSizeInSp, String text, + String key, String type, String openMrsEntityParent, + String openMrsEntity, String openMrsEntityId, + String relevance, + LinearLayout.LayoutParams layoutParams, String fontPath) { + TextView textView = new TextView(context); + textView.setText(text); + textView.setTag(R.id.key, key); + textView.setTag(R.id.type, type); + textView.setTag(R.id.openmrs_entity_parent, openMrsEntityParent); + textView.setTag(R.id.openmrs_entity, openMrsEntity); + textView.setTag(R.id.openmrs_entity_id, openMrsEntityId); + textView.setId(ViewUtil.generateViewId()); + textView.setTextSize(textSizeInSp); + textView.setLayoutParams(layoutParams); + if (relevance != null && context instanceof JsonApi) { + textView.setTag(R.id.relevance, relevance); + ((JsonApi) context).addSkipLogicView(textView); + } + return textView; + } + + public static int dpToPixels(Context context, float dps) { + final float scale = context.getResources().getDisplayMetrics().density; + return (int) (dps * scale + 0.5f); + } + + public static void updateStartProperties(PropertyManager propertyManager, JSONObject form) + throws Exception { + if (form.has(METADATA_PROPERTY)) { + if (form.getJSONObject(METADATA_PROPERTY).has(START_JAVAROSA_PROPERTY)) { + Calendar calendar = Calendar.getInstance(); + JSONObject start = form.getJSONObject(METADATA_PROPERTY).getJSONObject(START_JAVAROSA_PROPERTY); + String value = DATE_TIME_FORMAT.format(calendar.getTime()); + if (value == null) value = ""; + start.put("value", value); + } + + if (form.getJSONObject(METADATA_PROPERTY).has(PropertyManager.DEVICE_ID_PROPERTY)) { + JSONObject deviceId = form.getJSONObject(METADATA_PROPERTY).getJSONObject(PropertyManager.DEVICE_ID_PROPERTY); + String value = propertyManager.getSingularProperty( + PropertyManager.DEVICE_ID_PROPERTY); + if (value == null) value = ""; + deviceId.put("value", value); + } + + if (form.getJSONObject(METADATA_PROPERTY).has(PropertyManager.SUBSCRIBER_ID_PROPERTY)) { + JSONObject subscriberId = form.getJSONObject(METADATA_PROPERTY).getJSONObject(PropertyManager.SUBSCRIBER_ID_PROPERTY); + String value = propertyManager.getSingularProperty( + PropertyManager.SUBSCRIBER_ID_PROPERTY); + if (value == null) value = ""; + subscriberId.put("value", value); + } + + if (form.getJSONObject(METADATA_PROPERTY).has(PropertyManager.SIM_SERIAL_PROPERTY)) { + JSONObject simSerial = form.getJSONObject(METADATA_PROPERTY).getJSONObject(PropertyManager.SIM_SERIAL_PROPERTY); + String value = propertyManager.getSingularProperty( + PropertyManager.SIM_SERIAL_PROPERTY); + if (value == null) value = ""; + simSerial.put("value", value); + } + + if (form.getJSONObject(METADATA_PROPERTY).has(PropertyManager.PHONE_NUMBER_PROPERTY)) { + JSONObject simSerial = form.getJSONObject(METADATA_PROPERTY).getJSONObject(PropertyManager.PHONE_NUMBER_PROPERTY); + String value = propertyManager.getSingularProperty( + PropertyManager.PHONE_NUMBER_PROPERTY); + if (value == null) value = ""; + simSerial.put("value", value); + } + } + } + + public static void updateEndProperties(PropertyManager propertyManager, JSONObject form) + throws Exception { + if (form.has(METADATA_PROPERTY)) { + if (form.getJSONObject(METADATA_PROPERTY).has(END_JAVAROSA_PROPERTY)) { + Calendar calendar = Calendar.getInstance(); + JSONObject end = form.getJSONObject(METADATA_PROPERTY).getJSONObject(END_JAVAROSA_PROPERTY); + String value = DATE_TIME_FORMAT.format(calendar.getTime()); + if (value == null) value = ""; + end.put("value", value); + } + + if (form.getJSONObject(METADATA_PROPERTY).has(TODAY_JAVAROSA_PROPERTY)) { + Calendar calendar = Calendar.getInstance(); + JSONObject today = form.getJSONObject(METADATA_PROPERTY).getJSONObject(TODAY_JAVAROSA_PROPERTY); + String value = DATE_FORMAT.format(calendar.getTime()); + if (value == null) value = ""; + today.put("value", value); + } + + if (form.getJSONObject(METADATA_PROPERTY).has(PropertyManager.DEVICE_ID_PROPERTY)) { + JSONObject deviceId = form.getJSONObject(METADATA_PROPERTY).getJSONObject(PropertyManager.DEVICE_ID_PROPERTY); + String value = propertyManager.getSingularProperty( + PropertyManager.DEVICE_ID_PROPERTY); + if (value == null) value = ""; + deviceId.put("value", value); + } + + if (form.getJSONObject(METADATA_PROPERTY).has(PropertyManager.SUBSCRIBER_ID_PROPERTY)) { + JSONObject subscriberId = form.getJSONObject(METADATA_PROPERTY).getJSONObject(PropertyManager.SUBSCRIBER_ID_PROPERTY); + String value = propertyManager.getSingularProperty( + PropertyManager.SUBSCRIBER_ID_PROPERTY); + if (value == null) value = ""; + subscriberId.put("value", value); + } + + if (form.getJSONObject(METADATA_PROPERTY).has(PropertyManager.SIM_SERIAL_PROPERTY)) { + JSONObject simSerial = form.getJSONObject(METADATA_PROPERTY).getJSONObject(PropertyManager.SIM_SERIAL_PROPERTY); + String value = propertyManager.getSingularProperty( + PropertyManager.SIM_SERIAL_PROPERTY); + if (value == null) value = ""; + simSerial.put("value", value); + } + + if (form.getJSONObject(METADATA_PROPERTY).has(PropertyManager.PHONE_NUMBER_PROPERTY)) { + JSONObject simSerial = form.getJSONObject(METADATA_PROPERTY).getJSONObject(PropertyManager.PHONE_NUMBER_PROPERTY); + String value = propertyManager.getSingularProperty( + PropertyManager.PHONE_NUMBER_PROPERTY); + if (value == null) value = ""; + simSerial.put("value", value); + } + } + } +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/ImageUtils.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/ImageUtils.java new file mode 100644 index 000000000..aa9edf1d9 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/ImageUtils.java @@ -0,0 +1,145 @@ +package com.vijay.jsonwizard.utils; + +import android.content.ContentResolver; +import android.content.Context; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Matrix; +import android.media.ExifInterface; +import android.net.Uri; +import android.provider.MediaStore; +import android.support.v4.util.LruCache; +import android.util.Log; +import android.view.Display; +import android.view.WindowManager; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; + +/** + * Created by vijay.rawat01 on 7/29/15. + */ +public class ImageUtils { + + private static LruCache mBitmapLruCache = new LruCache<>(10000000); + + public static Bitmap loadBitmapFromFile(Context context, String path, int requiredWidth, int requiredHeight) { + String key = path + ":" + requiredWidth + ":" + requiredHeight; + Bitmap bitmap = mBitmapLruCache.get(key); + Log.d("ImagePickerFactory", "Image path is "+path); + if(bitmap != null) { + Log.d("ImagePickerFactory", "Found in cache."); + return bitmap; + } + try { + Uri uri = Uri.fromFile(new File(path)); + bitmap = decodeSampledBitmap(context, uri, requiredWidth, requiredHeight); + mBitmapLruCache.put(key, bitmap); + } catch (IOException e) { + Log.e("ImagePickerFactory", Log.getStackTraceString(e)); + } + return bitmap; + } + + public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { + // Raw height and width of image + final int height = options.outHeight; + final int width = options.outWidth; + int inSampleSize = 1; + + if (height > reqHeight || width > reqWidth) { + + final int halfHeight = height / 2; + final int halfWidth = width / 2; + // Calculate the largest inSampleSize value that is a power of 2 and keeps both + // height and width larger than the requested height and width. + while ((halfHeight / inSampleSize) > reqHeight + && (halfWidth / inSampleSize) > reqWidth) { + inSampleSize *= 2; + } + } + + return inSampleSize; + } + + public static int getDeviceWidth(Context context) { + WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + Display display = wm.getDefaultDisplay(); + return display.getWidth(); + } + + /** + * Rotate an image if required. + * @param img + * @param selectedImage + * @return + */ + private static Bitmap rotateImageIfRequired(Context context,Bitmap img, Uri selectedImage) { + + // Detect rotation + int rotation = getRotation(selectedImage); + if (rotation != 0) { + Matrix matrix = new Matrix(); + matrix.postRotate(rotation); + Bitmap rotatedImg = Bitmap.createBitmap(img, 0, 0, img.getWidth(), img.getHeight(), matrix, true); + img.recycle(); + return rotatedImg; + } + else{ + return img; + } + } + + /** + * Get the rotation of the last image added. + * + * @param selectedImage + * @return + */ + private static int getRotation(Uri selectedImage) { + int rotation = 0; + try { + ExifInterface exifInterface = new ExifInterface(selectedImage.getPath()); + int exifRotation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); + rotation = exifToDegrees(exifRotation); + } catch (IOException e) { + Log.e("ImagePickerFactory", Log.getStackTraceString(e)); + } + return rotation; + } + + private static int exifToDegrees(int exifOrientation) { + if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) { + return 90; + } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) { + return 180; + } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) { + return 270; + } + return 0; + } + + public static Bitmap decodeSampledBitmap(Context context, Uri selectedImage, int requiredWidth, int requiredHeight) + throws IOException { + + // First decode with inJustDecodeBounds=true to check dimensions + final BitmapFactory.Options options = new BitmapFactory.Options(); + options.inJustDecodeBounds = true; + InputStream imageStream = context.getContentResolver().openInputStream(selectedImage); + BitmapFactory.decodeStream(imageStream, null, options); + imageStream.close(); + + // Calculate inSampleSize + options.inSampleSize = calculateInSampleSize(options, requiredWidth, requiredHeight); + + // Decode bitmap with inSampleSize set + options.inJustDecodeBounds = false; + imageStream = context.getContentResolver().openInputStream(selectedImage); + Bitmap img = BitmapFactory.decodeStream(imageStream, null, options); + + img = rotateImageIfRequired(context, img, selectedImage); + return img; + } +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/PropertyManager.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/PropertyManager.java new file mode 100644 index 000000000..ac658b3fa --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/PropertyManager.java @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2009 University of Washington + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ + +package com.vijay.jsonwizard.utils; + +import android.content.Context; +import android.net.wifi.WifiInfo; +import android.net.wifi.WifiManager; +import android.provider.Settings; +import android.telephony.TelephonyManager; +import android.util.Log; + +import java.util.HashMap; +import java.util.Locale; + +/** + * Used to return JavaRosa type device properties + * + * @author Yaw Anokwa (yanokwa@gmail.com) + * @author Jason Rogena (jrogena@ona.io) + */ + +public class PropertyManager { + + public static final String ANDROID6_FAKE_MAC = "02:00:00:00:00:00"; + + private String t = "PropertyManager"; + + private Context mContext; + + private TelephonyManager mTelephonyManager; + private HashMap mProperties; + + public final static String DEVICE_ID_PROPERTY = "deviceid"; // imei + public final static String SUBSCRIBER_ID_PROPERTY = "subscriberid"; // imsi + public final static String SIM_SERIAL_PROPERTY = "simserial"; + public final static String PHONE_NUMBER_PROPERTY = "phonenumber"; + + public PropertyManager(Context context) { + Log.i(t, "calling constructor"); + + mContext = context; + + mProperties = new HashMap(); + mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); + + String deviceId = mTelephonyManager.getDeviceId(); + if (deviceId != null ) { + if ((deviceId.contains("*") || deviceId.contains("000000000000000"))) { + deviceId = + Settings.Secure + .getString(mContext.getContentResolver(), Settings.Secure.ANDROID_ID); + } + } + + if ( deviceId == null ) { + // no SIM -- WiFi only + // Retrieve WiFiManager + WifiManager wifi = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); + + // Get WiFi status + WifiInfo info = wifi.getConnectionInfo(); + if ( info != null && !ANDROID6_FAKE_MAC.equals(info.getMacAddress())) { + deviceId = info.getMacAddress(); + } + } + + // if it is still null, use ANDROID_ID + if ( deviceId == null ) { + deviceId = + Settings.Secure + .getString(mContext.getContentResolver(), Settings.Secure.ANDROID_ID); + } + + mProperties.put(DEVICE_ID_PROPERTY, deviceId); + + String value; + + value = mTelephonyManager.getSubscriberId(); + if ( value != null ) { + mProperties.put(SUBSCRIBER_ID_PROPERTY, value); + } + value = mTelephonyManager.getSimSerialNumber(); + if ( value != null ) { + mProperties.put(SIM_SERIAL_PROPERTY, value); + } + value = mTelephonyManager.getLine1Number(); + if ( value != null ) { + mProperties.put(PHONE_NUMBER_PROPERTY, value); + } + } + + public String getSingularProperty(String propertyName) { + // for now, all property names are in english... + return mProperties.get(propertyName.toLowerCase(Locale.ENGLISH)); + } + +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/ValidationStatus.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/ValidationStatus.java new file mode 100644 index 000000000..3283f2608 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/ValidationStatus.java @@ -0,0 +1,46 @@ +package com.vijay.jsonwizard.utils; + +import android.util.Log; +import android.view.View; + +import com.vijay.jsonwizard.views.JsonFormFragmentView; + +/** + * Created by vijay.rawat01 on 7/21/15. + */ +public class ValidationStatus { + boolean isValid; + String errorMessage; + JsonFormFragmentView formFragmentView; + View view; + + public ValidationStatus(boolean isValid, String errorMessage, + JsonFormFragmentView formFragmentView, View view) { + this.isValid = isValid; + this.errorMessage = errorMessage; + this.formFragmentView = formFragmentView; + this.view = view; + } + + public boolean isValid() { + return isValid; + } + + public void setIsValid(boolean isValid) { + this.isValid = isValid; + } + + public String getErrorMessage() { + return errorMessage; + } + + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + + public void requestAttention() { + if(this.view != null && formFragmentView != null) { + formFragmentView.scrollToView(view); + } + } +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/zxing/IntentIntegrator.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/zxing/IntentIntegrator.java new file mode 100644 index 000000000..3e5915f43 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/zxing/IntentIntegrator.java @@ -0,0 +1,508 @@ +/* + * Copyright 2009 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.vijay.jsonwizard.utils.zxing; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import android.app.Activity; +import android.app.Fragment; +import android.content.ActivityNotFoundException; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.net.Uri; +import android.os.Bundle; +import android.support.v7.app.AlertDialog; +import android.util.Log; + +import com.vijay.jsonwizard.R; + +/** + *

A utility class which helps ease integration with Barcode Scanner via {@link Intent}s. This is a simple + * way to invoke barcode scanning and receive the result, without any need to integrate, modify, or learn the + * project's source code.

+ * + *

Initiating a barcode scan

+ * + *

To integrate, create an instance of {@code IntentIntegrator} and call {@link #initiateScan()} and wait + * for the result in your app.

+ * + *

It does require that the Barcode Scanner (or work-alike) application is installed. The + * {@link #initiateScan()} method will prompt the user to download the application, if needed.

+ * + *

There are a few steps to using this integration. First, your {@link Activity} must implement + * the method {@link Activity#onActivityResult(int, int, Intent)} and include a line of code like this:

+ * + *
{@code
+ * public void onActivityResult(int requestCode, int resultCode, Intent intent) {
+ *   IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
+ *   if (scanResult != null) {
+ *     // handle scan result
+ *   }
+ *   // else continue with any other code you need in the method
+ *   ...
+ * }
+ * }
+ * + *

This is where you will handle a scan result.

+ * + *

Second, just call this in response to a user action somewhere to begin the scan process:

+ * + *
{@code
+ * IntentIntegrator integrator = new IntentIntegrator(yourActivity);
+ * integrator.initiateScan();
+ * }
+ * + *

Note that {@link #initiateScan()} returns an {@link AlertDialog} which is non-null if the + * user was prompted to download the application. This lets the calling app potentially manage the dialog. + * In particular, ideally, the app dismisses the dialog if it's still active in its {@link Activity#onPause()} + * method.

+ * + *

You can use {@link #setTitle(String)} to customize the title of this download prompt dialog (or, use + * {@link #setTitleByID(int)} to set the title by string resource ID.) Likewise, the prompt message, and + * yes/no button labels can be changed.

+ * + *

Finally, you can use {@link #addExtra(String, Object)} to add more parameters to the Intent used + * to invoke the scanner. This can be used to set additional options not directly exposed by this + * simplified API.

+ * + *

By default, this will only allow applications that are known to respond to this intent correctly + * do so. The apps that are allowed to response can be set with {@link #setTargetApplications(List)}. + * For example, set to {@link #TARGET_BARCODE_SCANNER_ONLY} to only target the Barcode Scanner app itself.

+ * + *

Sharing text via barcode

+ * + *

To share text, encoded as a QR Code on-screen, similarly, see {@link #shareText(CharSequence)}.

+ * + *

Some code, particularly download integration, was contributed from the Anobiit application.

+ * + *

Enabling experimental barcode formats

+ * + *

Some formats are not enabled by default even when scanning with {@link #ALL_CODE_TYPES}, such as + * PDF417. Use {@link #initiateScan(Collection)} with + * a collection containing the names of formats to scan for explicitly, like "PDF_417", to use such + * formats.

+ * + * @author Sean Owen + * @author Fred Lin + * @author Isaac Potoczny-Jones + * @author Brad Drehmer + * @author gcstang + */ +public class IntentIntegrator { + + public static final int REQUEST_CODE = 0x0000c0de; // Only use bottom 16 bits + private static final String TAG = IntentIntegrator.class.getSimpleName(); + + public static final String DEFAULT_TITLE = "Install Barcode Scanner?"; + public static final String DEFAULT_MESSAGE = + "This application requires Barcode Scanner. Would you like to install it?"; + public static final String DEFAULT_YES = "Yes"; + public static final String DEFAULT_NO = "No"; + + private static final String BS_PACKAGE = "com.google.zxing.client.android"; + private static final String BSPLUS_PACKAGE = "com.srowen.bs.android"; + + // supported barcode formats + public static final Collection PRODUCT_CODE_TYPES = list("UPC_A", "UPC_E", "EAN_8", "EAN_13", "RSS_14"); + public static final Collection ONE_D_CODE_TYPES = + list("UPC_A", "UPC_E", "EAN_8", "EAN_13", "CODE_39", "CODE_93", "CODE_128", + "ITF", "RSS_14", "RSS_EXPANDED"); + public static final Collection QR_CODE_TYPES = Collections.singleton("QR_CODE"); + public static final Collection DATA_MATRIX_TYPES = Collections.singleton("DATA_MATRIX"); + + public static final Collection ALL_CODE_TYPES = null; + + public static final List TARGET_BARCODE_SCANNER_ONLY = Collections.singletonList(BS_PACKAGE); + public static final List TARGET_ALL_KNOWN = list( + BSPLUS_PACKAGE, // Barcode Scanner+ + BSPLUS_PACKAGE + ".simple", // Barcode Scanner+ Simple + BS_PACKAGE // Barcode Scanner + // What else supports this intent? + ); + + private final Activity activity; + private final Fragment fragment; + + private String title; + private String message; + private String buttonYes; + private String buttonNo; + private List targetApplications; + private final Map moreExtras = new HashMap(3); + + /** + * @param activity {@link Activity} invoking the integration + */ + public IntentIntegrator(Activity activity) { + this.activity = activity; + this.fragment = null; + initializeConfiguration(); + } + + /** + * @param fragment {@link Fragment} invoking the integration. + * {@link #startActivityForResult(Intent, int)} will be called on the {@link Fragment} instead + * of an {@link Activity} + */ + public IntentIntegrator(Fragment fragment) { + this.activity = fragment.getActivity(); + this.fragment = fragment; + initializeConfiguration(); + } + + private void initializeConfiguration() { + title = DEFAULT_TITLE; + message = DEFAULT_MESSAGE; + buttonYes = DEFAULT_YES; + buttonNo = DEFAULT_NO; + targetApplications = TARGET_ALL_KNOWN; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public void setTitleByID(int titleID) { + title = activity.getString(titleID); + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public void setMessageByID(int messageID) { + message = activity.getString(messageID); + } + + public String getButtonYes() { + return buttonYes; + } + + public void setButtonYes(String buttonYes) { + this.buttonYes = buttonYes; + } + + public void setButtonYesByID(int buttonYesID) { + buttonYes = activity.getString(buttonYesID); + } + + public String getButtonNo() { + return buttonNo; + } + + public void setButtonNo(String buttonNo) { + this.buttonNo = buttonNo; + } + + public void setButtonNoByID(int buttonNoID) { + buttonNo = activity.getString(buttonNoID); + } + + public Collection getTargetApplications() { + return targetApplications; + } + + public final void setTargetApplications(List targetApplications) { + if (targetApplications.isEmpty()) { + throw new IllegalArgumentException("No target applications"); + } + this.targetApplications = targetApplications; + } + + public void setSingleTargetApplication(String targetApplication) { + this.targetApplications = Collections.singletonList(targetApplication); + } + + public Map getMoreExtras() { + return moreExtras; + } + + public final void addExtra(String key, Object value) { + moreExtras.put(key, value); + } + + /** + * Initiates a scan for all known barcode types with the default camera. + * + * @return the {@link AlertDialog} that was shown to the user prompting them to download the app + * if a prompt was needed, or null otherwise. + */ + public final AlertDialog initiateScan() { + return initiateScan(ALL_CODE_TYPES, -1); + } + + /** + * Initiates a scan for all known barcode types with the specified camera. + * + * @param cameraId camera ID of the camera to use. A negative value means "no preference". + * @return the {@link AlertDialog} that was shown to the user prompting them to download the app + * if a prompt was needed, or null otherwise. + */ + public final AlertDialog initiateScan(int cameraId) { + return initiateScan(ALL_CODE_TYPES, cameraId); + } + + /** + * Initiates a scan, using the default camera, only for a certain set of barcode types, given as strings corresponding + * to their names in ZXing's {@code BarcodeFormat} class like "UPC_A". You can supply constants + * like {@link #PRODUCT_CODE_TYPES} for example. + * + * @param desiredBarcodeFormats names of {@code BarcodeFormat}s to scan for + * @return the {@link AlertDialog} that was shown to the user prompting them to download the app + * if a prompt was needed, or null otherwise. + */ + public final AlertDialog initiateScan(Collection desiredBarcodeFormats) { + return initiateScan(desiredBarcodeFormats, -1); + } + + /** + * Initiates a scan, using the specified camera, only for a certain set of barcode types, given as strings corresponding + * to their names in ZXing's {@code BarcodeFormat} class like "UPC_A". You can supply constants + * like {@link #PRODUCT_CODE_TYPES} for example. + * + * @param desiredBarcodeFormats names of {@code BarcodeFormat}s to scan for + * @param cameraId camera ID of the camera to use. A negative value means "no preference". + * @return the {@link AlertDialog} that was shown to the user prompting them to download the app + * if a prompt was needed, or null otherwise + */ + public final AlertDialog initiateScan(Collection desiredBarcodeFormats, int cameraId) { + Intent intentScan = new Intent(BS_PACKAGE + ".SCAN"); + intentScan.addCategory(Intent.CATEGORY_DEFAULT); + + // check which types of codes to scan for + if (desiredBarcodeFormats != null) { + // set the desired barcode types + StringBuilder joinedByComma = new StringBuilder(); + for (String format : desiredBarcodeFormats) { + if (joinedByComma.length() > 0) { + joinedByComma.append(','); + } + joinedByComma.append(format); + } + intentScan.putExtra("SCAN_FORMATS", joinedByComma.toString()); + } + + // check requested camera ID + if (cameraId >= 0) { + intentScan.putExtra("SCAN_CAMERA_ID", cameraId); + } + + String targetAppPackage = findTargetAppPackage(intentScan); + if (targetAppPackage == null) { + return showDownloadDialog(); + } + intentScan.setPackage(targetAppPackage); + intentScan.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + intentScan.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + attachMoreExtras(intentScan); + startActivityForResult(intentScan, REQUEST_CODE); + return null; + } + + /** + * Start an activity. This method is defined to allow different methods of activity starting for + * newer versions of Android and for compatibility library. + * + * @param intent Intent to start. + * @param code Request code for the activity + * @see Activity#startActivityForResult(Intent, int) + * @see Fragment#startActivityForResult(Intent, int) + */ + protected void startActivityForResult(Intent intent, int code) { + if (fragment == null) { + activity.startActivityForResult(intent, code); + } else { + fragment.startActivityForResult(intent, code); + } + } + + private String findTargetAppPackage(Intent intent) { + PackageManager pm = activity.getPackageManager(); + List availableApps = pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); + if (availableApps != null) { + for (String targetApp : targetApplications) { + if (contains(availableApps, targetApp)) { + return targetApp; + } + } + } + return null; + } + + private static boolean contains(Iterable availableApps, String targetApp) { + for (ResolveInfo availableApp : availableApps) { + String packageName = availableApp.activityInfo.packageName; + if (targetApp.equals(packageName)) { + return true; + } + } + return false; + } + + private AlertDialog showDownloadDialog() { + AlertDialog.Builder downloadDialog = new AlertDialog.Builder(activity, R.style.AppThemeAlertDialog); + downloadDialog.setTitle(title); + downloadDialog.setMessage(message); + downloadDialog.setPositiveButton(buttonYes, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + String packageName; + if (targetApplications.contains(BS_PACKAGE)) { + // Prefer to suggest download of BS if it's anywhere in the list + packageName = BS_PACKAGE; + } else { + // Otherwise, first option: + packageName = targetApplications.get(0); + } + Uri uri = Uri.parse("market://details?id=" + packageName); + Intent intent = new Intent(Intent.ACTION_VIEW, uri); + try { + if (fragment == null) { + activity.startActivity(intent); + } else { + fragment.startActivity(intent); + } + } catch (ActivityNotFoundException anfe) { + // Hmm, market is not installed + Log.w(TAG, "Google Play is not installed; cannot install " + packageName); + } + } + }); + downloadDialog.setNegativeButton(buttonNo, null); + downloadDialog.setCancelable(true); + return downloadDialog.show(); + } + + + /** + *

Call this from your {@link Activity}'s + * {@link Activity#onActivityResult(int, int, Intent)} method.

+ * + * @param requestCode request code from {@code onActivityResult()} + * @param resultCode result code from {@code onActivityResult()} + * @param intent {@link Intent} from {@code onActivityResult()} + * @return null if the event handled here was not related to this class, or + * else an {@link IntentResult} containing the result of the scan. If the user cancelled scanning, + * the fields will be null. + */ + public static IntentResult parseActivityResult(int requestCode, int resultCode, Intent intent) { + if (requestCode == REQUEST_CODE) { + if (resultCode == Activity.RESULT_OK) { + String contents = intent.getStringExtra("SCAN_RESULT"); + String formatName = intent.getStringExtra("SCAN_RESULT_FORMAT"); + byte[] rawBytes = intent.getByteArrayExtra("SCAN_RESULT_BYTES"); + int intentOrientation = intent.getIntExtra("SCAN_RESULT_ORIENTATION", Integer.MIN_VALUE); + Integer orientation = intentOrientation == Integer.MIN_VALUE ? null : intentOrientation; + String errorCorrectionLevel = intent.getStringExtra("SCAN_RESULT_ERROR_CORRECTION_LEVEL"); + return new IntentResult(contents, + formatName, + rawBytes, + orientation, + errorCorrectionLevel); + } + return new IntentResult(); + } + return null; + } + + + /** + * Defaults to type "TEXT_TYPE". + * + * @param text the text string to encode as a barcode + * @return the {@link AlertDialog} that was shown to the user prompting them to download the app + * if a prompt was needed, or null otherwise + * @see #shareText(CharSequence, CharSequence) + */ + public final AlertDialog shareText(CharSequence text) { + return shareText(text, "TEXT_TYPE"); + } + + /** + * Shares the given text by encoding it as a barcode, such that another user can + * scan the text off the screen of the device. + * + * @param text the text string to encode as a barcode + * @param type type of data to encode. See {@code com.google.zxing.client.android.Contents.Type} constants. + * @return the {@link AlertDialog} that was shown to the user prompting them to download the app + * if a prompt was needed, or null otherwise + */ + public final AlertDialog shareText(CharSequence text, CharSequence type) { + Intent intent = new Intent(); + intent.addCategory(Intent.CATEGORY_DEFAULT); + intent.setAction(BS_PACKAGE + ".ENCODE"); + intent.putExtra("ENCODE_TYPE", type); + intent.putExtra("ENCODE_DATA", text); + String targetAppPackage = findTargetAppPackage(intent); + if (targetAppPackage == null) { + return showDownloadDialog(); + } + intent.setPackage(targetAppPackage); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); + attachMoreExtras(intent); + if (fragment == null) { + activity.startActivity(intent); + } else { + fragment.startActivity(intent); + } + return null; + } + + private static List list(String... values) { + return Collections.unmodifiableList(Arrays.asList(values)); + } + + private void attachMoreExtras(Intent intent) { + for (Map.Entry entry : moreExtras.entrySet()) { + String key = entry.getKey(); + Object value = entry.getValue(); + // Kind of hacky + if (value instanceof Integer) { + intent.putExtra(key, (Integer) value); + } else if (value instanceof Long) { + intent.putExtra(key, (Long) value); + } else if (value instanceof Boolean) { + intent.putExtra(key, (Boolean) value); + } else if (value instanceof Double) { + intent.putExtra(key, (Double) value); + } else if (value instanceof Float) { + intent.putExtra(key, (Float) value); + } else if (value instanceof Bundle) { + intent.putExtra(key, (Bundle) value); + } else { + intent.putExtra(key, value.toString()); + } + } + } + +} \ No newline at end of file diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/zxing/IntentResult.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/zxing/IntentResult.java new file mode 100644 index 000000000..6fcacf24f --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/zxing/IntentResult.java @@ -0,0 +1,93 @@ +/* + * Copyright 2009 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.vijay.jsonwizard.utils.zxing; + +/** + *

Encapsulates the result of a barcode scan invoked through {@link IntentIntegrator}.

+ * + * @author Sean Owen + */ +public final class IntentResult { + + private final String contents; + private final String formatName; + private final byte[] rawBytes; + private final Integer orientation; + private final String errorCorrectionLevel; + + IntentResult() { + this(null, null, null, null, null); + } + + IntentResult(String contents, + String formatName, + byte[] rawBytes, + Integer orientation, + String errorCorrectionLevel) { + this.contents = contents; + this.formatName = formatName; + this.rawBytes = rawBytes; + this.orientation = orientation; + this.errorCorrectionLevel = errorCorrectionLevel; + } + + /** + * @return raw content of barcode + */ + public String getContents() { + return contents; + } + + /** + * @return name of format, like "QR_CODE", "UPC_A". See {@code BarcodeFormat} for more format names. + */ + public String getFormatName() { + return formatName; + } + + /** + * @return raw bytes of the barcode content, if applicable, or null otherwise + */ + public byte[] getRawBytes() { + return rawBytes; + } + + /** + * @return rotation of the image, in degrees, which resulted in a successful scan. May be null. + */ + public Integer getOrientation() { + return orientation; + } + + /** + * @return name of the error correction level used in the barcode, if applicable + */ + public String getErrorCorrectionLevel() { + return errorCorrectionLevel; + } + + @Override + public String toString() { + int rawBytesLength = rawBytes == null ? 0 : rawBytes.length; + return "Format: " + formatName + '\n' + + "Contents: " + contents + '\n' + + "Raw bytes: (" + rawBytesLength + " bytes)\n" + + "Orientation: " + orientation + '\n' + + "EC level: " + errorCorrectionLevel + '\n'; + } + +} \ No newline at end of file diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/validators/edittext/LengthValidator.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/validators/edittext/LengthValidator.java new file mode 100644 index 000000000..05765a672 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/validators/edittext/LengthValidator.java @@ -0,0 +1,28 @@ +package com.vijay.jsonwizard.validators.edittext; + +import com.rengwuxian.materialedittext.validation.METValidator; + +/** + * Created by vijay.rawat01 on 7/21/15. + */ +public class LengthValidator extends METValidator { + + int minLength = 0; + int maxLength = Integer.MAX_VALUE; + + public LengthValidator(String errorMessage, int minLength, int maxLength) { + super(errorMessage); + this.minLength = minLength; + this.maxLength = maxLength; + } + + @Override + public boolean isValid(CharSequence charSequence, boolean isEmpty) { + if(!isEmpty) { + if(charSequence.length() >= minLength && charSequence.length() <= maxLength) { + return true; + } + } + return false; + } +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/validators/edittext/MaxLengthValidator.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/validators/edittext/MaxLengthValidator.java new file mode 100644 index 000000000..c600af4c3 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/validators/edittext/MaxLengthValidator.java @@ -0,0 +1,13 @@ +package com.vijay.jsonwizard.validators.edittext; + +import com.vijay.jsonwizard.widgets.EditTextFactory; + +/** + * Created by vijay.rawat01 on 7/21/15. + */ +public class MaxLengthValidator extends LengthValidator { + + public MaxLengthValidator(String errorMessage, int maxLength) { + super(errorMessage, EditTextFactory.MIN_LENGTH, maxLength); + } +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/validators/edittext/MaxNumericValidator.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/validators/edittext/MaxNumericValidator.java new file mode 100644 index 000000000..10c94c429 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/validators/edittext/MaxNumericValidator.java @@ -0,0 +1,29 @@ +package com.vijay.jsonwizard.validators.edittext; + +import android.support.annotation.NonNull; + +import com.rengwuxian.materialedittext.validation.METValidator; + +/** + * Created by Jason Rogena - jrogena@ona.io on 06/03/2017. + */ + +public class MaxNumericValidator extends METValidator { + private final double maxValue; + + public MaxNumericValidator(@NonNull String errorMessage, @NonNull double maxValue) { + super(errorMessage); + this.maxValue = maxValue; + } + + @Override + public boolean isValid(@NonNull CharSequence text, boolean isEmpty) { + if (!isEmpty) { + try { + if (Double.parseDouble(text.toString()) > maxValue) return false; + } catch (Exception e) { + } + } + return true; + } +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/validators/edittext/MinLengthValidator.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/validators/edittext/MinLengthValidator.java new file mode 100644 index 000000000..35478fc7b --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/validators/edittext/MinLengthValidator.java @@ -0,0 +1,13 @@ +package com.vijay.jsonwizard.validators.edittext; + +import com.vijay.jsonwizard.widgets.EditTextFactory; + +/** + * Created by vijay.rawat01 on 7/21/15. + */ +public class MinLengthValidator extends LengthValidator { + + public MinLengthValidator(String errorMessage, int minLength) { + super(errorMessage, minLength, EditTextFactory.MAX_LENGTH); + } +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/validators/edittext/MinNumericValidator.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/validators/edittext/MinNumericValidator.java new file mode 100644 index 000000000..3cd9f1fce --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/validators/edittext/MinNumericValidator.java @@ -0,0 +1,29 @@ +package com.vijay.jsonwizard.validators.edittext; + +import android.support.annotation.NonNull; + +import com.rengwuxian.materialedittext.validation.METValidator; + +/** + * Created by Jason Rogena - jrogena@ona.io on 06/03/2017. + */ + +public class MinNumericValidator extends METValidator { + private final double minValue; + + public MinNumericValidator(@NonNull String errorMessage, @NonNull double minValue) { + super(errorMessage); + this.minValue = minValue; + } + + @Override + public boolean isValid(@NonNull CharSequence text, boolean isEmpty) { + if (!isEmpty) { + try { + if (Double.parseDouble(text.toString()) < minValue) return false; + } catch (Exception e) { + } + } + return true; + } +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/validators/edittext/RequiredValidator.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/validators/edittext/RequiredValidator.java new file mode 100644 index 000000000..bc5a6aebc --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/validators/edittext/RequiredValidator.java @@ -0,0 +1,24 @@ +package com.vijay.jsonwizard.validators.edittext; + +import android.util.Log; + +import com.rengwuxian.materialedittext.validation.METValidator; + +/** + * Created by vijay.rawat01 on 7/21/15. + */ +public class RequiredValidator extends METValidator { + + public RequiredValidator(String errorMessage) { + super(errorMessage); + } + + @Override + public boolean isValid(CharSequence charSequence, boolean isEmpty) { + if(errorMessage.equals("Enter the date that the child was first seen at a health facility for immunization services")) { + Log.d("RequiredValidation", "Charsequence is " + charSequence.toString()); + Log.d("RequiredValidation", "isEmpty is " + isEmpty); + } + return !isEmpty; + } +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/views/JsonFormFragmentView.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/views/JsonFormFragmentView.java new file mode 100644 index 000000000..5e5515e8a --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/views/JsonFormFragmentView.java @@ -0,0 +1,82 @@ +package com.vijay.jsonwizard.views; + +import java.util.List; +import java.util.Map; + +import org.json.JSONException; +import org.json.JSONObject; + +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.os.Bundle; +import android.support.v7.app.ActionBar; +import android.support.v7.widget.Toolbar; +import android.view.View; + +import com.vijay.jsonwizard.fragments.JsonFormFragment; +import com.vijay.jsonwizard.interfaces.CommonListener; +import com.vijay.jsonwizard.mvp.MvpView; +import com.vijay.jsonwizard.mvp.ViewState; + +/** + * Created by vijay on 5/14/15. + */ +public interface JsonFormFragmentView extends MvpView { + Bundle getArguments(); + + void setActionBarTitle(String title); + + Context getContext(); + + void showToast(String message); + + CommonListener getCommonListener(); + + void addFormElements(List views); + + ActionBar getSupportActionBar(); + + Toolbar getToolbar(); + + void setToolbarTitleColor(int white); + + void updateVisibilityOfNextAndSave(boolean next, boolean save); + + void hideKeyBoard(); + + void transactThis(JsonFormFragment next); + + void startActivityForResult(Intent intent, int requestCode); + + void updateRelevantImageView(Bitmap bitmap, String imagePath, String currentKey); + + void writeValue(String stepName, String key, String value, String openMrsEntityParent, + String openMrsEntity, String openMrsEntityId); + + void writeValue(String stepName, String prentKey, String childObjectKey, String childKey, + String value, String openMrsEntityParent, String openMrsEntity, + String openMrsEntityId); + + void writeMetaDataValue(String metaDataKey, Map values); + + JSONObject getStep(String stepName); + + String getCurrentJsonState(); + + void finishWithResult(Intent returnIntent); + + void setUpBackButton(); + + void backClick(); + + void unCheckAllExcept(String parentKey, String childKey); + + String getCount(); + + void onFormStart(); + + void onFormFinish(); + + void scrollToView(View view); +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/viewstates/JsonFormFragmentViewState.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/viewstates/JsonFormFragmentViewState.java new file mode 100644 index 000000000..2cbdaa94b --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/viewstates/JsonFormFragmentViewState.java @@ -0,0 +1,39 @@ +package com.vijay.jsonwizard.viewstates; + +import android.os.Parcel; + +import com.vijay.jsonwizard.mvp.ViewState; + +/** + * Created by vijay on 5/14/15. + */ +public class JsonFormFragmentViewState extends ViewState implements android.os.Parcelable { + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + super.writeToParcel(dest, flags); + } + + public JsonFormFragmentViewState() { + } + + protected JsonFormFragmentViewState(Parcel in) { + super(in); + } + + public static final Creator CREATOR = new Creator() { + public JsonFormFragmentViewState createFromParcel( + Parcel source) { + return new JsonFormFragmentViewState(source); + } + + public JsonFormFragmentViewState[] newArray( + int size) { + return new JsonFormFragmentViewState[size]; + } + }; +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/BarcodeFactory.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/BarcodeFactory.java new file mode 100644 index 000000000..dc79ced21 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/BarcodeFactory.java @@ -0,0 +1,194 @@ +package com.vijay.jsonwizard.widgets; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.graphics.drawable.ColorDrawable; +import android.text.Layout; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; + +import com.rengwuxian.materialedittext.MaterialEditText; +import com.rey.material.util.ViewUtil; +import com.rey.material.widget.Button; +import com.vijay.jsonwizard.R; +import com.vijay.jsonwizard.customviews.GenericTextWatcher; +import com.vijay.jsonwizard.fragments.JsonFormFragment; +import com.vijay.jsonwizard.interfaces.CommonListener; +import com.vijay.jsonwizard.interfaces.FormWidgetFactory; +import com.vijay.jsonwizard.interfaces.JsonApi; +import com.vijay.jsonwizard.interfaces.OnActivityResultListener; +import com.vijay.jsonwizard.utils.zxing.IntentIntegrator; +import com.vijay.jsonwizard.utils.zxing.IntentResult; +import com.vijay.jsonwizard.validators.edittext.RequiredValidator; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +import static android.view.inputmethod.InputMethodManager.HIDE_NOT_ALWAYS; + +/** + * Created by Jason Rogena - jrogena@ona.io on 20/03/2017. + */ + +public class BarcodeFactory implements FormWidgetFactory { + private static final String SCAN_MODE = "SCAN_MODE"; + private static final String QR_MODE = "QR_MODE"; + private static final String TYPE_QR = "qrcode"; + private static final String TYPE_BARCODE = "barcode"; + private static final String DEFAULT_TYPE= TYPE_BARCODE; + + @Override + public List getViewsFromJson(String stepName, final Context context, + JsonFormFragment formFragment, final JSONObject jsonObject, + CommonListener listener) throws Exception { + List views = new ArrayList<>(1); + try { + String openMrsEntityParent = jsonObject.getString("openmrs_entity_parent"); + String openMrsEntity = jsonObject.getString("openmrs_entity"); + String openMrsEntityId = jsonObject.getString("openmrs_entity_id"); + String relevance = jsonObject.optString("relevance"); + final String constraints = jsonObject.optString("constraints"); + + LinearLayout rootLayout = (LinearLayout) LayoutInflater.from(context) + .inflate(R.layout.item_barcode, null); + final int canvasId = ViewUtil.generateViewId(); + rootLayout.setId(canvasId); + final MaterialEditText editText = (MaterialEditText) rootLayout + .findViewById(R.id.edit_text); + editText.setHint(jsonObject.getString("hint")); + JSONArray canvasIdsArray = new JSONArray(); + canvasIdsArray.put(canvasId); + editText.setTag(R.id.canvas_ids, canvasIdsArray.toString()); + editText.setTag(R.id.address, stepName + ":" + jsonObject.getString("key")); + editText.setFloatingLabelText(jsonObject.getString("hint")); + editText.setId(ViewUtil.generateViewId()); + editText.setTag(R.id.key, jsonObject.getString("key")); + editText.setTag(R.id.openmrs_entity_parent, openMrsEntityParent); + editText.setTag(R.id.openmrs_entity, openMrsEntity); + editText.setTag(R.id.openmrs_entity_id, openMrsEntityId); + if (jsonObject.has("v_required")) { + JSONObject requiredObject = jsonObject.optJSONObject("v_required"); + String requiredValue = requiredObject.getString("value"); + if (!TextUtils.isEmpty(requiredValue)) { + if (Boolean.TRUE.toString().equalsIgnoreCase(requiredValue)) { + editText.addValidator( + new RequiredValidator(requiredObject.getString("err"))); + } + } + } + + if (!TextUtils.isEmpty(jsonObject.optString("value"))) { + editText.setText(jsonObject.optString("value")); + } + + editText.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + launchBarcodeScanner((Activity) context, editText, + jsonObject.optString("barcode_type")); + } + }); + + editText.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + editText.setText(""); + return true; + } + }); + + if (context instanceof JsonApi) { + JsonApi jsonApi = (JsonApi) context; + jsonApi.addOnActivityResultListener(IntentIntegrator.REQUEST_CODE, + new OnActivityResultListener() { + @Override + public void onActivityResult(int requestCode, + int resultCode, Intent data) { + if(resultCode == Activity.RESULT_OK) { + IntentResult res = IntentIntegrator.parseActivityResult( + requestCode, + resultCode, + data); + + editText.setText(res.getContents()); + } + } + }); + } + + GenericTextWatcher textWatcher = new GenericTextWatcher(stepName, + formFragment, + editText); + textWatcher.addOnFocusChangeListener(new View.OnFocusChangeListener() { + @Override + public void onFocusChange(View v, boolean hasFocus) { + if (hasFocus) { + launchBarcodeScanner((Activity) context, editText, + jsonObject.optString("barcode_type")); + } + } + }); + + Button scanButton = (Button) rootLayout.findViewById(R.id.scan_button); + scanButton.setText(jsonObject.getString("scanButtonText")); + scanButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + launchBarcodeScanner((Activity) context, editText, + jsonObject.optString("barcode_type")); + } + }); + + if (jsonObject.has("read_only")) { + boolean readOnly = jsonObject.getBoolean("read_only"); + editText.setEnabled(!readOnly); + editText.setFocusable(!readOnly); + if (readOnly) { + scanButton.setBackgroundDrawable(new ColorDrawable(context.getResources() + .getColor(android.R.color.darker_gray))); + scanButton.setClickable(false); + scanButton.setEnabled(false); + scanButton.setFocusable(false); + } + } + + editText.addTextChangedListener(textWatcher); + if (relevance != null && context instanceof JsonApi) { + editText.setTag(R.id.relevance, relevance); + ((JsonApi) context).addSkipLogicView(editText); + } + if (constraints != null && context instanceof JsonApi) { + editText.setTag(R.id.constraints, constraints); + ((JsonApi) context).addConstrainedView(editText); + } + + ((JsonApi) context).addFormDataView(editText); + + views.add(rootLayout); + } catch (Exception e) { + e.printStackTrace(); + } + + return views; + } + + private void launchBarcodeScanner(Activity activity, MaterialEditText editText, String barcodeType) { + InputMethodManager inputManager = (InputMethodManager) activity.getSystemService( + Context.INPUT_METHOD_SERVICE); + inputManager.hideSoftInputFromWindow(editText.getWindowToken(), HIDE_NOT_ALWAYS); + IntentIntegrator intentIntegrator = new IntentIntegrator(activity); + if(barcodeType != null && barcodeType.equals(TYPE_QR)) { + intentIntegrator.addExtra(SCAN_MODE, QR_MODE); + } + intentIntegrator.initiateScan(); + } + +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/ButtonFactory.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/ButtonFactory.java new file mode 100644 index 000000000..e44251aa5 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/ButtonFactory.java @@ -0,0 +1,122 @@ +package com.vijay.jsonwizard.widgets; + +import android.content.Context; +import android.text.TextUtils; +import android.util.TypedValue; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; + +import com.rey.material.util.ViewUtil; +import com.rey.material.widget.Button; +import com.vijay.jsonwizard.R; +import com.vijay.jsonwizard.constants.JsonFormConstants; +import com.vijay.jsonwizard.fragments.JsonFormFragment; +import com.vijay.jsonwizard.interfaces.CommonListener; +import com.vijay.jsonwizard.interfaces.FormWidgetFactory; +import com.vijay.jsonwizard.interfaces.JsonApi; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Jason Rogena - jrogena@ona.io on 07/07/2017. + */ + +public class ButtonFactory implements FormWidgetFactory { + + @Override + public List getViewsFromJson(String stepName, final Context context, + final JsonFormFragment formFragment, JSONObject jsonObject, + CommonListener listener) throws Exception { + String openMrsEntityParent = jsonObject.getString(JsonFormConstants.OPENMRS_ENTITY_PARENT); + String openMrsEntity = jsonObject.getString(JsonFormConstants.OPENMRS_ENTITY); + String openMrsEntityId = jsonObject.getString(JsonFormConstants.OPENMRS_ENTITY_ID); + String relevance = jsonObject.optString(JsonFormConstants.RELEVANCE); + + List views = new ArrayList<>(1); + JSONArray canvasIds = new JSONArray(); + Button button = new Button(context); + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT); + layoutParams.bottomMargin = context.getResources() + .getDimensionPixelSize(R.dimen.extra_bottom_margin); + button.setLayoutParams(layoutParams); + button.setTextSize(TypedValue.COMPLEX_UNIT_PX, context.getResources() + .getDimension(R.dimen.button_text_size)); + button.setTextColor(context.getResources().getColor(android.R.color.white)); + button.setHeight(context.getResources().getDimensionPixelSize(R.dimen.button_height)); + + String hint = jsonObject.optString(JsonFormConstants.HINT); + if (!TextUtils.isEmpty(hint)) { + button.setText(hint); + } + + button.setId(ViewUtil.generateViewId()); + canvasIds.put(button.getId()); + + button.setTag(R.id.key, jsonObject.getString(JsonFormConstants.KEY)); + button.setTag(R.id.openmrs_entity_parent, openMrsEntityParent); + button.setTag(R.id.openmrs_entity, openMrsEntity); + button.setTag(R.id.openmrs_entity_id, openMrsEntityId); + button.setTag(R.id.type, jsonObject.getString(JsonFormConstants.TYPE)); + button.setTag(R.id.address, stepName + ":" + jsonObject.getString(JsonFormConstants.KEY)); + + if (jsonObject.has(JsonFormConstants.READ_ONLY)) { + button.setEnabled(!jsonObject.getBoolean(JsonFormConstants.READ_ONLY)); + button.setFocusable(!jsonObject.getBoolean(JsonFormConstants.READ_ONLY)); + } + + JSONObject action = jsonObject.optJSONObject(JsonFormConstants.ACTION); + if (action != null) { + jsonObject.put(JsonFormConstants.VALUE, Boolean.FALSE.toString()); + jsonObject.getJSONObject(JsonFormConstants.ACTION).put(JsonFormConstants.RESULT, false); + final String behaviour = action.optString(JsonFormConstants.BEHAVIOUR); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + try { + String addressString = (String) v.getTag(R.id.address); + if (!TextUtils.isEmpty(addressString)) { + String[] address = addressString.split(":"); + JSONObject jsonObject = ((JsonApi) context) + .getObjectUsingAddress(address); + jsonObject.put(JsonFormConstants.VALUE, Boolean.TRUE.toString()); + + switch (behaviour) { + case JsonFormConstants.BEHAVIOUR_FINISH_FORM: + formFragment.save(); + break; + case JsonFormConstants.BEHAVIOUR_NEXT_STEP: + formFragment.next(); + break; + default: + jsonObject.getJSONObject(JsonFormConstants.ACTION) + .put(JsonFormConstants.RESULT, false); + jsonObject.put(JsonFormConstants.VALUE, Boolean.FALSE.toString()); + break; + } + } + } catch (JSONException e) { + e.printStackTrace(); + } + } + }); + } + + ((JsonApi) context).addFormDataView(button); + views.add(button); + button.setTag(R.id.canvas_ids, canvasIds.toString()); + if (relevance != null && context instanceof JsonApi) { + button.setTag(R.id.relevance, relevance); + ((JsonApi) context).addSkipLogicView(button); + } + + return views; + } +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/CheckBoxFactory.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/CheckBoxFactory.java new file mode 100644 index 000000000..8bda3e9f7 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/CheckBoxFactory.java @@ -0,0 +1,113 @@ +package com.vijay.jsonwizard.widgets; + +import android.content.Context; +import android.graphics.drawable.ColorDrawable; +import android.text.TextUtils; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.Button; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.rey.material.util.ViewUtil; +import com.vijay.jsonwizard.R; +import com.vijay.jsonwizard.constants.JsonFormConstants; +import com.vijay.jsonwizard.customviews.CheckBox; +import com.vijay.jsonwizard.fragments.JsonFormFragment; +import com.vijay.jsonwizard.interfaces.CommonListener; +import com.vijay.jsonwizard.interfaces.FormWidgetFactory; +import com.vijay.jsonwizard.interfaces.JsonApi; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +import static com.vijay.jsonwizard.utils.FormUtils.*; + +/** + * Created by vijay on 24-05-2015. + */ +public class CheckBoxFactory implements FormWidgetFactory { + @Override + public List getViewsFromJson(String stepName, Context context, JsonFormFragment formFragment, JSONObject jsonObject, CommonListener listener) throws Exception { + List views = new ArrayList<>(1); + JSONArray canvasIds = new JSONArray(); + + String openMrsEntityParent = jsonObject.getString("openmrs_entity_parent"); + String openMrsEntity = jsonObject.getString("openmrs_entity"); + String openMrsEntityId = jsonObject.getString("openmrs_entity_id"); + String relevance = jsonObject.optString("relevance"); + TextView textView = getTextViewWith(context, 27, jsonObject.getString("label"), jsonObject.getString("key"), + jsonObject.getString("type"), openMrsEntityParent, openMrsEntity, openMrsEntityId, + relevance, + getLayoutParams(MATCH_PARENT, WRAP_CONTENT, 0, 0, 0, 0), FONT_BOLD_PATH); + canvasIds.put(textView.getId()); + views.add(textView); + + boolean readOnly = false; + if (jsonObject.has("read_only")) { + readOnly = jsonObject.getBoolean("read_only"); + } + + JSONArray options = jsonObject.getJSONArray(JsonFormConstants.OPTIONS_FIELD_NAME); + ArrayList checkBoxes = new ArrayList<>(); + for (int i = 0; i < options.length(); i++) { + JSONObject item = options.getJSONObject(i); + LinearLayout checkboxLayout = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.item_checkbox, null); + TextView text1 = (TextView) checkboxLayout.findViewById(R.id.text1); + text1.setText(item.getString("text")); + final CheckBox checkBox = (CheckBox) checkboxLayout.findViewById(R.id.checkbox); + checkBoxes.add(checkBox); + checkBox.setTag(R.id.raw_value, item.getString("text")); + checkBox.setTag(R.id.key, jsonObject.getString("key")); + checkBox.setTag(R.id.type, jsonObject.getString("type")); + checkBox.setTag(R.id.openmrs_entity_parent, openMrsEntityParent); + checkBox.setTag(R.id.openmrs_entity, openMrsEntity); + checkBox.setTag(R.id.openmrs_entity_id, openMrsEntityId); + checkBox.setTag(R.id.childKey, item.getString("key")); + checkBox.setTag(R.id.address, stepName + ":" + jsonObject.getString("key")); + //checkBox.setTextSize(context.getResources().getDimension(R.dimen.default_text_size)); + checkBox.setOnCheckedChangeListener(listener); + checkboxLayout.setClickable(true); + checkboxLayout.setId(ViewUtil.generateViewId()); + canvasIds.put(checkboxLayout.getId()); + checkboxLayout.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + checkBox.toggle(); + } + }); + if (!TextUtils.isEmpty(item.optString("value"))) { + checkBox.setChecked(Boolean.valueOf(item.optString("value"))); + } + checkBox.setEnabled(!readOnly); + checkBox.setFocusable(!readOnly); + if (i == options.length() - 1) { + checkboxLayout.setLayoutParams(getLayoutParams(MATCH_PARENT, WRAP_CONTENT, 0, 0, 0, (int) context + .getResources().getDimension(R.dimen.extra_bottom_margin))); + } + + views.add(checkboxLayout); + ((JsonApi) context).addFormDataView(checkBox); + + if (relevance != null && context instanceof JsonApi) { + checkBox.setTag(R.id.relevance, relevance); + ((JsonApi) context).addSkipLogicView(checkBox); + } + + String constraints = item.optString("constraints"); + if (constraints != null && context instanceof JsonApi) { + checkBox.setTag(R.id.constraints, constraints); + ((JsonApi) context).addConstrainedView(checkBox); + } + } + + for(CheckBox checkBox : checkBoxes) { + checkBox.setTag(R.id.canvas_ids, canvasIds.toString()); + } + return views; + } +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/DatePickerFactory.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/DatePickerFactory.java new file mode 100644 index 000000000..02c1ad15d --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/DatePickerFactory.java @@ -0,0 +1,386 @@ +package com.vijay.jsonwizard.widgets; + +import android.app.Activity; +import android.app.Fragment; +import android.app.FragmentTransaction; +import android.content.Context; +import android.os.Build; +import android.support.v4.util.TimeUtils; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.DatePicker; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.rengwuxian.materialedittext.MaterialEditText; +import com.rengwuxian.materialedittext.validation.RegexpValidator; +import com.rey.material.util.ViewUtil; +import com.vijay.jsonwizard.R; +import com.vijay.jsonwizard.customviews.DatePickerDialog; +import com.vijay.jsonwizard.customviews.GenericTextWatcher; +import com.vijay.jsonwizard.fragments.JsonFormFragment; +import com.vijay.jsonwizard.interfaces.CommonListener; +import com.vijay.jsonwizard.interfaces.FormWidgetFactory; +import com.vijay.jsonwizard.interfaces.JsonApi; +import com.vijay.jsonwizard.validators.edittext.RequiredValidator; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author Jason Rogena - jrogena@ona.io + * @since 25/01/2017 + */ +public class DatePickerFactory implements FormWidgetFactory { + private static final String TAG = "DatePickerFactory"; + private static final long DAY_MILLSECONDS = 86400000; + public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("dd-MM-yyyy"); + public static final String DATE_FORMAT_REGEX = "(^(((0[1-9]|1[0-9]|2[0-8])[-](0[1-9]|1[012]))|((29|30|31)[-](0[13578]|1[02]))|((29|30)[-](0[4,6,9]|11)))[-](19|[2-9][0-9])\\d\\d$)|(^29[-]02[-](19|[2-9][0-9])(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)$)|\\s*"; + + @Override + public List getViewsFromJson(String stepName, final Context context, JsonFormFragment formFragment, JSONObject jsonObject, + CommonListener listener) throws Exception { + List views = new ArrayList<>(1); + try { + + RelativeLayout dateViewRelativeLayout = (RelativeLayout) LayoutInflater + .from(context).inflate(R.layout.item_date_picker, null); + + MaterialEditText editText = (MaterialEditText) dateViewRelativeLayout.findViewById(R.id.edit_text); + + TextView duration = (TextView) dateViewRelativeLayout.findViewById(R.id.duration); + + attachJson(stepName, context, formFragment, jsonObject, editText, duration); + + JSONArray canvasIds = new JSONArray(); + dateViewRelativeLayout.setId(ViewUtil.generateViewId()); + canvasIds.put(dateViewRelativeLayout.getId()); + editText.setTag(R.id.canvas_ids, canvasIds.toString()); + + ((JsonApi) context).addFormDataView(editText); + views.add(dateViewRelativeLayout); + + } catch (Exception e) { + e.printStackTrace(); + } + + return views; + } + + protected void attachJson(String stepName, final Context context, JsonFormFragment formFragment, JSONObject jsonObject, final MaterialEditText editText, final TextView duration){ + + try { + String openMrsEntityParent = jsonObject.getString("openmrs_entity_parent"); + String openMrsEntity = jsonObject.getString("openmrs_entity"); + String openMrsEntityId = jsonObject.getString("openmrs_entity_id"); + String relevance = jsonObject.optString("relevance"); + String constraints = jsonObject.optString("constraints"); + + duration.setTag(R.id.key, jsonObject.getString("key")); + duration.setTag(R.id.openmrs_entity_parent, openMrsEntityParent); + duration.setTag(R.id.openmrs_entity, openMrsEntity); + duration.setTag(R.id.openmrs_entity_id, openMrsEntityId); + if (jsonObject.has("duration")) { + duration.setTag(R.id.label, jsonObject.getJSONObject("duration").getString("label")); + } + + editText.setHint(jsonObject.getString("hint")); + editText.setFloatingLabelText(jsonObject.getString("hint")); + editText.setId(ViewUtil.generateViewId()); + editText.setTag(R.id.key, jsonObject.getString("key")); + editText.setTag(R.id.openmrs_entity_parent, openMrsEntityParent); + editText.setTag(R.id.openmrs_entity, openMrsEntity); + editText.setTag(R.id.openmrs_entity_id, openMrsEntityId); + editText.setTag(R.id.address, stepName + ":" + jsonObject.getString("key")); + if (jsonObject.has("v_required")) { + JSONObject requiredObject = jsonObject.optJSONObject("v_required"); + String requiredValue = requiredObject.getString("value"); + if (!TextUtils.isEmpty(requiredValue)) { + if (Boolean.TRUE.toString().equalsIgnoreCase(requiredValue)) { + editText.addValidator(new RequiredValidator(requiredObject.getString("err"))); + } + } + } + + if (!TextUtils.isEmpty(jsonObject.optString("value"))) { + updateDateText(editText, duration, jsonObject.optString("value")); + } else if (jsonObject.has("default")) { + updateDateText(editText, duration, + DATE_FORMAT.format(getDate(jsonObject.getString("default")).getTime())); + } + + if (jsonObject.has("read_only")) { + boolean readOnly = jsonObject.getBoolean("read_only"); + editText.setEnabled(!readOnly); + editText.setFocusable(!readOnly); + } + + editText.addValidator(new RegexpValidator( + context.getResources().getString(R.string.badly_formed_date), + DATE_FORMAT_REGEX)); + + Calendar date = getDate(editText.getText().toString()); + final DatePickerDialog datePickerDialog = new DatePickerDialog(context); + + datePickerDialog.setOnDateSetListener(new android.app.DatePickerDialog.OnDateSetListener() { + @Override + public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { + Calendar calendarDate = Calendar.getInstance(); + calendarDate.set(Calendar.DAY_OF_MONTH, dayOfMonth); + calendarDate.set(Calendar.MONTH, monthOfYear); + calendarDate.set(Calendar.YEAR, year); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB + && calendarDate.getTimeInMillis() >= view.getMinDate() + && calendarDate.getTimeInMillis() <= view.getMaxDate()) { + updateDateText(editText, duration, + DATE_FORMAT.format(calendarDate.getTime())); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + updateDateText(editText, duration, ""); + } + } + }); + + if (jsonObject.has("min_date") && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + Calendar minDate = getDate(jsonObject.getString("min_date")); + minDate.set(Calendar.HOUR_OF_DAY, 0); + minDate.set(Calendar.MINUTE, 0); + minDate.set(Calendar.SECOND, 0); + minDate.set(Calendar.MILLISECOND, 0); + datePickerDialog.setMinDate(minDate.getTimeInMillis()); + } + + if (jsonObject.has("max_date") && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + Calendar maxDate = getDate(jsonObject.getString("max_date")); + maxDate.set(Calendar.HOUR_OF_DAY, 23); + maxDate.set(Calendar.MINUTE, 59); + maxDate.set(Calendar.SECOND, 59); + maxDate.set(Calendar.MILLISECOND, 999); + datePickerDialog.setMaxDate(maxDate.getTimeInMillis()); + } + + if (jsonObject.has("expanded") && jsonObject.getBoolean("expanded") == true + && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + datePickerDialog.setCalendarViewShown(true); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + datePickerDialog.setCalendarViewShown(false); + } + + editText.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + showDatePickerDialog((Activity) context, datePickerDialog, editText); + } + }); + + editText.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + updateDateText(editText, duration, ""); + return true; + } + }); + + GenericTextWatcher genericTextWatcher = new GenericTextWatcher(stepName, formFragment, editText); + genericTextWatcher.addOnFocusChangeListener(new View.OnFocusChangeListener() { + @Override + public void onFocusChange(View v, boolean hasFocus) { + if (hasFocus) { + showDatePickerDialog((Activity) context, datePickerDialog, editText); + } + } + }); + editText.addTextChangedListener(genericTextWatcher); + + if (relevance != null && context instanceof JsonApi) { + editText.setTag(R.id.relevance, relevance); + ((JsonApi) context).addSkipLogicView(editText); + } + + if (constraints != null && context instanceof JsonApi) { + editText.setTag(R.id.constraints, constraints); + ((JsonApi) context).addConstrainedView(editText); + } + } catch (Exception e) { + e.printStackTrace(); + } + + } + + + + private static void updateDateText(MaterialEditText editText, TextView duration, String date) { + editText.setText(date); + String durationLabel = (String) duration.getTag(R.id.label); + if (!TextUtils.isEmpty(durationLabel)) { + String durationText = getDuration(date); + if (!TextUtils.isEmpty(durationText)) { + durationText = String.format("(%s: %s)", durationLabel, durationText); + } + duration.setText(durationText); + } + } + + private static String getDuration(String date) { + if (!TextUtils.isEmpty(date)) { + Calendar calendar = getDate(date); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + + Calendar now = Calendar.getInstance(); + now.set(Calendar.HOUR_OF_DAY, 0); + now.set(Calendar.MINUTE, 0); + now.set(Calendar.SECOND, 0); + now.set(Calendar.MILLISECOND, 0); + + long timeDiff = Math.abs(now.getTimeInMillis() - calendar.getTimeInMillis()); + StringBuilder builder = new StringBuilder(); + TimeUtils.formatDuration(timeDiff, builder); + String duration = ""; + if (timeDiff >= 0 + && timeDiff <= TimeUnit.MILLISECONDS.convert(13, TimeUnit.DAYS)) { + // Represent in days + long days = TimeUnit.DAYS.convert(timeDiff, TimeUnit.MILLISECONDS); + duration = days + "d"; + } else if (timeDiff > TimeUnit.MILLISECONDS.convert(13, TimeUnit.DAYS) + && timeDiff <= TimeUnit.MILLISECONDS.convert(97, TimeUnit.DAYS)) { + // Represent in weeks and days + int weeks = (int) Math.floor((float) timeDiff / + TimeUnit.MILLISECONDS.convert(7, TimeUnit.DAYS)); + int days = (int) Math.floor((float) (timeDiff - + TimeUnit.MILLISECONDS.convert(weeks * 7, TimeUnit.DAYS)) / + TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS)); + + if (days >= 7) { + days = 0; + weeks++; + } + + duration = weeks + "w"; + if (days > 0) { + duration += " " + days + "d"; + } + } else if (timeDiff > TimeUnit.MILLISECONDS.convert(97, TimeUnit.DAYS) + && timeDiff <= TimeUnit.MILLISECONDS.convert(363, TimeUnit.DAYS)) { + // Represent in months and weeks + int months = (int) Math.floor((float) timeDiff / + TimeUnit.MILLISECONDS.convert(30, TimeUnit.DAYS)); + int weeks = (int) Math.floor((float) (timeDiff - TimeUnit.MILLISECONDS.convert( + months * 30, TimeUnit.DAYS)) / + TimeUnit.MILLISECONDS.convert(7, TimeUnit.DAYS)); + + if (weeks >= 4) { + weeks = 0; + months++; + } + + if(months < 12) { + duration = months + "m"; + if (weeks > 0 && months < 12) { + duration += " " + weeks + "w"; + } + } + else if (months >= 12) { + duration = "1y"; + } + } else { + // Represent in years and months + int years = (int) Math.floor((float) timeDiff + / TimeUnit.MILLISECONDS.convert(365, TimeUnit.DAYS)); + int months = (int) Math.floor((float) (timeDiff - + TimeUnit.MILLISECONDS.convert(years * 365, TimeUnit.DAYS)) / + TimeUnit.MILLISECONDS.convert(30, TimeUnit.DAYS)); + + if (months >= 12) { + months = 0; + years++; + } + + duration = years + "y"; + if (months > 0) { + duration += " " + months + "m"; + } + } + + return duration; + } + return null; + } + + private static void showDatePickerDialog(Activity context, + DatePickerDialog datePickerDialog, + MaterialEditText editText) { + FragmentTransaction ft = context.getFragmentManager().beginTransaction(); + Fragment prev = context.getFragmentManager().findFragmentByTag(TAG); + if (prev != null) { + ft.remove(prev); + } + + ft.addToBackStack(null); + + datePickerDialog.show(ft, TAG); + Calendar date = getDate(editText.getText().toString()); + datePickerDialog.setDate(date.getTime()); + } + + /** + * This method returns a {@link Calendar} object at mid-day corresponding to a date matching + * the format specified in {@code DATE_FORMAT} or a day in reference to today e.g today, + * today-1, today+10 + * + * @param dayString The string to be converted to a date + * @return The calendar object corresponding to the day, or object corresponding to today's + * date if an error occurred + */ + private static Calendar getDate(String dayString) { + Calendar calendarDate = Calendar.getInstance(); + + if (dayString != null && dayString.trim().length() > 0) { + dayString = dayString.trim().toLowerCase(); + if (!dayString.equals("today")) { + Pattern pattern = Pattern.compile("today\\s*([-\\+])\\s*(\\d+)([dmyDMY]{1})"); + Matcher matcher = pattern.matcher(dayString); + if (matcher.find()) { + int timeValue = Integer.parseInt(matcher.group(2)); + if (matcher.group(1).equals("-")) { + timeValue = timeValue * -1; + } + + int field = Calendar.DATE; + if (matcher.group(3).toLowerCase().equals("y")) { + field = Calendar.YEAR; + } else if (matcher.group(3).toLowerCase().equals("m")) { + field = Calendar.MONTH; + } + + calendarDate.add(field, timeValue); + } else { + try { + calendarDate.setTime(DATE_FORMAT.parse(dayString)); + } catch (ParseException e) { + e.printStackTrace(); + } + } + } + } + + //set time to mid-day + calendarDate.set(Calendar.HOUR_OF_DAY, 12); + calendarDate.set(Calendar.MINUTE, 0); + calendarDate.set(Calendar.SECOND, 0); + calendarDate.set(Calendar.MILLISECOND, 0); + + return calendarDate; + } +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/EditTextFactory.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/EditTextFactory.java new file mode 100644 index 000000000..fcff580d9 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/EditTextFactory.java @@ -0,0 +1,212 @@ +package com.vijay.jsonwizard.widgets; + +import android.content.Context; +import android.text.InputType; +import android.text.TextUtils; +import android.util.Patterns; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.RelativeLayout; + +import com.rengwuxian.materialedittext.MaterialEditText; +import com.rengwuxian.materialedittext.validation.RegexpValidator; +import com.rey.material.util.ViewUtil; +import com.vijay.jsonwizard.R; +import com.vijay.jsonwizard.customviews.GenericTextWatcher; +import com.vijay.jsonwizard.fragments.JsonFormFragment; +import com.vijay.jsonwizard.interfaces.CommonListener; +import com.vijay.jsonwizard.interfaces.FormWidgetFactory; +import com.vijay.jsonwizard.interfaces.JsonApi; +import com.vijay.jsonwizard.utils.ValidationStatus; +import com.vijay.jsonwizard.validators.edittext.MaxLengthValidator; +import com.vijay.jsonwizard.validators.edittext.MaxNumericValidator; +import com.vijay.jsonwizard.validators.edittext.MinLengthValidator; +import com.vijay.jsonwizard.validators.edittext.MinNumericValidator; +import com.vijay.jsonwizard.validators.edittext.RequiredValidator; +import com.vijay.jsonwizard.views.JsonFormFragmentView; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by vijay on 24-05-2015. + */ +public class EditTextFactory implements FormWidgetFactory { + private static final String TAG = "EditTextFactory"; + public static final int MIN_LENGTH = 0; + public static final int MAX_LENGTH = 100; + + @Override + public List getViewsFromJson(String stepName, Context context, JsonFormFragment formFragment, JSONObject jsonObject, CommonListener listener) throws Exception { + List views = new ArrayList<>(1); + + RelativeLayout rootLayout = (RelativeLayout) LayoutInflater.from(context).inflate( + R.layout.item_edit_text, null); + MaterialEditText editText = (MaterialEditText) rootLayout.findViewById(R.id.edit_text); + + attachJson(stepName, context, formFragment, jsonObject, editText); + + JSONArray canvasIds = new JSONArray(); + rootLayout.setId(ViewUtil.generateViewId()); + canvasIds.put(rootLayout.getId()); + editText.setTag(R.id.canvas_ids, canvasIds.toString()); + + ((JsonApi) context).addFormDataView(editText); + views.add(rootLayout); + return views; + } + + protected void attachJson(String stepName, Context context, JsonFormFragment formFragment, JSONObject jsonObject, MaterialEditText editText) throws Exception { + + String openMrsEntityParent = jsonObject.getString("openmrs_entity_parent"); + String openMrsEntity = jsonObject.getString("openmrs_entity"); + String openMrsEntityId = jsonObject.getString("openmrs_entity_id"); + String relevance = jsonObject.optString("relevance"); + String constraints = jsonObject.optString("constraints"); + + int minLength = MIN_LENGTH; + int maxLength = MAX_LENGTH; + + + editText.setHint(jsonObject.getString("hint")); + editText.setFloatingLabelText(jsonObject.getString("hint")); + editText.setId(ViewUtil.generateViewId()); + editText.setTag(R.id.key, jsonObject.getString("key")); + editText.setTag(R.id.openmrs_entity_parent, openMrsEntityParent); + editText.setTag(R.id.openmrs_entity, openMrsEntity); + editText.setTag(R.id.openmrs_entity_id, openMrsEntityId); + editText.setTag(R.id.type, jsonObject.getString("type")); + editText.setTag(R.id.address, stepName + ":" + jsonObject.getString("key")); + + if (!TextUtils.isEmpty(jsonObject.optString("value"))) { + editText.setText(jsonObject.optString("value")); + } + + if (jsonObject.has("read_only")) { + boolean readyOnly = jsonObject.getBoolean("read_only"); + editText.setEnabled(!readyOnly); + editText.setFocusable(!readyOnly); + } + + //add validators + JSONObject requiredObject = jsonObject.optJSONObject("v_required"); + if (requiredObject != null) { + String requiredValue = requiredObject.getString("value"); + if (!TextUtils.isEmpty(requiredValue)) { + if (Boolean.TRUE.toString().equalsIgnoreCase(requiredValue)) { + editText.addValidator(new RequiredValidator(requiredObject.getString("err"))); + } + } + } + + JSONObject minLengthObject = jsonObject.optJSONObject("v_min_length"); + if (minLengthObject != null) { + String minLengthValue = minLengthObject.optString("value"); + if (!TextUtils.isEmpty(minLengthValue)) { + minLength = Integer.parseInt(minLengthValue); + editText.addValidator(new MinLengthValidator(minLengthObject.getString("err"), Integer.parseInt(minLengthValue))); + } + } + + JSONObject maxLengthObject = jsonObject.optJSONObject("v_max_length"); + if (maxLengthObject != null) { + String maxLengthValue = maxLengthObject.optString("value"); + if (!TextUtils.isEmpty(maxLengthValue)) { + maxLength = Integer.parseInt(maxLengthValue); + editText.addValidator(new MaxLengthValidator(maxLengthObject.getString("err"), Integer.parseInt(maxLengthValue))); + } + } + + editText.setMaxCharacters(maxLength); + editText.setMinCharacters(minLength); + + JSONObject regexObject = jsonObject.optJSONObject("v_regex"); + if (regexObject != null) { + String regexValue = regexObject.optString("value"); + if (!TextUtils.isEmpty(regexValue)) { + editText.addValidator(new RegexpValidator(regexObject.getString("err"), regexValue)); + } + } + + JSONObject emailObject = jsonObject.optJSONObject("v_email"); + if (emailObject != null) { + String emailValue = emailObject.optString("value"); + if (!TextUtils.isEmpty(emailValue)) { + if (Boolean.TRUE.toString().equalsIgnoreCase(emailValue)) { + editText.addValidator(new RegexpValidator(emailObject.getString("err"), android.util.Patterns.EMAIL_ADDRESS.toString())); + } + } + } + + JSONObject urlObject = jsonObject.optJSONObject("v_url"); + if (urlObject != null) { + String urlValue = urlObject.optString("value"); + if (!TextUtils.isEmpty(urlValue)) { + if (Boolean.TRUE.toString().equalsIgnoreCase(urlValue)) { + editText.addValidator(new RegexpValidator(urlObject.getString("err"), Patterns.WEB_URL.toString())); + } + } + } + + JSONObject numericObject = jsonObject.optJSONObject("v_numeric"); + if (numericObject != null) { + String numericValue = numericObject.optString("value"); + if (!TextUtils.isEmpty(numericValue)) { + if (Boolean.TRUE.toString().equalsIgnoreCase(numericValue)) { + editText.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL); + editText.addValidator(new RegexpValidator(numericObject.getString("err"), + "[0-9]*\\.?[0-9]*")); + + if (jsonObject.has("v_min")) { + JSONObject minValidation = jsonObject.getJSONObject("v_min"); + editText.addValidator(new MinNumericValidator(minValidation.getString("err"), + Double.parseDouble(minValidation.getString("value")))); + } + + if (jsonObject.has("v_max")) { + JSONObject minValidation = jsonObject.getJSONObject("v_min"); + editText.addValidator(new MaxNumericValidator(minValidation.getString("err"), + Double.parseDouble(minValidation.getString("value")))); + } + } + } + } + + // edit type check + String editType = jsonObject.optString("edit_type"); + if (!TextUtils.isEmpty(editType)) { + if (editType.equals("number")) { + editText.setRawInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL); + } else if (editType.equals("name")) { + editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS); + } + } + + editText.addTextChangedListener(new GenericTextWatcher(stepName, formFragment, editText)); + if (relevance != null && context instanceof JsonApi) { + editText.setTag(R.id.relevance, relevance); + ((JsonApi) context).addSkipLogicView(editText); + } + + if (constraints != null && context instanceof JsonApi) { + editText.setTag(R.id.constraints, constraints); + ((JsonApi) context).addConstrainedView(editText); + } + + } + + public static ValidationStatus validate(JsonFormFragmentView formFragmentView, + MaterialEditText editText) { + if (editText.isEnabled()) { + boolean validate = editText.validate(); + if (!validate) { + return new ValidationStatus(false, editText.getError().toString(), formFragmentView, editText); + } + } + return new ValidationStatus(true, null, formFragmentView, editText); + } + +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/ImagePickerFactory.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/ImagePickerFactory.java new file mode 100644 index 000000000..0598b6363 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/ImagePickerFactory.java @@ -0,0 +1,148 @@ +package com.vijay.jsonwizard.widgets; + +import android.content.Context; +import android.content.res.Resources; +import android.text.TextUtils; +import android.util.TypedValue; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.LinearLayout; + +import com.rey.material.util.ViewUtil; +import com.vijay.jsonwizard.R; +import com.vijay.jsonwizard.fragments.JsonFormFragment; +import com.vijay.jsonwizard.interfaces.CommonListener; +import com.vijay.jsonwizard.interfaces.FormWidgetFactory; +import com.vijay.jsonwizard.interfaces.JsonApi; +import com.vijay.jsonwizard.utils.FormUtils; +import com.vijay.jsonwizard.utils.ImageUtils; +import com.vijay.jsonwizard.utils.ValidationStatus; +import com.vijay.jsonwizard.views.JsonFormFragmentView; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +import static com.vijay.jsonwizard.utils.FormUtils.MATCH_PARENT; +import static com.vijay.jsonwizard.utils.FormUtils.WRAP_CONTENT; +import static com.vijay.jsonwizard.utils.FormUtils.dpToPixels; +import static com.vijay.jsonwizard.utils.FormUtils.getLayoutParams; + +/** + * Created by vijay on 24-05-2015. + */ +public class ImagePickerFactory implements FormWidgetFactory { + + @Override + public List getViewsFromJson(String stepName, Context context, JsonFormFragment formFragment, JSONObject jsonObject, CommonListener listener) throws Exception { + String openMrsEntityParent = jsonObject.getString("openmrs_entity_parent"); + String openMrsEntity = jsonObject.getString("openmrs_entity"); + String openMrsEntityId = jsonObject.getString("openmrs_entity_id"); + String relevance = jsonObject.optString("relevance"); + JSONArray canvasIds = new JSONArray(); + + List views = new ArrayList<>(1); + ImageView imageView = new ImageView(context); + imageView.setId(ViewUtil.generateViewId()); + canvasIds.put(imageView.getId()); + imageView.setImageDrawable(context.getResources().getDrawable(R.mipmap.grey_bg)); + imageView.setTag(R.id.key, jsonObject.getString("key")); + imageView.setTag(R.id.openmrs_entity_parent, openMrsEntityParent); + imageView.setTag(R.id.openmrs_entity, openMrsEntity); + imageView.setTag(R.id.openmrs_entity_id, openMrsEntityId); + imageView.setTag(R.id.type, jsonObject.getString("type")); + imageView.setTag(R.id.address, stepName + ":" + jsonObject.getString("key")); + if (relevance != null && context instanceof JsonApi) { + imageView.setTag(R.id.relevance, relevance); + ((JsonApi) context).addSkipLogicView(imageView); + } + + JSONObject requiredObject = jsonObject.optJSONObject("v_required"); + if (requiredObject != null) { + String requiredValue = requiredObject.getString("value"); + if (!TextUtils.isEmpty(requiredValue)) { + imageView.setTag(R.id.v_required, requiredValue); + imageView.setTag(R.id.error, requiredObject.optString("err")); + } + } + + imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); + imageView.setLayoutParams(getLayoutParams(MATCH_PARENT, dpToPixels(context, 200), 0, 0, 0, (int) context + .getResources().getDimension(R.dimen.default_bottom_margin))); + String imagePath = jsonObject.optString("value"); + Button uploadButton = new Button(context); + if (!TextUtils.isEmpty(imagePath)) { + imageView.setTag(R.id.imagePath, imagePath); + imageView.setImageBitmap(ImageUtils.loadBitmapFromFile(context, imagePath, ImageUtils.getDeviceWidth(context), dpToPixels(context, 200))); + } + + if (jsonObject.has("read_only")) { + boolean readOnly = jsonObject.getBoolean("read_only"); + uploadButton.setEnabled(!readOnly); + uploadButton.setFocusable(!readOnly); + } + + ((JsonApi) context).addFormDataView(imageView); + views.add(imageView); + + uploadButton.setText(jsonObject.getString("uploadButtonText")); + uploadButton.setTextColor(context.getResources().getColor(android.R.color.white)); + uploadButton.setTextSize(TypedValue.COMPLEX_UNIT_PX, + context.getResources().getDimension(R.dimen.button_text_size)); + uploadButton.setPadding( + context.getResources().getDimensionPixelSize(R.dimen.button_padding), + context.getResources().getDimensionPixelSize(R.dimen.button_padding), + context.getResources().getDimensionPixelSize(R.dimen.button_padding), + context.getResources().getDimensionPixelSize(R.dimen.button_padding)); + uploadButton.setLayoutParams(getLayoutParams(WRAP_CONTENT, WRAP_CONTENT, 0, 0, 0, (int) context + .getResources().getDimension(R.dimen.default_bottom_margin))); + uploadButton.setOnClickListener(listener); + uploadButton.setTag(R.id.key, jsonObject.getString("key")); + uploadButton.setTag(R.id.openmrs_entity_parent, openMrsEntityParent); + uploadButton.setTag(R.id.openmrs_entity, openMrsEntity); + uploadButton.setTag(R.id.openmrs_entity_id, openMrsEntityId); + uploadButton.setTag(R.id.type, jsonObject.getString("type")); + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT); + params.setMargins(0, 0, 0, dp2px(context, 20)); + uploadButton.setLayoutParams(params); + + uploadButton.setId(ViewUtil.generateViewId()); + canvasIds.put(uploadButton.getId()); + uploadButton.setTag(R.id.canvas_ids, canvasIds.toString()); + + views.add(uploadButton); + if (relevance != null && context instanceof JsonApi) { + uploadButton.setTag(R.id.relevance, relevance); + ((JsonApi) context).addSkipLogicView(uploadButton); + } + return views; + } + + public static int dp2px(Context context, float dp) { + Resources r = context.getResources(); + float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, r.getDisplayMetrics()); + return Math.round(px); + } + + public static ValidationStatus validate(JsonFormFragmentView formFragmentView, + ImageView imageView) { + if (!(imageView.getTag(R.id.v_required) instanceof String) || !(imageView.getTag(R.id.error) instanceof String)) { + return new ValidationStatus(true, null, formFragmentView, imageView); + } + Boolean isRequired = Boolean.valueOf((String) imageView.getTag(R.id.v_required)); + if (!isRequired || !imageView.isEnabled()) { + return new ValidationStatus(true, null, formFragmentView, imageView); + } + Object path = imageView.getTag(R.id.imagePath); + if (path instanceof String && !TextUtils.isEmpty((String) path)) { + return new ValidationStatus(true, null, formFragmentView, imageView); + } + return new ValidationStatus(false, (String) imageView.getTag(R.id.error), formFragmentView, imageView); + } +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/LabelFactory.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/LabelFactory.java new file mode 100644 index 000000000..26b463d7a --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/LabelFactory.java @@ -0,0 +1,39 @@ +package com.vijay.jsonwizard.widgets; + +import android.content.Context; +import android.view.View; +import android.widget.LinearLayout; + +import com.vijay.jsonwizard.R; +import com.vijay.jsonwizard.fragments.JsonFormFragment; +import com.vijay.jsonwizard.interfaces.CommonListener; +import com.vijay.jsonwizard.interfaces.FormWidgetFactory; + +import static com.vijay.jsonwizard.utils.FormUtils.*; + +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by vijay on 24-05-2015. + */ +public class LabelFactory implements FormWidgetFactory { + @Override + public List getViewsFromJson(String stepName, Context context, JsonFormFragment formFragment, JSONObject jsonObject, CommonListener listener) throws Exception { + String openMrsEntityParent = jsonObject.getString("openmrs_entity_parent"); + String openMrsEntity = jsonObject.getString("openmrs_entity"); + String openMrsEntityId = jsonObject.getString("openmrs_entity_id"); + String relevance = jsonObject.optString("relevance"); + + List views = new ArrayList<>(1); + LinearLayout.LayoutParams layoutParams = getLayoutParams(WRAP_CONTENT, WRAP_CONTENT, 0, 0, 0, (int) context + .getResources().getDimension(R.dimen.default_bottom_margin)); + views.add(getTextViewWith(context, 27, jsonObject.getString("text"), jsonObject.getString("key"), + jsonObject.getString("type"), openMrsEntityParent, openMrsEntity, openMrsEntityId, + relevance, layoutParams, FONT_BOLD_PATH)); + return views; + } + +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/RadioButtonFactory.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/RadioButtonFactory.java new file mode 100644 index 000000000..1bb046a3d --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/RadioButtonFactory.java @@ -0,0 +1,98 @@ +package com.vijay.jsonwizard.widgets; + +import android.content.Context; +import android.text.TextUtils; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.TextView; + +import com.rey.material.util.ViewUtil; +import com.vijay.jsonwizard.R; +import com.vijay.jsonwizard.constants.JsonFormConstants; +import com.vijay.jsonwizard.customviews.RadioButton; +import com.vijay.jsonwizard.fragments.JsonFormFragment; +import com.vijay.jsonwizard.interfaces.CommonListener; +import com.vijay.jsonwizard.interfaces.FormWidgetFactory; +import com.vijay.jsonwizard.interfaces.JsonApi; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +import static com.vijay.jsonwizard.utils.FormUtils.*; + +/** + * Created by vijay on 24-05-2015. + */ +public class RadioButtonFactory implements FormWidgetFactory { + @Override + public List getViewsFromJson(String stepName, Context context, JsonFormFragment formFragment, JSONObject jsonObject, CommonListener listener) throws Exception { + String openMrsEntityParent = jsonObject.getString("openmrs_entity_parent"); + String openMrsEntity = jsonObject.getString("openmrs_entity"); + String openMrsEntityId = jsonObject.getString("openmrs_entity_id"); + String relevance = jsonObject.optString("relevance"); + + List views = new ArrayList<>(1); + + JSONArray canvasIds = new JSONArray(); + TextView textView = getTextViewWith(context, 27, jsonObject.getString("label"), jsonObject.getString("key"), + jsonObject.getString("type"), openMrsEntityParent, openMrsEntity, openMrsEntityId, + relevance, + getLayoutParams(MATCH_PARENT, WRAP_CONTENT, 0, 0, 0, 0), FONT_BOLD_PATH); + canvasIds.put(textView.getId()); + + views.add(textView); + boolean readOnly = false; + if (jsonObject.has("read_only")) { + readOnly = jsonObject.getBoolean("read_only"); + } + JSONArray options = jsonObject.getJSONArray(JsonFormConstants.OPTIONS_FIELD_NAME); + ArrayList radioButtons = new ArrayList<>(); + for (int i = 0; i < options.length(); i++) { + JSONObject item = options.getJSONObject(i); + RadioButton radioButton = (RadioButton) LayoutInflater.from(context).inflate(R.layout.item_radiobutton, + null); + radioButton.setId(ViewUtil.generateViewId()); + radioButton.setText(item.getString("text")); + radioButton.setTag(R.id.key, jsonObject.getString("key")); + radioButton.setTag(R.id.openmrs_entity_parent, openMrsEntityParent); + radioButton.setTag(R.id.openmrs_entity, openMrsEntity); + radioButton.setTag(R.id.openmrs_entity_id, openMrsEntityId); + radioButton.setTag(R.id.type, jsonObject.getString("type")); + radioButton.setTag(R.id.childKey, item.getString("key")); + radioButton.setGravity(Gravity.CENTER_VERTICAL); + radioButton.setTag(R.id.address, stepName + ":" + jsonObject.getString("key")); +// radioButton.setTextSize(context.getResources().getDimension(R.dimen.default_text_size)); + radioButton.setOnCheckedChangeListener(listener); + if (!TextUtils.isEmpty(jsonObject.optString("value")) + && jsonObject.optString("value").equals(item.getString("key"))) { + radioButton.setChecked(true); + } + radioButton.setEnabled(!readOnly); + radioButton.setFocusable(!readOnly); + if (i == options.length() - 1) { + radioButton.setLayoutParams(getLayoutParams(MATCH_PARENT, WRAP_CONTENT, 0, 0, 0, (int) context + .getResources().getDimension(R.dimen.extra_bottom_margin))); + } + ((JsonApi) context).addFormDataView(radioButton); + + canvasIds.put(radioButton.getId()); + radioButtons.add(radioButton); + + views.add(radioButton); + if (relevance != null && context instanceof JsonApi) { + radioButton.setTag(R.id.relevance, relevance); + ((JsonApi) context).addSkipLogicView(radioButton); + } + } + + for (RadioButton radioButton : radioButtons) { + radioButton.setTag(R.id.canvas_ids, canvasIds.toString()); + } + + return views; + } +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/SectionFactory.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/SectionFactory.java new file mode 100644 index 000000000..5692ee22b --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/SectionFactory.java @@ -0,0 +1,38 @@ +package com.vijay.jsonwizard.widgets; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.RelativeLayout; + +import com.rey.material.widget.TextView; +import com.vijay.jsonwizard.R; +import com.vijay.jsonwizard.fragments.JsonFormFragment; +import com.vijay.jsonwizard.interfaces.CommonListener; +import com.vijay.jsonwizard.interfaces.FormWidgetFactory; + +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by vijay on 24-05-2015. + */ +public class SectionFactory implements FormWidgetFactory { + @Override + public List getViewsFromJson(String stepName, Context context, JsonFormFragment formFragment, JSONObject jsonObject, CommonListener listener) throws Exception { + List views = new ArrayList<>(1); + + String text = jsonObject.getString("name"); + + RelativeLayout rootLayout = (RelativeLayout) LayoutInflater.from(context).inflate( + R.layout.item_section_label, null); + TextView textView = (TextView) rootLayout.findViewById(R.id.section_label); + textView.setText(text); + + views.add(rootLayout); + return views; + } + +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/SpinnerFactory.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/SpinnerFactory.java new file mode 100644 index 000000000..5c5386ec9 --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/SpinnerFactory.java @@ -0,0 +1,122 @@ +package com.vijay.jsonwizard.widgets; + +import android.content.Context; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ArrayAdapter; + +import com.rey.material.util.ViewUtil; +import com.vijay.jsonwizard.R; +import com.vijay.jsonwizard.customviews.MaterialSpinner; +import com.vijay.jsonwizard.fragments.JsonFormFragment; +import com.vijay.jsonwizard.interfaces.CommonListener; +import com.vijay.jsonwizard.interfaces.FormWidgetFactory; +import com.vijay.jsonwizard.interfaces.JsonApi; +import com.vijay.jsonwizard.utils.ValidationStatus; +import com.vijay.jsonwizard.views.JsonFormFragmentView; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by nipun on 30/05/15. + */ +public class SpinnerFactory implements FormWidgetFactory { + + @Override + public List getViewsFromJson(String stepName, Context context, JsonFormFragment formFragment, JSONObject jsonObject, CommonListener listener) throws Exception { + String openMrsEntityParent = jsonObject.getString("openmrs_entity_parent"); + String openMrsEntity = jsonObject.getString("openmrs_entity"); + String openMrsEntityId = jsonObject.getString("openmrs_entity_id"); + String relevance = jsonObject.optString("relevance"); + + List views = new ArrayList<>(1); + JSONArray canvasIds = new JSONArray(); + MaterialSpinner spinner = (MaterialSpinner) LayoutInflater.from(context).inflate(R.layout.item_spinner, null); + + String hint = jsonObject.optString("hint"); + if (!TextUtils.isEmpty(hint)) { + spinner.setHint(jsonObject.getString("hint")); + spinner.setFloatingLabelText(jsonObject.getString("hint")); + } + + spinner.setId(ViewUtil.generateViewId()); + canvasIds.put(spinner.getId()); + + spinner.setTag(R.id.key, jsonObject.getString("key")); + spinner.setTag(R.id.openmrs_entity_parent, openMrsEntityParent); + spinner.setTag(R.id.openmrs_entity, openMrsEntity); + spinner.setTag(R.id.openmrs_entity_id, openMrsEntityId); + spinner.setTag(R.id.type, jsonObject.getString("type")); + spinner.setTag(R.id.address, stepName + ":" + jsonObject.getString("key")); + + JSONObject requiredObject = jsonObject.optJSONObject("v_required"); + if (requiredObject != null) { + String requiredValue = requiredObject.getString("value"); + if (!TextUtils.isEmpty(requiredValue)) { + spinner.setTag(R.id.v_required, requiredValue); + spinner.setTag(R.id.error, requiredObject.optString("err")); + } + } + + String valueToSelect = ""; + int indexToSelect = -1; + if (!TextUtils.isEmpty(jsonObject.optString("value"))) { + valueToSelect = jsonObject.optString("value"); + } + + if (jsonObject.has("read_only")) { + spinner.setEnabled(!jsonObject.getBoolean("read_only")); + spinner.setFocusable(!jsonObject.getBoolean("read_only")); + } + + JSONArray valuesJson = jsonObject.optJSONArray("values"); + String[] values = null; + if (valuesJson != null && valuesJson.length() > 0) { + values = new String[valuesJson.length()]; + for (int i = 0; i < valuesJson.length(); i++) { + values[i] = valuesJson.optString(i); + if (valueToSelect.equals(values[i])) { + indexToSelect = i; + } + } + } + + if (values != null) { + ArrayAdapter adapter = new ArrayAdapter<>(context, R.layout.simple_list_item_1, values); + + spinner.setAdapter(adapter); + + spinner.setSelection(indexToSelect + 1, true); + spinner.setOnItemSelectedListener(listener); + } + ((JsonApi) context).addFormDataView(spinner); + views.add(spinner); + spinner.setTag(R.id.canvas_ids, canvasIds.toString()); + if (relevance != null && context instanceof JsonApi) { + spinner.setTag(R.id.relevance, relevance); + ((JsonApi) context).addSkipLogicView(spinner); + } + return views; + } + + public static ValidationStatus validate(JsonFormFragmentView formFragmentView, + MaterialSpinner spinner) { + if (!(spinner.getTag(R.id.v_required) instanceof String) || !(spinner.getTag(R.id.error) instanceof String)) { + return new ValidationStatus(true, null, formFragmentView, spinner); + } + Boolean isRequired = Boolean.valueOf((String) spinner.getTag(R.id.v_required)); + if (!isRequired || !spinner.isEnabled()) { + return new ValidationStatus(true, null, formFragmentView, spinner); + } + int selectedItemPosition = spinner.getSelectedItemPosition(); + if(selectedItemPosition > 0) { + return new ValidationStatus(true, null, formFragmentView, spinner); + } + return new ValidationStatus(false, (String) spinner.getTag(R.id.error), formFragmentView, spinner); + } +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/TreeViewFactory.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/TreeViewFactory.java new file mode 100644 index 000000000..01011255a --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/TreeViewFactory.java @@ -0,0 +1,203 @@ +package com.vijay.jsonwizard.widgets; + +import android.app.Activity; +import android.content.Context; +import android.content.DialogInterface; +import android.text.TextUtils; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; +import android.widget.RelativeLayout; + +import com.rengwuxian.materialedittext.MaterialEditText; +import com.rey.material.util.ViewUtil; +import com.vijay.jsonwizard.R; +import com.vijay.jsonwizard.customviews.GenericTextWatcher; +import com.vijay.jsonwizard.customviews.TreeViewDialog; +import com.vijay.jsonwizard.fragments.JsonFormFragment; +import com.vijay.jsonwizard.interfaces.CommonListener; +import com.vijay.jsonwizard.interfaces.FormWidgetFactory; +import com.vijay.jsonwizard.interfaces.JsonApi; +import com.vijay.jsonwizard.validators.edittext.RequiredValidator; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +import static android.view.inputmethod.InputMethodManager.HIDE_NOT_ALWAYS; + +/** + * @author Jason Rogena - jrogena@ona.io + * @since 07/02/2017 + */ +public class TreeViewFactory implements FormWidgetFactory { + private static final String TAG = "TreeViewFactory"; + + @Override + public List getViewsFromJson(String stepName, final Context context, JsonFormFragment formFragment, JSONObject + jsonObject, CommonListener listener) throws Exception { + List views = new ArrayList<>(1); + try { + String openMrsEntityParent = jsonObject.getString("openmrs_entity_parent"); + String openMrsEntity = jsonObject.getString("openmrs_entity"); + String openMrsEntityId = jsonObject.getString("openmrs_entity_id"); + String relevance = jsonObject.optString("relevance"); + String constraints = jsonObject.optString("constraints"); + + JSONArray canvasIds = new JSONArray(); + RelativeLayout rootLayout = (RelativeLayout) LayoutInflater.from(context).inflate( + R.layout.item_edit_text, null); + rootLayout.setId(ViewUtil.generateViewId()); + canvasIds.put(rootLayout.getId()); + final MaterialEditText editText = (MaterialEditText) rootLayout.findViewById(R.id.edit_text); + editText.setHint(jsonObject.getString("hint")); + editText.setFloatingLabelText(jsonObject.getString("hint")); + editText.setId(ViewUtil.generateViewId()); + editText.setTag(R.id.key, jsonObject.getString("key")); + editText.setTag(R.id.openmrs_entity_parent, openMrsEntityParent); + editText.setTag(R.id.openmrs_entity, openMrsEntity); + editText.setTag(R.id.openmrs_entity_id, openMrsEntityId); + editText.setTag(R.id.address, stepName + ":" + jsonObject.getString("key")); + if (jsonObject.has("v_required")) { + JSONObject requiredObject = jsonObject.optJSONObject("v_required"); + String requiredValue = requiredObject.getString("value"); + if (!TextUtils.isEmpty(requiredValue)) { + if (Boolean.TRUE.toString().equalsIgnoreCase(requiredValue)) { + editText.addValidator(new RequiredValidator(requiredObject.getString("err"))); + } + } + } + final String defaultValueString = jsonObject.optString("default"); + final String valueString = jsonObject.optString("value"); + + if (jsonObject.has("read_only")) { + boolean readOnly = jsonObject.getBoolean("read_only"); + editText.setEnabled(!readOnly); + editText.setFocusable(!readOnly); + } + + ArrayList defaultValue = new ArrayList<>(); + try { + JSONArray jsonArray = new JSONArray(defaultValueString); + for (int i = 0; i < jsonArray.length(); i++) { + defaultValue.add(jsonArray.getString(i)); + } + } catch (JSONException e) { + } + + ArrayList value = new ArrayList<>(); + try { + JSONArray jsonArray = new JSONArray(valueString); + for (int i = 0; i < jsonArray.length(); i++) { + value.add(jsonArray.getString(i)); + } + } catch (JSONException e) { + } + + + final TreeViewDialog treeViewDialog = new TreeViewDialog(context, + jsonObject.getJSONArray("tree"), defaultValue, value); + + if (!TextUtils.isEmpty(jsonObject.optString("value"))) { + JSONArray name = new JSONArray(treeViewDialog.getName()); + changeEditTextValue(editText, jsonObject.optString("value"), name.toString()); + } + + treeViewDialog.setOnShowListener(new DialogInterface.OnShowListener() { + @Override + public void onShow(DialogInterface dialog) { + InputMethodManager inputManager = (InputMethodManager) context + .getSystemService(Context.INPUT_METHOD_SERVICE); + inputManager.hideSoftInputFromWindow(((Activity) context).getCurrentFocus().getWindowToken(), + HIDE_NOT_ALWAYS); + } + }); + + treeViewDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + ArrayList value = treeViewDialog.getValue(); + if (value != null && value.size() > 0) { + JSONArray array = new JSONArray(value); + JSONArray name = new JSONArray(treeViewDialog.getName()); + changeEditTextValue(editText, array.toString(), name.toString()); + } + } + }); + + editText.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + showTreeDialog(editText, treeViewDialog); + } + }); + + editText.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + changeEditTextValue(editText, "", ""); + return true; + } + }); + + GenericTextWatcher genericTextWatcher = new GenericTextWatcher(stepName, formFragment, editText); + genericTextWatcher.addOnFocusChangeListener(new View.OnFocusChangeListener() { + @Override + public void onFocusChange(View v, boolean hasFocus) { + if (hasFocus) { + showTreeDialog(editText, treeViewDialog); + } + } + }); + + editText.addTextChangedListener(genericTextWatcher); + if (relevance != null && context instanceof JsonApi) { + editText.setTag(R.id.relevance, relevance); + ((JsonApi) context).addSkipLogicView(editText); + } + if (constraints != null && context instanceof JsonApi) { + editText.setTag(R.id.constraints, constraints); + ((JsonApi) context).addConstrainedView(editText); + } + editText.setTag(R.id.canvas_ids, canvasIds.toString()); + + ((JsonApi) context).addFormDataView(editText); + views.add(rootLayout); + } catch (Exception e) { + e.printStackTrace(); + } + + return views; + } + + private static void showTreeDialog(MaterialEditText editText, TreeViewDialog treeViewDialog) { + treeViewDialog.show(); + } + + private static void changeEditTextValue(EditText editText, String value, String name) { + String readableValue = ""; + editText.setTag(R.id.raw_value, value); + if (!TextUtils.isEmpty(name)) { + try { + JSONArray nameArray = new JSONArray(name); + if (nameArray.length() > 0) { + readableValue = nameArray.getString(nameArray.length() - 1); + + if (nameArray.length() > 1) { + readableValue = readableValue + ", " + + nameArray.getString(nameArray.length() - 2); + } + } + } catch (JSONException e) { + Log.e(TAG, Log.getStackTraceString(e)); + } + } + + editText.setText(readableValue); + } +} \ No newline at end of file diff --git a/android-json-form-wizard/src/main/res/anim/enter_from_left.xml b/android-json-form-wizard/src/main/res/anim/enter_from_left.xml new file mode 100644 index 000000000..7a507ee11 --- /dev/null +++ b/android-json-form-wizard/src/main/res/anim/enter_from_left.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/android-json-form-wizard/src/main/res/anim/enter_from_right.xml b/android-json-form-wizard/src/main/res/anim/enter_from_right.xml new file mode 100644 index 000000000..e0cf6de8d --- /dev/null +++ b/android-json-form-wizard/src/main/res/anim/enter_from_right.xml @@ -0,0 +1,6 @@ + + diff --git a/android-json-form-wizard/src/main/res/anim/exit_to_left.xml b/android-json-form-wizard/src/main/res/anim/exit_to_left.xml new file mode 100644 index 000000000..893bd0c6d --- /dev/null +++ b/android-json-form-wizard/src/main/res/anim/exit_to_left.xml @@ -0,0 +1,14 @@ + + + + + + + + + \ No newline at end of file diff --git a/android-json-form-wizard/src/main/res/anim/exit_to_right.xml b/android-json-form-wizard/src/main/res/anim/exit_to_right.xml new file mode 100644 index 000000000..6bf663fa1 --- /dev/null +++ b/android-json-form-wizard/src/main/res/anim/exit_to_right.xml @@ -0,0 +1,6 @@ + + diff --git a/android-json-form-wizard/src/main/res/anim/pop_enter_from_left.xml b/android-json-form-wizard/src/main/res/anim/pop_enter_from_left.xml new file mode 100644 index 000000000..61f1fb67e --- /dev/null +++ b/android-json-form-wizard/src/main/res/anim/pop_enter_from_left.xml @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/android-json-form-wizard/src/main/res/anim/pop_exit_to_right.xml b/android-json-form-wizard/src/main/res/anim/pop_exit_to_right.xml new file mode 100644 index 000000000..6bf663fa1 --- /dev/null +++ b/android-json-form-wizard/src/main/res/anim/pop_exit_to_right.xml @@ -0,0 +1,6 @@ + + diff --git a/android-json-form-wizard/src/main/res/layout/activity_json_form.xml b/android-json-form-wizard/src/main/res/layout/activity_json_form.xml new file mode 100644 index 000000000..d982050f7 --- /dev/null +++ b/android-json-form-wizard/src/main/res/layout/activity_json_form.xml @@ -0,0 +1,30 @@ + + + + + + + + diff --git a/android-json-form-wizard/src/main/res/layout/dialog_date_picker.xml b/android-json-form-wizard/src/main/res/layout/dialog_date_picker.xml new file mode 100644 index 000000000..70202e2d0 --- /dev/null +++ b/android-json-form-wizard/src/main/res/layout/dialog_date_picker.xml @@ -0,0 +1,34 @@ + + + + + + + +