├── .gitignore ├── LICENSE ├── MediaSDK.iml ├── README.md ├── README_cn.md ├── androidasync ├── .gitignore ├── androidasync.iml ├── build.gradle ├── consumer-rules.pro ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── com │ └── jeffmony │ └── async │ ├── AsyncDatagramSocket.java │ ├── AsyncNetworkSocket.java │ ├── AsyncSSLException.java │ ├── AsyncSSLServerSocket.java │ ├── AsyncSSLSocket.java │ ├── AsyncSSLSocketWrapper.java │ ├── AsyncSemaphore.java │ ├── AsyncServer.java │ ├── AsyncServerSocket.java │ ├── AsyncSocket.java │ ├── BufferedDataSink.java │ ├── ByteBufferList.java │ ├── ChannelWrapper.java │ ├── DataEmitter.java │ ├── DataEmitterBase.java │ ├── DataEmitterReader.java │ ├── DataSink.java │ ├── DataTrackingEmitter.java │ ├── DatagramChannelWrapper.java │ ├── FileDataEmitter.java │ ├── FilteredDataEmitter.java │ ├── FilteredDataSink.java │ ├── HostnameResolutionException.java │ ├── LineEmitter.java │ ├── PushParser.java │ ├── SelectorWrapper.java │ ├── ServerSocketChannelWrapper.java │ ├── SocketChannelWrapper.java │ ├── TapCallback.java │ ├── ThreadQueue.java │ ├── Util.java │ ├── ZipDataSink.java │ ├── callback │ ├── CompletedCallback.java │ ├── ConnectCallback.java │ ├── ContinuationCallback.java │ ├── DataCallback.java │ ├── ListenCallback.java │ ├── ResultCallback.java │ ├── SocketCreateCallback.java │ ├── ValueCallback.java │ ├── ValueFunction.java │ └── WritableCallback.java │ ├── dns │ ├── Dns.java │ └── DnsResponse.java │ ├── future │ ├── Cancellable.java │ ├── Continuation.java │ ├── Converter.java │ ├── DependentCancellable.java │ ├── DependentFuture.java │ ├── DoneCallback.java │ ├── FailCallback.java │ ├── FailConvertCallback.java │ ├── FailRecoverCallback.java │ ├── Future.java │ ├── FutureCallback.java │ ├── FutureRunnable.java │ ├── FutureThread.java │ ├── Futures.java │ ├── HandlerFuture.java │ ├── MultiFuture.java │ ├── MultiTransformFuture.java │ ├── SimpleCancellable.java │ ├── SimpleFuture.java │ ├── SuccessCallback.java │ ├── ThenCallback.java │ ├── ThenFutureCallback.java │ ├── TransformFuture.java │ └── TypeConverter.java │ ├── http │ ├── AsyncHttpClient.java │ ├── AsyncHttpClientMiddleware.java │ ├── AsyncHttpDelete.java │ ├── AsyncHttpGet.java │ ├── AsyncHttpHead.java │ ├── AsyncHttpPost.java │ ├── AsyncHttpPut.java │ ├── AsyncHttpRequest.java │ ├── AsyncHttpResponse.java │ ├── AsyncHttpResponseImpl.java │ ├── AsyncSSLEngineConfigurator.java │ ├── AsyncSSLSocketMiddleware.java │ ├── AsyncSocketMiddleware.java │ ├── BasicNameValuePair.java │ ├── BodyDecoderException.java │ ├── ConnectionClosedException.java │ ├── ConnectionFailedException.java │ ├── Headers.java │ ├── HttpDate.java │ ├── HttpTransportMiddleware.java │ ├── HttpUtil.java │ ├── HybiParser.java │ ├── Multimap.java │ ├── NameValuePair.java │ ├── Protocol.java │ ├── ProtocolVersion.java │ ├── RedirectLimitExceededException.java │ ├── RequestLine.java │ ├── SSLEngineSNIConfigurator.java │ ├── SimpleMiddleware.java │ ├── TaggedList.java │ ├── WebSocket.java │ ├── WebSocketHandshakeException.java │ ├── WebSocketImpl.java │ ├── body │ │ ├── AsyncHttpRequestBody.java │ │ ├── ByteBufferListRequestBody.java │ │ ├── DocumentBody.java │ │ ├── FileBody.java │ │ ├── FilePart.java │ │ ├── JSONArrayBody.java │ │ ├── JSONObjectBody.java │ │ ├── MultipartFormDataBody.java │ │ ├── Part.java │ │ ├── StreamBody.java │ │ ├── StreamPart.java │ │ ├── StringBody.java │ │ ├── StringPart.java │ │ └── UrlEncodedFormBody.java │ ├── cache │ │ ├── HeaderParser.java │ │ ├── Objects.java │ │ ├── RawHeaders.java │ │ ├── RequestHeaders.java │ │ ├── ResponseCacheMiddleware.java │ │ ├── ResponseHeaders.java │ │ ├── ResponseSource.java │ │ └── StrictLineReader.java │ ├── callback │ │ ├── HttpConnectCallback.java │ │ └── RequestCallback.java │ ├── filter │ │ ├── ChunkedDataException.java │ │ ├── ChunkedInputFilter.java │ │ ├── ChunkedOutputFilter.java │ │ ├── ContentLengthFilter.java │ │ ├── DataRemainingException.java │ │ ├── GZIPInputFilter.java │ │ ├── InflaterInputFilter.java │ │ └── PrematureDataEndException.java │ └── server │ │ ├── AsyncHttpRequestBodyProvider.java │ │ ├── AsyncHttpServer.java │ │ ├── AsyncHttpServerRequest.java │ │ ├── AsyncHttpServerRequestImpl.java │ │ ├── AsyncHttpServerResponse.java │ │ ├── AsyncHttpServerResponseImpl.java │ │ ├── AsyncHttpServerRouter.java │ │ ├── AsyncProxyServer.java │ │ ├── BoundaryEmitter.java │ │ ├── HttpServerRequestCallback.java │ │ ├── MalformedRangeException.java │ │ ├── MimeEncodingException.java │ │ ├── RouteMatcher.java │ │ ├── StreamSkipException.java │ │ └── UnknownRequestBody.java │ ├── parser │ ├── AsyncParser.java │ ├── ByteBufferListParser.java │ ├── DocumentParser.java │ ├── JSONArrayParser.java │ ├── JSONObjectParser.java │ └── StringParser.java │ ├── stream │ ├── ByteBufferListInputStream.java │ ├── FileDataSink.java │ ├── InputStreamDataEmitter.java │ ├── OutputStreamDataCallback.java │ └── OutputStreamDataSink.java │ ├── util │ ├── Allocator.java │ ├── ArrayDeque.java │ ├── Charsets.java │ ├── Deque.java │ ├── FileCache.java │ ├── FileUtility.java │ ├── HashList.java │ ├── IdleTimeout.java │ ├── LruCache.java │ ├── StreamUtility.java │ ├── TaggedList.java │ ├── ThrottleTimeout.java │ ├── TimeoutBase.java │ └── UntypedHashtable.java │ └── wrapper │ ├── AsyncSocketWrapper.java │ └── DataEmitterWrapper.java ├── app ├── app.iml ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── assets │ └── list.json │ ├── java │ └── com │ │ └── android │ │ └── media │ │ ├── DownloadBaseListActivity.java │ │ ├── DownloadFeatureActivity.java │ │ ├── DownloadOrcodeActivity.java │ │ ├── DownloadPlayActivity.java │ │ ├── DownloadSettingsActivity.java │ │ ├── MainActivity.java │ │ ├── MediaScannerActivity.java │ │ ├── MyApplication.java │ │ ├── PlayFeatureActivity.java │ │ ├── PlayerActivity.java │ │ └── VideoListAdapter.java │ └── res │ ├── drawable-v24 │ └── ic_launcher_foreground.xml │ ├── drawable │ ├── border.xml │ └── ic_launcher_background.xml │ ├── layout │ ├── activity_download_feature.xml │ ├── activity_download_list.xml │ ├── activity_download_play.xml │ ├── activity_download_settings.xml │ ├── activity_main.xml │ ├── activity_orcode.xml │ ├── activity_play_func.xml │ ├── activity_player.xml │ ├── activity_scanner.xml │ ├── download_item.xml │ └── video_item.xml │ ├── mipmap-anydpi-v26 │ ├── ic_launcher.xml │ └── ic_launcher_round.xml │ ├── mipmap-hdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-mdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxhdpi │ ├── ic_launcher.png │ ├── ic_launcher_round.png │ ├── paused_state.png │ └── played_state.png │ ├── mipmap-xxxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ └── values │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml ├── base ├── .gitignore ├── base.iml ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── android │ │ └── baselib │ │ ├── MediaSDKReceiver.java │ │ ├── NetworkCallbackImpl.java │ │ ├── NetworkListener.java │ │ ├── WeakHandler.java │ │ └── utils │ │ ├── LogUtils.java │ │ ├── NetworkUtils.java │ │ ├── ScreenUtils.java │ │ └── Utility.java │ └── res │ └── values │ └── strings.xml ├── build.gradle ├── constants.gradle ├── exoplayer ├── .gitignore ├── build.gradle ├── exoplayer.iml ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── google │ │ └── android │ │ └── exoplayer2 │ │ ├── AudioBecomingNoisyManager.java │ │ ├── AudioFocusManager.java │ │ ├── BasePlayer.java │ │ ├── BaseRenderer.java │ │ ├── C.java │ │ ├── ControlDispatcher.java │ │ ├── DefaultControlDispatcher.java │ │ ├── DefaultLoadControl.java │ │ ├── DefaultMediaClock.java │ │ ├── DefaultRenderersFactory.java │ │ ├── ExoPlaybackException.java │ │ ├── ExoPlayer.java │ │ ├── ExoPlayerFactory.java │ │ ├── ExoPlayerImpl.java │ │ ├── ExoPlayerImplInternal.java │ │ ├── ExoPlayerLibraryInfo.java │ │ ├── Format.java │ │ ├── FormatHolder.java │ │ ├── IllegalSeekPositionException.java │ │ ├── LoadControl.java │ │ ├── MediaPeriodHolder.java │ │ ├── MediaPeriodInfo.java │ │ ├── MediaPeriodQueue.java │ │ ├── NoSampleRenderer.java │ │ ├── ParserException.java │ │ ├── PlaybackInfo.java │ │ ├── PlaybackParameters.java │ │ ├── PlaybackPreparer.java │ │ ├── Player.java │ │ ├── PlayerMessage.java │ │ ├── Renderer.java │ │ ├── RendererCapabilities.java │ │ ├── RendererConfiguration.java │ │ ├── RenderersFactory.java │ │ ├── SeekParameters.java │ │ ├── SimpleExoPlayer.java │ │ ├── Timeline.java │ │ ├── WakeLockManager.java │ │ ├── analytics │ │ ├── AnalyticsCollector.java │ │ ├── AnalyticsListener.java │ │ ├── DefaultAnalyticsListener.java │ │ ├── DefaultPlaybackSessionManager.java │ │ ├── PlaybackSessionManager.java │ │ ├── PlaybackStats.java │ │ ├── PlaybackStatsListener.java │ │ └── package-info.java │ │ ├── audio │ │ ├── Ac3Util.java │ │ ├── Ac4Util.java │ │ ├── AudioAttributes.java │ │ ├── AudioCapabilities.java │ │ ├── AudioCapabilitiesReceiver.java │ │ ├── AudioDecoderException.java │ │ ├── AudioListener.java │ │ ├── AudioProcessor.java │ │ ├── AudioRendererEventListener.java │ │ ├── AudioSink.java │ │ ├── AudioTimestampPoller.java │ │ ├── AudioTrackPositionTracker.java │ │ ├── AuxEffectInfo.java │ │ ├── BaseAudioProcessor.java │ │ ├── ChannelMappingAudioProcessor.java │ │ ├── DefaultAudioSink.java │ │ ├── DtsUtil.java │ │ ├── FloatResamplingAudioProcessor.java │ │ ├── MediaCodecAudioRenderer.java │ │ ├── ResamplingAudioProcessor.java │ │ ├── SilenceSkippingAudioProcessor.java │ │ ├── SimpleDecoderAudioRenderer.java │ │ ├── Sonic.java │ │ ├── SonicAudioProcessor.java │ │ ├── TeeAudioProcessor.java │ │ ├── TrimmingAudioProcessor.java │ │ ├── WavUtil.java │ │ └── package-info.java │ │ ├── database │ │ ├── DatabaseIOException.java │ │ ├── DatabaseProvider.java │ │ ├── DefaultDatabaseProvider.java │ │ ├── ExoDatabaseProvider.java │ │ ├── VersionTable.java │ │ └── package-info.java │ │ ├── decoder │ │ ├── Buffer.java │ │ ├── CryptoInfo.java │ │ ├── Decoder.java │ │ ├── DecoderCounters.java │ │ ├── DecoderInputBuffer.java │ │ ├── OutputBuffer.java │ │ ├── SimpleDecoder.java │ │ ├── SimpleOutputBuffer.java │ │ └── package-info.java │ │ ├── drm │ │ ├── ClearKeyUtil.java │ │ ├── DecryptionException.java │ │ ├── DefaultDrmSession.java │ │ ├── DefaultDrmSessionEventListener.java │ │ ├── DefaultDrmSessionManager.java │ │ ├── DrmInitData.java │ │ ├── DrmSession.java │ │ ├── DrmSessionManager.java │ │ ├── DummyExoMediaDrm.java │ │ ├── ErrorStateDrmSession.java │ │ ├── ExoMediaCrypto.java │ │ ├── ExoMediaDrm.java │ │ ├── FrameworkMediaCrypto.java │ │ ├── FrameworkMediaDrm.java │ │ ├── HttpMediaDrmCallback.java │ │ ├── KeysExpiredException.java │ │ ├── LocalMediaDrmCallback.java │ │ ├── MediaDrmCallback.java │ │ ├── OfflineLicenseHelper.java │ │ ├── UnsupportedDrmException.java │ │ ├── WidevineUtil.java │ │ └── package-info.java │ │ ├── extractor │ │ ├── BinarySearchSeeker.java │ │ ├── ChunkIndex.java │ │ ├── ConstantBitrateSeekMap.java │ │ ├── DefaultExtractorInput.java │ │ ├── DefaultExtractorsFactory.java │ │ ├── DummyExtractorOutput.java │ │ ├── DummyTrackOutput.java │ │ ├── Extractor.java │ │ ├── ExtractorInput.java │ │ ├── ExtractorOutput.java │ │ ├── ExtractorsFactory.java │ │ ├── GaplessInfoHolder.java │ │ ├── Id3Peeker.java │ │ ├── MpegAudioHeader.java │ │ ├── PositionHolder.java │ │ ├── SeekMap.java │ │ ├── SeekPoint.java │ │ ├── TrackOutput.java │ │ ├── amr │ │ │ └── AmrExtractor.java │ │ ├── flv │ │ │ ├── AudioTagPayloadReader.java │ │ │ ├── FlvExtractor.java │ │ │ ├── ScriptTagPayloadReader.java │ │ │ ├── TagPayloadReader.java │ │ │ └── VideoTagPayloadReader.java │ │ ├── mkv │ │ │ ├── DefaultEbmlReader.java │ │ │ ├── EbmlProcessor.java │ │ │ ├── EbmlReader.java │ │ │ ├── MatroskaExtractor.java │ │ │ ├── Sniffer.java │ │ │ └── VarintReader.java │ │ ├── mp3 │ │ │ ├── ConstantBitrateSeeker.java │ │ │ ├── MlltSeeker.java │ │ │ ├── Mp3Extractor.java │ │ │ ├── Seeker.java │ │ │ ├── VbriSeeker.java │ │ │ └── XingSeeker.java │ │ ├── mp4 │ │ │ ├── Atom.java │ │ │ ├── AtomParsers.java │ │ │ ├── DefaultSampleValues.java │ │ │ ├── FixedSampleSizeRechunker.java │ │ │ ├── FragmentedMp4Extractor.java │ │ │ ├── MdtaMetadataEntry.java │ │ │ ├── MetadataUtil.java │ │ │ ├── Mp4Extractor.java │ │ │ ├── PsshAtomUtil.java │ │ │ ├── Sniffer.java │ │ │ ├── Track.java │ │ │ ├── TrackEncryptionBox.java │ │ │ ├── TrackFragment.java │ │ │ └── TrackSampleTable.java │ │ ├── ogg │ │ │ ├── DefaultOggSeeker.java │ │ │ ├── FlacReader.java │ │ │ ├── OggExtractor.java │ │ │ ├── OggPacket.java │ │ │ ├── OggPageHeader.java │ │ │ ├── OggSeeker.java │ │ │ ├── OpusReader.java │ │ │ ├── StreamReader.java │ │ │ ├── VorbisBitArray.java │ │ │ ├── VorbisReader.java │ │ │ └── VorbisUtil.java │ │ ├── rawcc │ │ │ └── RawCcExtractor.java │ │ ├── ts │ │ │ ├── Ac3Extractor.java │ │ │ ├── Ac3Reader.java │ │ │ ├── Ac4Extractor.java │ │ │ ├── Ac4Reader.java │ │ │ ├── AdtsExtractor.java │ │ │ ├── AdtsReader.java │ │ │ ├── DefaultTsPayloadReaderFactory.java │ │ │ ├── DtsReader.java │ │ │ ├── DvbSubtitleReader.java │ │ │ ├── ElementaryStreamReader.java │ │ │ ├── H262Reader.java │ │ │ ├── H264Reader.java │ │ │ ├── H265Reader.java │ │ │ ├── Id3Reader.java │ │ │ ├── LatmReader.java │ │ │ ├── MpegAudioReader.java │ │ │ ├── NalUnitTargetBuffer.java │ │ │ ├── PesReader.java │ │ │ ├── PsBinarySearchSeeker.java │ │ │ ├── PsDurationReader.java │ │ │ ├── PsExtractor.java │ │ │ ├── SectionPayloadReader.java │ │ │ ├── SectionReader.java │ │ │ ├── SeiReader.java │ │ │ ├── SpliceInfoSectionReader.java │ │ │ ├── TsBinarySearchSeeker.java │ │ │ ├── TsDurationReader.java │ │ │ ├── TsExtractor.java │ │ │ ├── TsPayloadReader.java │ │ │ ├── TsUtil.java │ │ │ └── UserDataReader.java │ │ └── wav │ │ │ ├── WavExtractor.java │ │ │ ├── WavHeader.java │ │ │ └── WavHeaderReader.java │ │ ├── mediacodec │ │ ├── MediaCodecInfo.java │ │ ├── MediaCodecRenderer.java │ │ ├── MediaCodecSelector.java │ │ ├── MediaCodecUtil.java │ │ ├── MediaFormatUtil.java │ │ └── package-info.java │ │ ├── metadata │ │ ├── Metadata.java │ │ ├── MetadataDecoder.java │ │ ├── MetadataDecoderFactory.java │ │ ├── MetadataInputBuffer.java │ │ ├── MetadataOutput.java │ │ ├── MetadataRenderer.java │ │ ├── emsg │ │ │ ├── EventMessage.java │ │ │ ├── EventMessageDecoder.java │ │ │ ├── EventMessageEncoder.java │ │ │ └── package-info.java │ │ ├── flac │ │ │ ├── PictureFrame.java │ │ │ ├── VorbisComment.java │ │ │ └── package-info.java │ │ ├── icy │ │ │ ├── IcyDecoder.java │ │ │ ├── IcyHeaders.java │ │ │ ├── IcyInfo.java │ │ │ └── package-info.java │ │ ├── id3 │ │ │ ├── ApicFrame.java │ │ │ ├── BinaryFrame.java │ │ │ ├── ChapterFrame.java │ │ │ ├── ChapterTocFrame.java │ │ │ ├── CommentFrame.java │ │ │ ├── GeobFrame.java │ │ │ ├── Id3Decoder.java │ │ │ ├── Id3Frame.java │ │ │ ├── InternalFrame.java │ │ │ ├── MlltFrame.java │ │ │ ├── PrivFrame.java │ │ │ ├── TextInformationFrame.java │ │ │ ├── UrlLinkFrame.java │ │ │ └── package-info.java │ │ ├── package-info.java │ │ └── scte35 │ │ │ ├── PrivateCommand.java │ │ │ ├── SpliceCommand.java │ │ │ ├── SpliceInfoDecoder.java │ │ │ ├── SpliceInsertCommand.java │ │ │ ├── SpliceNullCommand.java │ │ │ ├── SpliceScheduleCommand.java │ │ │ ├── TimeSignalCommand.java │ │ │ └── package-info.java │ │ ├── offline │ │ ├── ActionFile.java │ │ ├── ActionFileUpgradeUtil.java │ │ ├── DefaultDownloadIndex.java │ │ ├── DefaultDownloaderFactory.java │ │ ├── Download.java │ │ ├── DownloadCursor.java │ │ ├── DownloadException.java │ │ ├── DownloadHelper.java │ │ ├── DownloadIndex.java │ │ ├── DownloadManager.java │ │ ├── DownloadProgress.java │ │ ├── DownloadRequest.java │ │ ├── DownloadService.java │ │ ├── Downloader.java │ │ ├── DownloaderConstructorHelper.java │ │ ├── DownloaderFactory.java │ │ ├── FilterableManifest.java │ │ ├── FilteringManifestParser.java │ │ ├── ProgressiveDownloader.java │ │ ├── SegmentDownloader.java │ │ ├── StreamKey.java │ │ ├── WritableDownloadIndex.java │ │ └── package-info.java │ │ ├── package-info.java │ │ ├── scheduler │ │ ├── PlatformScheduler.java │ │ ├── Requirements.java │ │ ├── RequirementsWatcher.java │ │ ├── Scheduler.java │ │ └── package-info.java │ │ ├── source │ │ ├── AbstractConcatenatedTimeline.java │ │ ├── AdaptiveMediaSourceEventListener.java │ │ ├── BaseMediaSource.java │ │ ├── BehindLiveWindowException.java │ │ ├── ClippingMediaPeriod.java │ │ ├── ClippingMediaSource.java │ │ ├── CompositeMediaSource.java │ │ ├── CompositeSequenceableLoader.java │ │ ├── CompositeSequenceableLoaderFactory.java │ │ ├── ConcatenatingMediaSource.java │ │ ├── DefaultCompositeSequenceableLoaderFactory.java │ │ ├── DefaultMediaSourceEventListener.java │ │ ├── EmptySampleStream.java │ │ ├── ExtractorMediaSource.java │ │ ├── ForwardingTimeline.java │ │ ├── IcyDataSource.java │ │ ├── LoopingMediaSource.java │ │ ├── MaskingMediaPeriod.java │ │ ├── MaskingMediaSource.java │ │ ├── MediaPeriod.java │ │ ├── MediaSource.java │ │ ├── MediaSourceEventListener.java │ │ ├── MediaSourceFactory.java │ │ ├── MergingMediaPeriod.java │ │ ├── MergingMediaSource.java │ │ ├── ProgressiveMediaPeriod.java │ │ ├── ProgressiveMediaSource.java │ │ ├── SampleMetadataQueue.java │ │ ├── SampleQueue.java │ │ ├── SampleStream.java │ │ ├── SequenceableLoader.java │ │ ├── ShuffleOrder.java │ │ ├── SilenceMediaSource.java │ │ ├── SinglePeriodTimeline.java │ │ ├── SingleSampleMediaPeriod.java │ │ ├── SingleSampleMediaSource.java │ │ ├── TrackGroup.java │ │ ├── TrackGroupArray.java │ │ ├── UnrecognizedInputFormatException.java │ │ ├── ads │ │ │ ├── AdPlaybackState.java │ │ │ ├── AdsLoader.java │ │ │ ├── AdsMediaSource.java │ │ │ └── SinglePeriodAdTimeline.java │ │ ├── chunk │ │ │ ├── BaseMediaChunk.java │ │ │ ├── BaseMediaChunkIterator.java │ │ │ ├── BaseMediaChunkOutput.java │ │ │ ├── Chunk.java │ │ │ ├── ChunkExtractorWrapper.java │ │ │ ├── ChunkHolder.java │ │ │ ├── ChunkSampleStream.java │ │ │ ├── ChunkSource.java │ │ │ ├── ContainerMediaChunk.java │ │ │ ├── DataChunk.java │ │ │ ├── InitializationChunk.java │ │ │ ├── MediaChunk.java │ │ │ ├── MediaChunkIterator.java │ │ │ ├── MediaChunkListIterator.java │ │ │ └── SingleSampleMediaChunk.java │ │ ├── dash │ │ │ ├── DashChunkSource.java │ │ │ ├── DashManifestStaleException.java │ │ │ ├── DashMediaPeriod.java │ │ │ ├── DashMediaSource.java │ │ │ ├── DashSegmentIndex.java │ │ │ ├── DashUtil.java │ │ │ ├── DashWrappingSegmentIndex.java │ │ │ ├── DefaultDashChunkSource.java │ │ │ ├── EventSampleStream.java │ │ │ ├── PlayerEmsgHandler.java │ │ │ ├── manifest │ │ │ │ ├── AdaptationSet.java │ │ │ │ ├── DashManifest.java │ │ │ │ ├── DashManifestParser.java │ │ │ │ ├── Descriptor.java │ │ │ │ ├── EventStream.java │ │ │ │ ├── Period.java │ │ │ │ ├── ProgramInformation.java │ │ │ │ ├── RangedUri.java │ │ │ │ ├── Representation.java │ │ │ │ ├── SegmentBase.java │ │ │ │ ├── SingleSegmentIndex.java │ │ │ │ ├── UrlTemplate.java │ │ │ │ ├── UtcTimingElement.java │ │ │ │ └── package-info.java │ │ │ ├── offline │ │ │ │ ├── DashDownloader.java │ │ │ │ └── package-info.java │ │ │ └── package-info.java │ │ ├── hls │ │ │ ├── Aes128DataSource.java │ │ │ ├── DefaultHlsDataSourceFactory.java │ │ │ ├── DefaultHlsExtractorFactory.java │ │ │ ├── FullSegmentEncryptionKeyCache.java │ │ │ ├── HlsChunkSource.java │ │ │ ├── HlsDataSourceFactory.java │ │ │ ├── HlsExtractorFactory.java │ │ │ ├── HlsManifest.java │ │ │ ├── HlsMediaChunk.java │ │ │ ├── HlsMediaPeriod.java │ │ │ ├── HlsMediaSource.java │ │ │ ├── HlsSampleStream.java │ │ │ ├── HlsSampleStreamWrapper.java │ │ │ ├── HlsTrackMetadataEntry.java │ │ │ ├── SampleQueueMappingException.java │ │ │ ├── TimestampAdjusterProvider.java │ │ │ ├── WebvttExtractor.java │ │ │ ├── offline │ │ │ │ ├── HlsDownloader.java │ │ │ │ └── package-info.java │ │ │ ├── package-info.java │ │ │ └── playlist │ │ │ │ ├── DefaultHlsPlaylistParserFactory.java │ │ │ │ ├── DefaultHlsPlaylistTracker.java │ │ │ │ ├── FilteringHlsPlaylistParserFactory.java │ │ │ │ ├── HlsMasterPlaylist.java │ │ │ │ ├── HlsMediaPlaylist.java │ │ │ │ ├── HlsPlaylist.java │ │ │ │ ├── HlsPlaylistParser.java │ │ │ │ ├── HlsPlaylistParserFactory.java │ │ │ │ ├── HlsPlaylistTracker.java │ │ │ │ └── package-info.java │ │ └── smoothstreaming │ │ │ ├── DefaultSsChunkSource.java │ │ │ ├── SsChunkSource.java │ │ │ ├── SsMediaPeriod.java │ │ │ ├── SsMediaSource.java │ │ │ ├── manifest │ │ │ ├── SsManifest.java │ │ │ ├── SsManifestParser.java │ │ │ ├── SsUtil.java │ │ │ └── package-info.java │ │ │ ├── offline │ │ │ ├── SsDownloader.java │ │ │ └── package-info.java │ │ │ └── package-info.java │ │ ├── text │ │ ├── CaptionStyleCompat.java │ │ ├── Cue.java │ │ ├── SimpleSubtitleDecoder.java │ │ ├── SimpleSubtitleOutputBuffer.java │ │ ├── Subtitle.java │ │ ├── SubtitleDecoder.java │ │ ├── SubtitleDecoderException.java │ │ ├── SubtitleDecoderFactory.java │ │ ├── SubtitleInputBuffer.java │ │ ├── SubtitleOutputBuffer.java │ │ ├── TextOutput.java │ │ ├── TextRenderer.java │ │ ├── cea │ │ │ ├── Cea608Decoder.java │ │ │ ├── Cea708Cue.java │ │ │ ├── Cea708Decoder.java │ │ │ ├── Cea708InitializationData.java │ │ │ ├── CeaDecoder.java │ │ │ ├── CeaSubtitle.java │ │ │ ├── CeaUtil.java │ │ │ └── package-info.java │ │ ├── dvb │ │ │ ├── DvbDecoder.java │ │ │ ├── DvbParser.java │ │ │ ├── DvbSubtitle.java │ │ │ └── package-info.java │ │ ├── package-info.java │ │ ├── pgs │ │ │ ├── PgsDecoder.java │ │ │ ├── PgsSubtitle.java │ │ │ └── package-info.java │ │ ├── ssa │ │ │ ├── SsaDecoder.java │ │ │ ├── SsaDialogueFormat.java │ │ │ ├── SsaStyle.java │ │ │ ├── SsaSubtitle.java │ │ │ └── package-info.java │ │ ├── subrip │ │ │ ├── SubripDecoder.java │ │ │ ├── SubripSubtitle.java │ │ │ └── package-info.java │ │ ├── ttml │ │ │ ├── TtmlDecoder.java │ │ │ ├── TtmlNode.java │ │ │ ├── TtmlRegion.java │ │ │ ├── TtmlRenderUtil.java │ │ │ ├── TtmlStyle.java │ │ │ ├── TtmlSubtitle.java │ │ │ └── package-info.java │ │ ├── tx3g │ │ │ ├── Tx3gDecoder.java │ │ │ ├── Tx3gSubtitle.java │ │ │ └── package-info.java │ │ └── webvtt │ │ │ ├── CssParser.java │ │ │ ├── Mp4WebvttDecoder.java │ │ │ ├── Mp4WebvttSubtitle.java │ │ │ ├── WebvttCssStyle.java │ │ │ ├── WebvttCue.java │ │ │ ├── WebvttCueParser.java │ │ │ ├── WebvttDecoder.java │ │ │ ├── WebvttParserUtil.java │ │ │ ├── WebvttSubtitle.java │ │ │ └── package-info.java │ │ ├── trackselection │ │ ├── AdaptiveTrackSelection.java │ │ ├── BaseTrackSelection.java │ │ ├── BufferSizeAdaptationBuilder.java │ │ ├── DefaultTrackSelector.java │ │ ├── FixedTrackSelection.java │ │ ├── MappingTrackSelector.java │ │ ├── RandomTrackSelection.java │ │ ├── TrackSelection.java │ │ ├── TrackSelectionArray.java │ │ ├── TrackSelectionParameters.java │ │ ├── TrackSelectionUtil.java │ │ ├── TrackSelector.java │ │ ├── TrackSelectorResult.java │ │ └── package-info.java │ │ ├── upstream │ │ ├── Allocation.java │ │ ├── Allocator.java │ │ ├── AssetDataSource.java │ │ ├── BandwidthMeter.java │ │ ├── BaseDataSource.java │ │ ├── ByteArrayDataSink.java │ │ ├── ByteArrayDataSource.java │ │ ├── ContentDataSource.java │ │ ├── DataSchemeDataSource.java │ │ ├── DataSink.java │ │ ├── DataSource.java │ │ ├── DataSourceException.java │ │ ├── DataSourceInputStream.java │ │ ├── DataSpec.java │ │ ├── DefaultAllocator.java │ │ ├── DefaultBandwidthMeter.java │ │ ├── DefaultDataSource.java │ │ ├── DefaultDataSourceFactory.java │ │ ├── DefaultHttpDataSource.java │ │ ├── DefaultHttpDataSourceFactory.java │ │ ├── DefaultLoadErrorHandlingPolicy.java │ │ ├── DummyDataSource.java │ │ ├── FileDataSource.java │ │ ├── FileDataSourceFactory.java │ │ ├── HttpDataSource.java │ │ ├── LoadErrorHandlingPolicy.java │ │ ├── Loader.java │ │ ├── LoaderErrorThrower.java │ │ ├── ParsingLoadable.java │ │ ├── PriorityDataSource.java │ │ ├── PriorityDataSourceFactory.java │ │ ├── RawResourceDataSource.java │ │ ├── ResolvingDataSource.java │ │ ├── StatsDataSource.java │ │ ├── TeeDataSource.java │ │ ├── TransferListener.java │ │ ├── UdpDataSource.java │ │ ├── cache │ │ │ ├── Cache.java │ │ │ ├── CacheDataSink.java │ │ │ ├── CacheDataSinkFactory.java │ │ │ ├── CacheDataSource.java │ │ │ ├── CacheDataSourceFactory.java │ │ │ ├── CacheEvictor.java │ │ │ ├── CacheFileMetadata.java │ │ │ ├── CacheFileMetadataIndex.java │ │ │ ├── CacheKeyFactory.java │ │ │ ├── CacheSpan.java │ │ │ ├── CacheUtil.java │ │ │ ├── CachedContent.java │ │ │ ├── CachedContentIndex.java │ │ │ ├── CachedRegionTracker.java │ │ │ ├── ContentMetadata.java │ │ │ ├── ContentMetadataMutations.java │ │ │ ├── DefaultContentMetadata.java │ │ │ ├── LeastRecentlyUsedCacheEvictor.java │ │ │ ├── NoOpCacheEvictor.java │ │ │ ├── SimpleCache.java │ │ │ └── SimpleCacheSpan.java │ │ └── crypto │ │ │ ├── AesCipherDataSink.java │ │ │ ├── AesCipherDataSource.java │ │ │ ├── AesFlushingCipher.java │ │ │ └── CryptoUtil.java │ │ ├── util │ │ ├── Assertions.java │ │ ├── AtomicFile.java │ │ ├── Clock.java │ │ ├── CodecSpecificDataUtil.java │ │ ├── ColorParser.java │ │ ├── ConditionVariable.java │ │ ├── EGLSurfaceTexture.java │ │ ├── ErrorMessageProvider.java │ │ ├── EventDispatcher.java │ │ ├── EventLogger.java │ │ ├── FlacStreamMetadata.java │ │ ├── GlUtil.java │ │ ├── HandlerWrapper.java │ │ ├── LibraryLoader.java │ │ ├── Log.java │ │ ├── LongArray.java │ │ ├── MediaClock.java │ │ ├── MimeTypes.java │ │ ├── NalUnitUtil.java │ │ ├── NonNullApi.java │ │ ├── NotificationUtil.java │ │ ├── ParsableBitArray.java │ │ ├── ParsableByteArray.java │ │ ├── ParsableNalUnitBitArray.java │ │ ├── Predicate.java │ │ ├── PriorityTaskManager.java │ │ ├── RepeatModeUtil.java │ │ ├── ReusableBufferedOutputStream.java │ │ ├── SlidingPercentile.java │ │ ├── StandaloneMediaClock.java │ │ ├── SystemClock.java │ │ ├── SystemHandlerWrapper.java │ │ ├── TimedValueQueue.java │ │ ├── TimestampAdjuster.java │ │ ├── TraceUtil.java │ │ ├── UriUtil.java │ │ ├── Util.java │ │ ├── XmlPullParserUtil.java │ │ └── package-info.java │ │ └── video │ │ ├── AvcConfig.java │ │ ├── ColorInfo.java │ │ ├── DolbyVisionConfig.java │ │ ├── DummySurface.java │ │ ├── HevcConfig.java │ │ ├── MediaCodecVideoRenderer.java │ │ ├── SimpleDecoderVideoRenderer.java │ │ ├── VideoDecoderException.java │ │ ├── VideoDecoderGLSurfaceView.java │ │ ├── VideoDecoderInputBuffer.java │ │ ├── VideoDecoderOutputBuffer.java │ │ ├── VideoDecoderOutputBufferRenderer.java │ │ ├── VideoDecoderRenderer.java │ │ ├── VideoFrameMetadataListener.java │ │ ├── VideoFrameReleaseTimeHelper.java │ │ ├── VideoListener.java │ │ ├── VideoRendererEventListener.java │ │ ├── package-info.java │ │ └── spherical │ │ ├── CameraMotionListener.java │ │ ├── CameraMotionRenderer.java │ │ ├── FrameRotationQueue.java │ │ ├── Projection.java │ │ ├── ProjectionDecoder.java │ │ └── package-info.java │ └── res │ └── values │ └── strings.xml ├── files ├── ErWeiMa.jpg ├── JeffMony.jpg ├── LocalProxy.png ├── test1.jpg ├── test1_low.jpg ├── test2.jpg └── test2_low.jpg ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── ijkplayer ├── .gitignore ├── build.gradle ├── ijkplayer.iml ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── tv │ │ └── danmaku │ │ └── ijk │ │ └── media │ │ └── player │ │ ├── AbstractMediaPlayer.java │ │ ├── AndroidMediaPlayer.java │ │ ├── IMediaPlayer.java │ │ ├── ISurfaceTextureHolder.java │ │ ├── ISurfaceTextureHost.java │ │ ├── IjkLibLoader.java │ │ ├── IjkMediaCodecInfo.java │ │ ├── IjkMediaMeta.java │ │ ├── IjkMediaPlayer.java │ │ ├── IjkTimedText.java │ │ ├── MediaInfo.java │ │ ├── MediaPlayerProxy.java │ │ ├── TextureMediaPlayer.java │ │ ├── annotations │ │ ├── AccessedByNative.java │ │ └── CalledByNative.java │ │ ├── exceptions │ │ └── IjkMediaException.java │ │ ├── ffmpeg │ │ └── FFmpegApi.java │ │ ├── misc │ │ ├── AndroidMediaFormat.java │ │ ├── AndroidTrackInfo.java │ │ ├── IAndroidIO.java │ │ ├── IMediaDataSource.java │ │ ├── IMediaFormat.java │ │ ├── ITrackInfo.java │ │ ├── IjkMediaFormat.java │ │ └── IjkTrackInfo.java │ │ └── pragma │ │ ├── DebugLog.java │ │ └── Pragma.java │ ├── jniLibs │ ├── arm64-v8a │ │ ├── libijkffmpeg.so │ │ ├── libijkplayer.so │ │ └── libijksdl.so │ ├── armeabi-v7a │ │ ├── libijkffmpeg.so │ │ ├── libijkplayer.so │ │ └── libijksdl.so │ └── armeabi │ │ ├── libijkffmpeg.so │ │ ├── libijkplayer.so │ │ └── libijksdl.so │ └── res │ └── values │ └── strings.xml ├── local.properties ├── mediaproxy ├── .gitignore ├── build.gradle ├── mediaproxy.iml ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── media │ │ └── cache │ │ ├── CacheManager.java │ │ ├── DownloadConstants.java │ │ ├── LocalProxyConfig.java │ │ ├── StorageManager.java │ │ ├── VideoCacheException.java │ │ ├── VideoDownloadManager.java │ │ ├── VideoDownloadQueue.java │ │ ├── VideoInfoParserManager.java │ │ ├── download │ │ ├── BaseVideoDownloadTask.java │ │ ├── M3U8VideoDownloadTask.java │ │ └── VideoDownloadTask.java │ │ ├── hls │ │ ├── M3U8.java │ │ ├── M3U8Constants.java │ │ ├── M3U8Ts.java │ │ └── M3U8Utils.java │ │ ├── http │ │ ├── ChunkedOutputStream.java │ │ ├── ContentType.java │ │ ├── HttpRequest.java │ │ ├── HttpResponse.java │ │ ├── IState.java │ │ ├── Method.java │ │ ├── ResponseState.java │ │ └── SocketProcessorTask.java │ │ ├── listener │ │ ├── IDownloadInfosCallback.java │ │ ├── IDownloadListener.java │ │ ├── IDownloadTaskListener.java │ │ ├── IVideoInfoCallback.java │ │ └── IVideoInfoParseCallback.java │ │ ├── model │ │ ├── Video.java │ │ ├── VideoCacheInfo.java │ │ ├── VideoTaskItem.java │ │ ├── VideoTaskMode.java │ │ └── VideoTaskState.java │ │ ├── proxy │ │ ├── AsyncProxyServer.java │ │ └── CustomProxyServer.java │ │ └── utils │ │ ├── DownloadExceptionUtils.java │ │ ├── HttpUtils.java │ │ ├── LocalProxyThreadUtils.java │ │ ├── LocalProxyUtils.java │ │ └── StorageUtils.java │ └── res │ └── values │ └── strings.xml ├── playersdk ├── .gitignore ├── build.gradle ├── playersdk.iml ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── android │ │ └── player │ │ ├── CommonPlayer.java │ │ ├── IPlayer.java │ │ ├── PlayerAttributes.java │ │ ├── PlayerType.java │ │ ├── impl │ │ ├── ExoPlayerImpl.java │ │ ├── IjkPlayerImpl.java │ │ ├── MediaPlayerImpl.java │ │ └── PlayerImpl.java │ │ └── proxy │ │ └── LocalProxyPlayerImpl.java │ └── res │ └── values │ └── strings.xml └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | .gradle 3 | .idea 4 | local.properties 5 | app/app.iml 6 | playerlib/playerlib.iml 7 | exoplayerlib/exoplayerlib.iml 8 | ijkplayerlib/ijkplayerlib.iml 9 | mediaproxylib/mediaproxylib.iml 10 | mediaproxylib/build 11 | mediaproxylib/build/* 12 | /MediaSDK.iml -------------------------------------------------------------------------------- /MediaSDK.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /androidasync/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /androidasync/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | compileSdkVersion 29 5 | buildToolsVersion "29.0.3" 6 | 7 | defaultConfig { 8 | minSdkVersion 19 9 | targetSdkVersion 29 10 | versionCode 1 11 | versionName "1.0" 12 | 13 | consumerProguardFiles 'consumer-rules.pro' 14 | } 15 | 16 | compileOptions { 17 | sourceCompatibility JavaVersion.VERSION_1_8 18 | targetCompatibility JavaVersion.VERSION_1_8 19 | } 20 | 21 | buildTypes { 22 | release { 23 | minifyEnabled false 24 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 25 | } 26 | } 27 | 28 | } 29 | 30 | dependencies { 31 | implementation fileTree(dir: 'libs', include: ['*.jar']) 32 | compileOnly group: 'org.bouncycastle', name: 'bcprov-jdk15on', version: '1.60' 33 | compileOnly group: 'org.bouncycastle', name: 'bcpkix-jdk15on', version: '1.60' 34 | implementation 'androidx.appcompat:appcompat:1.1.0' 35 | } 36 | -------------------------------------------------------------------------------- /androidasync/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JeffMony/MediaSDK/b9fc6524c5ec1634b98058f40b29fe22801c1938/androidasync/consumer-rules.pro -------------------------------------------------------------------------------- /androidasync/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /androidasync/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/AsyncSSLException.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async; 2 | 3 | public class AsyncSSLException extends Exception { 4 | public AsyncSSLException(Throwable cause) { 5 | super("Peer not trusted by any of the system trust managers.", cause); 6 | } 7 | private boolean mIgnore = false; 8 | public void setIgnore(boolean ignore) { 9 | mIgnore = ignore; 10 | } 11 | 12 | public boolean getIgnore() { 13 | return mIgnore; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/AsyncSSLServerSocket.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async; 2 | 3 | import java.security.PrivateKey; 4 | import java.security.cert.Certificate; 5 | 6 | public interface AsyncSSLServerSocket extends AsyncServerSocket { 7 | PrivateKey getPrivateKey(); 8 | Certificate getCertificate(); 9 | } 10 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/AsyncSSLSocket.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async; 2 | 3 | import java.security.cert.X509Certificate; 4 | 5 | import javax.net.ssl.SSLEngine; 6 | 7 | public interface AsyncSSLSocket extends AsyncSocket { 8 | X509Certificate[] getPeerCertificates(); 9 | SSLEngine getSSLEngine(); 10 | } 11 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/AsyncServerSocket.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async; 2 | 3 | public interface AsyncServerSocket { 4 | void stop(); 5 | int getLocalPort(); 6 | } 7 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/AsyncSocket.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async; 2 | 3 | public interface AsyncSocket extends DataEmitter, DataSink { 4 | AsyncServer getServer(); 5 | } 6 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/DataEmitter.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async; 2 | 3 | import com.jeffmony.async.callback.CompletedCallback; 4 | import com.jeffmony.async.callback.DataCallback; 5 | 6 | public interface DataEmitter { 7 | void setDataCallback(DataCallback callback); 8 | DataCallback getDataCallback(); 9 | boolean isChunked(); 10 | void pause(); 11 | void resume(); 12 | void close(); 13 | boolean isPaused(); 14 | void setEndCallback(CompletedCallback callback); 15 | CompletedCallback getEndCallback(); 16 | AsyncServer getServer(); 17 | String charset(); 18 | } 19 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/DataEmitterBase.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async; 2 | 3 | import com.jeffmony.async.callback.CompletedCallback; 4 | import com.jeffmony.async.callback.DataCallback; 5 | 6 | /** 7 | * Created by koush on 5/27/13. 8 | */ 9 | public abstract class DataEmitterBase implements DataEmitter { 10 | private boolean ended; 11 | protected void report(Exception e) { 12 | if (ended) 13 | return; 14 | ended = true; 15 | if (getEndCallback() != null) 16 | getEndCallback().onCompleted(e); 17 | } 18 | 19 | @Override 20 | public final void setEndCallback(CompletedCallback callback) { 21 | endCallback = callback; 22 | } 23 | 24 | CompletedCallback endCallback; 25 | @Override 26 | public final CompletedCallback getEndCallback() { 27 | return endCallback; 28 | } 29 | 30 | 31 | DataCallback mDataCallback; 32 | @Override 33 | public void setDataCallback(DataCallback callback) { 34 | mDataCallback = callback; 35 | } 36 | 37 | @Override 38 | public DataCallback getDataCallback() { 39 | return mDataCallback; 40 | } 41 | 42 | @Override 43 | public String charset() { 44 | return null; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/DataSink.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async; 2 | 3 | import com.jeffmony.async.callback.CompletedCallback; 4 | import com.jeffmony.async.callback.WritableCallback; 5 | 6 | public interface DataSink { 7 | public void write(ByteBufferList bb); 8 | public void setWriteableCallback(WritableCallback handler); 9 | public WritableCallback getWriteableCallback(); 10 | 11 | public boolean isOpen(); 12 | public void end(); 13 | public void setClosedCallback(CompletedCallback handler); 14 | public CompletedCallback getClosedCallback(); 15 | public AsyncServer getServer(); 16 | } 17 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/DataTrackingEmitter.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async; 2 | 3 | /** 4 | * Created by koush on 5/28/13. 5 | */ 6 | public interface DataTrackingEmitter extends DataEmitter { 7 | interface DataTracker { 8 | void onData(int totalBytesRead); 9 | } 10 | void setDataTracker(DataTracker tracker); 11 | DataTracker getDataTracker(); 12 | int getBytesRead(); 13 | void setDataEmitter(DataEmitter emitter); 14 | } 15 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/FilteredDataSink.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async; 2 | 3 | public class FilteredDataSink extends BufferedDataSink { 4 | public FilteredDataSink(DataSink sink) { 5 | super(sink); 6 | setMaxBuffer(0); 7 | } 8 | 9 | public ByteBufferList filter(ByteBufferList bb) { 10 | return bb; 11 | } 12 | 13 | @Override 14 | protected void onDataAccepted(ByteBufferList bb) { 15 | ByteBufferList filtered = filter(bb); 16 | // filtering may return the same byte buffer, so watch for that. 17 | if (filtered != bb) { 18 | bb.recycle(); 19 | filtered.get(bb); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/HostnameResolutionException.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async; 2 | 3 | public class HostnameResolutionException extends Exception { 4 | public HostnameResolutionException(String message) { 5 | super(message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/TapCallback.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async; 2 | 3 | 4 | public interface TapCallback { 5 | } 6 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/callback/CompletedCallback.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.callback; 2 | 3 | public interface CompletedCallback { 4 | class NullCompletedCallback implements CompletedCallback { 5 | @Override 6 | public void onCompleted(Exception ex) { 7 | 8 | } 9 | } 10 | 11 | public void onCompleted(Exception ex); 12 | } 13 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/callback/ConnectCallback.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.callback; 2 | 3 | import com.jeffmony.async.AsyncSocket; 4 | 5 | public interface ConnectCallback { 6 | void onConnectCompleted(Exception ex, AsyncSocket socket); 7 | } 8 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/callback/ContinuationCallback.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.callback; 2 | 3 | import com.jeffmony.async.future.Continuation; 4 | 5 | public interface ContinuationCallback { 6 | void onContinue(Continuation continuation, CompletedCallback next) throws Exception; 7 | } 8 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/callback/DataCallback.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.callback; 2 | 3 | import com.jeffmony.async.ByteBufferList; 4 | import com.jeffmony.async.DataEmitter; 5 | 6 | public interface DataCallback { 7 | class NullDataCallback implements DataCallback { 8 | @Override 9 | public void onDataAvailable(DataEmitter emitter, ByteBufferList bb) { 10 | bb.recycle(); 11 | } 12 | } 13 | 14 | void onDataAvailable(DataEmitter emitter, ByteBufferList bb); 15 | } 16 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/callback/ListenCallback.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.callback; 2 | 3 | import com.jeffmony.async.AsyncServerSocket; 4 | import com.jeffmony.async.AsyncSocket; 5 | 6 | public interface ListenCallback extends CompletedCallback { 7 | void onAccepted(AsyncSocket socket); 8 | void onListening(AsyncServerSocket socket); 9 | } 10 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/callback/ResultCallback.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.callback; 2 | 3 | public interface ResultCallback { 4 | public void onCompleted(Exception e, S source, T result); 5 | } 6 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/callback/SocketCreateCallback.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.callback; 2 | 3 | public interface SocketCreateCallback { 4 | void onSocketCreated(int localPort); 5 | } 6 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/callback/ValueCallback.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.callback; 2 | 3 | /** 4 | * Created by koush on 7/5/16. 5 | */ 6 | public interface ValueCallback { 7 | void onResult(T value); 8 | } 9 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/callback/ValueFunction.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.callback; 2 | 3 | public interface ValueFunction { 4 | T getValue() throws Exception; 5 | } 6 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/callback/WritableCallback.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.callback; 2 | 3 | public interface WritableCallback { 4 | public void onWriteable(); 5 | } 6 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/future/Cancellable.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.future; 2 | 3 | public interface Cancellable { 4 | /** 5 | * Check whether this asynchronous operation completed successfully. 6 | * @return 7 | */ 8 | boolean isDone(); 9 | 10 | /** 11 | * Check whether this asynchronous operation has been cancelled. 12 | * @return 13 | */ 14 | boolean isCancelled(); 15 | 16 | /** 17 | * Attempt to cancel this asynchronous operation. 18 | * @return The return value is whether the operation cancelled successfully. 19 | */ 20 | boolean cancel(); 21 | } 22 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/future/DependentCancellable.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.future; 2 | 3 | public interface DependentCancellable extends Cancellable { 4 | boolean setParent(Cancellable parent); 5 | } 6 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/future/DependentFuture.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.future; 2 | 3 | public interface DependentFuture extends Future, DependentCancellable { 4 | } 5 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/future/DoneCallback.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.future; 2 | 3 | public interface DoneCallback { 4 | void done(Exception e, T result) throws Exception; 5 | } 6 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/future/FailCallback.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.future; 2 | 3 | public interface FailCallback { 4 | /** 5 | * Callback that is invoked when a future completes with an error. 6 | * The error should be rethrown to pass it along. 7 | * @param e 8 | * @throws Exception 9 | */ 10 | void fail(Exception e) throws Exception; 11 | } 12 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/future/FailConvertCallback.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.future; 2 | 3 | public interface FailConvertCallback { 4 | /** 5 | * Callback that is invoked when a future completes with an error. 6 | * The error should be rethrown, or a new value should be returned. 7 | * @param e 8 | * @return 9 | * @throws Exception 10 | */ 11 | T fail(Exception e) throws Exception; 12 | } 13 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/future/FailRecoverCallback.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.future; 2 | 3 | public interface FailRecoverCallback { 4 | /** 5 | * Callback that is invoked when a future completes with an error. 6 | * The error should be rethrown, or a new future value should be returned. 7 | * @param e 8 | * @return 9 | * @throws Exception 10 | */ 11 | Future fail(Exception e) throws Exception; 12 | } 13 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/future/FutureCallback.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.future; 2 | 3 | /** 4 | * Created by koush on 5/20/13. 5 | */ 6 | public interface FutureCallback { 7 | /** 8 | * onCompleted is called by the Future with the result or exception of the asynchronous operation. 9 | * @param e Exception encountered by the operation 10 | * @param result Result returned from the operation 11 | */ 12 | void onCompleted(Exception e, T result); 13 | } 14 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/future/FutureRunnable.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.future; 2 | 3 | /** 4 | * Created by koush on 12/22/13. 5 | */ 6 | public interface FutureRunnable { 7 | T run() throws Exception; 8 | } 9 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/future/FutureThread.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.future; 2 | 3 | import java.util.concurrent.ExecutorService; 4 | 5 | /** 6 | * Created by koush on 12/22/13. 7 | */ 8 | public class FutureThread extends SimpleFuture { 9 | public FutureThread(final FutureRunnable runnable) { 10 | this(runnable, "FutureThread"); 11 | } 12 | 13 | public FutureThread(final ExecutorService pool, final FutureRunnable runnable) { 14 | pool.submit(new Runnable() { 15 | @Override 16 | public void run() { 17 | try { 18 | setComplete(runnable.run()); 19 | } 20 | catch (Exception e) { 21 | setComplete(e); 22 | } 23 | } 24 | }); 25 | } 26 | 27 | public FutureThread(final FutureRunnable runnable, String name) { 28 | new Thread(new Runnable() { 29 | @Override 30 | public void run() { 31 | try { 32 | setComplete(runnable.run()); 33 | } 34 | catch (Exception e) { 35 | setComplete(e); 36 | } 37 | } 38 | }, name).start(); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/future/HandlerFuture.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.future; 2 | 3 | import android.os.Handler; 4 | import android.os.Looper; 5 | 6 | /** 7 | * Created by koush on 12/25/13. 8 | */ 9 | public class HandlerFuture extends SimpleFuture { 10 | Handler handler; 11 | 12 | public HandlerFuture() { 13 | Looper looper = Looper.myLooper(); 14 | if (looper == null) 15 | looper = Looper.getMainLooper(); 16 | handler = new Handler(looper); 17 | } 18 | 19 | @Override 20 | public void setCallback(final FutureCallback callback) { 21 | FutureCallback wrapped = new FutureCallback() { 22 | @Override 23 | public void onCompleted(final Exception e, final T result) { 24 | if (Looper.myLooper() == handler.getLooper()) { 25 | callback.onCompleted(e, result); 26 | return; 27 | } 28 | 29 | handler.post(new Runnable() { 30 | @Override 31 | public void run() { 32 | onCompleted(e, result); 33 | } 34 | }); 35 | } 36 | }; 37 | super.setCallback(wrapped); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/future/MultiTransformFuture.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.future; 2 | 3 | public abstract class MultiTransformFuture extends MultiFuture implements FutureCallback { 4 | @Override 5 | public void onCompleted(Exception e, F result) { 6 | if (isCancelled()) 7 | return; 8 | if (e != null) { 9 | error(e); 10 | return; 11 | } 12 | 13 | try { 14 | transform(result); 15 | } 16 | catch (Exception ex) { 17 | error(ex); 18 | } 19 | } 20 | 21 | protected void error(Exception e) { 22 | setComplete(e); 23 | } 24 | 25 | protected abstract void transform(F result) throws Exception; 26 | } -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/future/SuccessCallback.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.future; 2 | 3 | public interface SuccessCallback { 4 | void success(T value) throws Exception; 5 | } 6 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/future/ThenCallback.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.future; 2 | 3 | public interface ThenCallback { 4 | /** 5 | * Callback that is invoked when Future.then completes, 6 | * and converts a value F to value T. 7 | * @param from 8 | * @return 9 | * @throws Exception 10 | */ 11 | T then(F from) throws Exception; 12 | } 13 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/future/ThenFutureCallback.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.future; 2 | 3 | public interface ThenFutureCallback { 4 | /** 5 | * Callback that is invoked when Future.then completes, 6 | * and converts a value F to a Future. 7 | * @param from 8 | * @return 9 | * @throws Exception 10 | */ 11 | Future then(F from) throws Exception; 12 | } 13 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/future/TransformFuture.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.future; 2 | 3 | public abstract class TransformFuture extends SimpleFuture implements FutureCallback { 4 | public TransformFuture(F from) { 5 | onCompleted(null, from); 6 | } 7 | 8 | public TransformFuture() { 9 | } 10 | 11 | @Override 12 | public void onCompleted(Exception e, F result) { 13 | if (isCancelled()) 14 | return; 15 | if (e != null) { 16 | error(e); 17 | return; 18 | } 19 | 20 | try { 21 | transform(result); 22 | } 23 | catch (Exception ex) { 24 | error(ex); 25 | } 26 | } 27 | 28 | protected void error(Exception e) { 29 | setComplete(e); 30 | } 31 | 32 | protected abstract void transform(F result) throws Exception; 33 | } -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/future/TypeConverter.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.future; 2 | 3 | public interface TypeConverter { 4 | Future convert(F from, String fromMime) throws Exception; 5 | } 6 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/AsyncHttpDelete.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http; 2 | 3 | import android.net.Uri; 4 | 5 | public class AsyncHttpDelete extends AsyncHttpRequest { 6 | public static final String METHOD = "DELETE"; 7 | 8 | public AsyncHttpDelete(String uri) { 9 | this(Uri.parse(uri)); 10 | } 11 | 12 | public AsyncHttpDelete(Uri uri) { 13 | super(uri, METHOD); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/AsyncHttpGet.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http; 2 | 3 | import android.net.Uri; 4 | 5 | public class AsyncHttpGet extends AsyncHttpRequest { 6 | public static final String METHOD = "GET"; 7 | 8 | public AsyncHttpGet(String uri) { 9 | super(Uri.parse(uri), METHOD); 10 | } 11 | 12 | public AsyncHttpGet(Uri uri) { 13 | super(uri, METHOD); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/AsyncHttpHead.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http; 2 | 3 | import android.net.Uri; 4 | 5 | /** 6 | * Created by koush on 8/25/13. 7 | */ 8 | public class AsyncHttpHead extends AsyncHttpRequest { 9 | public AsyncHttpHead(Uri uri) { 10 | super(uri, METHOD); 11 | } 12 | 13 | @Override 14 | public boolean hasBody() { 15 | return false; 16 | } 17 | 18 | public static final String METHOD = "HEAD"; 19 | } 20 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/AsyncHttpPost.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http; 2 | 3 | import android.net.Uri; 4 | 5 | public class AsyncHttpPost extends AsyncHttpRequest { 6 | public static final String METHOD = "POST"; 7 | 8 | public AsyncHttpPost(String uri) { 9 | this(Uri.parse(uri)); 10 | } 11 | 12 | public AsyncHttpPost(Uri uri) { 13 | super(uri, METHOD); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/AsyncHttpPut.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http; 2 | 3 | import android.net.Uri; 4 | 5 | public class AsyncHttpPut extends AsyncHttpRequest { 6 | public static final String METHOD = "PUT"; 7 | 8 | public AsyncHttpPut(String uri) { 9 | this(Uri.parse(uri)); 10 | } 11 | 12 | public AsyncHttpPut(Uri uri) { 13 | super(uri, METHOD); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/AsyncHttpResponse.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http; 2 | 3 | import com.jeffmony.async.AsyncSocket; 4 | import com.jeffmony.async.DataEmitter; 5 | 6 | public interface AsyncHttpResponse extends DataEmitter { 7 | String protocol(); 8 | String message(); 9 | int code(); 10 | Headers headers(); 11 | AsyncSocket detachSocket(); 12 | AsyncHttpRequest getRequest(); 13 | } 14 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/AsyncSSLEngineConfigurator.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http; 2 | 3 | import javax.net.ssl.SSLContext; 4 | import javax.net.ssl.SSLEngine; 5 | 6 | public interface AsyncSSLEngineConfigurator { 7 | SSLEngine createEngine(SSLContext sslContext, String peerHost, int peerPort); 8 | void configureEngine(SSLEngine engine, AsyncHttpClientMiddleware.GetSocketData data, String host, int port); 9 | } 10 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/BodyDecoderException.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http; 2 | 3 | public class BodyDecoderException extends Exception { 4 | public BodyDecoderException(String message) { 5 | super(message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/ConnectionClosedException.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http; 2 | 3 | public class ConnectionClosedException extends Exception { 4 | public ConnectionClosedException(String message) { 5 | super(message); 6 | } 7 | 8 | public ConnectionClosedException(String detailMessage, Throwable throwable) { 9 | super(detailMessage, throwable); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/ConnectionFailedException.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http; 2 | 3 | public class ConnectionFailedException extends Exception { 4 | public ConnectionFailedException(String message) { 5 | super(message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/RedirectLimitExceededException.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http; 2 | 3 | public class RedirectLimitExceededException extends Exception { 4 | public RedirectLimitExceededException(String message) { 5 | super(message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/SimpleMiddleware.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http; 2 | 3 | import com.jeffmony.async.future.Cancellable; 4 | 5 | public class SimpleMiddleware implements AsyncHttpClientMiddleware { 6 | @Override 7 | public void onRequest(OnRequestData data) { 8 | } 9 | 10 | @Override 11 | public Cancellable getSocket(GetSocketData data) { 12 | return null; 13 | } 14 | 15 | @Override 16 | public boolean exchangeHeaders(OnExchangeHeaderData data) { 17 | return false; 18 | } 19 | 20 | @Override 21 | public void onRequestSent(OnRequestSentData data) { 22 | } 23 | 24 | @Override 25 | public void onHeadersReceived(OnHeadersReceivedData data) { 26 | } 27 | 28 | @Override 29 | public void onBodyDecoder(OnBodyDecoderData data) { 30 | } 31 | 32 | @Override 33 | public AsyncHttpRequest onResponseReady(OnResponseReadyData data) { 34 | return null; 35 | } 36 | 37 | @Override 38 | public void onResponseComplete(OnResponseCompleteData data) { 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/TaggedList.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http; 2 | 3 | import java.util.ArrayList; 4 | 5 | public class TaggedList extends ArrayList { 6 | private Object tag; 7 | 8 | public synchronized V tag() { 9 | return (V)tag; 10 | } 11 | 12 | public synchronized void tag(V tag) { 13 | this.tag = tag; 14 | } 15 | 16 | public synchronized void tagNull(V tag) { 17 | if (this.tag == null) 18 | this.tag = tag; 19 | } 20 | } -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/WebSocket.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http; 2 | 3 | import com.jeffmony.async.AsyncSocket; 4 | 5 | public interface WebSocket extends AsyncSocket { 6 | interface StringCallback { 7 | void onStringAvailable(String s); 8 | } 9 | interface PingCallback { 10 | void onPingReceived(String s); 11 | } 12 | interface PongCallback { 13 | void onPongReceived(String s); 14 | } 15 | 16 | void send(byte[] bytes); 17 | void send(String string); 18 | void send(byte[] bytes, int offset, int len); 19 | void ping(String message); 20 | void pong(String message); 21 | 22 | void setStringCallback(StringCallback callback); 23 | StringCallback getStringCallback(); 24 | 25 | void setPingCallback(PingCallback callback); 26 | 27 | void setPongCallback(PongCallback callback); 28 | PongCallback getPongCallback(); 29 | 30 | boolean isBuffering(); 31 | String getProtocol(); 32 | 33 | AsyncSocket getSocket(); 34 | } 35 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/WebSocketHandshakeException.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http; 2 | 3 | public class WebSocketHandshakeException extends Exception { 4 | public WebSocketHandshakeException(String message) { 5 | super(message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/body/AsyncHttpRequestBody.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http.body; 2 | 3 | import com.jeffmony.async.DataEmitter; 4 | import com.jeffmony.async.DataSink; 5 | import com.jeffmony.async.callback.CompletedCallback; 6 | import com.jeffmony.async.http.AsyncHttpRequest; 7 | 8 | public interface AsyncHttpRequestBody { 9 | void write(AsyncHttpRequest request, DataSink sink, CompletedCallback completed); 10 | void parse(DataEmitter emitter, CompletedCallback completed); 11 | String getContentType(); 12 | boolean readFullyOnRequest(); 13 | int length(); 14 | T get(); 15 | } 16 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/body/FilePart.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http.body; 2 | 3 | import com.jeffmony.async.http.BasicNameValuePair; 4 | import com.jeffmony.async.http.NameValuePair; 5 | 6 | import java.io.File; 7 | import java.io.FileInputStream; 8 | import java.io.IOException; 9 | import java.io.InputStream; 10 | import java.util.ArrayList; 11 | 12 | public class FilePart extends StreamPart { 13 | File file; 14 | public FilePart(String name, final File file) { 15 | super(name, (int)file.length(), new ArrayList() { 16 | { 17 | add(new BasicNameValuePair("filename", file.getName())); 18 | } 19 | }); 20 | 21 | // getRawHeaders().set("Content-Type", "application/xml"); 22 | 23 | this.file = file; 24 | } 25 | 26 | @Override 27 | protected InputStream getInputStream() throws IOException { 28 | return new FileInputStream(file); 29 | } 30 | 31 | @Override 32 | public String toString() { 33 | return getName(); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/body/StreamPart.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http.body; 2 | 3 | import com.jeffmony.async.DataSink; 4 | import com.jeffmony.async.Util; 5 | import com.jeffmony.async.callback.CompletedCallback; 6 | import com.jeffmony.async.http.NameValuePair; 7 | 8 | import java.io.IOException; 9 | import java.io.InputStream; 10 | import java.util.List; 11 | 12 | public abstract class StreamPart extends Part { 13 | public StreamPart(String name, long length, List contentDisposition) { 14 | super(name, length, contentDisposition); 15 | } 16 | 17 | @Override 18 | public void write(DataSink sink, CompletedCallback callback) { 19 | try { 20 | InputStream is = getInputStream(); 21 | Util.pump(is, sink, callback); 22 | } 23 | catch (Exception e) { 24 | callback.onCompleted(e); 25 | } 26 | } 27 | 28 | protected abstract InputStream getInputStream() throws IOException; 29 | } 30 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/body/StringPart.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http.body; 2 | 3 | import java.io.ByteArrayInputStream; 4 | import java.io.IOException; 5 | import java.io.InputStream; 6 | 7 | public class StringPart extends StreamPart { 8 | String value; 9 | public StringPart(String name, String value) { 10 | super(name, value.getBytes().length, null); 11 | this.value = value; 12 | } 13 | 14 | @Override 15 | protected InputStream getInputStream() throws IOException { 16 | return new ByteArrayInputStream(value.getBytes()); 17 | } 18 | 19 | public String getValue() { 20 | return value; 21 | } 22 | 23 | @Override 24 | public String toString() { 25 | return value; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/cache/Objects.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2010 The Android Open Source Project 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.jeffmony.async.http.cache; 18 | 19 | final class Objects { 20 | private Objects() {} 21 | 22 | /** 23 | * Returns true if two possibly-null objects are equal. 24 | */ 25 | public static boolean equal(Object a, Object b) { 26 | return a == b || (a != null && a.equals(b)); 27 | } 28 | 29 | public static int hashCode(Object o) { 30 | return (o == null) ? 0 : o.hashCode(); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/cache/ResponseSource.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2011 The Android Open Source Project 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.jeffmony.async.http.cache; 18 | 19 | enum ResponseSource { 20 | 21 | /** 22 | * Return the response from the cache immediately. 23 | */ 24 | CACHE, 25 | 26 | /** 27 | * Make a conditional request to the host, returning the cache response if 28 | * the cache is valid and the network response otherwise. 29 | */ 30 | CONDITIONAL_CACHE, 31 | 32 | /** 33 | * Return the response from the network. 34 | */ 35 | NETWORK; 36 | 37 | public boolean requiresConnection() { 38 | return this == CONDITIONAL_CACHE || this == NETWORK; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/callback/HttpConnectCallback.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http.callback; 2 | 3 | import com.jeffmony.async.http.AsyncHttpResponse; 4 | 5 | public interface HttpConnectCallback { 6 | void onConnectCompleted(Exception ex, AsyncHttpResponse response); 7 | } 8 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/callback/RequestCallback.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http.callback; 2 | 3 | import com.jeffmony.async.callback.ResultCallback; 4 | import com.jeffmony.async.http.AsyncHttpResponse; 5 | 6 | public interface RequestCallback extends ResultCallback { 7 | void onConnect(AsyncHttpResponse response); 8 | void onProgress(AsyncHttpResponse response, long downloaded, long total); 9 | } 10 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/filter/ChunkedDataException.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http.filter; 2 | 3 | public class ChunkedDataException extends Exception { 4 | public ChunkedDataException(String message) { 5 | super(message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/filter/ChunkedOutputFilter.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http.filter; 2 | 3 | 4 | import com.jeffmony.async.ByteBufferList; 5 | import com.jeffmony.async.DataSink; 6 | import com.jeffmony.async.FilteredDataSink; 7 | 8 | import java.nio.ByteBuffer; 9 | 10 | public class ChunkedOutputFilter extends FilteredDataSink { 11 | public ChunkedOutputFilter(DataSink sink) { 12 | super(sink); 13 | } 14 | 15 | @Override 16 | public ByteBufferList filter(ByteBufferList bb) { 17 | String chunkLen = Integer.toString(bb.remaining(), 16) + "\r\n"; 18 | bb.addFirst(ByteBuffer.wrap(chunkLen.getBytes())); 19 | bb.add(ByteBuffer.wrap("\r\n".getBytes())); 20 | return bb; 21 | } 22 | 23 | @Override 24 | public void end() { 25 | setMaxBuffer(Integer.MAX_VALUE); 26 | ByteBufferList fin = new ByteBufferList(); 27 | write(fin); 28 | setMaxBuffer(0); 29 | // do NOT call through to super.end, as chunking is a framing protocol. 30 | // we don't want to close the underlying transport. 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/filter/DataRemainingException.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http.filter; 2 | 3 | public class DataRemainingException extends Exception { 4 | public DataRemainingException(String message, Exception cause) { 5 | super(message, cause); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/filter/PrematureDataEndException.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http.filter; 2 | 3 | public class PrematureDataEndException extends Exception { 4 | public PrematureDataEndException(String message) { 5 | super(message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/server/AsyncHttpRequestBodyProvider.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http.server; 2 | 3 | import com.jeffmony.async.http.Headers; 4 | import com.jeffmony.async.http.body.AsyncHttpRequestBody; 5 | 6 | public interface AsyncHttpRequestBodyProvider { 7 | AsyncHttpRequestBody getBody(Headers headers); 8 | } 9 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/server/AsyncHttpServerRequest.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http.server; 2 | 3 | import com.jeffmony.async.AsyncSocket; 4 | import com.jeffmony.async.DataEmitter; 5 | import com.jeffmony.async.http.Headers; 6 | import com.jeffmony.async.http.Multimap; 7 | import com.jeffmony.async.http.body.AsyncHttpRequestBody; 8 | 9 | import java.util.Map; 10 | import java.util.regex.Matcher; 11 | 12 | public interface AsyncHttpServerRequest extends DataEmitter { 13 | Headers getHeaders(); 14 | Matcher getMatcher(); 15 | void setMatcher(Matcher matcher); 16 | T getBody(); 17 | AsyncSocket getSocket(); 18 | String getPath(); 19 | Multimap getQuery(); 20 | String getMethod(); 21 | String getUrl(); 22 | 23 | String get(String name); 24 | Map getState(); 25 | } 26 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/server/HttpServerRequestCallback.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http.server; 2 | 3 | 4 | public interface HttpServerRequestCallback { 5 | void onRequest(AsyncHttpServerRequest request, AsyncHttpServerResponse response); 6 | } 7 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/server/MalformedRangeException.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http.server; 2 | 3 | public class MalformedRangeException extends Exception { 4 | } 5 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/server/MimeEncodingException.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http.server; 2 | 3 | public class MimeEncodingException extends Exception { 4 | public MimeEncodingException(String message) { 5 | super(message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/server/RouteMatcher.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http.server; 2 | 3 | public interface RouteMatcher { 4 | AsyncHttpServerRouter.RouteMatch route(String method, String path); 5 | } -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/http/server/StreamSkipException.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.http.server; 2 | 3 | public class StreamSkipException extends Exception { 4 | public StreamSkipException(String message) { 5 | super(message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/parser/AsyncParser.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.parser; 2 | 3 | import com.jeffmony.async.DataEmitter; 4 | import com.jeffmony.async.DataSink; 5 | import com.jeffmony.async.callback.CompletedCallback; 6 | import com.jeffmony.async.future.Future; 7 | 8 | import java.lang.reflect.Type; 9 | 10 | /** 11 | * Created by koush on 5/27/13. 12 | */ 13 | public interface AsyncParser { 14 | Future parse(DataEmitter emitter); 15 | void write(DataSink sink, T value, CompletedCallback completed); 16 | Type getType(); 17 | String getMime(); 18 | } 19 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/parser/DocumentParser.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.parser; 2 | 3 | import com.jeffmony.async.DataEmitter; 4 | import com.jeffmony.async.DataSink; 5 | import com.jeffmony.async.callback.CompletedCallback; 6 | import com.jeffmony.async.future.Future; 7 | import com.jeffmony.async.http.body.DocumentBody; 8 | import com.jeffmony.async.stream.ByteBufferListInputStream; 9 | 10 | import org.w3c.dom.Document; 11 | 12 | import java.lang.reflect.Type; 13 | 14 | import javax.xml.parsers.DocumentBuilderFactory; 15 | 16 | /** 17 | * Created by koush on 8/3/13. 18 | */ 19 | public class DocumentParser implements AsyncParser { 20 | @Override 21 | public Future parse(DataEmitter emitter) { 22 | return new ByteBufferListParser().parse(emitter) 23 | .thenConvert(from -> DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new ByteBufferListInputStream(from))); 24 | } 25 | 26 | @Override 27 | public void write(DataSink sink, Document value, CompletedCallback completed) { 28 | new DocumentBody(value).write(null, sink, completed); 29 | } 30 | 31 | @Override 32 | public Type getType() { 33 | return Document.class; 34 | } 35 | 36 | @Override 37 | public String getMime() { 38 | return "text/xml"; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/parser/JSONArrayParser.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.parser; 2 | 3 | import com.jeffmony.async.DataEmitter; 4 | import com.jeffmony.async.DataSink; 5 | import com.jeffmony.async.callback.CompletedCallback; 6 | import com.jeffmony.async.future.Future; 7 | 8 | import org.json.JSONArray; 9 | 10 | import java.lang.reflect.Type; 11 | 12 | /** 13 | * Created by koush on 5/27/13. 14 | */ 15 | public class JSONArrayParser implements AsyncParser { 16 | @Override 17 | public Future parse(DataEmitter emitter) { 18 | return new StringParser().parse(emitter) 19 | .thenConvert(JSONArray::new); 20 | } 21 | 22 | @Override 23 | public void write(DataSink sink, JSONArray value, CompletedCallback completed) { 24 | new StringParser().write(sink, value.toString(), completed); 25 | } 26 | 27 | @Override 28 | public Type getType() { 29 | return JSONArray.class; 30 | } 31 | 32 | @Override 33 | public String getMime() { 34 | return "application/json"; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/parser/JSONObjectParser.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.parser; 2 | 3 | import com.jeffmony.async.DataEmitter; 4 | import com.jeffmony.async.DataSink; 5 | import com.jeffmony.async.callback.CompletedCallback; 6 | import com.jeffmony.async.future.Future; 7 | 8 | import org.json.JSONObject; 9 | 10 | import java.lang.reflect.Type; 11 | 12 | /** 13 | * Created by koush on 5/27/13. 14 | */ 15 | public class JSONObjectParser implements AsyncParser { 16 | @Override 17 | public Future parse(DataEmitter emitter) { 18 | return new StringParser().parse(emitter).thenConvert(JSONObject::new); 19 | } 20 | 21 | @Override 22 | public void write(DataSink sink, JSONObject value, CompletedCallback completed) { 23 | new StringParser().write(sink, value.toString(), completed); 24 | } 25 | 26 | @Override 27 | public Type getType() { 28 | return JSONObject.class; 29 | } 30 | 31 | @Override 32 | public String getMime() { 33 | return "application/json"; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/stream/ByteBufferListInputStream.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.stream; 2 | 3 | import com.jeffmony.async.ByteBufferList; 4 | 5 | import java.io.IOException; 6 | import java.io.InputStream; 7 | 8 | /** 9 | * Created by koush on 6/1/13. 10 | */ 11 | public class ByteBufferListInputStream extends InputStream { 12 | ByteBufferList bb; 13 | public ByteBufferListInputStream(ByteBufferList bb) { 14 | this.bb = bb; 15 | } 16 | 17 | @Override 18 | public int read() throws IOException { 19 | if (bb.remaining() <= 0) 20 | return -1; 21 | return (int)bb.get() & 0x000000ff; 22 | } 23 | 24 | @Override 25 | public int read(byte[] buffer) throws IOException { 26 | return this.read(buffer, 0, buffer.length); 27 | } 28 | 29 | @Override 30 | public int read(byte[] buffer, int offset, int length) throws IOException { 31 | if (bb.remaining() <= 0) 32 | return -1; 33 | int toRead = Math.min(length, bb.remaining()); 34 | bb.get(buffer, offset, toRead); 35 | return toRead; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/stream/FileDataSink.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.stream; 2 | 3 | import com.jeffmony.async.AsyncServer; 4 | 5 | import java.io.File; 6 | import java.io.FileOutputStream; 7 | import java.io.IOException; 8 | import java.io.OutputStream; 9 | 10 | /** 11 | * Created by koush on 2/2/14. 12 | */ 13 | public class FileDataSink extends OutputStreamDataSink { 14 | File file; 15 | public FileDataSink(AsyncServer server, File file) { 16 | super(server); 17 | this.file = file; 18 | } 19 | 20 | @Override 21 | public OutputStream getOutputStream() throws IOException { 22 | OutputStream ret = super.getOutputStream(); 23 | if (ret == null) { 24 | file.getParentFile().mkdirs(); 25 | ret = new FileOutputStream(file); 26 | setOutputStream(ret); 27 | } 28 | return ret; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/util/Allocator.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.util; 2 | 3 | import com.jeffmony.async.ByteBufferList; 4 | 5 | import java.nio.ByteBuffer; 6 | 7 | /** 8 | * Created by koush on 6/28/14. 9 | */ 10 | public class Allocator { 11 | final int maxAlloc; 12 | int currentAlloc = 0; 13 | int minAlloc = 2 << 11; 14 | 15 | public Allocator(int maxAlloc) { 16 | this.maxAlloc = maxAlloc; 17 | } 18 | 19 | public Allocator() { 20 | maxAlloc = ByteBufferList.MAX_ITEM_SIZE; 21 | } 22 | 23 | public ByteBuffer allocate() { 24 | return allocate(currentAlloc); 25 | } 26 | 27 | public ByteBuffer allocate(int currentAlloc) { 28 | return ByteBufferList.obtain(Math.min(Math.max(currentAlloc, minAlloc), maxAlloc)); 29 | } 30 | 31 | public void track(long read) { 32 | currentAlloc = (int)read * 2; 33 | } 34 | 35 | public int getMaxAlloc() { 36 | return maxAlloc; 37 | } 38 | 39 | public void setCurrentAlloc(int currentAlloc) { 40 | this.currentAlloc = currentAlloc; 41 | } 42 | 43 | public int getMinAlloc() { 44 | return minAlloc; 45 | } 46 | 47 | public Allocator setMinAlloc(int minAlloc ) { 48 | this.minAlloc = Math.max(0, minAlloc); 49 | return this; 50 | } 51 | } 52 | 53 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/util/Charsets.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.util; 2 | 3 | import java.nio.charset.Charset; 4 | 5 | /** From java.nio.charset.Charsets */ 6 | public class Charsets { 7 | public static final Charset US_ASCII = Charset.forName("US-ASCII"); 8 | public static final Charset UTF_8 = Charset.forName("UTF-8"); 9 | public static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1"); 10 | } 11 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/util/FileUtility.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.util; 2 | 3 | import java.io.File; 4 | 5 | /** 6 | * Created by koush on 4/7/14. 7 | */ 8 | public class FileUtility { 9 | static public boolean deleteDirectory(File path) { 10 | if (path.exists()) { 11 | File[] files = path.listFiles(); 12 | if (files != null) { 13 | for (int i = 0; i < files.length; i++) { 14 | if (files[i].isDirectory()) { 15 | deleteDirectory(files[i]); 16 | } 17 | else { 18 | files[i].delete(); 19 | } 20 | } 21 | } 22 | } 23 | return (path.delete()); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/util/IdleTimeout.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.util; 2 | 3 | import android.os.Handler; 4 | 5 | import com.jeffmony.async.AsyncServer; 6 | 7 | public class IdleTimeout extends TimeoutBase { 8 | Runnable callback; 9 | 10 | public IdleTimeout(AsyncServer server, long delay) { 11 | super(server, delay); 12 | 13 | } 14 | 15 | public IdleTimeout(Handler handler, long delay) { 16 | super(handler, delay); 17 | } 18 | 19 | public void setTimeout(Runnable callback) { 20 | this.callback = callback; 21 | } 22 | 23 | Object cancellable; 24 | public void reset() { 25 | handlerish.removeAllCallbacks(cancellable); 26 | cancellable = handlerish.postDelayed(callback, delay); 27 | } 28 | 29 | public void cancel() { 30 | // must post this, so that when it runs it removes everything in the queue, 31 | // preventing any rescheduling. 32 | // posting gaurantees there is not a reschedule in progress. 33 | handlerish.post(() -> handlerish.removeAllCallbacks(cancellable)); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/util/TaggedList.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.util; 2 | 3 | import java.util.ArrayList; 4 | 5 | public class TaggedList extends ArrayList { 6 | private Object tag; 7 | 8 | public synchronized V tag() { 9 | return (V)tag; 10 | } 11 | 12 | public synchronized void tag(V tag) { 13 | this.tag = tag; 14 | } 15 | 16 | public synchronized void tagNull(V tag) { 17 | if (this.tag == null) 18 | this.tag = tag; 19 | } 20 | } -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/util/UntypedHashtable.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.util; 2 | 3 | import java.util.Hashtable; 4 | 5 | public class UntypedHashtable { 6 | private Hashtable hash = new Hashtable(); 7 | 8 | public void put(String key, Object value) { 9 | hash.put(key, value); 10 | } 11 | 12 | public void remove(String key) { 13 | hash.remove(key); 14 | } 15 | 16 | public T get(String key, T defaultValue) { 17 | T ret = get(key); 18 | if (ret == null) 19 | return defaultValue; 20 | return ret; 21 | } 22 | 23 | public T get(String key) { 24 | return (T)hash.get(key); 25 | } 26 | } -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/wrapper/AsyncSocketWrapper.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.wrapper; 2 | 3 | import com.jeffmony.async.AsyncSocket; 4 | 5 | public interface AsyncSocketWrapper extends AsyncSocket, DataEmitterWrapper { 6 | AsyncSocket getSocket(); 7 | } 8 | -------------------------------------------------------------------------------- /androidasync/src/main/java/com/jeffmony/async/wrapper/DataEmitterWrapper.java: -------------------------------------------------------------------------------- 1 | package com.jeffmony.async.wrapper; 2 | 3 | import com.jeffmony.async.DataEmitter; 4 | 5 | public interface DataEmitterWrapper extends DataEmitter { 6 | DataEmitter getDataEmitter(); 7 | } 8 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 29 5 | buildToolsVersion "29.0.2" 6 | 7 | defaultConfig { 8 | applicationId "com.android.media" 9 | minSdkVersion 19 10 | targetSdkVersion 29 11 | versionCode 1 12 | versionName "1.0" 13 | } 14 | 15 | compileOptions { 16 | sourceCompatibility JavaVersion.VERSION_1_8 17 | targetCompatibility JavaVersion.VERSION_1_8 18 | } 19 | 20 | buildTypes { 21 | release { 22 | minifyEnabled false 23 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 24 | } 25 | } 26 | } 27 | 28 | dependencies { 29 | implementation fileTree(dir: 'libs', include: ['*.jar']) 30 | implementation 'androidx.appcompat:appcompat:1.1.0-alpha03' 31 | implementation 'com.github.JeffMony:ORCodeDemo:v1.3.0' 32 | implementation 'com.google.zxing:core:3.3.3' 33 | 34 | implementation project(path: ':playersdk') 35 | implementation project(path: ':mediaproxy') 36 | implementation project(path: ':base') 37 | } 38 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/main/assets/list.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "Test url 1", 4 | "uri": "https://tv.youkutv.cc/2019/10/28/6MSVuLec4zbpYFlj/playlist.m3u8" 5 | }, 6 | { 7 | "name": "Test url 2", 8 | "uri": "https://kuku.zuida-youku.com/20170616/cBIBaYMJ/index.m3u8" 9 | }, 10 | { 11 | "name": "Test url 3", 12 | "uri": "https://tv.youkutv.cc/2020/01/15/SZpLQDUmJZKF9O0D/playlist.m3u8" 13 | }, 14 | { 15 | "name": "Test url 4", 16 | "uri": "https://tv.youkutv.cc/2020/01/15/3d97sO5xQUYB5bvY/playlist.m3u8" 17 | }, 18 | { 19 | "name": "Test url 5", 20 | "uri": "https://hls.aoxtv.com/v3.szjal.cn/20200122/TIj9Ekt9/index.m3u8" 21 | }, 22 | { 23 | "name": "Test url 6", 24 | "uri": "https://hls.aoxtv.com/v3.szjal.cn/20200114/dtOHlPFE/index.m3u8" 25 | }, 26 | { 27 | "name": "Test url 7", 28 | "uri": "https://hls.aoxtv.com/v3.szjal.cn/20200115/qNIba0qo/index.m3u8" 29 | }, 30 | { 31 | "name": "Test url 8", 32 | "uri": "https://m3u8.soyoung.com/9d0e36edc95edfa34fa049c3bfedf2e1_7d68ac41_new22.m3u8?sign=7f717d032fb7a53b4c628c22d7e9a206&t=5f0000fd" 33 | } 34 | ] -------------------------------------------------------------------------------- /app/src/main/java/com/android/media/DownloadOrcodeActivity.java: -------------------------------------------------------------------------------- 1 | package com.android.media; 2 | 3 | import android.os.Bundle; 4 | import android.view.View; 5 | import android.widget.Button; 6 | import android.widget.EditText; 7 | 8 | import androidx.annotation.Nullable; 9 | import androidx.appcompat.app.AppCompatActivity; 10 | 11 | public class DownloadOrcodeActivity extends AppCompatActivity implements View.OnClickListener { 12 | 13 | private EditText mDownloadUrlText; 14 | private Button mSingleDownloadBtn; 15 | private Button mOrcodeScannerBtn; 16 | 17 | @Override 18 | protected void onCreate(@Nullable Bundle savedInstanceState) { 19 | super.onCreate(savedInstanceState); 20 | setContentView(R.layout.activity_orcode); 21 | 22 | initViews(); 23 | } 24 | 25 | private void initViews() { 26 | mDownloadUrlText = (EditText) findViewById(R.id.download_url_text); 27 | mSingleDownloadBtn = (Button) findViewById(R.id.download_single_btn); 28 | mOrcodeScannerBtn = (Button) findViewById(R.id.orcode_scanner_btn); 29 | 30 | mSingleDownloadBtn.setOnClickListener(this); 31 | mOrcodeScannerBtn.setOnClickListener(this); 32 | } 33 | 34 | @Override 35 | public void onClick(View v) { 36 | if (v == mSingleDownloadBtn) { 37 | 38 | } else if (v == mOrcodeScannerBtn) { 39 | 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/com/android/media/MediaScannerActivity.java: -------------------------------------------------------------------------------- 1 | package com.android.media; 2 | 3 | import android.os.Bundle; 4 | 5 | import androidx.annotation.Nullable; 6 | import androidx.appcompat.app.AppCompatActivity; 7 | 8 | public class MediaScannerActivity extends AppCompatActivity { 9 | 10 | @Override 11 | protected void onCreate(@Nullable Bundle savedInstanceState) { 12 | super.onCreate(savedInstanceState); 13 | setContentView(R.layout.activity_scanner); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/android/media/MyApplication.java: -------------------------------------------------------------------------------- 1 | package com.android.media; 2 | 3 | import android.app.Application; 4 | 5 | import com.media.cache.DownloadConstants; 6 | import com.media.cache.LocalProxyConfig; 7 | import com.media.cache.VideoDownloadManager; 8 | import com.media.cache.utils.StorageUtils; 9 | 10 | import java.io.File; 11 | 12 | public class MyApplication extends Application { 13 | 14 | @Override 15 | public void onCreate() { 16 | super.onCreate(); 17 | File file = StorageUtils.getVideoCacheDir(this); 18 | if (!file.exists()) { 19 | file.mkdir(); 20 | } 21 | LocalProxyConfig config = new VideoDownloadManager.Build(this) 22 | .setCacheRoot(file) 23 | .setUrlRedirect(false) 24 | .setTimeOut(DownloadConstants.READ_TIMEOUT, 25 | DownloadConstants.CONN_TIMEOUT, 26 | DownloadConstants.SOCKET_TIMEOUT) 27 | .setConcurrentCount(DownloadConstants.CONCURRENT_COUNT) 28 | .setIgnoreAllCertErrors(true) 29 | .buildConfig(); 30 | VideoDownloadManager.getInstance().initConfig(config); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/border.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_orcode.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 15 | 16 |