Showing preview only (1,503K chars total). Download the full file or copy to clipboard to get everything.
Repository: Vincent-Loi/android-drawable-importer-intellij-plugin
Branch: develop
Commit: b8ba9ce6cc28
Files: 1046
Total size: 1.2 MB
Directory structure:
gitextract_ylc6730z/
├── .gitignore
├── .travis.yml
├── LICENSE
├── README.md
├── build.gradle
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── json_generator/
│ ├── __init__.py
│ └── json_generator.py
├── settings.gradle
└── src/
└── main/
├── java/
│ └── de/
│ └── mprengemann/
│ └── intellij/
│ └── plugin/
│ └── androidicons/
│ ├── IProjectSettingsComponent.java
│ ├── IconApplication.java
│ ├── ProjectSettingsComponent.java
│ ├── actions/
│ │ ├── AndroidAssetUtilsGroup.java
│ │ ├── AndroidBatchImportAction.java
│ │ ├── AndroidMultiDrawableAction.java
│ │ ├── IconsAction.java
│ │ └── VectorsAction.java
│ ├── controllers/
│ │ ├── DefaultControllerFactory.java
│ │ ├── IController.java
│ │ ├── IControllerFactory.java
│ │ ├── batchscale/
│ │ │ ├── BatchScaleImporterController.java
│ │ │ ├── BatchScaleImporterObserver.java
│ │ │ ├── IBatchScaleImporterController.java
│ │ │ └── additem/
│ │ │ ├── AddItemBatchScaleDialogObserver.java
│ │ │ ├── AddItemBatchScaleImporterController.java
│ │ │ └── IAddItemBatchScaleImporterController.java
│ │ ├── defaults/
│ │ │ ├── DefaultsController.java
│ │ │ └── IDefaultsController.java
│ │ ├── iconimporter/
│ │ │ ├── IIconsImporterController.java
│ │ │ ├── IconsImporterController.java
│ │ │ └── IconsImporterObserver.java
│ │ ├── icons/
│ │ │ ├── IIconPackController.java
│ │ │ ├── androidicons/
│ │ │ │ ├── AndroidIconsController.java
│ │ │ │ └── IAndroidIconsController.java
│ │ │ └── materialicons/
│ │ │ ├── IMaterialIconsController.java
│ │ │ └── MaterialIconsController.java
│ │ ├── multi/
│ │ │ ├── IMultiImporterController.java
│ │ │ ├── MultiImporterController.java
│ │ │ └── MultiImporterObserver.java
│ │ └── settings/
│ │ ├── ISettingsController.java
│ │ ├── SettingsController.java
│ │ └── SettingsObserver.java
│ ├── dialogs/
│ │ ├── AddItemBatchScaleDialog.form
│ │ ├── AddItemBatchScaleDialog.java
│ │ ├── AndroidBatchScaleImporter.form
│ │ ├── AndroidBatchScaleImporter.java
│ │ ├── AndroidMultiDrawableImporter.form
│ │ ├── AndroidMultiDrawableImporter.java
│ │ ├── EditItemsBatchScaleDialog.form
│ │ ├── EditItemsBatchScaleDialog.java
│ │ ├── IconImporter.form
│ │ ├── IconImporter.java
│ │ ├── ResourcesDialog.form
│ │ ├── ResourcesDialog.java
│ │ ├── VectorImporter.form
│ │ └── VectorImporter.java
│ ├── images/
│ │ ├── RefactoringTask.java
│ │ └── ResizeAlgorithm.java
│ ├── listeners/
│ │ ├── RadioListListener.java
│ │ ├── SimpleKeyListener.java
│ │ └── SimpleMouseListener.java
│ ├── model/
│ │ ├── Destination.java
│ │ ├── Format.java
│ │ ├── IconPack.java
│ │ ├── ImageAsset.java
│ │ ├── ImageInformation.java
│ │ └── Resolution.java
│ ├── resources/
│ │ └── ResourceLoader.java
│ ├── util/
│ │ ├── AndroidFacetUtils.java
│ │ ├── ExportNameUtils.java
│ │ ├── ImageUtils.java
│ │ ├── MathUtils.java
│ │ ├── RefactorUtils.java
│ │ ├── RunnableUtils.java
│ │ └── TextUtils.java
│ └── widgets/
│ ├── ExportNameField.java
│ ├── FileBrowserField.java
│ ├── RadioButtonList.java
│ └── ResolutionButtonModel.java
└── resources/
├── META-INF/
│ └── plugin.xml
└── assets/
├── content.json
├── icon_packs.properties
└── material_icons/
├── action/
│ └── drawable-anydpi-v21/
│ ├── ic_3d_rotation_black_24dp.xml
│ ├── ic_accessibility_black_24dp.xml
│ ├── ic_accessible_black_24dp.xml
│ ├── ic_account_balance_black_24dp.xml
│ ├── ic_account_balance_wallet_black_24dp.xml
│ ├── ic_account_box_black_24dp.xml
│ ├── ic_account_circle_black_24dp.xml
│ ├── ic_add_shopping_cart_black_24dp.xml
│ ├── ic_alarm_add_black_24dp.xml
│ ├── ic_alarm_black_24dp.xml
│ ├── ic_alarm_off_black_24dp.xml
│ ├── ic_alarm_on_black_24dp.xml
│ ├── ic_all_out_black_24dp.xml
│ ├── ic_android_black_24dp.xml
│ ├── ic_announcement_black_24dp.xml
│ ├── ic_aspect_ratio_black_24dp.xml
│ ├── ic_assessment_black_24dp.xml
│ ├── ic_assignment_black_24dp.xml
│ ├── ic_assignment_ind_black_24dp.xml
│ ├── ic_assignment_late_black_24dp.xml
│ ├── ic_assignment_return_black_24dp.xml
│ ├── ic_assignment_returned_black_24dp.xml
│ ├── ic_assignment_turned_in_black_24dp.xml
│ ├── ic_autorenew_black_24dp.xml
│ ├── ic_backup_black_24dp.xml
│ ├── ic_book_black_24dp.xml
│ ├── ic_bookmark_black_24dp.xml
│ ├── ic_bookmark_border_black_24dp.xml
│ ├── ic_bug_report_black_24dp.xml
│ ├── ic_build_black_24dp.xml
│ ├── ic_cached_black_24dp.xml
│ ├── ic_camera_enhance_black_24dp.xml
│ ├── ic_card_giftcard_black_24dp.xml
│ ├── ic_card_membership_black_24dp.xml
│ ├── ic_card_travel_black_24dp.xml
│ ├── ic_change_history_black_24dp.xml
│ ├── ic_check_circle_black_24dp.xml
│ ├── ic_chrome_reader_mode_black_24dp.xml
│ ├── ic_class_black_24dp.xml
│ ├── ic_code_black_24dp.xml
│ ├── ic_compare_arrows_black_24dp.xml
│ ├── ic_copyright_black_24dp.xml
│ ├── ic_credit_card_black_24dp.xml
│ ├── ic_dashboard_black_24dp.xml
│ ├── ic_date_range_black_24dp.xml
│ ├── ic_delete_black_24dp.xml
│ ├── ic_delete_forever_black_24dp.xml
│ ├── ic_description_black_24dp.xml
│ ├── ic_dns_black_24dp.xml
│ ├── ic_done_all_black_24dp.xml
│ ├── ic_done_black_24dp.xml
│ ├── ic_donut_large_black_24dp.xml
│ ├── ic_donut_small_black_24dp.xml
│ ├── ic_eject_black_24dp.xml
│ ├── ic_euro_symbol_black_24dp.xml
│ ├── ic_event_black_24dp.xml
│ ├── ic_event_seat_black_24dp.xml
│ ├── ic_exit_to_app_black_24dp.xml
│ ├── ic_explore_black_24dp.xml
│ ├── ic_extension_black_24dp.xml
│ ├── ic_face_black_24dp.xml
│ ├── ic_favorite_black_24dp.xml
│ ├── ic_favorite_border_black_24dp.xml
│ ├── ic_feedback_black_24dp.xml
│ ├── ic_find_in_page_black_24dp.xml
│ ├── ic_find_replace_black_24dp.xml
│ ├── ic_fingerprint_black_24dp.xml
│ ├── ic_flight_land_black_24dp.xml
│ ├── ic_flight_takeoff_black_24dp.xml
│ ├── ic_flip_to_back_black_24dp.xml
│ ├── ic_flip_to_front_black_24dp.xml
│ ├── ic_g_translate_black_24dp.xml
│ ├── ic_gavel_black_24dp.xml
│ ├── ic_get_app_black_24dp.xml
│ ├── ic_gif_black_24dp.xml
│ ├── ic_grade_black_24dp.xml
│ ├── ic_group_work_black_24dp.xml
│ ├── ic_help_black_24dp.xml
│ ├── ic_help_outline_black_24dp.xml
│ ├── ic_highlight_off_black_24dp.xml
│ ├── ic_history_black_24dp.xml
│ ├── ic_home_black_24dp.xml
│ ├── ic_hourglass_empty_black_24dp.xml
│ ├── ic_hourglass_full_black_24dp.xml
│ ├── ic_http_black_24dp.xml
│ ├── ic_https_black_24dp.xml
│ ├── ic_important_devices_black_24dp.xml
│ ├── ic_info_black_24dp.xml
│ ├── ic_info_outline_black_24dp.xml
│ ├── ic_input_black_24dp.xml
│ ├── ic_invert_colors_black_24dp.xml
│ ├── ic_label_black_24dp.xml
│ ├── ic_label_outline_black_24dp.xml
│ ├── ic_language_black_24dp.xml
│ ├── ic_launch_black_24dp.xml
│ ├── ic_lightbulb_outline_black_24dp.xml
│ ├── ic_line_style_black_24dp.xml
│ ├── ic_line_weight_black_24dp.xml
│ ├── ic_list_black_24dp.xml
│ ├── ic_lock_black_24dp.xml
│ ├── ic_lock_open_black_24dp.xml
│ ├── ic_lock_outline_black_24dp.xml
│ ├── ic_loyalty_black_24dp.xml
│ ├── ic_markunread_mailbox_black_24dp.xml
│ ├── ic_motorcycle_black_24dp.xml
│ ├── ic_note_add_black_24dp.xml
│ ├── ic_offline_pin_black_24dp.xml
│ ├── ic_opacity_black_24dp.xml
│ ├── ic_open_in_browser_black_24dp.xml
│ ├── ic_open_in_new_black_24dp.xml
│ ├── ic_open_with_black_24dp.xml
│ ├── ic_pageview_black_24dp.xml
│ ├── ic_pan_tool_black_24dp.xml
│ ├── ic_payment_black_24dp.xml
│ ├── ic_perm_camera_mic_black_24dp.xml
│ ├── ic_perm_contact_calendar_black_24dp.xml
│ ├── ic_perm_data_setting_black_24dp.xml
│ ├── ic_perm_device_information_black_24dp.xml
│ ├── ic_perm_identity_black_24dp.xml
│ ├── ic_perm_media_black_24dp.xml
│ ├── ic_perm_phone_msg_black_24dp.xml
│ ├── ic_perm_scan_wifi_black_24dp.xml
│ ├── ic_pets_black_24dp.xml
│ ├── ic_picture_in_picture_alt_black_24dp.xml
│ ├── ic_picture_in_picture_black_24dp.xml
│ ├── ic_play_for_work_black_24dp.xml
│ ├── ic_polymer_black_24dp.xml
│ ├── ic_power_settings_new_black_24dp.xml
│ ├── ic_pregnant_woman_black_24dp.xml
│ ├── ic_print_black_24dp.xml
│ ├── ic_query_builder_black_24dp.xml
│ ├── ic_question_answer_black_24dp.xml
│ ├── ic_receipt_black_24dp.xml
│ ├── ic_record_voice_over_black_24dp.xml
│ ├── ic_redeem_black_24dp.xml
│ ├── ic_remove_shopping_cart_black_24dp.xml
│ ├── ic_reorder_black_24dp.xml
│ ├── ic_report_problem_black_24dp.xml
│ ├── ic_restore_black_24dp.xml
│ ├── ic_restore_page_black_24dp.xml
│ ├── ic_room_black_24dp.xml
│ ├── ic_rounded_corner_black_24dp.xml
│ ├── ic_rowing_black_24dp.xml
│ ├── ic_schedule_black_24dp.xml
│ ├── ic_search_black_24dp.xml
│ ├── ic_settings_applications_black_24dp.xml
│ ├── ic_settings_backup_restore_black_24dp.xml
│ ├── ic_settings_black_24dp.xml
│ ├── ic_settings_bluetooth_black_24dp.xml
│ ├── ic_settings_brightness_black_24dp.xml
│ ├── ic_settings_cell_black_24dp.xml
│ ├── ic_settings_ethernet_black_24dp.xml
│ ├── ic_settings_input_antenna_black_24dp.xml
│ ├── ic_settings_input_component_black_24dp.xml
│ ├── ic_settings_input_composite_black_24dp.xml
│ ├── ic_settings_input_hdmi_black_24dp.xml
│ ├── ic_settings_input_svideo_black_24dp.xml
│ ├── ic_settings_overscan_black_24dp.xml
│ ├── ic_settings_phone_black_24dp.xml
│ ├── ic_settings_power_black_24dp.xml
│ ├── ic_settings_remote_black_24dp.xml
│ ├── ic_settings_voice_black_24dp.xml
│ ├── ic_shop_black_24dp.xml
│ ├── ic_shop_two_black_24dp.xml
│ ├── ic_shopping_basket_black_24dp.xml
│ ├── ic_shopping_cart_black_24dp.xml
│ ├── ic_speaker_notes_black_24dp.xml
│ ├── ic_speaker_notes_off_black_24dp.xml
│ ├── ic_spellcheck_black_24dp.xml
│ ├── ic_stars_black_24dp.xml
│ ├── ic_store_black_24dp.xml
│ ├── ic_subject_black_24dp.xml
│ ├── ic_supervisor_account_black_24dp.xml
│ ├── ic_swap_horiz_black_24dp.xml
│ ├── ic_swap_vert_black_24dp.xml
│ ├── ic_swap_vertical_circle_black_24dp.xml
│ ├── ic_system_update_alt_black_24dp.xml
│ ├── ic_tab_black_24dp.xml
│ ├── ic_tab_unselected_black_24dp.xml
│ ├── ic_theaters_black_24dp.xml
│ ├── ic_thumb_down_black_24dp.xml
│ ├── ic_thumb_up_black_24dp.xml
│ ├── ic_thumbs_up_down_black_24dp.xml
│ ├── ic_timeline_black_24dp.xml
│ ├── ic_toc_black_24dp.xml
│ ├── ic_today_black_24dp.xml
│ ├── ic_toll_black_24dp.xml
│ ├── ic_touch_app_black_24dp.xml
│ ├── ic_track_changes_black_24dp.xml
│ ├── ic_translate_black_24dp.xml
│ ├── ic_trending_down_black_24dp.xml
│ ├── ic_trending_flat_black_24dp.xml
│ ├── ic_trending_up_black_24dp.xml
│ ├── ic_turned_in_black_24dp.xml
│ ├── ic_turned_in_not_black_24dp.xml
│ ├── ic_update_black_24dp.xml
│ ├── ic_verified_user_black_24dp.xml
│ ├── ic_view_agenda_black_24dp.xml
│ ├── ic_view_array_black_24dp.xml
│ ├── ic_view_carousel_black_24dp.xml
│ ├── ic_view_column_black_24dp.xml
│ ├── ic_view_day_black_24dp.xml
│ ├── ic_view_headline_black_24dp.xml
│ ├── ic_view_list_black_24dp.xml
│ ├── ic_view_module_black_24dp.xml
│ ├── ic_view_quilt_black_24dp.xml
│ ├── ic_view_stream_black_24dp.xml
│ ├── ic_view_week_black_24dp.xml
│ ├── ic_visibility_black_24dp.xml
│ ├── ic_visibility_off_black_24dp.xml
│ ├── ic_watch_later_black_24dp.xml
│ ├── ic_work_black_24dp.xml
│ ├── ic_youtube_searched_for_black_24dp.xml
│ ├── ic_zoom_in_black_24dp.xml
│ └── ic_zoom_out_black_24dp.xml
├── alert/
│ └── drawable-anydpi-v21/
│ ├── ic_add_alert_black_24dp.xml
│ ├── ic_error_black_24dp.xml
│ ├── ic_error_outline_black_24dp.xml
│ └── ic_warning_black_24dp.xml
├── av/
│ └── drawable-anydpi-v21/
│ ├── ic_add_to_queue_black_24dp.xml
│ ├── ic_airplay_black_24dp.xml
│ ├── ic_album_black_24dp.xml
│ ├── ic_art_track_black_24dp.xml
│ ├── ic_av_timer_black_24dp.xml
│ ├── ic_branding_watermark_black_24dp.xml
│ ├── ic_call_to_action_black_24dp.xml
│ ├── ic_closed_caption_black_24dp.xml
│ ├── ic_equalizer_black_24dp.xml
│ ├── ic_explicit_black_24dp.xml
│ ├── ic_fast_forward_black_24dp.xml
│ ├── ic_fast_rewind_black_24dp.xml
│ ├── ic_featured_play_list_black_24dp.xml
│ ├── ic_featured_video_black_24dp.xml
│ ├── ic_fiber_dvr_black_24dp.xml
│ ├── ic_fiber_manual_record_black_24dp.xml
│ ├── ic_fiber_new_black_24dp.xml
│ ├── ic_fiber_pin_black_24dp.xml
│ ├── ic_fiber_smart_record_black_24dp.xml
│ ├── ic_forward_10_black_24dp.xml
│ ├── ic_forward_30_black_24dp.xml
│ ├── ic_forward_5_black_24dp.xml
│ ├── ic_games_black_24dp.xml
│ ├── ic_hd_black_24dp.xml
│ ├── ic_hearing_black_24dp.xml
│ ├── ic_high_quality_black_24dp.xml
│ ├── ic_library_add_black_24dp.xml
│ ├── ic_library_books_black_24dp.xml
│ ├── ic_library_music_black_24dp.xml
│ ├── ic_loop_black_24dp.xml
│ ├── ic_mic_black_24dp.xml
│ ├── ic_mic_none_black_24dp.xml
│ ├── ic_mic_off_black_24dp.xml
│ ├── ic_movie_black_24dp.xml
│ ├── ic_music_video_black_24dp.xml
│ ├── ic_new_releases_black_24dp.xml
│ ├── ic_not_interested_black_24dp.xml
│ ├── ic_note_black_24dp.xml
│ ├── ic_pause_black_24dp.xml
│ ├── ic_pause_circle_filled_black_24dp.xml
│ ├── ic_pause_circle_outline_black_24dp.xml
│ ├── ic_play_arrow_black_24dp.xml
│ ├── ic_play_circle_filled_black_24dp.xml
│ ├── ic_play_circle_outline_black_24dp.xml
│ ├── ic_playlist_add_black_24dp.xml
│ ├── ic_playlist_add_check_black_24dp.xml
│ ├── ic_playlist_play_black_24dp.xml
│ ├── ic_queue_black_24dp.xml
│ ├── ic_queue_music_black_24dp.xml
│ ├── ic_queue_play_next_black_24dp.xml
│ ├── ic_radio_black_24dp.xml
│ ├── ic_recent_actors_black_24dp.xml
│ ├── ic_remove_from_queue_black_24dp.xml
│ ├── ic_repeat_black_24dp.xml
│ ├── ic_repeat_one_black_24dp.xml
│ ├── ic_replay_10_black_24dp.xml
│ ├── ic_replay_30_black_24dp.xml
│ ├── ic_replay_5_black_24dp.xml
│ ├── ic_replay_black_24dp.xml
│ ├── ic_shuffle_black_24dp.xml
│ ├── ic_skip_next_black_24dp.xml
│ ├── ic_skip_previous_black_24dp.xml
│ ├── ic_slow_motion_video_black_24dp.xml
│ ├── ic_snooze_black_24dp.xml
│ ├── ic_sort_by_alpha_black_24dp.xml
│ ├── ic_stop_black_24dp.xml
│ ├── ic_subscriptions_black_24dp.xml
│ ├── ic_subtitles_black_24dp.xml
│ ├── ic_surround_sound_black_24dp.xml
│ ├── ic_video_call_black_24dp.xml
│ ├── ic_video_label_black_24dp.xml
│ ├── ic_video_library_black_24dp.xml
│ ├── ic_videocam_black_24dp.xml
│ ├── ic_videocam_off_black_24dp.xml
│ ├── ic_volume_down_black_24dp.xml
│ ├── ic_volume_mute_black_24dp.xml
│ ├── ic_volume_off_black_24dp.xml
│ ├── ic_volume_up_black_24dp.xml
│ ├── ic_web_asset_black_24dp.xml
│ └── ic_web_black_24dp.xml
├── communication/
│ └── drawable-anydpi-v21/
│ ├── ic_business_black_24dp.xml
│ ├── ic_call_black_24dp.xml
│ ├── ic_call_end_black_24dp.xml
│ ├── ic_call_made_black_24dp.xml
│ ├── ic_call_merge_black_24dp.xml
│ ├── ic_call_missed_black_24dp.xml
│ ├── ic_call_missed_outgoing_black_24dp.xml
│ ├── ic_call_received_black_24dp.xml
│ ├── ic_call_split_black_24dp.xml
│ ├── ic_chat_black_24dp.xml
│ ├── ic_chat_bubble_black_24dp.xml
│ ├── ic_chat_bubble_outline_black_24dp.xml
│ ├── ic_clear_all_black_24dp.xml
│ ├── ic_comment_black_24dp.xml
│ ├── ic_contact_mail_black_24dp.xml
│ ├── ic_contact_phone_black_24dp.xml
│ ├── ic_contacts_black_24dp.xml
│ ├── ic_dialer_sip_black_24dp.xml
│ ├── ic_dialpad_black_24dp.xml
│ ├── ic_email_black_24dp.xml
│ ├── ic_forum_black_24dp.xml
│ ├── ic_import_contacts_black_24dp.xml
│ ├── ic_import_export_black_24dp.xml
│ ├── ic_invert_colors_off_black_24dp.xml
│ ├── ic_live_help_black_24dp.xml
│ ├── ic_location_off_black_24dp.xml
│ ├── ic_location_on_black_24dp.xml
│ ├── ic_mail_outline_black_24dp.xml
│ ├── ic_message_black_24dp.xml
│ ├── ic_no_sim_black_24dp.xml
│ ├── ic_phone_black_24dp.xml
│ ├── ic_phonelink_erase_black_24dp.xml
│ ├── ic_phonelink_lock_black_24dp.xml
│ ├── ic_phonelink_ring_black_24dp.xml
│ ├── ic_phonelink_setup_black_24dp.xml
│ ├── ic_portable_wifi_off_black_24dp.xml
│ ├── ic_present_to_all_black_24dp.xml
│ ├── ic_ring_volume_black_24dp.xml
│ ├── ic_rss_feed_black_24dp.xml
│ ├── ic_screen_share_black_24dp.xml
│ ├── ic_speaker_phone_black_24dp.xml
│ ├── ic_stay_current_landscape_black_24dp.xml
│ ├── ic_stay_current_portrait_black_24dp.xml
│ ├── ic_stay_primary_landscape_black_24dp.xml
│ ├── ic_stay_primary_portrait_black_24dp.xml
│ ├── ic_stop_screen_share_black_24dp.xml
│ ├── ic_swap_calls_black_24dp.xml
│ ├── ic_textsms_black_24dp.xml
│ ├── ic_voicemail_black_24dp.xml
│ └── ic_vpn_key_black_24dp.xml
├── content/
│ └── drawable-anydpi-v21/
│ ├── ic_add_black_24dp.xml
│ ├── ic_add_box_black_24dp.xml
│ ├── ic_add_circle_black_24dp.xml
│ ├── ic_add_circle_outline_black_24dp.xml
│ ├── ic_archive_black_24dp.xml
│ ├── ic_backspace_black_24dp.xml
│ ├── ic_block_black_24dp.xml
│ ├── ic_clear_black_24dp.xml
│ ├── ic_content_copy_black_24dp.xml
│ ├── ic_content_cut_black_24dp.xml
│ ├── ic_content_paste_black_24dp.xml
│ ├── ic_create_black_24dp.xml
│ ├── ic_delete_sweep_black_24dp.xml
│ ├── ic_drafts_black_24dp.xml
│ ├── ic_filter_list_black_24dp.xml
│ ├── ic_flag_black_24dp.xml
│ ├── ic_font_download_black_24dp.xml
│ ├── ic_forward_black_24dp.xml
│ ├── ic_gesture_black_24dp.xml
│ ├── ic_inbox_black_24dp.xml
│ ├── ic_link_black_24dp.xml
│ ├── ic_low_priority_black_24dp.xml
│ ├── ic_mail_black_24dp.xml
│ ├── ic_markunread_black_24dp.xml
│ ├── ic_move_to_inbox_black_24dp.xml
│ ├── ic_next_week_black_24dp.xml
│ ├── ic_redo_black_24dp.xml
│ ├── ic_remove_black_24dp.xml
│ ├── ic_remove_circle_black_24dp.xml
│ ├── ic_remove_circle_outline_black_24dp.xml
│ ├── ic_reply_all_black_24dp.xml
│ ├── ic_reply_black_24dp.xml
│ ├── ic_report_black_24dp.xml
│ ├── ic_save_black_24dp.xml
│ ├── ic_select_all_black_24dp.xml
│ ├── ic_send_black_24dp.xml
│ ├── ic_sort_black_24dp.xml
│ ├── ic_text_format_black_24dp.xml
│ ├── ic_unarchive_black_24dp.xml
│ ├── ic_undo_black_24dp.xml
│ └── ic_weekend_black_24dp.xml
├── device/
│ └── drawable-anydpi-v21/
│ ├── ic_access_alarm_black_24dp.xml
│ ├── ic_access_alarms_black_24dp.xml
│ ├── ic_access_time_black_24dp.xml
│ ├── ic_add_alarm_black_24dp.xml
│ ├── ic_airplanemode_active_black_24dp.xml
│ ├── ic_airplanemode_inactive_black_24dp.xml
│ ├── ic_battery_20_black_24dp.xml
│ ├── ic_battery_30_black_24dp.xml
│ ├── ic_battery_50_black_24dp.xml
│ ├── ic_battery_60_black_24dp.xml
│ ├── ic_battery_80_black_24dp.xml
│ ├── ic_battery_90_black_24dp.xml
│ ├── ic_battery_alert_black_24dp.xml
│ ├── ic_battery_charging_20_black_24dp.xml
│ ├── ic_battery_charging_30_black_24dp.xml
│ ├── ic_battery_charging_50_black_24dp.xml
│ ├── ic_battery_charging_60_black_24dp.xml
│ ├── ic_battery_charging_80_black_24dp.xml
│ ├── ic_battery_charging_90_black_24dp.xml
│ ├── ic_battery_charging_full_black_24dp.xml
│ ├── ic_battery_full_black_24dp.xml
│ ├── ic_battery_std_black_24dp.xml
│ ├── ic_battery_unknown_black_24dp.xml
│ ├── ic_bluetooth_black_24dp.xml
│ ├── ic_bluetooth_connected_black_24dp.xml
│ ├── ic_bluetooth_disabled_black_24dp.xml
│ ├── ic_bluetooth_searching_black_24dp.xml
│ ├── ic_brightness_auto_black_24dp.xml
│ ├── ic_brightness_high_black_24dp.xml
│ ├── ic_brightness_low_black_24dp.xml
│ ├── ic_brightness_medium_black_24dp.xml
│ ├── ic_data_usage_black_24dp.xml
│ ├── ic_developer_mode_black_24dp.xml
│ ├── ic_devices_black_24dp.xml
│ ├── ic_dvr_black_24dp.xml
│ ├── ic_gps_fixed_black_24dp.xml
│ ├── ic_gps_not_fixed_black_24dp.xml
│ ├── ic_gps_off_black_24dp.xml
│ ├── ic_graphic_eq_black_24dp.xml
│ ├── ic_location_disabled_black_24dp.xml
│ ├── ic_location_searching_black_24dp.xml
│ ├── ic_network_cell_black_24dp.xml
│ ├── ic_network_wifi_black_24dp.xml
│ ├── ic_nfc_black_24dp.xml
│ ├── ic_screen_lock_landscape_black_24dp.xml
│ ├── ic_screen_lock_portrait_black_24dp.xml
│ ├── ic_screen_lock_rotation_black_24dp.xml
│ ├── ic_screen_rotation_black_24dp.xml
│ ├── ic_sd_storage_black_24dp.xml
│ ├── ic_settings_system_daydream_black_24dp.xml
│ ├── ic_signal_cellular_0_bar_black_24dp.xml
│ ├── ic_signal_cellular_1_bar_black_24dp.xml
│ ├── ic_signal_cellular_2_bar_black_24dp.xml
│ ├── ic_signal_cellular_3_bar_black_24dp.xml
│ ├── ic_signal_cellular_4_bar_black_24dp.xml
│ ├── ic_signal_cellular_connected_no_internet_0_bar_black_24dp.xml
│ ├── ic_signal_cellular_connected_no_internet_1_bar_black_24dp.xml
│ ├── ic_signal_cellular_connected_no_internet_2_bar_black_24dp.xml
│ ├── ic_signal_cellular_connected_no_internet_3_bar_black_24dp.xml
│ ├── ic_signal_cellular_connected_no_internet_4_bar_black_24dp.xml
│ ├── ic_signal_cellular_no_sim_black_24dp.xml
│ ├── ic_signal_cellular_null_black_24dp.xml
│ ├── ic_signal_cellular_off_black_24dp.xml
│ ├── ic_signal_wifi_0_bar_black_24dp.xml
│ ├── ic_signal_wifi_1_bar_black_24dp.xml
│ ├── ic_signal_wifi_1_bar_lock_black_24dp.xml
│ ├── ic_signal_wifi_2_bar_black_24dp.xml
│ ├── ic_signal_wifi_2_bar_lock_black_24dp.xml
│ ├── ic_signal_wifi_3_bar_black_24dp.xml
│ ├── ic_signal_wifi_3_bar_lock_black_24dp.xml
│ ├── ic_signal_wifi_4_bar_black_24dp.xml
│ ├── ic_signal_wifi_4_bar_lock_black_24dp.xml
│ ├── ic_signal_wifi_off_black_24dp.xml
│ ├── ic_storage_black_24dp.xml
│ ├── ic_usb_black_24dp.xml
│ ├── ic_wallpaper_black_24dp.xml
│ ├── ic_widgets_black_24dp.xml
│ ├── ic_wifi_lock_black_24dp.xml
│ └── ic_wifi_tethering_black_24dp.xml
├── editor/
│ └── drawable-anydpi-v21/
│ ├── ic_attach_file_black_24dp.xml
│ ├── ic_attach_money_black_24dp.xml
│ ├── ic_border_all_black_24dp.xml
│ ├── ic_border_bottom_black_24dp.xml
│ ├── ic_border_clear_black_24dp.xml
│ ├── ic_border_color_black_24dp.xml
│ ├── ic_border_horizontal_black_24dp.xml
│ ├── ic_border_inner_black_24dp.xml
│ ├── ic_border_left_black_24dp.xml
│ ├── ic_border_outer_black_24dp.xml
│ ├── ic_border_right_black_24dp.xml
│ ├── ic_border_style_black_24dp.xml
│ ├── ic_border_top_black_24dp.xml
│ ├── ic_border_vertical_black_24dp.xml
│ ├── ic_bubble_chart_black_24dp.xml
│ ├── ic_drag_handle_black_24dp.xml
│ ├── ic_format_align_center_black_24dp.xml
│ ├── ic_format_align_justify_black_24dp.xml
│ ├── ic_format_align_left_black_24dp.xml
│ ├── ic_format_align_right_black_24dp.xml
│ ├── ic_format_bold_black_24dp.xml
│ ├── ic_format_clear_black_24dp.xml
│ ├── ic_format_color_fill_black_24dp.xml
│ ├── ic_format_color_reset_black_24dp.xml
│ ├── ic_format_color_text_black_24dp.xml
│ ├── ic_format_indent_decrease_black_24dp.xml
│ ├── ic_format_indent_increase_black_24dp.xml
│ ├── ic_format_italic_black_24dp.xml
│ ├── ic_format_line_spacing_black_24dp.xml
│ ├── ic_format_list_bulleted_black_24dp.xml
│ ├── ic_format_list_numbered_black_24dp.xml
│ ├── ic_format_paint_black_24dp.xml
│ ├── ic_format_quote_black_24dp.xml
│ ├── ic_format_shapes_black_24dp.xml
│ ├── ic_format_size_black_24dp.xml
│ ├── ic_format_strikethrough_black_24dp.xml
│ ├── ic_format_textdirection_l_to_r_black_24dp.xml
│ ├── ic_format_textdirection_r_to_l_black_24dp.xml
│ ├── ic_format_underlined_black_24dp.xml
│ ├── ic_functions_black_24dp.xml
│ ├── ic_highlight_black_24dp.xml
│ ├── ic_insert_chart_black_24dp.xml
│ ├── ic_insert_comment_black_24dp.xml
│ ├── ic_insert_drive_file_black_24dp.xml
│ ├── ic_insert_emoticon_black_24dp.xml
│ ├── ic_insert_invitation_black_24dp.xml
│ ├── ic_insert_link_black_24dp.xml
│ ├── ic_insert_photo_black_24dp.xml
│ ├── ic_linear_scale_black_24dp.xml
│ ├── ic_merge_type_black_24dp.xml
│ ├── ic_mode_comment_black_24dp.xml
│ ├── ic_mode_edit_black_24dp.xml
│ ├── ic_monetization_on_black_24dp.xml
│ ├── ic_money_off_black_24dp.xml
│ ├── ic_multiline_chart_black_24dp.xml
│ ├── ic_pie_chart_black_24dp.xml
│ ├── ic_pie_chart_outlined_black_24dp.xml
│ ├── ic_publish_black_24dp.xml
│ ├── ic_short_text_black_24dp.xml
│ ├── ic_show_chart_black_24dp.xml
│ ├── ic_space_bar_black_24dp.xml
│ ├── ic_strikethrough_s_black_24dp.xml
│ ├── ic_text_fields_black_24dp.xml
│ ├── ic_title_black_24dp.xml
│ ├── ic_vertical_align_bottom_black_24dp.xml
│ ├── ic_vertical_align_center_black_24dp.xml
│ ├── ic_vertical_align_top_black_24dp.xml
│ └── ic_wrap_text_black_24dp.xml
├── file/
│ └── drawable-anydpi-v21/
│ ├── ic_attachment_black_24dp.xml
│ ├── ic_cloud_black_24dp.xml
│ ├── ic_cloud_circle_black_24dp.xml
│ ├── ic_cloud_done_black_24dp.xml
│ ├── ic_cloud_download_black_24dp.xml
│ ├── ic_cloud_off_black_24dp.xml
│ ├── ic_cloud_queue_black_24dp.xml
│ ├── ic_cloud_upload_black_24dp.xml
│ ├── ic_create_new_folder_black_24dp.xml
│ ├── ic_file_download_black_24dp.xml
│ ├── ic_file_upload_black_24dp.xml
│ ├── ic_folder_black_24dp.xml
│ ├── ic_folder_open_black_24dp.xml
│ └── ic_folder_shared_black_24dp.xml
├── hardware/
│ └── drawable-anydpi-v21/
│ ├── ic_cast_black_24dp.xml
│ ├── ic_cast_connected_black_24dp.xml
│ ├── ic_computer_black_24dp.xml
│ ├── ic_desktop_mac_black_24dp.xml
│ ├── ic_desktop_windows_black_24dp.xml
│ ├── ic_developer_board_black_24dp.xml
│ ├── ic_device_hub_black_24dp.xml
│ ├── ic_devices_other_black_24dp.xml
│ ├── ic_dock_black_24dp.xml
│ ├── ic_gamepad_black_24dp.xml
│ ├── ic_headset_black_24dp.xml
│ ├── ic_headset_mic_black_24dp.xml
│ ├── ic_keyboard_arrow_down_black_24dp.xml
│ ├── ic_keyboard_arrow_left_black_24dp.xml
│ ├── ic_keyboard_arrow_right_black_24dp.xml
│ ├── ic_keyboard_arrow_up_black_24dp.xml
│ ├── ic_keyboard_backspace_black_24dp.xml
│ ├── ic_keyboard_black_24dp.xml
│ ├── ic_keyboard_capslock_black_24dp.xml
│ ├── ic_keyboard_hide_black_24dp.xml
│ ├── ic_keyboard_return_black_24dp.xml
│ ├── ic_keyboard_tab_black_24dp.xml
│ ├── ic_keyboard_voice_black_24dp.xml
│ ├── ic_laptop_black_24dp.xml
│ ├── ic_laptop_chromebook_black_24dp.xml
│ ├── ic_laptop_mac_black_24dp.xml
│ ├── ic_laptop_windows_black_24dp.xml
│ ├── ic_memory_black_24dp.xml
│ ├── ic_mouse_black_24dp.xml
│ ├── ic_phone_android_black_24dp.xml
│ ├── ic_phone_iphone_black_24dp.xml
│ ├── ic_phonelink_black_24dp.xml
│ ├── ic_phonelink_off_black_24dp.xml
│ ├── ic_power_input_black_24dp.xml
│ ├── ic_router_black_24dp.xml
│ ├── ic_scanner_black_24dp.xml
│ ├── ic_security_black_24dp.xml
│ ├── ic_sim_card_black_24dp.xml
│ ├── ic_smartphone_black_24dp.xml
│ ├── ic_speaker_black_24dp.xml
│ ├── ic_speaker_group_black_24dp.xml
│ ├── ic_tablet_android_black_24dp.xml
│ ├── ic_tablet_black_24dp.xml
│ ├── ic_tablet_mac_black_24dp.xml
│ ├── ic_toys_black_24dp.xml
│ ├── ic_tv_black_24dp.xml
│ ├── ic_videogame_asset_black_24dp.xml
│ └── ic_watch_black_24dp.xml
├── image/
│ └── drawable-anydpi-v21/
│ ├── ic_add_a_photo_black_24dp.xml
│ ├── ic_add_to_photos_black_24dp.xml
│ ├── ic_adjust_black_24dp.xml
│ ├── ic_assistant_black_24dp.xml
│ ├── ic_assistant_photo_black_24dp.xml
│ ├── ic_audiotrack_black_24dp.xml
│ ├── ic_blur_circular_black_24dp.xml
│ ├── ic_blur_linear_black_24dp.xml
│ ├── ic_blur_off_black_24dp.xml
│ ├── ic_blur_on_black_24dp.xml
│ ├── ic_brightness_1_black_24dp.xml
│ ├── ic_brightness_2_black_24dp.xml
│ ├── ic_brightness_3_black_24dp.xml
│ ├── ic_brightness_4_black_24dp.xml
│ ├── ic_brightness_5_black_24dp.xml
│ ├── ic_brightness_6_black_24dp.xml
│ ├── ic_brightness_7_black_24dp.xml
│ ├── ic_broken_image_black_24dp.xml
│ ├── ic_brush_black_24dp.xml
│ ├── ic_burst_mode_black_24dp.xml
│ ├── ic_camera_alt_black_24dp.xml
│ ├── ic_camera_black_24dp.xml
│ ├── ic_camera_front_black_24dp.xml
│ ├── ic_camera_rear_black_24dp.xml
│ ├── ic_camera_roll_black_24dp.xml
│ ├── ic_center_focus_strong_black_24dp.xml
│ ├── ic_center_focus_weak_black_24dp.xml
│ ├── ic_collections_black_24dp.xml
│ ├── ic_collections_bookmark_black_24dp.xml
│ ├── ic_color_lens_black_24dp.xml
│ ├── ic_colorize_black_24dp.xml
│ ├── ic_compare_black_24dp.xml
│ ├── ic_control_point_black_24dp.xml
│ ├── ic_control_point_duplicate_black_24dp.xml
│ ├── ic_crop_16_9_black_24dp.xml
│ ├── ic_crop_3_2_black_24dp.xml
│ ├── ic_crop_5_4_black_24dp.xml
│ ├── ic_crop_7_5_black_24dp.xml
│ ├── ic_crop_black_24dp.xml
│ ├── ic_crop_din_black_24dp.xml
│ ├── ic_crop_free_black_24dp.xml
│ ├── ic_crop_landscape_black_24dp.xml
│ ├── ic_crop_original_black_24dp.xml
│ ├── ic_crop_portrait_black_24dp.xml
│ ├── ic_crop_rotate_black_24dp.xml
│ ├── ic_crop_square_black_24dp.xml
│ ├── ic_dehaze_black_24dp.xml
│ ├── ic_details_black_24dp.xml
│ ├── ic_edit_black_24dp.xml
│ ├── ic_exposure_black_24dp.xml
│ ├── ic_exposure_neg_1_black_24dp.xml
│ ├── ic_exposure_neg_2_black_24dp.xml
│ ├── ic_exposure_plus_1_black_24dp.xml
│ ├── ic_exposure_plus_2_black_24dp.xml
│ ├── ic_exposure_zero_black_24dp.xml
│ ├── ic_filter_1_black_24dp.xml
│ ├── ic_filter_2_black_24dp.xml
│ ├── ic_filter_3_black_24dp.xml
│ ├── ic_filter_4_black_24dp.xml
│ ├── ic_filter_5_black_24dp.xml
│ ├── ic_filter_6_black_24dp.xml
│ ├── ic_filter_7_black_24dp.xml
│ ├── ic_filter_8_black_24dp.xml
│ ├── ic_filter_9_black_24dp.xml
│ ├── ic_filter_9_plus_black_24dp.xml
│ ├── ic_filter_b_and_w_black_24dp.xml
│ ├── ic_filter_black_24dp.xml
│ ├── ic_filter_center_focus_black_24dp.xml
│ ├── ic_filter_drama_black_24dp.xml
│ ├── ic_filter_frames_black_24dp.xml
│ ├── ic_filter_hdr_black_24dp.xml
│ ├── ic_filter_none_black_24dp.xml
│ ├── ic_filter_tilt_shift_black_24dp.xml
│ ├── ic_filter_vintage_black_24dp.xml
│ ├── ic_flare_black_24dp.xml
│ ├── ic_flash_auto_black_24dp.xml
│ ├── ic_flash_off_black_24dp.xml
│ ├── ic_flash_on_black_24dp.xml
│ ├── ic_flip_black_24dp.xml
│ ├── ic_gradient_black_24dp.xml
│ ├── ic_grain_black_24dp.xml
│ ├── ic_grid_off_black_24dp.xml
│ ├── ic_grid_on_black_24dp.xml
│ ├── ic_hdr_off_black_24dp.xml
│ ├── ic_hdr_on_black_24dp.xml
│ ├── ic_hdr_strong_black_24dp.xml
│ ├── ic_hdr_weak_black_24dp.xml
│ ├── ic_healing_black_24dp.xml
│ ├── ic_image_aspect_ratio_black_24dp.xml
│ ├── ic_image_black_24dp.xml
│ ├── ic_iso_black_24dp.xml
│ ├── ic_landscape_black_24dp.xml
│ ├── ic_leak_add_black_24dp.xml
│ ├── ic_leak_remove_black_24dp.xml
│ ├── ic_lens_black_24dp.xml
│ ├── ic_linked_camera_black_24dp.xml
│ ├── ic_looks_3_black_24dp.xml
│ ├── ic_looks_4_black_24dp.xml
│ ├── ic_looks_5_black_24dp.xml
│ ├── ic_looks_6_black_24dp.xml
│ ├── ic_looks_black_24dp.xml
│ ├── ic_looks_one_black_24dp.xml
│ ├── ic_looks_two_black_24dp.xml
│ ├── ic_loupe_black_24dp.xml
│ ├── ic_monochrome_photos_black_24dp.xml
│ ├── ic_movie_creation_black_24dp.xml
│ ├── ic_movie_filter_black_24dp.xml
│ ├── ic_music_note_black_24dp.xml
│ ├── ic_nature_black_24dp.xml
│ ├── ic_nature_people_black_24dp.xml
│ ├── ic_navigate_before_black_24dp.xml
│ ├── ic_navigate_next_black_24dp.xml
│ ├── ic_palette_black_24dp.xml
│ ├── ic_panorama_black_24dp.xml
│ ├── ic_panorama_fish_eye_black_24dp.xml
│ ├── ic_panorama_horizontal_black_24dp.xml
│ ├── ic_panorama_vertical_black_24dp.xml
│ ├── ic_panorama_wide_angle_black_24dp.xml
│ ├── ic_photo_album_black_24dp.xml
│ ├── ic_photo_black_24dp.xml
│ ├── ic_photo_camera_black_24dp.xml
│ ├── ic_photo_filter_black_24dp.xml
│ ├── ic_photo_library_black_24dp.xml
│ ├── ic_photo_size_select_actual_black_24dp.xml
│ ├── ic_photo_size_select_large_black_24dp.xml
│ ├── ic_photo_size_select_small_black_24dp.xml
│ ├── ic_picture_as_pdf_black_24dp.xml
│ ├── ic_portrait_black_24dp.xml
│ ├── ic_remove_red_eye_black_24dp.xml
│ ├── ic_rotate_90_degrees_ccw_black_24dp.xml
│ ├── ic_rotate_left_black_24dp.xml
│ ├── ic_rotate_right_black_24dp.xml
│ ├── ic_slideshow_black_24dp.xml
│ ├── ic_straighten_black_24dp.xml
│ ├── ic_style_black_24dp.xml
│ ├── ic_switch_camera_black_24dp.xml
│ ├── ic_switch_video_black_24dp.xml
│ ├── ic_tag_faces_black_24dp.xml
│ ├── ic_texture_black_24dp.xml
│ ├── ic_timelapse_black_24dp.xml
│ ├── ic_timer_10_black_24dp.xml
│ ├── ic_timer_3_black_24dp.xml
│ ├── ic_timer_black_24dp.xml
│ ├── ic_timer_off_black_24dp.xml
│ ├── ic_tonality_black_24dp.xml
│ ├── ic_transform_black_24dp.xml
│ ├── ic_tune_black_24dp.xml
│ ├── ic_view_comfy_black_24dp.xml
│ ├── ic_view_compact_black_24dp.xml
│ ├── ic_vignette_black_24dp.xml
│ ├── ic_wb_auto_black_24dp.xml
│ ├── ic_wb_cloudy_black_24dp.xml
│ ├── ic_wb_incandescent_black_24dp.xml
│ ├── ic_wb_iridescent_black_24dp.xml
│ └── ic_wb_sunny_black_24dp.xml
├── maps/
│ └── drawable-anydpi-v21/
│ ├── ic_add_location_black_24dp.xml
│ ├── ic_beenhere_black_24dp.xml
│ ├── ic_directions_bike_black_24dp.xml
│ ├── ic_directions_black_24dp.xml
│ ├── ic_directions_boat_black_24dp.xml
│ ├── ic_directions_bus_black_24dp.xml
│ ├── ic_directions_car_black_24dp.xml
│ ├── ic_directions_railway_black_24dp.xml
│ ├── ic_directions_run_black_24dp.xml
│ ├── ic_directions_subway_black_24dp.xml
│ ├── ic_directions_transit_black_24dp.xml
│ ├── ic_directions_walk_black_24dp.xml
│ ├── ic_edit_location_black_24dp.xml
│ ├── ic_ev_station_black_24dp.xml
│ ├── ic_flight_black_24dp.xml
│ ├── ic_hotel_black_24dp.xml
│ ├── ic_layers_black_24dp.xml
│ ├── ic_layers_clear_black_24dp.xml
│ ├── ic_local_activity_black_24dp.xml
│ ├── ic_local_airport_black_24dp.xml
│ ├── ic_local_atm_black_24dp.xml
│ ├── ic_local_bar_black_24dp.xml
│ ├── ic_local_cafe_black_24dp.xml
│ ├── ic_local_car_wash_black_24dp.xml
│ ├── ic_local_convenience_store_black_24dp.xml
│ ├── ic_local_dining_black_24dp.xml
│ ├── ic_local_drink_black_24dp.xml
│ ├── ic_local_florist_black_24dp.xml
│ ├── ic_local_gas_station_black_24dp.xml
│ ├── ic_local_grocery_store_black_24dp.xml
│ ├── ic_local_hospital_black_24dp.xml
│ ├── ic_local_hotel_black_24dp.xml
│ ├── ic_local_laundry_service_black_24dp.xml
│ ├── ic_local_library_black_24dp.xml
│ ├── ic_local_mall_black_24dp.xml
│ ├── ic_local_movies_black_24dp.xml
│ ├── ic_local_offer_black_24dp.xml
│ ├── ic_local_parking_black_24dp.xml
│ ├── ic_local_pharmacy_black_24dp.xml
│ ├── ic_local_phone_black_24dp.xml
│ ├── ic_local_pizza_black_24dp.xml
│ ├── ic_local_play_black_24dp.xml
│ ├── ic_local_post_office_black_24dp.xml
│ ├── ic_local_printshop_black_24dp.xml
│ ├── ic_local_see_black_24dp.xml
│ ├── ic_local_shipping_black_24dp.xml
│ ├── ic_local_taxi_black_24dp.xml
│ ├── ic_map_black_24dp.xml
│ ├── ic_my_location_black_24dp.xml
│ ├── ic_navigation_black_24dp.xml
│ ├── ic_near_me_black_24dp.xml
│ ├── ic_person_pin_black_24dp.xml
│ ├── ic_person_pin_circle_black_24dp.xml
│ ├── ic_pin_drop_black_24dp.xml
│ ├── ic_place_black_24dp.xml
│ ├── ic_rate_review_black_24dp.xml
│ ├── ic_restaurant_black_24dp.xml
│ ├── ic_restaurant_menu_black_24dp.xml
│ ├── ic_satellite_black_24dp.xml
│ ├── ic_store_mall_directory_black_24dp.xml
│ ├── ic_streetview_black_24dp.xml
│ ├── ic_subway_black_24dp.xml
│ ├── ic_terrain_black_24dp.xml
│ ├── ic_traffic_black_24dp.xml
│ ├── ic_train_black_24dp.xml
│ ├── ic_tram_black_24dp.xml
│ ├── ic_transfer_within_a_station_black_24dp.xml
│ └── ic_zoom_out_map_black_24dp.xml
├── navigation/
│ └── drawable-anydpi-v21/
│ ├── ic_apps_black_24dp.xml
│ ├── ic_arrow_back_black_24dp.xml
│ ├── ic_arrow_downward_black_24dp.xml
│ ├── ic_arrow_drop_down_black_24dp.xml
│ ├── ic_arrow_drop_down_circle_black_24dp.xml
│ ├── ic_arrow_drop_up_black_24dp.xml
│ ├── ic_arrow_forward_black_24dp.xml
│ ├── ic_arrow_upward_black_24dp.xml
│ ├── ic_cancel_black_24dp.xml
│ ├── ic_check_black_24dp.xml
│ ├── ic_chevron_left_black_24dp.xml
│ ├── ic_chevron_right_black_24dp.xml
│ ├── ic_close_black_24dp.xml
│ ├── ic_expand_less_black_24dp.xml
│ ├── ic_expand_more_black_24dp.xml
│ ├── ic_first_page_black_24dp.xml
│ ├── ic_fullscreen_black_24dp.xml
│ ├── ic_fullscreen_exit_black_24dp.xml
│ ├── ic_last_page_black_24dp.xml
│ ├── ic_menu_black_24dp.xml
│ ├── ic_more_horiz_black_24dp.xml
│ ├── ic_more_vert_black_24dp.xml
│ ├── ic_refresh_black_24dp.xml
│ ├── ic_subdirectory_arrow_left_black_24dp.xml
│ ├── ic_subdirectory_arrow_right_black_24dp.xml
│ ├── ic_unfold_less_black_24dp.xml
│ └── ic_unfold_more_black_24dp.xml
├── notification/
│ └── drawable-anydpi-v21/
│ ├── ic_adb_black_24dp.xml
│ ├── ic_airline_seat_flat_angled_black_24dp.xml
│ ├── ic_airline_seat_flat_black_24dp.xml
│ ├── ic_airline_seat_individual_suite_black_24dp.xml
│ ├── ic_airline_seat_legroom_extra_black_24dp.xml
│ ├── ic_airline_seat_legroom_normal_black_24dp.xml
│ ├── ic_airline_seat_legroom_reduced_black_24dp.xml
│ ├── ic_airline_seat_recline_extra_black_24dp.xml
│ ├── ic_airline_seat_recline_normal_black_24dp.xml
│ ├── ic_bluetooth_audio_black_24dp.xml
│ ├── ic_confirmation_number_black_24dp.xml
│ ├── ic_disc_full_black_24dp.xml
│ ├── ic_do_not_disturb_alt_black_24dp.xml
│ ├── ic_do_not_disturb_black_24dp.xml
│ ├── ic_do_not_disturb_off_black_24dp.xml
│ ├── ic_do_not_disturb_on_black_24dp.xml
│ ├── ic_drive_eta_black_24dp.xml
│ ├── ic_enhanced_encryption_black_24dp.xml
│ ├── ic_event_available_black_24dp.xml
│ ├── ic_event_busy_black_24dp.xml
│ ├── ic_event_note_black_24dp.xml
│ ├── ic_folder_special_black_24dp.xml
│ ├── ic_live_tv_black_24dp.xml
│ ├── ic_mms_black_24dp.xml
│ ├── ic_more_black_24dp.xml
│ ├── ic_network_check_black_24dp.xml
│ ├── ic_network_locked_black_24dp.xml
│ ├── ic_no_encryption_black_24dp.xml
│ ├── ic_ondemand_video_black_24dp.xml
│ ├── ic_personal_video_black_24dp.xml
│ ├── ic_phone_bluetooth_speaker_black_24dp.xml
│ ├── ic_phone_forwarded_black_24dp.xml
│ ├── ic_phone_in_talk_black_24dp.xml
│ ├── ic_phone_locked_black_24dp.xml
│ ├── ic_phone_missed_black_24dp.xml
│ ├── ic_phone_paused_black_24dp.xml
│ ├── ic_power_black_24dp.xml
│ ├── ic_priority_high_black_24dp.xml
│ ├── ic_rv_hookup_black_24dp.xml
│ ├── ic_sd_card_black_24dp.xml
│ ├── ic_sim_card_alert_black_24dp.xml
│ ├── ic_sms_black_24dp.xml
│ ├── ic_sms_failed_black_24dp.xml
│ ├── ic_sync_black_24dp.xml
│ ├── ic_sync_disabled_black_24dp.xml
│ ├── ic_sync_problem_black_24dp.xml
│ ├── ic_system_update_black_24dp.xml
│ ├── ic_tap_and_play_black_24dp.xml
│ ├── ic_time_to_leave_black_24dp.xml
│ ├── ic_vibration_black_24dp.xml
│ ├── ic_voice_chat_black_24dp.xml
│ ├── ic_vpn_lock_black_24dp.xml
│ ├── ic_wc_black_24dp.xml
│ └── ic_wifi_black_24dp.xml
├── places/
│ └── drawable-anydpi-v21/
│ ├── ic_ac_unit_black_24dp.xml
│ ├── ic_airport_shuttle_black_24dp.xml
│ ├── ic_all_inclusive_black_24dp.xml
│ ├── ic_beach_access_black_24dp.xml
│ ├── ic_business_center_black_24dp.xml
│ ├── ic_casino_black_24dp.xml
│ ├── ic_child_care_black_24dp.xml
│ ├── ic_child_friendly_black_24dp.xml
│ ├── ic_fitness_center_black_24dp.xml
│ ├── ic_free_breakfast_black_24dp.xml
│ ├── ic_golf_course_black_24dp.xml
│ ├── ic_hot_tub_black_24dp.xml
│ ├── ic_kitchen_black_24dp.xml
│ ├── ic_pool_black_24dp.xml
│ ├── ic_room_service_black_24dp.xml
│ ├── ic_rv_hookup_black_24dp.xml
│ ├── ic_smoke_free_black_24dp.xml
│ ├── ic_smoking_rooms_black_24dp.xml
│ └── ic_spa_black_24dp.xml
├── social/
│ └── drawable-anydpi-v21/
│ ├── ic_cake_black_24dp.xml
│ ├── ic_domain_black_24dp.xml
│ ├── ic_group_add_black_24dp.xml
│ ├── ic_group_black_24dp.xml
│ ├── ic_location_city_black_24dp.xml
│ ├── ic_mood_bad_black_24dp.xml
│ ├── ic_mood_black_24dp.xml
│ ├── ic_notifications_active_black_24dp.xml
│ ├── ic_notifications_black_24dp.xml
│ ├── ic_notifications_none_black_24dp.xml
│ ├── ic_notifications_off_black_24dp.xml
│ ├── ic_notifications_paused_black_24dp.xml
│ ├── ic_pages_black_24dp.xml
│ ├── ic_party_mode_black_24dp.xml
│ ├── ic_people_black_24dp.xml
│ ├── ic_people_outline_black_24dp.xml
│ ├── ic_person_add_black_24dp.xml
│ ├── ic_person_black_24dp.xml
│ ├── ic_person_outline_black_24dp.xml
│ ├── ic_plus_one_black_24dp.xml
│ ├── ic_poll_black_24dp.xml
│ ├── ic_public_black_24dp.xml
│ ├── ic_school_black_24dp.xml
│ ├── ic_sentiment_dissatisfied_black_24dp.xml
│ ├── ic_sentiment_neutral_black_24dp.xml
│ ├── ic_sentiment_satisfied_black_24dp.xml
│ ├── ic_sentiment_very_dissatisfied_black_24dp.xml
│ ├── ic_sentiment_very_satisfied_black_24dp.xml
│ ├── ic_share_black_24dp.xml
│ └── ic_whatshot_black_24dp.xml
└── toggle/
└── drawable-anydpi-v21/
├── ic_check_box_black_24dp.xml
├── ic_check_box_outline_blank_black_24dp.xml
├── ic_indeterminate_check_box_black_24dp.xml
├── ic_radio_button_checked_black_24dp.xml
├── ic_radio_button_unchecked_black_24dp.xml
├── ic_star_black_24dp.xml
├── ic_star_border_black_24dp.xml
└── ic_star_half_black_24dp.xml
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
### Intellij ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm
*.iml
## Directory-based project format:
.idea/
# if you remove the above rule, at least ignore the following:
# User-specific stuff:
# .idea/workspace.xml
# .idea/tasks.xml
# .idea/dictionaries
# Sensitive or high-churn files:
# .idea/dataSources.ids
# .idea/dataSources.xml
# .idea/sqlDataSources.xml
# .idea/dynamic.xml
# .idea/uiDesigner.xml
# Gradle:
# .idea/gradle.xml
# .idea/libraries
# Mongo Explorer plugin:
# .idea/mongoSettings.xml
## File-based project format:
*.ipr
*.iws
## Plugin-specific files:
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
### Java ###
*.class
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.ear
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
### Specific ###
*.zip
!icon_packs.zip
!libs/*
### Maven ###
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
### Gradle ###
.gradle
build/
# Ignore Gradle GUI config
gradle-app.setting
# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
!gradle-wrapper.jar
================================================
FILE: .travis.yml
================================================
language: java
jdk:
- oraclejdk8
sudo: false
env:
matrix:
- IDEA_VERSION=IC-14.0.4
- IDEA_VERSION=IC-14.1.6
- IDEA_VERSION=IC-15.0.2
- IDEA_VERSION=IC-2016.1
- IDEA_VERSION=IC-2016.2.4
- IDEA_VERSION=LATEST-EAP-SNAPSHOT
global:
- secure: GJxFEsmA6nJDtD45okB20WgXlfCY/Zaw90aOXxBAWb3w/7eeIFrolXev4ve+gxDettCArqcsPo53vpyimjFzRI8IZB+MZRnpPEVx3Ux/5eEBf2jMqsoaxmWk5rnKp3DTXjMlaAPSnUJRhrPboxdireQG2mIMa34QGv8tCcM2aLk=
notifications:
email: false
branches:
only:
- master
- develop
before_script:
- if [ $TRAVIS_BRANCH == 'develop' ]; then export PLUGIN_CHANNEL=nightly; fi
script:
- ./gradlew buildPlugin -PideaVersion=$IDEA_VERSION
after_success:
- curl -Lo travis_after_all.py https://raw.github.com/winterDroid/travis_after_all/master/travis_after_all.py
- python travis_after_all.py
- export $(cat .to_export_back) &> /dev/null
- if [[ $BUILD_LEADER = YES && "$BUILD_AGGREGATE_STATUS" = "others_succeeded" && $TRAVIS_PULL_REQUEST = 'false' ]]; then ./gradlew publishPlugin; fi
after_script:
- echo leader=$BUILD_LEADER status=$BUILD_AGGREGATE_STATUS
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright {yyyy} {name of copyright owner}
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.
================================================
FILE: README.md
================================================
## Forker's note
This fork came about because the original package stopped working somewhere around Android Studio 3.5.
I have provided an installation zip [here](https://gpskaihu.nz/ADI-hack/).
As at 31Jan2020 it is known to run nicely on AS 3.6 RC 1.
Any [feedback](https://github.com/MPArnold/android-drawable-importer-intellij-plugin/issues/1) would be appreciated.
# Android Drawable Importer Plugin

This plugin consists of three main features. You can access them by **right-clicking** anywhere, but **not** on a file, inside an **Android (library) module** under **New**.
## AndroidIcons and Material Icons Drawable Import
You are able to select the asset, specify your color, change the target resource name and select all the resolutions you want to import.
All the missing folders will be created automatically. If there are already drawables with the same name, you will be warned.
You can also import Vector Drawables from the Material Icons pack.
You can even search for your desired asset by just start typing when the first spinner has focus.


*You can download AndroidIcons [here](http://www.androidicons.com/) and Material Icons [here](https://github.com/google/material-design-icons) for free.*
## Batch Drawable Import
Select assets (or a whole folder) and specify the source resolutions. You can change the source size of every image as well. Specify all resolutions, to which it should be resized to.
This works also with 9-Patch-Images. But take care: sometimes it's necessary to remove / add the one or other "pixel" in the 9-Patch-Editor. But just give it a try :)



## Multisource-Drawable
Ever got a zip with drawables for your Android project by your designer with the following structure?
```
root/
./drawable_ldpi.png
./drawable_mdpi.png
./drawable_hdpi.png
./drawable_xhdpi.png
```
No problem! Now you can just select for every resolution a different asset, specify one name for them, and the rest is done by the plugin.
Or even easier, you can select the whole zip, and this plugin will auto extract the asset to the best matching folder.


*Hint: When you select an asset, you can also just drag a file from your explorer to the text field and drop it there.*
## Install Instructions (IntelliJ, Android Studio)
**Step 1:**
Open IntelliJ and click on the *Configure* button on the welcome screen.

Then click on the *Plugins* button to open the Plugins dialog.

If your IntelliJ is already opened or was closed with an open project, go to the *Settings* in the *File* menu on Windows or the *Preferences..* in the *IntelliJ IDEA* menu. Select the *Plugins* option on the left pane.


**Step 2:**
Click on the **Browse repositories...** button.

**Step 3:**
Search for **Android Drawable Importer** and select the plugin from the list. Click on the *Install Plugin* button and verify the selection by pressing *Yes* afterwards.


**Step 4:**
Afterwards click on the *Close* button. If IntelliJ asks you to restart, allow it.

# How to run the repository code
1. Clone
`git clone git@github.com:winterDroid/android-drawable-importer-intellij-plugin.git`
2. Run Gradle Wrapper In project root.
`./gradlew runIdea`
# Contribution
[](https://travis-ci.org/winterDroid/android-drawable-importer-intellij-plugin)
1. Fork it
2. Checkout develop branch
`git checkout develop && git pull`
2. Create your feature branch
`git checkout -b my-new-feature`
3. Commit your changes
`git commit -am 'Add some feature'`
4. Squash all commits in your branch together
`git rebase -i develop`
5. Push to the branch
`git push origin my-new-feature`
6. Create new *Pull Request*
# License
Copyright 2014 Marc Prengemann
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.
================================================
FILE: build.gradle
================================================
plugins {
//id "org.jetbrains.intellij" version "0.1.10"
// https://mvnrepository.com/artifact/org.jetbrains.intellij/org.jetbrains.intellij.gradle.plugin
id "org.jetbrains.intellij" version "0.4.15"
}
apply plugin: 'org.jetbrains.intellij'
apply plugin: 'java'
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
sourceSets {
main {
resources {
exclude 'assets/android_icons'
exclude 'assets/material_icons'
}
}
}
intellij {
//version project.hasProperty('ideaVersion') ? ideaVersion : 'IC-2016.2.4'
version project.hasProperty('ideaVersion') ? ideaVersion : 'IC-2019.2.4'
// Define IntelliJ Platform against which to build the plugin project.
//version '192.7142.36' // Same IntelliJ IDEA version (2019.2.4) for AS 3.6 RC 1
//type 'IC' // Use IntelliJ IDEA Community Edition
//pluginName 'BDI-plugin'
pluginName 'ADI-hack'
//plugins 'android'
plugins 'android', 'java'
updateSinceUntilBuild false
sameSinceUntilBuild false
downloadSources !Boolean.valueOf(System.getenv('CI'))
/*publish {
username 'MPArnold'
pluginId 'z7658'
password System.getenv('PLUGIN_PASSWORD')
channel System.getenv('PLUGIN_CHANNEL') ?: ''
}*/
}
//group 'de.mprengemann.intellij.plugin.androidicons'
def majorVersion = '0.7'
version "${Boolean.valueOf(System.getenv('CI')) ? "$majorVersion-${System.getenv('TRAVIS_BUILD_NUMBER')}" : "$majorVersion"}"
repositories {
mavenCentral()
}
dependencies {
compile 'commons-io:commons-io:2.4'
compile 'org.apache.commons:commons-math3:3.4.1'
compile 'org.imgscalr:imgscalr-lib:4.2'
compile 'net.coobird:thumbnailator:0.4.8'
compile 'com.google.code.gson:gson:2.3.1'
}
================================================
FILE: gradle/wrapper/gradle-wrapper.properties
================================================
#Wed Sep 30 13:40:53 CEST 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14-all.zip
================================================
FILE: gradle.properties
================================================
## Project-wide Gradle settings.
#
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
#
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx10248m -XX:MaxPermSize=256m
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
#
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# org.gradle.jvmargs=-XX:MaxPermSize=4g -XX:+HeapDumpOnOutOfMemoryError -Xmx4g
================================================
FILE: gradlew
================================================
#!/usr/bin/env bash
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn ( ) {
echo "$*"
}
die ( ) {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
esac
# For Cygwin, ensure paths are in UNIX format before anything is touched.
if $cygwin ; then
[ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
fi
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >&-
APP_HOME="`pwd -P`"
cd "$SAVED" >&-
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
================================================
FILE: gradlew.bat
================================================
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windowz variants
if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
goto execute
:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
================================================
FILE: json_generator/__init__.py
================================================
__author__ = 'marcprengemann'
================================================
FILE: json_generator/json_generator.py
================================================
import json
import os
import io
from itertools import izip, islice
from os.path import join
from PIL import Image
root = 'src/main/resources/assets/'
android_icons_url = 'http://www.androidicons.com/'
material_icons_url = 'https://www.google.com/design/icons/'
def convert_image(file):
pil_img = Image.open(file)
if pil_img.mode == '1':
img = Image.open(file)
img = img.convert('RGBA')
datas = img.getdata()
newData = []
for item in datas:
if item[0] == 0 and item[1] == 0 and item[2] == 0:
newData.append((0, 0, 0, 0))
else:
newData.append(item)
img.putdata(newData)
img.save(file)
def convert_images():
iconpack_root = join(root, 'android_icons')
for color in list_dirs_only(iconpack_root):
color_root = join(iconpack_root, color)
for resolution in list_dirs_only(color_root):
resolution_root = join(color_root, resolution)
for image in list_images(resolution_root):
convert_image(join(resolution_root, image))
iconpack_root = join(root, 'material_icons')
for category in list_dirs_only(iconpack_root):
category_root = join(iconpack_root, category)
for resolution in list_dirs_only(category_root):
resolution_root = join(category_root, resolution)
for image in list_images(resolution_root):
convert_image(join(resolution_root, image))
def get_android_icons_file(color, resolution, name):
iconpack_root = join(root, 'android_icons')
color_root = join(iconpack_root, color)
resolution_root = join(color_root, resolution)
full_name = name + '.png'
return join(resolution_root, full_name)
def handle_android_icons():
iconpack_root = join(root, 'android_icons')
id = 'android_icons'
colors = list_dirs_only(iconpack_root)
firstcolordir = join(iconpack_root, colors[0])
resolutions = list_dirs_only(firstcolordir)
assets = list_images(join(firstcolordir, resolutions[0]))
packdata = {'name': 'Android Icons',
'id': id,
'url': android_icons_url,
'path': 'android_icons/',
'categories': ['all']
}
assetdata = []
for asset in assets:
name = os.path.splitext(asset)[0]
data = {'name': name,
'pack': id,
'category': 'all',
'resolutions': resolutions,
'colors': colors,
'sizes': ['18dp']}
assetdata.append(data)
packdata['assets'] = assetdata
return packdata
def list_dirs_only(dir):
return [f for f in os.listdir(dir) if os.path.isdir(join(dir, f))]
def list_images(dir):
return [f for f in os.listdir(dir) if f.endswith('.png')]
def extract_data(icon_file_name):
file_name = os.path.splitext(icon_file_name)[0]
splits = file_name.split('_')
size = splits[-1]
splits.pop()
color = splits[-1]
splits.pop()
name = '_'.join(splits)
return name, color, size
def get_material_icons_file(category, color, size, resolution, name):
iconpack_root = join(root, 'material_icons')
category_root = join(iconpack_root, category)
resolution_root = join(category_root, 'drawable-' + resolution)
full_name = "_".join([name, color, size]) + '.png'
return join(resolution_root, full_name)
def handle_material_icons():
iconpack_root = join(root, 'material_icons')
categories = list_dirs_only(iconpack_root)
id = 'material_icons'
packdata = {'name': 'Material Icons',
'id': id,
'url': material_icons_url,
'path': 'material_icons/',
'categories': categories
}
assetdata = []
for category in categories:
category_root = join(iconpack_root, category)
resolutions = [s.split('-')[1] for s in list_dirs_only(category_root)]
raw_assets = [extract_data(f) for f in list_images(join(category_root, 'drawable-' + resolutions[1]))]
colors = []
sizes = []
for current_item, next_item in izip(raw_assets, islice(raw_assets, 1, None)):
colors.append(current_item[1])
sizes.append(current_item[2])
if current_item[0] != next_item[0]:
data = {'name': current_item[0],
'pack': id,
'category': category,
'resolutions': resolutions,
'colors': sorted(set(colors)),
'sizes': sorted(set(sizes))}
assetdata.append(data)
colors = []
sizes = []
continue
packdata['assets'] = assetdata
return packdata
convert_images()
android_icons_data = handle_android_icons()
material_icons_data = handle_material_icons()
packs = [android_icons_data, material_icons_data]
with io.open(join(root, 'content.json'), 'w', encoding='utf-8') as f:
f.write(unicode(json.dumps(packs, ensure_ascii=False)))
print('Created json at ' + join(join(os.getcwd(), root), 'content.json'))
================================================
FILE: settings.gradle
================================================
rootProject.name = 'ADI-hack'
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/IProjectSettingsComponent.java
================================================
package de.mprengemann.intellij.plugin.androidicons;
import com.intellij.openapi.components.ProjectComponent;
public interface IProjectSettingsComponent extends ProjectComponent {
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/IconApplication.java
================================================
package de.mprengemann.intellij.plugin.androidicons;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import com.intellij.openapi.components.ApplicationComponent;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.Task;
import com.intellij.util.io.ZipUtil;
import de.mprengemann.intellij.plugin.androidicons.controllers.DefaultControllerFactory;
import de.mprengemann.intellij.plugin.androidicons.controllers.IControllerFactory;
import de.mprengemann.intellij.plugin.androidicons.model.IconPack;
import de.mprengemann.intellij.plugin.androidicons.model.Resolution;
import de.mprengemann.intellij.plugin.androidicons.resources.ResourceLoader;
import org.apache.commons.io.FileUtils;
import org.jetbrains.annotations.NotNull;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import static java.lang.String.format;
public class IconApplication implements ApplicationComponent {
private static final String TAG = IconApplication.class.getSimpleName();
private static final Logger LOGGER = Logger.getInstance(TAG);
private IControllerFactory controllerFactory;
@NotNull
@Override
public String getComponentName() {
return getClass().getName();
}
@Override
public void initComponent() {
IconPack androidIcons = null;
IconPack materialIcons = null;
try {
// Instantiate the bundled IconPacks to be passed to the DefaultControllerFactory
// This reads "content.json" and ALWAYS gets done.
final BufferedReader fileReader = ResourceLoader.getBundledResReader("content.json");
assert fileReader != null;
final Type listType = new TypeToken<ArrayList<IconPack>>() {}.getType();
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Resolution.class, new Resolution.Deserializer());
final Gson gson = gsonBuilder.create();
final List<IconPack> iconPacks = gson.fromJson(fileReader, listType);
androidIcons = iconPacks.get(0); LOGGER.info(format("%d androidIcons", androidIcons.getAssets().size()));
materialIcons = iconPacks.get(1); LOGGER.info(format("%d materialIcons", materialIcons.getAssets().size()));
// Get the bundled property file (/assets) ...
String propFn = "icon_packs.properties";
Properties bundledIconPackProperties = new Properties();
bundledIconPackProperties.load(ResourceLoader.getBundledResourceStream(propFn));
// ... and compare 'version' with the local property file (/)
boolean export;
File propFile = new File(ResourceLoader.getExportPath(), propFn);
// NB: Above line may create /home/[userId]/.AndroidStudio3.6/system/ADI-hack-export
LOGGER.info(format("propFile.exists()=%b\n%s", propFile.exists(), propFile.getAbsolutePath()));
if (!propFile.exists()) {
export = true;
} else {
Properties localIconPackProperties = new Properties();
localIconPackProperties.load(FileUtils.openInputStream(propFile));
export = Integer.parseInt(bundledIconPackProperties.getProperty("version")) !=
Integer.parseInt(localIconPackProperties.getProperty("version"));
}
if (export) {
LOGGER.info("Preparing Android Drawable Importer");
new Task.Modal(null, "Prepare Android Drawable Importer", false) {
@Override
public void run(@NotNull ProgressIndicator progressIndicator) {
progressIndicator.setIndeterminate(true);
// Extract the property file from the jar
final File localProp = ResourceLoader.getFromJar(propFn);
assert localProp != null;
// "icon_packs.zip" contains: android_icons, material_icons, __MACOSX
final File tempIconZip = ResourceLoader.getFromJar("icon_packs.zip");
assert tempIconZip != null;
try { ZipUtil.extract(tempIconZip, ResourceLoader.getExportPath(), null, true); }
catch (IOException e) { LOGGER.error(e); }
tempIconZip.delete(); // No longer required
LOGGER.info("Icon packs prepared. Android Drawable Importer installed.");
}
}.queue();
}
} catch (Exception e) {
LOGGER.error(e);
}
controllerFactory = new DefaultControllerFactory(androidIcons, materialIcons);
}
@Override
public void disposeComponent() {
controllerFactory.tearDown();
controllerFactory = null;
}
public IControllerFactory getControllerFactory() {
return controllerFactory;
}
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/ProjectSettingsComponent.java
================================================
package de.mprengemann.intellij.plugin.androidicons;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.AbstractProjectComponent;
import com.intellij.openapi.project.Project;
import de.mprengemann.intellij.plugin.androidicons.controllers.IControllerFactory;
import org.jetbrains.annotations.NotNull;
public class ProjectSettingsComponent extends AbstractProjectComponent implements IProjectSettingsComponent {
private IControllerFactory controllerFactory;
protected ProjectSettingsComponent(Project project) {
super(project);
}
@Override
public void projectOpened() {
this.controllerFactory.setProject(myProject);
}
@Override
public void initComponent() {
super.initComponent();
final IconApplication iconApplication = ApplicationManager.getApplication().getComponent(IconApplication.class);
this.controllerFactory = iconApplication.getControllerFactory();
}
@Override
public void disposeComponent() {
super.disposeComponent();
this.controllerFactory = null;
}
@NotNull
@Override
public String getComponentName() {
return "ProjectSettingsComponent";
}
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/actions/AndroidAssetUtilsGroup.java
================================================
/*
* Copyright 2015 Marc Prengemann
*
* 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 de.mprengemann.intellij.plugin.androidicons.actions;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.DefaultActionGroup;
import de.mprengemann.intellij.plugin.androidicons.util.AndroidFacetUtils;
public class AndroidAssetUtilsGroup extends DefaultActionGroup {
@Override
public void update(AnActionEvent e) {
super.update(e);
AndroidFacetUtils.updateActionVisibility(e);
}
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/actions/AndroidBatchImportAction.java
================================================
/*
* Copyright 2015 Marc Prengemann
*
* 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 de.mprengemann.intellij.plugin.androidicons.actions;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.DataKeys;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import de.mprengemann.intellij.plugin.androidicons.dialogs.AndroidBatchScaleImporter;
import de.mprengemann.intellij.plugin.androidicons.util.AndroidFacetUtils;
import icons.AndroidIcons;
import org.jetbrains.annotations.NotNull;
public class AndroidBatchImportAction extends AnAction {
public AndroidBatchImportAction() {
super("Batch Drawable Import",
"Import drawables and scale them to the missing resolutions.",
AndroidIcons.Android);
}
@Override
public void actionPerformed(@NotNull AnActionEvent event) {
Project project = getEventProject(event);
Module module = event.getData(DataKeys.MODULE);
AndroidBatchScaleImporter dialog = new AndroidBatchScaleImporter(project, module);
dialog.show();
}
@Override
public void update(@NotNull AnActionEvent e) {
AndroidFacetUtils.updateActionVisibility(e);
}
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/actions/AndroidMultiDrawableAction.java
================================================
/*
* Copyright 2015 Marc Prengemann
*
* 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 de.mprengemann.intellij.plugin.androidicons.actions;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.DataKeys;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import de.mprengemann.intellij.plugin.androidicons.dialogs.AndroidMultiDrawableImporter;
import de.mprengemann.intellij.plugin.androidicons.util.AndroidFacetUtils;
import icons.AndroidIcons;
import org.jetbrains.annotations.NotNull;
public class AndroidMultiDrawableAction extends AnAction {
public AndroidMultiDrawableAction() {
super("Multisource-Drawable",
"Imports several drawables into the associated resources folders and renames them.",
AndroidIcons.Android);
}
@Override
public void actionPerformed(@NotNull AnActionEvent event) {
Project project = getEventProject(event);
Module module = event.getData(DataKeys.MODULE);
AndroidMultiDrawableImporter dialog = new AndroidMultiDrawableImporter(project, module);
dialog.show();
}
@Override
public void update(@NotNull AnActionEvent e) {
AndroidFacetUtils.updateActionVisibility(e);
}
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/actions/IconsAction.java
================================================
/*
* Copyright 2015 Marc Prengemann
*
* 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 de.mprengemann.intellij.plugin.androidicons.actions;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.DataKeys;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import de.mprengemann.intellij.plugin.androidicons.dialogs.IconImporter;
import de.mprengemann.intellij.plugin.androidicons.util.AndroidFacetUtils;
import icons.AndroidIcons;
import org.jetbrains.annotations.NotNull;
public class IconsAction extends AnAction {
public IconsAction() {
super("Icon Pack Drawable Importer",
"Creates a new Android Asset by the use of Google\'s Material Icons or Android Icons",
AndroidIcons.Android);
}
@Override
public void actionPerformed(@NotNull AnActionEvent event) {
Project project = getEventProject(event);
Module module = event.getData(DataKeys.MODULE);
final IconImporter dialog = new IconImporter(project, module);
dialog.show();
}
@Override
public void update(@NotNull AnActionEvent e) {
AndroidFacetUtils.updateActionVisibility(e);
}
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/actions/VectorsAction.java
================================================
/*
* Copyright 2015 Marc Prengemann
*
* 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 de.mprengemann.intellij.plugin.androidicons.actions;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.DataKeys;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import de.mprengemann.intellij.plugin.androidicons.dialogs.VectorImporter;
import de.mprengemann.intellij.plugin.androidicons.util.AndroidFacetUtils;
import icons.AndroidIcons;
import org.jetbrains.annotations.NotNull;
public class VectorsAction extends AnAction {
public VectorsAction() {
super("Vector Drawable Importer",
"Creates a new Android Vector Asset by the use of Google\'s Material Icons",
AndroidIcons.Android);
}
@Override
public void actionPerformed(@NotNull AnActionEvent event) {
Project project = getEventProject(event);
Module module = event.getData(DataKeys.MODULE);
final VectorImporter dialog = new VectorImporter(project, module);
dialog.show();
}
@Override
public void update(@NotNull AnActionEvent e) {
AndroidFacetUtils.updateActionVisibility(e);
}
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/DefaultControllerFactory.java
================================================
package de.mprengemann.intellij.plugin.androidicons.controllers;
import com.intellij.openapi.project.Project;
import de.mprengemann.intellij.plugin.androidicons.controllers.defaults.DefaultsController;
import de.mprengemann.intellij.plugin.androidicons.controllers.defaults.IDefaultsController;
import de.mprengemann.intellij.plugin.androidicons.controllers.iconimporter.IIconsImporterController;
import de.mprengemann.intellij.plugin.androidicons.controllers.icons.androidicons.AndroidIconsController;
import de.mprengemann.intellij.plugin.androidicons.controllers.icons.androidicons.IAndroidIconsController;
import de.mprengemann.intellij.plugin.androidicons.controllers.icons.materialicons.IMaterialIconsController;
import de.mprengemann.intellij.plugin.androidicons.controllers.icons.materialicons.MaterialIconsController;
import de.mprengemann.intellij.plugin.androidicons.controllers.settings.ISettingsController;
import de.mprengemann.intellij.plugin.androidicons.controllers.settings.SettingsController;
import de.mprengemann.intellij.plugin.androidicons.model.IconPack;
public class DefaultControllerFactory implements IControllerFactory {
private IAndroidIconsController androidIconsController;
private IMaterialIconsController materialIconsController;
private IDefaultsController defaultsController;
private ISettingsController settingsController;
private IIconsImporterController iconImporterController;
public DefaultControllerFactory(IconPack androidIcons,
IconPack materialIcons) {
androidIconsController = new AndroidIconsController(androidIcons);
materialIconsController = new MaterialIconsController(materialIcons);
}
@Override
public void setProject(Project project) {
if (project == null) {
return;
}
getSettingsController().setProject(project);
getDefaultsController().restore();
}
@Override
public IAndroidIconsController getAndroidIconsController() {
return androidIconsController;
}
@Override
public IMaterialIconsController getMaterialIconsController() {
return materialIconsController;
}
@Override
public IDefaultsController getDefaultsController() {
if (defaultsController == null) {
defaultsController = new DefaultsController(getSettingsController());
}
return defaultsController;
}
@Override
public ISettingsController getSettingsController() {
if (settingsController == null) {
settingsController = new SettingsController();
}
return settingsController;
}
@Override
public void tearDown() {
if (materialIconsController != null) {
materialIconsController.tearDown();
materialIconsController = null;
}
if (androidIconsController != null) {
androidIconsController.tearDown();
androidIconsController = null;
}
if (defaultsController != null) {
defaultsController.tearDown();
defaultsController = null;
}
if (settingsController != null) {
settingsController.tearDown();
settingsController = null;
}
if (iconImporterController != null) {
iconImporterController.tearDown();
iconImporterController = null;
}
}
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/IController.java
================================================
package de.mprengemann.intellij.plugin.androidicons.controllers;
public interface IController<T> {
void addObserver(T observer);
void removeObserver(T observer);
void tearDown();
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/IControllerFactory.java
================================================
package de.mprengemann.intellij.plugin.androidicons.controllers;
import com.intellij.openapi.project.Project;
import de.mprengemann.intellij.plugin.androidicons.controllers.defaults.IDefaultsController;
import de.mprengemann.intellij.plugin.androidicons.controllers.icons.androidicons.IAndroidIconsController;
import de.mprengemann.intellij.plugin.androidicons.controllers.icons.materialicons.IMaterialIconsController;
import de.mprengemann.intellij.plugin.androidicons.controllers.settings.ISettingsController;
public interface IControllerFactory {
void setProject(Project project);
IAndroidIconsController getAndroidIconsController();
IMaterialIconsController getMaterialIconsController();
IDefaultsController getDefaultsController();
ISettingsController getSettingsController();
void tearDown();
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/batchscale/BatchScaleImporterController.java
================================================
package de.mprengemann.intellij.plugin.androidicons.controllers.batchscale;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import de.mprengemann.intellij.plugin.androidicons.dialogs.AddItemBatchScaleDialog;
import de.mprengemann.intellij.plugin.androidicons.dialogs.EditItemsBatchScaleDialog;
import de.mprengemann.intellij.plugin.androidicons.images.RefactoringTask;
import de.mprengemann.intellij.plugin.androidicons.model.ImageInformation;
import de.mprengemann.intellij.plugin.androidicons.model.Resolution;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class BatchScaleImporterController implements IBatchScaleImporterController {
private Set<BatchScaleImporterObserver> observers;
private Map<String, List<ImageInformation>> images;
private Map<String, Resolution> sourceResolutions;
private List<String> sourceFiles;
public BatchScaleImporterController() {
this.observers = new HashSet<BatchScaleImporterObserver>();
this.images = new HashMap<String, List<ImageInformation>>();
this.sourceResolutions = new HashMap<String, Resolution>();
this.sourceFiles = new ArrayList<String>() {
@Override
public boolean add(String s) {
if (contains(s)) {
return false;
}
return super.add(s);
}
};
notifyUpdated();
}
@Override
public void addObserver(BatchScaleImporterObserver observer) {
observers.add(observer);
observer.updated();
}
@Override
public void removeObserver(BatchScaleImporterObserver observer) {
observers.remove(observer);
}
@Override
public void tearDown() {
observers.clear();
}
@Override
public void addImage(Resolution sourceResolution, List<ImageInformation> imageInformation) {
if (imageInformation == null ||
imageInformation.isEmpty()) {
return;
}
final String sourcePath = imageInformation.get(0).getImageFile().getAbsolutePath();
images.put(sourcePath, imageInformation);
sourceFiles.add(sourcePath);
sourceResolutions.put(sourcePath, sourceResolution);
notifyUpdated();
}
@Override
public void editImages(Project project, Module module, int[] indices) {
if (indices.length == 0) {
return;
}
DialogWrapper dialogWrapper;
if (indices.length == 1){
final int index = indices[0];
if (index >= sourceFiles.size() || 0 > index) {
return;
}
final String sourceFile = sourceFiles.get(index);
final List<ImageInformation> imageInformation = images.get(sourceFile);
dialogWrapper = new AddItemBatchScaleDialog(project,
module,
this,
sourceResolutions.get(sourceFile),
imageInformation);
} else {
final List<String> selectedFiles = new ArrayList<String>();
for (int index : indices) {
selectedFiles.add(sourceFiles.get(index));
}
final List<List<ImageInformation>> imageInformation = new ArrayList<List<ImageInformation>>();
final List<Resolution> sourceResolution = new ArrayList<Resolution>();
for (String selectedFile : selectedFiles) {
imageInformation.add(images.get(selectedFile));
sourceResolution.add(sourceResolutions.get(selectedFile));
}
dialogWrapper = new EditItemsBatchScaleDialog(project,
module,
this,
selectedFiles,
sourceResolution,
imageInformation);
}
dialogWrapper.show();
}
@Override
public void removeImages(int[] indices) {
for (int index : indices) {
if (index >= sourceFiles.size() ||
0 > index) {
return;
}
removeImage(sourceFiles.get(index));
}
}
@Override
public void removeImage(String sourcePath) {
if (!images.containsKey(sourcePath) &&
!sourceFiles.contains(sourcePath)) {
return;
}
images.remove(sourcePath);
sourceFiles.remove(sourcePath);
sourceResolutions.remove(sourcePath);
notifyUpdated();
}
@Override
public int getImageCount() {
return sourceFiles.size();
}
@Override
public ImageInformation getImage(int index) {
if (index >= sourceFiles.size() ||
0 > index) {
return null;
}
final List<ImageInformation> imageInformation = images.get(sourceFiles.get(index));
return imageInformation.get(0);
}
@Override
public List<Resolution> getTargetResolutions(ImageInformation information) {
final String sourcePath = information.getImageFile().getAbsolutePath();
if (!images.containsKey(sourcePath)) {
return new ArrayList<Resolution>();
}
final List<ImageInformation> imageInformations = images.get(sourcePath);
final List<Resolution> resolutions = new ArrayList<Resolution>();
for (ImageInformation image : imageInformations) {
resolutions.add(image.getTargetResolution());
}
return resolutions;
}
@Override
public RefactoringTask getExportTask(Project project) {
RefactoringTask task = new RefactoringTask(project);
for (String sourceFile : sourceFiles) {
final List<ImageInformation> informationList = images.get(sourceFile);
for (ImageInformation imageInformation : informationList) {
task.addImage(imageInformation);
}
}
return task;
}
private void notifyUpdated() {
for (BatchScaleImporterObserver observer : observers) {
observer.updated();
}
}
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/batchscale/BatchScaleImporterObserver.java
================================================
package de.mprengemann.intellij.plugin.androidicons.controllers.batchscale;
public interface BatchScaleImporterObserver {
void updated();
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/batchscale/IBatchScaleImporterController.java
================================================
package de.mprengemann.intellij.plugin.androidicons.controllers.batchscale;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import de.mprengemann.intellij.plugin.androidicons.controllers.IController;
import de.mprengemann.intellij.plugin.androidicons.images.RefactoringTask;
import de.mprengemann.intellij.plugin.androidicons.model.ImageInformation;
import de.mprengemann.intellij.plugin.androidicons.model.Resolution;
import java.util.List;
public interface IBatchScaleImporterController extends IController<BatchScaleImporterObserver> {
void addImage(Resolution sourceResolution, List<ImageInformation> imageInformation);
void editImages(Project project, Module module, int[] indices);
void removeImages(int[] indices);
void removeImage(String sourcePath);
int getImageCount();
ImageInformation getImage(int index);
List<Resolution> getTargetResolutions(ImageInformation information);
RefactoringTask getExportTask(Project project);
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/batchscale/additem/AddItemBatchScaleDialogObserver.java
================================================
package de.mprengemann.intellij.plugin.androidicons.controllers.batchscale.additem;
public interface AddItemBatchScaleDialogObserver {
void updated();
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/batchscale/additem/AddItemBatchScaleImporterController.java
================================================
package de.mprengemann.intellij.plugin.androidicons.controllers.batchscale.additem;
import com.google.common.base.Objects;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import de.mprengemann.intellij.plugin.androidicons.controllers.defaults.IDefaultsController;
import de.mprengemann.intellij.plugin.androidicons.images.ResizeAlgorithm;
import de.mprengemann.intellij.plugin.androidicons.model.Destination;
import de.mprengemann.intellij.plugin.androidicons.model.Format;
import de.mprengemann.intellij.plugin.androidicons.model.ImageInformation;
import de.mprengemann.intellij.plugin.androidicons.model.Resolution;
import de.mprengemann.intellij.plugin.androidicons.util.ExportNameUtils;
import de.mprengemann.intellij.plugin.androidicons.util.RefactorUtils;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class AddItemBatchScaleImporterController implements IAddItemBatchScaleImporterController {
private static final Logger LOGGER = Logger.getInstance(AddItemBatchScaleImporterController.class);
private Set<AddItemBatchScaleDialogObserver> observers;
private Set<Resolution> targetResolutions;
private Resolution sourceResolution;
private String exportName;
private File imageFile;
private int originalImageWidth;
private int targetWidth;
private int targetHeight;
private String exportRoot;
private ResizeAlgorithm algorithm;
private String method;
private float aspectRatio;
private boolean isNinePatch;
private Format format;
private Destination destination;
public AddItemBatchScaleImporterController(IDefaultsController defaultsController,
String exportRoot,
File file) {
this.observers = new HashSet<AddItemBatchScaleDialogObserver>();
this.targetResolutions = defaultsController.getResolutions();
init(file);
final String fileName = file.getName();
exportName = ExportNameUtils.getExportNameFromFilename(fileName);
sourceResolution = defaultsController.getSourceResolution();
algorithm = defaultsController.getAlgorithm();
method = defaultsController.getMethod();
this.exportRoot = exportRoot;
isNinePatch = fileName.endsWith(".9.png");
format = isNinePatch ? Format.PNG : defaultsController.getFormat();
destination = defaultsController.getDestination();
}
public AddItemBatchScaleImporterController(Resolution sourceResolution,
List<ImageInformation> information) {
this.observers = new HashSet<AddItemBatchScaleDialogObserver>();
this.targetResolutions = new HashSet<Resolution>();
for (ImageInformation imageInformation : information) {
targetResolutions.add(imageInformation.getTargetResolution());
}
final ImageInformation baseInformation = information.get(0);
init(baseInformation.getImageFile());
this.exportName = baseInformation.getExportName();
this.sourceResolution = sourceResolution;
this.algorithm = baseInformation.getAlgorithm();
this.method = algorithm.getPrettyMethod(baseInformation.getMethod());
this.exportRoot = baseInformation.getExportPath();
this.isNinePatch = baseInformation.isNinePatch();
this.format = baseInformation.getFormat();
destination = baseInformation.getDestination();
this.targetHeight = getOriginalTargetSize(sourceResolution, baseInformation.getTargetResolution(), targetHeight, baseInformation.getFactor());
this.targetWidth = getOriginalTargetSize(sourceResolution, baseInformation.getTargetResolution(), targetWidth, baseInformation.getFactor());
}
private void init(File file) {
try {
LOGGER.info(String.format("Adding file %s", file));
BufferedImage image = ImageIO.read(file);
imageFile = file;
originalImageWidth = image.getWidth();
targetWidth = image.getWidth();
targetHeight = image.getHeight();
aspectRatio = (float) image.getHeight() / (float) originalImageWidth;
} catch (Exception e) {
LOGGER.error(e);
}
}
@Override
public String getExportName() {
return exportName;
}
@Override
public String getExportPath() {
return exportRoot;
}
@Override
public Set<Resolution> getTargetResolutions() {
return targetResolutions;
}
@Override
public int getTargetWidth() {
return targetWidth;
}
@Override
public int getTargetHeight() {
return targetHeight;
}
@Override
public ResizeAlgorithm getAlgorithm() {
return algorithm;
}
@Override
public String getMethod() {
return method;
}
@Override
public File getImageFile() {
return imageFile;
}
@Override
public void setSourceResolution(Resolution resolution) {
sourceResolution = resolution;
notifyUpdated();
}
@Override
public Resolution getSourceResolution() {
return sourceResolution;
}
@Override
public void addTargetResolution(Resolution resolution) {
if (targetResolutions.contains(resolution)) {
return;
}
targetResolutions.add(resolution);
notifyUpdated();
}
@Override
public void removeTargetResolution(Resolution resolution) {
if (!targetResolutions.contains(resolution)) {
return;
}
targetResolutions.remove(resolution);
notifyUpdated();
}
@Override
public void setTargetHeight(int height) {
if (targetHeight == height) {
return;
}
targetHeight = height;
targetWidth = (int) (targetHeight / aspectRatio);
notifyUpdated();
}
@Override
public void setTargetWidth(int width) {
if (targetWidth == width) {
return;
}
targetWidth = width;
targetHeight = (int) (aspectRatio * targetWidth);
notifyUpdated();
}
@Override
public void setTargetRoot(String path) {
if (exportRoot.equals(path)) {
return;
}
exportRoot = path;
notifyUpdated();
}
@Override
public void setExportName(String name) {
if (exportName.equals(name)) {
return;
}
exportName = name;
notifyUpdated();
}
@Override
public void setAlgorithm(ResizeAlgorithm algorithm) {
if (algorithm == this.algorithm) {
return;
}
this.algorithm = algorithm;
this.method = algorithm.getMethods().get(0);
notifyUpdated();
}
@Override
public void setMethod(String method) {
if (Objects.equal(method, this.method)) {
return;
}
this.method = method;
notifyUpdated();
}
@Override
public List<String> getMethods() {
return algorithm.getMethods();
}
@Override
public Format getFormat() {
return format;
}
@Override
public boolean isNinePatch() {
return isNinePatch;
}
@Override
public void setFormat(Format format) {
if (this.format == format) {
return;
}
this.format = format;
notifyUpdated();
}
@Override
public Destination getDestination() {
return destination;
}
@Override
public void setDestination(Destination destination) {
if (this.destination == destination) {
return;
}
this.destination = destination;
notifyUpdated();
}
@Override
public int[] getScaledSize(Resolution resolution) {
final float scaleFactor = RefactorUtils.getScaleFactor(resolution, sourceResolution);
return new int[] {(int) (scaleFactor * targetWidth), (int) (scaleFactor * targetHeight)};
}
@Override
public List<ImageInformation> getImageInformation(Project project) {
final ImageInformation base = ImageInformation.newBuilder()
.setExportName(exportName)
.setImageFile(imageFile)
.setAlgorithm(algorithm)
.setMethod(algorithm.getMethod(method))
.setExportPath(exportRoot)
.setNinePatch(isNinePatch)
.setFormat(format)
.setDestination(destination)
.build();
final List<ImageInformation> images = new ArrayList<ImageInformation>();
for (Resolution resolution : targetResolutions) {
images.add(ImageInformation.newBuilder(base)
.setTargetResolution(resolution)
.setFactor(getRealScaleFactor(resolution))
.build());
}
return images;
}
@Override
public List<ImageInformation> getImageInformation(Project project,
String selectedFile,
List<ImageInformation> imageInformation,
Resolution sourceResolution) {
final ImageInformation base = ImageInformation.newBuilder(imageInformation.get(0))
.setAlgorithm(algorithm)
.setMethod(algorithm.getMethod(method))
.setExportPath(exportRoot)
.setFormat(format)
.build();
final List<ImageInformation> images = new ArrayList<ImageInformation>();
for (Resolution resolution : targetResolutions) {
images.add(ImageInformation.newBuilder(base)
.setTargetResolution(resolution)
.setFactor(getRealScaleFactor(resolution))
.build());
}
return images;
}
private float getRealScaleFactor(Resolution targetResolution) {
final float resolutionScaleFactor = RefactorUtils.getScaleFactor(targetResolution, sourceResolution);
final float sizeScaleFactor = (float) targetWidth / (float) originalImageWidth;
return resolutionScaleFactor * sizeScaleFactor;
}
private int getOriginalTargetSize(Resolution sourceResolution, Resolution targetResolution, int size, float factor) {
final float resolutionScaleFactor = RefactorUtils.getScaleFactor(targetResolution, sourceResolution);
final float sizeScaleFactor = factor / resolutionScaleFactor;
return (int) (sizeScaleFactor * size);
}
@Override
public void addObserver(AddItemBatchScaleDialogObserver observer) {
observers.add(observer);
notifyUpdated();
}
@Override
public void removeObserver(AddItemBatchScaleDialogObserver observer) {
observers.remove(observer);
}
@Override
public void tearDown() {
observers.clear();
}
private void notifyUpdated() {
for (AddItemBatchScaleDialogObserver observer : observers) {
observer.updated();
}
}
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/batchscale/additem/IAddItemBatchScaleImporterController.java
================================================
package de.mprengemann.intellij.plugin.androidicons.controllers.batchscale.additem;
import com.intellij.openapi.project.Project;
import de.mprengemann.intellij.plugin.androidicons.controllers.IController;
import de.mprengemann.intellij.plugin.androidicons.images.ResizeAlgorithm;
import de.mprengemann.intellij.plugin.androidicons.model.Destination;
import de.mprengemann.intellij.plugin.androidicons.model.Format;
import de.mprengemann.intellij.plugin.androidicons.model.ImageInformation;
import de.mprengemann.intellij.plugin.androidicons.model.Resolution;
import java.io.File;
import java.util.List;
import java.util.Set;
public interface IAddItemBatchScaleImporterController extends IController<AddItemBatchScaleDialogObserver> {
String getExportName();
String getExportPath();
Set<Resolution> getTargetResolutions();
int getTargetWidth();
int getTargetHeight();
ResizeAlgorithm getAlgorithm();
String getMethod();
File getImageFile();
void setSourceResolution(Resolution resolution);
Resolution getSourceResolution();
void addTargetResolution(Resolution resolution);
void removeTargetResolution(Resolution resolution);
void setTargetHeight(int height);
void setTargetWidth(int width);
void setTargetRoot(String path);
void setExportName(String name);
void setAlgorithm(ResizeAlgorithm algorithm);
void setMethod(String method);
void setFormat(Format format);
void setDestination(Destination destination);
List<String> getMethods();
Format getFormat();
Destination getDestination();
boolean isNinePatch();
int[] getScaledSize(Resolution resolution);
List<ImageInformation> getImageInformation(Project project);
List<ImageInformation> getImageInformation(Project project,
String selectedFile,
List<ImageInformation> imageInformation,
Resolution sourceResolution);
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/defaults/DefaultsController.java
================================================
package de.mprengemann.intellij.plugin.androidicons.controllers.defaults;
import de.mprengemann.intellij.plugin.androidicons.controllers.settings.ISettingsController;
import de.mprengemann.intellij.plugin.androidicons.images.ResizeAlgorithm;
import de.mprengemann.intellij.plugin.androidicons.model.Destination;
import de.mprengemann.intellij.plugin.androidicons.model.Format;
import de.mprengemann.intellij.plugin.androidicons.model.ImageAsset;
import de.mprengemann.intellij.plugin.androidicons.model.Resolution;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class DefaultsController implements IDefaultsController {
public static final HashSet<Resolution> DEFAULT_RESOLUTIONS = new HashSet<Resolution>(Arrays.asList(Resolution.MDPI,
Resolution.HDPI,
Resolution.XHDPI,
Resolution.XXHDPI,
Resolution.XXXHDPI));
public static final Resolution DEFAULT_SOURCE_RESOLUTION = Resolution.XHDPI;
public static final ResizeAlgorithm DEFAULT_ALGORITHM = ResizeAlgorithm.SCALR;
public static final String DEFAULT_METHOD = DEFAULT_ALGORITHM.getMethods().get(0);
public static final Format DEFAULT_FORMAT = Format.PNG;
public static final Destination DEFAULT_DESTINATION = Destination.DRAWABLE;
private Set<Resolution> resolutions;
private Resolution sourceResolution;
private ImageAsset imageAsset;
private ISettingsController settingsController;
private ResizeAlgorithm algorithm;
private String method;
private Format format;
private Destination destination;
private String size;
private String color;
public DefaultsController(ISettingsController settingsController) {
this.settingsController = settingsController;
}
@Override
public Set<Resolution> getResolutions() {
return resolutions;
}
@Override
public void setResolutions(Set<Resolution> resolutions) {
this.resolutions = resolutions;
settingsController.saveResolutions(this.resolutions);
}
@Override
public ImageAsset getImageAsset() {
return imageAsset;
}
@Override
public void setImageAsset(ImageAsset imageAsset) {
this.imageAsset = imageAsset;
settingsController.saveImageAsset(this.imageAsset);
}
@Override
public Resolution getSourceResolution() {
return sourceResolution;
}
@Override
public void setSourceResolution(Resolution sourceResolution) {
this.sourceResolution = sourceResolution;
settingsController.saveSourceResolution(this.sourceResolution);
}
@Override
public String getSize() {
return size;
}
@Override
public void setSize(String size) {
this.size = size;
settingsController.saveSize(this.size);
}
@Override
public String getColor() {
return color;
}
@Override
public void setColor(String color) {
this.color = color;
settingsController.saveColor(this.color);
}
@Override
public ResizeAlgorithm getAlgorithm() {
return algorithm;
}
@Override
public void setAlgorithm(ResizeAlgorithm algorithm) {
this.algorithm = algorithm;
settingsController.saveAlgorithm(this.algorithm);
}
@Override
public String getMethod() {
return method;
}
@Override
public void setMethod(String method) {
this.method = method;
settingsController.saveMethod(this.method);
}
@Override
public Format getFormat() {
return format;
}
@Override
public void setFormat(Format format) {
this.format = format;
settingsController.saveFormat(this.format);
}
@Override
public Destination getDestination() {
return destination;
}
@Override
public void setDestination(Destination destination) {
this.destination = destination;
settingsController.saveDestination(this.destination);
}
@Override
public void restore() {
imageAsset = settingsController.getImageAsset();
resolutions = settingsController.getResolutions(DEFAULT_RESOLUTIONS);
sourceResolution = settingsController.getSourceResolution(DEFAULT_SOURCE_RESOLUTION);
algorithm = settingsController.getAlgorithm(DEFAULT_ALGORITHM);
format = settingsController.getFormat(DEFAULT_FORMAT);
destination = settingsController.getDestination(DEFAULT_DESTINATION);
method = settingsController.getMethod(DEFAULT_METHOD);
color = settingsController.getColor();
size = settingsController.getSize();
}
@Override
public void tearDown() {
resolutions = null;
imageAsset = null;
sourceResolution = null;
size = null;
color = null;
algorithm = null;
format = null;
destination = null;
method = null;
settingsController = null;
}
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/defaults/IDefaultsController.java
================================================
package de.mprengemann.intellij.plugin.androidicons.controllers.defaults;
import de.mprengemann.intellij.plugin.androidicons.images.ResizeAlgorithm;
import de.mprengemann.intellij.plugin.androidicons.model.Destination;
import de.mprengemann.intellij.plugin.androidicons.model.Format;
import de.mprengemann.intellij.plugin.androidicons.model.ImageAsset;
import de.mprengemann.intellij.plugin.androidicons.model.Resolution;
import java.util.Set;
public interface IDefaultsController {
Set<Resolution> getResolutions();
void setResolutions(Set<Resolution> resolutions);
ImageAsset getImageAsset();
void setImageAsset(ImageAsset imageAsset);
Resolution getSourceResolution();
void setSourceResolution(Resolution sourceResolution);
String getSize();
void setSize(String size);
String getColor();
void setColor(String color);
ResizeAlgorithm getAlgorithm();
void setAlgorithm(ResizeAlgorithm algorithm);
String getMethod();
void setMethod(String method);
Format getFormat();
void setFormat(Format format);
Destination getDestination();
void setDestination(Destination destination);
void restore();
void tearDown();
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/iconimporter/IIconsImporterController.java
================================================
package de.mprengemann.intellij.plugin.androidicons.controllers.iconimporter;
import com.intellij.openapi.project.Project;
import de.mprengemann.intellij.plugin.androidicons.controllers.IController;
import de.mprengemann.intellij.plugin.androidicons.controllers.icons.IIconPackController;
import de.mprengemann.intellij.plugin.androidicons.images.RefactoringTask;
import de.mprengemann.intellij.plugin.androidicons.model.Format;
import de.mprengemann.intellij.plugin.androidicons.model.ImageAsset;
import de.mprengemann.intellij.plugin.androidicons.model.Resolution;
import java.io.File;
import java.util.List;
import java.util.Set;
public interface IIconsImporterController extends IController<IconsImporterObserver>{
void setExportRoot(String exportRoot);
void setSelectedIconPack(String iconPack);
void setSelectedCategory(String category);
void setSelectedAsset(ImageAsset asset);
void setSelectedSize(String size);
void setSelectedColor(String color);
void setExportName(String exportName);
String getExportName();
String getExportRoot();
File getImageFile(ImageAsset asset, String color, Resolution resolution);
File getThumbnailFile(ImageAsset asset);
File getSelectedImageFile();
ImageAsset getSelectedAsset();
File getSelectedImageFile(Resolution resolution);
List<String> getCategories();
List<ImageAsset> getAssets();
List<String> getSizes();
List<String> getColors();
String getSelectedSize();
String getSelectedColor();
IIconPackController getSelectedIconPack();
String getSelectedCategory();
void setFormat(Format format);
boolean isNinePatch();
Format getFormat();
RefactoringTask getTask(Project project);
void setExportResolution(Resolution resolution, boolean export);
Set<Resolution> getExportResolutions();
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/iconimporter/IconsImporterController.java
================================================
package de.mprengemann.intellij.plugin.androidicons.controllers.iconimporter;
import com.intellij.openapi.project.Project;
import com.jgoodies.common.base.Objects;
import de.mprengemann.intellij.plugin.androidicons.controllers.defaults.IDefaultsController;
import de.mprengemann.intellij.plugin.androidicons.controllers.icons.IIconPackController;
import de.mprengemann.intellij.plugin.androidicons.controllers.icons.androidicons.IAndroidIconsController;
import de.mprengemann.intellij.plugin.androidicons.controllers.icons.materialicons.IMaterialIconsController;
import de.mprengemann.intellij.plugin.androidicons.images.RefactoringTask;
import de.mprengemann.intellij.plugin.androidicons.model.Format;
import de.mprengemann.intellij.plugin.androidicons.model.ImageAsset;
import de.mprengemann.intellij.plugin.androidicons.model.ImageInformation;
import de.mprengemann.intellij.plugin.androidicons.model.Resolution;
import de.mprengemann.intellij.plugin.androidicons.util.RefactorUtils;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class IconsImporterController implements IIconsImporterController {
private final Set<IconsImporterObserver> observerSet;
private final IAndroidIconsController androidIconsController;
private final IMaterialIconsController materialIconsController;
private Set<Resolution> exportResolutions;
private ImageAsset selectedAsset;
private String selectedSize;
private String selectedColor;
private Format format;
private String exportName;
private String exportRoot;
public IconsImporterController(IDefaultsController defaultsController,
IAndroidIconsController androidIconsController,
IMaterialIconsController materialIconsController) {
this.androidIconsController = androidIconsController;
this.materialIconsController = materialIconsController;
this.observerSet = new HashSet<IconsImporterObserver>();
final ImageAsset defaultImageAsset = defaultsController.getImageAsset();
if (defaultImageAsset == null) {
final String category = materialIconsController.getCategories().get(0);
setSelectedAsset(materialIconsController.getAssets(category).get(0));
} else {
this.selectedSize = defaultsController.getSize();
this.selectedColor = defaultsController.getColor();
setSelectedAsset(defaultImageAsset);
}
this.format = Format.PNG;
this.exportName = null;
this.exportResolutions = defaultsController.getResolutions();
}
public IconsImporterController(IDefaultsController defaultsController,
IMaterialIconsController materialIconsController) {
this.androidIconsController = null;
this.materialIconsController = materialIconsController;
this.observerSet = new HashSet<IconsImporterObserver>();
final ImageAsset defaultImageAsset = defaultsController.getImageAsset();
if (defaultImageAsset == null ||
!defaultImageAsset.getIconPack().equals(materialIconsController.getIconPack().getId())) {
final String category = materialIconsController.getCategories().get(0);
setSelectedAsset(materialIconsController.getAssets(category).get(0));
} else {
setSelectedAsset(defaultImageAsset);
}
this.exportName = null;
this.format = Format.XML;
this.exportResolutions = Collections.singleton(Resolution.ANYDPI);
}
@Override
public void addObserver(IconsImporterObserver observer) {
observerSet.add(observer);
notifyUpdated();
}
@Override
public void removeObserver(IconsImporterObserver observer) {
observerSet.remove(observer);
}
@Override
public void tearDown() {
observerSet.clear();
}
@Override
public void setExportRoot(String exportRoot) {
if (exportRoot.equals(this.exportRoot)) {
return;
}
this.exportRoot = exportRoot;
notifyUpdated();
}
@Override
public void setSelectedIconPack(String iconPack) {
if (selectedAsset.getIconPack().equals(iconPack)) {
return;
}
final IIconPackController controller = getControllerForIconPackId(iconPack);
final String category = controller.getCategories().get(0);
selectedAsset = controller.getAssets(category).get(0);
updateColorAndSize();
notifyUpdated();
}
@NotNull
private IIconPackController getControllerForIconPackId(String iconPack) {
IIconPackController controller;
if (materialIconsController.getId().equals(iconPack)) {
controller = materialIconsController;
} else if (androidIconsController != null &&
androidIconsController.getId().equals(iconPack)) {
controller = androidIconsController;
} else {
throw new IllegalArgumentException(iconPack + " not found!");
}
return controller;
}
@Override
public void setSelectedCategory(String category) {
if (selectedAsset.getCategory().equals(category)) {
return;
}
selectedAsset = materialIconsController.getAssets(category).get(0);
updateColorAndSize();
notifyUpdated();
}
@Override
public void setSelectedAsset(ImageAsset asset) {
selectedAsset = asset;
updateColorAndSize();
notifyUpdated();
}
private void updateColorAndSize() {
if (!selectedAsset.getColors().contains(selectedColor)) {
selectedColor = selectedAsset.getColors().get(0);
}
if (!selectedAsset.getSizes().contains(selectedSize)) {
selectedSize = selectedAsset.getSizes().get(0);
}
}
@Override
public void setSelectedSize(String size) {
if (selectedSize.equals(size) &&
selectedAsset.getSizes().contains(size)) {
return;
}
selectedSize = size;
if (!selectedAsset.getSizes().contains(selectedSize)) {
selectedSize = selectedAsset.getSizes().get(0);
}
notifyUpdated();
}
@Override
public void setSelectedColor(String color) {
if (selectedColor.equals(color) &&
selectedAsset.getColors().contains(color)) {
return;
}
selectedColor = color;
if (!selectedAsset.getColors().contains(selectedColor)) {
selectedSize = selectedAsset.getColors().get(0);
}
notifyUpdated();
}
@Override
public void setExportName(String exportName) {
if (exportName.equals(selectedAsset.getName())) {
exportName = null;
}
if (Objects.equals(exportName, this.exportName)) {
return;
}
this.exportName = exportName;
notifyUpdated();
}
@Override
public String getExportName() {
return exportName != null ? exportName : selectedAsset.getName();
}
@Override
public String getExportRoot() {
return exportRoot;
}
@Override
public File getImageFile(ImageAsset asset, String color, Resolution resolution) {
return getSelectedIconPack().getImageFile(asset, color, resolution);
}
@Override
public File getThumbnailFile(ImageAsset asset) {
final IIconPackController iconPackController = getControllerForIconPackId(asset.getIconPack());
return iconPackController.getImageFile(asset, "black", iconPackController.getThumbnailResolution());
}
@Override
public File getSelectedImageFile() {
return getSelectedImageFile(Resolution.HDPI);
}
@Override
public File getSelectedImageFile(Resolution resolution) {
final IIconPackController iconPackController = getSelectedIconPack();
return iconPackController.getImageFile(selectedAsset, selectedColor, selectedSize, resolution);
}
@Override
public List<String> getCategories() {
return getSelectedIconPack().getCategories();
}
@Override
public List<ImageAsset> getAssets() {
return getSelectedIconPack().getAssets(selectedAsset.getCategory());
}
@Override
public List<String> getSizes() {
return selectedAsset.getSizes();
}
@Override
public List<String> getColors() {
return selectedAsset.getColors();
}
@Override
public ImageAsset getSelectedAsset() {
return selectedAsset;
}
@Override
public String getSelectedSize() {
return selectedSize;
}
@Override
public String getSelectedColor() {
return selectedColor;
}
@Override
public IIconPackController getSelectedIconPack() {
return getControllerForIconPackId(selectedAsset.getIconPack());
}
@Override
public String getSelectedCategory() {
return selectedAsset.getCategory();
}
@Override
public void setFormat(Format format) {
if (this.format == format) {
return;
}
this.format = isNinePatch() ? Format.PNG : format;
notifyUpdated();
}
@Override
public boolean isNinePatch() {
return false;
}
@Override
public Format getFormat() {
return format;
}
@Override
public RefactoringTask getTask(Project project) {
final RefactoringTask task = new RefactoringTask(project);
final ImageInformation baseInformation = ImageInformation.newBuilder()
.setExportName(getExportName())
.setExportPath(getExportRoot())
.setFormat(getFormat())
.build();
for (Resolution resolution : exportResolutions) {
ImageInformation.Builder imageInformationBuilder = ImageInformation.newBuilder(baseInformation);
imageInformationBuilder.setTargetResolution(resolution);
imageInformationBuilder.setVector(resolution == Resolution.ANYDPI);
final File selectedImageFile;
if (getSelectedAsset().getResolutions().contains(resolution)) {
selectedImageFile = getSelectedImageFile(resolution);
} else {
if (getSelectedIconPack().getId().equals(materialIconsController.getIconPack().getId())) {
selectedImageFile = getSelectedImageFile(Resolution.HDPI);
imageInformationBuilder.setFactor(RefactorUtils.getScaleFactor(resolution, Resolution.HDPI));
} else if (androidIconsController != null &&
getSelectedIconPack().getId().equals(androidIconsController.getIconPack().getId())) {
selectedImageFile = getSelectedImageFile(Resolution.XXHDPI);
imageInformationBuilder.setFactor(RefactorUtils.getScaleFactor(resolution, Resolution.XXHDPI));
} else {
throw new IllegalStateException();
}
}
imageInformationBuilder.setImageFile(selectedImageFile);
task.addImage(imageInformationBuilder.build());
}
return task;
}
@Override
public void setExportResolution(Resolution resolution, boolean export) {
if (exportResolutions.contains(resolution) && !export) {
exportResolutions.remove(resolution);
} else if (!exportResolutions.contains(resolution) && export) {
exportResolutions.add(resolution);
}
}
@Override
public Set<Resolution> getExportResolutions() {
return exportResolutions;
}
private void notifyUpdated() {
for (IconsImporterObserver observer : observerSet) {
observer.updated();
}
}
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/iconimporter/IconsImporterObserver.java
================================================
package de.mprengemann.intellij.plugin.androidicons.controllers.iconimporter;
public interface IconsImporterObserver {
void updated();
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/icons/IIconPackController.java
================================================
package de.mprengemann.intellij.plugin.androidicons.controllers.icons;
import de.mprengemann.intellij.plugin.androidicons.model.IconPack;
import de.mprengemann.intellij.plugin.androidicons.model.ImageAsset;
import de.mprengemann.intellij.plugin.androidicons.model.Resolution;
import java.io.File;
import java.util.List;
public interface IIconPackController {
String getId();
List<ImageAsset> getAssets(String category);
List<ImageAsset> getAssets(List<String> categories);
File getImageFile(ImageAsset asset, String color, Resolution resolution);
File getImageFile(ImageAsset asset, String color, String size, Resolution resolution);
void tearDown();
List<String> getCategories();
IconPack getIconPack();
boolean supportsVectors();
Resolution getThumbnailResolution();
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/icons/androidicons/AndroidIconsController.java
================================================
package de.mprengemann.intellij.plugin.androidicons.controllers.icons.androidicons;
import de.mprengemann.intellij.plugin.androidicons.model.IconPack;
import de.mprengemann.intellij.plugin.androidicons.model.ImageAsset;
import de.mprengemann.intellij.plugin.androidicons.model.Resolution;
import de.mprengemann.intellij.plugin.androidicons.resources.ResourceLoader;
import java.io.File;
import java.util.List;
import java.util.Locale;
public class AndroidIconsController implements IAndroidIconsController {
private IconPack iconPack;
public AndroidIconsController(IconPack iconPack) {
this.iconPack = iconPack;
}
@Override
public String getId() {
return iconPack.getId();
}
@Override
public IconPack getIconPack() {
return iconPack;
}
@Override
public boolean supportsVectors() {
return false;
}
@Override
public Resolution getThumbnailResolution() {
return Resolution.LDPI;
}
@Override
public List<ImageAsset> getAssets(String category) {
return iconPack.getAssets();
}
@Override
public List<ImageAsset> getAssets(List<String> categories) {
return iconPack.getAssets();
}
@Override
public List<String> getCategories() {
return iconPack.getCategories();
}
@Override
public File getImageFile(ImageAsset asset, String color, Resolution resolution) {
return getImageFile(asset, color, null, resolution);
}
@Override
public File getImageFile(ImageAsset asset, String color, String size, Resolution resolution) {
if (resolution == Resolution.ANYDPI) {
throw new IllegalStateException("Vectors not supported by AndroidIcons");
}
final String localPath = String.format("%s/%s/%s.png",
color,
resolution.toString().toLowerCase(Locale.ENGLISH),
asset.getName());
return ResourceLoader.getAssetResource(new File(iconPack.getPath(), localPath).getPath());
}
@Override
public void tearDown() {
iconPack = null;
}
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/icons/androidicons/IAndroidIconsController.java
================================================
package de.mprengemann.intellij.plugin.androidicons.controllers.icons.androidicons;
import de.mprengemann.intellij.plugin.androidicons.controllers.icons.IIconPackController;
public interface IAndroidIconsController extends IIconPackController {
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/icons/materialicons/IMaterialIconsController.java
================================================
package de.mprengemann.intellij.plugin.androidicons.controllers.icons.materialicons;
import de.mprengemann.intellij.plugin.androidicons.controllers.icons.IIconPackController;
public interface IMaterialIconsController extends IIconPackController {
void openHelp();
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/icons/materialicons/MaterialIconsController.java
================================================
package de.mprengemann.intellij.plugin.androidicons.controllers.icons.materialicons;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.intellij.ide.BrowserUtil;
import de.mprengemann.intellij.plugin.androidicons.model.IconPack;
import de.mprengemann.intellij.plugin.androidicons.model.ImageAsset;
import de.mprengemann.intellij.plugin.androidicons.model.Resolution;
import de.mprengemann.intellij.plugin.androidicons.resources.ResourceLoader;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
public class MaterialIconsController implements IMaterialIconsController {
private IconPack iconPack;
private Map<String, List<ImageAsset>> categoryMap;
public MaterialIconsController(IconPack iconPack) {
this.iconPack = iconPack;
this.categoryMap = initCategoryMap(iconPack);
}
private HashMap<String, List<ImageAsset>> initCategoryMap(IconPack iconPack) {
final HashMap<String, List<ImageAsset>> categoryMap = Maps.newHashMap();
if (iconPack == null) {
return categoryMap;
}
for (String category : iconPack.getCategories()) {
categoryMap.put(category, Lists.<ImageAsset>newArrayList());
}
for (ImageAsset asset : iconPack.getAssets()) {
categoryMap.get(asset.getCategory()).add(asset);
}
return categoryMap;
}
@Override
public String getId() {
return iconPack.getId();
}
@Override
public IconPack getIconPack() {
return iconPack;
}
@Override
public boolean supportsVectors() {
return true;
}
@Override
public Resolution getThumbnailResolution() {
return Resolution.MDPI;
}
@Override
public List<ImageAsset> getAssets(String category) {
return categoryMap.get(category);
}
@Override
public List<ImageAsset> getAssets(List<String> categories) {
return iconPack.getAssets();
}
@Override
public List<String> getCategories() {
return iconPack.getCategories();
}
@Override
public void openHelp() {
BrowserUtil.browse(iconPack.getUrl());
}
@Override
public File getImageFile(ImageAsset asset, String color, Resolution resolution) {
return getImageFile(asset, color, "24dp", resolution);
}
@Override
public File getImageFile(ImageAsset asset, String color, String size, Resolution resolution) {
final String localPath;
if (resolution == Resolution.ANYDPI) {
localPath = getVectorFilePath(asset);
} else {
localPath = getImageFilePath(asset, color, size, resolution);
}
return ResourceLoader.getAssetResource(new File(iconPack.getPath(), localPath).getPath());
}
private String getImageFilePath(ImageAsset asset, String color, String size, Resolution resolution) {
return String.format("%s/drawable-%s/%s_%s_%s.png",
asset.getCategory(),
resolution.toString().toLowerCase(Locale.ENGLISH),
asset.getName(),
color,
size);
}
private String getVectorFilePath(ImageAsset asset) {
return String.format("%s/drawable-%s-v21/%s_black_24dp.xml",
asset.getCategory(),
Resolution.ANYDPI.toString().toLowerCase(Locale.ENGLISH),
asset.getName());
}
@Override
public void tearDown() {
iconPack = null;
}
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/multi/IMultiImporterController.java
================================================
package de.mprengemann.intellij.plugin.androidicons.controllers.multi;
import com.intellij.openapi.project.Project;
import de.mprengemann.intellij.plugin.androidicons.controllers.IController;
import de.mprengemann.intellij.plugin.androidicons.images.RefactoringTask;
import de.mprengemann.intellij.plugin.androidicons.model.Format;
import de.mprengemann.intellij.plugin.androidicons.model.ImageInformation;
import de.mprengemann.intellij.plugin.androidicons.model.Resolution;
import java.io.File;
import java.util.List;
import java.util.Map;
public interface IMultiImporterController extends IController<MultiImporterObserver> {
String getTargetRoot();
void setTargetRoot(File path);
void addImage(File source, Resolution target);
RefactoringTask getTask(Project project);
void addZipImage(File file, Resolution resolution);
Map<Resolution, List<ImageInformation>> getZipImages();
void resetZipInformation();
RefactoringTask getZipTask(Project project, File tempDir);
void setExportName(String exportName);
String getExportName();
File getMostRecentImage();
void setMostRecentImage(Resolution resolution);
boolean containsNinePatch();
Format getFormat();
void setFormat(Format format);
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/multi/MultiImporterController.java
================================================
package de.mprengemann.intellij.plugin.androidicons.controllers.multi;
import com.google.common.base.Objects;
import com.intellij.openapi.project.Project;
import de.mprengemann.intellij.plugin.androidicons.controllers.defaults.IDefaultsController;
import de.mprengemann.intellij.plugin.androidicons.images.RefactoringTask;
import de.mprengemann.intellij.plugin.androidicons.model.Format;
import de.mprengemann.intellij.plugin.androidicons.model.ImageInformation;
import de.mprengemann.intellij.plugin.androidicons.model.Resolution;
import de.mprengemann.intellij.plugin.androidicons.util.ExportNameUtils;
import de.mprengemann.intellij.plugin.androidicons.util.TextUtils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class MultiImporterController implements IMultiImporterController {
private Set<MultiImporterObserver> observers;
private Map<Resolution, List<ImageInformation>> zipImageInformationMap;
private Map<Resolution, ImageInformation> imageInformationMap;
private String targetRoot;
private String exportName;
private Resolution mostRecentResolution;
private Format format;
public MultiImporterController(IDefaultsController defaultsController) {
this.observers = new HashSet<MultiImporterObserver>();
this.imageInformationMap = new HashMap<Resolution, ImageInformation>();
this.zipImageInformationMap = new HashMap<Resolution, List<ImageInformation>>();
this.format = defaultsController.getFormat();
}
@Override
public void addObserver(MultiImporterObserver observer) {
observers.add(observer);
observer.updated();
}
@Override
public void removeObserver(MultiImporterObserver observer) {
observers.remove(observer);
}
@Override
public String getTargetRoot() {
return targetRoot;
}
@Override
public void setTargetRoot(File path) {
if (Objects.equal(targetRoot, path.getAbsolutePath())) {
return;
}
targetRoot = path.getAbsolutePath();
notifyUpdated();
}
@Override
public void addImage(File source, Resolution resolution) {
imageInformationMap.put(resolution, ImageInformation.newBuilder()
.setImageFile(source)
.setNinePatch(source.getName().endsWith(".9.png"))
.setTargetResolution(resolution)
.build());
mostRecentResolution = resolution;
setFormat(format);
if (TextUtils.isEmpty(exportName)) {
exportName = ExportNameUtils.getExportNameFromFilename(source.getName());
}
notifyUpdated();
}
@Override
public void addZipImage(File source, Resolution resolution) {
if (!zipImageInformationMap.containsKey(resolution)) {
zipImageInformationMap.put(resolution, new ArrayList<ImageInformation>());
}
final String fileName = FilenameUtils.getBaseName(source.getName())
.replaceAll("(?i)[-_]+" + resolution.toString(), "");
zipImageInformationMap.get(resolution).add(ImageInformation.newBuilder()
.setImageFile(source)
.setTargetResolution(resolution)
.setFormat(format)
.setNinePatch(source.getName().endsWith(".9.png"))
.setExportName(fileName)
.build());
}
@Override
public Map<Resolution, List<ImageInformation>> getZipImages() {
return zipImageInformationMap;
}
@Override
public void resetZipInformation() {
zipImageInformationMap.clear();
}
@Override
public RefactoringTask getTask(Project project) {
RefactoringTask task = new RefactoringTask(project);
for (Resolution resolution : imageInformationMap.keySet()) {
task.addImage(ImageInformation.newBuilder(imageInformationMap.get(resolution))
.setExportPath(targetRoot)
.setExportName(exportName)
.setFormat(format)
.build());
}
return task;
}
@Override
public RefactoringTask getZipTask(Project project, File tempDir) {
RefactoringTask task = new ZipRefactoringTask(project, tempDir);
for (Resolution resolution : zipImageInformationMap.keySet()) {
for (ImageInformation imageInformation : zipImageInformationMap.get(resolution)) {
task.addImage(ImageInformation.newBuilder(imageInformation)
.setExportPath(targetRoot)
.build());
}
}
return task;
}
@Override
public void setExportName(String exportName) {
if (Objects.equal(exportName, this.exportName)) {
return;
}
this.exportName = ExportNameUtils.getExportNameFromFilename(exportName);
notifyUpdated();
}
@Override
public String getExportName() {
return exportName;
}
@Override
public File getMostRecentImage() {
if (!imageInformationMap.containsKey(mostRecentResolution)) {
return null;
}
return imageInformationMap.get(mostRecentResolution).getImageFile();
}
@Override
public void setMostRecentImage(Resolution resolution) {
if (resolution == mostRecentResolution) {
return;
}
this.mostRecentResolution = resolution;
notifyUpdated();
}
private void notifyUpdated() {
for (MultiImporterObserver observer : observers) {
observer.updated();
}
}
@Override
public boolean containsNinePatch() {
for (ImageInformation information : imageInformationMap.values()) {
if (information.isNinePatch()) {
return true;
}
}
return false;
}
@Override
public Format getFormat() {
return format;
}
@Override
public void setFormat(Format format) {
if (this.format == format) {
return;
}
this.format = containsNinePatch() ? Format.PNG : format;
notifyUpdated();
}
@Override
public void tearDown() {
observers.clear();
}
private static class ZipRefactoringTask extends RefactoringTask {
private File tempDir;
public ZipRefactoringTask(Project project, File tempDir) {
super(project);
this.tempDir = tempDir;
}
@Override
public boolean shouldStartInBackground() {
return false;
}
@Override
protected void onPostExecute() {
FileUtils.deleteQuietly(tempDir);
}
}
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/multi/MultiImporterObserver.java
================================================
package de.mprengemann.intellij.plugin.androidicons.controllers.multi;
public interface MultiImporterObserver {
void updated();
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/settings/ISettingsController.java
================================================
package de.mprengemann.intellij.plugin.androidicons.controllers.settings;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import de.mprengemann.intellij.plugin.androidicons.controllers.IController;
import de.mprengemann.intellij.plugin.androidicons.images.ResizeAlgorithm;
import de.mprengemann.intellij.plugin.androidicons.model.Destination;
import de.mprengemann.intellij.plugin.androidicons.model.Format;
import de.mprengemann.intellij.plugin.androidicons.model.ImageAsset;
import de.mprengemann.intellij.plugin.androidicons.model.Resolution;
import java.util.Set;
public interface ISettingsController extends IController<SettingsObserver> {
void saveResRootForProject(String fileUrl);
VirtualFile getResourceRoot();
String getResourceRootPath();
String getLastImageFolder();
void saveLastImageFolder(String fileUrl);
void setProject(Project project);
void saveResolutions(Set<Resolution> resolutions);
Set<Resolution> getResolutions(Set<Resolution> defaultResolutions);
void saveSourceResolution(Resolution sourceResolution);
Resolution getSourceResolution(Resolution defaultSourceResolution);
void saveAlgorithm(ResizeAlgorithm algorithm);
ResizeAlgorithm getAlgorithm(ResizeAlgorithm defaultAlgorithm);
void saveMethod(String method);
String getMethod(String defaultMethod);
void saveColor(String color);
String getColor();
void saveSize(String size);
String getSize();
void saveImageAsset(ImageAsset imageAsset);
ImageAsset getImageAsset();
void saveFormat(Format format);
Format getFormat(Format defaultFormat);
void saveDestination(Destination destination);
Destination getDestination(Destination defaultDestination);
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/settings/SettingsController.java
================================================
package de.mprengemann.intellij.plugin.androidicons.controllers.settings;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.io.StreamUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.util.Base64;
import de.mprengemann.intellij.plugin.androidicons.images.ResizeAlgorithm;
import de.mprengemann.intellij.plugin.androidicons.model.Destination;
import de.mprengemann.intellij.plugin.androidicons.model.Format;
import de.mprengemann.intellij.plugin.androidicons.model.ImageAsset;
import de.mprengemann.intellij.plugin.androidicons.model.Resolution;
import de.mprengemann.intellij.plugin.androidicons.util.TextUtils;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class SettingsController implements ISettingsController {
private static final String RES_ROOT = "resourcesRoot";
private static final String LAST_FOLDER_ROOT = "lastFolderRoot";
private static final String RESOLUTIONS = "resolutions";
private static final String SOURCE_RESOLUTION = "sourceResolution";
private static final String ALGORITHM = "algorithm";
private static final String METHOD = "method";
private static final String COLOR = "color";
private static final String SIZE = "size";
private static final String ASSET = "asset";
private static final String FORMAT = "format";
private static final String DESTINATION = "destination";
private Set<SettingsObserver> observerSet;
private Project project;
public SettingsController() {
observerSet = new HashSet<SettingsObserver>();
}
@Override
public void addObserver(SettingsObserver observer) {
observerSet.add(observer);
}
@Override
public void removeObserver(SettingsObserver observer) {
observerSet.remove(observer);
}
@Override
public void saveResRootForProject(String fileUrl) {
PropertiesComponent propertiesComponent = PropertiesComponent.getInstance(project);
propertiesComponent.setValue(RES_ROOT, fileUrl);
}
@Override
public VirtualFile getResourceRoot() {
String persistedFile = getResourceRootPath();
if (persistedFile != null) {
return VirtualFileManager.getInstance().findFileByUrl(persistedFile);
} else {
return null;
}
}
@Override
public String getResourceRootPath() {
PropertiesComponent propertiesComponent = PropertiesComponent.getInstance(project);
return propertiesComponent.getValue(RES_ROOT);
}
@Override
public String getLastImageFolder() {
PropertiesComponent propertiesComponent = PropertiesComponent.getInstance(project);
return propertiesComponent.getValue(LAST_FOLDER_ROOT);
}
@Override
public void saveLastImageFolder(String fileUrl) {
PropertiesComponent propertiesComponent = PropertiesComponent.getInstance(project);
propertiesComponent.setValue(LAST_FOLDER_ROOT, fileUrl);
}
@Override
public void setProject(Project project) {
this.project = project;
}
@Override
public void saveResolutions(Set<Resolution> resolutions) {
String[] tmp = new String[resolutions.size()];
int i=0;
for (Iterator<Resolution> iterator = resolutions.iterator(); iterator.hasNext(); i++) {
Resolution resolution = iterator.next();
tmp[i] = resolution.toString();
}
PropertiesComponent propertiesComponent = PropertiesComponent.getInstance(project);
propertiesComponent.setValues(RESOLUTIONS, tmp);
}
@Override
public Set<Resolution> getResolutions(Set<Resolution> defaultResolutions) {
PropertiesComponent propertiesComponent = PropertiesComponent.getInstance(project);
String[] values = propertiesComponent.getValues(RESOLUTIONS);
if (values == null) {
return defaultResolutions;
}
Set<Resolution> resolutions = new HashSet<Resolution>();
for (String value : values) {
if (TextUtils.isEmpty(value)) {
return defaultResolutions;
}
final Resolution resolution = Resolution.from(value);
if (resolution == null) {
return defaultResolutions;
}
resolutions.add(resolution);
}
return resolutions;
}
@Override
public void saveSourceResolution(Resolution sourceResolution) {
updateOrDelete(SOURCE_RESOLUTION, sourceResolution);
}
@Override
public Resolution getSourceResolution(Resolution defaultResolution) {
return Resolution.from(getOrDefault(SOURCE_RESOLUTION, defaultResolution.toString()));
}
@Override
public void saveAlgorithm(ResizeAlgorithm algorithm) {
updateOrDelete(ALGORITHM, algorithm);
}
@Override
public ResizeAlgorithm getAlgorithm(ResizeAlgorithm defaultAlgorithm) {
return ResizeAlgorithm.from(getOrDefault(ALGORITHM, defaultAlgorithm.toString()));
}
@Override
public void saveMethod(String method) {
updateOrDelete(METHOD, method);
}
@Override
public String getMethod(String defaultMethod) {
return getOrDefault(METHOD, defaultMethod);
}
@Override
public void saveColor(String color) {
updateOrDelete(COLOR, color);
}
@Override
public String getColor() {
return getOrDefault(COLOR, null);
}
@Override
public void saveSize(String size) {
updateOrDelete(SIZE, size);
}
@Override
public String getSize() {
return getOrDefault(SIZE, null);
}
@Override
public void saveImageAsset(ImageAsset imageAsset) {
PropertiesComponent propertiesComponent = PropertiesComponent.getInstance(project);
if (imageAsset == null) {
propertiesComponent.unsetValue(ASSET);
return;
}
String serializedImageAsset = null;
ByteArrayOutputStream bo = null;
ObjectOutputStream so = null;
try {
bo = new ByteArrayOutputStream();
so = new ObjectOutputStream(bo);
so.writeObject(imageAsset);
so.flush();
serializedImageAsset = Base64.encode(bo.toByteArray());
} catch (IOException e) {
e.printStackTrace();
} finally {
StreamUtil.closeStream(so);
StreamUtil.closeStream(bo);
}
if (serializedImageAsset == null) {
propertiesComponent.unsetValue(ASSET);
return;
}
propertiesComponent.setValue(ASSET, serializedImageAsset);
}
@Override
public ImageAsset getImageAsset() {
final String serializedImageAsset = getOrDefault(ASSET, null);
if (serializedImageAsset == null) {
return null;
}
ByteArrayInputStream bi = null;
ObjectInputStream si = null;
try {
byte b[] = Base64.decode(serializedImageAsset);
bi = new ByteArrayInputStream(b);
si = new ObjectInputStream(bi);
return (ImageAsset) si.readObject();
} catch (Exception e) {
e.printStackTrace();
} finally {
StreamUtil.closeStream(si);
StreamUtil.closeStream(bi);
}
return null;
}
@Override
public void saveFormat(Format format) {
updateOrDelete(FORMAT, format);
}
@Override
public Format getFormat(Format defaultFormat) {
return Format.valueOf(getOrDefault(FORMAT, defaultFormat.toString()));
}
@Override
public void saveDestination(Destination destination) {
updateOrDelete(DESTINATION, destination);
}
@Override
public Destination getDestination(Destination defaultDestination) {
return Destination.valueOf(getOrDefault(DESTINATION, defaultDestination.toString()));
}
private String getOrDefault(String key, String defaultValue) {
PropertiesComponent propertiesComponent = PropertiesComponent.getInstance(project);
if (!propertiesComponent.isValueSet(key)) {
return defaultValue;
}
return propertiesComponent.getValue(key);
}
private void updateOrDelete(String key, Object value) {
PropertiesComponent propertiesComponent = PropertiesComponent.getInstance(project);
if (value != null) {
propertiesComponent.setValue(key, value.toString());
} else {
propertiesComponent.unsetValue(key);
}
}
@Override
public void tearDown() {
project = null;
observerSet.clear();
observerSet = null;
}
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/settings/SettingsObserver.java
================================================
package de.mprengemann.intellij.plugin.androidicons.controllers.settings;
public interface SettingsObserver {
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/dialogs/AddItemBatchScaleDialog.form
================================================
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="de.mprengemann.intellij.plugin.androidicons.dialogs.AddItemBatchScaleDialog">
<grid id="27dc6" binding="uiContainer" layout-manager="GridLayoutManager" row-count="13" column-count="4" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<xy x="20" y="20" width="900" height="600"/>
</constraints>
<properties>
<maximumSize width="-1" height="-1"/>
<minimumSize width="900" height="600"/>
<preferredSize width="-1" height="-1"/>
</properties>
<border type="none"/>
<children>
<component id="bbccf" class="javax.swing.JLabel" binding="imageContainer">
<constraints>
<grid row="0" column="1" row-span="1" col-span="2" vsize-policy="6" hsize-policy="6" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<alignmentX value="0.5"/>
<horizontalAlignment value="0"/>
<horizontalTextPosition value="0"/>
<maximumSize width="200" height="200"/>
<minimumSize width="100" height="100"/>
<preferredSize width="100" height="100"/>
<text value=""/>
<verticalAlignment value="0"/>
<verticalTextPosition value="0"/>
</properties>
</component>
<component id="6285b" class="javax.swing.JLabel">
<constraints>
<grid row="1" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Source-File"/>
</properties>
</component>
<component id="bc123" class="javax.swing.JTextField" binding="sourceFile">
<constraints>
<grid row="1" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="1" indent="0" use-parent-layout="false">
<minimum-size width="600" height="-1"/>
<preferred-size width="600" height="-1"/>
</grid>
</constraints>
<properties>
<editable value="false"/>
<enabled value="false"/>
<horizontalAlignment value="2"/>
</properties>
</component>
<component id="269fb" class="javax.swing.JLabel">
<constraints>
<grid row="2" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Source-Resolution"/>
</properties>
</component>
<component id="f83f3" class="javax.swing.JLabel">
<constraints>
<grid row="5" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="9" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Target-Resolution"/>
</properties>
</component>
<component id="125bf" class="javax.swing.JComboBox" binding="sourceResolutionSpinner">
<constraints>
<grid row="2" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="2" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
</component>
<component id="cc3f7" class="javax.swing.JLabel">
<constraints>
<grid row="6" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Target-Name"/>
</properties>
</component>
<component id="56fa4" class="javax.swing.JLabel">
<constraints>
<grid row="7" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Target-Root"/>
</properties>
</component>
<component id="5a54a" class="de.mprengemann.intellij.plugin.androidicons.widgets.ExportNameField" binding="targetName">
<constraints>
<grid row="6" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
</component>
<component id="3d284" class="de.mprengemann.intellij.plugin.androidicons.widgets.FileBrowserField" binding="targetRoot" custom-create="true">
<constraints>
<grid row="7" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<editable value="false"/>
</properties>
</component>
<component id="ab59f" class="javax.swing.JFormattedTextField" binding="targetWidth" custom-create="true">
<constraints>
<grid row="3" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
</component>
<component id="f5711" class="javax.swing.JLabel">
<constraints>
<grid row="3" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Source-Width"/>
</properties>
</component>
<component id="aec63" class="javax.swing.JLabel">
<constraints>
<grid row="4" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Source-Height"/>
</properties>
</component>
<component id="3a845" class="javax.swing.JFormattedTextField" binding="targetHeight" custom-create="true">
<constraints>
<grid row="4" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
</component>
<component id="9fa77" class="javax.swing.JLabel">
<constraints>
<grid row="8" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Algorithm"/>
</properties>
</component>
<component id="169fe" class="javax.swing.JLabel">
<constraints>
<grid row="9" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Method"/>
</properties>
</component>
<component id="7f611" class="javax.swing.JComboBox" binding="algorithmSpinner">
<constraints>
<grid row="8" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="2" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
</component>
<component id="f56cf" class="javax.swing.JComboBox" binding="methodSpinner">
<constraints>
<grid row="9" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="2" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
</component>
<grid id="9985e" layout-manager="GridLayoutManager" row-count="4" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<grid row="5" column="2" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<border type="none"/>
<children>
<component id="29f05" class="javax.swing.JCheckBox" binding="MDPICheckBox" default-binding="true">
<constraints>
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false">
<preferred-size width="541" height="20"/>
</grid>
</constraints>
<properties>
<text value="MDPI"/>
</properties>
</component>
<component id="41eaf" class="javax.swing.JCheckBox" binding="HDPICheckBox" default-binding="true">
<constraints>
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false">
<preferred-size width="541" height="20"/>
</grid>
</constraints>
<properties>
<text value="HDPI"/>
</properties>
</component>
<component id="c65f2" class="javax.swing.JCheckBox" binding="XHDPICheckBox" default-binding="true">
<constraints>
<grid row="3" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false">
<preferred-size width="541" height="20"/>
</grid>
</constraints>
<properties>
<text value="XHDPI"/>
</properties>
</component>
<component id="a482f" class="javax.swing.JCheckBox" binding="XXHDPICheckBox" default-binding="true">
<constraints>
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false">
<preferred-size width="541" height="20"/>
</grid>
</constraints>
<properties>
<text value="XXHDPI"/>
</properties>
</component>
<component id="7c7f8" class="javax.swing.JCheckBox" binding="XXXHDPICheckBox" default-binding="true">
<constraints>
<grid row="1" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false">
<preferred-size width="541" height="20"/>
</grid>
</constraints>
<properties>
<text value="XXXHDPI"/>
</properties>
</component>
<component id="6b77d" class="javax.swing.JCheckBox" binding="TVDPICheckBox">
<constraints>
<grid row="2" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false">
<preferred-size width="541" height="20"/>
</grid>
</constraints>
<properties>
<text value="TVDPI"/>
</properties>
</component>
<component id="d940e" class="javax.swing.JCheckBox" binding="LDPICheckBox" default-binding="true">
<constraints>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false">
<preferred-size width="541" height="20"/>
</grid>
</constraints>
<properties>
<text value="LDPI"/>
</properties>
</component>
</children>
</grid>
<component id="1c4" class="javax.swing.JLabel">
<constraints>
<grid row="10" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Format"/>
</properties>
</component>
<component id="d091f" class="javax.swing.JComboBox" binding="formatSpinner">
<constraints>
<grid row="10" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="2" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<model/>
</properties>
</component>
<component id="b3b0" class="javax.swing.JLabel">
<constraints>
<grid row="11" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Destination"/>
</properties>
</component>
<component id="c5c0c" class="javax.swing.JComboBox" binding="destinationSpinner">
<constraints>
<grid row="11" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="2" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<model/>
</properties>
</component>
</children>
</grid>
</form>
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/dialogs/AddItemBatchScaleDialog.java
================================================
package de.mprengemann.intellij.plugin.androidicons.dialogs;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.Consumer;
import de.mprengemann.intellij.plugin.androidicons.IconApplication;
import de.mprengemann.intellij.plugin.androidicons.controllers.batchscale.BatchScaleImporterController;
import de.mprengemann.intellij.plugin.androidicons.controllers.batchscale.additem.AddItemBatchScaleDialogObserver;
import de.mprengemann.intellij.plugin.androidicons.controllers.batchscale.additem.AddItemBatchScaleImporterController;
import de.mprengemann.intellij.plugin.androidicons.controllers.batchscale.additem.IAddItemBatchScaleImporterController;
import de.mprengemann.intellij.plugin.androidicons.controllers.defaults.IDefaultsController;
import de.mprengemann.intellij.plugin.androidicons.controllers.settings.ISettingsController;
import de.mprengemann.intellij.plugin.androidicons.images.ResizeAlgorithm;
import de.mprengemann.intellij.plugin.androidicons.listeners.SimpleKeyListener;
import de.mprengemann.intellij.plugin.androidicons.model.Destination;
import de.mprengemann.intellij.plugin.androidicons.model.Format;
import de.mprengemann.intellij.plugin.androidicons.model.ImageInformation;
import de.mprengemann.intellij.plugin.androidicons.model.Resolution;
import de.mprengemann.intellij.plugin.androidicons.util.AndroidFacetUtils;
import de.mprengemann.intellij.plugin.androidicons.util.ImageUtils;
import de.mprengemann.intellij.plugin.androidicons.widgets.ExportNameField;
import de.mprengemann.intellij.plugin.androidicons.widgets.FileBrowserField;
import de.mprengemann.intellij.plugin.androidicons.widgets.ResolutionButtonModel;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.text.NumberFormatter;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.text.NumberFormat;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
public class AddItemBatchScaleDialog extends DialogWrapper implements AddItemBatchScaleDialogObserver {
private final Project project;
private final Module module;
private final BatchScaleImporterController batchScaleController;
private JPanel uiContainer;
private JLabel imageContainer;
private JTextField sourceFile;
private JCheckBox LDPICheckBox;
private JCheckBox MDPICheckBox;
private JCheckBox HDPICheckBox;
private JCheckBox XHDPICheckBox;
private JCheckBox XXHDPICheckBox;
private JCheckBox XXXHDPICheckBox;
private JCheckBox TVDPICheckBox;
private JComboBox sourceResolutionSpinner;
private JFormattedTextField targetWidth;
private JFormattedTextField targetHeight;
private ExportNameField targetName;
private FileBrowserField targetRoot;
private JComboBox algorithmSpinner;
private JComboBox methodSpinner;
private JComboBox formatSpinner;
private JComboBox destinationSpinner;
private IAddItemBatchScaleImporterController controller;
private final ActionListener sourceResolutionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
final JComboBox source = (JComboBox) actionEvent.getSource();
final Resolution selectedItem = (Resolution) source.getSelectedItem();
controller.setSourceResolution(selectedItem);
}
};
private final ActionListener algorithmListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
final JComboBox source = (JComboBox) actionEvent.getSource();
final ResizeAlgorithm selectedItem = (ResizeAlgorithm) source.getSelectedItem();
controller.setAlgorithm(selectedItem);
}
};
private final ActionListener methodListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
final JComboBox source = (JComboBox) actionEvent.getSource();
final String selectedItem = (String) source.getSelectedItem();
controller.setMethod(selectedItem);
}
};
private final ActionListener resolutionActionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
final JCheckBox source = (JCheckBox) actionEvent.getSource();
final Resolution resolution = ((ResolutionButtonModel) source.getModel()).getResolution();
if (source.isSelected()) {
controller.addTargetResolution(resolution);
} else {
controller.removeTargetResolution(resolution);
}
}
};
private final PropertyChangeListener targetSizeListener = new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent propertyChangeEvent) {
final Object source = propertyChangeEvent.getSource();
if (source == targetHeight) {
controller.setTargetHeight(((Number) targetHeight.getValue()).intValue());
} else if (source == targetWidth) {
controller.setTargetWidth(((Number) targetWidth.getValue()).intValue());
}
}
};
private final ActionListener formatListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
final JComboBox source = (JComboBox) e.getSource();
final Format selectedItem = (Format) source.getSelectedItem();
controller.setFormat(selectedItem);
}
};
private final ActionListener destinationListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
final JComboBox source = (JComboBox) e.getSource();
final Destination selectedItem = (Destination) source.getSelectedItem();
controller.setDestination(selectedItem);
}
};
private ISettingsController settingsController;
private IDefaultsController defaultsController;
public AddItemBatchScaleDialog(final Project project,
final Module module,
final BatchScaleImporterController batchScaleImporterController,
final VirtualFile file) {
super(project);
this.project = project;
this.module = module;
this.batchScaleController = batchScaleImporterController;
if (file == null) {
close(0);
return;
}
String path = file.getCanonicalPath();
if (path == null) {
close(0);
return;
}
final File realFile = new File(path);
initRequiredControllers();
initController(realFile);
initTargetRoot();
initInternal();
}
public AddItemBatchScaleDialog(final Project project,
final Module module,
final BatchScaleImporterController batchScaleImporterController,
final Resolution sourceResolution,
final List<ImageInformation> information) {
super(project);
this.project = project;
this.module = module;
this.batchScaleController = batchScaleImporterController;
initRequiredControllers();
initController(sourceResolution, information);
initTargetRoot();
initInternal();
}
private void initInternal() {
initCheckBoxes();
initExportName();
initExportRoot();
init();
pack();
controller.addObserver(this);
}
private void initTargetRoot() {
targetRoot.initWithResourceRoot(project, module, settingsController);
targetRoot.setSelectionListener(new Consumer<File>() {
@Override
public void consume(File file) {
controller.setTargetRoot(file.getAbsolutePath());
}
});
}
private void initCheckBoxes() {
LDPICheckBox.setModel(new ResolutionButtonModel(Resolution.LDPI));
MDPICheckBox.setModel(new ResolutionButtonModel(Resolution.MDPI));
HDPICheckBox.setModel(new ResolutionButtonModel(Resolution.HDPI));
XHDPICheckBox.setModel(new ResolutionButtonModel(Resolution.XHDPI));
XXHDPICheckBox.setModel(new ResolutionButtonModel(Resolution.XXHDPI));
XXXHDPICheckBox.setModel(new ResolutionButtonModel(Resolution.XXXHDPI));
TVDPICheckBox.setModel(new ResolutionButtonModel(Resolution.TVDPI));
}
private void initExportRoot() {
targetRoot.setText(controller.getExportPath());
targetRoot.addKeyListener(new SimpleKeyListener() {
@Override
public void keyReleased(KeyEvent keyEvent) {
controller.setTargetRoot(((JTextField) keyEvent.getSource()).getText());
}
});
}
private void initExportName() {
targetName.setText(controller.getExportName());
targetName.addPropertyChangeListener("value", new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent propertyChangeEvent) {
controller.setExportName((String) targetName.getValue());
}
});
}
private void initController(File file) {
final VirtualFile root = settingsController.getResourceRoot();
String exportRoot = "";
if (root != null) {
exportRoot = root.getCanonicalPath();
} else {
exportRoot = AndroidFacetUtils.getResourcesRoot(project, module);
}
controller = new AddItemBatchScaleImporterController(defaultsController, exportRoot, file);
}
private void initRequiredControllers() {
final IconApplication container = ApplicationManager.getApplication().getComponent(IconApplication.class);
settingsController = container.getControllerFactory().getSettingsController();
defaultsController = container.getControllerFactory().getDefaultsController();
}
private void initController(Resolution sourceResolution, List<ImageInformation> information) {
controller = new AddItemBatchScaleImporterController(sourceResolution, information);
}
@Nullable
@Override
protected JComponent createCenterPanel() {
return uiContainer;
}
@Override
protected void doOKAction() {
final List<ImageInformation> imageInformation = controller.getImageInformation(project);
batchScaleController.addImage(controller.getSourceResolution(), imageInformation);
defaultsController.setAlgorithm(controller.getAlgorithm());
defaultsController.setMethod(controller.getMethod());
defaultsController.setSourceResolution(controller.getSourceResolution());
defaultsController.setResolutions(controller.getTargetResolutions());
if (!controller.isNinePatch()) {
defaultsController.setFormat(controller.getFormat());
}
defaultsController.setDestination(controller.getDestination());
super.doOKAction();
}
@Override
public void updated() {
updateSource();
updateSourceResolution();
updateTargetSize();
updateTargetResolutions();
updateAlgorithms();
updateAlgorithmMethod();
updateFormat();
updateDestination();
updateImage(controller.getImageFile());
}
private void updateAlgorithms() {
algorithmSpinner.removeActionListener(algorithmListener);
algorithmSpinner.removeAllItems();
for (ResizeAlgorithm algorithm : ResizeAlgorithm.values()) {
algorithmSpinner.addItem(algorithm);
}
algorithmSpinner.setSelectedItem(controller.getAlgorithm());
algorithmSpinner.addActionListener(algorithmListener);
}
private void updateAlgorithmMethod() {
methodSpinner.removeActionListener(methodListener);
methodSpinner.removeAllItems();
final List<String> methods = controller.getMethods();
for (String method : methods) {
methodSpinner.addItem(method);
}
methodSpinner.setSelectedItem(controller.getMethod());
methodSpinner.setEnabled(methods.size() > 1);
methodSpinner.addActionListener(methodListener);
}
private void updateFormat() {
formatSpinner.removeActionListener(formatListener);
formatSpinner.removeAllItems();
for (Format format : Format.nonVectorValues()) {
formatSpinner.addItem(format);
}
formatSpinner.setSelectedItem(controller.getFormat());
formatSpinner.setEnabled(!controller.isNinePatch());
formatSpinner.addActionListener(formatListener);
}
private void updateDestination() {
destinationSpinner.removeActionListener(destinationListener);
destinationSpinner.removeAllItems();
for (Destination format : Destination.values()) {
destinationSpinner.addItem(format);
}
destinationSpinner.setSelectedItem(controller.getDestination());
destinationSpinner.addActionListener(destinationListener);
}
private void updateTargetSize() {
targetHeight.removePropertyChangeListener("value", targetSizeListener);
targetWidth.removePropertyChangeListener("value", targetSizeListener);
targetHeight.setValue(controller.getTargetHeight());
targetWidth.setValue(controller.getTargetWidth());
targetHeight.addPropertyChangeListener("value", targetSizeListener);
targetWidth.addPropertyChangeListener("value", targetSizeListener);
}
private void updateSourceResolution() {
sourceResolutionSpinner.removeActionListener(sourceResolutionListener);
sourceResolutionSpinner.removeAllItems();
for (Resolution resolution : Resolution.nonVectorValues()) {
sourceResolutionSpinner.addItem(resolution);
}
sourceResolutionSpinner.setSelectedItem(controller.getSourceResolution());
sourceResolutionSpinner.addActionListener(sourceResolutionListener);
}
private void updateSource() {
sourceFile.setText(controller.getImageFile().getAbsolutePath());
sourceFile.setEnabled(false);
}
private void updateTargetResolutions() {
final Set<Resolution> resolutions = controller.getTargetResolutions();
for (JCheckBox checkBox : Arrays.asList(LDPICheckBox,
MDPICheckBox,
HDPICheckBox,
XHDPICheckBox,
XXHDPICheckBox,
XXXHDPICheckBox,
TVDPICheckBox)) {
checkBox.removeActionListener(resolutionActionListener);
final Resolution resolution = ((ResolutionButtonModel) checkBox.getModel()).getResolution();
checkBox.setSelected(resolutions.contains(resolution));
final int[] sizes = controller.getScaledSize(resolution);
checkBox.setText(String.format("%s (%d px x %d px)", resolution, sizes[0], sizes[1]));
checkBox.addActionListener(resolutionActionListener);
}
}
private void updateImage(final File file) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
if (imageContainer == null) {
return;
}
if (file == null) {
imageContainer.setIcon(null);
return;
}
ImageUtils.updateImage(imageContainer, file, controller.getFormat());
}
});
}
private void createUIComponents() {
NumberFormat format = NumberFormat.getIntegerInstance();
NumberFormatter numberFormatter = new NumberFormatter(format);
numberFormatter.setValueClass(Integer.class);
numberFormatter.setAllowsInvalid(false);
numberFormatter.setMinimum(1);
numberFormatter.setCommitsOnValidEdit(true);
targetHeight = new JFormattedTextField(numberFormatter);
targetWidth = new JFormattedTextField(numberFormatter);
targetRoot = new FileBrowserField(FileBrowserField.RESOURCE_DIR_CHOOSER);
}
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/dialogs/AndroidBatchScaleImporter.form
================================================
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="de.mprengemann.intellij.plugin.androidicons.dialogs.AndroidBatchScaleImporter">
<grid id="27dc6" binding="uiContainer" layout-manager="GridLayoutManager" row-count="13" column-count="4" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<xy x="20" y="20" width="1200" height="450"/>
</constraints>
<properties>
<maximumSize width="-1" height="-1"/>
<minimumSize width="1200" height="450"/>
<preferredSize width="-1" height="-1"/>
</properties>
<border type="none"/>
<children>
<scrollpane id="92eed">
<constraints>
<grid row="0" column="0" row-span="13" col-span="1" vsize-policy="7" hsize-policy="7" anchor="0" fill="3" indent="0" use-parent-layout="false">
<preferred-size width="800" height="418"/>
</grid>
</constraints>
<properties/>
<border type="none"/>
<children>
<component id="811d" class="javax.swing.JTable" binding="table" custom-create="true">
<constraints/>
<properties>
<autoCreateRowSorter value="false"/>
<columnSelectionAllowed value="true"/>
<fillsViewportHeight value="true"/>
</properties>
</component>
</children>
</scrollpane>
<grid id="801a9" layout-manager="GridLayoutManager" row-count="3" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<grid row="1" column="1" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="1" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<border type="none"/>
<children>
<component id="59593" class="javax.swing.JButton" binding="deleteButton" custom-create="true">
<constraints>
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="1" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value=""/>
</properties>
</component>
<component id="a7e64" class="javax.swing.JButton" binding="addButton" custom-create="true">
<constraints>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="2" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value=""/>
</properties>
</component>
<component id="5e9ef" class="javax.swing.JButton" binding="editButton" custom-create="true">
<constraints>
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="0" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value=""/>
</properties>
</component>
</children>
</grid>
<component id="bbccf" class="javax.swing.JLabel" binding="imageContainer">
<constraints>
<grid row="1" column="2" row-span="11" col-span="1" vsize-policy="6" hsize-policy="6" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<alignmentX value="0.5"/>
<horizontalAlignment value="0"/>
<horizontalTextPosition value="0"/>
<maximumSize width="200" height="200"/>
<minimumSize width="100" height="100"/>
<preferredSize width="100" height="100"/>
<text value=""/>
</properties>
</component>
</children>
</grid>
</form>
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/dialogs/AndroidBatchScaleImporter.java
================================================
/*
* Copyright 2015 Marc Prengemann
*
* 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 de.mprengemann.intellij.plugin.androidicons.dialogs;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.PathMacroManager;
import com.intellij.openapi.fileChooser.FileChooser;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.fileChooser.ex.FileDrop;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.Task;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.util.IconLoader;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileVisitor;
import com.intellij.ui.table.JBTable;
import com.intellij.util.Consumer;
import com.intellij.util.ui.UIUtil;
import de.mprengemann.intellij.plugin.androidicons.IconApplication;
import de.mprengemann.intellij.plugin.androidicons.controllers.batchscale.BatchScaleImporterController;
import de.mprengemann.intellij.plugin.androidicons.controllers.batchscale.BatchScaleImporterObserver;
import de.mprengemann.intellij.plugin.androidicons.controllers.batchscale.IBatchScaleImporterController;
import de.mprengemann.intellij.plugin.androidicons.controllers.batchscale.additem.AddItemBatchScaleImporterController;
import de.mprengemann.intellij.plugin.androidicons.controllers.batchscale.additem.IAddItemBatchScaleImporterController;
import de.mprengemann.intellij.plugin.androidicons.controllers.defaults.IDefaultsController;
import de.mprengemann.intellij.plugin.androidicons.controllers.settings.ISettingsController;
import de.mprengemann.intellij.plugin.androidicons.model.ImageInformation;
import de.mprengemann.intellij.plugin.androidicons.util.AndroidFacetUtils;
import de.mprengemann.intellij.plugin.androidicons.util.ImageUtils;
import de.mprengemann.intellij.plugin.androidicons.util.MathUtils;
import de.mprengemann.intellij.plugin.androidicons.widgets.FileBrowserField;
import org.apache.commons.io.FilenameUtils;
import org.intellij.images.fileTypes.ImageFileTypeManager;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
public class AndroidBatchScaleImporter extends DialogWrapper implements BatchScaleImporterObserver {
private final Project project;
private final Module module;
private final IconApplication container;
private JPanel uiContainer;
private JTable table;
private JLabel imageContainer;
private JButton addButton;
private JButton deleteButton;
private JButton editButton;
private ImageTableModel tableModel;
private final BatchScaleImporterController controller;
private final Consumer<List<VirtualFile>> fileChooserConsumer = new Consumer<List<VirtualFile>>() {
@Override
public void consume(final List<VirtualFile> virtualFiles) {
if (virtualFiles == null ||
virtualFiles.isEmpty()) {
return;
}
final VirtualFile file = virtualFiles.get(0);
if (file == null) {
return;
}
container.getControllerFactory().getSettingsController().saveLastImageFolder(file.getCanonicalPath());
if (virtualFiles.size() == 1 && !file.isDirectory()) {
addSingleFile(file);
} else {
new Task.Modal(project, "Adding Files...", true) {
@Override
public void run(@NotNull ProgressIndicator progressIndicator) {
progressIndicator.setIndeterminate(true);
try {
addMultipleFiles(virtualFiles, progressIndicator);
} catch (ProcessCanceledException ignored) {
}
}
}.queue();
}
}
};
public AndroidBatchScaleImporter(final Project project, final Module module) {
super(project);
this.project = project;
this.container = ApplicationManager.getApplication().getComponent(IconApplication.class);
this.controller = new BatchScaleImporterController();
this.controller.addObserver(this);
this.module = module;
setTitle("Batch Drawable Importer");
initButtons(project);
initDragDrop();
initTable();
init();
pack();
}
private void initButtons(final Project project) {
addButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
FileChooser.chooseFiles(FileBrowserField.IMAGE_FILES_FOLDER_CHOOSER, project, getInitialFile(), fileChooserConsumer);
}
});
deleteButton.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
controller.removeImages(table.getSelectedRows());
}
});
editButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
controller.editImages(project, module, table.getSelectedRows());
}
});
}
private void initDragDrop() {
new FileDrop(table, new FileDrop.Target() {
@Override
public FileChooserDescriptor getDescriptor() {
return FileBrowserField.IMAGE_FILES_FOLDER_CHOOSER;
}
@Override
public boolean isHiddenShown() {
return false;
}
@Override
public void dropFiles(final List<VirtualFile> virtualFiles) {
fileChooserConsumer.consume(virtualFiles);
}
});
}
private void addMultipleFiles(List<VirtualFile> virtualFiles, final ProgressIndicator progressIndicator) throws ProcessCanceledException {
for (final VirtualFile file : virtualFiles) {
progressIndicator.checkCanceled();
if (file.isDirectory()) {
progressIndicator.setText2(file.getCanonicalPath());
VfsUtilCore.visitChildrenRecursively(file, new VirtualFileVisitor() {
@Override
public boolean visitFile(@NotNull VirtualFile child) throws ProcessCanceledException {
if (file.equals(child)) {
return true;
}
progressIndicator.checkCanceled();
addMultipleFiles(Arrays.asList(child), progressIndicator);
return true;
}
});
continue;
}
addSingleFileImmediately(file);
}
}
private void addSingleFileImmediately(VirtualFile file) {
if (!file.getFileType().equals(ImageFileTypeManager.getInstance().getImageFileType())) {
return;
}
// Hack
String path = file.getCanonicalPath();
if (path == null) {
return;
}
final File realFile = new File(path);
final ISettingsController settingsController = container.getControllerFactory().getSettingsController();
final IDefaultsController defaultsController = container.getControllerFactory().getDefaultsController();
final VirtualFile root = settingsController.getResourceRoot();
String exportRoot = "";
if (root != null) {
exportRoot = root.getCanonicalPath();
} else {
exportRoot = AndroidFacetUtils.getResourcesRoot(project, module);
}
final IAddItemBatchScaleImporterController addItemController =
new AddItemBatchScaleImporterController(defaultsController, exportRoot, realFile);
controller.addImage(addItemController.getSourceResolution(), addItemController.getImageInformation(project));
addItemController.tearDown();
}
private void addSingleFile(VirtualFile file) {
container.getControllerFactory()
.getSettingsController()
.saveLastImageFolder(file.getCanonicalPath());
AddItemBatchScaleDialog addItemBatchScaleDialog =
new AddItemBatchScaleDialog(project, module, controller, file);
addItemBatchScaleDialog.show();
}
private void initTable() {
tableModel = new ImageTableModel(controller);
table.setModel(tableModel);
initRenderers();
initRowSelection();
initColumnSizes();
}
private void initRenderers() {
final DefaultTableCellRenderer fileCellRenderer = new DefaultTableCellRenderer() {
@Override
protected void setValue(Object o) {
File file = (File) o;
if (file == null) {
setText("");
return;
}
if (file.isDirectory()) {
setText(file.getAbsolutePath());
} else {
setText(FilenameUtils.removeExtension(file.getName()));
}
}
};
fileCellRenderer.setHorizontalTextPosition(DefaultTableCellRenderer.TRAILING);
table.setDefaultRenderer(File.class, fileCellRenderer);
table.setDefaultRenderer(ArrayList.class, new DefaultTableCellRenderer() {
@Override
protected void setValue(Object o) {
if (o == null) {
setText("");
} else {
ArrayList list = (ArrayList) o;
Collections.sort(list);
StringBuilder buffer = new StringBuilder();
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Object val = iterator.next();
buffer.append(val.toString());
if (iterator.hasNext()) {
buffer.append(", ");
}
}
setText(buffer.toString());
}
}
});
}
private void initRowSelection() {
table.setSelectionBackground(Color.decode("0xFEFBDE")); // MPArnold 29/1/2020
table.setSelectionForeground(Color.decode("0x6F6F6F")); // MPArnold 29/1/2020
table.getColumnModel().setColumnSelectionAllowed(false);
table.getSelectionModel().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
if (e.getValueIsAdjusting()) {
return;
}
int selectedRow = table.getSelectedRow();
if (table.getSelectedRowCount() == 1) {
updateImage(controller.getImage(selectedRow));
} else {
updateImage(null);
}
}
});
}
private void initColumnSizes() {
table.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent componentEvent) {
super.componentResized(componentEvent);
Dimension tableSize = table.getSize();
final int[] columnSizes = new int[]{ 20, 20, 20, 40 };
for (int i = 0; i < table.getColumnCount(); i++) {
TableColumn column = table.getColumnModel().getColumn(i);
column.setPreferredWidth((int) (tableSize.width * (columnSizes[i] / 100f)));
}
}
});
}
private void updateImage(ImageInformation item) {
if (imageContainer == null) {
return;
}
if (item == null) {
imageContainer.setIcon(null);
return;
}
ImageUtils.updateImage(imageContainer, item.getImageFile(), item.getFormat());
}
protected VirtualFile getInitialFile() {
String directoryName = container.getControllerFactory().getSettingsController().getLastImageFolder();
VirtualFile path;
String expandPath = expandPath(directoryName);
if (expandPath == null) {
return null;
}
for (path = LocalFileSystem.getInstance().findFileByPath(expandPath);
path == null && directoryName.length() > 0;
path = LocalFileSystem.getInstance().findFileByPath(directoryName)) {
int pos = directoryName.lastIndexOf(47);
if (pos <= 0) {
break;
}
directoryName = directoryName.substring(0, pos);
}
return path;
}
private String expandPath(String dirName) {
if (project != null) {
dirName = PathMacroManager.getInstance(project).expandPath(dirName);
}
if (module != null) {
dirName = PathMacroManager.getInstance(module).expandPath(dirName);
}
return dirName;
}
@Nullable
@Override
protected JComponent createCenterPanel() {
return uiContainer;
}
private void createUIComponents() {
table = new JBTable() {
@NotNull
@Override
public Component prepareRenderer(@NotNull TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
c.setEnabled(isCellEditable(row, column));
return c;
}
};
addButton = new JButton(getIcon("ic_action_add"));
editButton = new JButton(getIcon("ic_action_edit"));
deleteButton = new JButton(getIcon("ic_action_trash"));
}
@NotNull
private Icon getIcon(String name) {
boolean isDarkTheme = UIUtil.isUnderDarcula();
final String asset = String.format("/icons/%s%s.png", name, isDarkTheme ? "_dark" : "");
return IconLoader.getIcon(asset);
}
@Override
protected void doOKAction() {
controller.getExportTask(project).queue();
super.doOKAction();
}
/** Implements {@link de.mprengemann.intellij.plugin.androidicons.controllers.batchscale.BatchScaleImporterObserver */
@Override public void updated() {
UIUtil.invokeLaterIfNeeded(new Runnable() {
@Override
public void run() {
updateTable();
}
});
}
private void updateTable() {
if (table == null ||
tableModel == null) {
return;
}
int selectedRow = table.getSelectedRow();
tableModel.fireTableDataChanged();
if (table.getRowCount() > 0) {
selectedRow = MathUtils.clamp(selectedRow, 0, table.getRowCount()-1); // MPArnold 31/1/2020
table.setRowSelectionInterval(selectedRow, selectedRow);
} else {
imageContainer.setDisabledIcon(null);
}
}
private static class ImageTableModel extends AbstractTableModel {
private static final List<String> columnNames = Arrays.asList("Source-File",
"Target-Resolutions",
"Target-Name",
"Target-Root");
private IBatchScaleImporterController controller;
public ImageTableModel(IBatchScaleImporterController controller) {
this.controller = controller;
}
@Override
public int getRowCount() {
return controller.getImageCount();
}
@Override
public int getColumnCount() {
return columnNames.size();
}
@Override
public String getColumnName(int col) {
return columnNames.get(col);
}
@Override
public Object getValueAt(int row, int col) {
ImageInformation information = controller.getImage(row);
switch (col) {
case 0:
return information.getImageFile();
case 1:
return controller.getTargetResolutions(information);
case 2:
return information.getExportName();
case 3:
return information.getExportPath();
}
return information;
}
@Override
public Class<?> getColumnClass(int col) {
return getValueAt(0, col).getClass();
}
}
}
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/dialogs/AndroidMultiDrawableImporter.form
================================================
<?xml version="1.0" encoding="UTF-8"?>
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="de.mprengemann.intellij.plugin.androidicons.dialogs.AndroidMultiDrawableImporter">
<grid id="27dc6" binding="uiContainer" layout-manager="GridLayoutManager" row-count="12" column-count="6" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<xy x="20" y="20" width="650" height="409"/>
</constraints>
<properties>
<minimumSize width="650" height="350"/>
<preferredSize width="-1" height="-1"/>
</properties>
<border type="none"/>
<children>
<component id="46112" class="javax.swing.JLabel">
<constraints>
<grid row="1" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="LDPI Asset:"/>
</properties>
</component>
<component id="5ee16" class="javax.swing.JLabel">
<constraints>
<grid row="9" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Resource Name:"/>
</properties>
</component>
<component id="d77d9" class="de.mprengemann.intellij.plugin.androidicons.widgets.ExportNameField" binding="resExportName">
<constraints>
<grid row="9" column="2" row-span="1" col-span="3" vsize-policy="0" hsize-policy="4" anchor="8" fill="1" indent="0" use-parent-layout="false">
<preferred-size width="150" height="-1"/>
</grid>
</constraints>
<properties/>
</component>
<component id="3a3c4" class="javax.swing.JLabel">
<constraints>
<grid row="10" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Resources root:"/>
</properties>
</component>
<component id="659d3" class="de.mprengemann.intellij.plugin.androidicons.widgets.FileBrowserField" binding="resRoot" custom-create="true">
<constraints>
<grid row="10" column="2" row-span="1" col-span="3" vsize-policy="0" hsize-policy="0" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
</component>
<component id="283f6" class="javax.swing.JLabel">
<constraints>
<grid row="2" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="MDPI Asset:"/>
</properties>
</component>
<component id="bb437" class="javax.swing.JLabel">
<constraints>
<grid row="3" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="HDPI Asset:"/>
</properties>
</component>
<component id="ab4d4" class="javax.swing.JLabel">
<constraints>
<grid row="4" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="XHDPI Asset:"/>
</properties>
</component>
<component id="ed1d6" class="javax.swing.JLabel">
<constraints>
<grid row="5" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="XXHDPI Asset:"/>
</properties>
</component>
<component id="c2714" class="javax.swing.JLabel" binding="imageContainer">
<constraints>
<grid row="1" column="4" row-span="7" col-span="1" vsize-policy="0" hsize-policy="4" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<alignmentX value="0.5"/>
<horizontalAlignment value="0"/>
<horizontalTextPosition value="0"/>
<maximumSize width="200" height="200"/>
<minimumSize width="100" height="100"/>
<preferredSize width="100" height="100"/>
<text value=""/>
</properties>
</component>
<component id="cf911" class="de.mprengemann.intellij.plugin.androidicons.widgets.FileBrowserField" binding="ldpiFile" custom-create="true">
<constraints>
<grid row="1" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="4" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
</component>
<component id="7022d" class="de.mprengemann.intellij.plugin.androidicons.widgets.FileBrowserField" binding="mdpiFile" custom-create="true">
<constraints>
<grid row="2" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="4" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
</component>
<component id="97ede" class="de.mprengemann.intellij.plugin.androidicons.widgets.FileBrowserField" binding="hdpiFile" custom-create="true">
<constraints>
<grid row="3" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="4" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
</component>
<component id="5d1e3" class="de.mprengemann.intellij.plugin.androidicons.widgets.FileBrowserField" binding="xhdpiFile" custom-create="true">
<constraints>
<grid row="4" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="4" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
</component>
<component id="cb187" class="de.mprengemann.intellij.plugin.androidicons.widgets.FileBrowserField" binding="xxhdpiFile" custom-create="true">
<constraints>
<grid row="5" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="4" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
</component>
<component id="fbc8b" class="javax.swing.JLabel">
<constraints>
<grid row="6" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="XXXHDPI Asset:"/>
</properties>
</component>
<component id="72b40" class="de.mprengemann.intellij.plugin.androidicons.widgets.FileBrowserField" binding="xxxhdpiFile" custom-create="true">
<constraints>
<grid row="6" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="4" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
</component>
<component id="85a8c" class="javax.swing.JLabel">
<constraints>
<grid row="7" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="TVDPI Asset:"/>
</properties>
</component>
<component id="47129" class="de.mprengemann.intellij.plugin.androidicons.widgets.FileBrowserField" binding="tvdpiFile" custom-create="true">
<constraints>
<grid row="7" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="4" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
</component>
<component id="42cbc" class="javax.swing.JLabel">
<constraints>
<grid row="8" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="Format"/>
</properties>
</component>
<component id="1886b" class="javax.swing.JComboBox" binding="formatSpinner">
<constraints>
<grid row="8" column="2" row-span="1" col-span="3" vsize-policy="0" hsize-policy="2" anchor="8" fill="1" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<model/>
</properties>
</component>
</children>
</grid>
</form>
================================================
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/dialogs/AndroidMultiDrawableImporter.java
================================================
/*
* Copyright 2015 Marc Prengemann
*
* 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 de.mprengemann.intellij.plugin.androidicons.dialogs;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.PathMacroManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileChooser.FileChooser;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.Task;
import com.intellij.openapi.project.DumbAwareRunnable;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.ui.ValidationInfo;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.Consumer;
import com.intellij.util.io.ZipUtil;
import com.intellij.util.ui.UIUtil;
import de.mprengemann.intellij.plugin.androidicons.IconApplication;
import de.mprengemann.intellij.plugin.androidicons.controllers.multi.IMultiImporterController;
import de.mprengemann.intellij.plugin.androidicons.controllers.multi.MultiImporterController;
import de.mprengemann.intellij.plugin.androidicons.controllers.multi.MultiImporterObserver;
import de.mprengemann.intellij.plugin.androidicons.controllers.settings.ISettingsController;
import de.mprengemann.intellij.plugin.androidicons.listeners.SimpleMouseListener;
import de.mprengemann.intellij.plugin.androidicons.model.Format;
import de.mprengemann.intellij.plugin.androidicons.model.ImageInformation;
import de.mprengemann.intellij.plugin.androidicons.model.Resolution;
import de.mprengemann.intellij.plugin.androidicons.util.ImageUtils;
import de.mprengemann.intellij.plugin.androidicons.widgets.ExportNameField;
import de.mprengemann.intellij.plugin.androidicons.widgets.FileBrowserField;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.filefilter.TrueFileFilter;
import org.apache.commons.lang.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.activation.MimetypesFileTypeMap;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class AndroidMultiDrawableImporter extends DialogWrapper implements MultiImporterObserver {
private final FileChooserDescriptor archiveDescriptor = new FileChooserDescriptor(true,
false,
true,
true,
false,
false) {
@Override
public boolean isFileVisible(VirtualFile file, boolean showHiddenFiles) {
return file.isDirectory() || isZip(file.getName());
}
@Override
public boolean isFileSelectable(VirtualFile file) {
return isZip(file.getName());
}
private boolean isZip(String name) {
return name.contains(".zip");
}
};
private static final Resolution[] RESOLUTIONS = new Resolution[]{
Resolution.XXXHDPI,
Resolution.XXHDPI,
Resolution.XHDPI,
Resolution.HDPI,
Resolution.MDPI,
Resolution.LDPI,
Resolution.TVDPI
};
private static final String TAG = AndroidMultiDrawableImporter.class.getSimpleName();
private static final Logger LOGGER = Logger.getInstance(TAG);
private final Project project;
private final Module module;
private final IMultiImport
gitextract_ylc6730z/
├── .gitignore
├── .travis.yml
├── LICENSE
├── README.md
├── build.gradle
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── json_generator/
│ ├── __init__.py
│ └── json_generator.py
├── settings.gradle
└── src/
└── main/
├── java/
│ └── de/
│ └── mprengemann/
│ └── intellij/
│ └── plugin/
│ └── androidicons/
│ ├── IProjectSettingsComponent.java
│ ├── IconApplication.java
│ ├── ProjectSettingsComponent.java
│ ├── actions/
│ │ ├── AndroidAssetUtilsGroup.java
│ │ ├── AndroidBatchImportAction.java
│ │ ├── AndroidMultiDrawableAction.java
│ │ ├── IconsAction.java
│ │ └── VectorsAction.java
│ ├── controllers/
│ │ ├── DefaultControllerFactory.java
│ │ ├── IController.java
│ │ ├── IControllerFactory.java
│ │ ├── batchscale/
│ │ │ ├── BatchScaleImporterController.java
│ │ │ ├── BatchScaleImporterObserver.java
│ │ │ ├── IBatchScaleImporterController.java
│ │ │ └── additem/
│ │ │ ├── AddItemBatchScaleDialogObserver.java
│ │ │ ├── AddItemBatchScaleImporterController.java
│ │ │ └── IAddItemBatchScaleImporterController.java
│ │ ├── defaults/
│ │ │ ├── DefaultsController.java
│ │ │ └── IDefaultsController.java
│ │ ├── iconimporter/
│ │ │ ├── IIconsImporterController.java
│ │ │ ├── IconsImporterController.java
│ │ │ └── IconsImporterObserver.java
│ │ ├── icons/
│ │ │ ├── IIconPackController.java
│ │ │ ├── androidicons/
│ │ │ │ ├── AndroidIconsController.java
│ │ │ │ └── IAndroidIconsController.java
│ │ │ └── materialicons/
│ │ │ ├── IMaterialIconsController.java
│ │ │ └── MaterialIconsController.java
│ │ ├── multi/
│ │ │ ├── IMultiImporterController.java
│ │ │ ├── MultiImporterController.java
│ │ │ └── MultiImporterObserver.java
│ │ └── settings/
│ │ ├── ISettingsController.java
│ │ ├── SettingsController.java
│ │ └── SettingsObserver.java
│ ├── dialogs/
│ │ ├── AddItemBatchScaleDialog.form
│ │ ├── AddItemBatchScaleDialog.java
│ │ ├── AndroidBatchScaleImporter.form
│ │ ├── AndroidBatchScaleImporter.java
│ │ ├── AndroidMultiDrawableImporter.form
│ │ ├── AndroidMultiDrawableImporter.java
│ │ ├── EditItemsBatchScaleDialog.form
│ │ ├── EditItemsBatchScaleDialog.java
│ │ ├── IconImporter.form
│ │ ├── IconImporter.java
│ │ ├── ResourcesDialog.form
│ │ ├── ResourcesDialog.java
│ │ ├── VectorImporter.form
│ │ └── VectorImporter.java
│ ├── images/
│ │ ├── RefactoringTask.java
│ │ └── ResizeAlgorithm.java
│ ├── listeners/
│ │ ├── RadioListListener.java
│ │ ├── SimpleKeyListener.java
│ │ └── SimpleMouseListener.java
│ ├── model/
│ │ ├── Destination.java
│ │ ├── Format.java
│ │ ├── IconPack.java
│ │ ├── ImageAsset.java
│ │ ├── ImageInformation.java
│ │ └── Resolution.java
│ ├── resources/
│ │ └── ResourceLoader.java
│ ├── util/
│ │ ├── AndroidFacetUtils.java
│ │ ├── ExportNameUtils.java
│ │ ├── ImageUtils.java
│ │ ├── MathUtils.java
│ │ ├── RefactorUtils.java
│ │ ├── RunnableUtils.java
│ │ └── TextUtils.java
│ └── widgets/
│ ├── ExportNameField.java
│ ├── FileBrowserField.java
│ ├── RadioButtonList.java
│ └── ResolutionButtonModel.java
└── resources/
├── META-INF/
│ └── plugin.xml
└── assets/
├── content.json
├── icon_packs.properties
└── material_icons/
├── action/
│ └── drawable-anydpi-v21/
│ ├── ic_3d_rotation_black_24dp.xml
│ ├── ic_accessibility_black_24dp.xml
│ ├── ic_accessible_black_24dp.xml
│ ├── ic_account_balance_black_24dp.xml
│ ├── ic_account_balance_wallet_black_24dp.xml
│ ├── ic_account_box_black_24dp.xml
│ ├── ic_account_circle_black_24dp.xml
│ ├── ic_add_shopping_cart_black_24dp.xml
│ ├── ic_alarm_add_black_24dp.xml
│ ├── ic_alarm_black_24dp.xml
│ ├── ic_alarm_off_black_24dp.xml
│ ├── ic_alarm_on_black_24dp.xml
│ ├── ic_all_out_black_24dp.xml
│ ├── ic_android_black_24dp.xml
│ ├── ic_announcement_black_24dp.xml
│ ├── ic_aspect_ratio_black_24dp.xml
│ ├── ic_assessment_black_24dp.xml
│ ├── ic_assignment_black_24dp.xml
│ ├── ic_assignment_ind_black_24dp.xml
│ ├── ic_assignment_late_black_24dp.xml
│ ├── ic_assignment_return_black_24dp.xml
│ ├── ic_assignment_returned_black_24dp.xml
│ ├── ic_assignment_turned_in_black_24dp.xml
│ ├── ic_autorenew_black_24dp.xml
│ ├── ic_backup_black_24dp.xml
│ ├── ic_book_black_24dp.xml
│ ├── ic_bookmark_black_24dp.xml
│ ├── ic_bookmark_border_black_24dp.xml
│ ├── ic_bug_report_black_24dp.xml
│ ├── ic_build_black_24dp.xml
│ ├── ic_cached_black_24dp.xml
│ ├── ic_camera_enhance_black_24dp.xml
│ ├── ic_card_giftcard_black_24dp.xml
│ ├── ic_card_membership_black_24dp.xml
│ ├── ic_card_travel_black_24dp.xml
│ ├── ic_change_history_black_24dp.xml
│ ├── ic_check_circle_black_24dp.xml
│ ├── ic_chrome_reader_mode_black_24dp.xml
│ ├── ic_class_black_24dp.xml
│ ├── ic_code_black_24dp.xml
│ ├── ic_compare_arrows_black_24dp.xml
│ ├── ic_copyright_black_24dp.xml
│ ├── ic_credit_card_black_24dp.xml
│ ├── ic_dashboard_black_24dp.xml
│ ├── ic_date_range_black_24dp.xml
│ ├── ic_delete_black_24dp.xml
│ ├── ic_delete_forever_black_24dp.xml
│ ├── ic_description_black_24dp.xml
│ ├── ic_dns_black_24dp.xml
│ ├── ic_done_all_black_24dp.xml
│ ├── ic_done_black_24dp.xml
│ ├── ic_donut_large_black_24dp.xml
│ ├── ic_donut_small_black_24dp.xml
│ ├── ic_eject_black_24dp.xml
│ ├── ic_euro_symbol_black_24dp.xml
│ ├── ic_event_black_24dp.xml
│ ├── ic_event_seat_black_24dp.xml
│ ├── ic_exit_to_app_black_24dp.xml
│ ├── ic_explore_black_24dp.xml
│ ├── ic_extension_black_24dp.xml
│ ├── ic_face_black_24dp.xml
│ ├── ic_favorite_black_24dp.xml
│ ├── ic_favorite_border_black_24dp.xml
│ ├── ic_feedback_black_24dp.xml
│ ├── ic_find_in_page_black_24dp.xml
│ ├── ic_find_replace_black_24dp.xml
│ ├── ic_fingerprint_black_24dp.xml
│ ├── ic_flight_land_black_24dp.xml
│ ├── ic_flight_takeoff_black_24dp.xml
│ ├── ic_flip_to_back_black_24dp.xml
│ ├── ic_flip_to_front_black_24dp.xml
│ ├── ic_g_translate_black_24dp.xml
│ ├── ic_gavel_black_24dp.xml
│ ├── ic_get_app_black_24dp.xml
│ ├── ic_gif_black_24dp.xml
│ ├── ic_grade_black_24dp.xml
│ ├── ic_group_work_black_24dp.xml
│ ├── ic_help_black_24dp.xml
│ ├── ic_help_outline_black_24dp.xml
│ ├── ic_highlight_off_black_24dp.xml
│ ├── ic_history_black_24dp.xml
│ ├── ic_home_black_24dp.xml
│ ├── ic_hourglass_empty_black_24dp.xml
│ ├── ic_hourglass_full_black_24dp.xml
│ ├── ic_http_black_24dp.xml
│ ├── ic_https_black_24dp.xml
│ ├── ic_important_devices_black_24dp.xml
│ ├── ic_info_black_24dp.xml
│ ├── ic_info_outline_black_24dp.xml
│ ├── ic_input_black_24dp.xml
│ ├── ic_invert_colors_black_24dp.xml
│ ├── ic_label_black_24dp.xml
│ ├── ic_label_outline_black_24dp.xml
│ ├── ic_language_black_24dp.xml
│ ├── ic_launch_black_24dp.xml
│ ├── ic_lightbulb_outline_black_24dp.xml
│ ├── ic_line_style_black_24dp.xml
│ ├── ic_line_weight_black_24dp.xml
│ ├── ic_list_black_24dp.xml
│ ├── ic_lock_black_24dp.xml
│ ├── ic_lock_open_black_24dp.xml
│ ├── ic_lock_outline_black_24dp.xml
│ ├── ic_loyalty_black_24dp.xml
│ ├── ic_markunread_mailbox_black_24dp.xml
│ ├── ic_motorcycle_black_24dp.xml
│ ├── ic_note_add_black_24dp.xml
│ ├── ic_offline_pin_black_24dp.xml
│ ├── ic_opacity_black_24dp.xml
│ ├── ic_open_in_browser_black_24dp.xml
│ ├── ic_open_in_new_black_24dp.xml
│ ├── ic_open_with_black_24dp.xml
│ ├── ic_pageview_black_24dp.xml
│ ├── ic_pan_tool_black_24dp.xml
│ ├── ic_payment_black_24dp.xml
│ ├── ic_perm_camera_mic_black_24dp.xml
│ ├── ic_perm_contact_calendar_black_24dp.xml
│ ├── ic_perm_data_setting_black_24dp.xml
│ ├── ic_perm_device_information_black_24dp.xml
│ ├── ic_perm_identity_black_24dp.xml
│ ├── ic_perm_media_black_24dp.xml
│ ├── ic_perm_phone_msg_black_24dp.xml
│ ├── ic_perm_scan_wifi_black_24dp.xml
│ ├── ic_pets_black_24dp.xml
│ ├── ic_picture_in_picture_alt_black_24dp.xml
│ ├── ic_picture_in_picture_black_24dp.xml
│ ├── ic_play_for_work_black_24dp.xml
│ ├── ic_polymer_black_24dp.xml
│ ├── ic_power_settings_new_black_24dp.xml
│ ├── ic_pregnant_woman_black_24dp.xml
│ ├── ic_print_black_24dp.xml
│ ├── ic_query_builder_black_24dp.xml
│ ├── ic_question_answer_black_24dp.xml
│ ├── ic_receipt_black_24dp.xml
│ ├── ic_record_voice_over_black_24dp.xml
│ ├── ic_redeem_black_24dp.xml
│ ├── ic_remove_shopping_cart_black_24dp.xml
│ ├── ic_reorder_black_24dp.xml
│ ├── ic_report_problem_black_24dp.xml
│ ├── ic_restore_black_24dp.xml
│ ├── ic_restore_page_black_24dp.xml
│ ├── ic_room_black_24dp.xml
│ ├── ic_rounded_corner_black_24dp.xml
│ ├── ic_rowing_black_24dp.xml
│ ├── ic_schedule_black_24dp.xml
│ ├── ic_search_black_24dp.xml
│ ├── ic_settings_applications_black_24dp.xml
│ ├── ic_settings_backup_restore_black_24dp.xml
│ ├── ic_settings_black_24dp.xml
│ ├── ic_settings_bluetooth_black_24dp.xml
│ ├── ic_settings_brightness_black_24dp.xml
│ ├── ic_settings_cell_black_24dp.xml
│ ├── ic_settings_ethernet_black_24dp.xml
│ ├── ic_settings_input_antenna_black_24dp.xml
│ ├── ic_settings_input_component_black_24dp.xml
│ ├── ic_settings_input_composite_black_24dp.xml
│ ├── ic_settings_input_hdmi_black_24dp.xml
│ ├── ic_settings_input_svideo_black_24dp.xml
│ ├── ic_settings_overscan_black_24dp.xml
│ ├── ic_settings_phone_black_24dp.xml
│ ├── ic_settings_power_black_24dp.xml
│ ├── ic_settings_remote_black_24dp.xml
│ ├── ic_settings_voice_black_24dp.xml
│ ├── ic_shop_black_24dp.xml
│ ├── ic_shop_two_black_24dp.xml
│ ├── ic_shopping_basket_black_24dp.xml
│ ├── ic_shopping_cart_black_24dp.xml
│ ├── ic_speaker_notes_black_24dp.xml
│ ├── ic_speaker_notes_off_black_24dp.xml
│ ├── ic_spellcheck_black_24dp.xml
│ ├── ic_stars_black_24dp.xml
│ ├── ic_store_black_24dp.xml
│ ├── ic_subject_black_24dp.xml
│ ├── ic_supervisor_account_black_24dp.xml
│ ├── ic_swap_horiz_black_24dp.xml
│ ├── ic_swap_vert_black_24dp.xml
│ ├── ic_swap_vertical_circle_black_24dp.xml
│ ├── ic_system_update_alt_black_24dp.xml
│ ├── ic_tab_black_24dp.xml
│ ├── ic_tab_unselected_black_24dp.xml
│ ├── ic_theaters_black_24dp.xml
│ ├── ic_thumb_down_black_24dp.xml
│ ├── ic_thumb_up_black_24dp.xml
│ ├── ic_thumbs_up_down_black_24dp.xml
│ ├── ic_timeline_black_24dp.xml
│ ├── ic_toc_black_24dp.xml
│ ├── ic_today_black_24dp.xml
│ ├── ic_toll_black_24dp.xml
│ ├── ic_touch_app_black_24dp.xml
│ ├── ic_track_changes_black_24dp.xml
│ ├── ic_translate_black_24dp.xml
│ ├── ic_trending_down_black_24dp.xml
│ ├── ic_trending_flat_black_24dp.xml
│ ├── ic_trending_up_black_24dp.xml
│ ├── ic_turned_in_black_24dp.xml
│ ├── ic_turned_in_not_black_24dp.xml
│ ├── ic_update_black_24dp.xml
│ ├── ic_verified_user_black_24dp.xml
│ ├── ic_view_agenda_black_24dp.xml
│ ├── ic_view_array_black_24dp.xml
│ ├── ic_view_carousel_black_24dp.xml
│ ├── ic_view_column_black_24dp.xml
│ ├── ic_view_day_black_24dp.xml
│ ├── ic_view_headline_black_24dp.xml
│ ├── ic_view_list_black_24dp.xml
│ ├── ic_view_module_black_24dp.xml
│ ├── ic_view_quilt_black_24dp.xml
│ ├── ic_view_stream_black_24dp.xml
│ ├── ic_view_week_black_24dp.xml
│ ├── ic_visibility_black_24dp.xml
│ ├── ic_visibility_off_black_24dp.xml
│ ├── ic_watch_later_black_24dp.xml
│ ├── ic_work_black_24dp.xml
│ ├── ic_youtube_searched_for_black_24dp.xml
│ ├── ic_zoom_in_black_24dp.xml
│ └── ic_zoom_out_black_24dp.xml
├── alert/
│ └── drawable-anydpi-v21/
│ ├── ic_add_alert_black_24dp.xml
│ ├── ic_error_black_24dp.xml
│ ├── ic_error_outline_black_24dp.xml
│ └── ic_warning_black_24dp.xml
├── av/
│ └── drawable-anydpi-v21/
│ ├── ic_add_to_queue_black_24dp.xml
│ ├── ic_airplay_black_24dp.xml
│ ├── ic_album_black_24dp.xml
│ ├── ic_art_track_black_24dp.xml
│ ├── ic_av_timer_black_24dp.xml
│ ├── ic_branding_watermark_black_24dp.xml
│ ├── ic_call_to_action_black_24dp.xml
│ ├── ic_closed_caption_black_24dp.xml
│ ├── ic_equalizer_black_24dp.xml
│ ├── ic_explicit_black_24dp.xml
│ ├── ic_fast_forward_black_24dp.xml
│ ├── ic_fast_rewind_black_24dp.xml
│ ├── ic_featured_play_list_black_24dp.xml
│ ├── ic_featured_video_black_24dp.xml
│ ├── ic_fiber_dvr_black_24dp.xml
│ ├── ic_fiber_manual_record_black_24dp.xml
│ ├── ic_fiber_new_black_24dp.xml
│ ├── ic_fiber_pin_black_24dp.xml
│ ├── ic_fiber_smart_record_black_24dp.xml
│ ├── ic_forward_10_black_24dp.xml
│ ├── ic_forward_30_black_24dp.xml
│ ├── ic_forward_5_black_24dp.xml
│ ├── ic_games_black_24dp.xml
│ ├── ic_hd_black_24dp.xml
│ ├── ic_hearing_black_24dp.xml
│ ├── ic_high_quality_black_24dp.xml
│ ├── ic_library_add_black_24dp.xml
│ ├── ic_library_books_black_24dp.xml
│ ├── ic_library_music_black_24dp.xml
│ ├── ic_loop_black_24dp.xml
│ ├── ic_mic_black_24dp.xml
│ ├── ic_mic_none_black_24dp.xml
│ ├── ic_mic_off_black_24dp.xml
│ ├── ic_movie_black_24dp.xml
│ ├── ic_music_video_black_24dp.xml
│ ├── ic_new_releases_black_24dp.xml
│ ├── ic_not_interested_black_24dp.xml
│ ├── ic_note_black_24dp.xml
│ ├── ic_pause_black_24dp.xml
│ ├── ic_pause_circle_filled_black_24dp.xml
│ ├── ic_pause_circle_outline_black_24dp.xml
│ ├── ic_play_arrow_black_24dp.xml
│ ├── ic_play_circle_filled_black_24dp.xml
│ ├── ic_play_circle_outline_black_24dp.xml
│ ├── ic_playlist_add_black_24dp.xml
│ ├── ic_playlist_add_check_black_24dp.xml
│ ├── ic_playlist_play_black_24dp.xml
│ ├── ic_queue_black_24dp.xml
│ ├── ic_queue_music_black_24dp.xml
│ ├── ic_queue_play_next_black_24dp.xml
│ ├── ic_radio_black_24dp.xml
│ ├── ic_recent_actors_black_24dp.xml
│ ├── ic_remove_from_queue_black_24dp.xml
│ ├── ic_repeat_black_24dp.xml
│ ├── ic_repeat_one_black_24dp.xml
│ ├── ic_replay_10_black_24dp.xml
│ ├── ic_replay_30_black_24dp.xml
│ ├── ic_replay_5_black_24dp.xml
│ ├── ic_replay_black_24dp.xml
│ ├── ic_shuffle_black_24dp.xml
│ ├── ic_skip_next_black_24dp.xml
│ ├── ic_skip_previous_black_24dp.xml
│ ├── ic_slow_motion_video_black_24dp.xml
│ ├── ic_snooze_black_24dp.xml
│ ├── ic_sort_by_alpha_black_24dp.xml
│ ├── ic_stop_black_24dp.xml
│ ├── ic_subscriptions_black_24dp.xml
│ ├── ic_subtitles_black_24dp.xml
│ ├── ic_surround_sound_black_24dp.xml
│ ├── ic_video_call_black_24dp.xml
│ ├── ic_video_label_black_24dp.xml
│ ├── ic_video_library_black_24dp.xml
│ ├── ic_videocam_black_24dp.xml
│ ├── ic_videocam_off_black_24dp.xml
│ ├── ic_volume_down_black_24dp.xml
│ ├── ic_volume_mute_black_24dp.xml
│ ├── ic_volume_off_black_24dp.xml
│ ├── ic_volume_up_black_24dp.xml
│ ├── ic_web_asset_black_24dp.xml
│ └── ic_web_black_24dp.xml
├── communication/
│ └── drawable-anydpi-v21/
│ ├── ic_business_black_24dp.xml
│ ├── ic_call_black_24dp.xml
│ ├── ic_call_end_black_24dp.xml
│ ├── ic_call_made_black_24dp.xml
│ ├── ic_call_merge_black_24dp.xml
│ ├── ic_call_missed_black_24dp.xml
│ ├── ic_call_missed_outgoing_black_24dp.xml
│ ├── ic_call_received_black_24dp.xml
│ ├── ic_call_split_black_24dp.xml
│ ├── ic_chat_black_24dp.xml
│ ├── ic_chat_bubble_black_24dp.xml
│ ├── ic_chat_bubble_outline_black_24dp.xml
│ ├── ic_clear_all_black_24dp.xml
│ ├── ic_comment_black_24dp.xml
│ ├── ic_contact_mail_black_24dp.xml
│ ├── ic_contact_phone_black_24dp.xml
│ ├── ic_contacts_black_24dp.xml
│ ├── ic_dialer_sip_black_24dp.xml
│ ├── ic_dialpad_black_24dp.xml
│ ├── ic_email_black_24dp.xml
│ ├── ic_forum_black_24dp.xml
│ ├── ic_import_contacts_black_24dp.xml
│ ├── ic_import_export_black_24dp.xml
│ ├── ic_invert_colors_off_black_24dp.xml
│ ├── ic_live_help_black_24dp.xml
│ ├── ic_location_off_black_24dp.xml
│ ├── ic_location_on_black_24dp.xml
│ ├── ic_mail_outline_black_24dp.xml
│ ├── ic_message_black_24dp.xml
│ ├── ic_no_sim_black_24dp.xml
│ ├── ic_phone_black_24dp.xml
│ ├── ic_phonelink_erase_black_24dp.xml
│ ├── ic_phonelink_lock_black_24dp.xml
│ ├── ic_phonelink_ring_black_24dp.xml
│ ├── ic_phonelink_setup_black_24dp.xml
│ ├── ic_portable_wifi_off_black_24dp.xml
│ ├── ic_present_to_all_black_24dp.xml
│ ├── ic_ring_volume_black_24dp.xml
│ ├── ic_rss_feed_black_24dp.xml
│ ├── ic_screen_share_black_24dp.xml
│ ├── ic_speaker_phone_black_24dp.xml
│ ├── ic_stay_current_landscape_black_24dp.xml
│ ├── ic_stay_current_portrait_black_24dp.xml
│ ├── ic_stay_primary_landscape_black_24dp.xml
│ ├── ic_stay_primary_portrait_black_24dp.xml
│ ├── ic_stop_screen_share_black_24dp.xml
│ ├── ic_swap_calls_black_24dp.xml
│ ├── ic_textsms_black_24dp.xml
│ ├── ic_voicemail_black_24dp.xml
│ └── ic_vpn_key_black_24dp.xml
├── content/
│ └── drawable-anydpi-v21/
│ ├── ic_add_black_24dp.xml
│ ├── ic_add_box_black_24dp.xml
│ ├── ic_add_circle_black_24dp.xml
│ ├── ic_add_circle_outline_black_24dp.xml
│ ├── ic_archive_black_24dp.xml
│ ├── ic_backspace_black_24dp.xml
│ ├── ic_block_black_24dp.xml
│ ├── ic_clear_black_24dp.xml
│ ├── ic_content_copy_black_24dp.xml
│ ├── ic_content_cut_black_24dp.xml
│ ├── ic_content_paste_black_24dp.xml
│ ├── ic_create_black_24dp.xml
│ ├── ic_delete_sweep_black_24dp.xml
│ ├── ic_drafts_black_24dp.xml
│ ├── ic_filter_list_black_24dp.xml
│ ├── ic_flag_black_24dp.xml
│ ├── ic_font_download_black_24dp.xml
│ ├── ic_forward_black_24dp.xml
│ ├── ic_gesture_black_24dp.xml
│ ├── ic_inbox_black_24dp.xml
│ ├── ic_link_black_24dp.xml
│ ├── ic_low_priority_black_24dp.xml
│ ├── ic_mail_black_24dp.xml
│ ├── ic_markunread_black_24dp.xml
│ ├── ic_move_to_inbox_black_24dp.xml
│ ├── ic_next_week_black_24dp.xml
│ ├── ic_redo_black_24dp.xml
│ ├── ic_remove_black_24dp.xml
│ ├── ic_remove_circle_black_24dp.xml
│ ├── ic_remove_circle_outline_black_24dp.xml
│ ├── ic_reply_all_black_24dp.xml
│ ├── ic_reply_black_24dp.xml
│ ├── ic_report_black_24dp.xml
│ ├── ic_save_black_24dp.xml
│ ├── ic_select_all_black_24dp.xml
│ ├── ic_send_black_24dp.xml
│ ├── ic_sort_black_24dp.xml
│ ├── ic_text_format_black_24dp.xml
│ ├── ic_unarchive_black_24dp.xml
│ ├── ic_undo_black_24dp.xml
│ └── ic_weekend_black_24dp.xml
├── device/
│ └── drawable-anydpi-v21/
│ ├── ic_access_alarm_black_24dp.xml
│ ├── ic_access_alarms_black_24dp.xml
│ ├── ic_access_time_black_24dp.xml
│ ├── ic_add_alarm_black_24dp.xml
│ ├── ic_airplanemode_active_black_24dp.xml
│ ├── ic_airplanemode_inactive_black_24dp.xml
│ ├── ic_battery_20_black_24dp.xml
│ ├── ic_battery_30_black_24dp.xml
│ ├── ic_battery_50_black_24dp.xml
│ ├── ic_battery_60_black_24dp.xml
│ ├── ic_battery_80_black_24dp.xml
│ ├── ic_battery_90_black_24dp.xml
│ ├── ic_battery_alert_black_24dp.xml
│ ├── ic_battery_charging_20_black_24dp.xml
│ ├── ic_battery_charging_30_black_24dp.xml
│ ├── ic_battery_charging_50_black_24dp.xml
│ ├── ic_battery_charging_60_black_24dp.xml
│ ├── ic_battery_charging_80_black_24dp.xml
│ ├── ic_battery_charging_90_black_24dp.xml
│ ├── ic_battery_charging_full_black_24dp.xml
│ ├── ic_battery_full_black_24dp.xml
│ ├── ic_battery_std_black_24dp.xml
│ ├── ic_battery_unknown_black_24dp.xml
│ ├── ic_bluetooth_black_24dp.xml
│ ├── ic_bluetooth_connected_black_24dp.xml
│ ├── ic_bluetooth_disabled_black_24dp.xml
│ ├── ic_bluetooth_searching_black_24dp.xml
│ ├── ic_brightness_auto_black_24dp.xml
│ ├── ic_brightness_high_black_24dp.xml
│ ├── ic_brightness_low_black_24dp.xml
│ ├── ic_brightness_medium_black_24dp.xml
│ ├── ic_data_usage_black_24dp.xml
│ ├── ic_developer_mode_black_24dp.xml
│ ├── ic_devices_black_24dp.xml
│ ├── ic_dvr_black_24dp.xml
│ ├── ic_gps_fixed_black_24dp.xml
│ ├── ic_gps_not_fixed_black_24dp.xml
│ ├── ic_gps_off_black_24dp.xml
│ ├── ic_graphic_eq_black_24dp.xml
│ ├── ic_location_disabled_black_24dp.xml
│ ├── ic_location_searching_black_24dp.xml
│ ├── ic_network_cell_black_24dp.xml
│ ├── ic_network_wifi_black_24dp.xml
│ ├── ic_nfc_black_24dp.xml
│ ├── ic_screen_lock_landscape_black_24dp.xml
│ ├── ic_screen_lock_portrait_black_24dp.xml
│ ├── ic_screen_lock_rotation_black_24dp.xml
│ ├── ic_screen_rotation_black_24dp.xml
│ ├── ic_sd_storage_black_24dp.xml
│ ├── ic_settings_system_daydream_black_24dp.xml
│ ├── ic_signal_cellular_0_bar_black_24dp.xml
│ ├── ic_signal_cellular_1_bar_black_24dp.xml
│ ├── ic_signal_cellular_2_bar_black_24dp.xml
│ ├── ic_signal_cellular_3_bar_black_24dp.xml
│ ├── ic_signal_cellular_4_bar_black_24dp.xml
│ ├── ic_signal_cellular_connected_no_internet_0_bar_black_24dp.xml
│ ├── ic_signal_cellular_connected_no_internet_1_bar_black_24dp.xml
│ ├── ic_signal_cellular_connected_no_internet_2_bar_black_24dp.xml
│ ├── ic_signal_cellular_connected_no_internet_3_bar_black_24dp.xml
│ ├── ic_signal_cellular_connected_no_internet_4_bar_black_24dp.xml
│ ├── ic_signal_cellular_no_sim_black_24dp.xml
│ ├── ic_signal_cellular_null_black_24dp.xml
│ ├── ic_signal_cellular_off_black_24dp.xml
│ ├── ic_signal_wifi_0_bar_black_24dp.xml
│ ├── ic_signal_wifi_1_bar_black_24dp.xml
│ ├── ic_signal_wifi_1_bar_lock_black_24dp.xml
│ ├── ic_signal_wifi_2_bar_black_24dp.xml
│ ├── ic_signal_wifi_2_bar_lock_black_24dp.xml
│ ├── ic_signal_wifi_3_bar_black_24dp.xml
│ ├── ic_signal_wifi_3_bar_lock_black_24dp.xml
│ ├── ic_signal_wifi_4_bar_black_24dp.xml
│ ├── ic_signal_wifi_4_bar_lock_black_24dp.xml
│ ├── ic_signal_wifi_off_black_24dp.xml
│ ├── ic_storage_black_24dp.xml
│ ├── ic_usb_black_24dp.xml
│ ├── ic_wallpaper_black_24dp.xml
│ ├── ic_widgets_black_24dp.xml
│ ├── ic_wifi_lock_black_24dp.xml
│ └── ic_wifi_tethering_black_24dp.xml
├── editor/
│ └── drawable-anydpi-v21/
│ ├── ic_attach_file_black_24dp.xml
│ ├── ic_attach_money_black_24dp.xml
│ ├── ic_border_all_black_24dp.xml
│ ├── ic_border_bottom_black_24dp.xml
│ ├── ic_border_clear_black_24dp.xml
│ ├── ic_border_color_black_24dp.xml
│ ├── ic_border_horizontal_black_24dp.xml
│ ├── ic_border_inner_black_24dp.xml
│ ├── ic_border_left_black_24dp.xml
│ ├── ic_border_outer_black_24dp.xml
│ ├── ic_border_right_black_24dp.xml
│ ├── ic_border_style_black_24dp.xml
│ ├── ic_border_top_black_24dp.xml
│ ├── ic_border_vertical_black_24dp.xml
│ ├── ic_bubble_chart_black_24dp.xml
│ ├── ic_drag_handle_black_24dp.xml
│ ├── ic_format_align_center_black_24dp.xml
│ ├── ic_format_align_justify_black_24dp.xml
│ ├── ic_format_align_left_black_24dp.xml
│ ├── ic_format_align_right_black_24dp.xml
│ ├── ic_format_bold_black_24dp.xml
│ ├── ic_format_clear_black_24dp.xml
│ ├── ic_format_color_fill_black_24dp.xml
│ ├── ic_format_color_reset_black_24dp.xml
│ ├── ic_format_color_text_black_24dp.xml
│ ├── ic_format_indent_decrease_black_24dp.xml
│ ├── ic_format_indent_increase_black_24dp.xml
│ ├── ic_format_italic_black_24dp.xml
│ ├── ic_format_line_spacing_black_24dp.xml
│ ├── ic_format_list_bulleted_black_24dp.xml
│ ├── ic_format_list_numbered_black_24dp.xml
│ ├── ic_format_paint_black_24dp.xml
│ ├── ic_format_quote_black_24dp.xml
│ ├── ic_format_shapes_black_24dp.xml
│ ├── ic_format_size_black_24dp.xml
│ ├── ic_format_strikethrough_black_24dp.xml
│ ├── ic_format_textdirection_l_to_r_black_24dp.xml
│ ├── ic_format_textdirection_r_to_l_black_24dp.xml
│ ├── ic_format_underlined_black_24dp.xml
│ ├── ic_functions_black_24dp.xml
│ ├── ic_highlight_black_24dp.xml
│ ├── ic_insert_chart_black_24dp.xml
│ ├── ic_insert_comment_black_24dp.xml
│ ├── ic_insert_drive_file_black_24dp.xml
│ ├── ic_insert_emoticon_black_24dp.xml
│ ├── ic_insert_invitation_black_24dp.xml
│ ├── ic_insert_link_black_24dp.xml
│ ├── ic_insert_photo_black_24dp.xml
│ ├── ic_linear_scale_black_24dp.xml
│ ├── ic_merge_type_black_24dp.xml
│ ├── ic_mode_comment_black_24dp.xml
│ ├── ic_mode_edit_black_24dp.xml
│ ├── ic_monetization_on_black_24dp.xml
│ ├── ic_money_off_black_24dp.xml
│ ├── ic_multiline_chart_black_24dp.xml
│ ├── ic_pie_chart_black_24dp.xml
│ ├── ic_pie_chart_outlined_black_24dp.xml
│ ├── ic_publish_black_24dp.xml
│ ├── ic_short_text_black_24dp.xml
│ ├── ic_show_chart_black_24dp.xml
│ ├── ic_space_bar_black_24dp.xml
│ ├── ic_strikethrough_s_black_24dp.xml
│ ├── ic_text_fields_black_24dp.xml
│ ├── ic_title_black_24dp.xml
│ ├── ic_vertical_align_bottom_black_24dp.xml
│ ├── ic_vertical_align_center_black_24dp.xml
│ ├── ic_vertical_align_top_black_24dp.xml
│ └── ic_wrap_text_black_24dp.xml
├── file/
│ └── drawable-anydpi-v21/
│ ├── ic_attachment_black_24dp.xml
│ ├── ic_cloud_black_24dp.xml
│ ├── ic_cloud_circle_black_24dp.xml
│ ├── ic_cloud_done_black_24dp.xml
│ ├── ic_cloud_download_black_24dp.xml
│ ├── ic_cloud_off_black_24dp.xml
│ ├── ic_cloud_queue_black_24dp.xml
│ ├── ic_cloud_upload_black_24dp.xml
│ ├── ic_create_new_folder_black_24dp.xml
│ ├── ic_file_download_black_24dp.xml
│ ├── ic_file_upload_black_24dp.xml
│ ├── ic_folder_black_24dp.xml
│ ├── ic_folder_open_black_24dp.xml
│ └── ic_folder_shared_black_24dp.xml
├── hardware/
│ └── drawable-anydpi-v21/
│ ├── ic_cast_black_24dp.xml
│ ├── ic_cast_connected_black_24dp.xml
│ ├── ic_computer_black_24dp.xml
│ ├── ic_desktop_mac_black_24dp.xml
│ ├── ic_desktop_windows_black_24dp.xml
│ ├── ic_developer_board_black_24dp.xml
│ ├── ic_device_hub_black_24dp.xml
│ ├── ic_devices_other_black_24dp.xml
│ ├── ic_dock_black_24dp.xml
│ ├── ic_gamepad_black_24dp.xml
│ ├── ic_headset_black_24dp.xml
│ ├── ic_headset_mic_black_24dp.xml
│ ├── ic_keyboard_arrow_down_black_24dp.xml
│ ├── ic_keyboard_arrow_left_black_24dp.xml
│ ├── ic_keyboard_arrow_right_black_24dp.xml
│ ├── ic_keyboard_arrow_up_black_24dp.xml
│ ├── ic_keyboard_backspace_black_24dp.xml
│ ├── ic_keyboard_black_24dp.xml
│ ├── ic_keyboard_capslock_black_24dp.xml
│ ├── ic_keyboard_hide_black_24dp.xml
│ ├── ic_keyboard_return_black_24dp.xml
│ ├── ic_keyboard_tab_black_24dp.xml
│ ├── ic_keyboard_voice_black_24dp.xml
│ ├── ic_laptop_black_24dp.xml
│ ├── ic_laptop_chromebook_black_24dp.xml
│ ├── ic_laptop_mac_black_24dp.xml
│ ├── ic_laptop_windows_black_24dp.xml
│ ├── ic_memory_black_24dp.xml
│ ├── ic_mouse_black_24dp.xml
│ ├── ic_phone_android_black_24dp.xml
│ ├── ic_phone_iphone_black_24dp.xml
│ ├── ic_phonelink_black_24dp.xml
│ ├── ic_phonelink_off_black_24dp.xml
│ ├── ic_power_input_black_24dp.xml
│ ├── ic_router_black_24dp.xml
│ ├── ic_scanner_black_24dp.xml
│ ├── ic_security_black_24dp.xml
│ ├── ic_sim_card_black_24dp.xml
│ ├── ic_smartphone_black_24dp.xml
│ ├── ic_speaker_black_24dp.xml
│ ├── ic_speaker_group_black_24dp.xml
│ ├── ic_tablet_android_black_24dp.xml
│ ├── ic_tablet_black_24dp.xml
│ ├── ic_tablet_mac_black_24dp.xml
│ ├── ic_toys_black_24dp.xml
│ ├── ic_tv_black_24dp.xml
│ ├── ic_videogame_asset_black_24dp.xml
│ └── ic_watch_black_24dp.xml
├── image/
│ └── drawable-anydpi-v21/
│ ├── ic_add_a_photo_black_24dp.xml
│ ├── ic_add_to_photos_black_24dp.xml
│ ├── ic_adjust_black_24dp.xml
│ ├── ic_assistant_black_24dp.xml
│ ├── ic_assistant_photo_black_24dp.xml
│ ├── ic_audiotrack_black_24dp.xml
│ ├── ic_blur_circular_black_24dp.xml
│ ├── ic_blur_linear_black_24dp.xml
│ ├── ic_blur_off_black_24dp.xml
│ ├── ic_blur_on_black_24dp.xml
│ ├── ic_brightness_1_black_24dp.xml
│ ├── ic_brightness_2_black_24dp.xml
│ ├── ic_brightness_3_black_24dp.xml
│ ├── ic_brightness_4_black_24dp.xml
│ ├── ic_brightness_5_black_24dp.xml
│ ├── ic_brightness_6_black_24dp.xml
│ ├── ic_brightness_7_black_24dp.xml
│ ├── ic_broken_image_black_24dp.xml
│ ├── ic_brush_black_24dp.xml
│ ├── ic_burst_mode_black_24dp.xml
│ ├── ic_camera_alt_black_24dp.xml
│ ├── ic_camera_black_24dp.xml
│ ├── ic_camera_front_black_24dp.xml
│ ├── ic_camera_rear_black_24dp.xml
│ ├── ic_camera_roll_black_24dp.xml
│ ├── ic_center_focus_strong_black_24dp.xml
│ ├── ic_center_focus_weak_black_24dp.xml
│ ├── ic_collections_black_24dp.xml
│ ├── ic_collections_bookmark_black_24dp.xml
│ ├── ic_color_lens_black_24dp.xml
│ ├── ic_colorize_black_24dp.xml
│ ├── ic_compare_black_24dp.xml
│ ├── ic_control_point_black_24dp.xml
│ ├── ic_control_point_duplicate_black_24dp.xml
│ ├── ic_crop_16_9_black_24dp.xml
│ ├── ic_crop_3_2_black_24dp.xml
│ ├── ic_crop_5_4_black_24dp.xml
│ ├── ic_crop_7_5_black_24dp.xml
│ ├── ic_crop_black_24dp.xml
│ ├── ic_crop_din_black_24dp.xml
│ ├── ic_crop_free_black_24dp.xml
│ ├── ic_crop_landscape_black_24dp.xml
│ ├── ic_crop_original_black_24dp.xml
│ ├── ic_crop_portrait_black_24dp.xml
│ ├── ic_crop_rotate_black_24dp.xml
│ ├── ic_crop_square_black_24dp.xml
│ ├── ic_dehaze_black_24dp.xml
│ ├── ic_details_black_24dp.xml
│ ├── ic_edit_black_24dp.xml
│ ├── ic_exposure_black_24dp.xml
│ ├── ic_exposure_neg_1_black_24dp.xml
│ ├── ic_exposure_neg_2_black_24dp.xml
│ ├── ic_exposure_plus_1_black_24dp.xml
│ ├── ic_exposure_plus_2_black_24dp.xml
│ ├── ic_exposure_zero_black_24dp.xml
│ ├── ic_filter_1_black_24dp.xml
│ ├── ic_filter_2_black_24dp.xml
│ ├── ic_filter_3_black_24dp.xml
│ ├── ic_filter_4_black_24dp.xml
│ ├── ic_filter_5_black_24dp.xml
│ ├── ic_filter_6_black_24dp.xml
│ ├── ic_filter_7_black_24dp.xml
│ ├── ic_filter_8_black_24dp.xml
│ ├── ic_filter_9_black_24dp.xml
│ ├── ic_filter_9_plus_black_24dp.xml
│ ├── ic_filter_b_and_w_black_24dp.xml
│ ├── ic_filter_black_24dp.xml
│ ├── ic_filter_center_focus_black_24dp.xml
│ ├── ic_filter_drama_black_24dp.xml
│ ├── ic_filter_frames_black_24dp.xml
│ ├── ic_filter_hdr_black_24dp.xml
│ ├── ic_filter_none_black_24dp.xml
│ ├── ic_filter_tilt_shift_black_24dp.xml
│ ├── ic_filter_vintage_black_24dp.xml
│ ├── ic_flare_black_24dp.xml
│ ├── ic_flash_auto_black_24dp.xml
│ ├── ic_flash_off_black_24dp.xml
│ ├── ic_flash_on_black_24dp.xml
│ ├── ic_flip_black_24dp.xml
│ ├── ic_gradient_black_24dp.xml
│ ├── ic_grain_black_24dp.xml
│ ├── ic_grid_off_black_24dp.xml
│ ├── ic_grid_on_black_24dp.xml
│ ├── ic_hdr_off_black_24dp.xml
│ ├── ic_hdr_on_black_24dp.xml
│ ├── ic_hdr_strong_black_24dp.xml
│ ├── ic_hdr_weak_black_24dp.xml
│ ├── ic_healing_black_24dp.xml
│ ├── ic_image_aspect_ratio_black_24dp.xml
│ ├── ic_image_black_24dp.xml
│ ├── ic_iso_black_24dp.xml
│ ├── ic_landscape_black_24dp.xml
│ ├── ic_leak_add_black_24dp.xml
│ ├── ic_leak_remove_black_24dp.xml
│ ├── ic_lens_black_24dp.xml
│ ├── ic_linked_camera_black_24dp.xml
│ ├── ic_looks_3_black_24dp.xml
│ ├── ic_looks_4_black_24dp.xml
│ ├── ic_looks_5_black_24dp.xml
│ ├── ic_looks_6_black_24dp.xml
│ ├── ic_looks_black_24dp.xml
│ ├── ic_looks_one_black_24dp.xml
│ ├── ic_looks_two_black_24dp.xml
│ ├── ic_loupe_black_24dp.xml
│ ├── ic_monochrome_photos_black_24dp.xml
│ ├── ic_movie_creation_black_24dp.xml
│ ├── ic_movie_filter_black_24dp.xml
│ ├── ic_music_note_black_24dp.xml
│ ├── ic_nature_black_24dp.xml
│ ├── ic_nature_people_black_24dp.xml
│ ├── ic_navigate_before_black_24dp.xml
│ ├── ic_navigate_next_black_24dp.xml
│ ├── ic_palette_black_24dp.xml
│ ├── ic_panorama_black_24dp.xml
│ ├── ic_panorama_fish_eye_black_24dp.xml
│ ├── ic_panorama_horizontal_black_24dp.xml
│ ├── ic_panorama_vertical_black_24dp.xml
│ ├── ic_panorama_wide_angle_black_24dp.xml
│ ├── ic_photo_album_black_24dp.xml
│ ├── ic_photo_black_24dp.xml
│ ├── ic_photo_camera_black_24dp.xml
│ ├── ic_photo_filter_black_24dp.xml
│ ├── ic_photo_library_black_24dp.xml
│ ├── ic_photo_size_select_actual_black_24dp.xml
│ ├── ic_photo_size_select_large_black_24dp.xml
│ ├── ic_photo_size_select_small_black_24dp.xml
│ ├── ic_picture_as_pdf_black_24dp.xml
│ ├── ic_portrait_black_24dp.xml
│ ├── ic_remove_red_eye_black_24dp.xml
│ ├── ic_rotate_90_degrees_ccw_black_24dp.xml
│ ├── ic_rotate_left_black_24dp.xml
│ ├── ic_rotate_right_black_24dp.xml
│ ├── ic_slideshow_black_24dp.xml
│ ├── ic_straighten_black_24dp.xml
│ ├── ic_style_black_24dp.xml
│ ├── ic_switch_camera_black_24dp.xml
│ ├── ic_switch_video_black_24dp.xml
│ ├── ic_tag_faces_black_24dp.xml
│ ├── ic_texture_black_24dp.xml
│ ├── ic_timelapse_black_24dp.xml
│ ├── ic_timer_10_black_24dp.xml
│ ├── ic_timer_3_black_24dp.xml
│ ├── ic_timer_black_24dp.xml
│ ├── ic_timer_off_black_24dp.xml
│ ├── ic_tonality_black_24dp.xml
│ ├── ic_transform_black_24dp.xml
│ ├── ic_tune_black_24dp.xml
│ ├── ic_view_comfy_black_24dp.xml
│ ├── ic_view_compact_black_24dp.xml
│ ├── ic_vignette_black_24dp.xml
│ ├── ic_wb_auto_black_24dp.xml
│ ├── ic_wb_cloudy_black_24dp.xml
│ ├── ic_wb_incandescent_black_24dp.xml
│ ├── ic_wb_iridescent_black_24dp.xml
│ └── ic_wb_sunny_black_24dp.xml
├── maps/
│ └── drawable-anydpi-v21/
│ ├── ic_add_location_black_24dp.xml
│ ├── ic_beenhere_black_24dp.xml
│ ├── ic_directions_bike_black_24dp.xml
│ ├── ic_directions_black_24dp.xml
│ ├── ic_directions_boat_black_24dp.xml
│ ├── ic_directions_bus_black_24dp.xml
│ ├── ic_directions_car_black_24dp.xml
│ ├── ic_directions_railway_black_24dp.xml
│ ├── ic_directions_run_black_24dp.xml
│ ├── ic_directions_subway_black_24dp.xml
│ ├── ic_directions_transit_black_24dp.xml
│ ├── ic_directions_walk_black_24dp.xml
│ ├── ic_edit_location_black_24dp.xml
│ ├── ic_ev_station_black_24dp.xml
│ ├── ic_flight_black_24dp.xml
│ ├── ic_hotel_black_24dp.xml
│ ├── ic_layers_black_24dp.xml
│ ├── ic_layers_clear_black_24dp.xml
│ ├── ic_local_activity_black_24dp.xml
│ ├── ic_local_airport_black_24dp.xml
│ ├── ic_local_atm_black_24dp.xml
│ ├── ic_local_bar_black_24dp.xml
│ ├── ic_local_cafe_black_24dp.xml
│ ├── ic_local_car_wash_black_24dp.xml
│ ├── ic_local_convenience_store_black_24dp.xml
│ ├── ic_local_dining_black_24dp.xml
│ ├── ic_local_drink_black_24dp.xml
│ ├── ic_local_florist_black_24dp.xml
│ ├── ic_local_gas_station_black_24dp.xml
│ ├── ic_local_grocery_store_black_24dp.xml
│ ├── ic_local_hospital_black_24dp.xml
│ ├── ic_local_hotel_black_24dp.xml
│ ├── ic_local_laundry_service_black_24dp.xml
│ ├── ic_local_library_black_24dp.xml
│ ├── ic_local_mall_black_24dp.xml
│ ├── ic_local_movies_black_24dp.xml
│ ├── ic_local_offer_black_24dp.xml
│ ├── ic_local_parking_black_24dp.xml
│ ├── ic_local_pharmacy_black_24dp.xml
│ ├── ic_local_phone_black_24dp.xml
│ ├── ic_local_pizza_black_24dp.xml
│ ├── ic_local_play_black_24dp.xml
│ ├── ic_local_post_office_black_24dp.xml
│ ├── ic_local_printshop_black_24dp.xml
│ ├── ic_local_see_black_24dp.xml
│ ├── ic_local_shipping_black_24dp.xml
│ ├── ic_local_taxi_black_24dp.xml
│ ├── ic_map_black_24dp.xml
│ ├── ic_my_location_black_24dp.xml
│ ├── ic_navigation_black_24dp.xml
│ ├── ic_near_me_black_24dp.xml
│ ├── ic_person_pin_black_24dp.xml
│ ├── ic_person_pin_circle_black_24dp.xml
│ ├── ic_pin_drop_black_24dp.xml
│ ├── ic_place_black_24dp.xml
│ ├── ic_rate_review_black_24dp.xml
│ ├── ic_restaurant_black_24dp.xml
│ ├── ic_restaurant_menu_black_24dp.xml
│ ├── ic_satellite_black_24dp.xml
│ ├── ic_store_mall_directory_black_24dp.xml
│ ├── ic_streetview_black_24dp.xml
│ ├── ic_subway_black_24dp.xml
│ ├── ic_terrain_black_24dp.xml
│ ├── ic_traffic_black_24dp.xml
│ ├── ic_train_black_24dp.xml
│ ├── ic_tram_black_24dp.xml
│ ├── ic_transfer_within_a_station_black_24dp.xml
│ └── ic_zoom_out_map_black_24dp.xml
├── navigation/
│ └── drawable-anydpi-v21/
│ ├── ic_apps_black_24dp.xml
│ ├── ic_arrow_back_black_24dp.xml
│ ├── ic_arrow_downward_black_24dp.xml
│ ├── ic_arrow_drop_down_black_24dp.xml
│ ├── ic_arrow_drop_down_circle_black_24dp.xml
│ ├── ic_arrow_drop_up_black_24dp.xml
│ ├── ic_arrow_forward_black_24dp.xml
│ ├── ic_arrow_upward_black_24dp.xml
│ ├── ic_cancel_black_24dp.xml
│ ├── ic_check_black_24dp.xml
│ ├── ic_chevron_left_black_24dp.xml
│ ├── ic_chevron_right_black_24dp.xml
│ ├── ic_close_black_24dp.xml
│ ├── ic_expand_less_black_24dp.xml
│ ├── ic_expand_more_black_24dp.xml
│ ├── ic_first_page_black_24dp.xml
│ ├── ic_fullscreen_black_24dp.xml
│ ├── ic_fullscreen_exit_black_24dp.xml
│ ├── ic_last_page_black_24dp.xml
│ ├── ic_menu_black_24dp.xml
│ ├── ic_more_horiz_black_24dp.xml
│ ├── ic_more_vert_black_24dp.xml
│ ├── ic_refresh_black_24dp.xml
│ ├── ic_subdirectory_arrow_left_black_24dp.xml
│ ├── ic_subdirectory_arrow_right_black_24dp.xml
│ ├── ic_unfold_less_black_24dp.xml
│ └── ic_unfold_more_black_24dp.xml
├── notification/
│ └── drawable-anydpi-v21/
│ ├── ic_adb_black_24dp.xml
│ ├── ic_airline_seat_flat_angled_black_24dp.xml
│ ├── ic_airline_seat_flat_black_24dp.xml
│ ├── ic_airline_seat_individual_suite_black_24dp.xml
│ ├── ic_airline_seat_legroom_extra_black_24dp.xml
│ ├── ic_airline_seat_legroom_normal_black_24dp.xml
│ ├── ic_airline_seat_legroom_reduced_black_24dp.xml
│ ├── ic_airline_seat_recline_extra_black_24dp.xml
│ ├── ic_airline_seat_recline_normal_black_24dp.xml
│ ├── ic_bluetooth_audio_black_24dp.xml
│ ├── ic_confirmation_number_black_24dp.xml
│ ├── ic_disc_full_black_24dp.xml
│ ├── ic_do_not_disturb_alt_black_24dp.xml
│ ├── ic_do_not_disturb_black_24dp.xml
│ ├── ic_do_not_disturb_off_black_24dp.xml
│ ├── ic_do_not_disturb_on_black_24dp.xml
│ ├── ic_drive_eta_black_24dp.xml
│ ├── ic_enhanced_encryption_black_24dp.xml
│ ├── ic_event_available_black_24dp.xml
│ ├── ic_event_busy_black_24dp.xml
│ ├── ic_event_note_black_24dp.xml
│ ├── ic_folder_special_black_24dp.xml
│ ├── ic_live_tv_black_24dp.xml
│ ├── ic_mms_black_24dp.xml
│ ├── ic_more_black_24dp.xml
│ ├── ic_network_check_black_24dp.xml
│ ├── ic_network_locked_black_24dp.xml
│ ├── ic_no_encryption_black_24dp.xml
│ ├── ic_ondemand_video_black_24dp.xml
│ ├── ic_personal_video_black_24dp.xml
│ ├── ic_phone_bluetooth_speaker_black_24dp.xml
│ ├── ic_phone_forwarded_black_24dp.xml
│ ├── ic_phone_in_talk_black_24dp.xml
│ ├── ic_phone_locked_black_24dp.xml
│ ├── ic_phone_missed_black_24dp.xml
│ ├── ic_phone_paused_black_24dp.xml
│ ├── ic_power_black_24dp.xml
│ ├── ic_priority_high_black_24dp.xml
│ ├── ic_rv_hookup_black_24dp.xml
│ ├── ic_sd_card_black_24dp.xml
│ ├── ic_sim_card_alert_black_24dp.xml
│ ├── ic_sms_black_24dp.xml
│ ├── ic_sms_failed_black_24dp.xml
│ ├── ic_sync_black_24dp.xml
│ ├── ic_sync_disabled_black_24dp.xml
│ ├── ic_sync_problem_black_24dp.xml
│ ├── ic_system_update_black_24dp.xml
│ ├── ic_tap_and_play_black_24dp.xml
│ ├── ic_time_to_leave_black_24dp.xml
│ ├── ic_vibration_black_24dp.xml
│ ├── ic_voice_chat_black_24dp.xml
│ ├── ic_vpn_lock_black_24dp.xml
│ ├── ic_wc_black_24dp.xml
│ └── ic_wifi_black_24dp.xml
├── places/
│ └── drawable-anydpi-v21/
│ ├── ic_ac_unit_black_24dp.xml
│ ├── ic_airport_shuttle_black_24dp.xml
│ ├── ic_all_inclusive_black_24dp.xml
│ ├── ic_beach_access_black_24dp.xml
│ ├── ic_business_center_black_24dp.xml
│ ├── ic_casino_black_24dp.xml
│ ├── ic_child_care_black_24dp.xml
│ ├── ic_child_friendly_black_24dp.xml
│ ├── ic_fitness_center_black_24dp.xml
│ ├── ic_free_breakfast_black_24dp.xml
│ ├── ic_golf_course_black_24dp.xml
│ ├── ic_hot_tub_black_24dp.xml
│ ├── ic_kitchen_black_24dp.xml
│ ├── ic_pool_black_24dp.xml
│ ├── ic_room_service_black_24dp.xml
│ ├── ic_rv_hookup_black_24dp.xml
│ ├── ic_smoke_free_black_24dp.xml
│ ├── ic_smoking_rooms_black_24dp.xml
│ └── ic_spa_black_24dp.xml
├── social/
│ └── drawable-anydpi-v21/
│ ├── ic_cake_black_24dp.xml
│ ├── ic_domain_black_24dp.xml
│ ├── ic_group_add_black_24dp.xml
│ ├── ic_group_black_24dp.xml
│ ├── ic_location_city_black_24dp.xml
│ ├── ic_mood_bad_black_24dp.xml
│ ├── ic_mood_black_24dp.xml
│ ├── ic_notifications_active_black_24dp.xml
│ ├── ic_notifications_black_24dp.xml
│ ├── ic_notifications_none_black_24dp.xml
│ ├── ic_notifications_off_black_24dp.xml
│ ├── ic_notifications_paused_black_24dp.xml
│ ├── ic_pages_black_24dp.xml
│ ├── ic_party_mode_black_24dp.xml
│ ├── ic_people_black_24dp.xml
│ ├── ic_people_outline_black_24dp.xml
│ ├── ic_person_add_black_24dp.xml
│ ├── ic_person_black_24dp.xml
│ ├── ic_person_outline_black_24dp.xml
│ ├── ic_plus_one_black_24dp.xml
│ ├── ic_poll_black_24dp.xml
│ ├── ic_public_black_24dp.xml
│ ├── ic_school_black_24dp.xml
│ ├── ic_sentiment_dissatisfied_black_24dp.xml
│ ├── ic_sentiment_neutral_black_24dp.xml
│ ├── ic_sentiment_satisfied_black_24dp.xml
│ ├── ic_sentiment_very_dissatisfied_black_24dp.xml
│ ├── ic_sentiment_very_satisfied_black_24dp.xml
│ ├── ic_share_black_24dp.xml
│ └── ic_whatshot_black_24dp.xml
└── toggle/
└── drawable-anydpi-v21/
├── ic_check_box_black_24dp.xml
├── ic_check_box_outline_blank_black_24dp.xml
├── ic_indeterminate_check_box_black_24dp.xml
├── ic_radio_button_checked_black_24dp.xml
├── ic_radio_button_unchecked_black_24dp.xml
├── ic_star_black_24dp.xml
├── ic_star_border_black_24dp.xml
└── ic_star_half_black_24dp.xml
SYMBOL INDEX (779 symbols across 64 files)
FILE: json_generator/json_generator.py
function convert_image (line 14) | def convert_image(file):
function convert_images (line 30) | def convert_images():
function get_android_icons_file (line 48) | def get_android_icons_file(color, resolution, name):
function handle_android_icons (line 56) | def handle_android_icons():
function list_dirs_only (line 84) | def list_dirs_only(dir):
function list_images (line 88) | def list_images(dir):
function extract_data (line 92) | def extract_data(icon_file_name):
function get_material_icons_file (line 103) | def get_material_icons_file(category, color, size, resolution, name):
function handle_material_icons (line 111) | def handle_material_icons():
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/IProjectSettingsComponent.java
type IProjectSettingsComponent (line 5) | public interface IProjectSettingsComponent extends ProjectComponent {
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/IconApplication.java
class IconApplication (line 29) | public class IconApplication implements ApplicationComponent {
method getComponentName (line 35) | @NotNull
method initComponent (line 41) | @Override
method disposeComponent (line 104) | @Override
method getControllerFactory (line 110) | public IControllerFactory getControllerFactory() {
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/ProjectSettingsComponent.java
class ProjectSettingsComponent (line 9) | public class ProjectSettingsComponent extends AbstractProjectComponent i...
method ProjectSettingsComponent (line 12) | protected ProjectSettingsComponent(Project project) {
method projectOpened (line 16) | @Override
method initComponent (line 21) | @Override
method disposeComponent (line 28) | @Override
method getComponentName (line 34) | @NotNull
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/actions/AndroidAssetUtilsGroup.java
class AndroidAssetUtilsGroup (line 20) | public class AndroidAssetUtilsGroup extends DefaultActionGroup {
method update (line 21) | @Override
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/actions/AndroidBatchImportAction.java
class AndroidBatchImportAction (line 26) | public class AndroidBatchImportAction extends AnAction {
method AndroidBatchImportAction (line 28) | public AndroidBatchImportAction() {
method actionPerformed (line 34) | @Override
method update (line 43) | @Override
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/actions/AndroidMultiDrawableAction.java
class AndroidMultiDrawableAction (line 26) | public class AndroidMultiDrawableAction extends AnAction {
method AndroidMultiDrawableAction (line 28) | public AndroidMultiDrawableAction() {
method actionPerformed (line 34) | @Override
method update (line 43) | @Override
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/actions/IconsAction.java
class IconsAction (line 26) | public class IconsAction extends AnAction {
method IconsAction (line 28) | public IconsAction() {
method actionPerformed (line 34) | @Override
method update (line 43) | @Override
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/actions/VectorsAction.java
class VectorsAction (line 26) | public class VectorsAction extends AnAction {
method VectorsAction (line 28) | public VectorsAction() {
method actionPerformed (line 34) | @Override
method update (line 43) | @Override
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/DefaultControllerFactory.java
class DefaultControllerFactory (line 15) | public class DefaultControllerFactory implements IControllerFactory {
method DefaultControllerFactory (line 23) | public DefaultControllerFactory(IconPack androidIcons,
method setProject (line 29) | @Override
method getAndroidIconsController (line 38) | @Override
method getMaterialIconsController (line 43) | @Override
method getDefaultsController (line 48) | @Override
method getSettingsController (line 56) | @Override
method tearDown (line 64) | @Override
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/IController.java
type IController (line 3) | public interface IController<T> {
method addObserver (line 4) | void addObserver(T observer);
method removeObserver (line 6) | void removeObserver(T observer);
method tearDown (line 8) | void tearDown();
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/IControllerFactory.java
type IControllerFactory (line 9) | public interface IControllerFactory {
method setProject (line 11) | void setProject(Project project);
method getAndroidIconsController (line 13) | IAndroidIconsController getAndroidIconsController();
method getMaterialIconsController (line 15) | IMaterialIconsController getMaterialIconsController();
method getDefaultsController (line 17) | IDefaultsController getDefaultsController();
method getSettingsController (line 19) | ISettingsController getSettingsController();
method tearDown (line 21) | void tearDown();
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/batchscale/BatchScaleImporterController.java
class BatchScaleImporterController (line 19) | public class BatchScaleImporterController implements IBatchScaleImporter...
method BatchScaleImporterController (line 26) | public BatchScaleImporterController() {
method addObserver (line 42) | @Override
method removeObserver (line 48) | @Override
method tearDown (line 53) | @Override
method addImage (line 58) | @Override
method editImages (line 71) | @Override
method removeImages (line 111) | @Override
method removeImage (line 122) | @Override
method getImageCount (line 134) | @Override
method getImage (line 139) | @Override
method getTargetResolutions (line 149) | @Override
method getExportTask (line 163) | @Override
method notifyUpdated (line 175) | private void notifyUpdated() {
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/batchscale/BatchScaleImporterObserver.java
type BatchScaleImporterObserver (line 3) | public interface BatchScaleImporterObserver {
method updated (line 4) | void updated();
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/batchscale/IBatchScaleImporterController.java
type IBatchScaleImporterController (line 12) | public interface IBatchScaleImporterController extends IController<Batch...
method addImage (line 14) | void addImage(Resolution sourceResolution, List<ImageInformation> imag...
method editImages (line 16) | void editImages(Project project, Module module, int[] indices);
method removeImages (line 18) | void removeImages(int[] indices);
method removeImage (line 20) | void removeImage(String sourcePath);
method getImageCount (line 22) | int getImageCount();
method getImage (line 24) | ImageInformation getImage(int index);
method getTargetResolutions (line 26) | List<Resolution> getTargetResolutions(ImageInformation information);
method getExportTask (line 28) | RefactoringTask getExportTask(Project project);
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/batchscale/additem/AddItemBatchScaleDialogObserver.java
type AddItemBatchScaleDialogObserver (line 3) | public interface AddItemBatchScaleDialogObserver {
method updated (line 4) | void updated();
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/batchscale/additem/AddItemBatchScaleImporterController.java
class AddItemBatchScaleImporterController (line 23) | public class AddItemBatchScaleImporterController implements IAddItemBatc...
method AddItemBatchScaleImporterController (line 42) | public AddItemBatchScaleImporterController(IDefaultsController default...
method AddItemBatchScaleImporterController (line 60) | public AddItemBatchScaleImporterController(Resolution sourceResolution,
method init (line 83) | private void init(File file) {
method getExportName (line 97) | @Override
method getExportPath (line 102) | @Override
method getTargetResolutions (line 107) | @Override
method getTargetWidth (line 112) | @Override
method getTargetHeight (line 117) | @Override
method getAlgorithm (line 122) | @Override
method getMethod (line 127) | @Override
method getImageFile (line 132) | @Override
method setSourceResolution (line 137) | @Override
method getSourceResolution (line 143) | @Override
method addTargetResolution (line 148) | @Override
method removeTargetResolution (line 157) | @Override
method setTargetHeight (line 166) | @Override
method setTargetWidth (line 176) | @Override
method setTargetRoot (line 186) | @Override
method setExportName (line 195) | @Override
method setAlgorithm (line 204) | @Override
method setMethod (line 214) | @Override
method getMethods (line 223) | @Override
method getFormat (line 228) | @Override
method isNinePatch (line 233) | @Override
method setFormat (line 238) | @Override
method getDestination (line 247) | @Override
method setDestination (line 252) | @Override
method getScaledSize (line 262) | @Override
method getImageInformation (line 268) | @Override
method getImageInformation (line 290) | @Override
method getRealScaleFactor (line 311) | private float getRealScaleFactor(Resolution targetResolution) {
method getOriginalTargetSize (line 317) | private int getOriginalTargetSize(Resolution sourceResolution, Resolut...
method addObserver (line 323) | @Override
method removeObserver (line 329) | @Override
method tearDown (line 334) | @Override
method notifyUpdated (line 339) | private void notifyUpdated() {
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/batchscale/additem/IAddItemBatchScaleImporterController.java
type IAddItemBatchScaleImporterController (line 15) | public interface IAddItemBatchScaleImporterController extends IControlle...
method getExportName (line 16) | String getExportName();
method getExportPath (line 18) | String getExportPath();
method getTargetResolutions (line 20) | Set<Resolution> getTargetResolutions();
method getTargetWidth (line 22) | int getTargetWidth();
method getTargetHeight (line 24) | int getTargetHeight();
method getAlgorithm (line 26) | ResizeAlgorithm getAlgorithm();
method getMethod (line 28) | String getMethod();
method getImageFile (line 30) | File getImageFile();
method setSourceResolution (line 32) | void setSourceResolution(Resolution resolution);
method getSourceResolution (line 34) | Resolution getSourceResolution();
method addTargetResolution (line 36) | void addTargetResolution(Resolution resolution);
method removeTargetResolution (line 38) | void removeTargetResolution(Resolution resolution);
method setTargetHeight (line 40) | void setTargetHeight(int height);
method setTargetWidth (line 42) | void setTargetWidth(int width);
method setTargetRoot (line 44) | void setTargetRoot(String path);
method setExportName (line 46) | void setExportName(String name);
method setAlgorithm (line 48) | void setAlgorithm(ResizeAlgorithm algorithm);
method setMethod (line 50) | void setMethod(String method);
method setFormat (line 52) | void setFormat(Format format);
method setDestination (line 54) | void setDestination(Destination destination);
method getMethods (line 56) | List<String> getMethods();
method getFormat (line 58) | Format getFormat();
method getDestination (line 60) | Destination getDestination();
method isNinePatch (line 62) | boolean isNinePatch();
method getScaledSize (line 64) | int[] getScaledSize(Resolution resolution);
method getImageInformation (line 66) | List<ImageInformation> getImageInformation(Project project);
method getImageInformation (line 68) | List<ImageInformation> getImageInformation(Project project,
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/defaults/DefaultsController.java
class DefaultsController (line 14) | public class DefaultsController implements IDefaultsController {
method DefaultsController (line 41) | public DefaultsController(ISettingsController settingsController) {
method getResolutions (line 45) | @Override
method setResolutions (line 50) | @Override
method getImageAsset (line 56) | @Override
method setImageAsset (line 61) | @Override
method getSourceResolution (line 67) | @Override
method setSourceResolution (line 72) | @Override
method getSize (line 78) | @Override
method setSize (line 83) | @Override
method getColor (line 89) | @Override
method setColor (line 94) | @Override
method getAlgorithm (line 100) | @Override
method setAlgorithm (line 105) | @Override
method getMethod (line 111) | @Override
method setMethod (line 116) | @Override
method getFormat (line 122) | @Override
method setFormat (line 127) | @Override
method getDestination (line 133) | @Override
method setDestination (line 138) | @Override
method restore (line 144) | @Override
method tearDown (line 157) | @Override
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/defaults/IDefaultsController.java
type IDefaultsController (line 11) | public interface IDefaultsController {
method getResolutions (line 12) | Set<Resolution> getResolutions();
method setResolutions (line 13) | void setResolutions(Set<Resolution> resolutions);
method getImageAsset (line 15) | ImageAsset getImageAsset();
method setImageAsset (line 16) | void setImageAsset(ImageAsset imageAsset);
method getSourceResolution (line 18) | Resolution getSourceResolution();
method setSourceResolution (line 19) | void setSourceResolution(Resolution sourceResolution);
method getSize (line 21) | String getSize();
method setSize (line 22) | void setSize(String size);
method getColor (line 24) | String getColor();
method setColor (line 25) | void setColor(String color);
method getAlgorithm (line 27) | ResizeAlgorithm getAlgorithm();
method setAlgorithm (line 28) | void setAlgorithm(ResizeAlgorithm algorithm);
method getMethod (line 30) | String getMethod();
method setMethod (line 31) | void setMethod(String method);
method getFormat (line 33) | Format getFormat();
method setFormat (line 34) | void setFormat(Format format);
method getDestination (line 36) | Destination getDestination();
method setDestination (line 37) | void setDestination(Destination destination);
method restore (line 39) | void restore();
method tearDown (line 40) | void tearDown();
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/iconimporter/IIconsImporterController.java
type IIconsImporterController (line 15) | public interface IIconsImporterController extends IController<IconsImpor...
method setExportRoot (line 16) | void setExportRoot(String exportRoot);
method setSelectedIconPack (line 18) | void setSelectedIconPack(String iconPack);
method setSelectedCategory (line 20) | void setSelectedCategory(String category);
method setSelectedAsset (line 22) | void setSelectedAsset(ImageAsset asset);
method setSelectedSize (line 24) | void setSelectedSize(String size);
method setSelectedColor (line 26) | void setSelectedColor(String color);
method setExportName (line 28) | void setExportName(String exportName);
method getExportName (line 30) | String getExportName();
method getExportRoot (line 32) | String getExportRoot();
method getImageFile (line 34) | File getImageFile(ImageAsset asset, String color, Resolution resolution);
method getThumbnailFile (line 36) | File getThumbnailFile(ImageAsset asset);
method getSelectedImageFile (line 38) | File getSelectedImageFile();
method getSelectedAsset (line 40) | ImageAsset getSelectedAsset();
method getSelectedImageFile (line 42) | File getSelectedImageFile(Resolution resolution);
method getCategories (line 44) | List<String> getCategories();
method getAssets (line 46) | List<ImageAsset> getAssets();
method getSizes (line 48) | List<String> getSizes();
method getColors (line 50) | List<String> getColors();
method getSelectedSize (line 52) | String getSelectedSize();
method getSelectedColor (line 54) | String getSelectedColor();
method getSelectedIconPack (line 56) | IIconPackController getSelectedIconPack();
method getSelectedCategory (line 58) | String getSelectedCategory();
method setFormat (line 60) | void setFormat(Format format);
method isNinePatch (line 62) | boolean isNinePatch();
method getFormat (line 64) | Format getFormat();
method getTask (line 66) | RefactoringTask getTask(Project project);
method setExportResolution (line 68) | void setExportResolution(Resolution resolution, boolean export);
method getExportResolutions (line 70) | Set<Resolution> getExportResolutions();
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/iconimporter/IconsImporterController.java
class IconsImporterController (line 23) | public class IconsImporterController implements IIconsImporterController {
method IconsImporterController (line 37) | public IconsImporterController(IDefaultsController defaultsController,
method IconsImporterController (line 59) | public IconsImporterController(IDefaultsController defaultsController,
method addObserver (line 79) | @Override
method removeObserver (line 85) | @Override
method tearDown (line 90) | @Override
method setExportRoot (line 95) | @Override
method setSelectedIconPack (line 104) | @Override
method getControllerForIconPackId (line 116) | @NotNull
method setSelectedCategory (line 130) | @Override
method setSelectedAsset (line 140) | @Override
method updateColorAndSize (line 147) | private void updateColorAndSize() {
method setSelectedSize (line 156) | @Override
method setSelectedColor (line 169) | @Override
method setExportName (line 182) | @Override
method getExportName (line 194) | @Override
method getExportRoot (line 199) | @Override
method getImageFile (line 204) | @Override
method getThumbnailFile (line 209) | @Override
method getSelectedImageFile (line 215) | @Override
method getSelectedImageFile (line 220) | @Override
method getCategories (line 226) | @Override
method getAssets (line 231) | @Override
method getSizes (line 236) | @Override
method getColors (line 241) | @Override
method getSelectedAsset (line 246) | @Override
method getSelectedSize (line 251) | @Override
method getSelectedColor (line 256) | @Override
method getSelectedIconPack (line 261) | @Override
method getSelectedCategory (line 266) | @Override
method setFormat (line 271) | @Override
method isNinePatch (line 280) | @Override
method getFormat (line 285) | @Override
method getTask (line 290) | @Override
method setExportResolution (line 323) | @Override
method getExportResolutions (line 332) | @Override
method notifyUpdated (line 337) | private void notifyUpdated() {
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/iconimporter/IconsImporterObserver.java
type IconsImporterObserver (line 3) | public interface IconsImporterObserver {
method updated (line 4) | void updated();
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/icons/IIconPackController.java
type IIconPackController (line 10) | public interface IIconPackController {
method getId (line 12) | String getId();
method getAssets (line 14) | List<ImageAsset> getAssets(String category);
method getAssets (line 16) | List<ImageAsset> getAssets(List<String> categories);
method getImageFile (line 18) | File getImageFile(ImageAsset asset, String color, Resolution resolution);
method getImageFile (line 20) | File getImageFile(ImageAsset asset, String color, String size, Resolut...
method tearDown (line 22) | void tearDown();
method getCategories (line 24) | List<String> getCategories();
method getIconPack (line 26) | IconPack getIconPack();
method supportsVectors (line 28) | boolean supportsVectors();
method getThumbnailResolution (line 30) | Resolution getThumbnailResolution();
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/icons/androidicons/AndroidIconsController.java
class AndroidIconsController (line 12) | public class AndroidIconsController implements IAndroidIconsController {
method AndroidIconsController (line 16) | public AndroidIconsController(IconPack iconPack) {
method getId (line 20) | @Override
method getIconPack (line 25) | @Override
method supportsVectors (line 30) | @Override
method getThumbnailResolution (line 35) | @Override
method getAssets (line 40) | @Override
method getAssets (line 45) | @Override
method getCategories (line 50) | @Override
method getImageFile (line 55) | @Override
method getImageFile (line 60) | @Override
method tearDown (line 72) | @Override
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/icons/androidicons/IAndroidIconsController.java
type IAndroidIconsController (line 5) | public interface IAndroidIconsController extends IIconPackController {
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/icons/materialicons/IMaterialIconsController.java
type IMaterialIconsController (line 5) | public interface IMaterialIconsController extends IIconPackController {
method openHelp (line 6) | void openHelp();
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/icons/materialicons/MaterialIconsController.java
class MaterialIconsController (line 17) | public class MaterialIconsController implements IMaterialIconsController {
method MaterialIconsController (line 22) | public MaterialIconsController(IconPack iconPack) {
method initCategoryMap (line 27) | private HashMap<String, List<ImageAsset>> initCategoryMap(IconPack ico...
method getId (line 41) | @Override
method getIconPack (line 46) | @Override
method supportsVectors (line 51) | @Override
method getThumbnailResolution (line 56) | @Override
method getAssets (line 61) | @Override
method getAssets (line 66) | @Override
method getCategories (line 71) | @Override
method openHelp (line 76) | @Override
method getImageFile (line 81) | @Override
method getImageFile (line 86) | @Override
method getImageFilePath (line 97) | private String getImageFilePath(ImageAsset asset, String color, String...
method getVectorFilePath (line 106) | private String getVectorFilePath(ImageAsset asset) {
method tearDown (line 113) | @Override
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/multi/IMultiImporterController.java
type IMultiImporterController (line 14) | public interface IMultiImporterController extends IController<MultiImpor...
method getTargetRoot (line 16) | String getTargetRoot();
method setTargetRoot (line 18) | void setTargetRoot(File path);
method addImage (line 20) | void addImage(File source, Resolution target);
method getTask (line 22) | RefactoringTask getTask(Project project);
method addZipImage (line 24) | void addZipImage(File file, Resolution resolution);
method getZipImages (line 26) | Map<Resolution, List<ImageInformation>> getZipImages();
method resetZipInformation (line 28) | void resetZipInformation();
method getZipTask (line 30) | RefactoringTask getZipTask(Project project, File tempDir);
method setExportName (line 32) | void setExportName(String exportName);
method getExportName (line 34) | String getExportName();
method getMostRecentImage (line 36) | File getMostRecentImage();
method setMostRecentImage (line 38) | void setMostRecentImage(Resolution resolution);
method containsNinePatch (line 40) | boolean containsNinePatch();
method getFormat (line 42) | Format getFormat();
method setFormat (line 44) | void setFormat(Format format);
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/multi/MultiImporterController.java
class MultiImporterController (line 23) | public class MultiImporterController implements IMultiImporterController {
method MultiImporterController (line 33) | public MultiImporterController(IDefaultsController defaultsController) {
method addObserver (line 40) | @Override
method removeObserver (line 46) | @Override
method getTargetRoot (line 51) | @Override
method setTargetRoot (line 56) | @Override
method addImage (line 65) | @Override
method addZipImage (line 80) | @Override
method getZipImages (line 96) | @Override
method resetZipInformation (line 101) | @Override
method getTask (line 106) | @Override
method getZipTask (line 119) | @Override
method setExportName (line 132) | @Override
method getExportName (line 141) | @Override
method getMostRecentImage (line 146) | @Override
method setMostRecentImage (line 154) | @Override
method notifyUpdated (line 163) | private void notifyUpdated() {
method containsNinePatch (line 169) | @Override
method getFormat (line 179) | @Override
method setFormat (line 184) | @Override
method tearDown (line 193) | @Override
class ZipRefactoringTask (line 198) | private static class ZipRefactoringTask extends RefactoringTask {
method ZipRefactoringTask (line 201) | public ZipRefactoringTask(Project project, File tempDir) {
method shouldStartInBackground (line 206) | @Override
method onPostExecute (line 211) | @Override
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/multi/MultiImporterObserver.java
type MultiImporterObserver (line 3) | public interface MultiImporterObserver {
method updated (line 4) | void updated();
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/settings/ISettingsController.java
type ISettingsController (line 14) | public interface ISettingsController extends IController<SettingsObserve...
method saveResRootForProject (line 15) | void saveResRootForProject(String fileUrl);
method getResourceRoot (line 16) | VirtualFile getResourceRoot();
method getResourceRootPath (line 17) | String getResourceRootPath();
method getLastImageFolder (line 19) | String getLastImageFolder();
method saveLastImageFolder (line 20) | void saveLastImageFolder(String fileUrl);
method setProject (line 22) | void setProject(Project project);
method saveResolutions (line 24) | void saveResolutions(Set<Resolution> resolutions);
method getResolutions (line 25) | Set<Resolution> getResolutions(Set<Resolution> defaultResolutions);
method saveSourceResolution (line 27) | void saveSourceResolution(Resolution sourceResolution);
method getSourceResolution (line 28) | Resolution getSourceResolution(Resolution defaultSourceResolution);
method saveAlgorithm (line 30) | void saveAlgorithm(ResizeAlgorithm algorithm);
method getAlgorithm (line 31) | ResizeAlgorithm getAlgorithm(ResizeAlgorithm defaultAlgorithm);
method saveMethod (line 33) | void saveMethod(String method);
method getMethod (line 34) | String getMethod(String defaultMethod);
method saveColor (line 36) | void saveColor(String color);
method getColor (line 37) | String getColor();
method saveSize (line 39) | void saveSize(String size);
method getSize (line 40) | String getSize();
method saveImageAsset (line 42) | void saveImageAsset(ImageAsset imageAsset);
method getImageAsset (line 43) | ImageAsset getImageAsset();
method saveFormat (line 45) | void saveFormat(Format format);
method getFormat (line 46) | Format getFormat(Format defaultFormat);
method saveDestination (line 48) | void saveDestination(Destination destination);
method getDestination (line 49) | Destination getDestination(Destination defaultDestination);
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/settings/SettingsController.java
class SettingsController (line 25) | public class SettingsController implements ISettingsController {
method SettingsController (line 42) | public SettingsController() {
method addObserver (line 46) | @Override
method removeObserver (line 51) | @Override
method saveResRootForProject (line 56) | @Override
method getResourceRoot (line 62) | @Override
method getResourceRootPath (line 72) | @Override
method getLastImageFolder (line 78) | @Override
method saveLastImageFolder (line 84) | @Override
method setProject (line 90) | @Override
method saveResolutions (line 95) | @Override
method getResolutions (line 107) | @Override
method saveSourceResolution (line 128) | @Override
method getSourceResolution (line 133) | @Override
method saveAlgorithm (line 138) | @Override
method getAlgorithm (line 143) | @Override
method saveMethod (line 148) | @Override
method getMethod (line 153) | @Override
method saveColor (line 158) | @Override
method getColor (line 163) | @Override
method saveSize (line 168) | @Override
method getSize (line 173) | @Override
method saveImageAsset (line 178) | @Override
method getImageAsset (line 207) | @Override
method saveFormat (line 229) | @Override
method getFormat (line 234) | @Override
method saveDestination (line 239) | @Override
method getDestination (line 244) | @Override
method getOrDefault (line 249) | private String getOrDefault(String key, String defaultValue) {
method updateOrDelete (line 257) | private void updateOrDelete(String key, Object value) {
method tearDown (line 266) | @Override
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/settings/SettingsObserver.java
type SettingsObserver (line 3) | public interface SettingsObserver {
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/dialogs/AddItemBatchScaleDialog.java
class AddItemBatchScaleDialog (line 43) | public class AddItemBatchScaleDialog extends DialogWrapper implements Ad...
method actionPerformed (line 70) | @Override
method actionPerformed (line 78) | @Override
method actionPerformed (line 86) | @Override
method actionPerformed (line 94) | @Override
method propertyChange (line 106) | @Override
method actionPerformed (line 117) | @Override
method actionPerformed (line 126) | @Override
method AddItemBatchScaleDialog (line 137) | public AddItemBatchScaleDialog(final Project project,
method AddItemBatchScaleDialog (line 164) | public AddItemBatchScaleDialog(final Project project,
method initInternal (line 179) | private void initInternal() {
method initTargetRoot (line 188) | private void initTargetRoot() {
method initCheckBoxes (line 198) | private void initCheckBoxes() {
method initExportRoot (line 208) | private void initExportRoot() {
method initExportName (line 218) | private void initExportName() {
method initController (line 228) | private void initController(File file) {
method initRequiredControllers (line 239) | private void initRequiredControllers() {
method initController (line 245) | private void initController(Resolution sourceResolution, List<ImageInf...
method createCenterPanel (line 249) | @Nullable
method doOKAction (line 255) | @Override
method updated (line 270) | @Override
method updateAlgorithms (line 283) | private void updateAlgorithms() {
method updateAlgorithmMethod (line 293) | private void updateAlgorithmMethod() {
method updateFormat (line 305) | private void updateFormat() {
method updateDestination (line 316) | private void updateDestination() {
method updateTargetSize (line 326) | private void updateTargetSize() {
method updateSourceResolution (line 337) | private void updateSourceResolution() {
method updateSource (line 347) | private void updateSource() {
method updateTargetResolutions (line 352) | private void updateTargetResolutions() {
method updateImage (line 370) | private void updateImage(final File file) {
method createUIComponents (line 386) | private void createUIComponents() {
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/dialogs/AndroidBatchScaleImporter.java
class AndroidBatchScaleImporter (line 72) | public class AndroidBatchScaleImporter extends DialogWrapper implements ...
method consume (line 86) | @Override
method AndroidBatchScaleImporter (line 114) | public AndroidBatchScaleImporter(final Project project, final Module m...
method initButtons (line 131) | private void initButtons(final Project project) {
method initDragDrop (line 152) | private void initDragDrop() {
method addMultipleFiles (line 171) | private void addMultipleFiles(List<VirtualFile> virtualFiles, final Pr...
method addSingleFileImmediately (line 193) | private void addSingleFileImmediately(VirtualFile file) {
method addSingleFile (line 218) | private void addSingleFile(VirtualFile file) {
method initTable (line 227) | private void initTable() {
method initRenderers (line 236) | private void initRenderers() {
method initRowSelection (line 277) | private void initRowSelection() {
method initColumnSizes (line 298) | private void initColumnSizes() {
method updateImage (line 313) | private void updateImage(ImageInformation item) {
method getInitialFile (line 324) | protected VirtualFile getInitialFile() {
method expandPath (line 344) | private String expandPath(String dirName) {
method createCenterPanel (line 354) | @Nullable
method createUIComponents (line 360) | private void createUIComponents() {
method getIcon (line 375) | @NotNull
method doOKAction (line 382) | @Override
method updated (line 389) | @Override public void updated() {
method updateTable (line 398) | private void updateTable() {
class ImageTableModel (line 413) | private static class ImageTableModel extends AbstractTableModel {
method ImageTableModel (line 420) | public ImageTableModel(IBatchScaleImporterController controller) {
method getRowCount (line 424) | @Override
method getColumnCount (line 429) | @Override
method getColumnName (line 434) | @Override
method getValueAt (line 439) | @Override
method getColumnClass (line 455) | @Override
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/dialogs/AndroidMultiDrawableImporter.java
class AndroidMultiDrawableImporter (line 71) | public class AndroidMultiDrawableImporter extends DialogWrapper implemen...
method isFileVisible (line 79) | @Override
method isFileSelectable (line 84) | @Override
method isZip (line 89) | private boolean isZip(String name) {
method actionPerformed (line 122) | @Override
method AndroidMultiDrawableImporter (line 132) | public AndroidMultiDrawableImporter(final Project project, final Modul...
method doValidate (line 156) | @Nullable
method doOKAction (line 170) | @Override
method updated (line 179) | @Override
method updateFormat (line 187) | private void updateFormat() {
method updateTargetRoot (line 198) | private void updateTargetRoot() {
method updateName (line 206) | private void updateName() {
method updateImage (line 220) | private void updateImage() {
method createCenterPanel (line 228) | @Nullable
method initResourceRoot (line 234) | private void initResourceRoot() {
method initBrowser (line 244) | private void initBrowser(final Resolution resolution, final FileBrowse...
method createUIComponents (line 260) | private void createUIComponents() {
method createDefaultActions (line 271) | @Override
method getZipImportAction (line 277) | protected final Action getZipImportAction() {
method openZipArchive (line 281) | private void openZipArchive() {
method importZipArchive (line 299) | private void importZipArchive(VirtualFile virtualFile) {
method getInitialFile (line 393) | private VirtualFile getInitialFile() {
method expandPath (line 413) | private String expandPath(String dirName) {
method createActions (line 423) | @Override
class ZipImportAction (line 436) | private class ZipImportAction extends AbstractAction {
method ZipImportAction (line 437) | public ZipImportAction() {
method actionPerformed (line 441) | public void actionPerformed(ActionEvent e) {
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/dialogs/EditItemsBatchScaleDialog.java
class EditItemsBatchScaleDialog (line 33) | public class EditItemsBatchScaleDialog extends DialogWrapper implements ...
method actionPerformed (line 57) | @Override
method actionPerformed (line 65) | @Override
method actionPerformed (line 73) | @Override
method actionPerformed (line 81) | @Override
method actionPerformed (line 93) | @Override
method EditItemsBatchScaleDialog (line 103) | public EditItemsBatchScaleDialog(final Project project,
method initInternal (line 122) | private void initInternal() {
method initTargetRoot (line 132) | private void initTargetRoot() {
method initAlgorithms (line 142) | private void initAlgorithms() {
method initCheckBoxes (line 148) | private void initCheckBoxes() {
method initExportRoot (line 158) | private void initExportRoot() {
method initRequiredControllers (line 168) | private void initRequiredControllers() {
method initController (line 174) | private void initController(Resolution sourceResolution, List<ImageInf...
method createCenterPanel (line 178) | @Nullable
method doOKAction (line 184) | @Override
method updated (line 205) | @Override
method updateFormat (line 214) | private void updateFormat() {
method updateAlgorithms (line 224) | private void updateAlgorithms() {
method updateAlgorithmMethod (line 234) | private void updateAlgorithmMethod() {
method updateSourceResolution (line 246) | private void updateSourceResolution() {
method updateTargetResolutions (line 256) | private void updateTargetResolutions() {
method createUIComponents (line 272) | private void createUIComponents() {
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/dialogs/IconImporter.java
class IconImporter (line 65) | public class IconImporter extends DialogWrapper implements IconsImporter...
method actionPerformed (line 96) | @Override
method actionPerformed (line 104) | @Override
method actionPerformed (line 112) | @Override
method actionPerformed (line 120) | @Override
method actionPerformed (line 128) | @Override
method actionPerformed (line 136) | @Override
method actionPerformed (line 144) | @Override
method consume (line 152) | @Override
method itemStateChanged (line 164) | @Override
method IconImporter (line 175) | public IconImporter(Project project, Module module) {
method initSearch (line 212) | private void initSearch() {
method initCheckBoxes (line 235) | private void initCheckBoxes() {
method createActions (line 245) | @NotNull
method prepareSpinner (line 252) | private void prepareSpinner(JComboBox comboBox, ActionListener listene...
method initSpinner (line 258) | private void initSpinner(JComboBox comboBox, Object selectedItem, Acti...
method updatePacks (line 263) | private void updatePacks() {
method updateCategories (line 270) | private void updateCategories() {
method updateExportResolutions (line 279) | private void updateExportResolutions() {
method updateAssets (line 295) | private void updateAssets() {
method updateSizes (line 304) | private void updateSizes() {
method updateColors (line 314) | private void updateColors() {
method updateFormat (line 323) | private void updateFormat() {
method updateExportName (line 334) | private void updateExportName() {
method updateSearch (line 338) | private void updateSearch() {
method updateImage (line 344) | private void updateImage() {
method doHelpAction (line 356) | @Override
method doOKAction (line 361) | @Override
method importIcons (line 372) | private void importIcons() {
method doValidate (line 376) | @Nullable
method createCenterPanel (line 394) | @Nullable
method updated (line 400) | @Override
method createUIComponents (line 414) | private void createUIComponents() {
method initResRoot (line 418) | private void initResRoot() {
class AssetSpinnerRenderer (line 429) | private class AssetSpinnerRenderer extends ListCellRendererWrapper<Ima...
method customize (line 432) | @Override
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/dialogs/ResourcesDialog.java
class ResourcesDialog (line 28) | public class ResourcesDialog extends DialogWrapper {
method ResourcesDialog (line 34) | public ResourcesDialog(Project project, final List<VirtualFile> items,...
method doOKAction (line 53) | @Override
method doValidate (line 61) | @Nullable
method createCenterPanel (line 70) | @Nullable
type ResourceSelectionListener (line 76) | public interface ResourceSelectionListener {
method onResourceSelected (line 77) | void onResourceSelected(VirtualFile resDir);
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/dialogs/VectorImporter.java
class VectorImporter (line 59) | public class VectorImporter extends DialogWrapper implements IconsImport...
method actionPerformed (line 78) | @Override
method actionPerformed (line 86) | @Override
method actionPerformed (line 94) | @Override
method consume (line 102) | @Override
method itemStateChanged (line 114) | @Override
method VectorImporter (line 125) | public VectorImporter(Project project, Module module) {
method initSearch (line 158) | private void initSearch() {
method createActions (line 180) | @NotNull
method prepareSpinner (line 187) | private void prepareSpinner(JComboBox comboBox, ActionListener listene...
method initSpinner (line 193) | private void initSpinner(JComboBox comboBox, Object selectedItem, Acti...
method updateCategories (line 198) | private void updateCategories() {
method updateAssets (line 207) | private void updateAssets() {
method updateExportName (line 216) | private void updateExportName() {
method updateSearch (line 220) | private void updateSearch() {
method updateImage (line 226) | private void updateImage() {
method doHelpAction (line 240) | @Override
method doOKAction (line 245) | @Override
method importIcons (line 253) | private void importIcons() {
method doValidate (line 257) | @Nullable
method createCenterPanel (line 275) | @Nullable
method updated (line 281) | @Override
method createUIComponents (line 290) | private void createUIComponents() {
method initResRoot (line 294) | private void initResRoot() {
class AssetSpinnerRenderer (line 305) | private class AssetSpinnerRenderer extends ListCellRendererWrapper<Ima...
method customize (line 308) | @Override
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/images/RefactoringTask.java
class RefactoringTask (line 45) | public class RefactoringTask extends Task.Backgroundable {
method RefactoringTask (line 54) | public RefactoringTask(Project project) {
method refactor (line 59) | private void refactor() throws IOException, ProcessCanceledException {
method addImage (line 88) | public void addImage(ImageInformation imageInformation) {
method onPreExecute (line 95) | protected void onPreExecute() {}
method run (line 97) | @Override
method onPostExecute (line 118) | protected void onPostExecute() {}
method checkFileExist (line 120) | private boolean checkFileExist(@Nullable PsiDirectory targetDirectory,
method copy (line 161) | private void copy(Project project,
method move (line 221) | private void move(Project project, List<ImageInformation> scalingInfor...
method exportTempImage (line 241) | private void exportTempImage(final ImageInformation information) {
method copyTempImage (line 255) | private void copyTempImage(ImageInformation information) {
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/images/ResizeAlgorithm.java
type ResizeAlgorithm (line 21) | public enum ResizeAlgorithm {
method ResizeAlgorithm (line 27) | ResizeAlgorithm(String name) {
method getMethods (line 31) | public List<String> getMethods() {
method getMethod (line 50) | public Object getMethod(String method) {
method getPrettyMethod (line 72) | public String getPrettyMethod(Object method) {
method toString (line 96) | @Override
method from (line 101) | public static ResizeAlgorithm from(String algorithm) {
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/listeners/RadioListListener.java
type RadioListListener (line 16) | public interface RadioListListener {
method radioSelectionChanged (line 17) | void radioSelectionChanged(int selectedIndex);
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/listeners/SimpleKeyListener.java
class SimpleKeyListener (line 6) | public class SimpleKeyListener implements KeyListener {
method keyTyped (line 7) | @Override
method keyPressed (line 12) | @Override
method keyReleased (line 17) | @Override
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/listeners/SimpleMouseListener.java
class SimpleMouseListener (line 19) | public class SimpleMouseListener implements MouseListener {
method mouseClicked (line 20) | @Override
method mousePressed (line 23) | @Override
method mouseReleased (line 26) | @Override
method mouseEntered (line 29) | @Override
method mouseExited (line 32) | @Override
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/model/Destination.java
type Destination (line 5) | public enum Destination {
method Destination (line 12) | Destination(String folderName) {
method getFolderName (line 16) | public String getFolderName() {
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/model/Format.java
type Format (line 5) | public enum Format {
method nonVectorValues (line 14) | public static Format[] nonVectorValues() {
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/model/IconPack.java
class IconPack (line 5) | public class IconPack {
method IconPack (line 14) | public IconPack(String name, String id, String url, String path, List<...
method getName (line 23) | public String getName() {
method getId (line 27) | public String getId() {
method getUrl (line 31) | public String getUrl() {
method getPath (line 35) | public String getPath() {
method getAssets (line 39) | public List<ImageAsset> getAssets() {
method getCategories (line 43) | public List<String> getCategories() {
method toString (line 47) | @Override
method equals (line 52) | @Override
method hashCode (line 62) | @Override
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/model/ImageAsset.java
class ImageAsset (line 8) | public class ImageAsset implements Comparable<ImageAsset>,
method ImageAsset (line 18) | public ImageAsset(String name,
method getName (line 32) | public String getName() {
method getIconPack (line 36) | public String getIconPack() {
method getCategory (line 40) | public String getCategory() {
method getResolutions (line 44) | public List<Resolution> getResolutions() {
method getColors (line 48) | public List<String> getColors() {
method getSizes (line 52) | public List<String> getSizes() {
method toString (line 56) | @Override
method compareTo (line 61) | @Override
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/model/ImageInformation.java
class ImageInformation (line 23) | public class ImageInformation {
method ImageInformation (line 39) | private ImageInformation(File imageFile,
method newBuilder (line 63) | public static Builder newBuilder() {
method newBuilder (line 67) | public static Builder newBuilder(ImageInformation imageInformation) {
method getTempDir (line 71) | public static File getTempDir() {
method getTempImage (line 75) | public File getTempImage() {
method getImageFile (line 81) | public File getImageFile() {
method getTargetResolution (line 85) | public Resolution getTargetResolution() {
method getFactor (line 89) | public float getFactor() {
method getExportPath (line 93) | public String getExportPath() {
method getExportName (line 97) | public String getExportName() {
method isNinePatch (line 101) | public boolean isNinePatch() {
method getAlgorithm (line 105) | public ResizeAlgorithm getAlgorithm() {
method getMethod (line 109) | public Object getMethod() {
method getFormat (line 113) | public Format getFormat() {
method getDestination (line 117) | public Destination getDestination() {
method getTargetFile (line 121) | public File getTargetFile() {
method isVector (line 130) | public boolean isVector() {
class Builder (line 134) | public static class Builder {
method Builder (line 150) | private Builder() {
method Builder (line 153) | private Builder(ImageInformation imageInformation) {
method setExportName (line 167) | public Builder setExportName(String exportName) {
method setExportPath (line 172) | public Builder setExportPath(String exportPath) {
method setTargetResolution (line 177) | public Builder setTargetResolution(Resolution targetResolution) {
method setFactor (line 182) | public Builder setFactor(float factor) {
method setVector (line 187) | public Builder setVector(boolean vector) {
method setNinePatch (line 192) | public Builder setNinePatch(boolean ninePatch) {
method setAlgorithm (line 197) | public Builder setAlgorithm(ResizeAlgorithm algorithm) {
method setMethod (line 202) | public Builder setMethod(Object method) {
method setImageFile (line 207) | public Builder setImageFile(File imageFile) {
method setFormat (line 215) | public Builder setFormat(Format format) {
method setDestination (line 220) | public Builder setDestination(Destination destination) {
method build (line 225) | public ImageInformation build() {
method getImageFile (line 239) | public File getImageFile() {
method getExportPath (line 243) | public String getExportPath() {
method getExportName (line 247) | public String getExportName() {
method getFactor (line 251) | public float getFactor() {
method getTargetResolution (line 255) | public Resolution getTargetResolution() {
method isNinePatch (line 259) | public boolean isNinePatch() {
method isVector (line 263) | public boolean isVector() {
method getAlgorithm (line 267) | public ResizeAlgorithm getAlgorithm() {
method getMethod (line 271) | public Object getMethod() {
method getFormat (line 275) | public Format getFormat() {
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/model/Resolution.java
type Resolution (line 24) | public enum Resolution {
method nonVectorValues (line 38) | public static Resolution[] nonVectorValues() {
method from (line 42) | public static Resolution from(String value) {
class Deserializer (line 66) | public static class Deserializer implements JsonDeserializer<Resolutio...
method deserialize (line 67) | @Override
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/resources/ResourceLoader.java
class ResourceLoader (line 24) | public class ResourceLoader {
method getExportPath (line 32) | public static File getExportPath() {
method getAssetResource (line 42) | public static File getAssetResource(String file) {
method getBundledResource (line 48) | public static File getBundledResource(String file) {
method getBundledResFile (line 64) | public static File getBundledResFile(String file) {
method getFromJar (line 90) | public static File getFromJar(String fn) {
method getBundledResReader (line 102) | public static BufferedReader getBundledResReader(String file) {
method getBundledResourceStream (line 109) | public static InputStream getBundledResourceStream(String file) {
method getAssetPath (line 116) | @NotNull
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/util/AndroidFacetUtils.java
class AndroidFacetUtils (line 28) | public class AndroidFacetUtils {
method AndroidFacetUtils (line 29) | private AndroidFacetUtils() {
method getCurrentFacet (line 32) | public static AndroidFacet getCurrentFacet(Project project, Module mod...
method getResourcesRoot (line 47) | public static String getResourcesRoot(Project project, Module module) {
method updateActionVisibility (line 59) | public static void updateActionVisibility(AnActionEvent e) {
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/util/ExportNameUtils.java
class ExportNameUtils (line 24) | public class ExportNameUtils {
method ExportNameUtils (line 26) | private ExportNameUtils() {
method getExportNameFromFilename (line 29) | public static String getExportNameFromFilename(String filename) {
method getExportDescription (line 38) | public static String getExportDescription(List<ImageInformation> scali...
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/util/ImageUtils.java
class ImageUtils (line 36) | public class ImageUtils {
method ImageUtils (line 38) | private ImageUtils() {
method updateImage (line 41) | public static void updateImage(JLabel imageContainer, File imageFile, ...
method getScaleFactor (line 80) | public static double getScaleFactor(int iMasterSize, int iTargetSize) {
method getScaleFactorToFit (line 87) | public static double getScaleFactorToFit(Dimension original, Dimension...
method resizeNormalImage (line 97) | public static BufferedImage resizeNormalImage(ImageInformation informa...
method resizeNormalImage (line 102) | private static BufferedImage resizeNormalImage(BufferedImage image,
method resizeNinePatchImage (line 129) | public static BufferedImage resizeNinePatchImage(ImageInformation info...
method getExportName (line 165) | public static String getExportName(String prefix, String name) {
method trim9PBorder (line 175) | private static BufferedImage trim9PBorder(BufferedImage inputImage) {
method enforceBorderColors (line 187) | private static void enforceBorderColors(BufferedImage inputImage) {
method generateBordersImage (line 206) | private static BufferedImage generateBordersImage(BufferedImage source,
method resizeBorder (line 262) | private static BufferedImage resizeBorder(final BufferedImage border,
method verifyBorderImage (line 296) | private static void verifyBorderImage(BufferedImage border) throws IOE...
method rescaleBorder (line 308) | private static BufferedImage rescaleBorder(BufferedImage image, int ta...
method saveImageTempFile (line 389) | public static File saveImageTempFile(BufferedImage resizedImage,
method ensureJpgCompatibility (line 406) | private static BufferedImage ensureJpgCompatibility(BufferedImage imag...
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/util/MathUtils.java
class MathUtils (line 16) | public class MathUtils {
method MathUtils (line 17) | private MathUtils() {
method floatEquals (line 20) | public static boolean floatEquals(float a, float b) {
method clamp (line 24) | public static int clamp(int val, int min, int max) {
method clamp (line 28) | public static double clamp(double val, double min, double max) {
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/util/RefactorUtils.java
class RefactorUtils (line 18) | public class RefactorUtils {
method RefactorUtils (line 28) | private RefactorUtils() {
method getScaleFactor (line 31) | public static float getScaleFactor(Resolution target, Resolution baseL...
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/util/RunnableUtils.java
class RunnableUtils (line 20) | public class RunnableUtils {
method runWriteCommand (line 22) | public static void runWriteCommand(Project project, Runnable cmd, Stri...
class WriteAction (line 26) | public static class WriteAction implements Runnable {
method WriteAction (line 27) | WriteAction(Runnable cmd) {
method run (line 31) | public void run() {
method RunnableUtils (line 38) | private RunnableUtils() {
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/util/TextUtils.java
class TextUtils (line 3) | public final class TextUtils {
method TextUtils (line 4) | private TextUtils() {
method isEmpty (line 7) | public static boolean isEmpty(final CharSequence s) {
method isBlank (line 11) | public static boolean isBlank(final CharSequence s) {
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/widgets/ExportNameField.java
class ExportNameField (line 13) | public class ExportNameField extends JFormattedTextField {
method ExportNameField (line 15) | public ExportNameField() {
class RegexFormatter (line 45) | private static class RegexFormatter extends DefaultFormatter {
method RegexFormatter (line 48) | public RegexFormatter(String pattern) throws PatternSyntaxException {
method setPattern (line 56) | public void setPattern(Pattern pattern) {
method getPattern (line 60) | public Pattern getPattern() {
method stringToValue (line 65) | public Object stringToValue(String text) throws ParseException {
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/widgets/FileBrowserField.java
class FileBrowserField (line 28) | public class FileBrowserField extends TextFieldWithBrowseButton {
method isFileVisible (line 38) | public boolean isFileVisible(VirtualFile file, boolean showHiddenFiles) {
method isFileSelectable (line 45) | public boolean isFileSelectable(VirtualFile file) {
method isFileVisible (line 58) | public boolean isFileVisible(VirtualFile file, boolean showHiddenFiles) {
method isFileSelectable (line 65) | public boolean isFileSelectable(VirtualFile file) {
method FileBrowserField (line 85) | public FileBrowserField(FileChooserDescriptor descriptor) {
method init (line 91) | public void init(Project project, ISettingsController settingsControll...
method initFileChooser (line 97) | private void initFileChooser() {
method initWithResourceRoot (line 163) | public void initWithResourceRoot(Project project, Module module, ISett...
method getResRootFile (line 179) | private void getResRootFile(Project project, Module module, ResourcesD...
method setText (line 191) | @Override
method notifyListener (line 197) | private void notifyListener(String filePath) {
method setSelectionListener (line 204) | public void setSelectionListener(Consumer<File> fileConsumer) {
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/widgets/RadioButtonList.java
class RadioButtonList (line 34) | public class RadioButtonList<T> extends JBList {
method RadioButtonList (line 41) | public RadioButtonList(final RadioListListener radioListListener) {
method RadioButtonList (line 45) | public RadioButtonList(final DefaultListModel dataModel, final RadioLi...
method RadioButtonList (line 50) | public RadioButtonList() {
method RadioButtonList (line 54) | public RadioButtonList(final DefaultListModel dataModel) {
method setItems (line 91) | public void setItems(final List<T> items, @Nullable Function<T, String...
method addItem (line 99) | public void addItem(T item, String text, boolean selected) {
method clear (line 113) | public void clear() {
method setSelected (line 118) | private void setSelected(JRadioButton radioButton, int index) {
method setRadioListListener (line 135) | public void setRadioListListener(RadioListListener checkBoxListListene...
method adjustRendering (line 139) | protected void adjustRendering(final JRadioButton checkBox, final bool...
class CellRenderer (line 142) | private class CellRenderer implements ListCellRenderer {
method CellRenderer (line 146) | private CellRenderer() {
method getListCellRendererComponent (line 152) | @Override
method getFont (line 173) | protected Font getFont(final JRadioButton checkbox) {
method getBackground (line 177) | protected Color getBackground(final boolean isSelected, final JRadioBu...
method getForeground (line 181) | protected Color getForeground(final boolean isSelected, final JRadioBu...
FILE: src/main/java/de/mprengemann/intellij/plugin/androidicons/widgets/ResolutionButtonModel.java
class ResolutionButtonModel (line 7) | public class ResolutionButtonModel extends JToggleButton.ToggleButtonMod...
method ResolutionButtonModel (line 11) | public ResolutionButtonModel(Resolution resolution) {
method getResolution (line 15) | public Resolution getResolution() {
Condensed preview — 1046 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,439K chars).
[
{
"path": ".gitignore",
"chars": 1465,
"preview": "### Intellij ###\n# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm\n\n*.iml\n\n## Directory-based proj"
},
{
"path": ".travis.yml",
"chars": 1075,
"preview": "language: java\njdk:\n - oraclejdk8\nsudo: false\nenv:\n matrix:\n - IDEA_VERSION=IC-14.0.4\n - IDEA_VERSION=IC-14.1.6\n - "
},
{
"path": "LICENSE",
"chars": 11323,
"preview": "Apache License\n Version 2.0, January 2004\n http://www.apache.org/licens"
},
{
"path": "README.md",
"chars": 5618,
"preview": "## Forker's note\nThis fork came about because the original package stopped working somewhere around Android Studio 3.5. "
},
{
"path": "build.gradle",
"chars": 1823,
"preview": "plugins {\n //id \"org.jetbrains.intellij\" version \"0.1.10\"\n // https://mvnrepository.com/artifact/org.jetbrains.int"
},
{
"path": "gradle/wrapper/gradle-wrapper.properties",
"chars": 232,
"preview": "#Wed Sep 30 13:40:53 CEST 2015\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER"
},
{
"path": "gradle.properties",
"chars": 802,
"preview": "## Project-wide Gradle settings.\n#\n# For more details on how to configure your build environment visit\n# http://www.grad"
},
{
"path": "gradlew",
"chars": 5080,
"preview": "#!/usr/bin/env bash\n\n##############################################################################\n##\n## Gradle start "
},
{
"path": "gradlew.bat",
"chars": 2314,
"preview": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem "
},
{
"path": "json_generator/__init__.py",
"chars": 30,
"preview": "__author__ = 'marcprengemann'\n"
},
{
"path": "json_generator/json_generator.py",
"chars": 5186,
"preview": "import json\nimport os\nimport io\nfrom itertools import izip, islice\nfrom os.path import join\n\nfrom PIL import Image\n\n\nroo"
},
{
"path": "settings.gradle",
"chars": 29,
"preview": "rootProject.name = 'ADI-hack'"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/IProjectSettingsComponent.java",
"chars": 184,
"preview": "package de.mprengemann.intellij.plugin.androidicons;\n\nimport com.intellij.openapi.components.ProjectComponent;\n\npublic i"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/IconApplication.java",
"chars": 5222,
"preview": "package de.mprengemann.intellij.plugin.androidicons;\n\nimport com.google.gson.Gson;\nimport com.google.gson.GsonBuilder;\ni"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/ProjectSettingsComponent.java",
"chars": 1237,
"preview": "package de.mprengemann.intellij.plugin.androidicons;\n\nimport com.intellij.openapi.application.ApplicationManager;\nimport"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/actions/AndroidAssetUtilsGroup.java",
"chars": 1052,
"preview": "/*\n * Copyright 2015 Marc Prengemann\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not u"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/actions/AndroidBatchImportAction.java",
"chars": 1819,
"preview": "/*\n * Copyright 2015 Marc Prengemann\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not u"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/actions/AndroidMultiDrawableAction.java",
"chars": 1853,
"preview": "/*\n * Copyright 2015 Marc Prengemann\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not u"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/actions/IconsAction.java",
"chars": 1791,
"preview": "/*\n * Copyright 2015 Marc Prengemann\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not u"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/actions/VectorsAction.java",
"chars": 1788,
"preview": "/*\n * Copyright 2015 Marc Prengemann\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not u"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/DefaultControllerFactory.java",
"chars": 3441,
"preview": "package de.mprengemann.intellij.plugin.androidicons.controllers;\n\nimport com.intellij.openapi.project.Project;\nimport de"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/IController.java",
"chars": 196,
"preview": "package de.mprengemann.intellij.plugin.androidicons.controllers;\n\npublic interface IController<T> {\n void addObserver"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/IControllerFactory.java",
"chars": 834,
"preview": "package de.mprengemann.intellij.plugin.androidicons.controllers;\n\nimport com.intellij.openapi.project.Project;\nimport de"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/batchscale/BatchScaleImporterController.java",
"chars": 6515,
"preview": "package de.mprengemann.intellij.plugin.androidicons.controllers.batchscale;\n\nimport com.intellij.openapi.module.Module;\n"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/batchscale/BatchScaleImporterObserver.java",
"chars": 145,
"preview": "package de.mprengemann.intellij.plugin.androidicons.controllers.batchscale;\n\npublic interface BatchScaleImporterObserver"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/batchscale/IBatchScaleImporterController.java",
"chars": 1020,
"preview": "package de.mprengemann.intellij.plugin.androidicons.controllers.batchscale;\n\nimport com.intellij.openapi.module.Module;\n"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/batchscale/additem/AddItemBatchScaleDialogObserver.java",
"chars": 158,
"preview": "package de.mprengemann.intellij.plugin.androidicons.controllers.batchscale.additem;\n\npublic interface AddItemBatchScaleD"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/batchscale/additem/AddItemBatchScaleImporterController.java",
"chars": 12004,
"preview": "package de.mprengemann.intellij.plugin.androidicons.controllers.batchscale.additem;\n\nimport com.google.common.base.Objec"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/batchscale/additem/IAddItemBatchScaleImporterController.java",
"chars": 2032,
"preview": "package de.mprengemann.intellij.plugin.androidicons.controllers.batchscale.additem;\n\nimport com.intellij.openapi.project"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/defaults/DefaultsController.java",
"chars": 5364,
"preview": "package de.mprengemann.intellij.plugin.androidicons.controllers.defaults;\n\nimport de.mprengemann.intellij.plugin.android"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/defaults/IDefaultsController.java",
"chars": 1203,
"preview": "package de.mprengemann.intellij.plugin.androidicons.controllers.defaults;\n\nimport de.mprengemann.intellij.plugin.android"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/iconimporter/IIconsImporterController.java",
"chars": 1871,
"preview": "package de.mprengemann.intellij.plugin.androidicons.controllers.iconimporter;\n\nimport com.intellij.openapi.project.Proje"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/iconimporter/IconsImporterController.java",
"chars": 12172,
"preview": "package de.mprengemann.intellij.plugin.androidicons.controllers.iconimporter;\n\nimport com.intellij.openapi.project.Proje"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/iconimporter/IconsImporterObserver.java",
"chars": 142,
"preview": "package de.mprengemann.intellij.plugin.androidicons.controllers.iconimporter;\n\npublic interface IconsImporterObserver {\n"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/icons/IIconPackController.java",
"chars": 825,
"preview": "package de.mprengemann.intellij.plugin.androidicons.controllers.icons;\n\nimport de.mprengemann.intellij.plugin.androidico"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/icons/androidicons/AndroidIconsController.java",
"chars": 2216,
"preview": "package de.mprengemann.intellij.plugin.androidicons.controllers.icons.androidicons;\n\nimport de.mprengemann.intellij.plug"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/icons/androidicons/IAndroidIconsController.java",
"chars": 249,
"preview": "package de.mprengemann.intellij.plugin.androidicons.controllers.icons.androidicons;\n\nimport de.mprengemann.intellij.plug"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/icons/materialicons/IMaterialIconsController.java",
"chars": 272,
"preview": "package de.mprengemann.intellij.plugin.androidicons.controllers.icons.materialicons;\n\nimport de.mprengemann.intellij.plu"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/icons/materialicons/MaterialIconsController.java",
"chars": 3773,
"preview": "package de.mprengemann.intellij.plugin.androidicons.controllers.icons.materialicons;\n\nimport com.google.common.collect.L"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/multi/IMultiImporterController.java",
"chars": 1266,
"preview": "package de.mprengemann.intellij.plugin.androidicons.controllers.multi;\n\nimport com.intellij.openapi.project.Project;\nimp"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/multi/MultiImporterController.java",
"chars": 7561,
"preview": "package de.mprengemann.intellij.plugin.androidicons.controllers.multi;\n\nimport com.google.common.base.Objects;\nimport co"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/multi/MultiImporterObserver.java",
"chars": 135,
"preview": "package de.mprengemann.intellij.plugin.androidicons.controllers.multi;\n\npublic interface MultiImporterObserver {\n voi"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/settings/ISettingsController.java",
"chars": 1782,
"preview": "package de.mprengemann.intellij.plugin.androidicons.controllers.settings;\n\nimport com.intellij.openapi.project.Project;\n"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/settings/SettingsController.java",
"chars": 9002,
"preview": "package de.mprengemann.intellij.plugin.androidicons.controllers.settings;\n\nimport com.intellij.ide.util.PropertiesCompon"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/controllers/settings/SettingsObserver.java",
"chars": 113,
"preview": "package de.mprengemann.intellij.plugin.androidicons.controllers.settings;\n\npublic interface SettingsObserver {\n}\n"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/dialogs/AddItemBatchScaleDialog.form",
"chars": 13299,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<form xmlns=\"http://www.intellij.com/uidesigner/form/\" version=\"1\" bind-to-class="
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/dialogs/AddItemBatchScaleDialog.java",
"chars": 16918,
"preview": "package de.mprengemann.intellij.plugin.androidicons.dialogs;\n\nimport com.intellij.openapi.application.ApplicationManager"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/dialogs/AndroidBatchScaleImporter.form",
"chars": 3977,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<form xmlns=\"http://www.intellij.com/uidesigner/form/\" version=\"1\" bind-to-class="
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/dialogs/AndroidBatchScaleImporter.java",
"chars": 18205,
"preview": "/*\n * Copyright 2015 Marc Prengemann\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not u"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/dialogs/AndroidMultiDrawableImporter.form",
"chars": 8839,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<form xmlns=\"http://www.intellij.com/uidesigner/form/\" version=\"1\" bind-to-class="
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/dialogs/AndroidMultiDrawableImporter.java",
"chars": 18808,
"preview": "/*\n * Copyright 2015 Marc Prengemann\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not u"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/dialogs/EditItemsBatchScaleDialog.form",
"chars": 7963,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<form xmlns=\"http://www.intellij.com/uidesigner/form/\" version=\"1\" bind-to-class="
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/dialogs/EditItemsBatchScaleDialog.java",
"chars": 12272,
"preview": "package de.mprengemann.intellij.plugin.androidicons.dialogs;\n\nimport com.intellij.openapi.application.ApplicationManager"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/dialogs/IconImporter.form",
"chars": 11510,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<form xmlns=\"http://www.intellij.com/uidesigner/form/\" version=\"1\" bind-to-class="
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/dialogs/IconImporter.java",
"chars": 18972,
"preview": "/*\n * Copyright 2015 Marc Prengemann\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not u"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/dialogs/ResourcesDialog.form",
"chars": 970,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<form xmlns=\"http://www.intellij.com/uidesigner/form/\" version=\"1\" bind-to-class="
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/dialogs/ResourcesDialog.java",
"chars": 2638,
"preview": "/*\n * Copyright 2015 Marc Prengemann\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not u"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/dialogs/VectorImporter.form",
"chars": 4946,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<form xmlns=\"http://www.intellij.com/uidesigner/form/\" version=\"1\" bind-to-class="
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/dialogs/VectorImporter.java",
"chars": 13005,
"preview": "/*\n * Copyright 2015 Marc Prengemann\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not u"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/images/RefactoringTask.java",
"chars": 10473,
"preview": "/*\n * Copyright 2015 Marc Prengemann\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not u"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/images/ResizeAlgorithm.java",
"chars": 3563,
"preview": "/*\n * Copyright 2015 Marc Prengemann\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not u"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/listeners/RadioListListener.java",
"chars": 744,
"preview": "/*\n * Copyright 2015 Marc Prengemann\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not u"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/listeners/SimpleKeyListener.java",
"chars": 398,
"preview": "package de.mprengemann.intellij.plugin.androidicons.listeners;\n\nimport java.awt.event.KeyEvent;\nimport java.awt.event.Ke"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/listeners/SimpleMouseListener.java",
"chars": 1137,
"preview": "/*\n * Copyright 2015 Marc Prengemann\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not u"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/model/Destination.java",
"chars": 396,
"preview": "package de.mprengemann.intellij.plugin.androidicons.model;\n\nimport de.mprengemann.intellij.plugin.androidicons.util.Text"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/model/Format.java",
"chars": 360,
"preview": "package de.mprengemann.intellij.plugin.androidicons.model;\n\nimport de.mprengemann.intellij.plugin.androidicons.util.Text"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/model/IconPack.java",
"chars": 1383,
"preview": "package de.mprengemann.intellij.plugin.androidicons.model;\n\nimport java.util.List;\n\npublic class IconPack {\n\n private"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/model/ImageAsset.java",
"chars": 1524,
"preview": "package de.mprengemann.intellij.plugin.androidicons.model;\n\nimport org.jetbrains.annotations.NotNull;\n\nimport java.io.Se"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/model/ImageInformation.java",
"chars": 8767,
"preview": "/*\n * Copyright 2015 Marc Prengemann\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not u"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/model/Resolution.java",
"chars": 2579,
"preview": "/*\n * Copyright 2015 Marc Prengemann\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not u"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/resources/ResourceLoader.java",
"chars": 4617,
"preview": "package de.mprengemann.intellij.plugin.androidicons.resources;\n\nimport com.intellij.openapi.application.PathManager;\nimp"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/util/AndroidFacetUtils.java",
"chars": 2661,
"preview": "/*\n * Copyright 2015 Marc Prengemann\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not u"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/util/ExportNameUtils.java",
"chars": 2832,
"preview": "/*\n * Copyright 2015 Marc Prengemann\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not u"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/util/ImageUtils.java",
"chars": 17289,
"preview": "/*\n * Copyright 2015 Marc Prengemann\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not u"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/util/MathUtils.java",
"chars": 1057,
"preview": "/*\n * Copyright 2015 Marc Prengemann\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not u"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/util/RefactorUtils.java",
"chars": 6749,
"preview": "/*\n * Copyright 2015 Marc Prengemann\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not u"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/util/RunnableUtils.java",
"chars": 1364,
"preview": "/*\n * Copyright 2015 Marc Prengemann\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not u"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/util/TextUtils.java",
"chars": 558,
"preview": "package de.mprengemann.intellij.plugin.androidicons.util;\n\npublic final class TextUtils {\n private TextUtils() {\n "
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/widgets/ExportNameField.java",
"chars": 2776,
"preview": "package de.mprengemann.intellij.plugin.androidicons.widgets;\n\nimport com.intellij.openapi.ui.Messages;\nimport de.mprenge"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/widgets/FileBrowserField.java",
"chars": 9176,
"preview": "package de.mprengemann.intellij.plugin.androidicons.widgets;\n\nimport com.intellij.openapi.components.PathMacroManager;\ni"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/widgets/RadioButtonList.java",
"chars": 7061,
"preview": "/*\n * Copyright 2015 Marc Prengemann\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not u"
},
{
"path": "src/main/java/de/mprengemann/intellij/plugin/androidicons/widgets/ResolutionButtonModel.java",
"chars": 447,
"preview": "package de.mprengemann.intellij.plugin.androidicons.widgets;\n\nimport de.mprengemann.intellij.plugin.androidicons.model.R"
},
{
"path": "src/main/resources/META-INF/plugin.xml",
"chars": 5599,
"preview": "<!--\n ~ Copyright 2015 Marc Prengemann\n ~\n ~ Licensed under the Apache License, Version 2.0 (the \"License\"); you may "
},
{
"path": "src/main/resources/assets/content.json",
"chars": 317850,
"preview": "[{\"assets\": [{\"category\": \"all\", \"name\": \"ic_action_achievement\", \"sizes\": [\"18dp\"], \"colors\": [\"black\", \"blue_dark\", \"b"
},
{
"path": "src/main/resources/assets/icon_packs.properties",
"chars": 9,
"preview": "version=2"
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_3d_rotation_black_24dp.xml",
"chars": 2391,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_accessibility_black_24dp.xml",
"chars": 395,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_accessible_black_24dp.xml",
"chars": 860,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_account_balance_black_24dp.xml",
"chars": 391,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_account_balance_wallet_black_24dp.xml",
"chars": 548,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_account_box_black_24dp.xml",
"chars": 498,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_account_circle_black_24dp.xml",
"chars": 540,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_add_shopping_cart_black_24dp.xml",
"chars": 749,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_alarm_add_black_24dp.xml",
"chars": 566,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_alarm_black_24dp.xml",
"chars": 578,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_alarm_off_black_24dp.xml",
"chars": 852,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_alarm_on_black_24dp.xml",
"chars": 598,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_all_out_black_24dp.xml",
"chars": 554,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_android_black_24dp.xml",
"chars": 970,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_announcement_black_24dp.xml",
"chars": 418,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_aspect_ratio_black_24dp.xml",
"chars": 465,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_assessment_black_24dp.xml",
"chars": 440,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_assignment_black_24dp.xml",
"chars": 561,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_assignment_ind_black_24dp.xml",
"chars": 622,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_assignment_late_black_24dp.xml",
"chars": 540,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_assignment_return_black_24dp.xml",
"chars": 532,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_assignment_returned_black_24dp.xml",
"chars": 534,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_assignment_turned_in_black_24dp.xml",
"chars": 557,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_autorenew_black_24dp.xml",
"chars": 557,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_backup_black_24dp.xml",
"chars": 478,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_book_black_24dp.xml",
"chars": 406,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_bookmark_black_24dp.xml",
"chars": 360,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_bookmark_border_black_24dp.xml",
"chars": 396,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_bug_report_black_24dp.xml",
"chars": 736,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_build_black_24dp.xml",
"chars": 489,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_cached_black_24dp.xml",
"chars": 539,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_camera_enhance_black_24dp.xml",
"chars": 540,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_card_giftcard_black_24dp.xml",
"chars": 817,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_card_membership_black_24dp.xml",
"chars": 449,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_card_travel_black_24dp.xml",
"chars": 529,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_change_history_black_24dp.xml",
"chars": 339,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_check_circle_black_24dp.xml",
"chars": 412,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_chrome_reader_mode_black_24dp.xml",
"chars": 460,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_class_black_24dp.xml",
"chars": 406,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_code_black_24dp.xml",
"chars": 392,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_compare_arrows_black_24dp.xml",
"chars": 380,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_copyright_black_24dp.xml",
"chars": 1269,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_credit_card_black_24dp.xml",
"chars": 440,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_dashboard_black_24dp.xml",
"chars": 367,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_date_range_black_24dp.xml",
"chars": 496,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_delete_black_24dp.xml",
"chars": 373,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_delete_forever_black_24dp.xml",
"chars": 516,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_description_black_24dp.xml",
"chars": 448,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_dns_black_24dp.xml",
"chars": 607,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_done_all_black_24dp.xml",
"chars": 452,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_done_black_24dp.xml",
"chars": 341,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_donut_large_black_24dp.xml",
"chars": 518,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_donut_small_black_24dp.xml",
"chars": 529,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_eject_black_24dp.xml",
"chars": 326,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_euro_symbol_black_24dp.xml",
"chars": 679,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_event_black_24dp.xml",
"chars": 461,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_event_seat_black_24dp.xml",
"chars": 402,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_exit_to_app_black_24dp.xml",
"chars": 472,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_explore_black_24dp.xml",
"chars": 503,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_extension_black_24dp.xml",
"chars": 603,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_face_black_24dp.xml",
"chars": 770,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_favorite_black_24dp.xml",
"chars": 469,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_favorite_border_black_24dp.xml",
"chars": 649,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_feedback_black_24dp.xml",
"chars": 418,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_find_in_page_black_24dp.xml",
"chars": 585,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_find_replace_black_24dp.xml",
"chars": 650,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_fingerprint_black_24dp.xml",
"chars": 2375,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_flight_land_black_24dp.xml",
"chars": 499,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_flight_takeoff_black_24dp.xml",
"chars": 523,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_flip_to_back_black_24dp.xml",
"chars": 597,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_flip_to_front_black_24dp.xml",
"chars": 545,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_g_translate_black_24dp.xml",
"chars": 1087,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_gavel_black_24dp.xml",
"chars": 451,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_get_app_black_24dp.xml",
"chars": 332,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_gif_black_24dp.xml",
"chars": 474,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_grade_black_24dp.xml",
"chars": 381,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_group_work_black_24dp.xml",
"chars": 628,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_help_black_24dp.xml",
"chars": 601,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_help_outline_black_24dp.xml",
"chars": 562,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_highlight_off_black_24dp.xml",
"chars": 534,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_history_black_24dp.xml",
"chars": 553,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_home_black_24dp.xml",
"chars": 325,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_hourglass_empty_black_24dp.xml",
"chars": 468,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_hourglass_full_black_24dp.xml",
"chars": 389,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_http_black_24dp.xml",
"chars": 552,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_https_black_24dp.xml",
"chars": 565,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_important_devices_black_24dp.xml",
"chars": 625,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_info_black_24dp.xml",
"chars": 393,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_info_outline_black_24dp.xml",
"chars": 460,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_input_black_24dp.xml",
"chars": 452,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_invert_colors_black_24dp.xml",
"chars": 541,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_label_black_24dp.xml",
"chars": 430,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_label_outline_black_24dp.xml",
"chars": 457,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_language_black_24dp.xml",
"chars": 1230,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_launch_black_24dp.xml",
"chars": 428,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_lightbulb_outline_black_24dp.xml",
"chars": 623,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_line_style_black_24dp.xml",
"chars": 484,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_line_weight_black_24dp.xml",
"chars": 366,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_list_black_24dp.xml",
"chars": 400,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_lock_black_24dp.xml",
"chars": 565,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_lock_open_black_24dp.xml",
"chars": 569,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_lock_outline_black_24dp.xml",
"chars": 579,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_loyalty_black_24dp.xml",
"chars": 805,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_markunread_mailbox_black_24dp.xml",
"chars": 397,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_motorcycle_black_24dp.xml",
"chars": 656,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_note_add_black_24dp.xml",
"chars": 449,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_offline_pin_black_24dp.xml",
"chars": 430,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_opacity_black_24dp.xml",
"chars": 520,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_open_in_browser_black_24dp.xml",
"chars": 441,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_open_in_new_black_24dp.xml",
"chars": 428,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_open_with_black_24dp.xml",
"chars": 413,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_pageview_black_24dp.xml",
"chars": 624,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_pan_tool_black_24dp.xml",
"chars": 671,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_payment_black_24dp.xml",
"chars": 440,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
},
{
"path": "src/main/resources/assets/material_icons/action/drawable-anydpi-v21/ic_perm_camera_mic_black_24dp.xml",
"chars": 586,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\""
}
]
// ... and 846 more files (download for full content)
About this extraction
This page contains the full source code of the Vincent-Loi/android-drawable-importer-intellij-plugin GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1046 files (1.2 MB), approximately 503.2k tokens, and a symbol index with 779 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.