Compare commits
431 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
008a2a28fd | ||
|
|
1b373fab27 | ||
|
|
5d47b5007f | ||
|
|
70567f48e1 | ||
|
|
ad33c52d4d | ||
|
|
b1d58b0ea4 | ||
|
|
f6cd2b8468 | ||
|
|
518eebcff0 | ||
|
|
94daf7aa49 | ||
|
|
d260007eb1 | ||
|
|
932346e7fd | ||
|
|
024da2c682 | ||
|
|
bd0c9cacc7 | ||
|
|
0351475a5d | ||
|
|
48245fb006 | ||
|
|
a5b8465ea8 | ||
|
|
4598db40d7 | ||
|
|
1ee118fa48 | ||
|
|
5416fd9d26 | ||
|
|
8df83e4713 | ||
|
|
4dd44324b9 | ||
|
|
6366db2a3c | ||
|
|
3d4cb224cc | ||
|
|
ca0d82ffcc | ||
|
|
a13d74d9f5 | ||
|
|
f50dbb3ece | ||
|
|
198915ab2a | ||
|
|
72f52308a5 | ||
|
|
7b684102d8 | ||
|
|
e086c43f4e | ||
|
|
a3e6694d62 | ||
|
|
0f46c2ee97 | ||
|
|
9f01f3b5ae | ||
|
|
3997671b20 | ||
|
|
81672afdff | ||
|
|
27c2b4872b | ||
|
|
3d82f5e8fc | ||
|
|
61cc782f11 | ||
|
|
33bc61dbeb | ||
|
|
1a95661ae3 | ||
|
|
cb06aa9ae3 | ||
|
|
b5fffa3b28 | ||
|
|
588b2f1dcc | ||
|
|
3129a708bd | ||
|
|
f986995b10 | ||
|
|
0256f033e3 | ||
|
|
bb8e00deab | ||
|
|
ed71b6ccb1 | ||
|
|
a988f61f49 | ||
|
|
3af1841e3c | ||
|
|
128989413f | ||
|
|
0c59fb366c | ||
|
|
dec68c0d7f | ||
|
|
82ce982fa9 | ||
|
|
66c5b0aa76 | ||
|
|
85ebd5c69b | ||
|
|
8236871b51 | ||
|
|
b97f6d9876 | ||
|
|
78c4f498ef | ||
|
|
cbd3227095 | ||
|
|
eaf34547f1 | ||
|
|
cde791b379 | ||
|
|
17800d21a4 | ||
|
|
83ab057311 | ||
|
|
3057d48fa1 | ||
|
|
994d698983 | ||
|
|
4656310d75 | ||
|
|
a40f71af08 | ||
|
|
a9bbfbdaae | ||
|
|
80ea0147a9 | ||
|
|
973f2537e6 | ||
|
|
490951638d | ||
|
|
3d21f01b89 | ||
|
|
55dee0beda | ||
|
|
e9126b85b5 | ||
|
|
50ed6077ab | ||
|
|
645789eab4 | ||
|
|
5f45629892 | ||
|
|
42bf3aafe6 | ||
|
|
fb105f84ac | ||
|
|
d9d349a755 | ||
|
|
e077e79212 | ||
|
|
61a18a93c7 | ||
|
|
1842d8e0d1 | ||
|
|
b0a46b257e | ||
|
|
3c4adb040a | ||
|
|
20b577d599 | ||
|
|
3cc72e28b7 | ||
|
|
b8a16d6a64 | ||
|
|
a04099c5fc | ||
|
|
ec2ce87150 | ||
|
|
e0c9a1c08b | ||
|
|
a53314f785 | ||
|
|
43c7d93f17 | ||
|
|
3fa28153b4 | ||
|
|
f07cca264a | ||
|
|
902467eed4 | ||
|
|
545f1d29c1 | ||
|
|
e5da5c009a | ||
|
|
9706675809 | ||
|
|
b54049f07a | ||
|
|
150586d763 | ||
|
|
809a3f3b47 | ||
|
|
9dcc353d20 | ||
|
|
fa8a38f9fe | ||
|
|
b262da32d9 | ||
|
|
d40c0c89c1 | ||
|
|
90ad3e69af | ||
|
|
df8d6fb645 | ||
|
|
e3c91b75f2 | ||
|
|
7658431556 | ||
|
|
85f4ea377c | ||
|
|
f322bb6f00 | ||
|
|
5437847430 | ||
|
|
dfff5c7658 | ||
|
|
70e7411217 | ||
|
|
4a7c26f78e | ||
|
|
f242b23e0d | ||
|
|
5f5f69ae3b | ||
|
|
c2b11fea0c | ||
|
|
fede2baadb | ||
|
|
84c06c8a1c | ||
|
|
11821b61a7 | ||
|
|
0161ad25c1 | ||
|
|
145f7d59f5 | ||
|
|
0f1014fb4e | ||
|
|
99cc39384c | ||
|
|
317dfd7a79 | ||
|
|
e366a13438 | ||
|
|
fb17941e66 | ||
|
|
c3ad850843 | ||
|
|
ff253ddf11 | ||
|
|
67c8079bd7 | ||
|
|
1efdd35671 | ||
|
|
47eede33e3 | ||
|
|
dfa0b7a941 | ||
|
|
f8bbdf3283 | ||
|
|
78660e743a | ||
|
|
215847a48e | ||
|
|
c10bde9fb7 | ||
|
|
abc36b6d76 | ||
|
|
5c7e91106f | ||
|
|
aebfe400be | ||
|
|
a7b4c52e85 | ||
|
|
6d355119f1 | ||
|
|
e1ca2a86f0 | ||
|
|
47b9b70733 | ||
|
|
093d9b6f8a | ||
|
|
ca8cc43a7a | ||
|
|
339cd0e0d1 | ||
|
|
f525858652 | ||
|
|
100a3b55ec | ||
|
|
d8616f57bc | ||
|
|
66f5f8e388 | ||
|
|
7debef054b | ||
|
|
ed88026130 | ||
|
|
24a1d496ac | ||
|
|
47a059389e | ||
|
|
cef5622af1 | ||
|
|
0cb645dce3 | ||
|
|
f093c56e0a | ||
|
|
79bce0fb15 | ||
|
|
413ffaa62b | ||
|
|
9bdb7fb6d3 | ||
|
|
dde6270a98 | ||
|
|
e89eae0063 | ||
|
|
041bf19c19 | ||
|
|
d002070541 | ||
|
|
0e4acdf728 | ||
|
|
a8d18d5cb8 | ||
|
|
439f785b80 | ||
|
|
2cb26cab94 | ||
|
|
7ccff62df1 | ||
|
|
ae6b2c9b76 | ||
|
|
6e992e20dc | ||
|
|
34c70eb6ba | ||
|
|
da54d1a42b | ||
|
|
567cd572df | ||
|
|
a59303ea3c | ||
|
|
495ce5d906 | ||
|
|
db30a301c5 | ||
|
|
12b49ba09d | ||
|
|
f78f26a84b | ||
|
|
cfa8dfada1 | ||
|
|
ef66bc0f6f | ||
|
|
43ed9b2517 | ||
|
|
a170070d71 | ||
|
|
a0fa873022 | ||
|
|
94f8d86554 | ||
|
|
9e2b2361a4 | ||
|
|
11f0da629d | ||
|
|
d78e5a0c5f | ||
|
|
812a197442 | ||
|
|
94c720fc0b | ||
|
|
313c78bc61 | ||
|
|
4d276e7eac | ||
|
|
7d4d7004a8 | ||
|
|
6e6560e943 | ||
|
|
2d581275b3 | ||
|
|
e2e6d2825f | ||
|
|
95b675e4f0 | ||
|
|
9a1d89322d | ||
|
|
b1b71a7783 | ||
|
|
d4864c5d1d | ||
|
|
ae93c7bd6b | ||
|
|
7cafb7bebd | ||
|
|
da04035b51 | ||
|
|
d1db74422b | ||
|
|
70ae39663c | ||
|
|
d8769c7809 | ||
|
|
a46b591a00 | ||
|
|
d5387f829b | ||
|
|
33eb99610c | ||
|
|
8cf6abbaed | ||
|
|
65a37b12bd | ||
|
|
9935f78b71 | ||
|
|
850b15709c | ||
|
|
10fb71df99 | ||
|
|
c73b6d16d7 | ||
|
|
5ae93e24a5 | ||
|
|
dbe70ad689 | ||
|
|
9b24ef768e | ||
|
|
6b1b699024 | ||
|
|
ec9a75a0c1 | ||
|
|
f59fb96b82 | ||
|
|
1954a636f8 | ||
|
|
0c01f43bea | ||
|
|
3c81dd1733 | ||
|
|
d8410c5eac | ||
|
|
7e41d7d3de | ||
|
|
85db26e8d7 | ||
|
|
983f32df75 | ||
|
|
2327814e6f | ||
|
|
cbc1826bad | ||
|
|
d0bdcc9d54 | ||
|
|
55abb0c3e9 | ||
|
|
f61d06ca29 | ||
|
|
dd91226044 | ||
|
|
c42984a5fc | ||
|
|
9442fb10ae | ||
|
|
83d9dbae4a | ||
|
|
3da6f0d57e | ||
|
|
29eeed20d1 | ||
|
|
5f444eaf54 | ||
|
|
cfde19e1e5 | ||
|
|
4a72fee9f2 | ||
|
|
bea54abb03 | ||
|
|
9f8a8c9a48 | ||
|
|
294553ea1a | ||
|
|
4572957241 | ||
|
|
1bf3d4bc89 | ||
|
|
ccf6c4d65b | ||
|
|
eecd4e705c | ||
|
|
a5e1c7751c | ||
|
|
0390b2fcda | ||
|
|
b86625e1ac | ||
|
|
6f68d74681 | ||
|
|
1c5441a169 | ||
|
|
d28c90e444 | ||
|
|
3b325bba5c | ||
|
|
beedf2ee84 | ||
|
|
5b1edaad12 | ||
|
|
5100becf8c | ||
|
|
6e5b9dac12 | ||
|
|
629ae05b3d | ||
|
|
027504ab82 | ||
|
|
d63f50b6c7 | ||
|
|
1ec1278424 | ||
|
|
7f4b771326 | ||
|
|
bcb70403c8 | ||
|
|
4f7df350cc | ||
|
|
0c31089bc5 | ||
|
|
e869f80c8b | ||
|
|
9b53d6a617 | ||
|
|
f7cec27ecf | ||
|
|
0f79b362a5 | ||
|
|
ed3c05f9ef | ||
|
|
7333d4ca15 | ||
|
|
09a73b2f2d | ||
|
|
34664e8dab | ||
|
|
103b6d8f91 | ||
|
|
463409ccc5 | ||
|
|
fa37848bab | ||
|
|
84bb6bfa8c | ||
|
|
e1f69331d3 | ||
|
|
a8cf0bdf93 | ||
|
|
772fd1fb3b | ||
|
|
c78e265daa | ||
|
|
c187df6c4c | ||
|
|
73fea07e8a | ||
|
|
8534b3581c | ||
|
|
6ed8dc6043 | ||
|
|
55f889bbc9 | ||
|
|
f0f347bc20 | ||
|
|
24aef56f26 | ||
|
|
210cf57745 | ||
|
|
1404d35210 | ||
|
|
fc167700fe | ||
|
|
2cc00afb6c | ||
|
|
9a6a8cc92c | ||
|
|
8a5023f93f | ||
|
|
4ece3b470c | ||
|
|
2e2ab451e5 | ||
|
|
41594492f2 | ||
|
|
47df86cbe0 | ||
|
|
1bb5295152 | ||
|
|
199eb91545 | ||
|
|
28e2046d7e | ||
|
|
f9235580f4 | ||
|
|
ecb8fd6caa | ||
|
|
78ebf05b1a | ||
|
|
401d988ab1 | ||
|
|
6ad17976c9 | ||
|
|
66f6861b11 | ||
|
|
5e189c35d5 | ||
|
|
5c5e5d8331 | ||
|
|
f16a8cf2ce | ||
|
|
463236aac7 | ||
|
|
30f0748a7f | ||
|
|
8fb4bad450 | ||
|
|
c7f2929ceb | ||
|
|
02ae94d64c | ||
|
|
f6f5c9d5ae | ||
|
|
47ec6fabb9 | ||
|
|
20c4d9859e | ||
|
|
a4121c3c39 | ||
|
|
8541369b70 | ||
|
|
58ba9ca982 | ||
|
|
54948a6ff5 | ||
|
|
dbebe56e02 | ||
|
|
3c3bfe4086 | ||
|
|
c6b1ae73bc | ||
|
|
c5b7c6f534 | ||
|
|
728323fe28 | ||
|
|
b88ca4b83b | ||
|
|
71aa2f9223 | ||
|
|
171bf06052 | ||
|
|
7dc49a370e | ||
|
|
6a5e2187d6 | ||
|
|
4153f632cc | ||
|
|
6d59455bb7 | ||
|
|
7dc4a2428e | ||
|
|
7837471561 | ||
|
|
3648a5807e | ||
|
|
8f4533c490 | ||
|
|
ae6c6a304d | ||
|
|
fce11dee74 | ||
|
|
42028545c2 | ||
|
|
bba0cc0755 | ||
|
|
c96fb475c1 | ||
|
|
1f20f02426 | ||
|
|
ff0a943a10 | ||
|
|
a25b0f5e6b | ||
|
|
9cf087945b | ||
|
|
c9ecd3c41d | ||
|
|
33c68f62ec | ||
|
|
95f0f771fb | ||
|
|
7d3dd4e14f | ||
|
|
22be0c50a7 | ||
|
|
72e5f2d933 | ||
|
|
d4aef069ca | ||
|
|
a8f2e12abc | ||
|
|
3b1f95ee44 | ||
|
|
69c473518f | ||
|
|
f0d9f9c470 | ||
|
|
5b50ab3186 | ||
|
|
020ee09101 | ||
|
|
1e5573fd1a | ||
|
|
537417c22d | ||
|
|
0860addcc5 | ||
|
|
db49fd51b0 | ||
|
|
54f97c5f44 | ||
|
|
8455085bf2 | ||
|
|
429268ce18 | ||
|
|
c7bb1e9c97 | ||
|
|
59fc5f742f | ||
|
|
280eaac6d7 | ||
|
|
03df0b7e71 | ||
|
|
634e539d23 | ||
|
|
48b2076e51 | ||
|
|
62a3faf8da | ||
|
|
dcee75d925 | ||
|
|
374801c5d0 | ||
|
|
d0b0fb961b | ||
|
|
01c5e8f134 | ||
|
|
48acbc94a9 | ||
|
|
baa75df65a | ||
|
|
8b7a555d99 | ||
|
|
70706d4041 | ||
|
|
2aefd25b16 | ||
|
|
b8cce14758 | ||
|
|
7d12536b31 | ||
|
|
63a54e81d4 | ||
|
|
68f96d2acf | ||
|
|
0792bf31ef | ||
|
|
125f04af1f | ||
|
|
be11f61f5f | ||
|
|
39c373f437 | ||
|
|
96cab698a7 | ||
|
|
9c63acebd3 | ||
|
|
6b43008c36 | ||
|
|
1f1f07f7ca | ||
|
|
a6c4f1a824 | ||
|
|
2204a58e71 | ||
|
|
e53c69e32c | ||
|
|
1c1d5f6a7d | ||
|
|
51bc326bbf | ||
|
|
e980acafec | ||
|
|
2b1736b418 | ||
|
|
287cae6972 | ||
|
|
fcdae1ad40 | ||
|
|
363841ee91 | ||
|
|
f8b192b01a | ||
|
|
54c02367ef | ||
|
|
54a7d5d6b9 | ||
|
|
7a54d8ecb3 | ||
|
|
f8d52fadfa | ||
|
|
0201e48839 | ||
|
|
8f15d80f80 | ||
|
|
ff6c4fa9a9 | ||
|
|
c711e098c5 | ||
|
|
6c12e4c4e7 | ||
|
|
0789613948 | ||
|
|
2feb7a7199 | ||
|
|
b5b9e4c705 | ||
|
|
d35e5c4171 | ||
|
|
dd14d8a27b | ||
|
|
06198b5f45 | ||
|
|
4729705c8e | ||
|
|
0a1a9d8daf | ||
|
|
e91236b908 |
@@ -1,7 +1,7 @@
|
||||
cache:
|
||||
paths:
|
||||
- .gradle/
|
||||
- gradle-5.1.1/
|
||||
- gradle-5.4.1/
|
||||
- gradle/
|
||||
- gradlew
|
||||
|
||||
|
||||
190
NEWS
@@ -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:
|
||||
------------------
|
||||
|
||||
|
||||
41
assets/images/svg/ic_ctx_link_normal.svg
Normal 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 |
34
assets/images/svg/ic_empty.svg
Normal 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 |
@@ -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 |
@@ -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 |
201
assets/images/svg/ic_launcher_reporter.svg
Normal 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 |
30
build.gradle
@@ -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
|
||||
|
||||
@@ -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 \
|
||||
"
|
||||
|
||||
########################
|
||||
|
||||
@@ -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
|
||||
|
||||
38
compile.sh
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
@@ -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 +++++++++
|
||||
@@ -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
|
||||
@@ -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 ++++++++
|
||||
@@ -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 +++++++++++++
|
||||
4
libvlc/res/values/colors.xml
Normal file
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="black">#000000</color>
|
||||
</resources>
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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"
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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, ¶ms);
|
||||
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, ¶ms);
|
||||
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, ¶ms);
|
||||
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, ¶ms);
|
||||
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, ¶ms);
|
||||
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, ¶ms);
|
||||
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(¶ms);
|
||||
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, ¶ms);
|
||||
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, ¶ms);
|
||||
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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
@@ -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 © 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>
|
||||
|
||||
1
vlc-android/assets/licence_dark.css
Normal file
@@ -0,0 +1 @@
|
||||
html,body{color:#fafafa;background:#323232;}a:link {color: #ff7d00;}a:visited {color: #ffca7d;}
|
||||
1
vlc-android/assets/licence_light.css
Normal file
@@ -0,0 +1 @@
|
||||
html,body{color:#212121;background:#fafafa;}a:link {color: #ff7d00;}a:visited {color: #ff610a;}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 4.3 KiB |
@@ -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>
|
||||
@@ -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>
|
||||
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 191 B |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 186 B |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 198 B |
|
Before Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 218 B |
@@ -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"
|
||||
|
||||
@@ -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.** { *; }
|
||||
|
||||
BIN
vlc-android/res/drawable-hdpi/ic_empty_normal.png
Normal file
|
After Width: | Height: | Size: 5.0 KiB |
BIN
vlc-android/res/drawable-hdpi/ic_empty_w.png
Normal file
|
After Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 1017 B |
|
Before Width: | Height: | Size: 859 B |
|
Before Width: | Height: | Size: 1.0 KiB |
BIN
vlc-android/res/drawable-hdpi/ic_shortcut_resume_playback.png
Normal file
|
After Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 563 B |
|
Before Width: | Height: | Size: 582 B |
|
Before Width: | Height: | Size: 585 B |
BIN
vlc-android/res/drawable-mdpi/ic_empty_normal.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
vlc-android/res/drawable-mdpi/ic_empty_w.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 697 B |
|
Before Width: | Height: | Size: 613 B |
|
Before Width: | Height: | Size: 733 B |
BIN
vlc-android/res/drawable-mdpi/ic_shortcut_resume_playback.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
vlc-android/res/drawable-xhdpi/ic_empty_normal.png
Normal file
|
After Width: | Height: | Size: 6.0 KiB |
BIN
vlc-android/res/drawable-xhdpi/ic_empty_w.png
Normal file
|
After Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
BIN
vlc-android/res/drawable-xhdpi/ic_shortcut_resume_playback.png
Normal file
|
After Width: | Height: | Size: 4.1 KiB |
BIN
vlc-android/res/drawable-xxhdpi/ic_empty_normal.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
vlc-android/res/drawable-xxhdpi/ic_empty_w.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
vlc-android/res/drawable-xxhdpi/ic_shortcut_resume_playback.png
Normal file
|
After Width: | Height: | Size: 7.7 KiB |
BIN
vlc-android/res/drawable-xxxhdpi/ic_empty_normal.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
vlc-android/res/drawable-xxxhdpi/ic_empty_w.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
vlc-android/res/drawable-xxxhdpi/ic_shortcut_resume_playback.png
Normal file
|
After Width: | Height: | Size: 9.3 KiB |
@@ -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>
|
||||
9
vlc-android/res/drawable/advanced_options_background.xml
Normal 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>
|
||||
@@ -6,7 +6,8 @@
|
||||
android:color="@color/whitetransparent" >
|
||||
</solid>
|
||||
<corners
|
||||
android:radius="3dp" >
|
||||
android:topLeftRadius="4dp"
|
||||
android:bottomLeftRadius="4dp">
|
||||
</corners>
|
||||
|
||||
</shape>
|
||||
11
vlc-android/res/drawable/half_circle_tv_left.xml
Normal 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>
|
||||
11
vlc-android/res/drawable/half_circle_tv_right.xml
Normal 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>
|
||||
38
vlc-android/res/drawable/ic_ctx_link_normal.xml
Normal 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>
|
||||
16
vlc-android/res/drawable/ic_half_seek_forward_tv.xml
Normal 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>
|
||||
16
vlc-android/res/drawable/ic_half_seek_rewind_tv.xml
Normal 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>
|
||||
11
vlc-android/res/drawable/ic_launcher_background.xml
Normal 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>
|
||||