├── .travis.yml ├── LICENSE ├── README.md ├── app ├── .gitignore ├── app.iml ├── build.gradle ├── darkal.jks ├── libs │ ├── android-sun-jarsign-support-1.1.jar │ ├── netty-all-android-4.0.44.Final.jar │ └── zxing.jar ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── cn │ │ └── darkal │ │ └── networkdiagnosis │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ ├── cn │ │ │ └── darkal │ │ │ │ └── networkdiagnosis │ │ │ │ ├── Activity │ │ │ │ ├── AppCompatPreferenceActivity.java │ │ │ │ ├── ChangeFilterActivity.java │ │ │ │ ├── HarDetailActivity.java │ │ │ │ ├── JsonPreviewActivity.java │ │ │ │ ├── MainActivity.java │ │ │ │ └── SettingsActivity.java │ │ │ │ ├── Adapter │ │ │ │ ├── ContentFilterAdapter.java │ │ │ │ └── PageFilterAdapter.java │ │ │ │ ├── Fragment │ │ │ │ ├── BackHandledInterface.java │ │ │ │ ├── BaseFragment.java │ │ │ │ ├── NetworkFragment.java │ │ │ │ ├── PreviewFragment.java │ │ │ │ └── WebViewFragment.java │ │ │ │ ├── MyVpnService.java │ │ │ │ ├── Receiver │ │ │ │ └── MyAdminReceiver.java │ │ │ │ ├── SysApplication.java │ │ │ │ ├── Task │ │ │ │ ├── BaseTask.java │ │ │ │ ├── DnsTask.java │ │ │ │ ├── InfoTask.java │ │ │ │ ├── PingTask.java │ │ │ │ ├── TraceRouteContainer.java │ │ │ │ ├── TraceRouteWithPing.java │ │ │ │ └── TraceTask.java │ │ │ │ ├── Utils │ │ │ │ ├── DatatypeConverter.java │ │ │ │ ├── DeviceUtils.java │ │ │ │ ├── FileUtil.java │ │ │ │ ├── NetInfo │ │ │ │ │ ├── NetBasicInfo.java │ │ │ │ │ └── SystemBasicInfo.java │ │ │ │ ├── ProxyUtils.java │ │ │ │ ├── SharedPreferenceUtils.java │ │ │ │ ├── X509ExtendedTrustManager.java │ │ │ │ └── ZipUtils.java │ │ │ │ ├── View │ │ │ │ ├── ClearTextView.java │ │ │ │ ├── LoadingDialog.java │ │ │ │ ├── ProgressWheel.java │ │ │ │ └── RecycleViewDivider.java │ │ │ │ └── bean │ │ │ │ ├── PageBean.java │ │ │ │ └── ResponseFilterRule.java │ │ ├── com │ │ │ ├── google │ │ │ │ └── zxing │ │ │ │ │ ├── QrCodeScanActivity.java │ │ │ │ │ ├── camera │ │ │ │ │ ├── AutoFocusManager.java │ │ │ │ │ ├── CameraConfigurationManager.java │ │ │ │ │ ├── CameraConfigurationUtils.java │ │ │ │ │ ├── CameraManager.java │ │ │ │ │ ├── FrontLightMode.java │ │ │ │ │ ├── PreviewCallback.java │ │ │ │ │ └── open │ │ │ │ │ │ └── OpenCameraInterface.java │ │ │ │ │ ├── decoding │ │ │ │ │ ├── CaptureActivityHandler.java │ │ │ │ │ ├── DecodeFormatManager.java │ │ │ │ │ ├── DecodeHandler.java │ │ │ │ │ ├── DecodeThread.java │ │ │ │ │ ├── FinishListener.java │ │ │ │ │ ├── InactivityTimer.java │ │ │ │ │ └── Intents.java │ │ │ │ │ └── view │ │ │ │ │ ├── ViewfinderResultPointCallback.java │ │ │ │ │ └── ViewfinderView.java │ │ │ └── netease │ │ │ │ ├── LDNetDiagnoService │ │ │ │ ├── LDNetAsyncTaskEx.java │ │ │ │ ├── LDNetDiagnoListener.java │ │ │ │ ├── LDNetDiagnoService.java │ │ │ │ ├── LDNetPing.java │ │ │ │ ├── LDNetSocket.java │ │ │ │ └── LDNetTraceRoute.java │ │ │ │ └── LDNetDiagnoUtils │ │ │ │ ├── LDNetUtil.java │ │ │ │ └── LDPingParse.java │ │ ├── net │ │ │ └── lightbody │ │ │ │ └── bmp │ │ │ │ ├── BrowserMobProxy.java │ │ │ │ ├── BrowserMobProxyServer.java │ │ │ │ ├── client │ │ │ │ └── ClientUtil.java │ │ │ │ ├── core │ │ │ │ └── har │ │ │ │ │ ├── Har.java │ │ │ │ │ ├── HarCache.java │ │ │ │ │ ├── HarCacheStatus.java │ │ │ │ │ ├── HarContent.java │ │ │ │ │ ├── HarCookie.java │ │ │ │ │ ├── HarEntry.java │ │ │ │ │ ├── HarLog.java │ │ │ │ │ ├── HarNameValuePair.java │ │ │ │ │ ├── HarNameVersion.java │ │ │ │ │ ├── HarPage.java │ │ │ │ │ ├── HarPageTimings.java │ │ │ │ │ ├── HarPostData.java │ │ │ │ │ ├── HarPostDataParam.java │ │ │ │ │ ├── HarRequest.java │ │ │ │ │ ├── HarResponse.java │ │ │ │ │ ├── HarTimings.java │ │ │ │ │ ├── PageRefFilteredHar.java │ │ │ │ │ └── PageRefFilteredHarLog.java │ │ │ │ ├── exception │ │ │ │ ├── DecompressionException.java │ │ │ │ └── UnsupportedCharsetException.java │ │ │ │ ├── filters │ │ │ │ ├── AddHeadersFilter.java │ │ │ │ ├── AutoBasicAuthFilter.java │ │ │ │ ├── BlacklistFilter.java │ │ │ │ ├── BrowserMobHttpFilterChain.java │ │ │ │ ├── ClientRequestCaptureFilter.java │ │ │ │ ├── HarCaptureFilter.java │ │ │ │ ├── HttpConnectHarCaptureFilter.java │ │ │ │ ├── HttpsAwareFiltersAdapter.java │ │ │ │ ├── HttpsHostCaptureFilter.java │ │ │ │ ├── HttpsOriginalHostCaptureFilter.java │ │ │ │ ├── LatencyFilter.java │ │ │ │ ├── ModifiedRequestAwareFilter.java │ │ │ │ ├── RegisterRequestFilter.java │ │ │ │ ├── RequestFilter.java │ │ │ │ ├── RequestFilterAdapter.java │ │ │ │ ├── ResolvedHostnameCacheFilter.java │ │ │ │ ├── ResponseFilter.java │ │ │ │ ├── ResponseFilterAdapter.java │ │ │ │ ├── RewriteUrlFilter.java │ │ │ │ ├── ServerResponseCaptureFilter.java │ │ │ │ ├── UnregisterRequestFilter.java │ │ │ │ ├── WhitelistFilter.java │ │ │ │ ├── support │ │ │ │ │ └── HttpConnectTiming.java │ │ │ │ └── util │ │ │ │ │ └── HarCaptureUtil.java │ │ │ │ ├── mitm │ │ │ │ ├── CertificateAndKey.java │ │ │ │ ├── CertificateAndKeySource.java │ │ │ │ ├── CertificateInfo.java │ │ │ │ ├── CertificateInfoGenerator.java │ │ │ │ ├── ExistingCertificateSource.java │ │ │ │ ├── HostnameCertificateInfoGenerator.java │ │ │ │ ├── KeyStoreCertificateSource.java │ │ │ │ ├── KeyStoreFileCertificateSource.java │ │ │ │ ├── PemFileCertificateSource.java │ │ │ │ ├── RootCertificateGenerator.java │ │ │ │ ├── TrustSource.java │ │ │ │ ├── exception │ │ │ │ │ ├── CertificateCreationException.java │ │ │ │ │ ├── CertificateSourceException.java │ │ │ │ │ ├── ExportException.java │ │ │ │ │ ├── ImportException.java │ │ │ │ │ ├── KeyGeneratorException.java │ │ │ │ │ ├── KeyStoreAccessException.java │ │ │ │ │ ├── MitmException.java │ │ │ │ │ ├── SslContextInitializationException.java │ │ │ │ │ ├── TrustSourceException.java │ │ │ │ │ └── UncheckedIOException.java │ │ │ │ ├── keys │ │ │ │ │ ├── ECKeyGenerator.java │ │ │ │ │ ├── KeyGenerator.java │ │ │ │ │ └── RSAKeyGenerator.java │ │ │ │ ├── manager │ │ │ │ │ └── ImpersonatingMitmManager.java │ │ │ │ ├── stats │ │ │ │ │ └── CertificateGenerationStatistics.java │ │ │ │ ├── tools │ │ │ │ │ ├── BouncyCastleSecurityProviderTool.java │ │ │ │ │ ├── DefaultSecurityProviderTool.java │ │ │ │ │ └── SecurityProviderTool.java │ │ │ │ ├── trustmanager │ │ │ │ │ ├── InsecureExtendedTrustManager.java │ │ │ │ │ └── InsecureTrustManagerFactory.java │ │ │ │ └── util │ │ │ │ │ ├── EncryptionUtil.java │ │ │ │ │ ├── KeyStoreUtil.java │ │ │ │ │ ├── MitmConstants.java │ │ │ │ │ ├── SslUtil.java │ │ │ │ │ └── TrustUtil.java │ │ │ │ ├── proxy │ │ │ │ ├── ActivityMonitor.java │ │ │ │ ├── BlacklistEntry.java │ │ │ │ ├── CaptureType.java │ │ │ │ ├── RewriteRule.java │ │ │ │ ├── Whitelist.java │ │ │ │ ├── auth │ │ │ │ │ └── AuthType.java │ │ │ │ └── dns │ │ │ │ │ ├── AbstractHostNameRemapper.java │ │ │ │ │ ├── AdvancedHostResolver.java │ │ │ │ │ ├── BasicHostResolver.java │ │ │ │ │ ├── ChainedHostResolver.java │ │ │ │ │ ├── DelegatingHostResolver.java │ │ │ │ │ ├── DnsJavaResolver.java │ │ │ │ │ ├── HostResolver.java │ │ │ │ │ ├── NativeCacheManipulatingResolver.java │ │ │ │ │ └── NativeResolver.java │ │ │ │ └── util │ │ │ │ ├── BrowserMobHttpUtil.java │ │ │ │ ├── BrowserMobProxyUtil.java │ │ │ │ ├── ClasspathResourceUtil.java │ │ │ │ ├── HttpMessageContents.java │ │ │ │ ├── HttpMessageInfo.java │ │ │ │ ├── HttpObjectUtil.java │ │ │ │ └── HttpUtil.java │ │ └── org │ │ │ └── littleshoot │ │ │ └── proxy │ │ │ └── mitm │ │ │ ├── Authority.java │ │ │ ├── BouncyCastleSslEngineSource.java │ │ │ ├── CertificateHelper.java │ │ │ ├── CertificateSniffingMitmManager.java │ │ │ ├── FakeCertificateException.java │ │ │ ├── Launcher.java │ │ │ ├── MergeTrustManager.java │ │ │ ├── RootCertificateException.java │ │ │ └── SubjectAlternativeNameHolder.java │ ├── jniLibs │ │ ├── armeabi │ │ │ └── libtracepath.so │ │ ├── mips │ │ │ └── libtracepath.so │ │ └── x86 │ │ │ └── libtracepath.so │ ├── res │ │ ├── drawable-hdpi │ │ │ ├── clear_button.png │ │ │ ├── ic_assignment_black_24dp.png │ │ │ ├── ic_assignment_white_24dp.png │ │ │ ├── ic_build_black_24dp.png │ │ │ ├── ic_chrome_reader_mode_black_24dp.png │ │ │ ├── ic_chrome_reader_mode_white_18dp.png │ │ │ ├── ic_chrome_reader_mode_white_24dp.png │ │ │ ├── ic_close_white_24dp.png │ │ │ ├── ic_delete_sweep_white_24dp.png │ │ │ ├── ic_description_black_24dp.png │ │ │ ├── ic_developer_board_black_24dp.png │ │ │ ├── ic_directions_black_24dp.png │ │ │ ├── ic_dns_black_24dp.png │ │ │ ├── ic_done.png │ │ │ ├── ic_error_black_24dp.png │ │ │ ├── ic_explore_black_24dp.png │ │ │ ├── ic_file_upload_white_24dp.png │ │ │ ├── ic_filter_list_white_24dp.png │ │ │ ├── ic_home_white_24dp.png │ │ │ ├── ic_info_black_24dp.png │ │ │ ├── ic_mode_edit_black_24dp.png │ │ │ ├── ic_note_add_black_24dp.png │ │ │ ├── ic_note_add_white_24dp.png │ │ │ ├── ic_notifications_black_24dp.png │ │ │ ├── ic_photo_black_24dp.png │ │ │ ├── ic_photo_camera_black_24dp.png │ │ │ ├── ic_search_white_24dp.png │ │ │ ├── ic_send_black_24dp.png │ │ │ ├── ic_send_white_18dp.png │ │ │ ├── ic_send_white_24dp.png │ │ │ ├── ic_share_black_24dp.png │ │ │ ├── ic_share_white_18dp.png │ │ │ ├── ic_share_white_24dp.png │ │ │ ├── ic_style_black_24dp.png │ │ │ ├── ic_style_white_24dp.png │ │ │ └── ic_sync_black_24dp.png │ │ ├── drawable-mdpi │ │ │ ├── clear_button.png │ │ │ ├── ic_assignment_black_24dp.png │ │ │ ├── ic_assignment_white_24dp.png │ │ │ ├── ic_build_black_24dp.png │ │ │ ├── ic_chrome_reader_mode_black_24dp.png │ │ │ ├── ic_chrome_reader_mode_white_18dp.png │ │ │ ├── ic_chrome_reader_mode_white_24dp.png │ │ │ ├── ic_close_white_24dp.png │ │ │ ├── ic_delete_sweep_white_24dp.png │ │ │ ├── ic_description_black_24dp.png │ │ │ ├── ic_developer_board_black_24dp.png │ │ │ ├── ic_directions_black_24dp.png │ │ │ ├── ic_dns_black_24dp.png │ │ │ ├── ic_done.png │ │ │ ├── ic_error_black_24dp.png │ │ │ ├── ic_explore_black_24dp.png │ │ │ ├── ic_file_upload_white_24dp.png │ │ │ ├── ic_filter_list_white_24dp.png │ │ │ ├── ic_home_white_24dp.png │ │ │ ├── ic_info_black_24dp.png │ │ │ ├── ic_mode_edit_black_24dp.png │ │ │ ├── ic_note_add_black_24dp.png │ │ │ ├── ic_note_add_white_24dp.png │ │ │ ├── ic_notifications_black_24dp.png │ │ │ ├── ic_photo_black_24dp.png │ │ │ ├── ic_photo_camera_black_24dp.png │ │ │ ├── ic_search_white_24dp.png │ │ │ ├── ic_send_black_24dp.png │ │ │ ├── ic_send_white_18dp.png │ │ │ ├── ic_send_white_24dp.png │ │ │ ├── ic_share_black_24dp.png │ │ │ ├── ic_share_white_18dp.png │ │ │ ├── ic_share_white_24dp.png │ │ │ ├── ic_style_black_24dp.png │ │ │ ├── ic_style_white_24dp.png │ │ │ └── ic_sync_black_24dp.png │ │ ├── drawable-v21 │ │ │ ├── ic_info_black_24dp.xml │ │ │ ├── ic_menu_camera.xml │ │ │ ├── ic_menu_gallery.xml │ │ │ ├── ic_menu_manage.xml │ │ │ ├── ic_menu_send.xml │ │ │ ├── ic_menu_share.xml │ │ │ ├── ic_menu_slideshow.xml │ │ │ ├── ic_menu_webview.xml │ │ │ ├── ic_notifications_black_24dp.xml │ │ │ └── ic_sync_black_24dp.xml │ │ ├── drawable-xhdpi │ │ │ ├── clear_button.png │ │ │ ├── ic_assignment_black_24dp.png │ │ │ ├── ic_assignment_white_24dp.png │ │ │ ├── ic_build_black_24dp.png │ │ │ ├── ic_chrome_reader_mode_black_24dp.png │ │ │ ├── ic_chrome_reader_mode_white_18dp.png │ │ │ ├── ic_chrome_reader_mode_white_24dp.png │ │ │ ├── ic_close_white_24dp.png │ │ │ ├── ic_delete_sweep_white_24dp.png │ │ │ ├── ic_description_black_24dp.png │ │ │ ├── ic_developer_board_black_24dp.png │ │ │ ├── ic_directions_black_24dp.png │ │ │ ├── ic_dns_black_24dp.png │ │ │ ├── ic_done.png │ │ │ ├── ic_error_black_24dp.png │ │ │ ├── ic_explore_black_24dp.png │ │ │ ├── ic_file_upload_white_24dp.png │ │ │ ├── ic_filter_list_white_24dp.png │ │ │ ├── ic_home_white_24dp.png │ │ │ ├── ic_info_black_24dp.png │ │ │ ├── ic_mode_edit_black_24dp.png │ │ │ ├── ic_note_add_black_24dp.png │ │ │ ├── ic_note_add_white_24dp.png │ │ │ ├── ic_notifications_black_24dp.png │ │ │ ├── ic_photo_black_24dp.png │ │ │ ├── ic_photo_camera_black_24dp.png │ │ │ ├── ic_search_white_24dp.png │ │ │ ├── ic_send_black_24dp.png │ │ │ ├── ic_send_white_18dp.png │ │ │ ├── ic_send_white_24dp.png │ │ │ ├── ic_share_black_24dp.png │ │ │ ├── ic_share_white_18dp.png │ │ │ ├── ic_share_white_24dp.png │ │ │ ├── ic_style_black_24dp.png │ │ │ ├── ic_style_white_24dp.png │ │ │ └── ic_sync_black_24dp.png │ │ ├── drawable-xxhdpi │ │ │ ├── clear_button.png │ │ │ ├── ic_assignment_black_24dp.png │ │ │ ├── ic_assignment_white_24dp.png │ │ │ ├── ic_build_black_24dp.png │ │ │ ├── ic_chrome_reader_mode_black_24dp.png │ │ │ ├── ic_chrome_reader_mode_white_18dp.png │ │ │ ├── ic_chrome_reader_mode_white_24dp.png │ │ │ ├── ic_close_white_24dp.png │ │ │ ├── ic_delete_sweep_white_24dp.png │ │ │ ├── ic_description_black_24dp.png │ │ │ ├── ic_developer_board_black_24dp.png │ │ │ ├── ic_directions_black_24dp.png │ │ │ ├── ic_dns_black_24dp.png │ │ │ ├── ic_done.png │ │ │ ├── ic_error_black_24dp.png │ │ │ ├── ic_explore_black_24dp.png │ │ │ ├── ic_file_upload_white_24dp.png │ │ │ ├── ic_filter_list_white_24dp.png │ │ │ ├── ic_home_white_24dp.png │ │ │ ├── ic_info_black_24dp.png │ │ │ ├── ic_mode_edit_black_24dp.png │ │ │ ├── ic_note_add_black_24dp.png │ │ │ ├── ic_note_add_white_24dp.png │ │ │ ├── ic_notifications_black_24dp.png │ │ │ ├── ic_photo_black_24dp.png │ │ │ ├── ic_photo_camera_black_24dp.png │ │ │ ├── ic_search_white_24dp.png │ │ │ ├── ic_send_black_24dp.png │ │ │ ├── ic_send_white_18dp.png │ │ │ ├── ic_send_white_24dp.png │ │ │ ├── ic_share_black_24dp.png │ │ │ ├── ic_share_white_18dp.png │ │ │ ├── ic_share_white_24dp.png │ │ │ ├── ic_style_black_24dp.png │ │ │ ├── ic_style_white_24dp.png │ │ │ └── ic_sync_black_24dp.png │ │ ├── drawable-xxxhdpi │ │ │ ├── clear_button.png │ │ │ ├── ic_assignment_black_24dp.png │ │ │ ├── ic_assignment_white_24dp.png │ │ │ ├── ic_build_black_24dp.png │ │ │ ├── ic_chrome_reader_mode_black_24dp.png │ │ │ ├── ic_chrome_reader_mode_white_18dp.png │ │ │ ├── ic_chrome_reader_mode_white_24dp.png │ │ │ ├── ic_close_white_24dp.png │ │ │ ├── ic_delete_sweep_white_24dp.png │ │ │ ├── ic_description_black_24dp.png │ │ │ ├── ic_developer_board_black_24dp.png │ │ │ ├── ic_directions_black_24dp.png │ │ │ ├── ic_dns_black_24dp.png │ │ │ ├── ic_error_black_24dp.png │ │ │ ├── ic_explore_black_24dp.png │ │ │ ├── ic_file_upload_white_24dp.png │ │ │ ├── ic_filter_list_white_24dp.png │ │ │ ├── ic_home_white_24dp.png │ │ │ ├── ic_info_black_24dp.png │ │ │ ├── ic_mode_edit_black_24dp.png │ │ │ ├── ic_note_add_black_24dp.png │ │ │ ├── ic_note_add_white_24dp.png │ │ │ ├── ic_notifications_black_24dp.png │ │ │ ├── ic_photo_black_24dp.png │ │ │ ├── ic_photo_camera_black_24dp.png │ │ │ ├── ic_search_white_24dp.png │ │ │ ├── ic_send_black_24dp.png │ │ │ ├── ic_send_white_18dp.png │ │ │ ├── ic_send_white_24dp.png │ │ │ ├── ic_share_black_24dp.png │ │ │ ├── ic_share_white_18dp.png │ │ │ ├── ic_share_white_24dp.png │ │ │ ├── ic_style_black_24dp.png │ │ │ ├── ic_style_white_24dp.png │ │ │ └── ic_sync_black_24dp.png │ │ ├── drawable │ │ │ ├── jz_toast_bg.xml │ │ │ ├── refresh.png │ │ │ └── side_nav_bar.xml │ │ ├── layout-v21 │ │ │ └── fragment_webview.xml │ │ ├── layout │ │ │ ├── activity_change_filter.xml │ │ │ ├── activity_detail.xml │ │ │ ├── activity_json.xml │ │ │ ├── activity_main.xml │ │ │ ├── activity_qr_code_scan.xml │ │ │ ├── activity_scrolling.xml │ │ │ ├── alert_code.xml │ │ │ ├── alert_edittext.xml │ │ │ ├── alert_filter.xml │ │ │ ├── alert_resp_filter.xml │ │ │ ├── alert_textview.xml │ │ │ ├── app_bar_main.xml │ │ │ ├── content_scrolling.xml │ │ │ ├── fragment_network.xml │ │ │ ├── fragment_preview.xml │ │ │ ├── fragment_webview.xml │ │ │ ├── item_cate.xml │ │ │ ├── item_detail.xml │ │ │ ├── item_filter.xml │ │ │ ├── item_pages.xml │ │ │ ├── item_preview.xml │ │ │ ├── layout_loading2_dialog.xml │ │ │ └── nav_header_main.xml │ │ ├── menu │ │ │ ├── activity_main_drawer.xml │ │ │ ├── json_menu.xml │ │ │ └── main.xml │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher.png │ │ ├── raw │ │ │ └── qrcode_completed.mp3 │ │ ├── values-v21 │ │ │ └── styles.xml │ │ ├── values-w820dp │ │ │ └── dimens.xml │ │ ├── values │ │ │ ├── attrs.xml │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── drawables.xml │ │ │ ├── progress_wheel_attrs.xml │ │ │ ├── strings.xml │ │ │ ├── styles.xml │ │ │ ├── zxing_color.xml │ │ │ └── zxing_ids.xml │ │ └── xml │ │ │ ├── admin.xml │ │ │ ├── network_security_config.xml │ │ │ ├── pref_data_sync.xml │ │ │ ├── pref_general.xml │ │ │ ├── pref_notification.xml │ │ │ └── searchable.xml │ └── resources │ │ ├── cacerts.pem │ │ ├── default-ciphers.txt │ │ ├── net │ │ ├── lightbody │ │ │ └── bmp │ │ │ │ └── version │ │ └── sf │ │ │ └── uadetector │ │ │ ├── config.properties │ │ │ ├── uas.version │ │ │ ├── uas.xml │ │ │ └── uasxmldata.dtd │ │ └── sslSupport │ │ ├── ca-certificate-ec.cer │ │ ├── ca-certificate-rsa.cer │ │ ├── ca-keystore-ec.p12 │ │ └── ca-keystore-rsa.p12 │ └── test │ └── java │ └── cn │ └── darkal │ └── networkdiagnosis │ └── ExampleUnitTest.java ├── build.gradle ├── gradle-wrapper.properties ├── gradle.properties ├── gradle ├── warpper │ └── gradle-wrapper.properties └── wrapper │ └── gradle-wrapper.properties └── settings.gradle /.travis.yml: -------------------------------------------------------------------------------- 1 | language: android 2 | jdk: oraclejdk8 3 | dist: trusty 4 | global_env: _JAVA_OPTIONS=-Xmx4g 5 | 6 | android: 7 | components: 8 | - build-tools-27.0.3 9 | - android-22 10 | - sys-img-armeabi-v7a-android-22 11 | - android-27 12 | - extra-android-m2repository 13 | - extra-android-support 14 | licenses: 15 | - android-sdk-license-.+ 16 | - '.+' 17 | before_script: 18 | - wget http://services.gradle.org/distributions/gradle-4.4-all.zip 19 | - unzip gradle-4.4-all.zip 20 | - export GRADLE_HOME=$PWD/gradle-4.4 21 | - export PATH=$GRADLE_HOME/bin:$PATH 22 | - mkdir "$ANDROID_HOME/licenses" || true 23 | - echo -e "\n8933bad161af4178b1185d1a37fbf41ea5269c55" > "$ANDROID_HOME/licenses/android-sdk-license" 24 | - echo -e "\n84831b9409646a918e30573bab4c9c91346d8abd" > "$ANDROID_HOME/licenses/android-sdk-preview-license" 25 | - echo no | android create avd --force -n test -t android-22 --abi armeabi-v7a 26 | - emulator -avd test -no-audio -no-window & 27 | - android-wait-for-emulator 28 | - adb shell input keyevent 82 & 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Darkal 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/darkal.jks: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/darkal.jks -------------------------------------------------------------------------------- /app/libs/android-sun-jarsign-support-1.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/libs/android-sun-jarsign-support-1.1.jar -------------------------------------------------------------------------------- /app/libs/netty-all-android-4.0.44.Final.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/libs/netty-all-android-4.0.44.Final.jar -------------------------------------------------------------------------------- /app/libs/zxing.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/libs/zxing.jar -------------------------------------------------------------------------------- /app/src/androidTest/java/cn/darkal/networkdiagnosis/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package cn.darkal.networkdiagnosis; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/java/cn/darkal/networkdiagnosis/Adapter/PageFilterAdapter.java: -------------------------------------------------------------------------------- 1 | package cn.darkal.networkdiagnosis.Adapter; 2 | 3 | import android.databinding.DataBindingUtil; 4 | import android.databinding.ViewDataBinding; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.BaseAdapter; 9 | 10 | import java.util.List; 11 | 12 | import cn.darkal.networkdiagnosis.bean.PageBean; 13 | import cn.darkal.networkdiagnosis.BR; 14 | import cn.darkal.networkdiagnosis.R; 15 | 16 | /** 17 | * Created by Darkal on 2016/9/5. 18 | */ 19 | 20 | public class PageFilterAdapter extends BaseAdapter{ 21 | 22 | public PageFilterAdapter(List pageBeenList){ 23 | this.pageBeenList = pageBeenList; 24 | } 25 | 26 | private List pageBeenList; 27 | 28 | @Override 29 | public int getCount() { 30 | return pageBeenList.size(); 31 | } 32 | 33 | @Override 34 | public Object getItem(int position) { 35 | return pageBeenList.get(position); 36 | } 37 | 38 | @Override 39 | public long getItemId(int position) { 40 | return pageBeenList.get(position).getIndex(); 41 | } 42 | 43 | @Override 44 | public View getView(int position, View convertView, ViewGroup parent) { 45 | ViewDataBinding listItemBinding; 46 | if (convertView != null) { 47 | listItemBinding = (ViewDataBinding) convertView.getTag(); 48 | } else { 49 | listItemBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.item_pages, parent, false); 50 | convertView = listItemBinding.getRoot(); 51 | convertView.setTag(listItemBinding); 52 | } 53 | listItemBinding.setVariable(BR.pages,pageBeenList.get(position)); 54 | listItemBinding.executePendingBindings(); 55 | // listItemBinding.setButtonclick(new ButtonClick(MainActivity.this,position)); 56 | return convertView; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /app/src/main/java/cn/darkal/networkdiagnosis/Fragment/BackHandledInterface.java: -------------------------------------------------------------------------------- 1 | package cn.darkal.networkdiagnosis.Fragment; 2 | 3 | /** 4 | * Created by xuzhou on 2016/8/10. 5 | */ 6 | public interface BackHandledInterface { 7 | void setSelectedFragment(BaseFragment selectedFragment); 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/cn/darkal/networkdiagnosis/Fragment/BaseFragment.java: -------------------------------------------------------------------------------- 1 | package cn.darkal.networkdiagnosis.Fragment; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | import android.support.v4.app.Fragment; 6 | 7 | import cn.darkal.networkdiagnosis.Activity.MainActivity; 8 | 9 | /** 10 | * Created by xuzhou on 2016/8/10. 11 | */ 12 | public abstract class BaseFragment extends Fragment { 13 | 14 | protected BackHandledInterface mBackHandledInterface; 15 | 16 | /** 17 | * 所有继承BackHandledFragment的子类都将在这个方法中实现物理Back键按下后的逻辑 18 | * FragmentActivity捕捉到物理返回键点击事件后会首先询问Fragment是否消费该事件 19 | * 如果没有Fragment消息时FragmentActivity自己才会消费该事件 20 | */ 21 | public abstract boolean onBackPressed(); 22 | 23 | @Override 24 | public void onCreate(Bundle savedInstanceState) { 25 | super.onCreate(savedInstanceState); 26 | if(!(getActivity() instanceof BackHandledInterface)){ 27 | throw new ClassCastException("Hosting Activity must implement BackHandledInterface"); 28 | }else{ 29 | this.mBackHandledInterface = (BackHandledInterface)getActivity(); 30 | } 31 | } 32 | 33 | @Override 34 | public void onStart() { 35 | super.onStart(); 36 | //告诉FragmentActivity,当前Fragment在栈顶 37 | // mBackHandledInterface.setSelectedFragment(this); 38 | } 39 | 40 | @Override 41 | public void setUserVisibleHint(boolean isVisibleToUser) { 42 | super.setUserVisibleHint(isVisibleToUser); 43 | if (isVisibleToUser) { 44 | if (getActivity() instanceof MainActivity) { 45 | ((MainActivity) getActivity()).changeStateBar(this); 46 | } 47 | if (mBackHandledInterface != null) { 48 | //告诉FragmentActivity,当前Fragment在栈顶 49 | mBackHandledInterface.setSelectedFragment(this); 50 | } 51 | } 52 | } 53 | 54 | @Override 55 | public void onAttach(Context context) { 56 | super.onAttach(context); 57 | if (getActivity() instanceof MainActivity) { 58 | ((MainActivity) getActivity()).changeStateBar(this); 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /app/src/main/java/cn/darkal/networkdiagnosis/Receiver/MyAdminReceiver.java: -------------------------------------------------------------------------------- 1 | package cn.darkal.networkdiagnosis.Receiver; 2 | 3 | import android.app.admin.DeviceAdminReceiver; 4 | 5 | /** 6 | * Created by xuzhou on 2016/8/12. 7 | */ 8 | public class MyAdminReceiver extends DeviceAdminReceiver { 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/cn/darkal/networkdiagnosis/Task/BaseTask.java: -------------------------------------------------------------------------------- 1 | package cn.darkal.networkdiagnosis.Task; 2 | 3 | import android.widget.TextView; 4 | 5 | /** 6 | * Created by xuzhou on 2016/8/1. 7 | */ 8 | public abstract class BaseTask { 9 | 10 | String url; 11 | TextView resultTextView; 12 | 13 | String tag; 14 | 15 | public BaseTask(String url, TextView resultTextView) { 16 | this.url = url; 17 | this.resultTextView = resultTextView; 18 | } 19 | 20 | public void doTask(){ 21 | resultTextView.setText(""); 22 | tag = System.currentTimeMillis()+""; 23 | resultTextView.setTag(tag); 24 | // TraceTask运行于主线程 25 | if(this instanceof TraceTask){ 26 | getExecRunnable().run(); 27 | }else { 28 | new Thread(getExecRunnable()).start(); 29 | } 30 | } 31 | 32 | public class updateResultRunnable implements Runnable{ 33 | String resultString; 34 | 35 | public updateResultRunnable(String resultString){ 36 | this.resultString = resultString; 37 | } 38 | 39 | @Override 40 | public void run() { 41 | if(resultTextView!=null && resultTextView.getTag().equals(tag)) { 42 | resultTextView.append(resultString); 43 | resultTextView.requestFocus(); 44 | } 45 | } 46 | } 47 | 48 | public abstract Runnable getExecRunnable(); 49 | } 50 | -------------------------------------------------------------------------------- /app/src/main/java/cn/darkal/networkdiagnosis/Task/DnsTask.java: -------------------------------------------------------------------------------- 1 | package cn.darkal.networkdiagnosis.Task; 2 | 3 | import android.widget.TextView; 4 | import java.net.InetAddress; 5 | 6 | /** 7 | * Created by xuzhou on 2016/8/1. 8 | */ 9 | public class DnsTask extends BaseTask { 10 | String url; 11 | TextView resultTextView; 12 | 13 | public DnsTask(String url, TextView resultTextView) { 14 | super(url, resultTextView); 15 | this.url = url; 16 | this.resultTextView = resultTextView; 17 | } 18 | 19 | @Override 20 | public Runnable getExecRunnable() { 21 | return execRunnable; 22 | } 23 | 24 | public Runnable execRunnable = new Runnable() { 25 | @Override 26 | public void run() { 27 | StringBuilder sb = new StringBuilder(); 28 | try{ 29 | InetAddress aaa = InetAddress.getByName(url); 30 | InetAddress[] addrs = InetAddress.getAllByName(url); 31 | sb.append("Begin: \n" + aaa.toString() + "\nEnd\n"); 32 | for (InetAddress adr : addrs) 33 | { 34 | sb.append(adr.toString() + "\n"); 35 | resultTextView.post(new updateResultRunnable(adr.toString() + "\n")); 36 | } 37 | } 38 | catch (Exception e){ 39 | resultTextView.post(new updateResultRunnable(e.toString() + "\n")); 40 | } 41 | } 42 | }; 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/cn/darkal/networkdiagnosis/Task/InfoTask.java: -------------------------------------------------------------------------------- 1 | package cn.darkal.networkdiagnosis.Task; 2 | 3 | import android.widget.TextView; 4 | 5 | 6 | import cn.darkal.networkdiagnosis.Utils.NetInfo.NetBasicInfo; 7 | import cn.darkal.networkdiagnosis.Utils.NetInfo.SystemBasicInfo; 8 | 9 | /** 10 | * Created by xuzhou on 2016/8/1. 11 | */ 12 | public class InfoTask extends BaseTask { 13 | String url; 14 | 15 | TextView resultTextView; 16 | 17 | public InfoTask(String url, TextView resultTextView) { 18 | super(url, resultTextView); 19 | this.url = url; 20 | this.resultTextView = resultTextView; 21 | } 22 | 23 | @Override 24 | public Runnable getExecRunnable() { 25 | return execRunnable; 26 | } 27 | 28 | public Runnable execRunnable = new Runnable() { 29 | @Override 30 | public void run() { 31 | NetBasicInfo mNetBasicInfo = NetBasicInfo.getInstance(resultTextView.getContext()); 32 | 33 | resultTextView.post(new updateResultRunnable(mNetBasicInfo.getApnInfo() 34 | + "\r\nMac address : \r\n" 35 | + "wlan0 :\t" + mNetBasicInfo.getMacAddress("wlan0") 36 | + "\np2p0 :\t " + mNetBasicInfo.getMacAddress("p2p0") 37 | + "\n\n" + SystemBasicInfo.getBuildInfo() 38 | + "\n")); 39 | } 40 | }; 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/cn/darkal/networkdiagnosis/Task/PingTask.java: -------------------------------------------------------------------------------- 1 | package cn.darkal.networkdiagnosis.Task; 2 | 3 | import android.util.Log; 4 | import android.widget.TextView; 5 | 6 | import java.io.BufferedReader; 7 | import java.io.IOException; 8 | import java.io.InputStreamReader; 9 | 10 | /** 11 | * Created by xuzhou on 2016/8/1. 12 | */ 13 | public class PingTask extends BaseTask { 14 | String url; 15 | TextView resultTextView; 16 | 17 | public PingTask(String url, TextView resultTextView) { 18 | super(url, resultTextView); 19 | this.url = url; 20 | this.resultTextView = resultTextView; 21 | } 22 | 23 | @Override 24 | public Runnable getExecRunnable() { 25 | return execRunnable; 26 | } 27 | 28 | public Runnable execRunnable = new Runnable() { 29 | @Override 30 | public void run() { 31 | BufferedReader in = null; 32 | Runtime rt = Runtime.getRuntime(); 33 | boolean FoundMatch = false; 34 | String pingCommand = "/system/bin/ping -c 10 " + url; 35 | Log.e("TAG", "ping thread is running"); 36 | try { 37 | Process pro = rt.exec(pingCommand); 38 | in = new BufferedReader(new InputStreamReader(pro.getInputStream())); 39 | 40 | final StringBuilder sb = new StringBuilder(); 41 | String line = in.readLine(); 42 | 43 | while (line != null) { 44 | sb.append(line + "\n"); 45 | resultTextView.post(new updateResultRunnable(line + "\n")); 46 | line = in.readLine(); 47 | } 48 | } catch (IOException e) { 49 | resultTextView.post(new updateResultRunnable(e.toString() + "\n")); 50 | } finally { 51 | try{ 52 | if (in != null) { 53 | in.close(); 54 | } 55 | }catch (Exception e){ 56 | e.printStackTrace(); 57 | } 58 | } 59 | } 60 | }; 61 | } 62 | -------------------------------------------------------------------------------- /app/src/main/java/cn/darkal/networkdiagnosis/bean/PageBean.java: -------------------------------------------------------------------------------- 1 | package cn.darkal.networkdiagnosis.bean; 2 | 3 | /** 4 | * Created by xuzhou on 2016/9/5. 5 | */ 6 | 7 | public class PageBean { 8 | private int index; 9 | private String name; 10 | private String count; 11 | private Boolean isSelected = true; 12 | 13 | 14 | public int getIndex() { 15 | return index; 16 | } 17 | 18 | public void setIndex(int index) { 19 | this.index = index; 20 | } 21 | 22 | public String getName() { 23 | return name; 24 | } 25 | 26 | public void setName(String name) { 27 | this.name = name; 28 | } 29 | 30 | public String getCount() { 31 | return count+"请求"; 32 | } 33 | 34 | public Integer getCountInt() { 35 | try{ 36 | return Integer.parseInt(count); 37 | }catch (Exception e){ 38 | return 0; 39 | } 40 | } 41 | 42 | public void setCount(String count) { 43 | this.count = count; 44 | } 45 | 46 | public Boolean getSelected() { 47 | return isSelected; 48 | } 49 | 50 | public void setSelected(Boolean selected) { 51 | isSelected = selected; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /app/src/main/java/cn/darkal/networkdiagnosis/bean/ResponseFilterRule.java: -------------------------------------------------------------------------------- 1 | package cn.darkal.networkdiagnosis.bean; 2 | 3 | import java.io.Serializable; 4 | 5 | import static cn.darkal.networkdiagnosis.bean.ResponseFilterRule.RULE_TYPE.STRING_REPLACE; 6 | 7 | /** 8 | * Created by darkal on 2017/5/31. 9 | */ 10 | 11 | public class ResponseFilterRule implements Serializable{ 12 | enum RULE_TYPE{ 13 | STRING_REPLACE, 14 | BEGIN_INSERT, 15 | END_INSERT 16 | } 17 | 18 | private RULE_TYPE ruleType = STRING_REPLACE; 19 | private String url; 20 | private String replaceRegex; 21 | private String replaceContent; 22 | private Boolean isEnable = true; 23 | 24 | public RULE_TYPE getRuleType() { 25 | return ruleType; 26 | } 27 | 28 | public void setRuleType(RULE_TYPE ruleType) { 29 | this.ruleType = ruleType; 30 | } 31 | 32 | public String getUrl() { 33 | return url; 34 | } 35 | 36 | public void setUrl(String url) { 37 | this.url = url; 38 | } 39 | 40 | public String getReplaceRegex() { 41 | return replaceRegex; 42 | } 43 | 44 | public void setReplaceRegex(String replaceRegex) { 45 | this.replaceRegex = replaceRegex; 46 | } 47 | 48 | public String getReplaceContent() { 49 | return replaceContent; 50 | } 51 | 52 | public void setReplaceContent(String replaceContent) { 53 | this.replaceContent = replaceContent; 54 | } 55 | 56 | public Boolean getEnable() { 57 | return isEnable; 58 | } 59 | 60 | public void setEnable(Boolean enable) { 61 | isEnable = enable; 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /app/src/main/java/com/google/zxing/camera/FrontLightMode.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2012 ZXing authors 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.zxing.camera; 18 | 19 | import android.content.SharedPreferences; 20 | 21 | /** 22 | * Enumerates settings of the preference controlling the front light. 23 | */ 24 | public enum FrontLightMode { 25 | 26 | /** 27 | * Always on. 28 | */ 29 | ON, 30 | /** 31 | * On only when ambient light is low. 32 | */ 33 | AUTO, 34 | /** 35 | * Always off. 36 | */ 37 | OFF; 38 | 39 | private static FrontLightMode parse(String modeString) { 40 | return modeString == null ? OFF : valueOf(modeString); 41 | } 42 | 43 | public static FrontLightMode readPref(SharedPreferences sharedPrefs) { 44 | return OFF; 45 | //return parse(sharedPrefs.getString(PreferencesActivity.KEY_FRONT_LIGHT_MODE, OFF.toString())); 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /app/src/main/java/com/google/zxing/camera/PreviewCallback.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2010 ZXing authors 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.zxing.camera; 18 | 19 | import android.graphics.Point; 20 | import android.hardware.Camera; 21 | import android.os.Handler; 22 | import android.os.Message; 23 | import android.util.Log; 24 | 25 | final class PreviewCallback implements Camera.PreviewCallback { 26 | 27 | private static final String TAG = PreviewCallback.class.getSimpleName(); 28 | 29 | private final CameraConfigurationManager configManager; 30 | private Handler previewHandler; 31 | private int previewMessage; 32 | 33 | PreviewCallback(CameraConfigurationManager configManager) { 34 | this.configManager = configManager; 35 | } 36 | 37 | void setHandler(Handler previewHandler, int previewMessage) { 38 | this.previewHandler = previewHandler; 39 | this.previewMessage = previewMessage; 40 | } 41 | 42 | @Override 43 | public void onPreviewFrame(byte[] data, Camera camera) { 44 | Point cameraResolution = configManager.getCameraResolution(); 45 | Handler thePreviewHandler = previewHandler; 46 | if (cameraResolution != null && thePreviewHandler != null) { 47 | Message message = thePreviewHandler.obtainMessage(previewMessage, cameraResolution.x, 48 | cameraResolution.y, data); 49 | message.sendToTarget(); 50 | previewHandler = null; 51 | } else { 52 | Log.d(TAG, "Got preview callback, but no handler or resolution available"); 53 | } 54 | } 55 | 56 | } 57 | -------------------------------------------------------------------------------- /app/src/main/java/com/google/zxing/decoding/FinishListener.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2010 ZXing authors 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.zxing.decoding; 18 | 19 | import android.app.Activity; 20 | import android.content.DialogInterface; 21 | 22 | /** 23 | * Simple listener used to exit the app in a few cases. 24 | * 25 | * @author Sean Owen 26 | */ 27 | public final class FinishListener implements DialogInterface.OnClickListener, DialogInterface.OnCancelListener { 28 | 29 | private final Activity activityToFinish; 30 | 31 | public FinishListener(Activity activityToFinish) { 32 | this.activityToFinish = activityToFinish; 33 | } 34 | 35 | @Override 36 | public void onCancel(DialogInterface dialogInterface) { 37 | run(); 38 | } 39 | 40 | @Override 41 | public void onClick(DialogInterface dialogInterface, int i) { 42 | run(); 43 | } 44 | 45 | private void run() { 46 | activityToFinish.finish(); 47 | } 48 | 49 | } 50 | -------------------------------------------------------------------------------- /app/src/main/java/com/google/zxing/view/ViewfinderResultPointCallback.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2009 ZXing authors 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.google.zxing.view; 18 | 19 | import com.google.zxing.ResultPoint; 20 | import com.google.zxing.ResultPointCallback; 21 | 22 | public final class ViewfinderResultPointCallback implements ResultPointCallback { 23 | 24 | private final ViewfinderView viewfinderView; 25 | 26 | public ViewfinderResultPointCallback(ViewfinderView viewfinderView) { 27 | this.viewfinderView = viewfinderView; 28 | } 29 | 30 | @Override 31 | public void foundPossibleResultPoint(ResultPoint point) { 32 | viewfinderView.addPossibleResultPoint(point); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/java/com/netease/LDNetDiagnoService/LDNetDiagnoListener.java: -------------------------------------------------------------------------------- 1 | package com.netease.LDNetDiagnoService; 2 | 3 | /** 4 | * 监控网络诊断的跟踪信息 5 | * @author panghui 6 | * 7 | */ 8 | public interface LDNetDiagnoListener { 9 | 10 | /** 11 | * 当结束之后返回日志 12 | * @param log 13 | */ 14 | public void OnNetDiagnoFinished(String log); 15 | 16 | 17 | /** 18 | * 跟踪过程中更新日志 19 | * @param log 20 | */ 21 | public void OnNetDiagnoUpdated(String log); 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/core/har/Har.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.core.har; 2 | 3 | import com.fasterxml.jackson.databind.ObjectMapper; 4 | 5 | import java.io.File; 6 | import java.io.IOException; 7 | import java.io.OutputStream; 8 | import java.io.Writer; 9 | 10 | public class Har { 11 | 12 | private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); 13 | 14 | private volatile HarLog log; 15 | 16 | public Har() { 17 | } 18 | 19 | public Har(HarLog log) { 20 | this.log = log; 21 | } 22 | 23 | public HarLog getLog() { 24 | return log; 25 | } 26 | 27 | public void setLog(HarLog log) { 28 | this.log = log; 29 | } 30 | 31 | public void writeTo(Writer writer) throws IOException { 32 | OBJECT_MAPPER.writeValue(writer, this); 33 | } 34 | 35 | public void writeTo(OutputStream os) throws IOException { 36 | OBJECT_MAPPER.writeValue(os, this); 37 | } 38 | 39 | public void writeTo(File file) throws IOException { 40 | OBJECT_MAPPER.writeValue(file, this); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/core/har/HarCache.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.core.har; 2 | 3 | import com.fasterxml.jackson.annotation.JsonInclude; 4 | 5 | @JsonInclude(JsonInclude.Include.NON_NULL) 6 | public class HarCache { 7 | private volatile HarCacheStatus beforeRequest; 8 | private volatile HarCacheStatus afterRequest; 9 | 10 | public HarCacheStatus getBeforeRequest() { 11 | return beforeRequest; 12 | } 13 | 14 | public void setBeforeRequest(HarCacheStatus beforeRequest) { 15 | this.beforeRequest = beforeRequest; 16 | } 17 | 18 | public HarCacheStatus getAfterRequest() { 19 | return afterRequest; 20 | } 21 | 22 | public void setAfterRequest(HarCacheStatus afterRequest) { 23 | this.afterRequest = afterRequest; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/core/har/HarCacheStatus.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.core.har; 2 | 3 | import com.fasterxml.jackson.annotation.JsonFormat; 4 | import com.fasterxml.jackson.annotation.JsonInclude; 5 | 6 | import java.util.Date; 7 | 8 | @JsonInclude(JsonInclude.Include.NON_NULL) 9 | public class HarCacheStatus { 10 | private volatile Date expires; 11 | private volatile Date lastAccess; 12 | private volatile String eTag; 13 | private volatile int hitCount; 14 | private volatile String comment = ""; 15 | 16 | @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss") 17 | public Date getExpires() { 18 | return expires; 19 | } 20 | 21 | public void setExpires(Date expires) { 22 | this.expires = expires; 23 | } 24 | 25 | @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss") 26 | public Date getLastAccess() { 27 | return lastAccess; 28 | } 29 | 30 | public void setLastAccess(Date lastAccess) { 31 | this.lastAccess = lastAccess; 32 | } 33 | 34 | public String geteTag() { 35 | return eTag; 36 | } 37 | 38 | public void seteTag(String eTag) { 39 | this.eTag = eTag; 40 | } 41 | 42 | public int getHitCount() { 43 | return hitCount; 44 | } 45 | 46 | public void setHitCount(int hitCount) { 47 | this.hitCount = hitCount; 48 | } 49 | 50 | public String getComment() { 51 | return comment; 52 | } 53 | 54 | public void setComment(String comment) { 55 | this.comment = comment; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/core/har/HarContent.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.core.har; 2 | 3 | import com.fasterxml.jackson.annotation.JsonInclude; 4 | 5 | @JsonInclude(JsonInclude.Include.NON_NULL) 6 | public class HarContent { 7 | private volatile long size; 8 | private volatile Long compression; 9 | 10 | // mimeType is required; though it shouldn't be set to null, if it is, it still needs to be included to comply with the HAR spec 11 | @JsonInclude(JsonInclude.Include.ALWAYS) 12 | private volatile String mimeType = ""; 13 | 14 | private volatile String text; 15 | private volatile String encoding; 16 | private volatile String comment = ""; 17 | 18 | public long getSize() { 19 | return size; 20 | } 21 | 22 | public void setSize(long size) { 23 | this.size = size; 24 | } 25 | 26 | public Long getCompression() { 27 | return compression; 28 | } 29 | 30 | public void setCompression(Long compression) { 31 | this.compression = compression; 32 | } 33 | 34 | public String getMimeType() { 35 | return mimeType; 36 | } 37 | 38 | public void setMimeType(String mimeType) { 39 | this.mimeType = mimeType; 40 | } 41 | 42 | public String getText() { 43 | return text; 44 | } 45 | 46 | public void setText(String text) { 47 | this.text = text; 48 | } 49 | 50 | public String getEncoding() { 51 | return encoding; 52 | } 53 | 54 | public void setEncoding(String encoding) { 55 | this.encoding = encoding; 56 | } 57 | 58 | public String getComment() { 59 | return comment; 60 | } 61 | 62 | public void setComment(String comment) { 63 | this.comment = comment; 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/core/har/HarNameValuePair.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.core.har; 2 | 3 | import java.net.URLDecoder; 4 | 5 | public final class HarNameValuePair { 6 | private final String name; 7 | private final String value; 8 | 9 | public HarNameValuePair(String name, String value) { 10 | this.name = name; 11 | this.value = value; 12 | } 13 | 14 | public String getName() { 15 | return name; 16 | } 17 | 18 | public String getValue() { 19 | return value; 20 | } 21 | 22 | public String getDecodeValue(){ 23 | try { 24 | return URLDecoder.decode(value); 25 | }catch (Exception e){ 26 | return value; 27 | } 28 | } 29 | 30 | public String toString() { 31 | return name + "=" + value; 32 | } 33 | 34 | @Override 35 | public boolean equals(Object o) { 36 | if (this == o) return true; 37 | if (o == null || getClass() != o.getClass()) return false; 38 | 39 | HarNameValuePair that = (HarNameValuePair) o; 40 | 41 | if (name != null ? !name.equals(that.name) : that.name != null) return false; 42 | if (value != null ? !value.equals(that.value) : that.value != null) return false; 43 | 44 | return true; 45 | } 46 | 47 | @Override 48 | public int hashCode() { 49 | int result = name != null ? name.hashCode() : 0; 50 | result = 31 * result + (value != null ? value.hashCode() : 0); 51 | return result; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/core/har/HarNameVersion.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.core.har; 2 | 3 | public class HarNameVersion { 4 | private final String name; 5 | private final String version; 6 | private volatile String comment = ""; 7 | 8 | public HarNameVersion(String name, String version) { 9 | this.name = name; 10 | this.version = version; 11 | } 12 | 13 | public String getName() { 14 | return name; 15 | } 16 | 17 | public String getVersion() { 18 | return version; 19 | } 20 | 21 | public String getComment() { 22 | return comment; 23 | } 24 | 25 | public void setComment(String comment) { 26 | this.comment = comment; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/core/har/HarPage.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.core.har; 2 | 3 | import com.fasterxml.jackson.annotation.JsonFormat; 4 | import com.fasterxml.jackson.annotation.JsonInclude; 5 | 6 | import java.util.Date; 7 | 8 | @JsonInclude(JsonInclude.Include.NON_NULL) 9 | public class HarPage { 10 | private volatile String id; 11 | private volatile Date startedDateTime; 12 | private volatile String title = ""; 13 | private final HarPageTimings pageTimings = new HarPageTimings(); 14 | private volatile String comment = ""; 15 | 16 | public HarPage() { 17 | } 18 | 19 | public HarPage(String id) { 20 | this(id, ""); 21 | } 22 | 23 | public HarPage(String id, String title) { 24 | this.id = id; 25 | this.title = title; 26 | startedDateTime = new Date(); 27 | } 28 | 29 | public String getId() { 30 | return id; 31 | } 32 | 33 | public void setId(String id) { 34 | this.id = id; 35 | } 36 | 37 | @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.ssZ") 38 | public Date getStartedDateTime() { 39 | return startedDateTime; 40 | } 41 | 42 | public void setStartedDateTime(Date startedDateTime) { 43 | this.startedDateTime = startedDateTime; 44 | } 45 | 46 | public String getTitle() { 47 | return title; 48 | } 49 | 50 | public void setTitle(String title) { 51 | this.title = title; 52 | } 53 | 54 | public HarPageTimings getPageTimings() { 55 | return pageTimings; 56 | } 57 | 58 | public String getComment() { 59 | return comment; 60 | } 61 | 62 | public void setComment(String comment) { 63 | this.comment = comment; 64 | } 65 | 66 | } 67 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/core/har/HarPageTimings.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.core.har; 2 | 3 | import com.fasterxml.jackson.annotation.JsonInclude; 4 | 5 | @JsonInclude(JsonInclude.Include.NON_NULL) 6 | public class HarPageTimings { 7 | private volatile Long onContentLoad; 8 | private volatile Long onLoad; 9 | private volatile String comment = ""; 10 | 11 | public HarPageTimings() { 12 | } 13 | 14 | public HarPageTimings(Long onContentLoad, Long onLoad) { 15 | this.onContentLoad = onContentLoad; 16 | this.onLoad = onLoad; 17 | } 18 | 19 | public Long getOnContentLoad() { 20 | return onContentLoad; 21 | } 22 | 23 | public void setOnContentLoad(Long onContentLoad) { 24 | this.onContentLoad = onContentLoad; 25 | } 26 | 27 | public Long getOnLoad() { 28 | return onLoad; 29 | } 30 | 31 | public void setOnLoad(Long onLoad) { 32 | this.onLoad = onLoad; 33 | } 34 | 35 | public String getComment() { 36 | return comment; 37 | } 38 | 39 | public void setComment(String comment) { 40 | this.comment = comment; 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/core/har/HarPostData.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.core.har; 2 | 3 | import com.fasterxml.jackson.annotation.JsonInclude; 4 | 5 | import java.util.List; 6 | 7 | @JsonInclude(JsonInclude.Include.NON_NULL) 8 | public class HarPostData { 9 | private volatile String mimeType; 10 | private volatile List params; 11 | private volatile String text; 12 | private volatile String comment = ""; 13 | 14 | public String getMimeType() { 15 | return mimeType; 16 | } 17 | 18 | public void setMimeType(String mimeType) { 19 | this.mimeType = mimeType; 20 | } 21 | 22 | public List getParams() { 23 | return params; 24 | } 25 | 26 | public void setParams(List params) { 27 | this.params = params; 28 | } 29 | 30 | public String getText() { 31 | return text; 32 | } 33 | 34 | public void setText(String text) { 35 | this.text = text; 36 | } 37 | 38 | public String getComment() { 39 | return comment; 40 | } 41 | 42 | public void setComment(String comment) { 43 | this.comment = comment; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/core/har/HarPostDataParam.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.core.har; 2 | 3 | import com.fasterxml.jackson.annotation.JsonInclude; 4 | 5 | @JsonInclude(JsonInclude.Include.NON_NULL) 6 | public class HarPostDataParam { 7 | private volatile String name; 8 | private volatile String value; 9 | private volatile String fileName; 10 | private volatile String contentType; 11 | private volatile String comment = ""; 12 | 13 | public HarPostDataParam() { 14 | } 15 | 16 | public HarPostDataParam(String name, String value) { 17 | this.name = name; 18 | this.value = value; 19 | } 20 | 21 | public String getName() { 22 | return name; 23 | } 24 | 25 | public void setName(String name) { 26 | this.name = name; 27 | } 28 | 29 | public String getValue() { 30 | return value; 31 | } 32 | 33 | public void setValue(String value) { 34 | this.value = value; 35 | } 36 | 37 | public String getFileName() { 38 | return fileName; 39 | } 40 | 41 | public void setFileName(String fileName) { 42 | this.fileName = fileName; 43 | } 44 | 45 | public String getContentType() { 46 | return contentType; 47 | } 48 | 49 | public void setContentType(String contentType) { 50 | this.contentType = contentType; 51 | } 52 | 53 | public String getComment() { 54 | return comment; 55 | } 56 | 57 | public void setComment(String comment) { 58 | this.comment = comment; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/core/har/PageRefFilteredHar.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.core.har; 2 | 3 | import java.util.Set; 4 | 5 | /** 6 | * Created by Darkal on 2016/9/2. 7 | */ 8 | 9 | public class PageRefFilteredHar extends Har { 10 | public PageRefFilteredHar(Har har, Set pageRef) { 11 | super(new PageRefFilteredHarLog(har.getLog(), pageRef)); 12 | } 13 | 14 | public PageRefFilteredHar(Har har, String pageRef) { 15 | super(new PageRefFilteredHarLog(har.getLog(), pageRef)); 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/exception/DecompressionException.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.exception; 2 | 3 | /** 4 | * Indicates that an error occurred while decompressing content. 5 | */ 6 | public class DecompressionException extends RuntimeException { 7 | private static final long serialVersionUID = 8666473793514307564L; 8 | 9 | public DecompressionException() { 10 | } 11 | 12 | public DecompressionException(String message) { 13 | super(message); 14 | } 15 | 16 | public DecompressionException(String message, Throwable cause) { 17 | super(message, cause); 18 | } 19 | 20 | public DecompressionException(Throwable cause) { 21 | super(cause); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/exception/UnsupportedCharsetException.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.exception; 2 | 3 | /** 4 | * A checked exception wrapper for {@link java.nio.charset.UnsupportedCharsetException}. This exception is checked to prevent 5 | * situations where an unsupported character set in e.g. a Content-Type header causes the proxy to fail completely, rather 6 | * than fallback to some suitable default behavior, such as not parsing the text contents of a message. 7 | */ 8 | public class UnsupportedCharsetException extends Exception { 9 | public UnsupportedCharsetException(java.nio.charset.UnsupportedCharsetException e) { 10 | super(e); 11 | 12 | if (e == null) { 13 | throw new IllegalArgumentException("net.lightbody.bmp.exception.UnsupportedCharsetException must be initialized with a non-null instance of java.nio.charset.UnsupportedCharsetException"); 14 | } 15 | } 16 | 17 | /** 18 | * @return the underlying {@link java.nio.charset.UnsupportedCharsetException} that this exception wraps. 19 | */ 20 | public java.nio.charset.UnsupportedCharsetException getUnsupportedCharsetExceptionCause() { 21 | return (java.nio.charset.UnsupportedCharsetException) this.getCause(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/filters/AddHeadersFilter.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.filters; 2 | 3 | import io.netty.handler.codec.http.HttpObject; 4 | import io.netty.handler.codec.http.HttpRequest; 5 | import io.netty.handler.codec.http.HttpResponse; 6 | import org.littleshoot.proxy.HttpFiltersAdapter; 7 | 8 | import java.util.Collections; 9 | import java.util.Map; 10 | 11 | /** 12 | * Adds the headers specified in the constructor to this request. The filter does not make a defensive copy of the map, so there is no guarantee 13 | * that the map at the time of construction will contain the same values when the filter is actually invoked, if the map is modified concurrently. 14 | */ 15 | public class AddHeadersFilter extends HttpFiltersAdapter { 16 | private final Map additionalHeaders; 17 | 18 | public AddHeadersFilter(HttpRequest originalRequest, Map additionalHeaders) { 19 | super(originalRequest); 20 | 21 | if (additionalHeaders != null) { 22 | this.additionalHeaders = additionalHeaders; 23 | } else { 24 | this.additionalHeaders = Collections.emptyMap(); 25 | } 26 | } 27 | 28 | @Override 29 | public HttpResponse clientToProxyRequest(HttpObject httpObject) { 30 | if (httpObject instanceof HttpRequest) { 31 | HttpRequest httpRequest = (HttpRequest) httpObject; 32 | 33 | for (Map.Entry header : additionalHeaders.entrySet()) { 34 | httpRequest.headers().add(header.getKey(), header.getValue()); 35 | } 36 | } 37 | 38 | return null; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/filters/HttpsHostCaptureFilter.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.filters; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import io.netty.handler.codec.http.HttpObject; 5 | import io.netty.handler.codec.http.HttpRequest; 6 | import io.netty.handler.codec.http.HttpResponse; 7 | import io.netty.util.Attribute; 8 | import io.netty.util.AttributeKey; 9 | import net.lightbody.bmp.util.BrowserMobHttpUtil; 10 | import org.littleshoot.proxy.HttpFiltersAdapter; 11 | import org.littleshoot.proxy.impl.ProxyUtils; 12 | 13 | /** 14 | * Captures the host for HTTPS requests and stores the value in the ChannelHandlerContext for use by {@link HttpsAwareFiltersAdapter} 15 | * filters. This filter reads the host from the HttpRequest during the HTTP CONNECT call, and therefore MUST be invoked 16 | * after any other filters which modify the host. 17 | * Note: If the request uses the default HTTPS port (443), it will be removed from the hostname captured by this filter. 18 | */ 19 | public class HttpsHostCaptureFilter extends HttpFiltersAdapter { 20 | public HttpsHostCaptureFilter(HttpRequest originalRequest, ChannelHandlerContext ctx) { 21 | super(originalRequest, ctx); 22 | } 23 | 24 | @Override 25 | public HttpResponse clientToProxyRequest(HttpObject httpObject) { 26 | if (httpObject instanceof HttpRequest) { 27 | HttpRequest httpRequest = (HttpRequest) httpObject; 28 | 29 | if (ProxyUtils.isCONNECT(httpRequest)) { 30 | Attribute hostname = ctx.attr(AttributeKey.valueOf(HttpsAwareFiltersAdapter.HOST_ATTRIBUTE_NAME)); 31 | String hostAndPort = httpRequest.getUri(); 32 | 33 | // CONNECT requests contain the port, even when using the default port. a sensible default is to remove the 34 | // default port, since in most cases it is not explicitly specified and its presence (in a HAR file, for example) 35 | // would be unexpected. 36 | String hostNoDefaultPort = BrowserMobHttpUtil.removeMatchingPort(hostAndPort, 443); 37 | hostname.set(hostNoDefaultPort); 38 | } 39 | } 40 | 41 | return null; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/filters/LatencyFilter.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.filters; 2 | 3 | import io.netty.handler.codec.http.HttpObject; 4 | import io.netty.handler.codec.http.HttpRequest; 5 | import io.netty.handler.codec.http.HttpResponse; 6 | import org.littleshoot.proxy.HttpFiltersAdapter; 7 | import org.slf4j.Logger; 8 | import org.slf4j.LoggerFactory; 9 | 10 | import java.util.concurrent.TimeUnit; 11 | 12 | /** 13 | * Adds latency to a response before sending it to the client. This filter always adds the specified latency, even if the latency 14 | * between the proxy and the remote server already exceeds this value. 15 | */ 16 | public class LatencyFilter extends HttpFiltersAdapter { 17 | private static final Logger log = LoggerFactory.getLogger(HttpFiltersAdapter.class); 18 | 19 | private final int latencyMs; 20 | 21 | public LatencyFilter(HttpRequest originalRequest, int latencyMs) { 22 | super(originalRequest); 23 | 24 | this.latencyMs = latencyMs; 25 | } 26 | 27 | @Override 28 | public HttpObject proxyToClientResponse(HttpObject httpObject) { 29 | if (httpObject instanceof HttpResponse) { 30 | if (latencyMs > 0) { 31 | try { 32 | TimeUnit.MILLISECONDS.sleep(latencyMs); 33 | } catch (InterruptedException e) { 34 | Thread.currentThread().interrupt(); 35 | 36 | log.warn("Interrupted while adding latency to response", e); 37 | } 38 | } 39 | } 40 | 41 | return super.proxyToClientResponse(httpObject); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/filters/ModifiedRequestAwareFilter.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.filters; 2 | 3 | import io.netty.handler.codec.http.HttpRequest; 4 | 5 | /** 6 | * Indicates that a filter wishes to capture the final HttpRequest that is sent to the server, reflecting all 7 | * modifications from request filters. {@link BrowserMobHttpFilterChain#clientToProxyRequest(io.netty.handler.codec.http.HttpObject)} 8 | * will invoke the {@link #setModifiedHttpRequest(HttpRequest)} method after all filters have processed the initial 9 | * {@link HttpRequest} object. 10 | */ 11 | public interface ModifiedRequestAwareFilter { 12 | /** 13 | * Notifies implementing classes of the modified HttpRequest that will be sent to the server, reflecting all 14 | * modifications from filters. 15 | * 16 | * @param modifiedHttpRequest the modified HttpRequest sent to the server 17 | */ 18 | void setModifiedHttpRequest(HttpRequest modifiedHttpRequest); 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/filters/RegisterRequestFilter.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.filters; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import io.netty.handler.codec.http.HttpObject; 5 | import io.netty.handler.codec.http.HttpRequest; 6 | import io.netty.handler.codec.http.HttpResponse; 7 | import net.lightbody.bmp.proxy.ActivityMonitor; 8 | import org.littleshoot.proxy.HttpFiltersAdapter; 9 | 10 | /** 11 | * Registers this request with the {@link net.lightbody.bmp.proxy.ActivityMonitor} when the HttpRequest is received from the client. 12 | */ 13 | public class RegisterRequestFilter extends HttpFiltersAdapter { 14 | private final ActivityMonitor activityMonitor; 15 | 16 | public RegisterRequestFilter(HttpRequest originalRequest, ChannelHandlerContext ctx, ActivityMonitor activityMonitor) { 17 | super(originalRequest, ctx); 18 | 19 | this.activityMonitor = activityMonitor; 20 | } 21 | 22 | @Override 23 | public HttpResponse clientToProxyRequest(HttpObject httpObject) { 24 | if (httpObject instanceof HttpRequest) { 25 | activityMonitor.requestStarted(); 26 | } 27 | 28 | return super.clientToProxyRequest(httpObject); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/filters/RequestFilter.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.filters; 2 | 3 | import io.netty.handler.codec.http.HttpRequest; 4 | import io.netty.handler.codec.http.HttpResponse; 5 | import net.lightbody.bmp.util.HttpMessageContents; 6 | import net.lightbody.bmp.util.HttpMessageInfo; 7 | 8 | /** 9 | * A functional interface to simplify modification and manipulation of requests. 10 | */ 11 | public interface RequestFilter { 12 | /** 13 | * Implement this method to filter an HTTP request. The HTTP method, URI, headers, etc. are available in the {@code request} parameter, 14 | * while the contents of the message are available in the {@code contents} parameter. The request can be modified directly, while the 15 | * contents may be modified using the {@link HttpMessageContents#setTextContents(String)} or {@link HttpMessageContents#setBinaryContents(byte[])} 16 | * methods. The request can be "short-circuited" by returning a non-null value. 17 | * 18 | * @param request The request object, including method, URI, headers, etc. Modifications to the request object will be reflected in the request sent to the server. 19 | * @param contents The request contents. 20 | * @param messageInfo Additional information relating to the HTTP message. 21 | * @return if the return value is non-null, the proxy will suppress the request and send the specified response to the client immediately 22 | */ 23 | HttpResponse filterRequest(HttpRequest request, HttpMessageContents contents, HttpMessageInfo messageInfo); 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/filters/ResponseFilter.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.filters; 2 | 3 | import io.netty.handler.codec.http.HttpResponse; 4 | import net.lightbody.bmp.util.HttpMessageContents; 5 | import net.lightbody.bmp.util.HttpMessageInfo; 6 | 7 | /** 8 | * A functional interface to simplify modification and manipulation of responses. 9 | */ 10 | public interface ResponseFilter { 11 | /** 12 | * Implement this method to filter an HTTP response. The URI, headers, status line, etc. are available in the {@code response} parameter, 13 | * while the contents of the message are available in the {@code contents} parameter. The response can be modified directly, while the 14 | * contents may be modified using the {@link HttpMessageContents#setTextContents(String)} or {@link HttpMessageContents#setBinaryContents(byte[])} 15 | * methods. 16 | * 17 | * @param response The response object, including URI, headers, status line, etc. Modifications to the response object will be reflected in the client response. 18 | * @param contents The response contents. 19 | * @param messageInfo Additional information relating to the HTTP message. 20 | */ 21 | void filterResponse(HttpResponse response, HttpMessageContents contents, HttpMessageInfo messageInfo); 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/filters/UnregisterRequestFilter.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.filters; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import io.netty.handler.codec.http.HttpObject; 5 | import io.netty.handler.codec.http.HttpRequest; 6 | import io.netty.handler.codec.http.LastHttpContent; 7 | import net.lightbody.bmp.proxy.ActivityMonitor; 8 | import org.littleshoot.proxy.HttpFiltersAdapter; 9 | 10 | /** 11 | * Unregisters this request with the {@link net.lightbody.bmp.proxy.ActivityMonitor} when the LastHttpContent is sent to the client. 12 | */ 13 | public class UnregisterRequestFilter extends HttpFiltersAdapter { 14 | private final ActivityMonitor activityMonitor; 15 | 16 | public UnregisterRequestFilter(HttpRequest originalRequest, ChannelHandlerContext ctx, ActivityMonitor activityMonitor) { 17 | super(originalRequest, ctx); 18 | 19 | this.activityMonitor = activityMonitor; 20 | } 21 | 22 | @Override 23 | public HttpObject proxyToClientResponse(HttpObject httpObject) { 24 | if (httpObject instanceof LastHttpContent) { 25 | activityMonitor.requestFinished(); 26 | } 27 | 28 | return super.proxyToClientResponse(httpObject); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/filters/support/HttpConnectTiming.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.filters.support; 2 | 3 | /** 4 | * Holds the connection-related timing information from an HTTP CONNECT request, so it can be added to the HAR timings for the first 5 | * "real" request to the same host. The HTTP CONNECT and the "real" HTTP requests are processed in different HarCaptureFilter instances. 6 | *

7 | * Note: The connect time must include the ssl time. According to the HAR spec at https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/HAR/Overview.htm: 8 |

 9 |  ssl [number, optional] (new in 1.2) - Time required for SSL/TLS negotiation. If this field is defined then the time is also
10 |  included in the connect field (to ensure backward compatibility with HAR 1.1). Use -1 if the timing does not apply to the
11 |  current request.
12 |  
13 | */ 14 | public class HttpConnectTiming { 15 | private volatile long blockedTimeNanos = -1; 16 | private volatile long dnsTimeNanos = -1; 17 | private volatile long connectTimeNanos = -1; 18 | private volatile long sslHandshakeTimeNanos = -1; 19 | 20 | public void setConnectTimeNanos(long connectTimeNanos) { 21 | this.connectTimeNanos = connectTimeNanos; 22 | } 23 | 24 | public void setSslHandshakeTimeNanos(long sslHandshakeTimeNanos) { 25 | this.sslHandshakeTimeNanos = sslHandshakeTimeNanos; 26 | } 27 | 28 | public void setBlockedTimeNanos(long blockedTimeNanos) { 29 | this.blockedTimeNanos = blockedTimeNanos; 30 | } 31 | 32 | public void setDnsTimeNanos(long dnsTimeNanos) { 33 | this.dnsTimeNanos = dnsTimeNanos; 34 | } 35 | 36 | public long getConnectTimeNanos() { 37 | return connectTimeNanos; 38 | } 39 | 40 | public long getSslHandshakeTimeNanos() { 41 | return sslHandshakeTimeNanos; 42 | } 43 | 44 | public long getBlockedTimeNanos() { 45 | return blockedTimeNanos; 46 | } 47 | 48 | public long getDnsTimeNanos() { 49 | return dnsTimeNanos; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/mitm/CertificateAndKey.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.mitm; 2 | 3 | import java.security.PrivateKey; 4 | import java.security.cert.X509Certificate; 5 | 6 | /** 7 | * A simple container for an X.509 certificate and its corresponding private key. 8 | */ 9 | public class CertificateAndKey { 10 | private final X509Certificate certificate; 11 | private final PrivateKey privateKey; 12 | 13 | public CertificateAndKey(X509Certificate certificate, PrivateKey privateKey) { 14 | this.certificate = certificate; 15 | this.privateKey = privateKey; 16 | } 17 | 18 | public X509Certificate getCertificate() { 19 | return certificate; 20 | } 21 | 22 | public PrivateKey getPrivateKey() { 23 | return privateKey; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/mitm/CertificateAndKeySource.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.mitm; 2 | 3 | /** 4 | * A CertificateAndKeySource generates {@link CertificateAndKey}s, i.e. the root certificate and private key used 5 | * to sign impersonated certificates of upstream servers. Implementations of this interface load impersonation materials 6 | * from various sources, including Java KeyStores, JKS files, etc., or generate them on-the-fly. 7 | */ 8 | public interface CertificateAndKeySource { 9 | /** 10 | * Loads a certificate and its corresponding private key. Every time this method is called, it should return the same 11 | * certificate and private key (although it may be a different {@link CertificateAndKey} instance). 12 | * 13 | * @return certificate and its corresponding private key 14 | */ 15 | CertificateAndKey load(); 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/mitm/CertificateInfoGenerator.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.mitm; 2 | 3 | import java.security.cert.X509Certificate; 4 | import java.util.List; 5 | 6 | /** 7 | * A functional interface to allow customization of the certificates generated by the 8 | * {@link net.lightbody.bmp.mitm.manager.ImpersonatingMitmManager}. 9 | */ 10 | public interface CertificateInfoGenerator { 11 | /** 12 | * Generate a certificate for the specified hostnames, optionally using parameters from the originalCertificate. 13 | * 14 | * @param hostnames the hostnames to generate the certificate for, which may include wildcards 15 | * @param originalCertificate original X.509 certificate sent by the upstream server, which may be null 16 | * @return CertificateInfo to be used to create an X509Certificate for the specified hostnames 17 | */ 18 | CertificateInfo generate(List hostnames, X509Certificate originalCertificate); 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/mitm/ExistingCertificateSource.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.mitm; 2 | 3 | import java.security.PrivateKey; 4 | import java.security.cert.X509Certificate; 5 | 6 | /** 7 | * A simple adapter that produces a {@link CertificateAndKey} from existing {@link X509Certificate} and {@link PrivateKey} 8 | * java objects. 9 | */ 10 | public class ExistingCertificateSource implements CertificateAndKeySource { 11 | private final X509Certificate rootCertificate; 12 | private final PrivateKey privateKey; 13 | 14 | public ExistingCertificateSource(X509Certificate rootCertificate, PrivateKey privateKey) { 15 | if (rootCertificate == null) { 16 | throw new IllegalArgumentException("CA root certificate cannot be null"); 17 | } 18 | 19 | if (privateKey == null) { 20 | throw new IllegalArgumentException("Private key cannot be null"); 21 | } 22 | 23 | this.rootCertificate = rootCertificate; 24 | this.privateKey = privateKey; 25 | } 26 | 27 | @Override 28 | public CertificateAndKey load() { 29 | return new CertificateAndKey(rootCertificate, privateKey); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/mitm/exception/CertificateCreationException.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.mitm.exception; 2 | 3 | /** 4 | * Indicates a problem creating a certificate (server or CA). 5 | */ 6 | public class CertificateCreationException extends RuntimeException { 7 | private static final long serialVersionUID = 592999944486567944L; 8 | 9 | public CertificateCreationException() { 10 | } 11 | 12 | public CertificateCreationException(String message) { 13 | super(message); 14 | } 15 | 16 | public CertificateCreationException(String message, Throwable cause) { 17 | super(message, cause); 18 | } 19 | 20 | public CertificateCreationException(Throwable cause) { 21 | super(cause); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/mitm/exception/CertificateSourceException.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.mitm.exception; 2 | 3 | /** 4 | * Indicates that a {@link net.lightbody.bmp.mitm.CertificateAndKeySource} encountered an error while loading a 5 | * certificate and/or private key from a KeyStore, PEM file, or other source. 6 | */ 7 | public class CertificateSourceException extends RuntimeException { 8 | private static final long serialVersionUID = 6195838041376082083L; 9 | 10 | public CertificateSourceException() { 11 | } 12 | 13 | public CertificateSourceException(String message) { 14 | super(message); 15 | } 16 | 17 | public CertificateSourceException(String message, Throwable cause) { 18 | super(message, cause); 19 | } 20 | 21 | public CertificateSourceException(Throwable cause) { 22 | super(cause); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/mitm/exception/ExportException.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.mitm.exception; 2 | 3 | /** 4 | * Indicates an error occurred while exporting/serializing a certificate, private key, KeyStore, etc. 5 | */ 6 | public class ExportException extends RuntimeException { 7 | private static final long serialVersionUID = -3505301862887355206L; 8 | 9 | public ExportException() { 10 | } 11 | 12 | public ExportException(String message) { 13 | super(message); 14 | } 15 | 16 | public ExportException(String message, Throwable cause) { 17 | super(message, cause); 18 | } 19 | 20 | public ExportException(Throwable cause) { 21 | super(cause); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/mitm/exception/ImportException.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.mitm.exception; 2 | 3 | /** 4 | * Indicates that an error occurred while importing a certificate, private key, or KeyStore. 5 | */ 6 | public class ImportException extends RuntimeException { 7 | private static final long serialVersionUID = 584414535648926010L; 8 | 9 | public ImportException() { 10 | } 11 | 12 | public ImportException(String message) { 13 | super(message); 14 | } 15 | 16 | public ImportException(String message, Throwable cause) { 17 | super(message, cause); 18 | } 19 | 20 | public ImportException(Throwable cause) { 21 | super(cause); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/mitm/exception/KeyGeneratorException.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.mitm.exception; 2 | 3 | /** 4 | * Indicates an exception occurred while generating a key pair. 5 | */ 6 | public class KeyGeneratorException extends RuntimeException { 7 | private static final long serialVersionUID = 7607159769324427808L; 8 | 9 | public KeyGeneratorException() { 10 | } 11 | 12 | public KeyGeneratorException(String message) { 13 | super(message); 14 | } 15 | 16 | public KeyGeneratorException(String message, Throwable cause) { 17 | super(message, cause); 18 | } 19 | 20 | public KeyGeneratorException(Throwable cause) { 21 | super(cause); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/mitm/exception/KeyStoreAccessException.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.mitm.exception; 2 | 3 | /** 4 | * Indicates an error occurred while accessing a java KeyStore. 5 | */ 6 | public class KeyStoreAccessException extends RuntimeException { 7 | private static final long serialVersionUID = -5560417886988154298L; 8 | 9 | public KeyStoreAccessException() { 10 | } 11 | 12 | public KeyStoreAccessException(String message) { 13 | super(message); 14 | } 15 | 16 | public KeyStoreAccessException(String message, Throwable cause) { 17 | super(message, cause); 18 | } 19 | 20 | public KeyStoreAccessException(Throwable cause) { 21 | super(cause); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/mitm/exception/MitmException.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.mitm.exception; 2 | 3 | /** 4 | * Indicates a general problem occurred while attempting to man-in-the-middle communications between the client and the 5 | * upstream server. 6 | */ 7 | public class MitmException extends RuntimeException { 8 | private static final long serialVersionUID = -1960691906515767537L; 9 | 10 | public MitmException() { 11 | } 12 | 13 | public MitmException(String message) { 14 | super(message); 15 | } 16 | 17 | public MitmException(String message, Throwable cause) { 18 | super(message, cause); 19 | } 20 | 21 | public MitmException(Throwable cause) { 22 | super(cause); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/mitm/exception/SslContextInitializationException.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.mitm.exception; 2 | 3 | /** 4 | * Indicates an error occurred while attempting to create a new {@link javax.net.ssl.SSLContext}. 5 | */ 6 | public class SslContextInitializationException extends RuntimeException { 7 | private static final long serialVersionUID = 6744059714710316821L; 8 | 9 | public SslContextInitializationException() { 10 | } 11 | 12 | public SslContextInitializationException(String message) { 13 | super(message); 14 | } 15 | 16 | public SslContextInitializationException(String message, Throwable cause) { 17 | super(message, cause); 18 | } 19 | 20 | public SslContextInitializationException(Throwable cause) { 21 | super(cause); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/mitm/exception/TrustSourceException.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.mitm.exception; 2 | 3 | /** 4 | * Indicates that an error occurred while attempting to create or populate a {@link net.lightbody.bmp.mitm.TrustSource}. 5 | */ 6 | public class TrustSourceException extends RuntimeException { 7 | public TrustSourceException() { 8 | } 9 | 10 | public TrustSourceException(String message) { 11 | super(message); 12 | } 13 | 14 | public TrustSourceException(String message, Throwable cause) { 15 | super(message, cause); 16 | } 17 | 18 | public TrustSourceException(Throwable cause) { 19 | super(cause); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/mitm/exception/UncheckedIOException.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.mitm.exception; 2 | 3 | import java.io.IOException; 4 | 5 | /** 6 | * A convenience exception that wraps checked {@link IOException}s. (The built-in java.io.UncheckedIOException is only 7 | * available on Java 8.) 8 | */ 9 | public class UncheckedIOException extends RuntimeException { 10 | public UncheckedIOException(String message, IOException cause) { 11 | super(message, cause); 12 | } 13 | 14 | public UncheckedIOException(IOException cause) { 15 | super(cause); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/mitm/keys/ECKeyGenerator.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.mitm.keys; 2 | 3 | import net.lightbody.bmp.mitm.exception.KeyGeneratorException; 4 | 5 | import java.security.InvalidAlgorithmParameterException; 6 | import java.security.KeyPair; 7 | import java.security.KeyPairGenerator; 8 | import java.security.NoSuchAlgorithmException; 9 | import java.security.spec.ECGenParameterSpec; 10 | 11 | /** 12 | * A {@link KeyGenerator} that creates Elliptic Curve key pairs. 13 | */ 14 | public class ECKeyGenerator implements KeyGenerator { 15 | private static final String EC_KEY_GEN_ALGORITHM = "EC"; 16 | 17 | private static final String DEFAULT_NAMED_CURVE = "secp256r1"; 18 | 19 | private final String namedCurve; 20 | 21 | /** 22 | * Create a {@link KeyGenerator} that will create EC key pairs using the secp256r1 named curve (NIST P-256) 23 | * supported by modern web browsers. 24 | */ 25 | public ECKeyGenerator() { 26 | this.namedCurve = DEFAULT_NAMED_CURVE; 27 | } 28 | 29 | /** 30 | * Create a {@link KeyGenerator} that will create EC key pairs using the specified named curve. 31 | */ 32 | public ECKeyGenerator(String namedCurve) { 33 | this.namedCurve = namedCurve; 34 | } 35 | 36 | @Override 37 | public KeyPair generate() { 38 | // obtain an EC key pair generator for the specified named curve 39 | KeyPairGenerator generator; 40 | try { 41 | generator = java.security.KeyPairGenerator.getInstance(EC_KEY_GEN_ALGORITHM); 42 | ECGenParameterSpec ecName = new ECGenParameterSpec(namedCurve); 43 | generator.initialize(ecName); 44 | } catch (NoSuchAlgorithmException | InvalidAlgorithmParameterException e) { 45 | throw new KeyGeneratorException("Unable to generate EC public/private key pair using named curve: " + namedCurve, e); 46 | } 47 | 48 | return generator.generateKeyPair(); 49 | } 50 | 51 | @Override 52 | public String toString() { 53 | return "EC (" + namedCurve + ")"; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/mitm/keys/KeyGenerator.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.mitm.keys; 2 | 3 | import java.security.KeyPair; 4 | 5 | /** 6 | * A functional interface for key pair generators. 7 | */ 8 | public interface KeyGenerator { 9 | /** 10 | * Generates a new public/private key pair. This method should not cache or reuse any previously-generated key pairs. 11 | * 12 | * @return a new public/private key pair 13 | */ 14 | KeyPair generate(); 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/mitm/keys/RSAKeyGenerator.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.mitm.keys; 2 | 3 | import net.lightbody.bmp.mitm.exception.KeyGeneratorException; 4 | 5 | import java.security.KeyPair; 6 | import java.security.KeyPairGenerator; 7 | import java.security.NoSuchAlgorithmException; 8 | 9 | /** 10 | * A {@link KeyGenerator} that creates RSA key pairs. 11 | */ 12 | public class RSAKeyGenerator implements KeyGenerator { 13 | private static final String RSA_KEY_GEN_ALGORITHM = "RSA"; 14 | 15 | /** 16 | * Use a default RSA key size of 2048, since Chrome, Firefox, and possibly other browsers have begun to distrust 17 | * certificates signed with 1024-bit RSA keys. 18 | */ 19 | private static final int DEFAULT_KEY_SIZE = 2048; 20 | 21 | private final int keySize; 22 | 23 | /** 24 | * Create a {@link KeyGenerator} that will create a 2048-bit RSA key pair. 25 | */ 26 | public RSAKeyGenerator() { 27 | this.keySize = DEFAULT_KEY_SIZE; 28 | } 29 | 30 | /** 31 | * Create a {@link KeyGenerator} that will create an RSA key pair of the specified keySize. 32 | */ 33 | public RSAKeyGenerator(int keySize) { 34 | this.keySize = keySize; 35 | } 36 | 37 | @Override 38 | public KeyPair generate() { 39 | // obtain an RSA key pair generator for the specified key size 40 | KeyPairGenerator generator; 41 | try { 42 | generator = KeyPairGenerator.getInstance(RSA_KEY_GEN_ALGORITHM); 43 | generator.initialize(keySize); 44 | } catch (NoSuchAlgorithmException e) { 45 | throw new KeyGeneratorException("Unable to generate " + keySize + "-bit RSA public/private key pair", e); 46 | } 47 | 48 | return generator.generateKeyPair(); 49 | } 50 | 51 | @Override 52 | public String toString() { 53 | return "RSA (" + keySize + ")"; 54 | } 55 | } 56 | 57 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/mitm/stats/CertificateGenerationStatistics.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.mitm.stats; 2 | 3 | import java.util.concurrent.atomic.AtomicInteger; 4 | import java.util.concurrent.atomic.AtomicLong; 5 | 6 | /** 7 | * Tracks basic certificate generation statistics. 8 | */ 9 | public class CertificateGenerationStatistics { 10 | private AtomicLong certificateGenerationTimeMs = new AtomicLong(); 11 | private AtomicInteger certificatesGenerated = new AtomicInteger(); 12 | 13 | private AtomicLong firstCertificateGeneratedTimestamp = new AtomicLong(); 14 | 15 | /** 16 | * Records a certificate generation that started at startTimeMs and completed at finishTimeMs. 17 | */ 18 | public void certificateCreated(long startTimeMs, long finishTimeMs) { 19 | certificatesGenerated.incrementAndGet(); 20 | certificateGenerationTimeMs.addAndGet(finishTimeMs - startTimeMs); 21 | 22 | // record the timestamp of the first certificate generation 23 | firstCertificateGeneratedTimestamp.compareAndSet(0L, System.currentTimeMillis()); 24 | } 25 | 26 | /** 27 | * Returns the total number of certificates created. 28 | */ 29 | public int getCertificatesGenerated() { 30 | return certificatesGenerated.get(); 31 | } 32 | 33 | /** 34 | * Returns the total number of ms spent generating all certificates. 35 | */ 36 | public long getTotalCertificateGenerationTimeMs() { 37 | return certificateGenerationTimeMs.get(); 38 | } 39 | 40 | /** 41 | * Returns the average number of ms per certificate generated. 42 | */ 43 | public long getAvgCertificateGenerationTimeMs() { 44 | if (certificatesGenerated.get() > 0) { 45 | return certificateGenerationTimeMs.get() / certificatesGenerated.get(); 46 | } else { 47 | return 0L; 48 | } 49 | } 50 | 51 | /** 52 | * Returns the timestamp (ms since epoch) when the first certificate was generated, or 0 if none have been generated. 53 | */ 54 | public long firstCertificateGeneratedTimestamp() { 55 | return firstCertificateGeneratedTimestamp.get(); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/mitm/util/MitmConstants.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.mitm.util; 2 | 3 | /** 4 | * Default values for basic MITM properties. 5 | */ 6 | public class MitmConstants { 7 | /** 8 | * The default message digest to use when signing certificates (CA or server). On 64-bit systems this is set to 9 | * SHA512, on 32-bit systems this is SHA256. On 64-bit systems, SHA512 generally performs better than SHA256; see 10 | * this question for details: http://crypto.stackexchange.com/questions/26336/sha512-faster-than-sha256. SHA384 is 11 | * SHA512 with a smaller output size. 12 | */ 13 | public static final String DEFAULT_MESSAGE_DIGEST = is32BitJvm() ? "SHA256": "SHA384"; 14 | 15 | /** 16 | * The default {@link java.security.KeyStore} type to use when creating KeyStores (e.g. for impersonated server 17 | * certificates). PKCS12 is widely supported. 18 | */ 19 | public static final String DEFAULT_KEYSTORE_TYPE = "PKCS12"; 20 | 21 | /** 22 | * Uses the non-portable system property sun.arch.data.model to help determine if we are running on a 32-bit JVM. 23 | * Since the majority of modern systems are 64 bits, this method "assumes" 64 bits and only returns true if 24 | * sun.arch.data.model explicitly indicates a 32-bit JVM. 25 | * 26 | * @return true if we can determine definitively that this is a 32-bit JVM, otherwise false 27 | */ 28 | private static boolean is32BitJvm() { 29 | Integer bits = Integer.getInteger("sun.arch.data.model"); 30 | 31 | return bits != null && bits == 32; 32 | 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/proxy/RewriteRule.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.proxy; 2 | 3 | import java.util.regex.Pattern; 4 | 5 | /** 6 | * Container for a URL rewrite rule pattern and replacement string. 7 | */ 8 | public class RewriteRule { 9 | private final Pattern pattern; 10 | private final String replace; 11 | 12 | public RewriteRule(String pattern, String replace) { 13 | this.pattern = Pattern.compile(pattern); 14 | this.replace = replace; 15 | } 16 | 17 | public Pattern getPattern() { 18 | return pattern; 19 | } 20 | 21 | public String getReplace() { 22 | return replace; 23 | } 24 | 25 | @Override 26 | public boolean equals(Object o) { 27 | if (this == o) return true; 28 | if (o == null || getClass() != o.getClass()) return false; 29 | 30 | RewriteRule that = (RewriteRule) o; 31 | 32 | if (!pattern.equals(that.pattern)) return false; 33 | if (!replace.equals(that.replace)) return false; 34 | 35 | return true; 36 | } 37 | 38 | @Override 39 | public int hashCode() { 40 | int result = pattern.hashCode(); 41 | result = 31 * result + replace.hashCode(); 42 | return result; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/proxy/auth/AuthType.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.proxy.auth; 2 | 3 | /** 4 | * Authentication types support by BrowserMobProxy. 5 | */ 6 | public enum AuthType { 7 | BASIC, 8 | // TODO: determine if we can actually do NTLM authentication 9 | NTLM 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/proxy/dns/DelegatingHostResolver.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.proxy.dns; 2 | 3 | import com.google.common.collect.Iterables; 4 | 5 | import java.net.InetAddress; 6 | import java.net.InetSocketAddress; 7 | import java.net.UnknownHostException; 8 | import java.util.Collection; 9 | 10 | /** 11 | * A LittleProxy HostResolver that delegates to the specified {@link net.lightbody.bmp.proxy.dns.AdvancedHostResolver} instance. This class 12 | * serves as a bridge between {@link AdvancedHostResolver} and {@link org.littleshoot.proxy.HostResolver}. 13 | */ 14 | public class DelegatingHostResolver implements org.littleshoot.proxy.HostResolver { 15 | private volatile AdvancedHostResolver resolver; 16 | 17 | /** 18 | * Creates a new resolver that will delegate to the specified resolver. 19 | * 20 | * @param resolver HostResolver to delegate to 21 | */ 22 | public DelegatingHostResolver(AdvancedHostResolver resolver) { 23 | this.resolver = resolver; 24 | } 25 | 26 | public AdvancedHostResolver getResolver() { 27 | return resolver; 28 | } 29 | 30 | public void setResolver(AdvancedHostResolver resolver) { 31 | this.resolver = resolver; 32 | } 33 | 34 | @Override 35 | public InetSocketAddress resolve(String host, int port) throws UnknownHostException { 36 | Collection resolvedAddresses = resolver.resolve(host); 37 | if (!resolvedAddresses.isEmpty()) { 38 | InetAddress resolvedAddress = Iterables.get(resolvedAddresses, 0); 39 | return new InetSocketAddress(resolvedAddress, port); 40 | } 41 | 42 | // no address found by the resolver 43 | throw new UnknownHostException(host); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/proxy/dns/HostResolver.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.proxy.dns; 2 | 3 | import java.net.InetAddress; 4 | import java.util.Collection; 5 | 6 | /** 7 | * Defines the basic functionality that {@link net.lightbody.bmp.BrowserMobProxy} implementations require when resolving hostnames. 8 | */ 9 | public interface HostResolver { 10 | /** 11 | * Resolves a hostname to one or more IP addresses. The iterator over the returned Collection is recommended to reflect the ordering 12 | * returned by the underlying name lookup service. For example, if a DNS server returns three IP addresses, 1.1.1.1, 2.2.2.2, and 13 | * 3.3.3.3, corresponding to www.somehost.com, the returned Collection iterator is recommended to iterate in 14 | * the order [1.1.1.1, 2.2.2.2, 3.3.3.3]. 15 | * 16 | * @param host host to resolve 17 | * @return resolved InetAddresses, or an empty collection if no addresses were found 18 | */ 19 | Collection resolve(String host); 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/proxy/dns/NativeResolver.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.proxy.dns; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | 6 | import java.net.InetAddress; 7 | import java.net.UnknownHostException; 8 | import java.util.Arrays; 9 | import java.util.Collection; 10 | import java.util.Collections; 11 | import java.util.concurrent.TimeUnit; 12 | 13 | /** 14 | * An {@link net.lightbody.bmp.proxy.dns.AdvancedHostResolver} that provides native JVM lookup using {@link java.net.InetAddress}. 15 | * This implementation does not provide any cache manipulation. Attempting to manipulate the DNS cache will result in a DEBUG-level 16 | * log statement and will not raise an exception. The {@link net.lightbody.bmp.proxy.dns.DnsJavaResolver} provides support for cache 17 | * manipulation. If you absolutely need to manipulate the native JVM DNS cache, see 18 | * {@link net.lightbody.bmp.proxy.dns.NativeCacheManipulatingResolver} for details. 19 | */ 20 | public class NativeResolver extends AbstractHostNameRemapper implements AdvancedHostResolver { 21 | private static final Logger log = LoggerFactory.getLogger(NativeResolver.class); 22 | 23 | @Override 24 | public void clearDNSCache() { 25 | log.debug("Cannot clear native JVM DNS Cache using this Resolver"); 26 | } 27 | 28 | @Override 29 | public void setPositiveDNSCacheTimeout(int timeout, TimeUnit timeUnit) { 30 | log.debug("Cannot change native JVM DNS cache timeout using this Resolver"); 31 | } 32 | 33 | @Override 34 | public void setNegativeDNSCacheTimeout(int timeout, TimeUnit timeUnit) { 35 | log.debug("Cannot change native JVM DNS cache timeout using this Resolver"); 36 | } 37 | 38 | @Override 39 | public Collection resolveRemapped(String remappedHost) { 40 | try { 41 | Collection addresses = Arrays.asList(InetAddress.getAllByName(remappedHost)); 42 | 43 | return addresses; 44 | } catch (UnknownHostException e) { 45 | return Collections.emptyList(); 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app/src/main/java/net/lightbody/bmp/util/HttpMessageInfo.java: -------------------------------------------------------------------------------- 1 | package net.lightbody.bmp.util; 2 | 3 | import io.netty.channel.ChannelHandlerContext; 4 | import io.netty.handler.codec.http.HttpRequest; 5 | 6 | /** 7 | * Encapsulates additional HTTP message data passed to request and response filters. 8 | */ 9 | public class HttpMessageInfo { 10 | private final HttpRequest originalRequest; 11 | private final ChannelHandlerContext channelHandlerContext; 12 | private final boolean isHttps; 13 | private final String url; 14 | private final String originalUrl; 15 | 16 | public HttpMessageInfo(HttpRequest originalRequest, ChannelHandlerContext channelHandlerContext, boolean isHttps, String url, String originalUrl) { 17 | this.originalRequest = originalRequest; 18 | this.channelHandlerContext = channelHandlerContext; 19 | this.isHttps = isHttps; 20 | this.url = url; 21 | this.originalUrl = originalUrl; 22 | } 23 | 24 | /** 25 | * The original request from the client. Does not reflect any modifications from previous filters. 26 | */ 27 | public HttpRequest getOriginalRequest() { 28 | return originalRequest; 29 | } 30 | 31 | /** 32 | * The {@link ChannelHandlerContext} for this request's client connection. 33 | */ 34 | public ChannelHandlerContext getChannelHandlerContext() { 35 | return channelHandlerContext; 36 | } 37 | 38 | /** 39 | * Returns true if this is an HTTPS message. 40 | */ 41 | public boolean isHttps() { 42 | return isHttps; 43 | } 44 | 45 | /** 46 | * Returns the full, absolute URL of the original request from the client for both HTTP and HTTPS URLs. The URL 47 | * will not reflect modifications from this or other filters. 48 | */ 49 | public String getOriginalUrl() { 50 | return originalUrl; 51 | } 52 | 53 | /** 54 | * Returns the full, absolute URL of this request from the client for both HTTP and HTTPS URLs. The URL will reflect 55 | * modifications from filters. If this method is called while a request filter is processing, it will reflect any 56 | * modifications to the URL from all previous filters. 57 | */ 58 | public String getUrl() { 59 | return url; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /app/src/main/java/org/littleshoot/proxy/mitm/FakeCertificateException.java: -------------------------------------------------------------------------------- 1 | package org.littleshoot.proxy.mitm; 2 | 3 | public class FakeCertificateException extends RuntimeException { 4 | 5 | private static final long serialVersionUID = 1L; 6 | 7 | public FakeCertificateException(String message, Throwable cause) { 8 | super(message, cause); 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/org/littleshoot/proxy/mitm/Launcher.java: -------------------------------------------------------------------------------- 1 | package org.littleshoot.proxy.mitm; 2 | 3 | import org.apache.log4j.xml.DOMConfigurator; 4 | import org.littleshoot.proxy.HttpProxyServerBootstrap; 5 | import org.littleshoot.proxy.impl.DefaultHttpProxyServer; 6 | import org.slf4j.Logger; 7 | import org.slf4j.LoggerFactory; 8 | 9 | import java.io.File; 10 | 11 | public class Launcher { 12 | 13 | private static final Logger log = LoggerFactory.getLogger(Launcher.class); 14 | 15 | public static void main(final String... args) { 16 | File log4jConfigurationFile = new File( 17 | "src/test/resources/log4j.xml"); 18 | if (log4jConfigurationFile.exists()) { 19 | DOMConfigurator.configureAndWatch( 20 | log4jConfigurationFile.getAbsolutePath(), 15); 21 | } 22 | try { 23 | final int port = 9090; 24 | 25 | System.out.println("About to start server on port: " + port); 26 | HttpProxyServerBootstrap bootstrap = DefaultHttpProxyServer 27 | .bootstrapFromFile("./littleproxy.properties") 28 | .withPort(port).withAllowLocalOnly(false); 29 | 30 | bootstrap.withManInTheMiddle(new CertificateSniffingMitmManager()); 31 | 32 | System.out.println("About to start..."); 33 | bootstrap.start(); 34 | 35 | } catch (Exception e) { 36 | log.error(e.getMessage(), e); 37 | System.exit(1); 38 | } 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/org/littleshoot/proxy/mitm/RootCertificateException.java: -------------------------------------------------------------------------------- 1 | package org.littleshoot.proxy.mitm; 2 | 3 | public class RootCertificateException extends Exception { 4 | 5 | private static final long serialVersionUID = 1L; 6 | 7 | public RootCertificateException(String message, Throwable t) { 8 | super(message, t); 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/jniLibs/armeabi/libtracepath.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/jniLibs/armeabi/libtracepath.so -------------------------------------------------------------------------------- /app/src/main/jniLibs/mips/libtracepath.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/jniLibs/mips/libtracepath.so -------------------------------------------------------------------------------- /app/src/main/jniLibs/x86/libtracepath.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/jniLibs/x86/libtracepath.so -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/clear_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/clear_button.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_assignment_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_assignment_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_assignment_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_assignment_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_build_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_build_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_chrome_reader_mode_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_chrome_reader_mode_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_chrome_reader_mode_white_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_chrome_reader_mode_white_18dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_chrome_reader_mode_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_chrome_reader_mode_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_close_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_close_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_delete_sweep_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_delete_sweep_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_description_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_description_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_developer_board_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_developer_board_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_directions_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_directions_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_dns_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_dns_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_done.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_done.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_error_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_error_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_explore_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_explore_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_file_upload_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_file_upload_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_filter_list_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_filter_list_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_home_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_home_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_info_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_info_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_mode_edit_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_mode_edit_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_note_add_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_note_add_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_note_add_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_note_add_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_notifications_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_notifications_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_photo_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_photo_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_photo_camera_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_photo_camera_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_search_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_search_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_send_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_send_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_send_white_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_send_white_18dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_send_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_send_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_share_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_share_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_share_white_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_share_white_18dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_share_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_share_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_style_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_style_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_style_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_style_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_sync_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-hdpi/ic_sync_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/clear_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/clear_button.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_assignment_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_assignment_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_assignment_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_assignment_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_build_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_build_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_chrome_reader_mode_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_chrome_reader_mode_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_chrome_reader_mode_white_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_chrome_reader_mode_white_18dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_chrome_reader_mode_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_chrome_reader_mode_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_close_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_close_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_delete_sweep_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_delete_sweep_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_description_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_description_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_developer_board_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_developer_board_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_directions_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_directions_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_dns_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_dns_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_done.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_done.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_error_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_error_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_explore_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_explore_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_file_upload_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_file_upload_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_filter_list_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_filter_list_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_home_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_home_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_info_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_info_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_mode_edit_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_mode_edit_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_note_add_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_note_add_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_note_add_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_note_add_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_notifications_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_notifications_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_photo_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_photo_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_photo_camera_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_photo_camera_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_search_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_search_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_send_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_send_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_send_white_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_send_white_18dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_send_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_send_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_share_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_share_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_share_white_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_share_white_18dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_share_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_share_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_style_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_style_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_style_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_style_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_sync_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-mdpi/ic_sync_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_info_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_camera.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_gallery.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_manage.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_send.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_share.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_slideshow.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_menu_webview.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_notifications_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/ic_sync_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/clear_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/clear_button.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_assignment_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_assignment_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_assignment_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_assignment_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_build_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_build_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_chrome_reader_mode_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_chrome_reader_mode_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_chrome_reader_mode_white_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_chrome_reader_mode_white_18dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_chrome_reader_mode_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_chrome_reader_mode_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_close_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_close_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_delete_sweep_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_delete_sweep_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_description_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_description_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_developer_board_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_developer_board_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_directions_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_directions_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_dns_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_dns_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_done.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_done.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_error_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_error_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_explore_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_explore_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_file_upload_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_file_upload_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_filter_list_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_filter_list_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_home_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_home_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_info_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_info_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_mode_edit_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_mode_edit_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_note_add_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_note_add_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_note_add_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_note_add_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_notifications_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_notifications_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_photo_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_photo_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_photo_camera_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_photo_camera_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_search_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_search_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_send_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_send_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_send_white_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_send_white_18dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_send_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_send_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_share_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_share_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_share_white_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_share_white_18dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_share_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_share_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_style_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_style_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_style_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_style_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_sync_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xhdpi/ic_sync_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/clear_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/clear_button.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_assignment_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_assignment_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_assignment_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_assignment_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_build_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_build_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_chrome_reader_mode_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_chrome_reader_mode_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_chrome_reader_mode_white_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_chrome_reader_mode_white_18dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_chrome_reader_mode_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_chrome_reader_mode_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_close_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_close_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_delete_sweep_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_delete_sweep_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_description_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_description_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_developer_board_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_developer_board_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_directions_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_directions_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_dns_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_dns_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_done.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_done.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_error_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_error_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_explore_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_explore_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_file_upload_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_file_upload_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_filter_list_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_filter_list_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_home_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_home_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_info_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_info_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_mode_edit_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_mode_edit_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_note_add_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_note_add_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_note_add_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_note_add_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_notifications_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_notifications_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_photo_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_photo_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_photo_camera_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_photo_camera_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_search_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_search_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_send_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_send_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_send_white_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_send_white_18dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_send_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_send_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_share_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_share_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_share_white_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_share_white_18dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_style_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_style_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_style_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_style_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_sync_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxhdpi/ic_sync_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/clear_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/clear_button.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_assignment_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_assignment_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_assignment_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_assignment_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_build_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_build_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_chrome_reader_mode_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_chrome_reader_mode_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_chrome_reader_mode_white_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_chrome_reader_mode_white_18dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_chrome_reader_mode_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_chrome_reader_mode_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_close_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_close_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_delete_sweep_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_delete_sweep_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_description_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_description_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_developer_board_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_developer_board_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_directions_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_directions_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_dns_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_dns_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_error_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_error_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_explore_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_explore_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_file_upload_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_file_upload_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_filter_list_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_filter_list_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_home_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_home_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_info_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_info_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_mode_edit_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_mode_edit_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_note_add_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_note_add_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_note_add_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_note_add_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_notifications_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_notifications_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_photo_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_photo_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_photo_camera_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_photo_camera_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_search_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_search_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_send_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_send_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_send_white_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_send_white_18dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_send_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_send_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_share_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_share_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_share_white_18dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_share_white_18dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_share_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_share_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_style_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_style_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_style_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_style_white_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_sync_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable-xxxhdpi/ic_sync_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/jz_toast_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JZ-Darkal/AndroidHttpCapture/e0aa4f6fcda60adf4f1c77d2ecadc6c383ba1a86/app/src/main/res/drawable/refresh.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/side_nav_bar.xml: -------------------------------------------------------------------------------- 1 | 3 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/layout-v21/fragment_webview.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 14 | 15 |