Create the new permission setting

This commit is contained in:
Nicolas Pomepuy 2024-10-22 08:46:35 +02:00 committed by Duncan McNamara
parent 7c11e62985
commit ba9420b3a1
16 changed files with 1205 additions and 0 deletions

View File

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="32mm"
height="32mm"
viewBox="0 0 32 32"
version="1.1"
id="svg869"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
sodipodi:docname="ic_permission_check_unchecked.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview871"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="true"
inkscape:zoom="3.1108586"
inkscape:cx="12.376005"
inkscape:cy="96.275672"
inkscape:window-width="2560"
inkscape:window-height="1376"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1">
<inkscape:grid
type="xygrid"
id="grid930" />
</sodipodi:namedview>
<defs
id="defs866" />
<g
inkscape:label="Calque 1"
inkscape:groupmode="layer"
id="layer1">
<path
id="path954"
style="fill:#757575;stroke-width:3.52754"
d="M 60.472656 7.5585938 A 52.913386 52.913386 0 0 0 7.5585938 60.472656 A 52.913386 52.913386 0 0 0 60.472656 113.38672 A 52.913386 52.913386 0 0 0 113.38672 60.472656 A 52.913386 52.913386 0 0 0 60.472656 7.5585938 z M 60.472656 11.337891 A 49.133858 49.133858 0 0 1 109.60547 60.472656 A 49.133858 49.133858 0 0 1 60.472656 109.60547 A 49.133858 49.133858 0 0 1 11.337891 60.472656 A 49.133858 49.133858 0 0 1 60.472656 11.337891 z "
transform="scale(0.26458333)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,244 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="32"
height="32"
viewBox="0 0 32 32"
version="1.1"
id="SVGRoot"
sodipodi:docname="ic_permission_media_audio.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview10963"
pagecolor="#ffffff"
bordercolor="#111111"
borderopacity="1"
inkscape:pageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
inkscape:document-units="px"
showgrid="true"
inkscape:zoom="7.2466938"
inkscape:cx="37.051379"
inkscape:cy="3.794834"
inkscape:window-width="2560"
inkscape:window-height="1376"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1">
<inkscape:grid
type="xygrid"
id="grid11026" />
</sodipodi:namedview>
<defs
id="defs10958">
<linearGradient
inkscape:collect="always"
id="linearGradient3906">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3908" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop3910" />
</linearGradient>
<linearGradient
id="linearGradient5801">
<stop
id="stop5807"
offset="0"
style="stop-color:#7f4400;stop-opacity:0.49803922;" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop5805" />
</linearGradient>
<linearGradient
id="linearGradient4755"
inkscape:collect="always">
<stop
id="stop4757"
offset="0"
style="stop-color:#000000;stop-opacity:1;" />
<stop
id="stop4759"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4755"
id="linearGradient3168"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.70645135,0,0,0.70645135,-127.87625,199.80852)"
x1="130"
y1="972.36218"
x2="350"
y2="1202.3622" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5801"
id="linearGradient3170"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.70645135,0,0,0.70645135,-127.87625,405.05058)"
x1="288"
y1="905.83679"
x2="248"
y2="865.83679" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3906"
id="linearGradient3172"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.70645135,0,0,0.70645135,-339.81165,411.74394)"
x1="548"
y1="840.36218"
x2="520"
y2="868.36218" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4755-4"
id="linearGradient3243"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.73291793,0,0,0.73291793,-68.425047,408.9889)"
x1="288"
y1="905.83679"
x2="248"
y2="865.83679" />
<linearGradient
id="linearGradient4755-4">
<stop
id="stop4757-9"
offset="0"
style="stop-color:#ff8800;stop-opacity:1;" />
<stop
id="stop4759-3"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4755-4"
id="linearGradient3902"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.73291793,0,0,0.73291793,-68.425047,196.05764)"
x1="220"
y1="1064.3622"
x2="324"
y2="1200.3622" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4755-4"
id="linearGradient4109"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.6925994,0,0,0.6925994,-124.58052,417.00327)"
x1="288"
y1="905.83679"
x2="248"
y2="865.83679" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4755-4"
id="linearGradient4112"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.6925994,0,0,0.6925994,-124.58052,215.78557)"
x1="220"
y1="1064.3622"
x2="324"
y2="1200.3622" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5801"
id="linearGradient4748"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.30474373,0,0,0.30474373,-109.31562,751.9659)"
x1="288"
y1="905.83679"
x2="248"
y2="865.83679" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4755-4"
id="linearGradient4746"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.30474373,0,0,0.30474373,-109.31562,663.59818)"
x1="235"
y1="1087.3622"
x2="350"
y2="1202.3622" />
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4372">
<path
inkscape:connector-curvature="0"
style="fill:#ff8800"
d="m 6.7127721,1041.1039 c -0.176491,0 -0.318719,0.028 -0.458307,0.1149 -0.229209,0.1146 -0.57318,1.1457 -0.57318,1.1457 l -0.229153,0.6875 -0.802334,2.407 -0.916612,2.7504 -0.458901,1.3749 h -0.01369 -0.211297 -0.766621 c -0.1534556,0 -0.5644956,0.229 -0.6630556,0.5589 -0.376361,1.286 -0.72779895,2.4867 -1.05648495,3.6099 -0.0675,0.2306 0.0031,0.4045 0.122017,0.5268 0.0013,0 0.0029,0 0.0042,0 h -0.0042 c 0.152882,0.1572 0.38413095,0.2291 0.49758895,0.2291 H 12.281487 c 0.04441,0 0.120828,-0.018 0.204155,-0.055 0.08327,-0.038 0.173718,-0.095 0.247009,-0.1738 0.118273,-0.1273 0.191794,-0.3115 0.118445,-0.5619 -0.175231,-0.5991 -0.348159,-1.1908 -0.522588,-1.7868 l -0.533896,-1.816 c -0.08905,-0.3037 -0.499589,-0.5339 -0.677341,-0.5339 h -0.966609 v -6e-4 l -0.4583057,-1.3749 -0.9166119,-2.7504 -0.8023323,-2.407 -0.229153,-0.6875 c 0,0 -0.343972,-1.0311 -0.573181,-1.1457 -0.139703,-0.087 -0.282044,-0.1149 -0.458306,-0.1149 z"
id="path4374" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4820">
<path
inkscape:connector-curvature="0"
style="fill:#ff8800"
d="m 1848.8208,4174.6353 c -22.8772,0 -41.3132,-3.6294 -59.407,-14.8936 -29.7107,-14.8548 -74.2971,-148.5088 -74.2971,-148.5088 l -29.7034,-89.1156 -104.0007,-312.0018 -118.8138,-356.5143 -59.484,-178.2182 h -1.7745 -27.3889 -99.3715 c -19.8913,0 -73.1714,-29.6836 -85.947,-72.4462 -48.7849,-166.6948 -94.3393,-322.3327 -136.9444,-467.925 -8.7496,-29.8909 0.4018,-52.4323 15.8161,-68.2852 0.1685,0 0.3759,0 0.5444,0 h -0.5444 c 19.817,-20.3767 49.7921,-29.6966 64.4988,-29.6966 h 1438.6493 c 5.7565,0 15.662,2.3333 26.4631,7.1293 10.7937,4.9257 22.5178,12.3142 32.018,22.5284 15.3308,16.501 24.8608,40.3775 15.3531,72.835 -22.7139,77.657 -45.1293,154.3547 -67.7392,231.6099 l -69.2051,235.3948 c -11.5429,39.3664 -64.7581,69.2055 -87.7987,69.2055 h -125.2945 v 0.078 l -59.4068,178.2183 -118.8137,356.5142 -104.0005,312.0019 -29.7035,89.1156 c 0,0 -44.5865,133.6539 -74.2972,148.5087 -18.1087,11.2772 -36.5593,14.8937 -59.4069,14.8937 z"
id="path4822" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4217">
<rect
y="976.95551"
x="-0.60522246"
height="30.474373"
width="48.758995"
id="rect4219"
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#757575;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.77165;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
</clipPath>
</defs>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<circle
style="fill:#757575;stroke-width:0.294741"
id="path845"
cx="16"
cy="16"
r="14" />
<g
id="g3158"
transform="matrix(0.98443372,0,0,0.98443372,-10.404198,-1018.4836)">
<g
id="g4203"
transform="matrix(1.4285714,0,0,1.4285714,-25.508491,-434.8634)">
<circle
r="4.2664123"
cy="1046.3929"
cx="43.030762"
id="circle7239"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ff8800;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1;marker:none;enable-background:accumulate" />
<path
sodipodi:nodetypes="ccccccc"
inkscape:connector-curvature="0"
id="rect7258"
d="m 42.421275,1048.2215 3.358522,-3.3585 -0.430971,-0.431 -2.927551,2.9275 -1.292918,-1.2929 -0.430972,0.431 z"
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#fafafa;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.77165;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
</g>
</g>
<path
id="path3110"
style="color:#000000;overflow:visible;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.12898;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
d="M 18.13387,6.25 C 16.950081,6.26792 15.999865,7.232741 16,8.416667 v 2.166666 7.080811 c -0.658725,-0.380418 -1.405985,-0.580733 -2.166667,-0.580811 -2.393234,0 -4.333333,1.9401 -4.333333,4.333334 0,2.393234 1.940099,4.333333 4.333333,4.333333 2.393234,0 4.333334,-1.940099 4.333334,-4.333333 V 10.583333 H 20.36613 C 21.549919,10.565413 22.500135,9.600592 22.5,8.416667 V 6.25 Z m -4.333333,13 c 0.01093,-8.3e-5 0.02187,-8.3e-5 0.0328,0 1.196617,0 2.166667,0.97005 2.166667,2.166667 0,1.196617 -0.97005,2.166666 -2.166667,2.166666 -1.196617,0 -2.166667,-0.970049 -2.166667,-2.166666 -1.35e-4,-1.183926 0.950081,-2.148746 2.133871,-2.166667 z"
sodipodi:nodetypes="cccccssscccccscsscss" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -0,0 +1,244 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="32"
height="32"
viewBox="0 0 32 32"
version="1.1"
id="SVGRoot"
sodipodi:docname="ic_permission_media_video.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview10963"
pagecolor="#ffffff"
bordercolor="#111111"
borderopacity="1"
inkscape:pageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
inkscape:document-units="px"
showgrid="true"
inkscape:zoom="7.2466938"
inkscape:cx="37.051379"
inkscape:cy="3.794834"
inkscape:window-width="2560"
inkscape:window-height="1376"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1">
<inkscape:grid
type="xygrid"
id="grid11026" />
</sodipodi:namedview>
<defs
id="defs10958">
<linearGradient
inkscape:collect="always"
id="linearGradient3906">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3908" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop3910" />
</linearGradient>
<linearGradient
id="linearGradient5801">
<stop
id="stop5807"
offset="0"
style="stop-color:#7f4400;stop-opacity:0.49803922;" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop5805" />
</linearGradient>
<linearGradient
id="linearGradient4755"
inkscape:collect="always">
<stop
id="stop4757"
offset="0"
style="stop-color:#000000;stop-opacity:1;" />
<stop
id="stop4759"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4755"
id="linearGradient3168"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.70645135,0,0,0.70645135,-127.87625,199.80852)"
x1="130"
y1="972.36218"
x2="350"
y2="1202.3622" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5801"
id="linearGradient3170"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.70645135,0,0,0.70645135,-127.87625,405.05058)"
x1="288"
y1="905.83679"
x2="248"
y2="865.83679" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3906"
id="linearGradient3172"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.70645135,0,0,0.70645135,-339.81165,411.74394)"
x1="548"
y1="840.36218"
x2="520"
y2="868.36218" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4755-4"
id="linearGradient3243"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.73291793,0,0,0.73291793,-68.425047,408.9889)"
x1="288"
y1="905.83679"
x2="248"
y2="865.83679" />
<linearGradient
id="linearGradient4755-4">
<stop
id="stop4757-9"
offset="0"
style="stop-color:#ff8800;stop-opacity:1;" />
<stop
id="stop4759-3"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4755-4"
id="linearGradient3902"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.73291793,0,0,0.73291793,-68.425047,196.05764)"
x1="220"
y1="1064.3622"
x2="324"
y2="1200.3622" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4755-4"
id="linearGradient4109"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.6925994,0,0,0.6925994,-124.58052,417.00327)"
x1="288"
y1="905.83679"
x2="248"
y2="865.83679" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4755-4"
id="linearGradient4112"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.6925994,0,0,0.6925994,-124.58052,215.78557)"
x1="220"
y1="1064.3622"
x2="324"
y2="1200.3622" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5801"
id="linearGradient4748"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.30474373,0,0,0.30474373,-109.31562,751.9659)"
x1="288"
y1="905.83679"
x2="248"
y2="865.83679" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4755-4"
id="linearGradient4746"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.30474373,0,0,0.30474373,-109.31562,663.59818)"
x1="235"
y1="1087.3622"
x2="350"
y2="1202.3622" />
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4372">
<path
inkscape:connector-curvature="0"
style="fill:#ff8800"
d="m 6.7127721,1041.1039 c -0.176491,0 -0.318719,0.028 -0.458307,0.1149 -0.229209,0.1146 -0.57318,1.1457 -0.57318,1.1457 l -0.229153,0.6875 -0.802334,2.407 -0.916612,2.7504 -0.458901,1.3749 h -0.01369 -0.211297 -0.766621 c -0.1534556,0 -0.5644956,0.229 -0.6630556,0.5589 -0.376361,1.286 -0.72779895,2.4867 -1.05648495,3.6099 -0.0675,0.2306 0.0031,0.4045 0.122017,0.5268 0.0013,0 0.0029,0 0.0042,0 h -0.0042 c 0.152882,0.1572 0.38413095,0.2291 0.49758895,0.2291 H 12.281487 c 0.04441,0 0.120828,-0.018 0.204155,-0.055 0.08327,-0.038 0.173718,-0.095 0.247009,-0.1738 0.118273,-0.1273 0.191794,-0.3115 0.118445,-0.5619 -0.175231,-0.5991 -0.348159,-1.1908 -0.522588,-1.7868 l -0.533896,-1.816 c -0.08905,-0.3037 -0.499589,-0.5339 -0.677341,-0.5339 h -0.966609 v -6e-4 l -0.4583057,-1.3749 -0.9166119,-2.7504 -0.8023323,-2.407 -0.229153,-0.6875 c 0,0 -0.343972,-1.0311 -0.573181,-1.1457 -0.139703,-0.087 -0.282044,-0.1149 -0.458306,-0.1149 z"
id="path4374" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4820">
<path
inkscape:connector-curvature="0"
style="fill:#ff8800"
d="m 1848.8208,4174.6353 c -22.8772,0 -41.3132,-3.6294 -59.407,-14.8936 -29.7107,-14.8548 -74.2971,-148.5088 -74.2971,-148.5088 l -29.7034,-89.1156 -104.0007,-312.0018 -118.8138,-356.5143 -59.484,-178.2182 h -1.7745 -27.3889 -99.3715 c -19.8913,0 -73.1714,-29.6836 -85.947,-72.4462 -48.7849,-166.6948 -94.3393,-322.3327 -136.9444,-467.925 -8.7496,-29.8909 0.4018,-52.4323 15.8161,-68.2852 0.1685,0 0.3759,0 0.5444,0 h -0.5444 c 19.817,-20.3767 49.7921,-29.6966 64.4988,-29.6966 h 1438.6493 c 5.7565,0 15.662,2.3333 26.4631,7.1293 10.7937,4.9257 22.5178,12.3142 32.018,22.5284 15.3308,16.501 24.8608,40.3775 15.3531,72.835 -22.7139,77.657 -45.1293,154.3547 -67.7392,231.6099 l -69.2051,235.3948 c -11.5429,39.3664 -64.7581,69.2055 -87.7987,69.2055 h -125.2945 v 0.078 l -59.4068,178.2183 -118.8137,356.5142 -104.0005,312.0019 -29.7035,89.1156 c 0,0 -44.5865,133.6539 -74.2972,148.5087 -18.1087,11.2772 -36.5593,14.8937 -59.4069,14.8937 z"
id="path4822" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath4217">
<rect
y="976.95551"
x="-0.60522246"
height="30.474373"
width="48.758995"
id="rect4219"
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#757575;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.77165;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
</clipPath>
</defs>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<circle
style="fill:#757575;stroke-width:0.294741"
id="path845"
cx="16"
cy="16"
r="14" />
<path
id="path46413"
style="color:#000000;fill:#000000;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none"
d="m 11,11 c -0.825,0 -1.5,0.675 -1.5,1.5 v 7 c 0,0.825 0.675,1.5 1.5,1.5 h 10 c 0.825,0 1.5,-0.675 1.5,-1.5 V 11.75 C 22.5,11.3375 22.1625,11 21.75,11 H 20 l 0.820312,1.638672 c 0.082,0.1657 -0.03806,0.360428 -0.222656,0.361328 h -0.980468 c -0.379001,0 -0.725132,-0.214034 -0.894532,-0.552734 L 18,11 h -1 l 0.820312,1.638672 c 0.082,0.1657 -0.03806,0.360428 -0.222656,0.361328 h -0.980468 c -0.379001,0 -0.725132,-0.214034 -0.894532,-0.552734 L 15,11 h -1 l 0.820312,1.638672 c 0.082,0.1657 -0.03806,0.360428 -0.222656,0.361328 h -0.980468 c -0.379,0 -0.725132,-0.214034 -0.894532,-0.552734 L 12,11 Z m 0.5,2 0.722656,1.447266 C 12.392056,14.785966 12.738287,15 13.117188,15 H 13.5 h 7 v 4 h -9 z"
sodipodi:nodetypes="sssssssscccscccccscccccsccsccsccccc" />
<g
id="g3158"
transform="matrix(0.98443372,0,0,0.98443372,-10.404198,-1018.4836)">
<g
id="g4203"
transform="matrix(1.4285714,0,0,1.4285714,-25.508491,-434.8634)">
<circle
r="4.2664123"
cy="1046.3929"
cx="43.030762"
id="circle7239"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#ff8800;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.1;marker:none;enable-background:accumulate" />
<path
sodipodi:nodetypes="ccccccc"
inkscape:connector-curvature="0"
id="rect7258"
d="m 42.421275,1048.2215 3.358522,-3.3585 -0.430971,-0.431 -2.927551,2.9275 -1.292918,-1.2929 -0.430972,0.431 z"
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#fafafa;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.77165;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -0,0 +1,56 @@
<!--
~ *************************************************************************
~ ic_permission_media_audio.xml
~ **************************************************************************
~ Copyright © 2024 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 that 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"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="32dp"
android:height="32dp"
android:viewportWidth="32"
android:viewportHeight="32">
<path
android:pathData="M16,16m-14,0a14,14 0,1 1,28 0a14,14 0,1 1,-28 0"
android:strokeWidth="0.294741"
android:fillColor="@color/grey600"/>
<path
android:pathData="M25,25m-6,0a6,6 135,1 1,12 0a6,6 135,1 1,-12 0"
android:strokeWidth="0.141"
android:fillColor="?attr/colorPrimary"
android:strokeColor="#00000000"
android:fillType="nonZero"/>
<path
android:pathData="m24.143,27.572 l4.723,-4.723 -0.606,-0.606 -4.117,4.117 -1.818,-1.818 -0.606,0.606z"
android:strokeLineJoin="round"
android:strokeWidth="2.492"
android:fillColor="@color/white"
android:strokeColor="#00000000"
android:fillType="nonZero"
android:strokeLineCap="round"/>
<path
android:pathData="M18.134,6.25C16.95,6.268 16,7.233 16,8.417v2.167,7.081c-0.659,-0.38 -1.406,-0.581 -2.167,-0.581 -2.393,0 -4.333,1.94 -4.333,4.333 0,2.393 1.94,4.333 4.333,4.333 2.393,0 4.333,-1.94 4.333,-4.333L18.167,10.583L20.366,10.583C21.55,10.565 22.5,9.601 22.5,8.417L22.5,6.25ZM13.801,19.25c0.011,-0 0.022,-0 0.033,0 1.197,0 2.167,0.97 2.167,2.167 0,1.197 -0.97,2.167 -2.167,2.167 -1.197,0 -2.167,-0.97 -2.167,-2.167 -0,-1.184 0.95,-2.149 2.134,-2.167z"
android:strokeLineJoin="round"
android:strokeWidth="2.12898"
android:fillColor="@color/white"
android:strokeColor="#00000000"
android:strokeLineCap="butt"/>
</vector>

View File

@ -0,0 +1,55 @@
<!--
~ *************************************************************************
~ ic_permission_media_audio.xml
~ **************************************************************************
~ Copyright © 2024 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 that 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="32dp"
android:height="32dp"
android:viewportWidth="32"
android:viewportHeight="32">
<path
android:fillColor="@color/grey400"
android:pathData="M16,16m-14,0a14,14 0,1 1,28 0a14,14 0,1 1,-28 0"
android:strokeWidth="0.294741" />
<path
android:fillColor="@color/grey300"
android:fillType="nonZero"
android:pathData="M25,25m-6,0a6,6 135,1 1,12 0a6,6 135,1 1,-12 0"
android:strokeWidth="0.141"
android:strokeColor="#00000000" />
<path
android:fillColor="@color/white"
android:fillType="nonZero"
android:pathData="m24.143,27.572 l4.723,-4.723 -0.606,-0.606 -4.117,4.117 -1.818,-1.818 -0.606,0.606z"
android:strokeWidth="2.492"
android:strokeColor="#00000000"
android:strokeLineCap="round"
android:strokeLineJoin="round" />
<path
android:fillColor="@color/white"
android:pathData="M18.134,6.25C16.95,6.268 16,7.233 16,8.417v2.167,7.081c-0.659,-0.38 -1.406,-0.581 -2.167,-0.581 -2.393,0 -4.333,1.94 -4.333,4.333 0,2.393 1.94,4.333 4.333,4.333 2.393,0 4.333,-1.94 4.333,-4.333L18.167,10.583L20.366,10.583C21.55,10.565 22.5,9.601 22.5,8.417L22.5,6.25ZM13.801,19.25c0.011,-0 0.022,-0 0.033,0 1.197,0 2.167,0.97 2.167,2.167 0,1.197 -0.97,2.167 -2.167,2.167 -1.197,0 -2.167,-0.97 -2.167,-2.167 -0,-1.184 0.95,-2.149 2.134,-2.167z"
android:strokeWidth="2.12898"
android:strokeColor="#00000000"
android:strokeLineCap="butt"
android:strokeLineJoin="round" />
</vector>

View File

@ -0,0 +1,30 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="32dp"
android:height="32dp"
android:viewportWidth="32"
android:viewportHeight="32">
<path
android:pathData="M16,16m-14,0a14,14 0,1 1,28 0a14,14 0,1 1,-28 0"
android:strokeWidth="0.294741"
android:fillColor="@color/grey600"/>
<path
android:pathData="m11,11c-0.825,0 -1.5,0.675 -1.5,1.5v7c0,0.825 0.675,1.5 1.5,1.5h10c0.825,0 1.5,-0.675 1.5,-1.5L22.5,11.75C22.5,11.337 22.163,11 21.75,11L20,11l0.82,1.639c0.082,0.166 -0.038,0.36 -0.223,0.361h-0.98c-0.379,0 -0.725,-0.214 -0.895,-0.553L18,11h-1l0.82,1.639c0.082,0.166 -0.038,0.36 -0.223,0.361h-0.98c-0.379,0 -0.725,-0.214 -0.895,-0.553L15,11h-1l0.82,1.639c0.082,0.166 -0.038,0.36 -0.223,0.361h-0.98c-0.379,0 -0.725,-0.214 -0.895,-0.553L12,11ZM11.5,13 L12.223,14.447C12.392,14.786 12.738,15 13.117,15L13.5,15h7v4h-9z"
android:strokeLineJoin="round"
android:fillColor="@color/white"
android:strokeLineCap="round"/>
<path
android:pathData="M25,25m-6,0a6,6 135,1 1,12 0a6,6 135,1 1,-12 0"
android:strokeWidth="0.141"
android:fillColor="?attr/colorPrimary"
android:strokeColor="#00000000"
android:fillType="nonZero"/>
<path
android:pathData="m24.143,27.572 l4.723,-4.723 -0.606,-0.606 -4.117,4.117 -1.818,-1.818 -0.606,0.606z"
android:strokeLineJoin="round"
android:strokeWidth="2.492"
android:fillColor="#fafafa"
android:strokeColor="#00000000"
android:fillType="nonZero"
android:strokeLineCap="round"/>
</vector>

View File

@ -0,0 +1,30 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="32dp"
android:height="32dp"
android:viewportWidth="32"
android:viewportHeight="32">
<path
android:pathData="M16,16m-14,0a14,14 0,1 1,28 0a14,14 0,1 1,-28 0"
android:strokeWidth="0.294741"
android:fillColor="@color/grey400"/>
<path
android:pathData="m11,11c-0.825,0 -1.5,0.675 -1.5,1.5v7c0,0.825 0.675,1.5 1.5,1.5h10c0.825,0 1.5,-0.675 1.5,-1.5L22.5,11.75C22.5,11.337 22.163,11 21.75,11L20,11l0.82,1.639c0.082,0.166 -0.038,0.36 -0.223,0.361h-0.98c-0.379,0 -0.725,-0.214 -0.895,-0.553L18,11h-1l0.82,1.639c0.082,0.166 -0.038,0.36 -0.223,0.361h-0.98c-0.379,0 -0.725,-0.214 -0.895,-0.553L15,11h-1l0.82,1.639c0.082,0.166 -0.038,0.36 -0.223,0.361h-0.98c-0.379,0 -0.725,-0.214 -0.895,-0.553L12,11ZM11.5,13 L12.223,14.447C12.392,14.786 12.738,15 13.117,15L13.5,15h7v4h-9z"
android:strokeLineJoin="round"
android:fillColor="@color/white"
android:strokeLineCap="round"/>
<path
android:pathData="M25,25m-6,0a6,6 135,1 1,12 0a6,6 135,1 1,-12 0"
android:strokeWidth="0.141"
android:fillColor="@color/grey300"
android:strokeColor="#00000000"
android:fillType="nonZero"/>
<path
android:pathData="m24.143,27.572 l4.723,-4.723 -0.606,-0.606 -4.117,4.117 -1.818,-1.818 -0.606,0.606z"
android:strokeLineJoin="round"
android:strokeWidth="2.492"
android:fillColor="#fafafa"
android:strokeColor="#00000000"
android:fillType="nonZero"
android:strokeLineCap="round"/>
</vector>

View File

@ -0,0 +1,9 @@
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="?attr/permission_explanation_background">
</solid>
<corners android:radius="8dp">
</corners>
</shape>

View File

@ -81,6 +81,7 @@
<attr name="widget_preview_rounded_bg" format="reference" />
<attr name="swipe_refresh_background" format="reference|color" />
<attr name="dialogButtonStyle" format="reference" />
<attr name="permission_explanation_background" format="color" />
<!--Main Icons-->
<attr name="gridview_progressbar" format="reference" />

View File

@ -1113,6 +1113,14 @@
<string name="notification_permission">Notification permission</string>
<string name="notification_permission_explanation">VLC needs your permission to send notifications.\nThe app will only notify you when scanning your media or using the custom video Picture in Picture.\nRefusing it won\'t prevent VLC to work, however the notifications will be hidden.</string>
<string name="permission">Permission</string>
<string name="permission_no_access">No file access</string>
<string name="permissions">Permissions</string>
<string name="permissions_summary">List of all the permissions</string>
<string name="manage_storage_permission">File permissions</string>
<string name="permission_media_title">Access to standard media</string>
<string name="permission_all_title">All file access</string>
<string name="permission_all_warning">To enable this, you have to disable the standard media file access first</string>
<string name="permission_media_warning">To enable this, you have to disable the full file permission first</string>
<string name="customize">Customize</string>
<string name="selection_count">%d selected</string>
<string name="control_setting">Control settings</string>

View File

@ -0,0 +1,187 @@
<?xml version="1.0" encoding="utf-8"?><!--
~ *************************************************************************
~ dialog_permissions.xml
~ **************************************************************************
~ Copyright © 2024 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 that 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.
~ ***************************************************************************
~
~
-->
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical">
<TextView
android:id="@+id/permission_title"
style="@style/Theme.VLC.BottomSheetTitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:minHeight="0dp"
android:text="@string/permissions"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView37"
style="@style/Theme.VLC.BottomSheetTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="24dp"
android:text="@string/manage_storage_permission"
android:textColor="?attr/colorPrimary"
android:textSize="16sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/permission_title" />
<TextView
android:id="@+id/file_access_explanation"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="16dp"
android:background="@drawable/rounded_corners_permissions_explanation"
android:drawablePadding="16dp"
android:fontFamily="sans-serif-medium"
android:gravity="center_vertical"
android:padding="16dp"
android:text="@string/permission_onboarding_perm_all"
android:textColor="?attr/font_default"
android:textSize="18sp"
app:drawableTint="?attr/font_default"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView37" />
<TextView
android:id="@+id/all_access_warning"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="8dp"
android:background="@drawable/rounded_corners_permissions_warning"
android:padding="12dp"
android:textSize="16sp"
android:text="@string/permission_all_warning"
android:textColor="?attr/font_default"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/manage_all_perms_check"
tools:visibility="visible" />
<RadioButton
android:id="@+id/no_access_check"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:layout_weight="1"
android:enabled="true"
android:paddingStart="16dp"
android:text="@string/permission_no_access"
android:textColor="?attr/font_default"
android:textSize="16sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/file_access_explanation" />
<RadioButton
android:id="@+id/manage_media_perms_check"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:layout_weight="1"
android:enabled="true"
android:paddingStart="16dp"
android:text="@string/permission_media_title"
android:textColor="?attr/font_default"
android:textSize="16sp"
app:layout_constraintEnd_toStartOf="@+id/manage_media_audio"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/no_access_check" />
<ImageView
android:id="@+id/manage_media_audio"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
android:background="?attr/selectableItemBackgroundBorderless"
app:layout_constraintBottom_toBottomOf="@+id/manage_media_perms_check"
app:layout_constraintEnd_toStartOf="@+id/manage_media_video"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/manage_media_perms_check"
app:layout_constraintTop_toTopOf="@+id/manage_media_perms_check"
app:srcCompat="@drawable/ic_permission_media_audio" />
<ImageView
android:id="@+id/manage_media_video"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
android:background="?attr/selectableItemBackgroundBorderless"
app:layout_constraintBottom_toBottomOf="@+id/manage_media_perms_check"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/manage_media_audio"
app:layout_constraintTop_toTopOf="@+id/manage_media_perms_check"
app:srcCompat="@drawable/ic_permission_media_video" />
<RadioButton
android:id="@+id/manage_all_perms_check"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:layout_weight="1"
android:enabled="true"
android:paddingStart="16dp"
android:text="@string/permission_all_title"
android:textColor="?attr/font_default"
android:textSize="16sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/manage_media_perms_check" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView>
</layout>

View File

@ -77,6 +77,7 @@
<item name="primary_focus">@color/orange_800_transparent_20</item>
<item name="swipe_refresh_background">?attr/background_default</item>
<item name="dialogButtonStyle">@style/Widget.MaterialComponents.Button.TextButton.Dialog</item>
<item name="permission_explanation_background">@color/grey200</item>
<item name="gridview_progressbar">@drawable/gridview_progressbar</item>
<item name="progress_mini_player">@drawable/progress_mini_player</item>
@ -269,6 +270,7 @@
<item name="primary_focus">@color/orange_500_transparent_20</item>
<item name="swipe_refresh_background">?attr/background_default_darker</item>
<item name="dialogButtonStyle">@style/Widget.MaterialComponents.Button.TextButton.Dialog</item>
<item name="permission_explanation_background">@color/grey800</item>
<item name="gridview_progressbar">@drawable/gridview_progressbar_w</item>
<item name="progress_mini_player">@drawable/progress_mini_player_black</item>

View File

@ -50,6 +50,12 @@
android:summary="%s"
android:title="@string/metered_connection"/>
</PreferenceCategory>
<PreferenceCategory android:title="@string/permissions">
<PreferenceScreen
android:key="permissions"
android:summary="@string/permissions_summary"
android:title="@string/permissions"/>
</PreferenceCategory>
<PreferenceCategory android:title="@string/history">
<CheckBoxPreference

View File

@ -0,0 +1,246 @@
/*
* ************************************************************************
* PermissionListDialog.kt
* *************************************************************************
* Copyright © 2024 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 that 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.
* **************************************************************************
*
*
*/
package org.videolan.vlc.gui.dialogs
import android.Manifest
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.util.TypedValue
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.RadioButton
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.lifecycle.lifecycleScope
import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_EXPANDED
import kotlinx.coroutines.launch
import org.videolan.resources.SCHEME_PACKAGE
import org.videolan.tools.dp
import org.videolan.tools.setGone
import org.videolan.tools.setInvisible
import org.videolan.tools.setVisible
import org.videolan.vlc.R
import org.videolan.vlc.databinding.DialogPermissionsBinding
import org.videolan.vlc.util.Permissions
/**
* Dialog showing the info of the current version
*/
class PermissionListDialog : VLCBottomSheetDialogFragment() {
private lateinit var binding: DialogPermissionsBinding
private val defaultBackground: Int
get() {
val outValue = TypedValue()
requireActivity().theme.resolveAttribute(
android.R.attr.selectableItemBackground,
outValue,
true
)
return outValue.resourceId
}
companion object {
fun newInstance(): PermissionListDialog {
return PermissionListDialog()
}
}
override fun getDefaultState(): Int {
return STATE_EXPANDED
}
override fun needToManageOrientation(): Boolean {
return false
}
override fun initialFocusedView(): View = binding.permissionTitle
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = DialogPermissionsBinding.inflate(layoutInflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
}
override fun onResume() {
super.onResume()
updateStorageState()
}
private fun updateStorageState() {
// radio states
arrayOf(
binding.noAccessCheck,
binding.manageAllPermsCheck,
binding.manageMediaPermsCheck
).forEach {
it.isChecked = false
}
when {
Permissions.hasAllAccess(requireActivity()) -> binding.manageAllPermsCheck.isChecked = true
Permissions.hasAnyFileFineAccess(requireActivity()) -> binding.manageMediaPermsCheck.isChecked = true
else -> binding.noAccessCheck.isChecked = true
}
// media permission states
binding.manageMediaVideo.isEnabled = !Permissions.hasAllAccess(requireActivity()) && !Permissions.hasVideoPermission(requireActivity())
binding.manageMediaAudio.isEnabled = !Permissions.hasAllAccess(requireActivity()) && !Permissions.hasAudioPermission(requireActivity())
//backgrounds
binding.manageMediaPermsCheck.setBackgroundResource(defaultBackground)
// explanation text state
binding.fileAccessExplanation.text = when {
Permissions.hasAllAccess(requireActivity()) -> getString(R.string.permission_onboarding_perm_all)
Permissions.hasAnyFileFineAccess(requireActivity()) -> getString(R.string.permission_onboarding_perm_media)
else -> getString(R.string.permission_expanation_no_allow)
}
binding.fileAccessExplanation.setCompoundDrawablesRelativeWithIntrinsicBounds(when {
Permissions.hasAllAccess(requireActivity()) -> ContextCompat.getDrawable(requireActivity(), R.drawable.ic_perm_all)
Permissions.hasAnyFileFineAccess(requireActivity()) -> ContextCompat.getDrawable(requireActivity(), R.drawable.ic_perm_media)
else -> ContextCompat.getDrawable(requireActivity(), R.drawable.ic_perm_none)
}, null, null, null)
//warning visibility
binding.allAccessWarning.setInvisible()
binding.allAccessWarning.text = when {
Permissions.hasAllAccess(requireActivity()) -> getString(R.string.permission_media_warning)
Permissions.hasAnyFileFineAccess(requireActivity()) -> getString(R.string.permission_all_warning)
else -> ""
}
//media permission icons
binding.manageMediaVideo.setImageDrawable(
ContextCompat.getDrawable(
requireActivity(),
if (Permissions.hasVideoPermission(requireActivity())) R.drawable.ic_permission_media_video else R.drawable.ic_permission_media_video_denied
)
)
binding.manageMediaAudio.setImageDrawable(
ContextCompat.getDrawable(
requireActivity(),
if (Permissions.hasAudioPermission(requireActivity())) R.drawable.ic_permission_media_audio else R.drawable.ic_permission_media_audio_denied
)
)
//click listeners
binding.noAccessCheck.setOnClickListener {
if (Permissions.hasAllAccess(requireActivity()) || Permissions.hasAnyFileFineAccess(
requireActivity()
)
) {
(it as RadioButton).isChecked = false
when {
Permissions.hasAllAccess(requireActivity()) -> binding.manageAllPermsCheck
else -> binding.manageMediaPermsCheck
}.background = ContextCompat.getDrawable(requireActivity(), R.drawable.rounded_corners_permissions_warning)
showWarning()
}
}
binding.manageAllPermsCheck.setOnClickListener {
if (Permissions.hasAnyFileFineAccess(requireActivity())) {
(it as RadioButton).isChecked = false
binding.manageMediaPermsCheck.background = ContextCompat.getDrawable(requireActivity(), R.drawable.rounded_corners_permissions_warning)
showWarning()
} else
requireActivity().lifecycleScope.launch {
val uri = Uri.fromParts(SCHEME_PACKAGE, requireContext().packageName, null)
val intent = Intent(
android.provider.Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION,
uri
)
startActivity(intent)
}
}
binding.manageMediaPermsCheck.setOnClickListener {
if (Permissions.hasAnyFileFineAccess(requireActivity())) {
Permissions.showAppSettingsPage(requireActivity())
(it as RadioButton).isChecked = false
} else if (Permissions.hasAllAccess(requireActivity())) {
(it as RadioButton).isChecked = false
binding.manageAllPermsCheck.background = ContextCompat.getDrawable(requireActivity(), R.drawable.rounded_corners_permissions_warning)
showWarning()
} else
ActivityCompat.requestPermissions(
requireActivity(), arrayOf(
Manifest.permission.READ_MEDIA_VIDEO,
Manifest.permission.READ_MEDIA_AUDIO
), Permissions.FINE_STORAGE_PERMISSION_REQUEST_CODE
)
}
binding.manageMediaAudio.setOnClickListener {
if (!Permissions.hasAllAccess(requireActivity()) && !Permissions.hasAudioPermission(requireActivity())) {
ActivityCompat.requestPermissions(
requireActivity(), arrayOf(
Manifest.permission.READ_MEDIA_AUDIO
), Permissions.FINE_STORAGE_PERMISSION_REQUEST_CODE
)
}
}
binding.manageMediaVideo.setOnClickListener {
if (!Permissions.hasAllAccess(requireActivity()) && !Permissions.hasVideoPermission(requireActivity())) {
ActivityCompat.requestPermissions(
requireActivity(), arrayOf(
Manifest.permission.READ_MEDIA_VIDEO
), Permissions.FINE_STORAGE_PERMISSION_REQUEST_CODE
)
}
}
}
private fun showWarning() {
binding.allAccessWarning.translationY = 100.dp.toFloat()
binding.allAccessWarning.setVisible()
binding.allAccessWarning.animate().translationY(0F).setDuration(300).start()
}
}

View File

@ -57,7 +57,9 @@ import org.videolan.vlc.R
import org.videolan.vlc.gui.PinCodeActivity
import org.videolan.vlc.gui.PinCodeReason
import org.videolan.vlc.gui.SecondaryActivity
import org.videolan.vlc.gui.dialogs.AboutVersionDialog
import org.videolan.vlc.gui.dialogs.ConfirmAudioPlayQueueDialog
import org.videolan.vlc.gui.dialogs.PermissionListDialog
import org.videolan.vlc.gui.helpers.UiTools
import org.videolan.vlc.gui.preferences.search.PreferenceItem
import org.videolan.vlc.util.Permissions
@ -147,6 +149,10 @@ class PreferencesFragment : BasePreferenceFragment(), SharedPreferences.OnShared
pinCodeResult.launch(intent)
}
}
"permissions" -> {
PermissionListDialog.newInstance().show(requireActivity().supportFragmentManager, "PermissionListDialog")
}
"remote_access_category" -> loadFragment(PreferencesRemoteAccess())
"android_auto_category" -> loadFragment(PreferencesAndroidAuto())
PLAYBACK_HISTORY -> {

View File

@ -127,6 +127,36 @@ object Permissions {
}
fun hasAudioPermission(context: Context) = (
ContextCompat.checkSelfPermission(
context,
Manifest.permission.READ_MEDIA_AUDIO
) == PackageManager.PERMISSION_GRANTED
)
fun hasVideoPermission(context: Context) = (
ContextCompat.checkSelfPermission(
context,
Manifest.permission.READ_MEDIA_VIDEO
) == PackageManager.PERMISSION_GRANTED
)
fun hasAnyFileFineAccess(context: Context) = (
ContextCompat.checkSelfPermission(
context,
Manifest.permission.READ_MEDIA_AUDIO
) == PackageManager.PERMISSION_GRANTED
||
ContextCompat.checkSelfPermission(
context,
Manifest.permission.READ_MEDIA_VIDEO
) == PackageManager.PERMISSION_GRANTED
||
ContextCompat.checkSelfPermission(
context,
Manifest.permission.READ_MEDIA_IMAGES
) == PackageManager.PERMISSION_GRANTED
)
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
private fun isAnyFileFinePermissionGranted(context: Context) = (
ContextCompat.checkSelfPermission(