Compare commits

...

431 Commits

Author SHA1 Message Date
Geoffrey Métais
008a2a28fd Update microcode 2020-01-27 16:36:32 +01:00
Geoffrey Métais
1b373fab27 Update NEWS 2020-01-27 16:36:20 +01:00
Nicolas Pomepuy
5d47b5007f Fix IllegalStateException in AudioPlayer 2020-01-27 16:31:25 +01:00
Nicolas Pomepuy
70567f48e1 Prevent a crash when thumbnail size is too large for widgets 2020-01-27 16:28:43 +01:00
Nicolas Pomepuy
ad33c52d4d Fix IndexOutOfBoundsException 2020-01-27 16:25:55 +01:00
Geoffrey Métais
b1d58b0ea4 MediaparsingService: Ensure app is foreground 2020-01-27 16:09:56 +01:00
Geoffrey Métais
f6cd2b8468 Bump version to 3.2.7 2020-01-24 14:01:03 +01:00
Geoffrey Métais
518eebcff0 Update NEWS 2020-01-24 14:00:33 +01:00
Geoffrey Métais
94daf7aa49 Bump libraries versions 2020-01-24 11:04:01 +01:00
Geoffrey Métais
d260007eb1 Update VLC HASH 2020-01-24 10:37:16 +01:00
Geoffrey Métais
932346e7fd Fix playback notification icon
video icon was incorrectly chosen because of MEDIA_FORCE_AUDIO flag

(cherry picked from commit 97462bd446)
2020-01-24 10:19:12 +01:00
Geoffrey Métais
024da2c682 MediaparsingService: Fix notification and wakelock
(cherry picked from commit a4e133f1f5)
2020-01-23 14:24:32 +01:00
Geoffrey Métais
bd0c9cacc7 Services: Stop with stopService()
Calling stopSelf() could cause the service to be destroyed before
calling setForeground() and lead to a RemoteException

(cherry picked from commit 6be3523bbb)
2020-01-23 14:17:55 +01:00
Geoffrey Métais
0351475a5d Video player: Correctly apply extra title
Fix #1156


(cherry picked from commit 84d7febc04)
2020-01-22 17:09:45 +01:00
Geoffrey Métais
48245fb006 TV: Fix subs picker focus
(cherry picked from commit 6625b1243a)
2020-01-13 15:54:42 +01:00
Kazuki Takise
a5b8465ea8 Support Picture-in-Picture on Chrome OS
enterPictureInPictureMode() must be called in onUserLeaveHint() to
support Picture-in-Picture in a multi-window environment such as
Chrome OS.

The current implemententation (calling the API in onPause()) causes
the following issues on Chrome OS:

- VLC enters PiP without being occluded, but just with another
  window activated. In a multi-window environment, we can't assume
  onPause() means the window gets hidden. As only one window can
  be resumed at the same time, it's possible that a window is
  fully visible, but paused.
- When some ChromeOS-specific system UI gets shown (e.g. Alt-Tab
  window cycler, Overview Mode), VLC enters PiP unexpectedly.

This patch moves switchToPopup() from onPause() to onUserLeaveHint()
to prevent those issues.

(cherry picked from commit f466ecb066)
2020-01-13 15:52:15 +01:00
Geoffrey Métais
4598db40d7 Play queue: Prevent ANR
canSwitchToVideo() calls getVideoTracksCount() which can block main
thread.

(cherry picked from commit 95c9aa0ae9)
2019-12-27 11:20:17 +01:00
Geoffrey Métais
1ee118fa48 Fix video as audio playback resume
Fix #1086


(cherry picked from commit ce2abf0aa2)
2019-12-27 09:55:36 +01:00
Geoffrey Métais
5416fd9d26 PiP: catch IllegalArgumentException
Could happen if asptect ratio is extreme.


(cherry picked from commit ca418f49eb)
2019-12-24 12:11:42 +01:00
Geoffrey Métais
8df83e4713 Bump version to 3.2.6 2019-12-23 09:23:46 +01:00
Geoffrey Métais
4dd44324b9 Update NEWS 2019-12-23 09:22:59 +01:00
Geoffrey Métais
6366db2a3c MediaParsing: Fix channel closed too early
(cherry picked from commit 93e1983d54)
2019-12-23 09:16:45 +01:00
Geoffrey Métais
3d4cb224cc PiP: Update AR on video change
Fix #1138


(cherry picked from commit 5cd908b7b1)
2019-12-20 16:55:50 +01:00
Geoffrey Métais
ca0d82ffcc Video player: prevent IO from main thread
(cherry picked from commit 282030aef5c238a9260bcf77ead32c99675a81ca)
2019-12-20 16:42:51 +01:00
Geoffrey Métais
a13d74d9f5 Debug activity: prevent illegal access
(cherry picked from commit 65542175446f124d86cb0e540323707541dd79c6)
2019-12-20 16:30:33 +01:00
Geoffrey Métais
f50dbb3ece Bump version to 3.2.5 2019-12-19 15:18:56 +01:00
Geoffrey Métais
198915ab2a Update NEWS 2019-12-19 15:18:31 +01:00
Geoffrey Métais
72f52308a5 Storages: Prevent IO from main thread
(cherry picked from commit 704de5939e)
2019-12-19 14:58:40 +01:00
Nicolas Pomepuy
7b684102d8 Fix 'clear media db' wording and improve dialog text
Fixes #1128

(cherry picked from commit 8ceeee5e2f)
2019-12-19 14:08:03 +01:00
Nicolas Pomepuy
e086c43f4e Fix video group thumbnail not loading
Fixes #1134


(cherry picked from commit ea2b127eeb)
2019-12-19 13:32:20 +01:00
Nicolas Pomepuy
a3e6694d62 Equalizer: use the dialog context so the save button always works
Fixes #1131


(cherry picked from commit 845b917b4d)
2019-12-19 13:02:15 +01:00
Geoffrey Métais
0f46c2ee97 Medialibrary: Avoid double init
(cherry picked from commit b1c99f29a3)
2019-12-19 09:17:41 +01:00
Geoffrey Métais
9f01f3b5ae Playbackservice: activate external devices
Fix #1129
2019-12-18 14:43:09 +01:00
Nicolas Pomepuy
3997671b20 Equalizer: delay setting band listener to avoid IndexOutOfBoundsException
(cherry picked from commit 32b5077baf)
2019-12-18 10:14:40 +01:00
Geoffrey Métais
81672afdff Bump version to 3.2.4 2019-12-17 14:21:49 +01:00
Geoffrey Métais
27c2b4872b Update NEWS 2019-12-17 14:21:49 +01:00
Geoffrey Métais
3d82f5e8fc Streams: Open RTSP streams with video player
Avoid a race condition where media is closed because we get the video
track too soon


(cherry picked from commit 9f54986132)
2019-12-17 12:09:48 +01:00
Geoffrey Métais
61cc782f11 TV: Do not show protocol in files browser
(cherry picked from commit f342c179cf)
2019-12-17 10:36:07 +01:00
Nicolas Pomepuy
33bc61dbeb Fix double tap timing issue
Fixes #1118


(cherry picked from commit a3d7b4f201)
2019-12-16 14:49:42 +01:00
Geoffrey Métais
1a95661ae3 Upgrade AGP to v3.2.3
(cherry picked from commit f271849766)
2019-12-16 10:15:28 +01:00
Nicolas Pomepuy
cb06aa9ae3 Fix video count on TV main activity
(cherry picked from commit 3a72724795)
2019-12-16 10:14:36 +01:00
Geoffrey Métais
b5fffa3b28 TV: Remove lists refresh glitches 2019-12-16 10:08:44 +01:00
Geoffrey Métais
588b2f1dcc TV,ChromeOS: Fix subs dl focus for DPAD navigation
(cherry picked from commit 0a423b5574)
2019-12-12 15:38:58 +01:00
Nicolas Pomepuy
3129a708bd Fix cover and default cover size when switching between lists and grids
(cherry picked from commit 09b1c510a2)
2019-12-12 15:33:19 +01:00
Nicolas Pomepuy
f986995b10 Allow displaying the playlists in list mode
Fixes #1122


(cherry picked from commit 4703fa1244)
2019-12-12 15:06:50 +01:00
Geoffrey Métais
0256f033e3 Browser: Always restore selection helper
(cherry picked from commit d4cb648e5e)
2019-12-11 15:42:37 +01:00
Nicolas Pomepuy
bb8e00deab Use media ctx for groups with only one video 2019-12-11 13:42:57 +01:00
Geoffrey Métais
ed71b6ccb1 Fix TypeCastException
(cherry picked from commit d287402952)
2019-12-10 12:16:58 +01:00
Nicolas Pomepuy
a988f61f49 Fix TypecastException
(cherry picked from commit 0376ea6912)
2019-12-10 11:55:24 +01:00
Nicolas Pomepuy
3af1841e3c Fix themes
(Partial cherry pick from commit 12467f8e)
2019-12-10 10:21:19 +01:00
Geoffrey Métais
128989413f Browser: Lift flow channel buffer limitation
Fix #1117

(cherry picked from commit d5392279b2)
2019-12-10 10:09:56 +01:00
Geoffrey Métais
0c59fb366c Fix some video player shortcuts
(cherry picked from commit bed8c8f593)
2019-12-10 07:53:32 +01:00
Nicolas Pomepuy
dec68c0d7f Avoid drawing a header at position 0 if no header exists
(cherry picked from commit 232a703b1c)
2019-12-10 07:53:32 +01:00
Nicolas Pomepuy
82ce982fa9 Fix album view thumbnail size
Fixes #828

(cherry picked from commit 9b93cca380)
2019-12-10 07:53:28 +01:00
Geoffrey Métais
66c5b0aa76 Playback: Preserve 'play as audio' state
Fix #1101


(cherry picked from commit ba9bb273ba2deab57adf9338149336b30fe6a806)
2019-12-06 06:59:38 +01:00
Geoffrey Métais
85ebd5c69b Playback: Allow video->audio transition if paused
Fix #1110


(cherry picked from commit 6e81a5a655)
2019-12-04 14:29:20 +01:00
Geoffrey Métais
8236871b51 Video player: Fix PiP aspect ratio
Fix #1105

(cherry picked from commit 2d1c3754c4)
2019-12-04 13:41:59 +01:00
Geoffrey Métais
b97f6d9876 TV: Improve background switching
(cherry picked from commit 7c6f0643e5)
2019-12-03 11:25:56 +01:00
Geoffrey Métais
78c4f498ef Video player: Enforce black background
Some shitty ROM change android.R.color.black to brown.

(cherry picked from commit ee227373ec)
2019-12-03 11:20:07 +01:00
Nicolas Pomepuy
cbd3227095 Fix FadableImageView state reset
(cherry picked from commit 51c645cc43)
2019-12-02 15:41:48 +01:00
Geoffrey Métais
eaf34547f1 Bumb version to 3.2.2 2019-11-27 15:25:28 +01:00
Geoffrey Métais
cde791b379 Update NEWS 2019-11-27 15:25:28 +01:00
Geoffrey Métais
17800d21a4 Upgrade LibVLC & Medialibrary 2019-11-27 11:49:25 +01:00
Thomas Guillem
83ab057311 build: add bluray support
(cherry picked from commit 077495211fb3ccfe1c34e4253b93e518da23ca53)
2019-11-27 11:38:18 +01:00
Nicolas Pomepuy
3057d48fa1 Fix image scale issue in video player playlist
Fixes #1095

(cherry picked from commit 2b9990d9f0)
2019-11-27 11:29:43 +01:00
Geoffrey Métais
994d698983 Update SDK licenses
(cherry picked from commit 685620ecc5)
2019-11-27 11:19:11 +01:00
Geoffrey Métais
4656310d75 Video player: catch IllegalArgumentException
setRequestedOrientation() can cause this exception on Android 10
2019-11-26 10:16:19 +01:00
Geoffrey Métais
a40f71af08 Fix imports and string format 2019-11-25 15:44:16 +01:00
Geoffrey Métais
a9bbfbdaae Workaround for IllegalStateException on Pie
Android 9 has a bug, sometimes, service cannot be started as soon as app
is:
https://issuetracker.google.com/issues/113122354

This fix creates a suspend function which will wait for the app to go
foreground, and use it to launch the service only when we can

(cherry picked from commit 3d7f70e694)
2019-11-25 13:13:59 +01:00
Geoffrey Métais
80ea0147a9 FastScroller: performance improvement
(cherry picked from commit 9445e1ecb2)
2019-11-25 11:50:07 +01:00
Geoffrey Métais
973f2537e6 Remove dead manifest entry
(cherry picked from commit 912af53242)
2019-11-22 18:32:09 +01:00
Geoffrey Métais
490951638d Streams: Fix audio tabs showing
Fix #1088

(cherry picked from commit 38c69b8013)
2019-11-22 09:03:26 +01:00
Geoffrey Métais
3d21f01b89 Fix playlist tracks number display
Use correct format and prevent I/O from main thread


(cherry picked from commit 98d797a28f)
2019-11-20 10:56:57 +01:00
Geoffrey Métais
55dee0beda Bump version to 3.2.2 2019-11-18 16:52:52 +01:00
Geoffrey Métais
e9126b85b5 Update LibVLC and Medialibrary
(cherry picked from commit 6bc23f93c05386379825ff65bd8ca6ca9c4c3324)
2019-11-18 13:26:00 +01:00
Nicolas Pomepuy
50ed6077ab Fix grid/list switch in VideoGridFragment 2019-11-18 12:36:20 +01:00
Geoffrey Métais
645789eab4 Settings: clear medialibrary
(cherry picked from commit 698def5a60)
2019-11-15 17:50:46 +01:00
Geoffrey Métais
5f45629892 Medialibrary: publish clearDatabase method
(cherry picked from commit f7e12af9ae)
2019-11-15 16:22:32 +01:00
Geoffrey Métais
42bf3aafe6 Disable crash reporter by default
(cherry picked from commit 1c7807c3d6)
2019-11-15 09:52:00 +01:00
Geoffrey Métais
fb105f84ac Video player: Fix subs picker for content:// uris
Fix #1087
(cherry picked from commit a37a2740a0)
2019-11-13 17:16:35 +01:00
Geoffrey Métais
d9d349a755 Audio browser: Fix IndexOutOfBoundsException
(cherry picked from commit a7afe6c673)
2019-11-13 10:29:04 +01:00
Geoffrey Métais
e077e79212 Equalizer: Prevent NPE
(cherry picked from commit b504377e74)
2019-11-13 10:29:04 +01:00
Geoffrey Métais
61a18a93c7 FileUtils: catch IllegalStateException
(cherry picked from commit 6dcdf7170f)
2019-11-13 10:29:04 +01:00
Geoffrey Métais
1842d8e0d1 Upgrade AGP to v3.5.2
(cherry picked from commit 53532e8927)
2019-11-07 17:59:30 +01:00
Geoffrey Métais
b0a46b257e TV: Fix protocole displayed in favorites folders
(cherry picked from commit e28a802a59)
2019-11-04 17:36:00 +01:00
Geoffrey Métais
3c4adb040a Bump version to 3.2.1 2019-10-31 11:32:28 +01:00
Nicolas Pomepuy
20b577d599 Fix UninitializedPropertyAccessException 2019-10-31 11:26:34 +01:00
Geoffrey Métais
3cc72e28b7 Update libraries 2019-10-30 16:10:07 +01:00
Geoffrey Métais
b8a16d6a64 Bump version to 3.2.0 2019-10-30 16:04:26 +01:00
Duncan McNamara
a04099c5fc Benchmark: store stacktrace when freeze/crash
To help find the cause of crashes and freeze
when running the benchmark, stacktraces will be stored
by vlc-android and consummed by vlcbenchmark whenever
these happen.

(cherry picked from commit 1d1fcbd7e8)
2019-10-30 16:03:15 +01:00
Geoffrey Métais
ec2ce87150 Cancel folders adapter scope on destroy 2019-10-30 16:03:15 +01:00
Geoffrey Métais
e0c9a1c08b Medialibrary: Use 0.6.x branch 2019-10-30 16:03:15 +01:00
Geoffrey Métais
a53314f785 Browser: Cancel adapter scope on destroy
(cherry picked from commit 3697cede4c)
2019-10-30 15:24:49 +01:00
Geoffrey Métais
43c7d93f17 Adapters: abort binding when job is cancelled
(cherry picked from commit 4b8ff286fd)
2019-10-30 11:29:23 +01:00
Geoffrey Métais
3fa28153b4 Set priority to SMBv1
(cherry picked from commit c4d3707b96)
2019-10-29 15:24:23 +01:00
Geoffrey Métais
f07cca264a Provider security fix
(cherry picked from commit 34fcf1bebe)
2019-10-29 15:23:21 +01:00
Geoffrey Métais
902467eed4 LibVLC: Sanity check
(cherry picked from commit c1434fe37c)
2019-10-21 14:01:07 +02:00
Geoffrey Métais
545f1d29c1 Bump version to 3.2.0 beta 7 2019-10-18 11:58:58 +02:00
Hugo Beauzée-Luyssen
e5da5c009a AndroidMediaLibrary: Implement onRescanStarted
(cherry picked from commit 9c88015ae7)
2019-10-18 11:52:47 +02:00
Geoffrey Métais
9706675809 Bump libraries version
(cherry picked from commit 6e14e2856dd097167a36fa1499bd04a63abcd22d)
2019-10-18 11:46:07 +02:00
Geoffrey Métais
b54049f07a Update Medialibrary HASH
(cherry picked from commit 0e0ccace9f7ce94d85361c7847b58d9992449e01)
2019-10-18 11:45:21 +02:00
Thomas Guillem
150586d763 libvlc: use smb2 from VLC 3.0
The smb2 module has been backported into VLC 3.0 but disabled by default.

(cherry picked from commit 83f6d7f126)
2019-10-18 11:44:04 +02:00
Geoffrey Métais
809a3f3b47 Update NEWS 2019-10-18 11:13:11 +02:00
Geoffrey Métais
9dcc353d20 Improve ML exception handler
- Throw an esception in debug build
- Add a log line to help debugging
- Move it to the companion object for safety

(cherry picked from commit 5fb016eab9)
2019-10-17 17:01:00 +02:00
Geoffrey Métais
fa8a38f9fe Folders: Prevent IllegalArgumentException
Coroutines dispatching could cause desync operations
2019-10-17 14:48:14 +02:00
Geoffrey Métais
b262da32d9 Storages adapter: prevent desync
coroutines dispatching could cause race conditions

(cherry picked from commit 3acf91bed6)
2019-10-17 14:41:55 +02:00
Geoffrey Métais
d40c0c89c1 Marquee helper: Remove unnecessary handler post
(cherry picked from commit a62a5144b2)
2019-10-17 14:21:34 +02:00
Geoffrey Métais
90ad3e69af Ensure mediasession and notif channels are ready
(cherry picked from commit b2d59fbfe3)
2019-10-17 12:08:48 +02:00
Geoffrey Métais
df8d6fb645 BottomSheet: catch IndexOutOfBoundsException
(cherry picked from commit 3c361a4e3e)
2019-10-17 12:08:48 +02:00
Geoffrey Métais
e3c91b75f2 Video player: prevent IllegalArgumentException
(cherry picked from commit 6c4c0dc5fc)
2019-10-17 12:08:48 +02:00
Geoffrey Métais
7658431556 Player controller: avoid IllegalStateException
(cherry picked from commit 9aecf984df)
2019-10-17 12:08:48 +02:00
Nicolas Pomepuy
85f4ea377c Force Activity restart when changing medialib folders from empty view
Fixes #1051

(cherry picked from commit 5983d0ada3)
2019-10-17 12:08:43 +02:00
Nicolas Pomepuy
f322bb6f00 Fix IllegalArgumentException
(cherry picked from commit 53e0e04b40)
2019-10-17 12:07:58 +02:00
Geoffrey Métais
5437847430 Browser: prevent IllegalStateException
(cherry picked from commit c414eb1e42)
2019-10-15 10:56:06 +02:00
Geoffrey Métais
dfff5c7658 Medialibrary: Update API
(cherry picked from commit eec68abbab)
2019-10-14 15:08:59 +02:00
Geoffrey Métais
70e7411217 Ensure Medialibrary is started only once
(cherry picked from commit 154f0c66a3)
2019-10-10 14:22:31 +02:00
Geoffrey Métais
4a7c26f78e Update NEWS 2019-10-09 17:06:53 +02:00
Geoffrey Métais
f242b23e0d Bump medialibrary version 2019-10-09 17:06:53 +02:00
Geoffrey Métais
5f5f69ae3b Bump LibVLC to EAP12 2019-10-09 11:59:24 +02:00
Geoffrey Métais
c2b11fea0c Bump version to Beta 6 2019-10-09 11:59:08 +02:00
Geoffrey Métais
fede2baadb SendCrashActivity: Prevent NPE
(cherry picked from commit 57db5b9849)
2019-10-09 11:55:02 +02:00
Michał Trzebiatowski
84c06c8a1c l10n: German update
100% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit a2972dae49)
2019-10-04 16:24:01 +02:00
Geoffrey Métais
11821b61a7 Medialibrary: Match new API
(cherry picked from commit 6d98b70258)
2019-10-04 16:13:55 +02:00
Geoffrey Métais
0161ad25c1 Videos: get all acordingly to current sorting
(cherry picked from commit a154989950)
2019-10-04 16:07:36 +02:00
Geoffrey Métais
145f7d59f5 Explicit video grouping deactivation
(cherry picked from commit 1b35e895da)
2019-10-04 16:07:36 +02:00
Geoffrey Métais
0f1014fb4e PLaylistActivity: remove IO from main thread
(cherry picked from commit 312932f02d)
2019-10-04 16:06:43 +02:00
Geoffrey Métais
99cc39384c Send crash report with DB and errMsg
(cherry picked from commit 72839bc766)
2019-10-04 16:06:21 +02:00
Geoffrey Métais
317dfd7a79 Get ML exception
(cherry picked from commit 08b1903739)
2019-10-04 16:06:21 +02:00
Geoffrey Métais
e366a13438 Medialibrary: Implement exception handler
(cherry picked from commit fd78602bbe)
2019-10-04 16:06:21 +02:00
Geoffrey Métais
fb17941e66 Upgrade AGP
(cherry picked from commit 0061e10e5f)
2019-10-04 16:05:59 +02:00
Geoffrey Métais
c3ad850843 TV: Fix resource reference for empty view
(cherry picked from commit 01effa552a)
2019-10-04 16:05:59 +02:00
Geoffrey Métais
ff253ddf11 Video groups: directly play media for singletons 2019-10-03 14:20:46 +02:00
Geoffrey Métais
67c8079bd7 FileUtils: Sanity checks
(cherry picked from commit 244bc7e2cd)
2019-10-01 14:39:10 +02:00
Geoffrey Métais
1efdd35671 Sanity check on action menu events
(cherry picked from commit f2e3f20f0a)
2019-10-01 14:37:29 +02:00
Geoffrey Métais
47eede33e3 JNI Fix potential memory leaks
(cherry picked from commit 7708dc65e9)
2019-10-01 14:37:29 +02:00
Nicolas Pomepuy
dfa0b7a941 Change the way we start the DebugLogService
(cherry picked from commit 9719ce8759)
2019-10-01 14:37:29 +02:00
Geoffrey Métais
f8bbdf3283 ExternalMonitor: catch IllegalArgumentException
Sometimes, broadcast listener registering is saved but not valid

(cherry picked from commit 993287262e)
2019-10-01 14:37:29 +02:00
Geoffrey Métais
78660e743a About: remove FAB
(cherry picked from commit 23e8b21c13)
2019-10-01 14:37:29 +02:00
Geoffrey Métais
215847a48e Fix about view not scrollable
Fix #1049

(cherry picked from commit 0bbe0ec5f1)
2019-10-01 14:37:29 +02:00
Geoffrey Métais
c10bde9fb7 Clear handler when marqee is activated
(cherry picked from commit 61af2af2a0)
2019-10-01 14:37:29 +02:00
Geoffrey Métais
abc36b6d76 Videos: use proper menu update function
(cherry picked from commit 513de0b312)
2019-10-01 14:37:29 +02:00
Geoffrey Métais
5c7e91106f Fix filename not shown in videos
(cherry picked from commit 969f4cfc6f)
2019-10-01 14:37:29 +02:00
Geoffrey Métais
aebfe400be Videos fragment: prevent IllegalStateException
(cherry picked from commit 1da1a94be2)
2019-10-01 14:37:29 +02:00
Nicolas Pomepuy
a7b4c52e85 Avoid showing grouping options on non root grid
(cherry picked from commit 4c5913be03)
2019-10-01 14:37:23 +02:00
Nicolas Pomepuy
6d355119f1 Fix UninitializedPropertyAccessException
(cherry picked from commit 124c4fd00b)
2019-10-01 14:36:40 +02:00
Nicolas Pomepuy
e1ca2a86f0 Fix Resources NotFoundException
(cherry picked from commit 44a5ca8158)
2019-10-01 14:36:40 +02:00
Nicolas Pomepuy
47b9b70733 Fix NumberFormatException
(cherry picked from commit c0b78834b7)
2019-10-01 14:36:40 +02:00
Geoffrey Métais
093d9b6f8a App start: catch SecurityException
(cherry picked from commit d180d7482c)
2019-10-01 14:36:40 +02:00
Geoffrey Métais
ca8cc43a7a Video groups: set default icon on view recycling
(cherry picked from commit 42082e7b2e)
2019-09-25 16:26:08 +02:00
Duncan McNamara
339cd0e0d1 Benchmark: raise screenshot display delay
Waiting for improvements in vlc 4.0, this is a temporary fix to leave
enough time for vlc to get the image after seek. This will not work all
the time but overall improves screenshot accuracy.

(cherry picked from commit 72dfb78029)
2019-09-25 16:24:50 +02:00
Geoffrey Métais
f525858652 Browser: clear listener in background
(cherry picked from commit 6781cb34fd)
2019-09-25 16:24:50 +02:00
Nicolas Pomepuy
100a3b55ec Add empty views to Folders and Video groups
(cherry picked from commit dc32f80d70)
2019-09-25 16:24:50 +02:00
Nicolas Pomepuy
d8616f57bc Hide protocol when not on root level on TV
(cherry picked from commit e45bdc0166)
2019-09-25 16:24:50 +02:00
Nicolas Pomepuy
66f5f8e388 Fix crash when changing video display in SecondaryActivity
(cherry picked from commit 11fd6f1022)
2019-09-25 16:24:47 +02:00
Geoffrey Métais
7debef054b Gradle: Increase heapSize, 2G are not enough
(cherry picked from commit 221e235eb1)
2019-09-24 18:01:36 +02:00
Geoffrey Métais
ed88026130 Shortcuts: fix resIds for release
(cherry picked from commit ed43aeb40b)
2019-09-24 18:01:36 +02:00
Nicolas Pomepuy
24a1d496ac Copy URL: add a visual feedback and a proper icon
(cherry picked from commit 592e56b856)
2019-09-24 17:03:12 +02:00
Geoffrey Métais
47a059389e Streams: copy mrl to clipboard ctx option
(cherry picked from commit 3ee34559ed)
2019-09-24 17:03:12 +02:00
Geoffrey Métais
cef5622af1 Update NEWS 2019-09-24 16:51:03 +02:00
Geoffrey Métais
0cb645dce3 Navigator: Fix default video grouping value
(cherry picked from commit be9e2e5c4d)
2019-09-24 16:43:44 +02:00
Nicolas Pomepuy
f093c56e0a Info activity: manage not scanned / no length medias
Fixes #1032

(cherry picked from commit 79a6253338)
2019-09-24 15:57:00 +02:00
Nicolas Pomepuy
79bce0fb15 Use a more readable duration format in InfoActivity
Refs #1032

(cherry picked from commit 79cae09590)
2019-09-24 15:56:59 +02:00
Nicolas Pomepuy
413ffaa62b Remove breadcrumb last decoration
Refs #1032

(cherry picked from commit 52cb2ee460)
2019-09-24 15:56:59 +02:00
Nicolas Pomepuy
9bdb7fb6d3 Allow opening media info from audio player
Refs #1032

(cherry picked from commit 88a555463b)
2019-09-24 15:56:59 +02:00
Geoffrey Métais
dde6270a98 Bump version & Upgrade libraries 2019-09-24 14:56:45 +02:00
Nicolas Pomepuy
e89eae0063 Header for multi disc in Album view
Fixes #1025

(cherry picked from commit 367b428bab)
2019-09-24 14:50:46 +02:00
Nicolas Pomepuy
041bf19c19 Add a setting to set the video grouping prefix length
(cherry picked from commit 16db3dfa6b)
2019-09-24 14:45:50 +02:00
Geoffrey Métais
d002070541 Video groups UI
(cherry picked from commit 01b5b08f9d)
2019-09-24 14:45:50 +02:00
Geoffrey Métais
0e4acdf728 Medialibrary: Implement videogroups API
(cherry picked from commit ceebb04d43)
2019-09-24 14:45:49 +02:00
Geoffrey Métais
a8d18d5cb8 Medialibrary: Match API update
(cherry picked from commit 4b0d01904f)
2019-09-24 14:45:49 +02:00
Geoffrey Métais
439f785b80 Equalizer: Ensure LibVLC is loaded
(cherry picked from commit 2796997019)
2019-09-24 14:45:49 +02:00
Geoffrey Métais
2cb26cab94 TV Browser: sanity check
(cherry picked from commit eea7551c58)
2019-09-24 14:45:49 +02:00
Андрій Бандура
7ccff62df1 l10n: Ukrainian update
100% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit f99401631d)
2019-09-24 14:45:49 +02:00
Sidney Doria
ae6b2c9b76 l10n: Portuguese (Brazil) update
100% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 511377ee77)
2019-09-24 14:45:49 +02:00
Michał Trzebiatowski
6e992e20dc l10n: Polish update
100% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit f18cce5592)
2019-09-24 14:45:49 +02:00
Michał Trzebiatowski
34c70eb6ba l10n: German update
100% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit f2f7e42661)
2019-09-24 14:45:49 +02:00
Geoffrey Métais
da54d1a42b Add sort by release year for tracks
(cherry picked from commit 256e9cde0a)
2019-09-24 14:45:49 +02:00
Geoffrey Métais
567cd572df Medialibrary: add tracks release year
(cherry picked from commit 229d92fe69)
2019-09-24 14:45:49 +02:00
Thomas Guillem
a59303ea3c libvlc: fix smb2/dsm conflicts
The smb2 module is back to higher priority again. A lot of bugs has been fixed
since the first release, notably the signing security mode. This fixes
impossible login to smb2 servers, when dsm requested first a login and smb2 was
never tried.

There is also a new patch that prevent to request 2 dialogs from both smb2 and
dsm from the same input. If smb2 login failed, it is useless to request
credentials via the dsm plugin.

PS: if the module smb2 failed because it tried to connect to a smb1 server, it
will fail without requesting any credentials, therefore the dsm module will be
able to request them.

(cherry picked from commit 4d58915611)
2019-09-23 17:22:41 +02:00
Geoffrey Métais
495ce5d906 PlaylistManager: code factorization
(cherry picked from commit 55f39cb357)
2019-09-23 17:22:41 +02:00
Nicolas Pomepuy
db30a301c5 Fix video player playlist drag and drop regression
Fixes #1045

(cherry picked from commit 45eac0ba33)
2019-09-23 17:02:49 +02:00
Geoffrey Métais
12b49ba09d ModelsHelper: cosmetic changes
(cherry picked from commit 4944e7e133)
2019-09-23 17:01:37 +02:00
Geoffrey Métais
f78f26a84b Rename Sorting interface to SortModule
(cherry picked from commit 0468fea116)
2019-09-23 17:01:37 +02:00
Geoffrey Métais
cfa8dfada1 Medialibrary: Nullity check for search results
(cherry picked from commit 3a1b9e1a44)
2019-09-23 17:01:37 +02:00
Nicolas Pomepuy
ef66bc0f6f Improve empty view design
(cherry picked from commit 19da32d8c2)
2019-09-23 17:01:37 +02:00
Nicolas Pomepuy
43ed9b2517 TV file browser empty view
(cherry picked from commit 4b24528fb1)
2019-09-23 17:01:37 +02:00
Geoffrey Métais
a170070d71 Network browser: ViewModel observes network status
(cherry picked from commit 0b1e6cddcd)
2019-09-23 17:01:37 +02:00
Geoffrey Métais
a0fa873022 TV Browser: Hide favorite button on root level
(cherry picked from commit d730a916a7)
2019-09-23 17:01:37 +02:00
Geoffrey Métais
94f8d86554 Network browsing: stop discovery on UI STOP state
(cherry picked from commit 9c0b938907)
2019-09-23 17:01:37 +02:00
Geoffrey Métais
9e2b2361a4 Browser: Don't show loading at root level
(cherry picked from commit 175c098d7b)
2019-09-23 17:01:37 +02:00
Geoffrey Métais
11f0da629d Browser: change listener in IO threadpool
Avoid ANRs

(cherry picked from commit e2252491bd)
2019-09-23 17:01:37 +02:00
Nicolas Pomepuy
d78e5a0c5f Move video group setting to main UI
Fixes #1029

(cherry picked from commit 0b3468ba5d)
2019-09-23 17:01:37 +02:00
Nicolas Pomepuy
812a197442 Fix sending db in crash sender
(cherry picked from commit 77299ec162)
2019-09-23 17:01:37 +02:00
Nicolas Pomepuy
94c720fc0b Fix resume playback icon in launcher shortcuts
(cherry picked from commit fdc3db0d21)
2019-09-23 17:01:37 +02:00
Nicolas Pomepuy
313c78bc61 Fix wrong string ids
Fixes #1008

(cherry picked from commit dd0c4d9698)
2019-09-23 17:01:37 +02:00
Geoffrey Métais
4d276e7eac TV: Fix NPE for network browsing
(cherry picked from commit 5e6557c578)
2019-09-23 17:01:37 +02:00
Nicolas Pomepuy
7d4d7004a8 Fix audio lists position restoration
Fixes #1027

(cherry picked from commit fd22be91c5)
2019-09-23 17:01:37 +02:00
Nicolas Pomepuy
6e6560e943 Fix vlc string under dialogs
(cherry picked from commit aced1c359b)
2019-09-23 17:01:37 +02:00
Geoffrey Métais
2d581275b3 Video player: Do not use raw coordinates
Fixes behavior on DeX mode

(cherry picked from commit 0b81f09d0c)
2019-09-23 17:01:37 +02:00
Geoffrey Métais
e2e6d2825f Network login: fix cancel event
(cherry picked from commit 8320cad2d5)
2019-09-23 17:01:37 +02:00
Geoffrey Métais
95b675e4f0 ImageLoader: remove IO ops from main thread
(cherry picked from commit c587680315)
2019-09-23 17:01:37 +02:00
Geoffrey Métais
9a1d89322d Headers: Fix nullity check
(cherry picked from commit 3284ae7a95)
2019-09-23 17:01:37 +02:00
Geoffrey Métais
b1b71a7783 Code cleaning and safety checks
(cherry picked from commit 6bc276383cd1d63ac664ed7d03cd93397ddb50e5)
(cherry picked from commit 3b478388cf)
2019-09-23 17:01:37 +02:00
Geoffrey Métais
d4864c5d1d MediaListActivity: Fix OutOfBoundsException
(cherry picked from commit a1ecc68ddfbf1a0fefc6122c114c4d9c5f8f6e0d)
(cherry picked from commit 633fcbc8e6)
2019-09-23 17:01:37 +02:00
Geoffrey Métais
ae93c7bd6b Audioplayer: sanity check for context actions
(cherry picked from commit 695a96e25a)
2019-09-23 17:01:37 +02:00
Nicolas Pomepuy
7cafb7bebd Code cleanup
(cherry picked from commit f948bdea10)
2019-09-23 17:01:37 +02:00
Nicolas Pomepuy
da04035b51 Fix TypeCastException
(cherry picked from commit 78efb6e13a)
2019-09-23 17:01:37 +02:00
Nicolas Pomepuy
d1db74422b Fix NullPointerException
(cherry picked from commit 128e763a71)
2019-09-23 17:01:37 +02:00
Nicolas Pomepuy
70ae39663c Fix CalledFromWrongThreadException
(cherry picked from commit 25f8fb78d0)
2019-09-23 17:01:37 +02:00
Nicolas Pomepuy
d8769c7809 Fix IllegalArgumentException
(cherry picked from commit c92b6c5bd9)
2019-09-23 17:01:37 +02:00
Geoffrey Métais
a46b591a00 Browser: use Flow API to fetch files
(cherry picked from commit 478562826b)
2019-09-23 17:01:37 +02:00
Nicolas Pomepuy
d5387f829b TV breadcrumb
(cherry picked from commit 9119dbc2b2)
2019-09-23 17:01:37 +02:00
Nicolas Pomepuy
33eb99610c Force refresh when changing video group setting
(cherry picked from commit 68f0fa1446)
2019-09-23 17:01:37 +02:00
Geoffrey Métais
8cf6abbaed Upgrade AndroidX to 1.1
(cherry picked from commit e2a9632958)
2019-09-23 17:01:37 +02:00
Geoffrey Métais
65a37b12bd Bump version to 3.2.0-beta-4 2019-09-10 15:30:04 +02:00
Geoffrey Métais
9935f78b71 Update NEWS 2019-09-10 15:30:04 +02:00
Kaya Zeren
850b15709c l10n: Turkish update
100% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 6691f68abc)
2019-09-10 15:30:04 +02:00
VideoLAN
10fb71df99 l10n: Sardinian update
100% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 6f444e6626)
2019-09-10 15:30:04 +02:00
Fumio Nakayama
c73b6d16d7 l10n: Japanese update
100% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 057eed8138)
2019-09-10 15:30:04 +02:00
Anton Regnander
5ae93e24a5 l10n: Swedish update
100% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 64e65469ef)
2019-09-10 15:30:04 +02:00
Marián Hikaník
dbe70ad689 l10n: Slovak update
100% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 1eaf76e9eb)
2019-09-10 15:30:04 +02:00
Sidney Doria
9b24ef768e l10n: Portuguese (Brazil) update
100% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 46deda4a6c)
2019-09-10 15:30:04 +02:00
Michał Trzebiatowski
6b1b699024 l10n: Polish update
100% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit e570a5e58a)
2019-09-10 15:30:04 +02:00
Yaron Shahrabani
ec9a75a0c1 l10n: Hebrew update
100% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit a55521bc8c)
2019-09-10 15:30:04 +02:00
Michał Trzebiatowski
f59fb96b82 l10n: German update
100% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 596c2b071e)
2019-09-10 15:30:04 +02:00
Nicolas Pomepuy
1954a636f8 Repeat is now auto saved and shared between audio and video
(cherry picked from commit e6e8a001ce)
2019-09-10 15:15:20 +02:00
Nicolas Pomepuy
0c01f43bea Reset repeat mode when changing media type (video/audio)
(cherry picked from commit 62c58b5afd)
2019-09-10 15:15:20 +02:00
Nicolas Pomepuy
3c81dd1733 Persist video repeat mode + setting
(cherry picked from commit 4b10f9f1f6)
2019-09-10 15:15:20 +02:00
Nicolas Pomepuy
d8410c5eac Fix seeking after repeat
(cherry picked from commit bc389b5e3c)
2019-09-10 15:15:20 +02:00
Nicolas Pomepuy
7e41d7d3de Fix commit link + other webview improvements
(cherry picked from commit f2697e19e9)
2019-09-10 15:15:20 +02:00
Nicolas Pomepuy
85db26e8d7 Implement last key shortcuts to mimic desktop app
(cherry picked from commit 3cc49360ea)
2019-09-10 15:15:20 +02:00
Nicolas Pomepuy
983f32df75 Fix anchor link navigation in License screen
(cherry picked from commit a75ec093e3)
2019-09-10 15:15:20 +02:00
Nicolas Pomepuy
2327814e6f Save new equalizer on enter key
(cherry picked from commit 70bcc81f72)
2019-09-10 15:15:20 +02:00
Geoffrey Métais
cbc1826bad Upgrade libraries
(cherry picked from commit fca98d19f6)
2019-09-10 15:15:15 +02:00
Geoffrey Métais
d0bdcc9d54 Thumbnails: update cache path
(cherry picked from commit b57e33f7e0)
2019-09-10 10:34:21 +02:00
Geoffrey Métais
55abb0c3e9 Browser: Don't interact on subdirectories parsing
(cherry picked from commit 8ab9f00f17)
2019-09-10 10:34:21 +02:00
Geoffrey Métais
f61d06ca29 Upgrade Kotlin and kotlinx
(cherry picked from commit e1317c8d7f)
2019-09-10 10:34:21 +02:00
Hugo Beauzée-Luyssen
dd91226044 medialibrary: Handle DeviceRemovedException
(cherry picked from commit 5bea429576)
2019-09-10 10:34:21 +02:00
Nicolas Pomepuy
c42984a5fc Better wording for Resume playback
Fixes #1008

(cherry picked from commit 08132311d7)
2019-09-10 10:34:21 +02:00
Nicolas Pomepuy
9442fb10ae Remove useless string
(cherry picked from commit 27e6a990cc)
2019-09-10 10:34:21 +02:00
Nicolas Pomepuy
83d9dbae4a Update medialib commit hash
(cherry picked from commit 524ea6127f)
2019-09-10 10:34:21 +02:00
Nicolas Pomepuy
3da6f0d57e Fix race condition when DB is corrupted
(cherry picked from commit 8848f1ebe7)
2019-09-04 14:07:57 +02:00
Nicolas Pomepuy
29eeed20d1 Handle DB corruption
(cherry picked from commit ef6be71af9)
2019-09-04 14:07:51 +02:00
Nicolas Pomepuy
5f444eaf54 Revert "Revert "Medialibrary: match API changes""
This reverts commit 3c634631

(cherry picked from commit 6b00085d03)
2019-09-04 14:07:38 +02:00
Nicolas Pomepuy
cfde19e1e5 Revert "Revert onHistoryChanged callback implementation"
This reverts commit 82d7d7d6

(cherry picked from commit fe0872aecd)
2019-09-04 14:07:30 +02:00
Nicolas Pomepuy
4a72fee9f2 Add a favorite option in TV browser
Fixes #967

(cherry picked from commit 6affeaf973)
2019-09-04 13:56:41 +02:00
Nicolas Pomepuy
bea54abb03 Fix player options item background
Fixes #1014

(cherry picked from commit 85fa57d48e)
2019-09-04 13:24:24 +02:00
Nicolas Pomepuy
9f8a8c9a48 Fix Typecast exception
Fixes #1013

(cherry picked from commit 961d5a1afc)
2019-09-04 13:23:41 +02:00
Nicolas Pomepuy
294553ea1a Improve marquee in lists
(cherry picked from commit 49ef39d364)
2019-09-04 13:20:20 +02:00
Persi Persu
4572957241 Allow UPnP folders to be added as favorites on TV
Apply suggestion to vlc-android/src/org/videolan/vlc/gui/tv/browser/VerticalGridActivity.kt

(cherry picked from commit a761d60a94)
2019-09-04 13:20:07 +02:00
Nicolas Pomepuy
1bf3d4bc89 Avoid hiding the pause button in the player notification
Fixes #1009

(cherry picked from commit 70c8954e35)
2019-09-04 13:19:48 +02:00
Nicolas Pomepuy
ccf6c4d65b Mitigate the FastScroller not scrolling all the way down
Fixes #958

(cherry picked from commit 8289b43f40)
2019-08-27 12:02:53 +02:00
Nicolas Pomepuy
eecd4e705c Fix IllegalStateException
(cherry picked from commit 19a9836296)
2019-08-27 12:02:48 +02:00
Nicolas Pomepuy
a5e1c7751c Fix history screen not searchable
Fixes #947

(cherry picked from commit 5ad9172e7e)
2019-08-27 12:02:40 +02:00
Hugo Beauzée-Luyssen
0390b2fcda gitlab-ci: Bump gradle version
(cherry picked from commit e3fd0f3faf)
2019-08-27 12:02:32 +02:00
Hugo Beauzée-Luyssen
b86625e1ac compile.sh: Bump gradle version to 5.4.1
(cherry picked from commit 034bf96da4)
2019-08-27 12:02:28 +02:00
Nicolas Pomepuy
6f68d74681 Properly restore selected position when coming back to TV network browser
(cherry picked from commit 3d9097ba82)
2019-08-27 12:02:22 +02:00
Nicolas Pomepuy
1c5441a169 Compute headers when opening network folder
(cherry picked from commit 7158c0e6ab)
2019-08-27 12:02:15 +02:00
Nicolas Pomepuy
d28c90e444 Fix equalizer focus issue
(cherry picked from commit 5f01912d9c)
2019-08-27 12:02:11 +02:00
Nicolas Pomepuy
3b325bba5c Update plugin
(cherry picked from commit 787314f8b8)
2019-08-27 12:02:02 +02:00
Simon Latapie
beedf2ee84 compile-medialibrary.sh: force uid/gid during tarball extraction
Under rare circonstances, tar will try to preserve uid/gid no matter what,
and fail.
This can happen for example when trying to build the contribs/extras as a
privileged user inside a namespaced container.

(cherry picked from commit ce62f92b58)
2019-08-27 12:01:58 +02:00
Simon Latapie
5b1edaad12 compile.sh: refactor checkfail
checkfail function cannot work with `set -e` at the beginning of the
script: every command that will return != 0 will stop the script.

This commit replaces checkfail with a || fail "..." function (to keep
error explanations)

(cherry picked from commit 9a7eeebabd)
2019-08-27 12:01:53 +02:00
Nicolas Pomepuy
5100becf8c Convert align mode setting to proper ellipsize setting
(cherry picked from commit 5a658d7cfb)
2019-08-27 12:01:44 +02:00
Nicolas Pomepuy
6e5b9dac12 Fix video player hud background
(cherry picked from commit 8d41cc47c0)
2019-08-27 12:01:28 +02:00
Nicolas Pomepuy
629ae05b3d Fix audio player progressbar shrinking in landscape
(cherry picked from commit 4ae01d26bd)
2019-08-27 11:39:42 +02:00
Nicolas Pomepuy
027504ab82 Fix advanced options focus and background
(cherry picked from commit db9a5d09e2)
2019-08-27 11:39:37 +02:00
Nicolas Pomepuy
d63f50b6c7 Fix NullPointerException whe deleting files
(cherry picked from commit 40579537bd)
2019-08-27 11:38:06 +02:00
Geoffrey Métais
1ec1278424 Preserve line number in release builds
(cherry picked from commit 0efa9402ba)
2019-08-14 15:54:40 +02:00
Nicolas Pomepuy
7f4b771326 Move seek animations to the delegate
(cherry picked from commit 3716d6a3b0)
2019-08-14 15:54:40 +02:00
Nicolas Pomepuy
bcb70403c8 Fix some video seek animation issues
(cherry picked from commit 4bd3f386ab)
2019-08-14 15:54:40 +02:00
Nicolas Pomepuy
4f7df350cc Video player seek new UI
(cherry picked from commit 0a0048ddf1)
2019-08-14 15:54:40 +02:00
Hsiu-Ming Chang
0c31089bc5 l10n: Chinese (Taiwan) update
99% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 7b375fcc66)
2019-08-13 10:26:14 +02:00
VideoLAN
e869f80c8b l10n: Uzbek update
30% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 05f20c1333)
2019-08-13 10:26:14 +02:00
VideoLAN
9b53d6a617 l10n: Tatar update
73% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 080f285c31)
2019-08-13 10:26:14 +02:00
VideoLAN
f7cec27ecf l10n: Thai update
76% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit d560fbfbfa)
2019-08-13 10:26:14 +02:00
VideoLAN
0f79b362a5 l10n: Tamil update
54% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 58ce6d94d8)
2019-08-13 10:26:14 +02:00
VideoLAN
ed3c05f9ef l10n: Serbian update
29% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 181f125655)
2019-08-13 10:26:14 +02:00
VideoLAN
7333d4ca15 l10n: Albanian update
40% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 4cdfbe2049)
2019-08-13 10:26:14 +02:00
VideoLAN
09a73b2f2d l10n: Slovenian update
84% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 9fdb5873d6)
2019-08-13 10:26:14 +02:00
VideoLAN
34664e8dab l10n: Russian update
94% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit af8daf5c1d)
2019-08-13 10:26:14 +02:00
VideoLAN
103b6d8f91 l10n: Romanian update
87% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 0ca467b3e8)
2019-08-13 10:26:14 +02:00
VideoLAN
463409ccc5 l10n: Portuguese update
97% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit db38ff50f4)
2019-08-13 10:26:14 +02:00
Michał Trzebiatowski
fa37848bab l10n: Polish update
100% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit e416912c1c)
2019-08-13 10:26:14 +02:00
VideoLAN
84bb6bfa8c l10n: Norwegian Bokmål update
93% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit c795ee3962)
2019-08-13 10:26:14 +02:00
VideoLAN
e1f69331d3 l10n: Malay update
96% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 2b469ce088)
2019-08-13 10:26:14 +02:00
VideoLAN
a8cf0bdf93 l10n: Marathi update
32% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 500778290a)
2019-08-13 10:26:14 +02:00
VideoLAN
772fd1fb3b l10n: Malayalam update
41% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 047a9e8fdd)
2019-08-13 10:26:14 +02:00
VideoLAN
c78e265daa l10n: Latvian update
31% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit db1e3ee2e5)
2019-08-13 10:26:14 +02:00
VideoLAN
c187df6c4c l10n: Lithuanian update
42% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 2f70902b66)
2019-08-13 10:26:14 +02:00
VideoLAN
73fea07e8a l10n: Korean update
94% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 3b8395df69)
2019-08-13 10:26:14 +02:00
VideoLAN
8534b3581c l10n: Khmer update
38% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit f2661b09f5)
2019-08-13 10:26:14 +02:00
VideoLAN
6ed8dc6043 l10n: Italian update
97% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit ba692b452d)
2019-08-13 10:26:14 +02:00
VideoLAN
55f889bbc9 l10n: Icelandic update
96% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit bcf88c6e0b)
2019-08-13 10:26:14 +02:00
VideoLAN
f0f347bc20 l10n: Indonesian update
42% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 98798c5560)
2019-08-13 10:26:14 +02:00
VideoLAN
24aef56f26 l10n: Hungarian update
97% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit b71692581c)
2019-08-13 10:26:14 +02:00
VideoLAN
210cf57745 l10n: Croatian update
76% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 2fbf97b55f)
2019-08-13 10:26:14 +02:00
VideoLAN
1404d35210 l10n: Galician update
96% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 46fca93dfa)
2019-08-13 10:26:14 +02:00
Seanán Ó Coistín
fc167700fe l10n: Irish update
62% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit fec262e22e)
2019-08-13 10:26:14 +02:00
VideoLAN
2cc00afb6c l10n: French update
96% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit a2a48875ad)
2019-08-13 10:26:14 +02:00
VideoLAN
9a6a8cc92c l10n: Faroese update
30% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit ec570027e3)
2019-08-13 10:26:14 +02:00
VideoLAN
8a5023f93f l10n: Finnish update
46% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 4d6236666a)
2019-08-13 10:26:14 +02:00
VideoLAN
4ece3b470c l10n: Persian update
63% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 98ec51fbf2)
2019-08-13 10:26:14 +02:00
VideoLAN
2e2ab451e5 l10n: Basque update
86% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 34eb5d8ef6)
2019-08-13 10:26:14 +02:00
VideoLAN
41594492f2 l10n: Spanish (Mexico) update
32% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 3d34bce10e)
2019-08-13 10:26:14 +02:00
VideoLAN
47df86cbe0 l10n: Spanish update
97% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit b7302b6b38)
2019-08-13 10:26:14 +02:00
VideoLAN
1bb5295152 l10n: English (United Kingdom) update
30% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit b89b29aa70)
2019-08-13 10:26:14 +02:00
VideoLAN
199eb91545 l10n: Greek update
85% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit cdd11484e1)
2019-08-13 10:26:14 +02:00
Michał Trzebiatowski
28e2046d7e l10n: German update
100% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 8b8a8f2ad4)
2019-08-13 10:26:14 +02:00
VideoLAN
f9235580f4 l10n: Danish update
97% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 98ec6052b5)
2019-08-13 10:26:14 +02:00
VideoLAN
ecb8fd6caa l10n: Welsh update
88% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 0aa0f9ab67)
2019-08-13 10:26:14 +02:00
VideoLAN
78ebf05b1a l10n: Czech update
93% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit e50aaaaef9)
2019-08-13 10:26:14 +02:00
VideoLAN
401d988ab1 l10n: Corsican update
96% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 68eec9c1c2)
2019-08-13 10:26:14 +02:00
VideoLAN
6ad17976c9 l10n: Catalan update
56% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 80f0f84c14)
2019-08-13 10:26:14 +02:00
VideoLAN
66f6861b11 l10n: Bosnian update
31% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 4d771613ab)
2019-08-13 10:26:14 +02:00
VideoLAN
5e189c35d5 l10n: Breton update
49% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit f45663dfa5)
2019-08-13 10:26:14 +02:00
VideoLAN
5c5e5d8331 l10n: Belarusian update
30% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit c77e0cedc4)
2019-08-13 10:26:14 +02:00
VideoLAN
f16a8cf2ce l10n: Arabic update
52% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit fa05f38326)
2019-08-13 10:26:14 +02:00
Nicolas Pomepuy
463236aac7 Avoid using the static Application to override getApplicationContext
(cherry picked from commit bbe6f44d8d)
2019-08-13 10:26:14 +02:00
Nicolas Pomepuy
30f0748a7f Fix display of delete history icon when loading history
(cherry picked from commit 89da6bf3f3)
2019-08-13 10:26:14 +02:00
Nicolas Pomepuy
8fb4bad450 Fix video card title ellipsize
(cherry picked from commit 3d89b20fc6)
2019-08-13 10:26:14 +02:00
Nicolas Pomepuy
c7f2929ceb Theme About webview
(cherry picked from commit 10c837e1f4)
2019-08-13 10:26:14 +02:00
Nicolas Pomepuy
02ae94d64c Fix StackOverflowError by returning VLCApplication which is wrapped
(cherry picked from commit 4c3b295f69)
2019-08-13 10:26:14 +02:00
Nicolas Pomepuy
f6f5c9d5ae Fix BadParcelableException by using @Parcelize
(cherry picked from commit c01d26bcf5)
2019-08-13 10:26:14 +02:00
Nicolas Pomepuy
47ec6fabb9 Fix ClassCastException for Audio output preference
(cherry picked from commit 597da4fd2e)
2019-08-13 10:26:14 +02:00
Nicolas Pomepuy
20c4d9859e Fix audio player seek button issue
(cherry picked from commit f54ef2bae3)
2019-08-13 10:26:14 +02:00
Nicolas Pomepuy
a4121c3c39 Crash fix
(cherry picked from commit a21a0889cc)
2019-08-13 10:26:14 +02:00
Nicolas Pomepuy
8541369b70 Fix equalizer focus issue
(cherry picked from commit 2c4ff0e63c)
2019-08-13 10:26:14 +02:00
Nicolas Pomepuy
58ba9ca982 Fix UninitializedPropertyAccessException
(cherry picked from commit 332d88b457)
2019-08-13 10:26:14 +02:00
Shivansh Saini
54948a6ff5 Fixed search collapse side-effect on menu items
Signed-off-by: Shivansh Saini <shivanshs9@gmail.com>
(cherry picked from commit b3df511db5)
2019-08-12 18:16:50 +02:00
Dian Li
dbebe56e02 l10n: Chinese (China) update
100% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 317b684f8b)
2019-08-12 13:45:41 +02:00
Anton Regnander
3c3bfe4086 l10n: Swedish update
100% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 6da3c87ecc)
2019-08-12 13:45:41 +02:00
VideoLAN
c6b1ae73bc l10n: Sardinian update
100% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 14bf74c24d)
2019-08-12 13:45:41 +02:00
Michał Trzebiatowski
c5b7c6f534 l10n: Polish update
100% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit d6e206802b)
2019-08-12 13:45:41 +02:00
Андрій Бандура
728323fe28 l10n: Ukrainian update
100% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 442cef3c06)
2019-08-12 13:45:41 +02:00
Kaya Zeren
b88ca4b83b l10n: Turkish update
100% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 3d003d5668)
2019-08-12 13:45:41 +02:00
Sebastian Rasmussen
71aa2f9223 l10n: Swedish update
100% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit e47abe0a42)
2019-08-12 13:45:41 +02:00
Marián Hikaník
171bf06052 l10n: Slovak update
100% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit f5fed91076)
2019-08-12 13:45:41 +02:00
Sidney Doria
7dc49a370e l10n: Portuguese (Brazil) update
100% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 593f561e6a)
2019-08-12 13:45:41 +02:00
Michał Trzebiatowski
6a5e2187d6 l10n: Polish update
100% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 7bad7dc202)
2019-08-12 13:45:41 +02:00
Thomas De Rocker
4153f632cc l10n: Dutch update
100% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit e9490db870)
2019-08-12 13:45:41 +02:00
Fumio Nakayama
6d59455bb7 l10n: Japanese update
100% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 6327e00893)
2019-08-12 13:45:41 +02:00
Yaron Shahrabani
7dc4a2428e l10n: Hebrew update
100% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit e5cd78815d)
2019-08-12 13:45:41 +02:00
Mario Siegmann
7837471561 l10n: German update
100% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit bfbd8ff7b6)
2019-08-12 13:45:41 +02:00
VideoLAN
3648a5807e l10n: Irish update
60% translated

Signed-off-by: Michał Trzebiatowski <michtrz@gmail.com>
Signed-off-by: Geoffrey Métais <geoffrey.metais@gmail.com>
(cherry picked from commit 9dfd62f764)
2019-08-12 13:45:41 +02:00
Thomas Guillem
8f4533c490 libvlc: backport smb2 patches
This commit fixes a possible null-deref when stopping a smb2 session.

(cherry picked from commit 4997c88818)
2019-08-12 13:44:45 +02:00
Geoffrey Métais
ae6c6a304d Harden Medialibrary initialization
(cherry picked from commit ad48e895c1)
2019-08-09 16:13:23 +02:00
Nicolas Pomepuy
fce11dee74 Change the way we handle the locale change
(cherry picked from commit 58fea994e1)
2019-08-09 16:13:23 +02:00
Geoffrey Métais
42028545c2 MediaParsingService: Always set foreground Oreo+
(cherry picked from commit 828ffce294)
2019-08-09 16:13:06 +02:00
Geoffrey Métais
bba0cc0755 BrowserProvider: Safely send media to channel
(cherry picked from commit bd91edb96f)
2019-08-09 16:13:06 +02:00
Geoffrey Métais
c96fb475c1 Update version to 3.2.0 beta 3 2019-08-08 14:20:37 +02:00
Geoffrey Métais
1f20f02426 Update NEWS 2019-08-08 14:20:37 +02:00
Nicolas Pomepuy
ff0a943a10 Revert switch preferences to checkbox as leanback doesn't support it
(cherry picked from commit 123e7cc1cc)
2019-08-08 13:47:43 +02:00
Geoffrey Métais
a25b0f5e6b FadableView: Fix crash
animationRunning variable is mysteriously null at some point

(cherry picked from commit 2c9b38fc1e)
2019-08-08 13:47:43 +02:00
Geoffrey Métais
9cf087945b Code cleaning
(cherry picked from commit 57a94f84f8)
2019-08-08 13:47:43 +02:00
Nicolas Pomepuy
c9ecd3c41d Display network protocol and network icon on TV
(cherry picked from commit b16176ed50)
2019-08-08 13:47:43 +02:00
Nicolas Pomepuy
33c68f62ec Mitigate the seekbar UI issue on kitkat
(cherry picked from commit ace6980203)
2019-08-08 13:47:43 +02:00
Nicolas Pomepuy
95f0f771fb Fix some language issues
(cherry picked from commit b469eb865e)
2019-08-08 13:47:43 +02:00
Geoffrey Métais
7d3dd4e14f Update VLC hash
(cherry picked from commit c9f9268dcc)
2019-08-08 13:47:43 +02:00
Hugo Beauzée-Luyssen
22be0c50a7 libvlc: Remove upstreamed patch
(cherry picked from commit bb701d8777)
2019-08-08 13:47:43 +02:00
Geoffrey Métais
72e5f2d933 Reload library instead of force rescan
Fixes #932

(cherry picked from commit 9dd19a6060)
2019-08-08 13:47:43 +02:00
Geoffrey Métais
d4aef069ca Update medialibrary hash
(cherry picked from commit 6238c48f35)
2019-08-08 13:47:38 +02:00
Geoffrey Métais
a8f2e12abc Update SendCrashActivity.kt
(cherry picked from commit 1567b7cee3)
2019-08-08 13:46:28 +02:00
Nicolas Pomepuy
3b1f95ee44 Update crash launcher icon
(cherry picked from commit c53b808064)
2019-08-08 13:46:28 +02:00
Alexandre Perraud
69c473518f Modify the launcher reporter main icon
(cherry picked from commit c3f6c3d2c4)
2019-08-08 13:46:28 +02:00
Nicolas Pomepuy
f0d9f9c470 Fix forum URL
(cherry picked from commit fa4ff83032)
2019-08-08 13:46:28 +02:00
Geoffrey Métais
5b50ab3186 SendCrashActivity: fix crash on leave
(cherry picked from commit a343a2a880)
2019-08-08 13:46:28 +02:00
Geoffrey Métais
020ee09101 Set buildConfig.BETA field
(cherry picked from commit 520a9b5953)
2019-08-08 13:46:28 +02:00
Geoffrey Métais
1e5573fd1a Set SendCrashActivity singleTask
(cherry picked from commit 6df325430c)
2019-08-08 13:46:28 +02:00
Nicolas Pomepuy
537417c22d Make crash description translatable
(cherry picked from commit ac9626e1d6)
2019-08-08 13:46:28 +02:00
Nicolas Pomepuy
0860addcc5 Prevent beta notice to be displayed on TV
(cherry picked from commit 8796cd0d79)
2019-08-08 13:46:28 +02:00
Nicolas Pomepuy
db49fd51b0 Disable crash reporter when app is not beta
(cherry picked from commit 06adb0f74d)
2019-08-08 13:46:28 +02:00
Nicolas Pomepuy
54f97c5f44 Change the way we handle crash reports
(cherry picked from commit 3d480d2ab5)
2019-08-08 13:46:28 +02:00
Nicolas Pomepuy
8455085bf2 Add a crash send dialog for betas
(cherry picked from commit 50b610d087)
2019-08-08 13:46:28 +02:00
Nicolas Pomepuy
429268ce18 Fix blank covers on TV
(cherry picked from commit fab123e26c)
2019-08-08 13:46:28 +02:00
Nicolas Pomepuy
c7bb1e9c97 Allow text wrapping for Switch preferences
(cherry picked from commit e49c7611f7)
2019-08-08 13:46:28 +02:00
Nicolas Pomepuy
59fc5f742f Replace android strings by the ones in the app (ok/cancel/yes)
(cherry picked from commit 0bdff9c5e0)
2019-08-08 13:46:28 +02:00
Nicolas Pomepuy
280eaac6d7 Prevent closing equalizer when swiping between vertical progressbars
(cherry picked from commit 2071aa6db1)
2019-08-08 13:46:28 +02:00
Shivansh Saini
03df0b7e71 Fixed playlist duplicate by name bug
Signed-off-by: Shivansh Saini <shivanshs9@gmail.com>
(cherry picked from commit d810855173)
2019-08-08 13:46:28 +02:00
Geoffrey Métais
634e539d23 TV: Load relevant item icons
Fix #973

(cherry picked from commit 602770dd7c)
2019-08-08 13:46:28 +02:00
Geoffrey Métais
48b2076e51 Remove strings for languages with < 30% translated
(cherry picked from commit 694c7276f3)
2019-08-08 13:46:28 +02:00
Geoffrey Métais
62a3faf8da Image loading: Use Activity scope if available
(cherry picked from commit 47ca6c76a7)
2019-08-08 13:46:28 +02:00
Geoffrey Métais
dcee75d925 UPnP: Add patch to fix discovery
This patch was in 3.1 release then disappeared.

(cherry picked from commit 055078a68f)
2019-08-08 13:46:28 +02:00
Geoffrey Métais
374801c5d0 Browers: prepasing respects browsing flags
hidden files were always ignored.

(cherry picked from commit 0ee827e19f)
2019-08-08 13:46:28 +02:00
Thomas Guillem
d0b0fb961b libvlc: backport smb2 port specifications support
(cherry picked from commit 5610d99c57)
2019-08-08 13:46:28 +02:00
Thomas Guillem
01c5e8f134 libvlc: backport smb2 ntlmssp anonymous login support
(cherry picked from commit 007be00159)
2019-08-08 13:46:28 +02:00
Geoffrey Métais
48acbc94a9 TV: Fix headers display in browsing
(cherry picked from commit 1d1e367752)
2019-08-08 13:46:28 +02:00
Geoffrey Métais
baa75df65a DB dump: extract hardcoded strings
(cherry picked from commit 4d50750095)
2019-08-08 13:46:28 +02:00
Geoffrey Métais
8b7a555d99 Browsers: Fix subtitles picker
Also improves factorization in browser providers

(cherry picked from commit 1a9feed0ed)
2019-08-08 13:46:28 +02:00
Geoffrey Métais
70706d4041 widgets manager: Prevent NPE
(cherry picked from commit 23465078b4)
2019-08-08 13:46:28 +02:00
Geoffrey Métais
2aefd25b16 VLC progress: fix float casting
(cherry picked from commit f56a376006)
2019-08-08 13:46:28 +02:00
Geoffrey Métais
b8cce14758 Browser: cancel task using a coroutineScope
(cherry picked from commit 9778750a33)
2019-08-08 13:46:28 +02:00
Nicolas Pomepuy
7d12536b31 Let user chose the display mode in each list menu (persisted)
(cherry picked from commit 85622346f9)
2019-08-02 14:56:44 +02:00
Geoffrey Métais
63a54e81d4 Browser: prevent access to uninitialized variable
(cherry picked from commit 109c99e95c)
2019-08-02 14:56:44 +02:00
Nicolas Pomepuy
68f96d2acf Mitigate audio text glitch
(cherry picked from commit f4f16b1eff)
2019-08-02 14:56:44 +02:00
Nicolas Pomepuy
0792bf31ef Remove useless launchAnim method
(cherry picked from commit 350d4820d7)
2019-08-02 14:56:44 +02:00
Nicolas Pomepuy
125f04af1f Animate image appearance in lists
(cherry picked from commit decca21056)
2019-08-02 14:56:43 +02:00
Nicolas Pomepuy
be11f61f5f Fix fast scroller provider in audio lists
(cherry picked from commit fa0bb06778)
2019-08-02 14:56:43 +02:00
Nicolas Pomepuy
39c373f437 Fix video tips
(cherry picked from commit 3bb3ec7ac5)
2019-08-02 14:56:43 +02:00
Nicolas Pomepuy
96cab698a7 Fix NPE / IllegalStateException
(cherry picked from commit 7c6c7b1745)
2019-08-02 14:56:43 +02:00
Nicolas Pomepuy
9c63acebd3 Change SparseBooleanArrayParcelable implementation to Parcelize
(cherry picked from commit 8de88d926d)
2019-08-02 14:56:43 +02:00
Nicolas Pomepuy
6b43008c36 Fix settings crash
(cherry picked from commit 7d7111503c)
2019-08-02 14:56:43 +02:00
Nicolas Pomepuy
1f1f07f7ca Multiselect helper crash fixes
(cherry picked from commit fd690bda5f)
2019-08-02 14:56:43 +02:00
Geoffrey Métais
a6c4f1a824 Fix build
(cherry picked from commit 667cd08b53)
2019-08-02 14:56:43 +02:00
Geoffrey Métais
2204a58e71 Fix crash in History on Android 4
(cherry picked from commit 17fb15ab25)
2019-08-02 14:56:43 +02:00
Geoffrey Métais
e53c69e32c Clear cards cover on recycle
(cherry picked from commit 13d62e01c8)
2019-08-02 14:56:43 +02:00
Geoffrey Métais
1c1d5f6a7d Update to 3.2 beta 2 2019-07-31 17:10:21 +02:00
Geoffrey Métais
51bc326bbf Update NEWS 2019-07-31 17:10:21 +02:00
Nicolas Pomepuy
e980acafec Fix adaptive icon
(cherry picked from commit 8e2ec95ee5)
2019-07-31 17:10:21 +02:00
Geoffrey Métais
2b1736b418 Update medialibrary HASH 2019-07-31 15:34:09 +02:00
Geoffrey Métais
287cae6972 Upgrade Retrofit to v2.6.1
(cherry picked from commit 861d2f9b2d)
2019-07-31 15:33:07 +02:00
Geoffrey Métais
fcdae1ad40 Update VLC HASH
(cherry picked from commit 53cde42e61)
2019-07-31 15:33:07 +02:00
Nicolas Pomepuy
363841ee91 Fix UninitializedPropertyAccessException
(cherry picked from commit 409a8f8963)
2019-07-31 15:20:23 +02:00
Geoffrey Métais
f8b192b01a Change folder browsing to be a batch
(cherry picked from commit 79ef5e1c34)
2019-07-31 15:20:23 +02:00
Nicolas Pomepuy
54c02367ef Persist action mode upon orientation changes
(cherry picked from commit 5f5d225885)
2019-07-31 15:20:23 +02:00
Nicolas Pomepuy
54a7d5d6b9 Fix TV grid bug and resume position
(cherry picked from commit 889bc822f5)
2019-07-31 15:19:55 +02:00
Nicolas Pomepuy
7a54d8ecb3 Fix search icons
(cherry picked from commit e507b4ce6c)
2019-07-31 15:19:55 +02:00
Nicolas Pomepuy
f8d52fadfa Fix audio player small glitch when opening / closing
(cherry picked from commit 23196a5f20)
2019-07-31 15:19:55 +02:00
Nicolas Pomepuy
0201e48839 Fix equalizer crash + improve workflow
(cherry picked from commit 1b81e6bc10)
2019-07-31 15:19:55 +02:00
Geoffrey Métais
8f15d80f80 Browsers: Stop subdirectories parsing when stopped
When fragment is stopped, cancel subdirectories discovery

(cherry picked from commit a31ff3d9ea)
2019-07-31 15:19:55 +02:00
Nicolas Pomepuy
ff6c4fa9a9 Fix settings crash
(cherry picked from commit f67e391a8e)
2019-07-31 15:19:55 +02:00
Geoffrey Métais
c711e098c5 MedialibProvider: No need for observable delegate
(cherry picked from commit b84b7115ce)
2019-07-29 16:36:24 +02:00
Geoffrey Métais
6c12e4c4e7 Reduce setLocale calls
(cherry picked from commit d7c13409b6)
2019-07-29 16:36:24 +02:00
Nicolas Pomepuy
0789613948 Fix language change
(cherry picked from commit 826eaf5f4c)
2019-07-29 16:36:24 +02:00
Nicolas Pomepuy
2feb7a7199 Use switches in preferences
(cherry picked from commit a445cb5a7f)
2019-07-29 16:36:24 +02:00
Nicolas Pomepuy
b5b9e4c705 Add a summary to DayNight mode setting
(cherry picked from commit 0b1ed070b8)
2019-07-29 16:36:24 +02:00
Nicolas Pomepuy
d35e5c4171 Use composed playlist image in PlaylistActivity collapsible toolbar
(cherry picked from commit f7e7242332)
2019-07-29 16:36:24 +02:00
Nicolas Pomepuy
dd14d8a27b Hide all menu items when launching a search + restore
(cherry picked from commit 039a770a76)
2019-07-29 16:36:24 +02:00
Nicolas Pomepuy
06198b5f45 Use user's locale time format for TV
(cherry picked from commit ea8df450fd)
2019-07-29 16:36:24 +02:00
Nicolas Pomepuy
4729705c8e Fix history clean menu appearance
(cherry picked from commit 99c33ae0a7)
2019-07-29 16:36:24 +02:00
Nicolas Pomepuy
0a1a9d8daf Fix loading states when coming from the Local Network fragment
(cherry picked from commit 7d511d0cd7)
2019-07-29 16:36:24 +02:00
Geoffrey Métais
e91236b908 Set medialibrary branch to 0.5.x 2019-07-29 15:40:42 +02:00
398 changed files with 8877 additions and 7837 deletions

View File

@@ -1,7 +1,7 @@
cache:
paths:
- .gradle/
- gradle-5.1.1/
- gradle-5.4.1/
- gradle/
- gradlew

190
NEWS
View File

@@ -1,3 +1,193 @@
Changes between 3.2.7 and 3.2.7.1:
------------------
Application:
* crash fixes
Changes between 3.2.6 and 3.2.7:
------------------
Application:
* Support Picture-in-Picture on Chrome OS
* Fix video as audio playback resume
* Video player: Correctly apply extra title
* misc. crash fixes
Changes between 3.2.5 and 3.2.6:
------------------
Application:
* Fix crash at startup
* Fix PiP aspect ratio on video change
Changes between 3.2.4 and 3.2.5:
------------------
Application:
* Fix Medialibrary empty on Android Auto
* Fix video groups thumbnail not loading
* Crash & ANR fixes
Changes between 3.2.3 and 3.2.4:
------------------
Application:
* Fix double tap timing issue
* Streams: Open RTSP streams with video player
TV:
* Do not show protocol in files browser
Changes between 3.2.2 and 3.2.3:
------------------
Application:
* Allow displaying the playlists in list mode
* Fix PiP aspect ratio
* Fix album view thumbnail size
* Fix double tap timing issue
* Misc. fixes
TV:
* Fix browsers showing 65 first files only
* Fix background transitions
* Fix flickering in browsers
* Fix subs dl focus for DPAD navigation
* Fix video count on TV main screen
Changes between 3.2.1 and 3.2.2:
------------------
Application:
* Fix audio tabs shown on streams view
* Various crash fixes
VLC:
* Security fixes
* add bluray support
Changes between 3.2.0 and 3.2.1:
------------------
Application:
* Various crash fixes
Changes between 3.2.0-beta-07 and 3.2.0:
------------------
Application:
* Set priority to SMBv1
* Security fix
* Various crash fixes
Changes between 3.2.0-beta-06 and 3.2.0-beta-07:
------------------
Application:
* Various crash fixes
Medialibrary:
* Handle corrupted DB
* Improved titles decrapifier
Changes between 3.2.0-beta-05 and 3.2.0-beta-06:
------------------
Application:
* Fix crash on Android 4
* Play single videos fron the videos groups view
* Fix videos playback sometimes loaded in the wrong order
* Crash and ANR fixes
Medialibrary:
* Titles decrapifier
* Report unhandled exceptions
Changes between 3.2.0-beta-04 and 3.2.0-beta-05:
------------------
Application:
* Group videos by name feature
* Move video group setting to main UI
* Improve network login in browser
* Fix audio lists position restoration
* Improve empty view appearence
* Fix drag&drop in video player playlist
* Add sort by release year for tracks
* Misc. crash fixes
TV:
* Breadcrumb in browsers
&VLC:
* Security fixes
* fix smb2/dsm conflicts
DeX:
* Fix videoplayer mouse inputs
Changes between 3.2.0-beta-03 and 3.2.0-beta-04:
------------------
Application:
* Improve locale change
* new UI for video seek
* Fix seeking after repeat
* Persist repeat mode by default
* translations update
* various crash fixes
TV:
* Add a favorite option in browser
VLC:
* Improve SMB support
* security fixes
Medialibrary:
* Fallback for failed migrations
Changes between 3.2.0-beta-02 and 3.2.0-beta-03:
------------------
Application:
* Add a crash send dialog for betas
* Improve display during lists scrolling
* Fix crash on seek in video player during Chromecasting
* Menu option to switch between list and grid for artists and albums
* Fix subtitles picker
* Fix languages change not effective
* Tons of UI improvements
* Browsers performance improvements
* Misc. crash fixes
TV:
* Fix headers display in browsing
* Load relevant item icons in browsers
* Display network protocol and network icon
VLC:
* Fix UPnP discovery crash
* Improve SMBv2 anonymous login support
Changes between 3.2.0-beta-01 and 3.2.0-beta-02:
------------------
Application:
* UI improvements
* Fix adaptative icon
* Improve loading feedback
* Fix crash with Chromecast
* Video player controls reorganization
* Fix sort not remembered
* Fix language change
* translations update
* Minor bug fixes
Medialibrary:
* New migration to repair the last one if it failed
Changes between 3.1.7 and 3.2.0-beta-01:
------------------

View File

@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="20" height="20"
id="svg4682" version="1.1" inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="ic_ctx_link_normal.svg"
inkscape:export-filename="/home/corbax/Dev/android/Icons/Test 1/ic_play_normal.png"
inkscape:export-xdpi="90" inkscape:export-ydpi="90">
<defs id="defs4684" />
<sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0"
inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="44.8"
inkscape:cx="7.0083751" inkscape:cy="6.94558" inkscape:document-units="px"
inkscape:current-layer="layer1" showgrid="true" inkscape:window-width="1600"
inkscape:window-height="836" inkscape:window-x="0" inkscape:window-y="27"
inkscape:window-maximized="1" inkscape:snap-bbox="true" inkscape:bbox-nodes="true"
inkscape:bbox-paths="true" inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true" inkscape:object-paths="true"
inkscape:snap-intersection-paths="true" inkscape:object-nodes="true"
inkscape:snap-smooth-nodes="true" inkscape:snap-midpoints="true"
inkscape:snap-object-midpoints="true" inkscape:snap-center="true">
<inkscape:grid type="xygrid" id="grid3002" />
</sodipodi:namedview>
<metadata id="metadata4687">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1"
transform="translate(0,-1032.3622)">
<path style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.32731667;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 5.75,1038.6122 a 3.7499783,3.7499783 0 0 0 -3.75,3.75 3.7499783,3.7499783 0 0 0 3.75,3.75 H 9 v -1.5 H 5.75 a 2.249987,2.249987 0 0 1 -2.25,-2.25 2.249987,2.249987 0 0 1 2.25,-2.25 H 9 v -1.5 z m 5.25,0 v 1.5 h 3.25 a 2.249987,2.249987 0 0 1 2.25,2.25 2.249987,2.249987 0 0 1 -2.25,2.25 H 11 v 1.5 h 3.25 a 3.7499783,3.7499783 0 0 0 3.75,-3.75 3.7499783,3.7499783 0 0 0 -3.75,-3.75 z m -4,3 v 1.5 h 6 v -1.5 z"
id="rect6696" inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?><!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="96" height="96"
viewBox="0 0 25.399999 25.400001" version="1.1" id="svg6620"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)" sodipodi:docname="ic_empty_w.svg">
<defs id="defs6614" />
<sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0"
inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="5.6"
inkscape:cx="12.132528" inkscape:cy="26.888712" inkscape:document-units="mm"
inkscape:current-layer="layer1" showgrid="true" units="px" inkscape:window-width="1920"
inkscape:window-height="1043" inkscape:window-x="1920" inkscape:window-y="0"
inkscape:window-maximized="1">
<inkscape:grid type="xygrid" id="grid7165" />
</sodipodi:namedview>
<metadata id="metadata6617">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1"
transform="translate(0,-271.59998)">
<path style="fill:#fafafa;stroke-width:1.00004995;fill-opacity:1"
d="M 48 9 C 43.98189 8.999811 40.353912 11.779593 38.789062 15.480469 L 34.423828 28.576172 L 28.408203 46.628906 L 25.400391 55.654297 L 19.056641 55.654297 C 17.056641 55.654297 15.195828 57.164805 14.611328 59.158203 L 11.107422 71.080078 C 9.9626219 74.991965 8.8278344 78.874345 7.6777344 82.806641 C 7.1963341 84.45013 7.6776781 85.658638 8.4550781 86.494141 C 8.9360782 87.011445 9.5296718 87.385355 10.076172 87.634766 C 10.307872 87.737569 10.498447 87.807912 10.685547 87.869141 C 12.737347 88.219503 15.059428 87.903085 17.986328 86.09375 C 28.634528 79.496471 31.29591 92.693674 41.974609 86.09375 C 52.622808 79.496471 55.282238 92.693674 65.960938 86.09375 C 74.757939 80.643482 78.10689 88.693733 85.025391 87.939453 C 85.294682 87.881248 85.572729 87.790482 85.923828 87.634766 C 86.470329 87.385317 87.063924 87.011445 87.544922 86.494141 C 88.321123 85.658638 88.803668 84.45013 88.322266 82.806641 C 87.172167 78.874345 86.037378 74.991965 84.892578 71.080078 L 81.388672 59.158203 C 80.804172 57.164805 78.943361 55.654297 76.943359 55.654297 L 70.599609 55.654297 L 67.591797 46.628906 L 61.576172 28.576172 L 57.246094 15.585938 C 55.709054 11.831922 52.05648 9 48 9 z M 39 48 A 7.9999995 7.9999995 0 0 1 47 56 A 7.9999995 7.9999995 0 0 1 39 64 A 7.9999995 7.9999995 0 0 1 31 56 A 7.9999995 7.9999995 0 0 1 39 48 z M 59 50 A 5.9999998 5.9999827 0 0 1 65 56 A 5.9999998 5.9999827 0 0 1 59 62 A 5.9999998 5.9999827 0 0 1 53 56 A 5.9999998 5.9999827 0 0 1 59 50 z "
transform="matrix(0.26458333,0,0,0.26458333,0,271.59998)" id="path6941" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@@ -2,20 +2,20 @@
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="108"
height="108"
viewBox="0 0 108 108"
id="svg4826"
version="1.1"
inkscape:version="0.92.3 (unknown)"
sodipodi:docname="ic_launcher_background.svg">
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="108"
height="108"
viewBox="0 0 108 108"
id="svg4826"
version="1.1"
inkscape:version="0.92.4 (33fec40, 2019-01-16)"
sodipodi:docname="ic_launcher_background.svg">
<defs
id="defs4828">
<clipPath
@@ -39,24 +39,24 @@
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="1.979899"
inkscape:cx="-148.79458"
inkscape:cy="82.961982"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
inkscape:window-width="1920"
inkscape:window-height="1052"
inkscape:window-x="1920"
inkscape:window-y="0"
inkscape:window-maximized="1">
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="1.4"
inkscape:cx="-113.46628"
inkscape:cy="55.092476"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
inkscape:window-width="1920"
inkscape:window-height="1053"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid821" />
@@ -69,13 +69,21 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:title/>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-978.49552)" />
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-978.49552)">
<rect
style="fill:#ffffff;fill-opacity:1;stroke-width:0.9818182"
id="rect817"
width="108"
height="108"
x="0"
y="978.49554"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@@ -2,20 +2,20 @@
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="108"
height="108"
viewBox="0 0 108 108"
id="svg4826"
version="1.1"
inkscape:version="0.92.3 (unknown)"
sodipodi:docname="ic_launcher_backgroud.svg">
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="108"
height="108"
viewBox="0 0 108 108"
id="svg4826"
version="1.1"
inkscape:version="0.92.4 (33fec40, 2019-01-16)"
sodipodi:docname="ic_launcher_background_debug.svg">
<defs
id="defs4828">
<clipPath
@@ -39,24 +39,24 @@
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#50c8a3"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="1.979899"
inkscape:cx="-58.638464"
inkscape:cy="82.961982"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
inkscape:window-width="1920"
inkscape:window-height="1025"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1">
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="1.4"
inkscape:cx="-113.46628"
inkscape:cy="55.092476"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
inkscape:window-width="1920"
inkscape:window-height="1053"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid821" />
@@ -74,8 +74,16 @@
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-978.49552)" />
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-978.49552)">
<rect
style="fill:#074335;fill-opacity:1;stroke-width:0.9818182"
id="rect817"
width="108"
height="108"
x="0"
y="978.49554"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@@ -0,0 +1,201 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="512"
height="512"
viewBox="0 0 512 512"
id="svg4826"
version="1.1"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="cone.bug.svg"
inkscape:export-filename="test.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<defs
id="defs4828">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4813">
<path
id="path4815"
d="m 256,24 c -10,0 -16.56131,4.44436 -22,10 -7.51989,7.68159 -14,30 -14,30 l -84,252 h -34 c -10.63636,0 -20.71454,9.30699 -24,20 L 43,456 c -4.67669,16.03434 -3,31.99999 19,32 h 194 194 c 22,-10e-6 23.67669,-15.96566 19,-32 L 434,336 c -3.28546,-10.69301 -13.36364,-20 -24,-20 H 376 L 292,64 c 0,0 -6.48011,-22.31841 -14,-30 -5.43869,-5.55564 -12,-10 -22,-10 z"
style="fill:#ff8800"
inkscape:connector-curvature="0" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4792">
<path
style="fill:#ff8800"
d="m 48.196759,963.10825 c -1.65441,1.23855 -2.321076,3.2256 -3.761719,7.51954 -1.440643,4.29394 -1.503906,4.51171 -1.503906,4.51171 l -5.265625,15.79688 -6.015625,18.05082 -3.007812,9.0234 h -6.34375 c -2,0 -3.860873,1.5107 -4.445313,3.5039 l -3.503906,11.9199 c -1.144783,3.9115 -2.279638,7.7947 -3.429687,11.7266 -0.481394,1.6434 0.0011,2.852 0.777343,3.6875 0.481014,0.5172 1.074588,0.8913 1.621094,1.1406 0.54688,0.2429 0.920775,0.3731 1.351562,0.3731 1.004345,0 18.539258,-0.01 36.572266,-0.01 v 0 c 18.033008,0 35.567921,0.01 36.572266,0.01 0.430787,0 0.804682,-0.1302 1.351562,-0.3731 0.546506,-0.2493 1.14008,-0.6234 1.621094,-1.1406 0.776228,-0.8355 1.258738,-2.0441 0.777344,-3.6875 -1.150049,-3.9319 -2.284905,-7.8151 -3.429688,-11.7266 l -3.503906,-11.9199 c -0.58444,-1.9932 -2.445313,-3.5039 -4.445313,-3.5039 h -6.34375 l -3.007812,-9.0234 -6.015625,-18.05082 -5.265625,-15.79688 c 0,0 -0.06885,-0.23443 -1.503906,-4.51171 -1.435052,-4.27728 -2.097358,-6.25133 -3.761719,-7.51954 -0.831195,-0.63336 -1.999923,-0.74609 -3.044922,-0.74609 -1.044999,0 -2.208378,0.11982 -3.044922,0.74609 z"
id="path4794"
inkscape:connector-curvature="0"
sodipodi:nodetypes="szccccscccccsccscccccscccczsas" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1097">
<path
style="fill:#ff8800"
d="m 256,24 c -10,0 -16.56131,4.44436 -22,10 -7.51989,7.68159 -14,30 -14,30 l -84,252 h -34 c -10.63636,0 -20.71454,9.30699 -24,20 L 43,456 c -4.67669,16.0344 -3,32 19,32 h 194 z"
id="path1099"
inkscape:connector-curvature="0" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1117">
<rect
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ff8800;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:markers fill stroke;enable-background:accumulate"
id="rect1119"
width="288"
height="544"
x="-384"
y="542.49548" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1140">
<path
style="fill:#ff8800"
d="m 256,24 c -10,0 -16.56131,4.44436 -22,10 -7.51989,7.68159 -14,30 -14,30 l -84,252 h -34 c -10.63636,0 -20.71454,9.30699 -24,20 L 43,456 c -4.67669,16.0344 -3,32 19,32 h 152 v -97.23047 c -0.0402,-1.5663 -0.0644,-3.13518 -0.0644,-4.70508 v -48 c 0,-74.19766 45.03727,-145.00385 113.73828,-167.04492 L 292,64 c 0,0 -6.48011,-22.31841 -14,-30 -5.43869,-5.55564 -12,-10 -22,-10 z"
id="path1142"
inkscape:connector-curvature="0" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1249">
<path
inkscape:connector-curvature="0"
style="fill:#ff8800"
d="m 1436,1198.4955 c -10,0 -16.5613,4.4444 -22,10 -7.5199,7.6816 -14,30 -14,30 l -84,252 h -34 c -10.6364,0 -20.7145,9.307 -24,20 l -35,120 c -4.6767,16.0343 -3,32 19,32 h 194 194 c 22,0 23.6767,-15.9657 19,-32 l -35,-120 c -3.2855,-10.693 -13.3636,-20 -24,-20 h -34 l -84,-252 c 0,0 -6.4801,-22.3184 -14,-30 -5.4387,-5.5556 -12,-10 -22,-10 z"
id="path1251" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.98953517"
inkscape:cx="264.93943"
inkscape:cy="199.6772"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
inkscape:window-width="1920"
inkscape:window-height="1016"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="true"
inkscape:snap-midpoints="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
inkscape:snap-grids="false"
inkscape:snap-to-guides="true"
inkscape:snap-global="true">
<inkscape:grid
type="xygrid"
id="grid821" />
</sodipodi:namedview>
<metadata
id="metadata4831">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-574.49552)">
<g
transform="matrix(0.62068966,0,0,0.62068966,193.06422,751.59897)"
id="g1590"
clip-path="url(#clipPath4813)">
<path
id="path1582"
d="m 256,24 c -10,0 -16.56131,4.444363 -22,10 -7.51989,7.681589 -14,30 -14,30 l -84,252 h -34 c -10.63636,0 -20.71454,9.30699 -24,20 L 43,456 c -4.67669,16.03434 -3,31.99999 19,32 h 194 194 c 22,-10e-6 23.67669,-15.96566 19,-32 L 434,336 c -3.28546,-10.69301 -13.36364,-20 -24,-20 H 376 L 292,64 c 0,0 -6.48011,-22.318411 -14,-30 -5.43869,-5.555637 -12,-10 -22,-10 z"
style="fill:#ff8800"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
id="path1584"
d="m 376,316 c 0,0 5.33596,15.99774 8,24 3.86569,11.61172 5.72158,17.44905 -0.0566,24.10156 C 352.00038,395.99957 301.0881,408.013 256,408 210.88287,407.987 160.2209,395.52936 128,364 L 244,480 H 43.53125 c 2.987307,4.87249 8.73663,8 18.46875,8 h 194 194 c 22,-10e-6 23.67669,-15.96566 19,-32 L 434,336 c -3.28546,-10.69301 -13.36364,-20 -24,-20 z"
style="fill:#f46e00;fill-opacity:1" />
<path
id="path1586"
sodipodi:nodetypes="cacccccssacsccacc"
inkscape:connector-curvature="0"
d="m 184,172 c 24,18 46.36799,27 72,27 25.63201,0 48,-9 72,-27 48,0 32,-108 -28,-84 -33.16814,17.49548 -55.99922,15.99974 -88,0 -60,-24 -76,84 -28,84 z m -48,144 c 0,0 -5.33263,16.0004 -8,24 -4.00162,12.00101 -6.03383,18.09576 0,24 32.2209,31.52936 82.88287,43.98701 128,44 45.0881,0.013 96,-12 127.94294,-43.89801 C 389.7212,357.44948 387.86569,351.61172 384,340 c -2.66404,-8.00226 -8,-24 -8,-24 28,0 0,-68 -16,-48 -32,32 -66.85763,40 -104,40 -37.14237,0 -72,-8 -104,-40 -16,-16 -44,48 -16,48 z"
style="fill:#fafafa" />
<path
sodipodi:nodetypes="sssss"
inkscape:connector-curvature="0"
id="path1588"
d="m 152,312 c -16.66494,51.58194 52.97315,57.34558 59.63772,19.87924 L 260,60 c 4.46875,-25.122067 -15.31793,-34.873087 -24,-8 z"
style="opacity:0.6;fill:#ffffff;fill-opacity:0.31372549;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#5555ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:markers fill stroke;enable-background:accumulate"
d="m 299.00781,203.59354 c 2.20467,-5.63119 2.87225,-11.79776 13.78516,-22.94531 C 319.51536,173.7815 335.21871,164.02148 352,164.02148 L 356.74023,164 c -8.14378,-16.49369 -18.59815,-31.32243 -30.90625,-43.87109 l 56.5586,-56.558598 -33.94141,-33.941406 -61.625,61.625 C 267.69608,81.466746 246.43068,76.021484 224,76.021484 c -22.43068,0 -43.69608,5.445122 -62.82617,15.232422 l -61.625002,-61.625 -33.941406,33.941406 56.558598,56.558598 c -12.3198,12.5606 -22.798217,27.37997 -30.945317,43.89257 H 24 v 48 H 75.318359 C 73.150559,223.62618 72,235.66528 72,248.02148 v 12 H 24 v 48 h 48 v 12 c 0,12.3562 1.150559,24.3953 3.318359,36 H 24 v 48 H 91.220703 C 110.0059,442.09553 141.49531,470.85705 179,484 L 216.18172,356.02127 H 168 v -48 h 96.0625 z M 168,212.02148 h 112 v 48 H 168 Z m 255.9375,48 0.0625,0.18946 v -0.18946 z"
transform="translate(0,574.49552)"
id="path1609"
inkscape:connector-curvature="0"
sodipodi:nodetypes="csccccccsccccccccsccccsccccccccccccccccccc" />
<g
transform="matrix(0.62068968,0,0,0.62068968,193.06421,395.01552)"
id="layer1-9">
<g
transform="translate(-0.00144695,1e-5)"
id="g1425">
<path
inkscape:connector-curvature="0"
style="fill:#ff8800"
d="m 256,24 c -10,0 -16.56131,4.44436 -22,10 -7.51989,7.68159 -14,30 -14,30 l -8,24 c 3.70307,1.851462 7.27985,3.499007 10.76758,4.955078 L 236,52 c 3.52709,-10.917193 8.88729,-15.789637 13.70898,-16.042969 0.22023,-0.01157 0.4385,-0.01342 0.65625,-0.0059 C 257.11548,36.185711 262.5704,45.549903 260,60 l -7.19727,40.46484 C 267.56737,101.25457 282.31468,97.328624 300,88 l -8,-24 c 0,0 -6.48011,-22.31841 -14,-30 -5.43869,-5.55564 -12,-10 -22,-10 z m -3.19727,76.46484 c -1.10786,-0.0592 -2.21678,-0.15334 -3.32617,-0.26562 1.10986,0.11219 2.21777,0.20634 3.32617,0.26562 z m -30.02734,-7.507809 c 2.57716,1.075758 5.1035,2.041285 7.5918,2.894531 -2.48916,-0.853977 -5.01393,-1.818482 -7.5918,-2.894531 z m 7.92188,3.007813 c 2.4658,0.836779 4.89553,1.563851 7.29882,2.175781 -2.40331,-0.6126 -4.83309,-1.338569 -7.29882,-2.175781 z m 7.60937,2.251953 c 1.0765,0.269945 2.14919,0.516329 3.2168,0.740234 -1.06829,-0.22431 -2.13961,-0.469818 -3.2168,-0.740234 z m 3.66211,0.835937 c 1.17282,0.239138 2.3407,0.453964 3.50586,0.636719 -1.16472,-0.182941 -2.33347,-0.397376 -3.50586,-0.636719 z m 3.66406,0.660157 c 1.05384,0.163008 2.10636,0.297739 3.15625,0.414059 -1.05045,-0.11643 -2.10184,-0.251011 -3.15625,-0.414059 z M 184,172 152,268 c 3.62821,3.62821 7.29525,6.93233 10.99609,9.9668 l 31.80274,-98.43946 C 191.22458,177.21556 187.63203,174.72402 184,172 Z m -21.00391,105.9668 c 0.93643,0.76781 1.8754,1.51637 2.81641,2.24804 -0.9409,-0.73162 -1.88008,-1.48031 -2.81641,-2.24804 z m 2.81641,2.24804 c 0.9289,0.72226 1.85963,1.42747 2.79297,2.11524 -0.93353,-0.68797 -1.86388,-1.39279 -2.79297,-2.11524 z M 328,172 c -24,18 -46.36799,27 -72,27 -6.99898,0 -13.7533,-0.67746 -20.36523,-2.01953 L 216.58203,304.08398 C 229.40419,306.94108 242.55158,308 256,308 c 37.14237,0 72,-8 104,-40 z M 216.58203,304.08398 c -1.14063,-0.25415 -2.27863,-0.52136 -3.41406,-0.80468 1.13545,0.28331 2.27342,0.55052 3.41406,0.80468 z m -47.90039,-21.69726 c 0.932,0.68576 1.86634,1.35569 2.80274,2.00781 -0.9363,-0.65215 -1.87084,-1.32206 -2.80274,-2.00781 z m 2.80274,2.00781 c 7.59972,5.2926 15.34481,9.49282 23.22656,12.78711 -7.8818,-3.29556 -15.62673,-7.49366 -23.22656,-12.78711 z m 23.22656,12.78711 c 0.98512,0.41175 1.97153,0.80943 2.96094,1.19336 -0.98952,-0.38411 -1.97572,-0.78141 -2.96094,-1.19336 z m 2.96094,1.19336 c 0.98921,0.38385 1.98114,0.75258 2.9746,1.10938 -0.99298,-0.35677 -1.98588,-0.72557 -2.9746,-1.10938 z m 2.97851,1.11133 c 0.96802,0.34762 1.93813,0.68321 2.91016,1.00586 -0.97254,-0.32292 -1.94164,-0.65793 -2.91016,-1.00586 z m 3.07617,1.06055 c 0.92273,0.30487 1.84712,0.59978 2.77344,0.88281 -0.92634,-0.28311 -1.8507,-0.57784 -2.77344,-0.88281 z m 3.125,0.98828 c 0.9306,0.28146 1.86268,0.55433 2.79688,0.81445 -0.93405,-0.26013 -1.86643,-0.53296 -2.79688,-0.81445 z m 2.79688,0.81445 c 1.13033,0.31473 2.26287,0.61398 3.39844,0.89844 -1.1353,-0.28447 -2.26838,-0.58372 -3.39844,-0.89844 z M 102,316 c -10.63636,0 -20.71454,9.30699 -24,20 L 43,456 c -2.607867,8.94128 -3.234416,17.85796 0.53125,24 H 244 L 128,364 c -6.03383,-5.90424 -4.00162,-11.99899 0,-24 2.66737,-7.9996 8,-24 8,-24 z M 44.150391,480.92578 c 0.161001,0.22282 0.331593,0.44011 0.505859,0.6543 -0.174455,-0.21453 -0.344685,-0.43113 -0.505859,-0.6543 z m 0.716797,0.9082 c 0.170632,0.20014 0.348314,0.39593 0.53125,0.5879 -0.182858,-0.19201 -0.360679,-0.38774 -0.53125,-0.5879 z m 0.765624,0.82813 c 0.188129,0.18839 0.381282,0.37288 0.582032,0.55273 -0.200699,-0.17994 -0.393946,-0.36426 -0.582032,-0.55273 z m 0.853516,0.78711 c 0.203345,0.17341 0.409084,0.345 0.625,0.50976 -0.215839,-0.16483 -0.421724,-0.33629 -0.625,-0.50976 z m 0.949219,0.74414 c 0.211944,0.15311 0.422802,0.30626 0.646484,0.45117 -0.223331,-0.14482 -0.434861,-0.29816 -0.646484,-0.45117 z m 1.074219,0.70898 c 0.208768,0.12629 0.41226,0.2557 0.630859,0.375 -0.218084,-0.11918 -0.422569,-0.24886 -0.630859,-0.375 z m 1.75,0.93555 c 0.179067,0.0819 0.369708,0.15482 0.554687,0.23242 -0.184691,-0.0776 -0.375896,-0.15056 -0.554687,-0.23242 z m 1.27539,0.52539 c 0.184492,0.0689 0.378319,0.13045 0.56836,0.19531 -0.189971,-0.0649 -0.383941,-0.1263 -0.56836,-0.19531 z m 1.369141,0.45508 c 0.21095,0.0631 0.429072,0.12144 0.646484,0.17969 -0.217763,-0.0584 -0.435211,-0.11646 -0.646484,-0.17969 z m 1.425781,0.37695 c 0.233553,0.0545 0.470272,0.10713 0.710938,0.15625 -0.240456,-0.0491 -0.477591,-0.10178 -0.710938,-0.15625 z m 1.617188,0.32422 c 0.216953,0.0369 0.433799,0.0728 0.65625,0.10547 -0.222133,-0.0327 -0.439607,-0.0686 -0.65625,-0.10547 z m 1.693359,0.23828 c 0.224339,0.0255 0.446138,0.0528 0.675781,0.0742 -0.229729,-0.0214 -0.451368,-0.0487 -0.675781,-0.0742 z m 1.833984,0.15821 c 0.21223,0.013 0.418242,0.0294 0.634766,0.0391 -0.216671,-0.01 -0.4224,-0.0261 -0.634766,-0.0391 z"
id="path4795-9"
transform="translate(0,574.49552)" />
<path
inkscape:connector-curvature="0"
style="fill:#f46e00;fill-opacity:1"
d="m 376,890.49552 c 0,0 5.33596,15.99774 8,24 3.86569,11.61172 5.72158,17.44905 -0.0566,24.10156 -31.94302,31.89801 -82.8553,43.91144 -127.9434,43.89844 -45.11713,-0.013 -95.7791,-12.47064 -128,-44 L 244,1054.4955 H 43.53125 c 2.987307,4.8725 8.73663,8 18.46875,8 h 194 194 c 22,0 23.67669,-15.9656 19,-32 L 434,910.49552 c -3.28546,-10.69301 -13.36364,-20 -24,-20 z"
id="path4790-6" />
<path
inkscape:connector-curvature="0"
style="fill:#fafafa"
d="m 212,88 -28,84 c 24,18 46.36799,27 72,27 25.63201,0 48,-9 72,-27 L 300,88 c -33.16814,17.49548 -55.99922,15.99974 -88,0 z m -60,180 -16,48 c 0,0 -5.33263,16.0004 -8,24 -4.00162,12.00101 -6.03383,18.09576 0,24 32.2209,31.52936 82.88287,43.98701 128,44 45.0881,0.013 96.00042,-12.00043 127.94336,-43.89844 5.77826,-6.65251 3.92229,-12.48984 0.0566,-24.10156 -2.66404,-8.00226 -8,-24 -8,-24 l -16,-48 c -32,32 -66.85763,40 -104,40 -37.14237,0 -72,-8 -104,-40 z"
id="path3151-2-6-0-0"
transform="translate(0,574.49552)" />
<path
inkscape:connector-curvature="0"
style="opacity:1;fill:#ff9e30;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 250.36523,35.951172 c -0.21775,-0.0076 -0.43602,-0.0057 -0.65625,0.0059 C 244.88729,36.210363 239.52709,41.082807 236,52 l -13.23242,40.955078 c 0.002,0.001 0.005,9.12e-4 0.008,0.002 2.592,1.081949 5.1304,2.052734 7.63281,2.910157 0.0963,0.03298 0.19288,0.06502 0.28907,0.09766 2.46573,0.837212 4.89551,1.563181 7.29882,2.175781 0.1036,0.02638 0.20705,0.05022 0.31055,0.07617 1.07719,0.270416 2.14851,0.515924 3.2168,0.740234 0.14775,0.03099 0.29575,0.0656 0.44336,0.0957 1.17303,0.239499 2.34246,0.453679 3.50781,0.636719 0.03,0.0047 0.0598,0.009 0.0898,0.01367 1.08392,0.168913 2.16444,0.306321 3.24414,0.425781 0.2208,0.0244 0.44144,0.048 0.66211,0.0703 1.11133,0.11254 2.22223,0.20626 3.33203,0.26562 L 260,60 c 2.5704,-14.450097 -2.88452,-23.814289 -9.63477,-24.048828 z m -55.5664,143.576168 -31.80274,98.43946 c 14.98119,12.28367 30.55008,19.89833 46.65235,24.38281 1.14895,0.31998 2.30072,0.62539 3.45508,0.91406 0.001,3.1e-4 0.003,-3e-4 0.004,0 0.002,5e-4 0.004,0.001 0.006,0.002 1.1536,0.2884 2.30979,0.56012 3.46875,0.81836 l 19.05274,-107.10351 c -7.59016,-1.54063 -14.99127,-3.98377 -22.35352,-7.29297 -0.39867,-0.17946 -0.79684,-0.36028 -1.19531,-0.54492 -1.35007,-0.62471 -2.69988,-1.2806 -4.04883,-1.96485 -0.2134,-0.10836 -0.42722,-0.21241 -0.64063,-0.32226 -0.81363,-0.41839 -1.62753,-0.84902 -2.4414,-1.28906 -1.68766,-0.91249 -3.37891,-1.87525 -5.07031,-2.88086 -1.69203,-1.00598 -3.38651,-2.05904 -5.08594,-3.15821 z"
id="path836"
transform="translate(0,574.49552)" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -1,8 +1,8 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext.android_plugin_version = '3.4.2'
ext.kotlin_version = '1.3.41'
ext.kotlinx_version = '1.2.2'
ext.android_plugin_version = '3.5.3'
ext.kotlin_version = '1.3.50'
ext.kotlinx_version = '1.3.1'
repositories {
flatDir dirs: "gradle/plugins"
google()
@@ -27,32 +27,32 @@ allprojects {
}
ext {
versionName = '3.2.0-beta-1'
versionCode = 3019100
libvlcVersion = '3.2-eap7'
medialibraryVersion = '0.5-eap7'
versionName = '3.2.7'
versionCode = 3020710
libvlcVersion = '3.2.4'
medialibraryVersion = '0.6.4'
minSdkVersion = 17
targetSdkVersion = 28
compileSdkVersion = 28
androidxLegacyVersion = '1.0.0'
androidxCoreVersion = '1.1.0-rc02'
androidxPreferencesVersion = '1.1.0-rc01'
androidxVersion = '1.1.0-rc01'
androidxActivityVersion = '1.0.0-rc01'
androidxFragmentVersion = '1.1.0-rc03'
androidxCoreVersion = '1.1.0'
androidxPreferencesVersion = '1.1.0'
androidxVersion = '1.1.0'
androidxActivityVersion = '1.0.0'
androidxFragmentVersion = '1.1.0'
androidxAnnotationVersion = '1.1.0'
androidxAppcompatVersion = '1.1.0-rc01'
androidxAppcompatVersion = '1.1.0'
androidxRecyclerviewVersion = '1.0.0'
androidxLeanbackVersion = '1.0.0'
androidxMaterialVersion = '1.0.0'
constraintLayoutVersion = '1.1.3'
archVersion = '2.1.0-rc01'
archVersion = '2.1.0'
roomVersion = '2.1.0'
pagingVersion = '2.1.0'
junitVersion = '4.12'
mockito = '2.8.9'
powerMock = '1.7.4'
retrofit = '2.6.0'
retrofit = '2.6.1'
espressoVersion = '3.1.1'
supportTest = '1.1.0'
// versionCode scheme is T M NN RR AA

View File

@@ -268,7 +268,6 @@ avlc_make_toolchain
###########################
VLC_BOOTSTRAP_ARGS="\
--disable-disc \
--enable-dvdread \
--enable-dvdnav \
--disable-dca \
@@ -297,6 +296,7 @@ VLC_BOOTSTRAP_ARGS="\
--disable-aribb25 \
--enable-mpg123 \
--enable-libdsm \
--enable-smb2 \
--enable-libarchive \
--disable-libmpeg2 \
--enable-soxr \
@@ -339,7 +339,7 @@ VLC_CONFIGURE_ARGS="\
--disable-v4l2 \
--enable-dvdread \
--enable-dvdnav \
--disable-bluray \
--enable-bluray \
--disable-linsys \
--disable-decklink \
--disable-libva \
@@ -378,6 +378,7 @@ VLC_CONFIGURE_ARGS="\
--disable-schroedinger \
--disable-vnc \
--enable-jpeg \
--enable-smb2 \
"
########################

View File

@@ -4,7 +4,7 @@
# ARGUMENTS #
#############
MEDIALIBRARY_HASH=062ddfa
MEDIALIBRARY_HASH=099bd5f2
while [ $# -gt 0 ]; do
case $1 in
@@ -56,7 +56,7 @@ if [ ! -d "${MEDIALIBRARY_MODULE_DIR}/${SQLITE_RELEASE}" ]; then
echo "Wrong sha1 for ${SQLITE_RELEASE}.tar.gz"
exit 1
fi
tar -xzf ${SQLITE_RELEASE}.tar.gz
tar -xozf ${SQLITE_RELEASE}.tar.gz
rm -f ${SQLITE_RELEASE}.tar.gz
fi
cd ${MEDIALIBRARY_MODULE_DIR}/${SQLITE_RELEASE}
@@ -89,6 +89,7 @@ if [ ! -d "${MEDIALIBRARY_MODULE_DIR}/medialibrary" ]; then
git clone http://code.videolan.org/videolan/medialibrary.git "${SRC_DIR}/medialibrary/medialibrary"
avlc_checkfail "medialibrary source: git clone failed"
cd ${MEDIALIBRARY_MODULE_DIR}/medialibrary
git checkout 0.6.x
git submodule update --init libvlcpp
else
cd ${MEDIALIBRARY_MODULE_DIR}/medialibrary

View File

@@ -10,12 +10,10 @@ diagnostic()
echo "$@" 1>&2;
}
checkfail()
fail()
{
if [ ! $? -eq 0 ];then
diagnostic "$1"
exit 1
fi
diagnostic "$1"
exit 1
}
# Try to check whether a patch file has already been applied to the current directory tree
@@ -238,6 +236,7 @@ if [ ! -d "$ANDROID_SDK/licenses" ]; then
mkdir "$ANDROID_SDK/licenses"
echo "24333f8a63b6825ea9c5514f83c2829b004d1fee" > "$ANDROID_SDK/licenses/android-sdk-license"
echo "d56f5187479451eabf01fb78af6dfcb131a6481e" >> "$ANDROID_SDK/licenses/android-sdk-license"
echo "24333f8a63b6825ea9c5514f83c2829b004d1fee" >> "$ANDROID_SDK/licenses/android-sdk-license"
fi
##########
@@ -246,19 +245,15 @@ fi
if [ ! -d "gradle/wrapper" ]; then
diagnostic "Downloading gradle"
GRADLE_VERSION=5.1.1
GRADLE_VERSION=5.4.1
GRADLE_URL=https://download.videolan.org/pub/contrib/gradle/gradle-${GRADLE_VERSION}-bin.zip
wget ${GRADLE_URL} 2>/dev/null || curl -O ${GRADLE_URL}
checkfail "gradle: download failed"
wget ${GRADLE_URL} 2>/dev/null || curl -O ${GRADLE_URL} || fail "gradle: download failed"
unzip -o gradle-${GRADLE_VERSION}-bin.zip
checkfail "gradle: unzip failed"
unzip -o gradle-${GRADLE_VERSION}-bin.zip || fail "gradle: unzip failed"
./gradle-${GRADLE_VERSION}/bin/gradle wrapper
checkfail "gradle: wrapper failed"
./gradle-${GRADLE_VERSION}/bin/gradle wrapper || fail "gradle: wrapper failed"
./gradlew -version
checkfail "gradle: wrapper failed"
./gradlew -version || fail "gradle: wrapper failed"
chmod a+x gradlew
rm -rf gradle-${GRADLE_VERSION}-bin.zip
fi
@@ -270,20 +265,17 @@ fi
# Fetch VLC source #
####################
TESTED_HASH=ee139ff
TESTED_HASH=b86899a
VLC_REPOSITORY=https://git.videolan.org/git/vlc/vlc-3.0.git
if [ ! -d "vlc" ]; then
diagnostic "VLC sources: not found, cloning"
git clone "${VLC_REPOSITORY}" vlc
checkfail "VLC sources: git clone failed"
git clone "${VLC_REPOSITORY}" vlc || fail "VLC sources: git clone failed"
cd vlc
diagnostic "VLC sources: resetting to the TESTED_HASH commit (${TESTED_HASH})"
git reset --hard ${TESTED_HASH}
checkfail "VLC sources: TESTED_HASH ${TESTED_HASH} not found"
git reset --hard ${TESTED_HASH} || fail "VLC sources: TESTED_HASH ${TESTED_HASH} not found"
diagnostic "VLC sources: applying custom patches"
# Keep Message-Id inside commits description to track them afterwards
git am --message-id ../libvlc/patches/vlc3/*.patch
checkfail "VLC sources: cannot apply custom patches"
git am --message-id ../libvlc/patches/vlc3/*.patch || fail "VLC sources: cannot apply custom patches"
cd ..
else
diagnostic "VLC source: found sources, leaving untouched"
@@ -294,8 +286,8 @@ else
diagnostic "VLC sources: Checking TESTED_HASH and patches presence"
diagnostic "NOTE: checks can be bypass by adding '-b' option to this script."
cd vlc
git cat-file -e ${TESTED_HASH} 2> /dev/null
checkfail "Error: Your vlc checkout does not contain the latest tested commit: ${TESTED_HASH}"
git cat-file -e ${TESTED_HASH} 2> /dev/null || \
fail "Error: Your vlc checkout does not contain the latest tested commit: ${TESTED_HASH}"
for patch_file in ../libvlc/patches/vlc3/*.patch; do
check_patch_is_applied "$patch_file"
done

View File

@@ -4,4 +4,4 @@ android.databinding.incremental=true
kapt.incremental.apt=true
kapt.use.worker.api=true
kapt.include.compile.classpath=false
org.gradle.jvmargs=-Xmx4g -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

View File

@@ -4,7 +4,7 @@ apply plugin: 'com.github.dcendents.android-maven'
def abi = System.getenv('GRADLE_ABI')?.toLowerCase()
def vlcSrcDirs = System.getenv('GRADLE_VLC_SRC_DIRS')
ext {
library_version = '3.2-eap7'
library_version = '3.2.4'
repoName = 'Android'
libraryName = 'LibVLC-Android'
lib_artifact = "libvlc-$abi"

File diff suppressed because it is too large Load Diff

View File

@@ -1,10 +1,8 @@
From 169d059c034fbda81ed5bca4a838fa1157824c51 Mon Sep 17 00:00:00 2001
Message-Id: <169d059c034fbda81ed5bca4a838fa1157824c51.1564134421.git.nobody@example.com>
In-Reply-To: <9aa0e90dbc4468ddb3364cd9a7eb0bb54627ef3b.1564134421.git.nobody@example.com>
References: <9aa0e90dbc4468ddb3364cd9a7eb0bb54627ef3b.1564134421.git.nobody@example.com>
From 253998cefd559e3e1103788d6a6c7466ec5f1faa Mon Sep 17 00:00:00 2001
Message-Id: <253998cefd559e3e1103788d6a6c7466ec5f1faa.1571382591.git.thomas@gllm.fr>
From: =?UTF-8?q?Hugo=20Beauz=C3=A9e-Luyssen?= <hugo@beauzee.fr>
Date: Thu, 28 Mar 2019 15:23:48 +0100
Subject: [PATCH 2/6] compat: Workaround sendmsg bug on android
Subject: [PATCH 1/5] compat: Workaround sendmsg bug on android
This only happens on 64bits builds, see compat/sendmsg.c comments
---
@@ -49,7 +47,7 @@ index 0f42e782f8..8d69048746 100644
#else
#error sendmsg not implemented on your platform!
diff --git a/configure.ac b/configure.ac
index afe1ce93ae..c0c0b6109a 100644
index 3f98f90b86..0dc30ed100 100644
--- a/configure.ac
+++ b/configure.ac
@@ -365,6 +365,9 @@ AS_IF([test "$SYS" = linux],[
@@ -63,7 +61,7 @@ index afe1ce93ae..c0c0b6109a 100644
AC_MSG_RESULT([no])
])
diff --git a/include/vlc_network.h b/include/vlc_network.h
index 184c23acae..6a43fd7d8b 100644
index 010454a01c..1b36e3d574 100644
--- a/include/vlc_network.h
+++ b/include/vlc_network.h
@@ -290,6 +290,12 @@ static inline void net_SetPort (struct sockaddr *addr, uint16_t port)

View File

@@ -1,10 +1,10 @@
From 75f1a7b60b8927a35788e7a8a8fd3d804e273e7f Mon Sep 17 00:00:00 2001
Message-Id: <75f1a7b60b8927a35788e7a8a8fd3d804e273e7f.1564134421.git.nobody@example.com>
In-Reply-To: <9aa0e90dbc4468ddb3364cd9a7eb0bb54627ef3b.1564134421.git.nobody@example.com>
References: <9aa0e90dbc4468ddb3364cd9a7eb0bb54627ef3b.1564134421.git.nobody@example.com>
From 72117752e2fb99e51fa170d125e8c617a2c7d4da Mon Sep 17 00:00:00 2001
Message-Id: <72117752e2fb99e51fa170d125e8c617a2c7d4da.1571382591.git.thomas@gllm.fr>
In-Reply-To: <253998cefd559e3e1103788d6a6c7466ec5f1faa.1571382591.git.thomas@gllm.fr>
References: <253998cefd559e3e1103788d6a6c7466ec5f1faa.1571382591.git.thomas@gllm.fr>
From: Soomin Lee <bubu@mikan.io>
Date: Thu, 27 Sep 2018 18:40:39 +0200
Subject: [PATCH 3/6] libvlc: events: Add callbacks for record
Subject: [PATCH 2/5] libvlc: events: Add callbacks for record
---
include/vlc/libvlc_events.h | 9 +++++++++

View File

@@ -1,10 +1,10 @@
From ba053f9821e050bc56e04d9a94851f4a7db4fa89 Mon Sep 17 00:00:00 2001
Message-Id: <ba053f9821e050bc56e04d9a94851f4a7db4fa89.1564134421.git.nobody@example.com>
In-Reply-To: <9aa0e90dbc4468ddb3364cd9a7eb0bb54627ef3b.1564134421.git.nobody@example.com>
References: <9aa0e90dbc4468ddb3364cd9a7eb0bb54627ef3b.1564134421.git.nobody@example.com>
From a9b5c1b34459d6ba866beb20ba86d1d6cc61c0db Mon Sep 17 00:00:00 2001
Message-Id: <a9b5c1b34459d6ba866beb20ba86d1d6cc61c0db.1571382591.git.thomas@gllm.fr>
In-Reply-To: <253998cefd559e3e1103788d6a6c7466ec5f1faa.1571382591.git.thomas@gllm.fr>
References: <253998cefd559e3e1103788d6a6c7466ec5f1faa.1571382591.git.thomas@gllm.fr>
From: =?UTF-8?q?Hugo=20Beauz=C3=A9e-Luyssen?= <hugo@beauzee.fr>
Date: Fri, 29 Mar 2019 10:56:26 +0100
Subject: [PATCH 4/6] network: tls: Handle errors from older kernels
Subject: [PATCH 3/5] network: tls: Handle errors from older kernels
If MSG_FASTOPEN is defined, but turns out to be unimplemented by the
underlying kernel (as is the case on android where the NDK claims to

View File

@@ -1,10 +1,10 @@
From 8f5d6b8889b38a6b3e1bc1ee6ce8776270542335 Mon Sep 17 00:00:00 2001
Message-Id: <8f5d6b8889b38a6b3e1bc1ee6ce8776270542335.1564134421.git.nobody@example.com>
In-Reply-To: <9aa0e90dbc4468ddb3364cd9a7eb0bb54627ef3b.1564134421.git.nobody@example.com>
References: <9aa0e90dbc4468ddb3364cd9a7eb0bb54627ef3b.1564134421.git.nobody@example.com>
From f1bcdad49eb0da544ec0d4899c302e00c0804cf9 Mon Sep 17 00:00:00 2001
Message-Id: <f1bcdad49eb0da544ec0d4899c302e00c0804cf9.1571382591.git.thomas@gllm.fr>
In-Reply-To: <253998cefd559e3e1103788d6a6c7466ec5f1faa.1571382591.git.thomas@gllm.fr>
References: <253998cefd559e3e1103788d6a6c7466ec5f1faa.1571382591.git.thomas@gllm.fr>
From: Soomin Lee <bubu@mikan.io>
Date: Mon, 1 Oct 2018 15:37:57 +0200
Subject: [PATCH 5/6] access_output: file: Add error dialog for write/open
Subject: [PATCH 4/5] access_output: file: Add error dialog for write/open
---
modules/access_output/file.c | 8 ++++++++

View File

@@ -1,10 +1,10 @@
From ddc4593d365193d19834eef88e717aded08f2f54 Mon Sep 17 00:00:00 2001
Message-Id: <ddc4593d365193d19834eef88e717aded08f2f54.1564134421.git.nobody@example.com>
In-Reply-To: <9aa0e90dbc4468ddb3364cd9a7eb0bb54627ef3b.1564134421.git.nobody@example.com>
References: <9aa0e90dbc4468ddb3364cd9a7eb0bb54627ef3b.1564134421.git.nobody@example.com>
From 360c58b6cb05568c39aac668c6bb3ba6a5a9d29e Mon Sep 17 00:00:00 2001
Message-Id: <360c58b6cb05568c39aac668c6bb3ba6a5a9d29e.1571382591.git.thomas@gllm.fr>
In-Reply-To: <253998cefd559e3e1103788d6a6c7466ec5f1faa.1571382591.git.thomas@gllm.fr>
References: <253998cefd559e3e1103788d6a6c7466ec5f1faa.1571382591.git.thomas@gllm.fr>
From: Soomin Lee <bubu@mikan.io>
Date: Wed, 31 Oct 2018 10:08:55 +0100
Subject: [PATCH 6/6] libvlc: media_player: Add record method
Subject: [PATCH 5/5] libvlc: media_player: Add record method
---
include/vlc/libvlc_media_player.h | 13 +++++++++++++

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="black">#000000</color>
</resources>

View File

@@ -186,7 +186,7 @@ class VideoHelper implements IVLCVout.OnNewVideoLayoutListener {
@TargetApi(Build.VERSION_CODES.N)
void updateVideoSurfaces() {
if (mMediaPlayer == null || mMediaPlayer.isReleased()) return;
if (mMediaPlayer == null || mMediaPlayer.isReleased() || !mMediaPlayer.getVLCVout().areViewsAttached()) return;
final boolean isPrimary = mDisplayManager == null || mDisplayManager.isPrimary();
final Activity activity = isPrimary && mVideoSurfaceFrame.getContext() instanceof Activity ? (Activity) mVideoSurfaceFrame.getContext() : null;

View File

@@ -8,13 +8,13 @@ import android.view.TextureView;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import org.videolan.R;
import org.videolan.libvlc.MediaPlayer;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import org.videolan.R;
import org.videolan.libvlc.MediaPlayer;
/**
* VLC-ready layout which includes 2 {@link SurfaceView} (video+subtitles) and 1 {@link TextureView}
* All these surfaces are stubs, only the relevant one(s) will be inflated
@@ -50,7 +50,7 @@ public class VLCVideoLayout extends FrameLayout {
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
setBackgroundColor(getResources().getColor(android.R.color.black));
setBackgroundResource(R.color.black);
final ViewGroup.LayoutParams lp = getLayoutParams();
lp.height = ViewGroup.LayoutParams.MATCH_PARENT;
lp.width = ViewGroup.LayoutParams.MATCH_PARENT;

View File

@@ -25,7 +25,7 @@ apply plugin: 'com.github.dcendents.android-maven'
def abi = System.getenv('GRADLE_ABI')?.toLowerCase()
ext {
library_version = '0.5-eap7'
library_version = '0.6.4'
repoName = 'Android'
libraryName = 'Medialibrary-Android'
lib_artifact = "medialibrary-$abi"
@@ -99,7 +99,7 @@ dependencies {
api "androidx.core:core:$rootProject.ext.androidxCoreVersion"
api "androidx.fragment:fragment:$rootProject.ext.androidxVersion"
testImplementation "junit:junit:$rootProject.ext.junitVersion"
testImplementation "org.robolectric:robolectric:4.2"
testImplementation "org.robolectric:robolectric:4.2.1"
}

View File

@@ -60,6 +60,12 @@ AndroidMediaLibrary::start()
m_started = true;
}
void
AndroidMediaLibrary::clearDatabase(bool restorePlaylists) {
p_ml->clearDatabase(restorePlaylists);
}
bool
AndroidMediaLibrary::addDevice(const std::string& uuid, const std::string& path, bool removable)
{
@@ -504,6 +510,32 @@ medialibrary::Query<medialibrary::IFolder> AndroidMediaLibrary::subFolders(int64
return folder != nullptr ? folder->subfolders(params) : nullptr;
}
medialibrary::Query<medialibrary::IVideoGroup>
AndroidMediaLibrary::videoGroups( const medialibrary::QueryParameters* params )
{
return p_ml->videoGroups(params);
}
void
AndroidMediaLibrary::setVideoGroupsPrefixLength( uint32_t prefixLength )
{
p_ml->setVideoGroupsPrefixLength(prefixLength);
}
medialibrary::Query<medialibrary::IMedia>
AndroidMediaLibrary::mediaFromVideoGroup(const std::string& name, const medialibrary::QueryParameters* params )
{
medialibrary::VideoGroupPtr group = p_ml->videoGroup(name);
return group != nullptr ? group->media(params) : nullptr;
}
medialibrary::Query<medialibrary::IMedia>
AndroidMediaLibrary::searchFromVideoGroup( const std::string& name, const std::string& query, const medialibrary::QueryParameters* params )
{
auto group = p_ml->videoGroup(name);
return group == nullptr ? nullptr : group->searchMedia(query, params);
}
void
AndroidMediaLibrary::requestThumbnail( int64_t media_id, medialibrary::ThumbnailSizeType sizeType, uint32_t desiredWidth,
uint32_t desiredHeight, float position )
@@ -556,45 +588,16 @@ AndroidMediaLibrary::onMediaAdded( std::vector<medialibrary::MediaPtr> mediaList
}
}
void AndroidMediaLibrary::onMediaModified( std::vector<medialibrary::MediaPtr> mediaList )
void AndroidMediaLibrary::onMediaModified( std::vector<int64_t> mediaIds )
{
if (m_mediaUpdatedType & FLAG_MEDIA_UPDATED_AUDIO || m_mediaUpdatedType & FLAG_MEDIA_UPDATED_VIDEO
|| m_mediaUpdatedType & FLAG_MEDIA_UPDATED_AUDIO_EMPTY) {
JNIEnv *env = getEnv();
if (env == NULL)
return;
jobjectArray mediaRefs, results;
int index;
if ((m_mediaUpdatedType & (FLAG_MEDIA_UPDATED_AUDIO|FLAG_MEDIA_UPDATED_VIDEO)) == 0)
if (weak_thiz)
{
index = 0;
mediaRefs = (jobjectArray) env->NewObjectArray(0, p_fields->MediaWrapper.clazz, NULL);
} else
{
mediaRefs = (jobjectArray) env->NewObjectArray(mediaList.size(), p_fields->MediaWrapper.clazz, NULL);
index = -1;
jobject item;
for (medialibrary::MediaPtr const& media : mediaList) {
medialibrary::IMedia::Type type = media->type();
if ((type == medialibrary::IMedia::Type::Audio && m_mediaUpdatedType & FLAG_MEDIA_UPDATED_AUDIO) ||
(type == medialibrary::IMedia::Type::Video && m_mediaUpdatedType & FLAG_MEDIA_UPDATED_VIDEO))
item = mediaToMediaWrapper(env, p_fields, media);
else
item = nullptr;
env->SetObjectArrayElement(mediaRefs, ++index, item);
if (item != nullptr)
env->DeleteLocalRef(item);
}
}
if (index > -1)
{
results = filteredArray(env, mediaRefs, p_fields->MediaWrapper.clazz, -1);
if (weak_thiz)
{
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onMediaUpdatedId, results);
env->DeleteLocalRef(results);
} else
env->DeleteLocalRef(mediaRefs);
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onMediaUpdatedId);
}
}
}
@@ -618,7 +621,7 @@ void AndroidMediaLibrary::onArtistsAdded( std::vector<medialibrary::ArtistPtr> a
}
}
void AndroidMediaLibrary::onArtistsModified( std::vector<medialibrary::ArtistPtr> artist )
void AndroidMediaLibrary::onArtistsModified( std::vector<int64_t> artistsIds )
{
if (m_mediaUpdatedType & (FLAG_MEDIA_UPDATED_AUDIO|FLAG_MEDIA_UPDATED_AUDIO_EMPTY))
{
@@ -656,7 +659,7 @@ void AndroidMediaLibrary::onAlbumsAdded( std::vector<medialibrary::AlbumPtr> alb
}
}
void AndroidMediaLibrary::onAlbumsModified( std::vector<medialibrary::AlbumPtr> albums )
void AndroidMediaLibrary::onAlbumsModified( std::vector<int64_t> albums )
{
if (m_mediaUpdatedType & (FLAG_MEDIA_UPDATED_AUDIO|FLAG_MEDIA_UPDATED_AUDIO_EMPTY))
{
@@ -683,7 +686,7 @@ void AndroidMediaLibrary::onPlaylistsAdded( std::vector<medialibrary::PlaylistPt
}
void AndroidMediaLibrary::onPlaylistsModified( std::vector<medialibrary::PlaylistPtr> playlist )
void AndroidMediaLibrary::onPlaylistsModified( std::vector<int64_t> playlist )
{
if (m_mediaUpdatedType & (FLAG_MEDIA_UPDATED_AUDIO|FLAG_MEDIA_UPDATED_AUDIO_EMPTY))
{
@@ -722,7 +725,7 @@ void AndroidMediaLibrary::onGenresAdded( std::vector<medialibrary::GenrePtr> )
}
}
void AndroidMediaLibrary::onGenresModified( std::vector<medialibrary::GenrePtr> )
void AndroidMediaLibrary::onGenresModified( std::vector<int64_t> )
{
if (m_mediaUpdatedType & (FLAG_MEDIA_UPDATED_AUDIO|FLAG_MEDIA_UPDATED_AUDIO_EMPTY))
{
@@ -890,6 +893,13 @@ void AndroidMediaLibrary::onParsingStatsUpdated( uint32_t percent)
}
}
void AndroidMediaLibrary::onHistoryChanged( medialibrary::HistoryType )
{
}
void AndroidMediaLibrary::onRescanStarted()
{
}
void AndroidMediaLibrary::onBackgroundTasksIdleChanged( bool isIdle )
{
@@ -911,6 +921,17 @@ void AndroidMediaLibrary::onMediaThumbnailReady( medialibrary::MediaPtr media, m
}
}
bool AndroidMediaLibrary::onUnhandledException( const char* context, const char* errMsg, bool clearSuggested )
{
JNIEnv *env = getEnv();
jstring ctx = env->NewStringUTF(context);
jstring msg = env->NewStringUTF(errMsg);
env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onUnhandledExceptionId, ctx, msg, clearSuggested);
env->DeleteLocalRef(ctx);
env->DeleteLocalRef(msg);
return true;
}
JNIEnv *
AndroidMediaLibrary::getEnv() {
JNIEnv *env = (JNIEnv *)pthread_getspecific(jni_env_key);

View File

@@ -11,12 +11,12 @@
#include "AndroidDeviceLister.h"
#include "utils.h"
#include <medialibrary/IAlbum.h>
#include <medialibrary/IArtist.h>
#include <medialibrary/IGenre.h>
#include <medialibrary/IPlaylist.h>
#include <medialibrary/IFolder.h>
#include <medialibrary/IVideoGroup.h>
#include <medialibrary/Types.h>
#include <medialibrary/IDeviceLister.h>
#include <medialibrary/IMedia.h>
@@ -32,6 +32,7 @@ public:
medialibrary::InitializeResult initML(const std::string& dbPath, const std::string& thumbsPath);
void start();
bool addDevice(const std::string& uuid, const std::string& path, bool removable);
void clearDatabase(bool restorePlaylists);
std::vector<std::tuple<std::string, std::string, bool>> devices();
bool removeDevice(const std::string& uuid, const std::string& path);
void banFolder(const std::string& path);
@@ -78,6 +79,7 @@ public:
medialibrary::MediaPtr addStream(const std::string& mrl, const std::string& title);
medialibrary::Query<medialibrary::IMedia> videoFiles( const medialibrary::QueryParameters* params = nullptr );
medialibrary::Query<medialibrary::IMedia> audioFiles( const medialibrary::QueryParameters* params = nullptr );
medialibrary::Query<medialibrary::IVideoGroup> videoGroups( const medialibrary::QueryParameters* params );
medialibrary::Query<medialibrary::IAlbum> albums(const medialibrary::QueryParameters* params);
medialibrary::AlbumPtr album(int64_t albumId);
medialibrary::Query<medialibrary::IArtist> artists(bool includeAll, const medialibrary::QueryParameters* params);
@@ -98,6 +100,10 @@ public:
medialibrary::Query<medialibrary::IMedia> mediaFromFolder(int64_t folderId, medialibrary::IMedia::Type type, const medialibrary::QueryParameters* params = nullptr );
medialibrary::Query<medialibrary::IFolder> folders(const medialibrary::QueryParameters* params = nullptr, medialibrary::IMedia::Type type = medialibrary::IMedia::Type::Unknown );
medialibrary::Query<medialibrary::IFolder> subFolders(int64_t folderId, const medialibrary::QueryParameters* params = nullptr );
// VideoGroups
void setVideoGroupsPrefixLength( uint32_t prefixLength );
medialibrary::Query<medialibrary::IMedia> mediaFromVideoGroup(const std::string& name, const medialibrary::QueryParameters* params );
medialibrary::Query<medialibrary::IMedia> searchFromVideoGroup( const std::string& name, const std::string& query, const medialibrary::QueryParameters* params );
//PLaylists
bool playlistAppend(int64_t playlistId, int64_t mediaId);
bool playlistAdd(int64_t playlistId, int64_t mediaId, unsigned int position);
@@ -109,23 +115,23 @@ public:
uint32_t desiredHeight, float position );
void onMediaAdded( std::vector<medialibrary::MediaPtr> media );
void onMediaModified( std::vector<medialibrary::MediaPtr> media ) ;
void onMediaModified( std::vector<int64_t> media ) ;
void onMediaDeleted( std::vector<int64_t> ids ) ;
void onArtistsAdded( std::vector<medialibrary::ArtistPtr> artists ) ;
void onArtistsModified( std::vector<medialibrary::ArtistPtr> artist );
void onArtistsModified( std::vector<int64_t> artist );
void onArtistsDeleted( std::vector<int64_t> ids );
void onAlbumsAdded( std::vector<medialibrary::AlbumPtr> albums );
void onAlbumsModified( std::vector<medialibrary::AlbumPtr> albums );
void onAlbumsModified( std::vector<int64_t> albums );
void onAlbumsDeleted( std::vector<int64_t> ids );
void onPlaylistsAdded( std::vector<medialibrary::PlaylistPtr> playlists );
void onPlaylistsModified( std::vector<medialibrary::PlaylistPtr> playlist );
void onPlaylistsModified( std::vector<int64_t> playlist );
void onPlaylistsDeleted( std::vector<int64_t> ids );
void onGenresAdded( std::vector<medialibrary::GenrePtr> );
void onGenresModified( std::vector<medialibrary::GenrePtr> );
void onGenresModified( std::vector<int64_t> );
void onGenresDeleted( std::vector<int64_t> );
void onDiscoveryStarted( const std::string& entryPoint );
@@ -141,6 +147,10 @@ public:
void onBackgroundTasksIdleChanged( bool isIdle );
void onMediaThumbnailReady(medialibrary::MediaPtr media, medialibrary::ThumbnailSizeType sizeType,
bool success );
void onHistoryChanged( medialibrary::HistoryType historyType );
bool onUnhandledException( const char* /* context */, const char* /* errMsg */, bool /* clearSuggested */ );
void onRescanStarted();
private:
void jni_detach_thread(void *data);

View File

@@ -5,10 +5,12 @@
#include <jni.h>
#include <medialibrary/IDeviceLister.h>
#include <medialibrary/filesystem/IDevice.h>
#define LOG_TAG "VLC/JNI/MediaLibrary"
#include "log.h"
#include "utils.h"
#include "AndroidMediaLibrary.h"
#include <medialibrary/filesystem/Errors.h>
static JavaVM *myVm;
static fields ml_fields;
@@ -54,6 +56,11 @@ release(JNIEnv* env, jobject thiz)
MediaLibrary_setInstance(env, thiz, NULL);
}
void
clearDatabase(JNIEnv* env, jobject thiz, jboolean restorePlaylists) {
MediaLibrary_getInstance(env, thiz)->clearDatabase(restorePlaylists);
}
void
banFolder(JNIEnv* env, jobject thiz, jstring folderPath)
{
@@ -1021,7 +1028,11 @@ searchFromAlbum(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jstri
};
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
const auto query = aml->searchFromAlbum(id, queryChar, &params);
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
if (query == nullptr)
{
env->ReleaseStringUTFChars(filterQuery, queryChar);
return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
}
std::vector<medialibrary::MediaPtr> mediaList = nbItems != 0 ? query->items(nbItems, offset) : query->all();
jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL);
int index = -1;
@@ -1099,7 +1110,11 @@ searchFromArtist(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jstr
};
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
const auto query = aml->searchFromArtist(id, queryChar, &params);
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
if (query == nullptr)
{
env->ReleaseStringUTFChars(filterQuery, queryChar);
return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
}
std::vector<medialibrary::MediaPtr> mediaList = nbItems != 0 ? query->items(nbItems, offset) : query->all();
jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL);
int index = -1;
@@ -1178,7 +1193,11 @@ searchAlbumsFromArtist(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id
};
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
const auto query = aml->searchAlbumsFromArtist(id, queryChar, &params);
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.Album.clazz, NULL);
if (query == nullptr)
{
env->ReleaseStringUTFChars(filterQuery, queryChar);
return (jobjectArray) env->NewObjectArray(0, ml_fields.Album.clazz, NULL);
}
std::vector<medialibrary::AlbumPtr> albums = nbItems != 0 ? query->items(nbItems, offset) : query->all();
jobjectArray albumsRefs = (jobjectArray) env->NewObjectArray(albums.size(), ml_fields.Album.clazz, NULL);
int index = -1;
@@ -1270,7 +1289,11 @@ searchMediaFromGenre(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id,
};
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
const auto query = aml->searchFromGenre(id, queryChar, &params);
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
if (query == nullptr)
{
env->ReleaseStringUTFChars(filterQuery, queryChar);
return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
}
std::vector<medialibrary::MediaPtr> mediaList = nbItems != 0 ? query->items(nbItems, offset) : query->all();
jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL);
int index = -1;
@@ -1349,7 +1372,11 @@ searchAlbumsFromGenre(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id,
};
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
const auto query = aml->searchAlbumsFromGenre(id, queryChar, &params);
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.Album.clazz, NULL);
if (query == nullptr)
{
env->ReleaseStringUTFChars(filterQuery, queryChar);
return (jobjectArray) env->NewObjectArray(0, ml_fields.Album.clazz, NULL);
}
std::vector<medialibrary::AlbumPtr> albums = nbItems != 0 ? query->items(nbItems, offset) : query->all();
jobjectArray albumsRefs = (jobjectArray) env->NewObjectArray(albums.size(), ml_fields.Album.clazz, NULL);
int index = -1;
@@ -1430,7 +1457,7 @@ getMediaLongMetadata(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id,
medialibrary::MediaPtr media = aml->media(id);
if (media == nullptr) return 0L;
const medialibrary::IMetadata& metadata = media->metadata((medialibrary::IMedia::MetadataType)metadataType);
return metadata.isSet() ? metadata.integer() : 0L;
return metadata.isSet() ? metadata.asInt() : 0L;
}
jobject
@@ -1440,7 +1467,7 @@ getMediaStringMetadata(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id
medialibrary::MediaPtr media = aml->media(id);
if (media == nullptr) return 0L;
const medialibrary::IMetadata& metadata = media->metadata((medialibrary::IMedia::MetadataType)metadataType);
return metadata.isSet() ? env->NewStringUTF(metadata.str().c_str()) : nullptr;
return metadata.isSet() ? env->NewStringUTF(metadata.asStr().c_str()) : nullptr;
}
void
@@ -1541,7 +1568,11 @@ searchFromPlaylist(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, js
};
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
const auto query = aml->searchFromPLaylist(id, queryChar);
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
if (query == nullptr)
{
env->ReleaseStringUTFChars(filterQuery, queryChar);
return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
}
std::vector<medialibrary::MediaPtr> mediaList = nbItems != 0 ? query->items(nbItems, offset) : query->all();
jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL);
int index = -1;
@@ -1649,7 +1680,11 @@ searchMediaFromFolder(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id,
};
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
const auto query = aml->searchFromFolder(id, queryChar, (medialibrary::IMedia::Type)mediaType, &params);
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
if (query == nullptr)
{
env->ReleaseStringUTFChars(filterQuery, queryChar);
return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
}
std::vector<medialibrary::MediaPtr> mediaList = nbItems != 0 ? query->items(nbItems, offset) : query->all();
jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL);
int index = -1;
@@ -1709,9 +1744,16 @@ folders(JNIEnv* env, jobject thiz, jint type, jint sortingCriteria, jboolean des
jobjectArray foldersRefs = (jobjectArray) env->NewObjectArray(foldersList.size(), ml_fields.Folder.clazz, NULL);
int index = -1;
for(medialibrary::FolderPtr const& folder : foldersList) {
jobject item = convertFolderObject(env, &ml_fields, folder);
env->SetObjectArrayElement(foldersRefs, ++index, item);
env->DeleteLocalRef(item);
try
{
jobject item = convertFolderObject(env, &ml_fields, folder);
env->SetObjectArrayElement(foldersRefs, ++index, item);
env->DeleteLocalRef(item);
}
catch( const medialibrary::fs::errors::DeviceRemoved& )
{
// Ignore this folder since it's on a removed device.
}
}
return foldersRefs;
}
@@ -1722,6 +1764,124 @@ foldersCount(JNIEnv* env, jobject thiz, jint type) {
return (jint) (query != nullptr ? query->count() : 0);
}
/*
* Video groups
*/
void
setVideoGroupsPrefixLength( JNIEnv* env, jobject thiz, jint prefixLength )
{
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
aml->setVideoGroupsPrefixLength(static_cast<uint32_t>(prefixLength));
}
jobjectArray
videoGroups(JNIEnv* env, jobject thiz, jint sortingCriteria, jboolean desc, jint nbItems, jint offset ) {
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
medialibrary::QueryParameters params {
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
static_cast<bool>( desc )
};
const auto query = aml->videoGroups(&params);
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.VideoGroup.clazz, NULL);
std::vector<medialibrary::VideoGroupPtr> groupsList = nbItems != 0 ? query->items(nbItems, offset) : query->all();
jobjectArray groupsRefs = (jobjectArray) env->NewObjectArray(groupsList.size(), ml_fields.VideoGroup.clazz, NULL);
int index = -1;
for(medialibrary::VideoGroupPtr const& group : groupsList) {
try
{
jobject item = convertVideoGroupObject(env, &ml_fields, group);
env->SetObjectArrayElement(groupsRefs, ++index, item);
env->DeleteLocalRef(item);
}
catch( const medialibrary::fs::errors::DeviceRemoved& )
{
// Ignore this VideoGroup since it's on a removed device.
}
}
return groupsRefs;
}
jint
videoGroupsCount(JNIEnv* env, jobject thiz) {
const auto query = MediaLibrary_getInstance(env, thiz)->videoGroups(nullptr);
return (jint) (query != nullptr ? query->count() : 0);
}
jobjectArray
getPagedMediaFromvideoGroup(JNIEnv* env, jobject thiz, jobject medialibrary, jstring name, jint sortingCriteria, jboolean desc, jint nbItems, jint offset)
{
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
medialibrary::QueryParameters params {
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
static_cast<bool>( desc )
};
const char *char_name = env->GetStringUTFChars(name, JNI_FALSE);
const auto query = aml->mediaFromVideoGroup(char_name, &params);
if (query == nullptr)
{
env->ReleaseStringUTFChars(name, char_name);
return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
}
std::vector<medialibrary::MediaPtr> mediaList = nbItems != 0 ? query->items(nbItems, offset) : query->all();
jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL);
int index = -1;
for(medialibrary::MediaPtr const& media : mediaList) {
jobject item = mediaToMediaWrapper(env, &ml_fields, media);
env->SetObjectArrayElement(mediaRefs, ++index, item);
env->DeleteLocalRef(item);
}
env->ReleaseStringUTFChars(name, char_name);
return mediaRefs;
}
jint
getvideoGroupMediaCount(JNIEnv* env, jobject thiz, jobject medialibrary, jstring name) {
const char *char_name = env->GetStringUTFChars(name, JNI_FALSE);
const auto query = MediaLibrary_getInstance(env, medialibrary)->mediaFromVideoGroup(char_name, nullptr);
env->ReleaseStringUTFChars(name, char_name);
return static_cast<jint> (query != nullptr ? query->count() : 0);
}
jobjectArray
searchFromvideoGroup(JNIEnv* env, jobject thiz, jobject medialibrary, jstring name, jstring filterQuery, jint sortingCriteria, jboolean desc, jint nbItems, jint offset)
{
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, medialibrary);
medialibrary::QueryParameters params {
static_cast<medialibrary::SortingCriteria>(sortingCriteria),
static_cast<bool>( desc )
};
const char *char_name = env->GetStringUTFChars(name, JNI_FALSE);
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
const auto query = aml->searchFromVideoGroup(char_name, queryChar, &params);
if (query == nullptr)
{
env->ReleaseStringUTFChars(filterQuery, queryChar);
env->ReleaseStringUTFChars(name, char_name);
return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
}
std::vector<medialibrary::MediaPtr> mediaList = nbItems != 0 ? query->items(nbItems, offset) : query->all();
jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL);
int index = -1;
for(medialibrary::MediaPtr const& media : mediaList) {
jobject item = mediaToMediaWrapper(env, &ml_fields, media);
env->SetObjectArrayElement(mediaRefs, ++index, item);
env->DeleteLocalRef(item);
}
env->ReleaseStringUTFChars(filterQuery, queryChar);
env->ReleaseStringUTFChars(name, char_name);
return mediaRefs;
}
jint
getSearchFromvideoGroupCount(JNIEnv* env, jobject thiz, jobject medialibrary, jstring name, jstring filterQuery) {
const char *queryChar = env->GetStringUTFChars(filterQuery, JNI_FALSE);
const char *char_name = env->GetStringUTFChars(name, JNI_FALSE);
const auto query = MediaLibrary_getInstance(env, medialibrary)->searchFromVideoGroup(char_name, queryChar, nullptr);
env->ReleaseStringUTFChars(filterQuery, queryChar);
env->ReleaseStringUTFChars(name, char_name);
return static_cast<jint> (query != nullptr ? query->count() : 0);
}
/*
* JNI stuff
*/
@@ -1729,6 +1889,7 @@ static JNINativeMethod methods[] = {
{"nativeInit", "(Ljava/lang/String;Ljava/lang/String;)I", (void*)init },
{"nativeStart", "()V", (void*)start },
{"nativeRelease", "()V", (void*)release },
{"nativeClearDatabase", "(Z)V", (void*)clearDatabase },
{"nativeAddDevice", "(Ljava/lang/String;Ljava/lang/String;Z)Z", (void*)addDevice },
{"nativeDevices", "()[Ljava/lang/String;", (void*)devices },
{"nativeDiscover", "(Ljava/lang/String;)V", (void*)discover },
@@ -1741,6 +1902,7 @@ static JNINativeMethod methods[] = {
{"nativeLastStreamsPlayed", "()[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)lastStreamsPlayed },
{"nativeAddToHistory", "(Ljava/lang/String;Ljava/lang/String;)Z", (void*)addToHistory },
{"nativeClearHistory", "()Z", (void*)clearHistory },
{"nativeSetVideoGroupsPrefixLength", "(I)V", (void*)setVideoGroupsPrefixLength },
{"nativeGetVideos", "()[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getVideos },
{"nativeGetSortedVideos", "(IZ)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getSortedVideos },
{"nativeGetSortedPagedVideos", "(IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getPagedVideos },
@@ -1804,6 +1966,9 @@ static JNINativeMethod methods[] = {
{"nativeSetMediaUpdatedCbFlag", "(I)V", (void*)setMediaUpdatedCbFlag },
{"nativeSetMediaAddedCbFlag", "(I)V", (void*)setMediaAddedCbFlag },
{"nativePlaylistCreate", "(Ljava/lang/String;)Lorg/videolan/medialibrary/interfaces/media/AbstractPlaylist;", (void*)playlistCreate },
{"nativeGetVideoGroups", "(IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractVideoGroup;", (void*)videoGroups },
{"nativeGetVideoGroupsCount", "()I", (void*)videoGroupsCount },
};
static JNINativeMethod media_methods[] = {
@@ -1863,6 +2028,13 @@ static JNINativeMethod folder_methods[] = {
{"nativeGetSearchCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JLjava/lang/String;I)I", (void*)getSearchMediaFromFolderCount },
};
static JNINativeMethod videogroup_methods[] = {
{"nativeMedia", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;Ljava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getPagedMediaFromvideoGroup },
// {"nativeMediaCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JI)I", (void*)getvideoGroupMediaCount },
{"nativeSearch", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;Ljava/lang/String;Ljava/lang/String;IZII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)searchFromvideoGroup },
{"nativeGetSearchCount", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;Ljava/lang/String;Ljava/lang/String;)I", (void*)getSearchFromvideoGroupCount },
};
static JNINativeMethod playlist_methods[] = {
{"nativeGetTracks", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;J)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getMediaFromPlaylist },
{"nativeGetPagedTracks", "(Lorg/videolan/medialibrary/interfaces/AbstractMedialibrary;JII)[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;", (void*)getPagedMediaFromPlaylist },
@@ -1994,7 +2166,7 @@ jint JNI_OnLoad(JavaVM *vm, void *reserved)
GET_ID(GetMethodID,
ml_fields.MediaWrapper.initID,
ml_fields.MediaWrapper.clazz,
"<init>", "(JLjava/lang/String;JJILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;IIIIJJZ)V");
"<init>", "(JLjava/lang/String;JJILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;IIIIJJZI)V");
GET_CLASS(ml_fields.HistoryItem.clazz,
"org/videolan/medialibrary/media/HistoryItem", true);
@@ -2012,12 +2184,25 @@ jint JNI_OnLoad(JavaVM *vm, void *reserved)
"<init>", "([Lorg/videolan/medialibrary/interfaces/media/AbstractAlbum;[Lorg/videolan/medialibrary/interfaces/media/AbstractArtist;[Lorg/videolan/medialibrary/interfaces/media/AbstractGenre;[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;[Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;[Lorg/videolan/medialibrary/interfaces/media/AbstractPlaylist;)V");
GET_CLASS(ml_fields.Folder.clazz, "org/videolan/medialibrary/media/Folder", true);
if (env->RegisterNatives(ml_fields.Folder.clazz, folder_methods, sizeof(folder_methods) / sizeof(folder_methods[0])) < 0) {
LOGE("RegisterNatives failed for org/videolan/medialibrary/media/Folder");
return -1;
}
GET_ID(GetMethodID,
ml_fields.Folder.initID,
ml_fields.Folder.clazz,
"<init>", "(JLjava/lang/String;Ljava/lang/String;)V");
GET_CLASS(ml_fields.VideoGroup.clazz, "org/videolan/medialibrary/media/VideoGroup", true);
if (env->RegisterNatives(ml_fields.VideoGroup.clazz, videogroup_methods, sizeof(videogroup_methods) / sizeof(videogroup_methods[0])) < 0) {
LOGE("RegisterNatives failed for 'org/videolan/medialibrary/media/VideoGroup");
return -1;
}
GET_ID(GetMethodID,
ml_fields.VideoGroup.initID,
ml_fields.VideoGroup.clazz,
"<init>", "(Ljava/lang/String;I)V");
GET_ID(GetFieldID,
ml_fields.MediaLibrary.instanceID,
ml_fields.MediaLibrary.clazz,
@@ -2030,7 +2215,7 @@ jint JNI_OnLoad(JavaVM *vm, void *reserved)
GET_ID(GetMethodID,
ml_fields.MediaLibrary.onMediaUpdatedId,
ml_fields.MediaLibrary.clazz,
"onMediaUpdated", "([Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;)V");
"onMediaUpdated", "()V");
GET_ID(GetMethodID,
ml_fields.MediaLibrary.onMediaDeletedId,
ml_fields.MediaLibrary.clazz,
@@ -2131,6 +2316,10 @@ jint JNI_OnLoad(JavaVM *vm, void *reserved)
ml_fields.MediaLibrary.onMediaThumbnailReadyId,
ml_fields.MediaLibrary.clazz,
"onMediaThumbnailReady", "(Lorg/videolan/medialibrary/interfaces/media/AbstractMediaWrapper;Z)V");
GET_ID(GetMethodID,
ml_fields.MediaLibrary.onUnhandledExceptionId,
ml_fields.MediaLibrary.clazz,
"onUnhandledException", "(Ljava/lang/String;Ljava/lang/String;Z)V");
#undef GET_CLASS
#undef GET_ID

View File

@@ -1,17 +1,5 @@
#include "utils.h"
#include <medialibrary/IAlbumTrack.h>
#include <medialibrary/IVideoTrack.h>
#include <medialibrary/IFile.h>
#include <medialibrary/IMedia.h>
#include <medialibrary/IArtist.h>
#include <medialibrary/IGenre.h>
#include <medialibrary/IAlbum.h>
#include <medialibrary/IPlaylist.h>
#include <medialibrary/IFolder.h>
#include <medialibrary/IMediaLibrary.h>
#include <medialibrary/IMetadata.h>
#include<medialibrary/filesystem/IDevice.h>
#define LOG_TAG "VLC/JNI/Utils"
#include "log.h"
@@ -58,14 +46,14 @@ mediaToMediaWrapper(JNIEnv* env, fields *fields, medialibrary::MediaPtr const& m
discNumber = p_albumTrack->discNumber();
}
const medialibrary::IMetadata& metaAudioTrack = mediaPtr->metadata(medialibrary::IMedia::MetadataType::AudioTrack);
jint audioTrack = metaAudioTrack.isSet() ? metaAudioTrack.integer() : -2;
jint audioTrack = metaAudioTrack.isSet() ? metaAudioTrack.asInt() : -2;
const medialibrary::IMetadata& metaSpuTrack = mediaPtr->metadata(medialibrary::IMedia::MetadataType::SubtitleTrack);
jint spuTrack = metaSpuTrack.isSet() ? metaSpuTrack.integer() : -2;
jint spuTrack = metaSpuTrack.isSet() ? metaSpuTrack.asInt() : -2;
title = mediaPtr->title().empty() ? NULL : env->NewStringUTF(mediaPtr->title().c_str());
filename = mediaPtr->fileName().empty() ? NULL : env->NewStringUTF(mediaPtr->fileName().c_str());
try {
mrl = env->NewStringUTF(files.at(0)->mrl().c_str());
} catch(const medialibrary::fs::DeviceRemovedException&) {
} catch(const medialibrary::fs::errors::DeviceRemoved&) {
return nullptr;
}
thumbnail = mediaPtr->thumbnailMrl(medialibrary::ThumbnailSizeType::Thumbnail).empty() ? NULL : env->NewStringUTF(mediaPtr->thumbnailMrl(medialibrary::ThumbnailSizeType::Thumbnail).c_str());
@@ -75,17 +63,18 @@ mediaToMediaWrapper(JNIEnv* env, fields *fields, medialibrary::MediaPtr const& m
unsigned int height = hasVideoTracks ? videoTracks.at(0)->height() : 0;
int64_t duration = mediaPtr->duration();
const medialibrary::IMetadata& progressMeta = mediaPtr->metadata( medialibrary::IMedia::MetadataType::Progress );
int64_t progress = progressMeta.isSet() ? progressMeta.integer() : 0;
int64_t progress = progressMeta.isSet() ? progressMeta.asInt() : 0;
// workaround to convert legacy percentage progress
if (progress != 0 && progress < 100) progress = duration * ( progress / 100.0 );
const medialibrary::IMetadata& seenMeta = mediaPtr->metadata( medialibrary::IMedia::MetadataType::Seen );
int64_t seen = seenMeta.isSet() ? seenMeta.integer() : 0;
int64_t seen = seenMeta.isSet() ? seenMeta.asInt() : 0;
jobject item = env->NewObject(fields->MediaWrapper.clazz, fields->MediaWrapper.initID,
(jlong) mediaPtr->id(), mrl,(jlong) progress, (jlong) duration, type,
title, filename, artist, genre, album,
albumArtist, width, height, thumbnail,
audioTrack, spuTrack, trackNumber, discNumber, (jlong) files.at(0)->lastModificationDate(), seen, mediaPtr->isThumbnailGenerated(medialibrary::ThumbnailSizeType::Thumbnail));
audioTrack, spuTrack, trackNumber, discNumber, (jlong) files.at(0)->lastModificationDate(),
seen, mediaPtr->isThumbnailGenerated(medialibrary::ThumbnailSizeType::Thumbnail), mediaPtr->releaseDate());
if (artist != NULL)
env->DeleteLocalRef(artist);
if (genre != NULL)
@@ -169,63 +158,88 @@ convertFolderObject(JNIEnv* env, fields *fields, medialibrary::FolderPtr const&
return item;
}
jobject
convertVideoGroupObject(JNIEnv* env, fields *fields, medialibrary::VideoGroupPtr const& videogroupPtr)
{
jstring name = env->NewStringUTF(videogroupPtr->name().c_str());
jobject item = env->NewObject(fields->VideoGroup.clazz, fields->VideoGroup.initID,
name, (jint)videogroupPtr->count());
env->DeleteLocalRef(name);
return item;
}
jobject
convertSearchAggregateObject(JNIEnv* env, fields *fields, medialibrary::SearchAggregate const& searchAggregatePtr)
{
//Albums
jobjectArray albums = (jobjectArray) env->NewObjectArray(searchAggregatePtr.albums->count(), fields->Album.clazz, NULL);
jobjectArray albums = nullptr;
int index = -1;
for(medialibrary::AlbumPtr const& album : searchAggregatePtr.albums->all()) {
jobject item = convertAlbumObject(env, fields, album);
env->SetObjectArrayElement(albums, ++index, item);
env->DeleteLocalRef(item);
if (searchAggregatePtr.albums != nullptr) {
albums = (jobjectArray) env->NewObjectArray(searchAggregatePtr.albums->count(), fields->Album.clazz, NULL);
for(medialibrary::AlbumPtr const& album : searchAggregatePtr.albums->all()) {
jobject item = convertAlbumObject(env, fields, album);
env->SetObjectArrayElement(albums, ++index, item);
env->DeleteLocalRef(item);
}
}
//Artists
jobjectArray artists = (jobjectArray) env->NewObjectArray(searchAggregatePtr.artists->count(), fields->Artist.clazz, NULL);
index = -1;
for(medialibrary::ArtistPtr const& artist : searchAggregatePtr.artists->all()) {
jobject item = convertArtistObject(env, fields, artist);
env->SetObjectArrayElement(artists, ++index, item);
env->DeleteLocalRef(item);
jobjectArray artists = nullptr;
if (searchAggregatePtr.artists != nullptr) {
index = -1;
artists = (jobjectArray) env->NewObjectArray(searchAggregatePtr.artists->count(), fields->Artist.clazz, NULL);
for(medialibrary::ArtistPtr const& artist : searchAggregatePtr.artists->all()) {
jobject item = convertArtistObject(env, fields, artist);
env->SetObjectArrayElement(artists, ++index, item);
env->DeleteLocalRef(item);
}
}
//Genres
jobjectArray genres = (jobjectArray) env->NewObjectArray(searchAggregatePtr.genres->count(), fields->Genre.clazz, NULL);
index = -1;
for(medialibrary::GenrePtr const& genre : searchAggregatePtr.genres->all()) {
jobject item = convertGenreObject(env, fields, genre);
env->SetObjectArrayElement(genres, ++index, item);
env->DeleteLocalRef(item);
jobjectArray genres = nullptr;
if (searchAggregatePtr.genres != nullptr) {
index = -1;
genres = (jobjectArray) env->NewObjectArray(searchAggregatePtr.genres->count(), fields->Genre.clazz, NULL);
for(medialibrary::GenrePtr const& genre : searchAggregatePtr.genres->all()) {
jobject item = convertGenreObject(env, fields, genre);
env->SetObjectArrayElement(genres, ++index, item);
env->DeleteLocalRef(item);
}
}
//Playlists
jobjectArray playlists = (jobjectArray) env->NewObjectArray(searchAggregatePtr.playlists->count(), fields->Playlist.clazz, NULL);
index = -1;
for(medialibrary::PlaylistPtr const& playlist : searchAggregatePtr.playlists->all()) {
jobject item = convertPlaylistObject(env, fields, playlist);
env->SetObjectArrayElement(playlists, ++index, item);
env->DeleteLocalRef(item);
jobjectArray playlists = nullptr;
if (searchAggregatePtr.playlists != nullptr) {
index = -1;
playlists = (jobjectArray) env->NewObjectArray(searchAggregatePtr.playlists->count(), fields->Playlist.clazz, NULL);
for(medialibrary::PlaylistPtr const& playlist : searchAggregatePtr.playlists->all()) {
jobject item = convertPlaylistObject(env, fields, playlist);
env->SetObjectArrayElement(playlists, ++index, item);
env->DeleteLocalRef(item);
}
}
//Media
std::vector<medialibrary::MediaPtr> videos = {};
std::vector<medialibrary::MediaPtr> tracks = {};
for(medialibrary::MediaPtr const& media : searchAggregatePtr.media->all()) {
if (media->subType() == medialibrary::IMedia::SubType::AlbumTrack) tracks.push_back(media);
else videos.push_back(media);
jobjectArray videoList = nullptr;
jobjectArray tracksList = nullptr;
if (searchAggregatePtr.media != nullptr) {
for(medialibrary::MediaPtr const& media : searchAggregatePtr.media->all()) {
if (media->subType() == medialibrary::IMedia::SubType::AlbumTrack) tracks.push_back(media);
else videos.push_back(media);
}
videoList = (jobjectArray) env->NewObjectArray(videos.size(), fields->MediaWrapper.clazz, NULL);
index = -1;
for(medialibrary::MediaPtr const& media : videos) {
jobject item = mediaToMediaWrapper(env, fields, media);
env->SetObjectArrayElement(videoList, ++index, item);
env->DeleteLocalRef(item);
}
tracksList = (jobjectArray) env->NewObjectArray(tracks.size(), fields->MediaWrapper.clazz, NULL);
index = -1;
for(medialibrary::MediaPtr const& media : tracks) {
jobject item = mediaToMediaWrapper(env, fields, media);
env->SetObjectArrayElement(tracksList, ++index, item);
env->DeleteLocalRef(item);
}
}
jobjectArray videoList = (jobjectArray) env->NewObjectArray(videos.size(), fields->MediaWrapper.clazz, NULL);
index = -1;
for(medialibrary::MediaPtr const& media : videos) {
jobject item = mediaToMediaWrapper(env, fields, media);
env->SetObjectArrayElement(videoList, ++index, item);
env->DeleteLocalRef(item);
}
jobjectArray tracksList = (jobjectArray) env->NewObjectArray(tracks.size(), fields->MediaWrapper.clazz, NULL);
index = -1;
for(medialibrary::MediaPtr const& media : tracks) {
jobject item = mediaToMediaWrapper(env, fields, media);
env->SetObjectArrayElement(tracksList, ++index, item);
env->DeleteLocalRef(item);
}
return env->NewObject(fields->SearchAggregate.clazz, fields->SearchAggregate.initID,
albums, artists, genres, videoList, tracksList, playlists);
}

View File

@@ -23,6 +23,20 @@
#include <jni.h>
#include <medialibrary/Types.h>
#include <medialibrary/IMediaLibrary.h>
#include <medialibrary/IAlbumTrack.h>
#include <medialibrary/IVideoTrack.h>
#include <medialibrary/IFile.h>
#include <medialibrary/IMedia.h>
#include <medialibrary/IArtist.h>
#include <medialibrary/IGenre.h>
#include <medialibrary/IAlbum.h>
#include <medialibrary/IPlaylist.h>
#include <medialibrary/IFolder.h>
#include <medialibrary/IMediaLibrary.h>
#include <medialibrary/IMetadata.h>
#include<medialibrary/filesystem/IDevice.h>
#include <medialibrary/IVideoGroup.h>
#include <medialibrary/filesystem/Errors.h>
#define VLC_JNI_VERSION JNI_VERSION_1_2
@@ -66,6 +80,7 @@ struct fields {
jmethodID onEntryPointAddedId;
jmethodID onEntryPointRemovedId;
jmethodID onMediaThumbnailReadyId;
jmethodID onUnhandledExceptionId;
} MediaLibrary;
struct Album {
jclass clazz;
@@ -99,6 +114,10 @@ struct fields {
jclass clazz;
jmethodID initID;
} Folder;
struct VideoGroup {
jclass clazz;
jmethodID initID;
} VideoGroup;
};
jobject mediaToMediaWrapper(JNIEnv*, fields*, const medialibrary::MediaPtr &);
@@ -107,6 +126,7 @@ jobject convertArtistObject(JNIEnv* env, fields *fields, medialibrary::ArtistPtr
jobject convertGenreObject(JNIEnv* env, fields *fields, medialibrary::GenrePtr const& genrePtr);
jobject convertPlaylistObject(JNIEnv* env, fields *fields, medialibrary::PlaylistPtr const& genrePtr);
jobject convertFolderObject(JNIEnv* env, fields *fields, medialibrary::FolderPtr const& folderPtr);
jobject convertVideoGroupObject(JNIEnv* env, fields *fields, medialibrary::VideoGroupPtr const& videogroupPtr);
jobject convertSearchAggregateObject(JNIEnv* env, fields *fields, medialibrary::SearchAggregate const& searchAggregatePtr);
jobjectArray filteredArray(JNIEnv* env, jobjectArray array, jclass clazz, int removalCount = -1);

View File

@@ -12,12 +12,14 @@ import org.videolan.medialibrary.interfaces.media.AbstractFolder;
import org.videolan.medialibrary.interfaces.media.AbstractGenre;
import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
import org.videolan.medialibrary.interfaces.media.AbstractPlaylist;
import org.videolan.medialibrary.interfaces.media.AbstractVideoGroup;
import org.videolan.medialibrary.media.Album;
import org.videolan.medialibrary.media.Artist;
import org.videolan.medialibrary.media.Folder;
import org.videolan.medialibrary.media.Genre;
import org.videolan.medialibrary.media.MediaWrapper;
import org.videolan.medialibrary.media.Playlist;
import org.videolan.medialibrary.media.VideoGroup;
import org.videolan.medialibrary.stubs.StubAlbum;
import org.videolan.medialibrary.stubs.StubArtist;
import org.videolan.medialibrary.stubs.StubFolder;
@@ -25,12 +27,15 @@ import org.videolan.medialibrary.stubs.StubGenre;
import org.videolan.medialibrary.stubs.StubMediaWrapper;
import org.videolan.medialibrary.stubs.StubMedialibrary;
import org.videolan.medialibrary.stubs.StubPlaylist;
import org.videolan.medialibrary.stubs.StubVideoGroup;
public class MLServiceLocator {
private static LocatorMode sMode = LocatorMode.VLC_ANDROID;
private static volatile AbstractMedialibrary instance;
public static void setLocatorMode(LocatorMode mode) {
if (instance != null) throw new IllegalStateException("LocatorMode must be set before AbstractMedialibrary initialization");
MLServiceLocator.sMode = mode;
}
@@ -40,12 +45,11 @@ public class MLServiceLocator {
TESTS,
}
public static AbstractMedialibrary getAbstractMedialibrary() {
if (sMode == LocatorMode.VLC_ANDROID) {
return new Medialibrary();
} else {
return new StubMedialibrary();
public static synchronized AbstractMedialibrary getAbstractMedialibrary() {
if (instance == null) {
instance = sMode == LocatorMode.VLC_ANDROID ? new Medialibrary() : new StubMedialibrary();
}
return instance;
}
// AbstractMediaWrapper
@@ -55,15 +59,15 @@ public class MLServiceLocator {
String albumArtist, int width, int height,
String artworkURL, int audio, int spu,
int trackNumber, int discNumber, long lastModified,
long seen, boolean isThumbnailGenerated) {
long seen, boolean isThumbnailGenerated, int releaseDate) {
if (sMode == LocatorMode.VLC_ANDROID) {
return new MediaWrapper(id, mrl, time, length, type, title,
filename, artist, genre, album, albumArtist, width, height, artworkURL,
audio, spu, trackNumber, discNumber, lastModified, seen, isThumbnailGenerated);
audio, spu, trackNumber, discNumber, lastModified, seen, isThumbnailGenerated, releaseDate);
} else {
return new StubMediaWrapper(id, mrl, time, length, type, title,
filename, artist, genre, album, albumArtist, width, height, artworkURL,
audio, spu, trackNumber, discNumber, lastModified, seen, isThumbnailGenerated);
audio, spu, trackNumber, discNumber, lastModified, seen, isThumbnailGenerated, releaseDate);
}
}
@@ -180,6 +184,14 @@ public class MLServiceLocator {
}
}
public static AbstractVideoGroup getAbstractVideoGroup(Parcel in) {
if (sMode == LocatorMode.VLC_ANDROID) {
return new VideoGroup(in);
} else {
return new StubVideoGroup(in);
}
}
//Playlist
public static AbstractPlaylist getAbstractPlaylist(long id, String name, int trackCount) {
if (sMode == LocatorMode.VLC_ANDROID) {

View File

@@ -38,6 +38,7 @@ import org.videolan.medialibrary.interfaces.media.AbstractFolder;
import org.videolan.medialibrary.interfaces.media.AbstractGenre;
import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
import org.videolan.medialibrary.interfaces.media.AbstractPlaylist;
import org.videolan.medialibrary.interfaces.media.AbstractVideoGroup;
import org.videolan.medialibrary.media.SearchAggregate;
import java.io.File;
@@ -48,8 +49,9 @@ public class Medialibrary extends AbstractMedialibrary {
public int init(Context context) {
if (context == null) return ML_INIT_FAILED;
if (mIsInitiated) return ML_INIT_ALREADY_INITIALIZED;
sContext = context;
File extFilesDir = context.getExternalFilesDir(null);
final File extFilesDir = context.getExternalFilesDir(null);
File dbDirectory = context.getDir("db", Context.MODE_PRIVATE);
if (extFilesDir == null || !extFilesDir.exists()
|| dbDirectory == null || !dbDirectory.canWrite())
@@ -63,12 +65,35 @@ public class Medialibrary extends AbstractMedialibrary {
Log.e(TAG, "Can't load mla: " + ule);
return ML_INIT_FAILED;
}
int initCode = nativeInit(dbDirectory+ VLC_MEDIA_DB_NAME, extFilesDir+ THUMBS_FOLDER_NAME);
final File oldDir = new File(extFilesDir + THUMBS_FOLDER_NAME);
if (oldDir.isDirectory()) {
//remove old thumbnails directory
new Thread(new Runnable() {
@Override
public void run() {
String[] children = oldDir.list();
if (children != null) {
for (String child : children) {
new File(oldDir, child).delete();
}
}
oldDir.delete();
}
}).start();
}
int initCode = nativeInit(dbDirectory + VLC_MEDIA_DB_NAME, extFilesDir + MEDIALIB_FOLDER_NAME);
if (initCode == ML_INIT_DB_CORRUPTED) {
Log.e(TAG, "Medialib database is corrupted. Clearing it and try to restore playlists");
nativeClearDatabase(true);
}
mIsInitiated = initCode != ML_INIT_FAILED;
return initCode;
}
public void start() {
if (isStarted()) return;
nativeStart();
isMedialibraryStarted = true;
synchronized (onMedialibraryReadyListeners) {
@@ -175,14 +200,34 @@ public class Medialibrary extends AbstractMedialibrary {
return mIsInitiated ? nativeGetRecentAudio() : new AbstractMediaWrapper[0];
}
@WorkerThread
public int getVideoCount() {
return mIsInitiated ? nativeGetVideoCount() : 0;
}
@WorkerThread
public int getAudioCount() {
return mIsInitiated ? nativeGetAudioCount() : 0;
}
@Override
@WorkerThread
public AbstractVideoGroup[] getVideoGroups(int sort, boolean desc, int nbItems, int offset) {
return mIsInitiated ? nativeGetVideoGroups(sort, desc, nbItems, offset) : new AbstractVideoGroup[0];
}
@Override
@WorkerThread
public int getVideoGroupsCount() {
return mIsInitiated ? nativeGetVideoGroupsCount() : 0;
}
@Override
@WorkerThread
public void setVideoGroupsPrefixLength(int lenght) {
if (mIsInitiated) nativeSetVideoGroupsPrefixLength(lenght);
}
@WorkerThread
public AbstractAlbum[] getAlbums() {
@@ -338,6 +383,10 @@ public class Medialibrary extends AbstractMedialibrary {
return mIsInitiated && nativeClearHistory();
}
public void clearDatabase(boolean restorePlaylist) {
if (mIsInitiated) nativeClearDatabase(restorePlaylist);
}
public boolean addToHistory(String mrl, String title) {
return mIsInitiated && nativeAddToHistory(Tools.encodeVLCMrl(mrl), Tools.encodeVLCMrl(title));
}
@@ -482,6 +531,8 @@ public class Medialibrary extends AbstractMedialibrary {
private native int nativeInit(String dbPath, String thumbsPath);
private native void nativeStart();
private native void nativeRelease();
private native void nativeClearDatabase(boolean keepPlaylist);
private native void nativeBanFolder(String path);
private native void nativeUnbanFolder(String path);
private native boolean nativeAddDevice(String uuid, String path, boolean removable);
@@ -509,6 +560,9 @@ public class Medialibrary extends AbstractMedialibrary {
private native AbstractMediaWrapper[] nativeGetRecentAudio();
private native int nativeGetVideoCount();
private native int nativeGetAudioCount();
private native AbstractVideoGroup[] nativeGetVideoGroups(int sort, boolean desc, int nbItems, int offset);
private native int nativeGetVideoGroupsCount();
private native void nativeSetVideoGroupsPrefixLength(int length);
private native AbstractAlbum[] nativeGetAlbums(int sort, boolean desc);
private native AbstractAlbum[] nativeGetPagedAlbums(int sort, boolean desc, int nbItems, int offset);
private native int nativeGetAlbumsCount();

View File

@@ -5,6 +5,8 @@ import android.net.Uri;
import android.os.Environment;
import android.text.TextUtils;
import androidx.annotation.Nullable;
import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
import org.videolan.medialibrary.media.MediaLibraryItem;
@@ -12,8 +14,6 @@ import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;
import androidx.annotation.Nullable;
public class Tools {
private static final String TAG = "VLC/Tools";
@@ -40,8 +40,8 @@ public class Tools {
long lastTime = media.getTime();
if (lastTime == 0L) return "";
return String.format("%s / %s",
millisToString(lastTime, true, false),
millisToString(media.getLength(), true, false));
millisToString(lastTime, true, false, false),
millisToString(media.getLength(), true, false, false));
}
/**
@@ -50,7 +50,7 @@ public class Tools {
* @return formated string (hh:)mm:ss
*/
public static String millisToString(long millis) {
return millisToString(millis, false, true);
return millisToString(millis, false, true, false);
}
/**
@@ -59,7 +59,17 @@ public class Tools {
* @return formated string "[hh]h[mm]min" / "[mm]min[s]s"
*/
public static String millisToText(long millis) {
return millisToString(millis, true, true);
return millisToString(millis, true, true, false);
}
/**
* Convert time to a string with large formatting
*
* @param millis e.g.time/length from file
* @return formated string "[hh]h [mm]min " / "[mm]min [s]s"
*/
public static String millisToTextLarge(long millis) {
return millisToString(millis, true, true, true);
}
public static String getResolution(AbstractMediaWrapper media) {
@@ -92,7 +102,7 @@ public class Tools {
}
}
public static String millisToString(long millis, boolean text, boolean seconds) {
public static String millisToString(long millis, boolean text, boolean seconds, boolean large) {
sb.setLength(0);
if (millis < 0) {
millis = -millis;
@@ -108,16 +118,16 @@ public class Tools {
if (text) {
if (hours > 0)
sb.append(hours).append('h');
sb.append(hours).append('h').append(large ? " " : "");
if (min > 0)
sb.append(min).append("min");
sb.append(min).append("min").append(large ? " " : "");
if ((seconds || sb.length() == 0) && sec > 0)
sb.append(sec).append("s");
sb.append(sec).append("s").append(large ? " " : "");
} else {
if (hours > 0)
sb.append(hours).append(':').append(format.format(min)).append(':').append(format.format(sec));
sb.append(hours).append(':').append(large ? " " : "").append(format.format(min)).append(':').append(large ? " " : "").append(format.format(sec));
else
sb.append(min).append(':').append(format.format(sec));
sb.append(min).append(':').append(large ? " " : "").append(format.format(sec));
}
return sb.toString();
}

View File

@@ -2,7 +2,6 @@ package org.videolan.medialibrary.interfaces;
import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
@@ -13,7 +12,6 @@ import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import org.videolan.medialibrary.MLServiceLocator;
import org.videolan.medialibrary.SingleEvent;
@@ -24,6 +22,7 @@ import org.videolan.medialibrary.interfaces.media.AbstractFolder;
import org.videolan.medialibrary.interfaces.media.AbstractGenre;
import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
import org.videolan.medialibrary.interfaces.media.AbstractPlaylist;
import org.videolan.medialibrary.interfaces.media.AbstractVideoGroup;
import org.videolan.medialibrary.media.SearchAggregate;
import java.io.File;
@@ -60,10 +59,12 @@ abstract public class AbstractMedialibrary {
public static final int ML_INIT_ALREADY_INITIALIZED = 1;
public static final int ML_INIT_FAILED = 2;
public static final int ML_INIT_DB_RESET = 3;
public static final int ML_INIT_DB_CORRUPTED = 4;
public static final AbstractMediaWrapper[] EMPTY_COLLECTION = {};
public static final String VLC_MEDIA_DB_NAME = "/vlc_media.db";
public static final String THUMBS_FOLDER_NAME = "/thumbs";
public static final String MEDIALIB_FOLDER_NAME = "/medialib";
protected volatile boolean mIsInitiated = false;
protected volatile boolean mIsWorking = false;
@@ -79,6 +80,7 @@ abstract public class AbstractMedialibrary {
protected volatile boolean isMedialibraryStarted = false;
protected final List<DevicesDiscoveryCb> devicesDiscoveryCbList = new ArrayList<>();
protected final List<EntryPointsEventsCb> entryPointsEventsCbList = new ArrayList<>();
private MedialibraryExceptionHandler mExceptionHandler;
protected static Context sContext;
public static LiveData<AbstractMediaWrapper> lastThumb = new SingleEvent<>();
@@ -204,6 +206,19 @@ abstract public class AbstractMedialibrary {
void onDeviceChange();
}
public interface MedialibraryExceptionHandler {
void onUnhandledException(String context, String errMsg, boolean clearSuggested);
}
public MedialibraryExceptionHandler getExceptionHandler() {
return mExceptionHandler;
}
public void setExceptionHandler(MedialibraryExceptionHandler mExceptionHandler) {
this.mExceptionHandler = mExceptionHandler;
}
// If media is not in ML, find it with its path
public AbstractMediaWrapper findMedia(AbstractMediaWrapper mw) {
if (mIsInitiated && mw != null && mw.getId() == 0L) {
@@ -233,7 +248,7 @@ abstract public class AbstractMedialibrary {
}
@SuppressWarnings("unused")
public void onMediaUpdated(AbstractMediaWrapper[] mediaList) {
public void onMediaUpdated() {
synchronized (mMediaCbs) {
for (MediaCb cb : mMediaCbs) cb.onMediaModified();
}
@@ -387,6 +402,10 @@ abstract public class AbstractMedialibrary {
}
}
}
@SuppressWarnings("unused")
public void onUnhandledException(String context, String errMsg, boolean clearSuggested) {
if (mExceptionHandler != null) mExceptionHandler.onUnhandledException(context, errMsg, clearSuggested);
}
@SuppressWarnings("unused")
public void onReloadStarted(String entryPoint) {
@@ -599,6 +618,9 @@ abstract public class AbstractMedialibrary {
abstract public AbstractMediaWrapper[] getRecentAudio();
abstract public int getVideoCount();
abstract public int getAudioCount();
abstract public AbstractVideoGroup[] getVideoGroups(int sort, boolean desc, int nbItems, int offset);
abstract public int getVideoGroupsCount();
abstract public void setVideoGroupsPrefixLength(int lenght);
abstract public AbstractAlbum[] getAlbums();
abstract public AbstractAlbum[] getAlbums(int sort, boolean desc);
abstract public AbstractAlbum[] getPagedAlbums(int sort, boolean desc, int nbItems, int offset);
@@ -633,6 +655,7 @@ abstract public class AbstractMedialibrary {
abstract public AbstractMediaWrapper[] lastMediaPlayed();
abstract public AbstractMediaWrapper[] lastStreamsPlayed();
abstract public boolean clearHistory();
abstract public void clearDatabase(boolean restorePlaylist);
abstract public boolean addToHistory(String mrl, String title);
abstract public AbstractMediaWrapper getMedia(long id);
abstract public AbstractMediaWrapper getMedia(Uri uri);

View File

@@ -14,7 +14,6 @@ import org.videolan.libvlc.util.Extensions;
import org.videolan.libvlc.util.VLCUtil;
import org.videolan.medialibrary.MLServiceLocator;
import org.videolan.medialibrary.Tools;
import org.videolan.medialibrary.interfaces.AbstractMedialibrary;
import org.videolan.medialibrary.media.MediaLibraryItem;
import java.util.Locale;
@@ -76,6 +75,7 @@ public abstract class AbstractMediaWrapper extends MediaLibraryItem implements P
protected String mAlbumArtist;
protected String mRating;
protected String mDate;
protected int mReleaseYear;
protected String mSettings;
protected String mNowPlaying;
protected String mPublisher;
@@ -120,13 +120,14 @@ public abstract class AbstractMediaWrapper extends MediaLibraryItem implements P
public AbstractMediaWrapper(long id, String mrl, long time, long length, int type, String title,
String filename, String artist, String genre, String album, String albumArtist,
int width, int height, String artworkURL, int audio, int spu, int trackNumber,
int discNumber, long lastModified, long seen, boolean isThumbnailGenerated) {
int discNumber, long lastModified, long seen, boolean isThumbnailGenerated, int releaseDate) {
super();
if (TextUtils.isEmpty(mrl)) throw new IllegalArgumentException("uri was empty");
mUri = Uri.parse(manageVLCMrl(mrl));
mId = id;
mFilename = filename;
mReleaseYear = releaseDate;
init(time, length, type, null, title, artist, genre, album, albumArtist, width, height,
artworkURL != null ? VLCUtil.UriFromMrl(artworkURL).getPath() : null, audio, spu,
trackNumber, discNumber, lastModified, seen, null);
@@ -556,6 +557,10 @@ public abstract class AbstractMediaWrapper extends MediaLibraryItem implements P
return mDate;
}
public int getReleaseYear() {
return mReleaseYear;
}
public String getSettings() {
return mSettings;
}

View File

@@ -0,0 +1,64 @@
package org.videolan.medialibrary.interfaces.media;
import android.os.Parcel;
import android.os.Parcelable;
import org.videolan.medialibrary.MLServiceLocator;
import org.videolan.medialibrary.media.MediaLibraryItem;
public abstract class AbstractVideoGroup extends MediaLibraryItem {
public int mCount;
public AbstractVideoGroup(String name, int count) {
super(0L, name);
mCount = count;
}
abstract public AbstractMediaWrapper[] media(int sort, boolean desc, int nbItems, int offset);
abstract public AbstractMediaWrapper[] searchTracks(String query, int sort, boolean desc, int nbItems, int offset);
abstract public int searchTracksCount(String query);
public int mediaCount() {
return mCount;
}
@Override
public AbstractMediaWrapper[] getTracks() {
return new AbstractMediaWrapper[0];
}
@Override
public int getTracksCount() {
return mCount;
}
@Override
public int getItemType() {
return TYPE_VIDEO_GROUP;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
super.writeToParcel(parcel, i);
parcel.writeInt(mCount);
}
public static Parcelable.Creator<AbstractVideoGroup> CREATOR = new Parcelable.Creator<AbstractVideoGroup>() {
@Override
public AbstractVideoGroup createFromParcel(Parcel in) {
return MLServiceLocator.getAbstractVideoGroup(in);
}
@Override
public AbstractVideoGroup[] newArray(int size) {
return new AbstractVideoGroup[size];
}
};
public AbstractVideoGroup(Parcel in) {
super(in);
this.mCount = in.readInt();
}
}

View File

@@ -8,15 +8,16 @@ import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
public abstract class MediaLibraryItem implements Parcelable {
public static final int TYPE_ALBUM = 1 << 1;
public static final int TYPE_ARTIST = 1 << 2;
public static final int TYPE_GENRE = 1 << 3;
public static final int TYPE_PLAYLIST = 1 << 4;
public static final int TYPE_MEDIA = 1 << 5;
public static final int TYPE_DUMMY = 1 << 6;
public static final int TYPE_STORAGE = 1 << 7;
public static final int TYPE_HISTORY = 1 << 9;
public static final int TYPE_FOLDER = 1 << 10;
public static final int TYPE_ALBUM = 1 << 1;
public static final int TYPE_ARTIST = 1 << 2;
public static final int TYPE_GENRE = 1 << 3;
public static final int TYPE_PLAYLIST = 1 << 4;
public static final int TYPE_MEDIA = 1 << 5;
public static final int TYPE_DUMMY = 1 << 6;
public static final int TYPE_STORAGE = 1 << 7;
public static final int TYPE_HISTORY = 1 << 9;
public static final int TYPE_FOLDER = 1 << 10;
public static final int TYPE_VIDEO_GROUP = 1 << 11;
public static final int FLAG_NONE = 0;
public static final int FLAG_SELECTED = 1;

View File

@@ -41,11 +41,11 @@ public class MediaWrapper extends AbstractMediaWrapper {
public MediaWrapper(long id, String mrl, long time, long length, int type, String title,
String filename, String artist, String genre, String album, String albumArtist,
int width, int height, String artworkURL, int audio, int spu, int trackNumber,
int discNumber, long lastModified, long seen, boolean isThumbnailGenerated) {
int discNumber, long lastModified, long seen, boolean isThumbnailGenerated, int releaseDate) {
super(id, mrl, time, length, type, title, filename, artist,
genre, album, albumArtist, width, height, artworkURL,
audio, spu, trackNumber, discNumber, lastModified,
seen, isThumbnailGenerated);
seen, isThumbnailGenerated, releaseDate);
}
public MediaWrapper(Uri uri, long time, long length, int type,

View File

@@ -1,5 +1,7 @@
package org.videolan.medialibrary.media;
import androidx.annotation.Nullable;
import org.videolan.medialibrary.Tools;
import org.videolan.medialibrary.interfaces.media.AbstractAlbum;
import org.videolan.medialibrary.interfaces.media.AbstractArtist;
@@ -35,26 +37,32 @@ public class SearchAggregate {
this.playlists = playlists;
}
@Nullable
public AbstractAlbum[] getAlbums() {
return albums;
}
@Nullable
public AbstractArtist[] getArtists() {
return artists;
}
@Nullable
public AbstractGenre[] getGenres() {
return genres;
}
@Nullable
public AbstractMediaWrapper[] getVideos() {
return videos;
}
@Nullable
public AbstractMediaWrapper[] getTracks() {
return tracks;
}
@Nullable
public AbstractPlaylist[] getPlaylists() {
return playlists;
}
@@ -66,32 +74,32 @@ public class SearchAggregate {
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
if (albums.length > 0) {
if (!Tools.isArrayEmpty(albums)) {
sb.append("Albums:\n");
for (AbstractAlbum album : albums)
sb.append(album.getTitle()).append("\n");
}
if (artists.length > 0) {
if (!Tools.isArrayEmpty(artists)) {
sb.append("Artists:\n");
for (AbstractArtist artist : artists)
sb.append(artist.getTitle()).append("\n");
}
if (genres.length > 0) {
if (!Tools.isArrayEmpty(genres)) {
sb.append("Genres:\n");
for (AbstractGenre genre : genres)
sb.append(genre.getTitle()).append("\n");
}
if (tracks.length > 0) {
if (!Tools.isArrayEmpty(tracks)) {
sb.append("Tracks:\n");
for (AbstractMediaWrapper m : tracks)
sb.append(m.getTitle()).append("\n");
}
if (videos.length > 0) {
if (!Tools.isArrayEmpty(videos)) {
sb.append("Videos:\n");
for (AbstractMediaWrapper m : videos)
sb.append(m.getTitle()).append("\n");
}
if (playlists.length > 0) {
if (!Tools.isArrayEmpty(playlists)) {
sb.append("Playlists:\n");
for (AbstractPlaylist playlist : playlists)
sb.append(playlist.getTitle()).append("\n");

View File

@@ -0,0 +1,46 @@
package org.videolan.medialibrary.media;
import android.os.Parcel;
import androidx.annotation.WorkerThread;
import org.videolan.medialibrary.interfaces.AbstractMedialibrary;
import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
import org.videolan.medialibrary.interfaces.media.AbstractVideoGroup;
public class VideoGroup extends AbstractVideoGroup {
VideoGroup(String name, int count) {
super(name, count);
}
public VideoGroup(Parcel in) {
super(in);
}
@Override
@WorkerThread
public AbstractMediaWrapper[] media(int sort, boolean desc, int nbItems, int offset) {
final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
return ml.isInitiated() ? nativeMedia(ml, mTitle, sort, desc, nbItems, offset) : AbstractMedialibrary.EMPTY_COLLECTION;
}
@Override
@WorkerThread
public AbstractMediaWrapper[] searchTracks(String query, int sort, boolean desc, int nbItems, int offset) {
final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
return ml.isInitiated() ? nativeSearch(ml, mTitle, query, sort, desc, nbItems, offset) : AbstractMedialibrary.EMPTY_COLLECTION;
}
@Override
@WorkerThread
public int searchTracksCount(String query) {
final AbstractMedialibrary ml = AbstractMedialibrary.getInstance();
return ml.isInitiated() ? nativeGetSearchCount(ml, mTitle, query) : 0;
}
private native AbstractMediaWrapper[] nativeMedia(AbstractMedialibrary ml, String name, int sort, boolean desc, int nbItems, int offset);
private native AbstractMediaWrapper[] nativeSearch(AbstractMedialibrary ml, String name, String query, int sort, boolean desc, int nbItems, int offset);
private native int nativeGetSearchCount(AbstractMedialibrary ml, String name, String query);
}

View File

@@ -63,21 +63,21 @@ public class StubDataSource {
media = MLServiceLocator.getAbstractMediaWrapper(getUUID(), baseMrl + fileName, 0L, 18820L, 0,
fileName, fileName, "", "",
"", "", 416, 304, "", 0, -2,
0, 0, 1509466228L, 0L, true);
0, 0, 1509466228L, 0L, true, 0);
addVideo(media);
fileName = "FMA - MultiChapter.mkv";
media = MLServiceLocator.getAbstractMediaWrapper(getUUID(), baseMrl + fileName, 0L, 1467383L, 0,
"Encoded with MiniCoder", fileName, "", "",
"", "", 1280, 720, "", 0,
-2, 0, 0, 1512396147L, 0L, true);
-2, 0, 0, 1512396147L, 0L, true, 0);
addVideo(media);
fileName = "114_My_Heart_Will_Go_On.avi";
media = MLServiceLocator.getAbstractMediaWrapper(getUUID(), baseMrl + fileName, 0L, 20000L, 0,
"My Heart Will Go On - Celine Dion", fileName, "", "",
"", "", 352, 220, "", 0,
-2, 0, 0, 1509465852L, 0L, true);
-2, 0, 0, 1509465852L, 0L, true, 0);
addVideo(media);
// Audio
@@ -89,7 +89,7 @@ public class StubDataSource {
"Shine On CD2", "Peter Frampton",
0, 0, "/storage/emulated/0/Music/Peter Frampton/Shine On - CD2/Folder.jpg",
0, -2, 1, 0,
1547452796L, 0L, true);
1547452796L, 0L, true, 0);
addAudio(media, "", 1965, 400);
fileName = "01-Wind Of Change.mp3";
@@ -99,7 +99,7 @@ public class StubDataSource {
"Shine On CD1", "Peter Frampton",
0, 0, "/storage/emulated/0/Music/Peter Frampton/Shine On - CD1/Folder.jpg",
0, -2, 1, 0,
1547452786L, 0L, true);
1547452786L, 0L, true, 0);
addAudio(media, "", 1960, 250);
fileName = "03 Bloody Well Right.wma";
@@ -109,7 +109,7 @@ public class StubDataSource {
"The Autobiography of Supertramp", "Supertramp",
0, 0, "/storage/emulated/0/Music/Supertramp/Best of/Folder.jpg", 0,
-2, 3, 0,
1547452814L, 0L, true);
1547452814L, 0L, true, 0);
addAudio(media, "", 1970, 360);
}

View File

@@ -12,11 +12,11 @@ public class StubMediaWrapper extends AbstractMediaWrapper {
public StubMediaWrapper(long id, String mrl, long time, long length, int type, String title,
String filename, String artist, String genre, String album, String albumArtist,
int width, int height, String artworkURL, int audio, int spu, int trackNumber,
int discNumber, long lastModified, long seen, boolean isThumbnailGenerated) {
int discNumber, long lastModified, long seen, boolean isThumbnailGenerated, int releaseDate) {
super(id, mrl, time, length, type, title, filename, artist,
genre, album, albumArtist, width, height, artworkURL,
audio, spu, trackNumber, discNumber, lastModified,
seen, isThumbnailGenerated);
seen, isThumbnailGenerated, releaseDate);
}
public StubMediaWrapper(Uri uri, long time, long length, int type,

View File

@@ -14,6 +14,7 @@ import org.videolan.medialibrary.interfaces.media.AbstractFolder;
import org.videolan.medialibrary.interfaces.media.AbstractGenre;
import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
import org.videolan.medialibrary.interfaces.media.AbstractPlaylist;
import org.videolan.medialibrary.interfaces.media.AbstractVideoGroup;
import org.videolan.medialibrary.media.SearchAggregate;
import java.util.ArrayList;
@@ -126,6 +127,19 @@ public class StubMedialibrary extends AbstractMedialibrary {
return dt.mAudioMediaWrappers.size();
}
@Override
public AbstractVideoGroup[] getVideoGroups(int sort, boolean desc, int nbItems, int offset) {
return new AbstractVideoGroup[0];
}
@Override
public int getVideoGroupsCount() {
return 0;
}
@Override
public void setVideoGroupsPrefixLength(int lenght) {}
public AbstractAlbum[] getAlbums() {
return getAlbums(SORT_DEFAULT, false);
}
@@ -316,6 +330,9 @@ public class StubMedialibrary extends AbstractMedialibrary {
return true;
}
@Override
public void clearDatabase(boolean restorePlaylist) {}
//TODO what if two files have the same name ??
// TODO what happens in case of false return
public boolean addToHistory(String mrl, String title) {

View File

@@ -0,0 +1,31 @@
package org.videolan.medialibrary.stubs;
import android.os.Parcel;
import org.videolan.medialibrary.interfaces.media.AbstractMediaWrapper;
import org.videolan.medialibrary.interfaces.media.AbstractVideoGroup;
public class StubVideoGroup extends AbstractVideoGroup {
public StubVideoGroup(String name, int count) {
super(name, count);
}
public StubVideoGroup(Parcel in) {
super(in);
}
@Override
public AbstractMediaWrapper[] media(int sort, boolean desc, int nbItems, int offset) {
return new AbstractMediaWrapper[0];
}
@Override
public AbstractMediaWrapper[] searchTracks(String query, int sort, boolean desc, int nbItems, int offset) {
return new AbstractMediaWrapper[0];
}
@Override
public int searchTracksCount(String query) {
return 0;
}
}

View File

@@ -1,5 +1,9 @@
package org.videolan.tools
import android.app.ActivityManager
import android.app.ActivityManager.RunningAppProcessInfo
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.content.res.Resources
import android.util.TypedValue
@@ -71,3 +75,31 @@ fun Context.getColorFromAttr(
theme.resolveAttribute(attrColor, typedValue, resolveRefs)
return typedValue.data
}
fun Context.copy(label: String, text: String) {
val clipboard = applicationContext.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
clipboard.primaryClip = ClipData.newPlainText(label, text)
}
suspend fun retry(
times: Int = 3,
delayTime: Long = 500L,
block: suspend () -> Boolean): Boolean {
repeat(times - 1) {
if (block()) return true
if (delayTime > 0L) delay(delayTime)
}
return block() // last attempt
}
suspend fun Context.awaitAppIsForegroung(): Boolean {
val activityManager = applicationContext.getSystemService(Context.ACTIVITY_SERVICE) as? ActivityManager
?: return false
repeat(times = 2) {
if (activityManager.isAppForeground()) return true
else yield() //dispatch next try
}
return activityManager.isAppForeground()
}
private fun ActivityManager.isAppForeground() = runningAppProcesses[0].importance <= RunningAppProcessInfo.IMPORTANCE_FOREGROUND

File diff suppressed because it is too large Load Diff

View File

@@ -7,14 +7,17 @@
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
</head>
<body id="top" style="background-color: #EBEBEE">
<body id="top">
<h1>VLC for Android</h1>
<p>Copyleft &copy; 1996-2019 VideoLAN, VLC authors</p>
<div>
<h2>License</h2>
<p>VLC for Android is licensed under the <a href="#gpl">GNU General Public License, version 3 or later</a> (herein referred to as GPL).</p>
<h2>Sources</h2>
<p>The sources to this application can be retrieved at <a href="https://code.videolan.org/videolan/vlc-android/tree/!COMMITID!">https://code.videolan.org/videolan/vlc-android/tree/!COMMITID!</a>.</p>
<p>The sources to this application can be retrieved at <a
href="https://code.videolan.org/videolan/vlc-android/tree/!COMMITID!"
id="revision_link">https://code.videolan.org/videolan/vlc-android/tree/!COMMITID!</a>.
</p>
<h2>Libraries</h2>
<p>Some VLC plugins use external libraries that make extensive use of the following persons' or companies' code:</p>
<ul>

View File

@@ -0,0 +1 @@
html,body{color:#fafafa;background:#323232;}a:link {color: #ff7d00;}a:visited {color: #ffca7d;}

View File

@@ -0,0 +1 @@
html,body{color:#212121;background:#fafafa;}a:link {color: #ff7d00;}a:visited {color: #ff610a;}

View File

@@ -17,7 +17,7 @@ android {
dexOptions {
maxProcessCount 8
javaMaxHeapSize "2g"
javaMaxHeapSize "4g"
preDexLibraries true
}
@@ -88,7 +88,7 @@ android {
unitTests.all {
testLogging {
events "passed", "skipped", "failed", "standardOut", "standardError"
outputs.upToDateWhen {false}
outputs.upToDateWhen { false }
showStandardStreams = true
}
}
@@ -106,7 +106,7 @@ android {
if (project.hasProperty('keyStoreFile')) {
storeFile file(project.findProperty('keyStoreFile'))
keyAlias project.findProperty('storealias')
if (System.getenv('PASSWORD_KEYSTORE') != null && !System.getenv('PASSWORD_KEYSTORE').isEmpty()){
if (System.getenv('PASSWORD_KEYSTORE') != null && !System.getenv('PASSWORD_KEYSTORE').isEmpty()) {
storePassword = System.getenv('PASSWORD_KEYSTORE')
keyPassword = System.getenv('PASSWORD_KEYSTORE')
} else {
@@ -123,7 +123,8 @@ android {
minifyEnabled true
shrinkResources false
proguardFile 'proguard.cfg'
kotlinOptions.freeCompilerArgs = [ '-Xno-param-assertions']
kotlinOptions.freeCompilerArgs = ['-Xno-param-assertions']
buildConfigField "boolean", "BETA", isBeta()
}
signedRelease {
initWith release
@@ -134,6 +135,7 @@ android {
applicationIdSuffix ".debug"
jniDebuggable true
multiDexEnabled true
buildConfigField "boolean", "BETA", "false"
}
dev {
initWith debug
@@ -160,7 +162,7 @@ android {
}
}
def abiCodes = ['x86':5, 'x86_64':8, 'armeabi-v7a':4, 'arm64-v8a':7]
def abiCodes = ['x86': 5, 'x86_64': 8, 'armeabi-v7a': 4, 'arm64-v8a': 7]
// make per-variant version code
applicationVariants.all { variant ->
//Custom APK name and versionCode
@@ -203,7 +205,7 @@ android {
}
}
task generateSources (type: Jar) {
task generateSources(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.srcDirs
}
@@ -214,17 +216,17 @@ task buildTranslationArray {
foundLocales.append("new String[]{")
fileTree("res").visit { FileVisitDetails details ->
println 'details: '+details
if(details.file.path.endsWith("strings.xml")){
def languageCode = details.file.parentFile.name.replaceAll('values-','').replaceAll('-r','-')
languageCode = (languageCode == "values") ? "en" : languageCode;
println 'details: ' + details
if (details.file.path.endsWith("strings.xml")) {
def languageCode = details.file.parentFile.name.replaceAll('values-', '').replaceAll('-r', '-')
languageCode = (languageCode == "values") ? "en" : languageCode
foundLocales.append("\"").append(languageCode).append("\"").append(",")
}
}
foundLocales.append("}")
//Don't forget to remove the trailing comma
def foundLocalesString = foundLocales.toString().replaceAll(',}','}')
def foundLocalesString = foundLocales.toString().replaceAll(',}', '}')
android.defaultConfig.buildConfigField "String[]", "TRANSLATION_ARRAY", foundLocalesString
}
}
@@ -304,6 +306,11 @@ def revision() {
return code.toString()
}
def isBeta() {
def versionNameLower = versionName.toLowerCase()
return (versionNameLower.contains("beta") || versionNameLower.contains("rc") || versionNameLower.contains("alpha") || versionNameLower.contains("dev")).toString()
}
kapt {
javacOptions {
@@ -312,4 +319,3 @@ kapt {
option("-Xmaxerrs", 500)
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

View File

@@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:pathData="M0,0h108v108h-108z"
android:strokeWidth="0.9818182"
android:fillColor="#074335"
android:fillAlpha="1"/>
</vector>

View File

@@ -0,0 +1,29 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<group>
<clip-path android:pathData="m54,28c-0.991,0 -1.642,0.441 -2.181,0.991 -0.746,0.762 -1.388,2.974 -1.388,2.974l-8.328,24.983l-3.371,0c-1.054,0 -2.054,0.923 -2.379,1.983L32.884,70.828c-0.464,1.59 -0.297,3.172 1.884,3.172l19.233,0 19.233,0c2.181,-0 2.347,-1.583 1.884,-3.172L71.647,58.931c-0.326,-1.06 -1.325,-1.983 -2.379,-1.983L65.897,56.948L57.569,31.966c0,0 -0.642,-2.213 -1.388,-2.974 -0.539,-0.551 -1.19,-0.991 -2.181,-0.991z M 0,0"/>
<path
android:pathData="m54,28c-0.991,0 -1.642,0.441 -2.181,0.991 -0.746,0.762 -1.388,2.974 -1.388,2.974l-8.328,24.983l-3.371,0c-1.054,0 -2.054,0.923 -2.379,1.983L32.884,70.828c-0.464,1.59 -0.297,3.172 1.884,3.172l19.233,0 19.233,0c2.181,-0 2.347,-1.583 1.884,-3.172L71.647,58.931c-0.326,-1.06 -1.325,-1.983 -2.379,-1.983L65.897,56.948L57.569,31.966c0,0 -0.642,-2.213 -1.388,-2.974 -0.539,-0.551 -1.19,-0.991 -2.181,-0.991z"
android:fillColor="#16dfb1"/>
<path
android:pathData="m65.897,56.948c0,0 0.529,1.586 0.793,2.379 0.383,1.151 0.567,1.73 -0.006,2.389C63.517,64.879 58.47,66.07 54,66.069 49.527,66.068 44.505,64.833 41.31,61.707L52.81,73.207L32.936,73.207c0.296,0.483 0.866,0.793 1.831,0.793l19.233,0 19.233,0c2.181,-0 2.347,-1.583 1.884,-3.172L71.647,58.931c-0.326,-1.06 -1.325,-1.983 -2.379,-1.983z"
android:fillColor="#16dfb1"
android:fillAlpha="1"/>
<path
android:pathData="m46.862,42.672c2.379,1.784 4.597,2.677 7.138,2.677 2.541,0 4.759,-0.892 7.138,-2.677 4.759,0 3.172,-10.707 -2.776,-8.328 -3.288,1.734 -5.552,1.586 -8.724,0 -5.948,-2.379 -7.534,8.328 -2.776,8.328zM42.103,56.948c0,0 -0.529,1.586 -0.793,2.379 -0.397,1.19 -0.598,1.794 0,2.379 3.194,3.126 8.217,4.361 12.69,4.362 4.47,0.001 9.517,-1.19 12.684,-4.352C67.257,61.058 67.073,60.479 66.69,59.328c-0.264,-0.793 -0.793,-2.379 -0.793,-2.379 2.776,0 0,-6.741 -1.586,-4.759 -3.172,3.172 -6.628,3.966 -10.31,3.966 -3.682,0 -7.138,-0.793 -10.31,-3.966 -1.586,-1.586 -4.362,4.759 -1.586,4.759z"
android:fillColor="#fafafa"/>
<path
android:pathData="m43.69,56.552c-1.652,5.114 5.252,5.685 5.912,1.971L54.397,31.569c0.443,-2.491 -1.519,-3.457 -2.379,-0.793z"
android:strokeAlpha="0.6"
android:strokeLineJoin="miter"
android:strokeWidth="1"
android:fillColor="#ffffff"
android:strokeColor="#00000000"
android:fillType="evenOdd"
android:fillAlpha="0.18823531"
android:strokeLineCap="butt"/>
</group>
</vector>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 191 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 198 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 B

View File

@@ -5,9 +5,9 @@
<shortcut
android:shortcutId="last_playlist"
android:enabled="true"
android:icon="@drawable/ic_queue_music"
android:shortcutShortLabel="@string/last_playlist_shortcut"
android:shortcutLongLabel="@string/last_playlist" >
android:icon="@drawable/ic_shortcut_resume_playback"
android:shortcutShortLabel="@string/resume_playback"
android:shortcutLongLabel="@string/resume_playback_long_shortcut">
<intent
android:action="vlc.shortcut.resume"
android:targetPackage="org.videolan.vlc.debug"

View File

@@ -6,6 +6,7 @@
-dontwarn **
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*,!code/allocation/variable
-keepattributes SourceFile,LineNumberTable
# Do not optimize/shrink LibVLC, because of native code
-keep class org.videolan.libvlc.** { *; }

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1017 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 859 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 563 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 582 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 585 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 697 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 613 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 733 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:drawable="@color/orange500transparent" />
<item android:drawable="@color/transparent" />
</selector>

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/playerbackground"></solid>
<corners
android:topLeftRadius="4dp"
android:bottomLeftRadius="4dp"></corners>
</shape>

View File

@@ -6,7 +6,8 @@
android:color="@color/whitetransparent" >
</solid>
<corners
android:radius="3dp" >
android:topLeftRadius="4dp"
android:bottomLeftRadius="4dp">
</corners>
</shape>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/playerbackground">
</solid>
<corners
android:bottomRightRadius="75dp"
android:topRightRadius="75dp"/>
</shape>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/playerbackground">
</solid>
<corners
android:bottomLeftRadius="75dp"
android:topLeftRadius="75dp"/>
</shape>

View File

@@ -0,0 +1,38 @@
<!--
~ *************************************************************************
~ ic_ctx_link_normal.xml
~ **************************************************************************
~ Copyright © 2019 VLC authors and VideoLAN
~ Author: Nicolas POMEPUY
~ This program is free software; you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by
~ the Free Software Foundation; either version 2 of the License, or
~ (at your option) any later version.
~
~ This program is distributed in the hope th202020202020at it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ GNU General Public License for more details.
~
~ You should have received a copy of the GNU General Public License
~ along with this program; if not, write to the Free Software
~ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
~ ***************************************************************************
~
~
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="38dp"
android:height="38dp"
android:viewportWidth="20"
android:viewportHeight="20">
<path
android:pathData="m5.75,6.25a3.75,3.75 0,0 0,-3.75 3.75,3.75 3.75,0 0,0 3.75,3.75L9,13.75v-1.5L5.75,12.25a2.25,2.25 0,0 1,-2.25 -2.25,2.25 2.25,0 0,1 2.25,-2.25L9,7.75v-1.5zM11,6.25v1.5h3.25a2.25,2.25 0,0 1,2.25 2.25,2.25 2.25,0 0,1 -2.25,2.25L11,12.25v1.5h3.25a3.75,3.75 0,0 0,3.75 -3.75,3.75 3.75,0 0,0 -3.75,-3.75zM7,9.25v1.5h6v-1.5z"
android:strokeAlpha="1"
android:strokeLineJoin="miter"
android:strokeWidth="0.32731667"
android:fillColor="#000000"
android:strokeColor="#00000000"
android:fillAlpha="1" />
</vector>

View File

@@ -0,0 +1,16 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="m2.929,0.0017c-0.6332,0.039 -1.1271,0.5632 -1.1272,1.1975v21.5974c-0.0012,0.9329 1.0158,1.5103 1.8162,1.0311l17.998,-10.8011c0.7765,-0.4661 0.7765,-1.5914 0,-2.0575L3.618,0.1704c-0.2074,-0.1234 -0.4476,-0.1836 -0.689,-0.168z"
android:strokeAlpha="1"
android:strokeLineJoin="round"
android:strokeWidth="2.39972544"
android:fillColor="?attr/player_icon_color"
android:strokeColor="#00000000"
android:fillType="evenOdd"
android:fillAlpha="1"
android:strokeLineCap="butt"/>
</vector>

View File

@@ -0,0 +1,16 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="m21.071,0.0017c0.6332,0.039 1.1271,0.5632 1.1272,1.1975v21.5974c0.0012,0.9329 -1.0158,1.5103 -1.8162,1.0311L2.3841,13.0266c-0.7765,-0.4661 -0.7765,-1.5914 0,-2.0575l17.998,-10.7987c0.2074,-0.1234 0.4476,-0.1836 0.689,-0.168z"
android:strokeAlpha="1"
android:strokeLineJoin="round"
android:strokeWidth="2.39972544"
android:fillColor="?attr/player_icon_color"
android:strokeColor="#00000000"
android:fillType="evenOdd"
android:fillAlpha="1"
android:strokeLineCap="butt"/>
</vector>

View File

@@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:pathData="M0,0h108v108h-108z"
android:strokeWidth="0.9818182"
android:fillColor="#ffffff"
android:fillAlpha="1"/>
</vector>

Some files were not shown because too many files have changed in this diff Show More