|
- /*
- ==============================================================================
-
- This file is part of the JUCE library.
- Copyright (c) 2020 - Raw Material Software Limited
-
- JUCE is an open source library subject to commercial or open-source
- licensing.
-
- By using JUCE, you agree to the terms of both the JUCE 6 End-User License
- Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).
-
- End User License Agreement: www.juce.com/juce-6-licence
- Privacy Policy: www.juce.com/juce-privacy-policy
-
- Or: You may also use this code under the terms of the GPL v3 (see
- www.gnu.org/licenses).
-
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
- DISCLAIMED.
-
- ==============================================================================
- */
-
- namespace juce
- {
- // This byte-code is generated from native/java/com/rmsl/juce/ComponentPeerView.java with min sdk version 16
- // See juce_core/native/java/README.txt on how to generate this byte-code.
- static const uint8 javaComponentPeerView[] =
- {31,139,8,8,212,138,183,97,0,3,74,97,118,97,68,101,120,66,121,116,101,67,111,100,101,46,100,101,120,0,165,155,11,120,84,213,181,
- 199,215,62,231,204,76,50,153,36,147,73,72,2,36,100,18,2,132,144,48,147,132,231,77,144,71,0,77,8,15,73,64,9,180,50,73,38,201,
- 192,228,204,48,51,121,160,237,173,40,21,172,214,71,11,62,177,190,253,188,109,109,109,171,94,63,31,183,180,246,179,253,20,253,
- 192,226,163,214,182,86,189,214,7,229,34,31,90,175,181,114,255,107,159,61,147,9,143,210,246,134,239,55,107,157,181,223,123,175,
- 189,246,62,19,210,19,28,113,250,27,102,211,219,117,91,222,126,241,223,63,156,100,111,184,247,80,238,157,199,91,61,254,101,3,
- 151,60,183,166,252,189,89,68,81,34,26,89,63,203,67,234,167,18,182,50,97,217,231,129,35,6,81,51,228,1,27,81,49,228,177,12,162,
- 203,32,31,206,36,66,18,237,206,38,122,115,42,81,70,14,209,75,165,68,135,193,171,224,117,240,22,120,23,124,1,196,36,34,27,200,0,
- 46,224,6,249,160,8,204,1,171,193,90,176,30,116,130,47,131,110,208,15,6,192,215,193,147,224,21,240,17,215,81,70,84,3,218,192,48,
- 184,17,124,23,252,20,188,12,142,2,167,151,104,54,104,5,61,96,31,120,26,28,3,149,229,68,155,192,181,224,39,224,15,32,167,2,253,
- 0,55,131,151,192,199,96,252,100,162,249,96,19,184,12,236,5,15,130,3,224,56,112,84,18,85,131,243,192,151,192,54,112,23,120,10,
- 252,26,188,3,62,1,159,3,231,20,162,108,144,7,138,65,9,168,4,213,160,14,204,5,77,96,17,88,6,90,193,106,176,14,108,0,1,208,3,66,
- 32,2,18,224,50,176,3,124,29,124,3,124,11,220,10,238,0,119,131,71,193,115,224,21,240,22,56,10,62,3,118,172,153,7,76,2,213,96,14,
- 104,6,107,65,63,136,130,175,130,93,224,30,240,16,120,24,60,3,158,7,191,6,191,5,239,128,15,193,167,192,54,141,104,28,168,4,181,
- 96,22,184,16,92,4,58,65,0,92,9,174,3,123,193,189,224,97,240,2,248,16,124,2,178,171,48,47,96,42,168,7,139,192,10,176,25,12,130,
- 43,193,117,224,78,240,16,120,12,252,20,28,0,191,7,71,129,62,29,99,3,21,96,17,88,14,218,192,106,176,25,196,192,78,240,109,112,
- 23,120,12,252,18,188,6,254,4,78,128,204,106,248,39,168,1,115,64,19,88,8,86,128,53,32,0,162,96,7,184,22,220,6,238,3,223,7,143,
- 131,159,131,223,129,247,192,71,192,57,3,190,4,188,192,7,102,131,5,96,25,184,0,172,2,23,129,0,136,128,97,240,85,112,37,184,9,
- 124,15,60,13,14,130,63,3,170,65,255,64,13,152,5,154,65,59,8,128,48,184,12,236,4,215,129,59,192,247,192,79,192,83,224,89,240,2,
- 248,13,120,15,252,15,200,169,133,95,130,9,224,60,176,9,116,131,126,48,2,174,2,119,130,31,130,167,193,171,224,40,200,154,9,95,6,
- 211,64,3,104,6,23,130,205,32,10,190,6,110,5,119,130,251,193,67,224,81,240,36,216,15,158,5,7,193,175,193,235,224,109,240,62,248,
- 12,216,124,136,15,96,42,168,7,179,193,60,208,4,22,129,165,224,2,208,6,236,152,18,132,38,202,2,133,160,136,172,120,53,30,76,0,
- 19,65,9,64,40,34,132,15,66,120,32,132,1,194,182,39,108,115,154,204,177,15,96,107,16,92,153,224,138,4,87,34,184,2,97,249,72,77,
- 57,97,200,132,174,17,154,36,63,168,3,245,160,1,32,116,210,108,48,7,204,85,241,115,62,248,55,208,8,154,192,2,112,30,88,8,22,129,
- 197,96,9,89,49,118,25,184,0,92,12,186,64,55,232,1,65,178,198,151,252,113,40,89,83,98,141,89,168,103,167,210,217,206,243,160,41,
- 187,75,233,179,96,207,77,171,203,163,230,172,73,217,115,148,61,87,165,37,245,113,74,119,171,121,229,250,243,149,190,84,149,45,
- 78,171,147,231,186,173,196,210,121,142,59,84,158,169,105,245,76,87,245,228,41,125,19,244,2,165,247,148,88,109,242,156,135,85,
- 61,172,39,84,61,181,170,158,113,106,29,190,162,250,195,107,177,179,196,154,195,122,149,167,69,233,220,86,171,210,175,133,190,
- 66,233,220,110,155,210,111,129,190,82,233,15,66,95,165,244,71,160,175,86,250,126,232,107,148,126,0,250,133,74,63,12,189,93,233,
- 111,164,217,223,73,211,143,64,95,167,244,19,105,118,118,202,164,158,145,166,187,75,71,235,44,78,179,123,161,119,40,189,42,205,
- 94,146,86,39,207,249,90,165,247,164,245,205,159,150,159,231,115,189,210,231,193,126,145,210,23,165,229,89,147,166,95,92,106,
- 249,102,131,154,219,13,74,223,12,123,167,210,251,211,244,4,244,141,74,191,28,250,38,165,239,134,254,37,165,239,129,126,137,210,
- 239,130,254,101,165,63,152,102,103,31,219,172,244,135,97,15,40,125,127,90,254,3,165,236,231,130,182,147,37,179,4,239,251,41,20,
- 39,75,62,42,165,160,199,149,124,66,201,39,149,124,74,201,167,85,254,95,201,101,241,82,134,176,100,158,224,184,209,64,191,36,
- 150,101,148,41,56,134,88,233,101,42,189,12,41,5,130,125,190,144,182,241,58,97,215,61,38,101,25,61,43,101,41,29,146,178,129,254,
- 36,101,22,125,32,125,126,42,45,135,180,33,2,125,68,188,63,237,116,131,148,227,232,78,200,76,68,49,93,202,89,116,130,120,159,87,
- 201,231,44,101,207,66,68,248,88,142,219,122,206,69,187,215,75,89,72,55,170,231,91,148,188,139,253,74,165,187,113,131,219,163,
- 158,111,147,82,167,219,201,218,159,251,148,188,67,74,65,247,43,249,0,241,126,212,104,175,148,211,233,62,226,189,55,69,182,155,
- 143,72,247,71,41,231,211,91,82,78,164,255,38,222,167,181,52,168,228,113,226,248,60,135,158,33,142,31,46,122,73,202,241,116,140,
- 125,92,245,127,60,34,45,203,18,68,203,71,164,172,166,79,165,92,72,154,92,15,191,76,47,197,200,119,74,89,76,187,213,243,213,82,
- 206,163,35,114,157,102,202,124,147,80,227,31,136,215,199,42,87,6,123,175,146,125,82,230,82,191,148,104,95,88,210,144,235,56,85,
- 230,247,98,101,66,82,250,104,139,148,139,105,171,148,249,20,86,114,64,202,69,100,74,57,158,70,148,252,170,148,115,105,135,148,
- 229,116,141,148,30,250,166,148,217,116,157,148,118,250,182,242,151,189,42,253,38,41,103,211,205,82,102,210,119,164,116,210,221,
- 42,223,61,82,102,208,189,82,90,235,224,197,12,61,168,228,127,40,249,93,229,127,223,147,114,18,125,95,217,31,82,254,248,3,37,
- 127,168,228,195,82,122,233,71,82,54,210,143,165,156,67,63,87,242,23,82,78,166,151,165,172,160,87,148,124,85,201,215,84,250,111,
- 212,243,235,74,254,86,202,28,122,67,202,105,244,59,41,107,232,247,82,158,71,111,74,105,249,143,87,249,15,63,191,173,246,203,59,
- 82,90,254,196,249,223,149,178,137,142,74,89,79,159,40,249,23,41,103,208,103,82,78,160,207,165,172,163,191,169,231,47,84,190,
- 147,74,146,176,210,133,176,230,197,35,248,156,42,162,91,137,229,18,250,153,220,159,26,253,84,202,60,114,11,62,139,44,63,157,
- 129,29,241,45,226,243,72,167,127,151,82,163,231,137,207,164,2,218,79,124,63,24,175,252,212,218,75,201,51,18,175,82,116,24,135,
- 228,7,234,144,154,164,236,124,198,113,12,231,244,35,72,207,84,129,182,76,149,159,145,86,254,115,164,151,168,116,47,89,231,40,
- 159,129,149,170,188,11,114,169,74,231,179,127,47,218,218,103,13,151,30,168,183,108,79,66,254,28,232,42,253,0,120,69,229,249,
- 131,180,235,82,95,237,179,238,9,27,133,147,162,110,110,109,163,150,133,181,204,64,45,220,86,167,207,186,43,121,68,71,151,147,
- 182,185,27,96,207,210,10,241,122,88,167,105,198,124,205,32,135,59,143,58,186,178,104,155,119,18,197,176,235,57,95,71,183,149,
- 87,167,44,99,219,154,217,180,100,208,169,205,215,254,124,210,116,243,120,29,238,170,63,25,170,253,168,186,223,85,96,70,163,238,
- 75,229,104,185,109,238,247,165,62,235,206,117,182,182,117,68,102,143,167,97,218,248,211,219,244,207,161,37,54,23,98,197,49,180,
- 201,231,132,83,152,222,169,136,78,46,81,245,238,233,185,231,202,220,85,239,115,188,53,100,127,110,240,89,107,215,17,181,242,
- 113,74,161,38,239,33,218,124,228,241,32,174,116,108,115,166,167,107,98,167,216,235,120,96,216,62,15,35,67,28,63,166,163,191,60,
- 198,125,62,142,239,152,89,79,54,198,56,8,155,135,54,185,93,242,78,150,129,39,30,235,253,62,235,108,205,183,23,80,133,230,66,62,
- 158,133,142,120,54,117,52,228,144,233,110,70,46,151,152,47,154,70,109,222,243,177,23,71,115,44,66,14,167,190,22,23,221,181,83,
- 4,253,168,227,70,210,141,217,155,39,208,186,56,230,65,47,36,143,190,9,90,50,127,71,34,27,253,246,97,36,46,131,251,111,200,121,
- 152,69,205,54,206,63,95,119,208,220,205,54,242,228,115,25,110,171,16,241,205,116,143,227,145,157,210,70,213,139,188,150,236,
- 115,7,125,214,29,110,163,39,71,141,179,2,115,24,245,86,195,195,55,186,65,126,174,28,179,144,255,136,222,244,89,223,51,68,221,
- 124,219,206,73,217,223,75,217,235,164,93,83,183,224,99,62,203,159,59,220,185,114,79,176,7,113,187,159,250,172,123,112,135,55,
- 23,125,92,202,59,132,58,202,221,232,245,68,180,156,147,202,119,242,172,249,74,100,190,28,120,60,143,196,142,238,28,96,191,115,
- 120,10,163,222,34,196,219,10,35,11,189,177,163,87,27,247,20,226,169,140,162,254,26,218,147,185,113,79,62,158,74,241,52,69,62,
- 21,160,222,133,88,107,151,49,193,22,69,189,88,65,232,101,70,33,202,229,81,137,97,131,45,134,120,238,52,230,25,95,162,50,39,63,
- 227,253,146,58,247,121,160,153,184,225,108,186,125,28,180,62,156,73,166,183,95,126,134,16,175,42,80,103,212,45,207,97,163,128,
- 38,47,158,69,83,5,223,0,77,175,129,158,119,112,159,108,216,191,94,27,113,141,14,180,234,209,77,247,144,234,201,255,146,103,234,
- 228,222,57,24,79,87,70,17,173,204,176,59,60,69,37,25,89,82,51,253,219,168,195,238,210,231,233,5,228,209,60,149,147,151,206,37,
- 143,109,155,59,129,121,112,217,87,218,13,155,103,156,71,74,211,191,157,190,109,176,167,177,119,243,168,172,222,239,161,170,187,
- 179,141,170,19,224,56,56,6,94,7,124,88,232,134,188,247,143,254,92,190,144,254,169,231,83,127,172,116,190,59,22,98,63,114,180,
- 224,123,139,166,87,221,42,166,221,44,102,238,21,90,205,29,162,250,118,65,42,186,224,158,234,183,124,166,221,235,145,113,214,
- 144,145,15,239,208,126,229,99,254,149,84,174,231,96,207,219,100,188,219,233,183,98,108,116,93,47,149,55,59,165,63,39,203,220,
- 152,76,243,47,70,25,151,244,193,100,218,109,169,180,5,169,52,135,188,237,17,221,171,210,134,236,107,101,100,224,58,109,106,223,
- 255,216,111,237,153,246,69,158,180,248,162,195,23,217,18,245,183,226,182,82,245,217,232,120,158,80,117,241,123,112,39,198,148,
- 163,250,192,63,251,253,86,236,247,184,115,83,123,230,57,127,114,207,20,200,62,37,237,7,149,125,29,246,116,174,178,115,202,43,
- 126,235,93,211,116,47,147,125,149,177,14,245,121,168,234,11,93,181,243,134,223,58,71,114,100,57,235,77,244,157,52,155,93,197,
- 239,15,207,49,182,11,212,216,146,249,79,156,35,127,75,106,46,172,126,252,237,12,253,176,213,157,110,115,165,217,12,213,86,126,
- 157,245,253,128,71,240,55,8,27,253,26,89,82,167,13,117,136,123,199,54,248,29,180,193,111,87,214,76,248,49,86,210,189,193,111,
- 32,61,3,251,113,60,250,83,78,94,145,167,198,203,107,82,81,103,157,213,103,238,127,199,146,66,138,174,189,144,140,11,171,62,101,
- 223,208,165,255,85,159,181,76,195,178,147,39,229,184,23,53,145,17,224,50,46,180,195,103,245,92,100,226,187,170,103,188,135,218,
- 239,65,57,62,17,133,102,204,195,25,222,113,119,30,214,174,148,215,14,167,133,78,28,233,178,177,87,156,25,166,59,7,50,203,254,
- 242,142,147,52,67,240,119,19,85,199,219,239,230,184,227,230,116,196,139,60,150,134,233,246,176,180,57,238,26,202,224,55,99,113,
- 67,213,239,207,149,111,149,149,239,185,115,229,91,99,229,227,23,39,97,200,239,58,120,14,120,61,248,254,196,223,193,56,241,196,
- 123,166,187,206,250,174,197,227,110,143,141,142,112,190,176,78,222,26,126,149,38,78,49,113,142,102,162,118,211,157,197,210,238,
- 216,38,118,14,217,87,96,252,85,127,142,248,139,105,87,38,78,226,247,76,247,124,180,86,197,23,77,205,154,247,228,247,71,44,243,
- 21,46,117,246,239,168,179,222,59,49,187,87,160,109,187,108,219,110,205,230,252,204,76,180,153,201,35,18,158,138,250,114,7,69,
- 22,141,167,91,158,64,43,199,77,183,19,118,151,152,39,248,166,99,233,166,119,152,215,194,198,53,113,31,179,184,143,59,196,30,
- 171,143,30,119,213,171,150,47,176,255,220,89,103,125,239,49,214,23,172,17,179,141,199,106,39,167,22,93,219,6,47,66,217,143,73,
- 69,24,162,135,210,124,60,83,197,178,39,149,111,69,46,158,64,29,67,233,181,206,67,155,214,158,138,98,79,113,153,92,229,91,7,144,
- 92,130,138,218,15,33,183,206,35,23,186,156,117,145,43,216,147,114,200,153,201,158,4,95,114,188,124,35,123,210,39,114,23,85,125,
- 212,254,146,7,146,87,127,146,92,245,60,206,107,227,213,207,225,49,31,98,47,193,136,243,170,222,56,119,206,53,86,206,95,158,59,
- 231,106,228,52,221,124,175,112,102,121,242,230,78,172,38,79,249,228,146,217,240,194,37,244,2,121,38,204,126,162,156,184,22,174,
- 227,7,92,135,55,159,165,240,216,150,218,92,182,43,214,61,59,206,244,22,88,150,194,165,118,151,253,138,222,103,11,147,245,190,
- 230,116,138,170,55,209,143,43,241,230,143,151,138,71,111,252,163,83,100,204,119,22,211,63,58,130,233,212,123,50,189,63,255,74,
- 79,184,166,170,223,254,243,61,88,165,122,48,229,255,221,131,85,178,7,188,103,173,111,39,217,183,56,46,250,148,228,253,203,239,
- 242,113,233,123,154,188,67,53,215,91,223,165,162,143,184,135,56,200,165,77,208,255,74,158,130,201,75,113,15,177,117,217,113,15,
- 145,119,138,109,84,111,240,189,214,129,126,103,227,140,1,159,123,60,147,43,112,11,209,249,22,146,129,155,198,74,67,211,249,246,
- 177,77,171,58,154,173,85,29,1,31,128,247,216,223,243,208,183,137,114,239,34,10,107,53,133,213,197,122,85,213,180,154,153,213,
- 105,241,63,82,63,186,55,116,101,29,174,183,238,228,243,52,7,241,140,132,145,35,135,60,139,170,254,202,227,179,206,136,203,235,
- 173,56,192,119,58,190,125,79,208,254,75,222,233,202,209,90,25,222,39,231,33,122,152,238,17,236,80,167,88,32,242,49,219,166,191,
- 146,252,24,241,114,153,223,244,79,38,183,209,81,151,143,155,118,173,172,63,153,226,209,76,127,5,185,53,43,109,38,207,239,113,
- 235,247,108,252,147,252,206,151,191,167,46,128,173,36,249,229,173,250,169,58,229,121,222,41,207,92,190,128,172,187,64,30,122,
- 39,148,141,241,42,153,161,210,61,234,220,159,160,236,101,74,106,10,175,154,175,25,52,87,218,107,149,189,22,209,217,146,66,198,
- 83,161,254,217,104,244,142,161,41,223,72,222,45,140,148,46,148,221,145,250,46,91,195,76,139,84,126,150,217,169,50,44,237,42,
- 205,78,13,50,157,109,14,37,51,149,76,126,23,158,35,123,69,234,190,195,99,108,80,99,241,74,123,131,242,225,134,84,175,173,242,
- 179,148,156,173,202,37,251,201,50,91,181,207,122,110,42,61,55,109,76,217,169,177,22,165,250,97,213,237,86,237,121,83,57,173,
- 113,121,85,110,65,214,251,191,168,34,188,223,217,155,66,102,40,113,30,105,231,53,82,97,115,100,32,26,49,131,102,98,77,48,24,91,
- 31,10,14,207,220,18,24,10,144,88,78,218,242,22,18,45,164,181,76,7,80,91,73,107,109,163,210,214,193,238,224,226,238,238,96,60,
- 30,234,10,133,67,137,237,171,34,61,193,53,177,200,80,168,39,24,163,162,21,193,237,93,145,64,172,103,105,40,62,16,138,199,219,
- 66,241,68,208,68,130,104,35,173,13,181,181,161,154,182,54,210,219,240,128,143,86,254,104,163,194,182,128,217,19,139,132,122,
- 124,129,104,212,183,184,59,17,26,66,205,141,52,107,172,61,26,13,135,186,3,137,80,196,172,76,230,105,11,245,6,187,183,119,135,
- 131,205,129,112,184,43,208,189,53,222,72,227,207,86,42,61,169,59,98,162,103,9,95,51,203,145,68,122,82,95,44,16,237,15,117,199,
- 125,205,1,115,40,128,10,39,157,33,41,18,142,196,150,135,194,137,96,236,236,233,43,3,137,88,104,164,145,166,255,221,244,49,85,
- 21,159,158,117,77,32,100,162,127,69,167,167,172,13,118,35,33,63,149,16,137,251,150,12,154,61,225,96,35,21,164,27,91,150,132,
- 204,30,174,125,180,142,33,44,181,15,139,181,108,40,200,149,79,24,155,176,50,194,211,165,210,166,143,77,99,39,169,92,109,46,143,
- 116,15,198,155,251,3,102,95,48,185,200,233,93,73,101,77,31,82,202,120,126,44,50,24,109,164,57,167,167,116,196,130,193,213,93,
- 241,96,108,40,24,67,43,231,135,35,93,129,112,91,96,123,100,48,49,218,76,217,223,47,215,72,117,99,51,4,210,253,213,55,198,123,
- 87,6,204,64,31,23,169,255,135,139,176,195,183,152,189,145,211,250,127,142,50,201,77,210,72,51,199,150,11,153,209,193,196,64,48,
- 209,31,233,241,45,9,196,81,57,158,225,151,38,150,87,122,237,148,179,231,95,214,19,74,68,98,86,119,170,207,158,237,180,42,107,
- 207,145,119,165,212,83,179,179,176,173,59,50,224,139,13,196,195,190,45,8,0,190,211,194,70,229,223,141,11,141,180,252,156,21,
- 156,37,114,84,142,93,217,249,255,106,61,141,84,126,174,162,141,84,209,214,19,8,15,133,182,250,2,166,25,73,200,152,225,91,102,
- 118,135,35,241,144,217,215,28,14,196,101,48,56,61,79,11,38,54,166,210,203,207,144,190,50,56,208,165,50,4,145,165,244,12,89,218,
- 67,125,102,32,49,24,11,242,134,225,24,236,11,99,111,249,176,195,98,237,193,109,131,65,179,27,41,121,233,41,86,115,21,105,166,
- 150,112,56,216,23,8,91,203,176,108,164,59,24,181,22,187,242,12,121,98,125,131,3,24,123,90,174,252,244,92,8,138,125,214,164,141,
- 26,87,69,218,7,187,251,45,207,72,43,231,73,203,178,186,107,139,140,73,165,105,182,246,96,247,96,12,14,113,150,34,237,136,129,
- 102,31,123,228,168,45,22,236,13,163,30,116,99,40,98,133,238,142,64,172,47,152,222,219,9,103,200,110,117,173,145,198,89,105,131,
- 137,80,216,183,56,22,11,108,103,39,104,164,220,52,51,91,200,125,138,161,145,140,142,13,107,150,145,43,221,231,72,172,39,109,
- 125,11,217,214,183,224,7,106,43,217,215,183,182,44,95,222,74,6,36,39,180,114,2,30,248,96,91,223,218,137,60,172,240,225,182,94,
- 154,218,58,145,218,214,137,163,111,125,39,10,119,202,138,68,39,233,157,92,14,31,109,172,182,145,173,179,149,117,3,2,199,101,39,
- 91,113,76,218,59,219,164,217,198,18,246,141,56,155,55,182,144,103,227,233,206,144,191,241,12,107,225,180,226,82,165,223,239,79,
- 233,117,105,122,125,154,222,144,166,207,74,211,103,167,233,115,210,244,185,105,250,60,232,89,150,190,60,28,232,139,83,246,152,
- 128,72,5,129,51,4,94,178,7,100,68,226,146,44,219,2,93,193,48,101,4,212,241,78,227,3,61,61,103,62,6,40,51,160,124,56,78,162,139,
- 242,248,240,95,50,152,72,68,204,53,49,52,19,236,33,123,87,4,143,3,144,242,80,36,123,183,60,207,201,209,45,143,173,30,178,225,
- 222,16,136,81,86,55,135,170,8,78,217,197,9,126,72,157,204,148,35,31,58,98,1,51,222,27,137,13,80,54,223,26,112,28,199,101,110,
- 84,100,93,30,80,81,100,16,207,19,187,99,193,64,226,244,48,200,225,153,140,158,80,111,47,137,32,217,130,124,174,146,183,23,135,
- 242,25,179,198,151,108,239,224,90,51,57,135,60,103,201,214,43,133,171,119,244,212,237,161,44,249,196,145,171,165,135,38,98,123,
- 140,169,109,121,90,98,201,169,137,99,46,109,153,50,85,174,194,56,86,71,47,76,234,114,68,217,48,115,36,194,178,4,99,113,202,224,
- 71,246,56,114,178,166,50,185,120,131,242,208,58,66,3,65,89,233,5,193,80,95,127,130,242,161,202,67,37,189,75,108,108,83,155,123,
- 181,217,142,153,11,154,178,10,108,226,64,59,130,162,85,133,181,165,41,23,170,156,115,68,81,57,213,174,81,3,42,115,224,105,109,
- 96,248,226,164,178,129,178,88,137,68,18,220,26,185,241,208,190,29,110,51,208,142,45,29,234,14,82,14,44,235,204,16,47,60,143,75,
- 246,230,212,107,132,28,245,250,80,202,127,185,204,69,88,145,200,112,71,100,43,58,91,146,122,150,153,194,65,156,56,209,112,96,
- 251,242,88,0,227,55,144,122,177,252,220,64,162,159,114,177,102,240,65,204,237,154,192,32,59,167,59,101,88,27,140,195,141,83,
- 150,37,41,63,166,108,203,130,19,109,105,100,24,91,36,245,184,46,74,5,169,7,121,218,93,16,234,233,65,159,84,51,43,35,104,67,150,
- 25,99,136,5,250,146,117,74,3,170,81,117,202,59,38,229,171,135,96,140,189,93,185,68,70,127,32,110,57,97,81,63,220,165,61,210,
- 171,22,51,22,25,176,134,143,44,40,45,93,214,232,143,32,174,138,16,57,225,3,171,101,168,142,147,30,26,24,160,92,126,233,8,5,194,
- 205,129,104,124,37,166,157,178,149,161,61,24,94,102,246,164,210,241,136,213,143,193,251,229,157,164,99,123,52,72,46,169,94,98,
- 221,79,40,3,141,173,15,132,7,177,161,67,56,31,182,6,209,88,188,197,140,39,2,56,35,145,26,95,29,13,224,192,164,241,161,120,71,4,
- 7,214,178,145,40,54,177,116,180,101,102,0,235,212,131,186,227,106,205,200,177,53,184,189,153,251,83,180,245,44,175,46,217,201,
- 132,246,126,158,81,91,88,134,168,108,172,116,48,198,221,91,133,75,4,25,225,96,111,130,236,225,160,217,151,232,39,187,234,170,
- 48,201,48,217,27,28,102,112,120,21,43,25,102,50,30,184,204,244,61,104,143,116,113,96,33,35,18,238,233,151,159,195,148,23,49,
- 147,175,57,205,50,176,96,215,140,154,150,6,227,137,88,100,59,59,206,168,81,57,87,90,201,164,119,77,28,53,181,7,134,130,201,249,
- 178,118,90,90,126,57,249,99,171,104,79,68,162,81,152,138,16,16,100,63,78,185,77,162,243,38,124,107,152,178,35,233,175,5,148,19,
- 25,19,184,201,21,49,47,136,96,99,201,32,65,153,17,51,233,216,217,82,93,57,24,78,132,162,188,36,242,17,206,153,193,231,129,44,
- 138,28,237,161,75,131,201,200,135,154,172,165,149,53,217,35,214,130,59,44,121,9,202,13,34,148,39,16,169,108,81,233,216,206,104,
- 32,134,156,50,24,100,71,199,184,183,45,42,67,121,105,52,18,29,12,159,53,120,139,24,57,98,214,139,38,85,196,130,125,236,27,177,
- 179,191,131,82,73,44,56,128,161,90,195,95,109,158,114,114,217,98,50,46,234,241,96,130,114,226,28,65,83,111,128,228,194,179,156,
- 68,246,84,42,74,127,106,177,6,45,119,15,23,75,187,168,203,98,109,73,143,164,98,60,157,241,21,141,198,197,147,161,112,93,40,45,
- 182,77,60,163,153,111,200,1,28,137,113,43,56,74,7,206,142,143,9,138,206,228,99,216,234,211,69,161,112,120,85,36,33,221,193,21,
- 199,134,73,6,40,20,196,83,42,122,32,51,59,154,213,47,220,255,144,12,47,27,125,44,142,91,189,105,25,109,75,141,212,144,135,141,
- 145,232,15,197,201,206,159,149,126,37,235,96,229,163,71,71,77,80,121,34,50,6,19,189,243,100,132,23,67,100,27,146,81,195,33,197,
- 234,94,50,248,213,135,114,249,51,221,185,50,217,208,17,89,23,15,146,123,232,180,51,97,40,20,75,12,6,194,234,20,115,14,141,78,
- 133,24,38,49,66,218,136,31,212,129,122,208,0,102,145,216,78,143,25,26,237,209,28,57,157,181,244,180,33,110,210,28,165,90,214,
- 33,109,164,116,139,78,135,68,241,91,43,232,69,67,219,165,193,158,67,135,13,113,141,112,148,62,175,93,90,122,92,167,111,138,234,
- 218,111,217,136,222,54,244,155,180,248,176,35,231,153,50,58,161,9,66,85,77,244,87,141,28,53,27,117,237,152,200,190,90,23,71,68,
- 254,204,145,191,232,116,149,208,182,52,137,188,188,80,147,22,47,181,81,147,200,178,163,188,102,117,64,155,179,65,91,49,92,75,
- 111,106,226,54,110,237,84,249,62,170,204,121,132,142,90,162,73,191,82,188,47,254,83,56,106,180,67,212,168,93,175,13,107,7,197,
- 240,136,118,232,178,55,119,11,205,230,92,92,219,52,179,169,233,188,141,58,93,46,156,95,209,197,14,49,187,233,129,114,93,127,65,
- 248,69,209,56,255,36,93,123,78,104,34,175,200,166,105,23,162,43,54,97,211,237,78,109,198,125,54,167,157,236,194,174,217,245,
- 234,106,109,168,198,166,85,107,241,26,154,107,117,97,174,118,155,118,187,84,12,86,246,105,119,140,181,166,20,91,50,249,59,252,
- 184,143,187,252,141,18,26,130,88,65,31,235,218,173,218,157,108,63,110,192,64,187,121,202,232,67,157,63,111,55,180,193,203,32,
- 247,26,98,16,226,164,206,2,37,31,144,207,215,148,208,245,42,195,221,86,134,171,45,113,143,46,62,192,194,172,88,81,219,185,162,
- 115,38,125,77,124,69,150,250,153,142,121,121,68,160,224,196,90,122,87,136,221,60,91,197,95,104,91,75,87,232,25,113,173,77,183,
- 95,163,233,90,86,191,200,207,213,134,75,241,233,101,109,164,148,238,215,180,103,57,119,233,46,109,92,169,54,80,170,229,54,206,
- 92,17,212,6,91,55,105,219,91,233,121,77,127,86,236,148,233,90,222,85,90,172,244,166,141,91,118,235,182,235,52,205,23,92,72,63,
- 83,101,115,118,121,75,110,162,39,116,219,87,159,23,215,106,39,196,165,232,231,143,116,227,22,237,65,241,178,56,140,244,5,187,
- 58,233,102,97,101,213,126,69,165,218,19,95,67,191,50,185,95,14,238,215,51,180,65,91,84,131,30,249,45,220,109,122,214,139,66,91,
- 208,164,187,142,138,57,11,132,208,157,143,11,173,86,148,100,47,180,57,109,174,58,91,214,22,187,115,166,200,47,212,46,107,108,
- 178,187,22,136,210,113,108,31,107,212,150,139,210,28,58,168,139,155,177,0,94,93,92,165,249,133,167,80,115,213,96,148,101,58,
- 237,18,181,147,108,36,149,25,147,109,244,71,127,53,29,208,197,65,116,145,142,233,98,196,145,19,42,161,171,53,241,77,20,254,133,
- 78,79,136,210,153,91,86,140,108,30,191,139,180,114,113,189,86,236,213,42,180,136,225,121,81,20,101,107,149,48,148,56,138,68,
- 209,162,162,204,162,165,69,90,81,117,145,97,229,42,147,185,52,228,58,63,149,63,71,155,204,249,69,241,36,75,209,138,75,139,203,
- 72,19,134,243,6,175,240,76,217,113,185,177,191,100,170,120,179,68,136,253,165,66,188,1,94,155,132,100,225,210,196,13,222,234,
- 203,47,55,238,43,155,33,126,85,70,186,157,114,184,132,240,212,160,204,181,229,98,183,247,41,254,56,204,31,71,202,133,182,179,
- 66,104,223,175,32,123,209,196,60,15,54,128,199,250,87,143,204,135,43,144,229,174,169,248,120,156,63,14,242,199,17,254,216,61,
- 13,31,247,77,51,174,208,72,0,150,14,165,255,35,20,0,39,152,47,246,79,19,226,24,184,182,74,23,119,85,141,19,143,87,9,113,16,156,
- 0,187,167,11,177,15,28,0,159,131,27,170,133,184,15,60,14,174,157,129,97,131,19,224,181,90,33,14,207,68,62,159,48,118,251,133,
- 177,207,143,58,252,54,113,203,108,228,159,163,137,199,193,27,115,220,105,191,15,72,202,228,223,255,240,247,211,201,191,1,226,
- 239,173,147,127,7,148,252,221,40,255,45,16,127,103,157,252,123,32,59,141,254,77,144,238,182,210,248,247,21,194,107,253,30,104,
- 17,116,187,215,202,195,255,255,77,184,45,59,255,159,55,205,107,181,203,127,67,164,171,252,252,255,206,12,175,245,123,136,189,
- 245,214,47,38,184,172,252,127,115,110,171,175,252,247,74,255,7,252,145,236,168,232,52,0,0,0,0};
-
- //==============================================================================
- #if JUCE_PUSH_NOTIFICATIONS && JUCE_MODULE_AVAILABLE_juce_gui_extra
- extern bool juce_handleNotificationIntent (void*);
- extern void juce_firebaseDeviceNotificationsTokenRefreshed (void*);
- extern void juce_firebaseRemoteNotificationReceived (void*);
- extern void juce_firebaseRemoteMessagesDeleted();
- extern void juce_firebaseRemoteMessageSent(void*);
- extern void juce_firebaseRemoteMessageSendError (void*, void*);
- #endif
-
- //==============================================================================
- #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
- METHOD (create, "<init>", "(II)V")
-
- DECLARE_JNI_CLASS (AndroidLayoutParams, "android/view/ViewGroup$LayoutParams")
- #undef JNI_CLASS_MEMBERS
-
- #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
- METHOD (addView, "addView", "(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V") \
- METHOD (removeView, "removeView", "(Landroid/view/View;)V") \
- METHOD (updateViewLayout, "updateViewLayout", "(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V")
-
- DECLARE_JNI_CLASS (AndroidViewManager, "android/view/ViewManager")
- #undef JNI_CLASS_MEMBERS
-
- #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
- METHOD (create, "<init>", "(IIIIIII)V") \
- FIELD (gravity, "gravity", "I") \
- FIELD (windowAnimations, "windowAnimations", "I")
-
- DECLARE_JNI_CLASS (AndroidWindowManagerLayoutParams, "android/view/WindowManager$LayoutParams")
- #undef JNI_CLASS_MEMBERS
-
- #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
- METHOD (getDisplayCutout, "getDisplayCutout", "()Landroid/view/DisplayCutout;")
-
- DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidWindowInsets, "android/view/WindowInsets", 28)
- #undef JNI_CLASS_MEMBERS
-
- #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
- METHOD (getSafeInsetBottom, "getSafeInsetBottom", "()I") \
- METHOD (getSafeInsetLeft, "getSafeInsetLeft", "()I") \
- METHOD (getSafeInsetRight, "getSafeInsetRight", "()I") \
- METHOD (getSafeInsetTop, "getSafeInsetTop", "()I")
-
- DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidDisplayCutout, "android/view/DisplayCutout", 28)
- #undef JNI_CLASS_MEMBERS
-
- //==============================================================================
- namespace
- {
- enum
- {
- SYSTEM_UI_FLAG_VISIBLE = 0,
- SYSTEM_UI_FLAG_LOW_PROFILE = 1,
- SYSTEM_UI_FLAG_HIDE_NAVIGATION = 2,
- SYSTEM_UI_FLAG_FULLSCREEN = 4,
- SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION = 512,
- SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN = 1024,
- SYSTEM_UI_FLAG_IMMERSIVE = 2048,
- SYSTEM_UI_FLAG_IMMERSIVE_STICKY = 4096
- };
-
- constexpr int fullScreenFlags = SYSTEM_UI_FLAG_HIDE_NAVIGATION | SYSTEM_UI_FLAG_FULLSCREEN | SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
- constexpr int FLAG_NOT_FOCUSABLE = 0x8;
- }
-
- //==============================================================================
- static bool supportsDisplayCutout()
- {
- return getAndroidSDKVersion() >= 28;
- }
-
- static BorderSize<int> androidDisplayCutoutToBorderSize (LocalRef<jobject> displayCutout, double displayScale)
- {
- if (displayCutout.get() == nullptr)
- return {};
-
- auto* env = getEnv();
-
- auto getInset = [&] (jmethodID methodID)
- {
- return roundToInt (env->CallIntMethod (displayCutout.get(), methodID) / displayScale);
- };
-
- return { getInset (AndroidDisplayCutout.getSafeInsetTop),
- getInset (AndroidDisplayCutout.getSafeInsetLeft),
- getInset (AndroidDisplayCutout.getSafeInsetBottom),
- getInset (AndroidDisplayCutout.getSafeInsetRight) };
- }
-
- /* The usage of the KeyPress class relies on its keyCode member having the standard ASCII values
- represent ASCII keycodes. However in the native Android keycodes the values for special keys
- e.g. RETURN, F1-F12 overlap with the ASCII range. Hence we need to translate them.
- */
- static constexpr int translateAndroidKeyCode (int keyCode) noexcept
- {
- switch (keyCode)
- {
- case 7: return '0';
- case 8: return '1';
- case 9: return '2';
- case 10: return '3';
- case 11: return '4';
- case 12: return '5';
- case 13: return '6';
- case 14: return '7';
- case 15: return '8';
- case 16: return '9';
- case 17: return '*';
- case 18: return '#';
- case 19: return KeyPress::upKey; // KEYCODE_DPAD_UP
- case 20: return KeyPress::downKey; // KEYCODE_DPAD_DOWN
- case 21: return KeyPress::leftKey; // KEYCODE_DPAD_LEFT
- case 22: return KeyPress::rightKey; // KEYCODE_DPAD_RIGHT
- case 29: return 'A';
- case 30: return 'B';
- case 31: return 'C';
- case 32: return 'D';
- case 33: return 'E';
- case 34: return 'F';
- case 35: return 'G';
- case 36: return 'H';
- case 37: return 'I';
- case 38: return 'J';
- case 39: return 'K';
- case 40: return 'L';
- case 41: return 'M';
- case 42: return 'N';
- case 43: return 'O';
- case 44: return 'P';
- case 45: return 'Q';
- case 46: return 'R';
- case 47: return 'S';
- case 48: return 'T';
- case 49: return 'U';
- case 50: return 'V';
- case 51: return 'W';
- case 52: return 'X';
- case 53: return 'Y';
- case 54: return 'Z';
- case 55: return ',';
- case 56: return '.';
- case 61: return KeyPress::tabKey; // KEYCODE_TAB
- case 62: return KeyPress::spaceKey; // KEYCODE_SPACE
- case 66: return KeyPress::returnKey; // KEYCODE_ENTER
- case 67: return KeyPress::backspaceKey; // KEYCODE_DEL
- case 68: return '`';
- case 69: return '-';
- case 70: return '=';
- case 71: return '[';
- case 72: return ']';
- case 73: return '\\';
- case 74: return ';';
- case 75: return '\'';
- case 76: return '/';
- case 77: return '@';
- case 81: return '+';
- case 85: return KeyPress::playKey; // KEYCODE_MEDIA_PLAY_PAUSE
- case 86: return KeyPress::stopKey; // KEYCODE_MEDIA_STOP
- case 87: return KeyPress::fastForwardKey; // KEYCODE_MEDIA_NEXT
- case 88: return KeyPress::rewindKey; // KEYCODE_MEDIA_PREVIOUS
- case 92: return KeyPress::pageUpKey; // KEYCODE_PAGE_UP
- case 93: return KeyPress::pageDownKey; // KEYCODE_PAGE_DOWN
- case 111: return KeyPress::escapeKey; // KEYCODE_ESCAPE
- case 112: return KeyPress::deleteKey; // KEYCODE_FORWARD_DEL
- case 122: return KeyPress::homeKey; // KEYCODE_MOVE_HOME
- case 123: return KeyPress::endKey; // KEYCODE_MOVE_END
- case 124: return KeyPress::insertKey; // KEYCODE_INSERT
- case 131: return KeyPress::F1Key; // KEYCODE_F1
- case 132: return KeyPress::F2Key; // KEYCODE_F2
- case 133: return KeyPress::F3Key; // KEYCODE_F3
- case 134: return KeyPress::F4Key; // KEYCODE_F4
- case 135: return KeyPress::F5Key; // KEYCODE_F5
- case 136: return KeyPress::F6Key; // KEYCODE_F6
- case 137: return KeyPress::F7Key; // KEYCODE_F7
- case 138: return KeyPress::F8Key; // KEYCODE_F8
- case 139: return KeyPress::F9Key; // KEYCODE_F9
- case 140: return KeyPress::F10Key; // KEYCODE_F10
- case 141: return KeyPress::F11Key; // KEYCODE_F11
- case 142: return KeyPress::F12Key; // KEYCODE_F12
- case 144: return '0';
- case 145: return '1';
- case 146: return '2';
- case 147: return '3';
- case 148: return '4';
- case 149: return '5';
- case 150: return '6';
- case 151: return '7';
- case 152: return '8';
- case 153: return '9';
- case 154: return '/';
- case 155: return '*';
- case 156: return '-';
- case 157: return '+';
- case 158: return '.';
- case 159: return ',';
- case 161: return '=';
- case 162: return '(';
- case 163: return ')';
-
- default: return 0;
- }
- }
-
- static constexpr int translateAndroidKeyboardFlags (int javaFlags) noexcept
- {
- constexpr int metaShiftOn = 0x1;
- constexpr int metaAltOn = 0x02;
- constexpr int metaCtrlOn = 0x1000;
-
- int flags = 0;
-
- if ((javaFlags & metaShiftOn) != 0) flags |= ModifierKeys::shiftModifier;
- if ((javaFlags & metaAltOn) != 0) flags |= ModifierKeys::altModifier;
- if ((javaFlags & metaCtrlOn) != 0) flags |= ModifierKeys::ctrlModifier;
-
- return flags;
- }
-
- //==============================================================================
- class AndroidComponentPeer : public ComponentPeer,
- private Timer
- {
- public:
- AndroidComponentPeer (Component& comp, int windowStyleFlags, void* nativeViewHandle)
- : ComponentPeer (comp, windowStyleFlags)
- {
- auto* env = getEnv();
-
- // NB: must not put this in the initialiser list, as it invokes a callback,
- // which will fail if the peer is only half-constructed.
- view = GlobalRef (LocalRef<jobject> (env->NewObject (ComponentPeerView, ComponentPeerView.create,
- getAppContext().get(), (jboolean) component.isOpaque(),
- (jlong) this)));
-
- if (nativeViewHandle != nullptr)
- {
- viewGroupIsWindow = false;
-
- // we don't know if the user is holding on to a local ref to this, so
- // explicitly create a new one
- auto nativeView = LocalRef<jobject> (env->NewLocalRef (static_cast<jobject> (nativeViewHandle)));
-
- if (env->IsInstanceOf (nativeView.get(), AndroidActivity))
- {
- viewGroup = GlobalRef (nativeView);
- env->CallVoidMethod (viewGroup.get(), AndroidActivity.setContentView, view.get());
- }
- else if (env->IsInstanceOf (nativeView.get(), AndroidViewGroup))
- {
- viewGroup = GlobalRef (nativeView);
- LocalRef<jobject> layoutParams (env->NewObject (AndroidLayoutParams, AndroidLayoutParams.create, -2, -2));
-
- env->CallVoidMethod (view.get(), AndroidView.setLayoutParams, layoutParams.get());
- env->CallVoidMethod ((jobject) viewGroup.get(), AndroidViewGroup.addView, view.get());
- }
- else
- {
- // the native handle you passed as a second argument to Component::addToDesktop must
- // either be an Activity or a ViewGroup
- jassertfalse;
- }
- }
- else
- {
- viewGroupIsWindow = true;
-
- LocalRef<jobject> viewLayoutParams (env->NewObject (AndroidLayoutParams, AndroidLayoutParams.create, -2, -2));
- env->CallVoidMethod (view.get(), AndroidView.setLayoutParams, viewLayoutParams.get());
-
- auto physicalBounds = (comp.getBoundsInParent().toFloat() * scale).toNearestInt();
-
- view.callVoidMethod (AndroidView.layout,
- physicalBounds.getX(), physicalBounds.getY(), physicalBounds.getRight(), physicalBounds.getBottom());
-
- LocalRef<jobject> windowLayoutParams (env->NewObject (AndroidWindowManagerLayoutParams, AndroidWindowManagerLayoutParams.create,
- physicalBounds.getWidth(), physicalBounds.getHeight(),
- physicalBounds.getX(), physicalBounds.getY(),
- TYPE_APPLICATION, FLAG_NOT_TOUCH_MODAL | FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_NO_LIMITS | FLAG_NOT_FOCUSABLE,
- component.isOpaque() ? PIXEL_FORMAT_OPAQUE : PIXEL_FORMAT_TRANSPARENT));
-
- env->SetIntField (windowLayoutParams.get(), AndroidWindowManagerLayoutParams.gravity, GRAVITY_LEFT | GRAVITY_TOP);
- env->SetIntField (windowLayoutParams.get(), AndroidWindowManagerLayoutParams.windowAnimations, 0x01030000 /* android.R.style.Animation */);
-
- if (supportsDisplayCutout())
- {
- jfieldID layoutInDisplayCutoutModeFieldId = env->GetFieldID (AndroidWindowManagerLayoutParams,
- "layoutInDisplayCutoutMode",
- "I");
-
- if (layoutInDisplayCutoutModeFieldId != nullptr)
- env->SetIntField (windowLayoutParams.get(),
- layoutInDisplayCutoutModeFieldId,
- LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS);
- }
-
- if (Desktop::getInstance().getKioskModeComponent() != nullptr)
- setNavBarsHidden (true);
-
- LocalRef<jobject> activity (getCurrentActivity());
-
- if (activity == nullptr)
- activity = getMainActivity();
-
- viewGroup = GlobalRef (LocalRef<jobject> (env->CallObjectMethod (activity.get(), AndroidContext.getSystemService, javaString ("window").get())));
- env->CallVoidMethod (viewGroup.get(), AndroidViewManager.addView, view.get(), windowLayoutParams.get());
- }
-
- if (supportsDisplayCutout())
- {
- jmethodID setOnApplyWindowInsetsListenerMethodId = env->GetMethodID (AndroidView,
- "setOnApplyWindowInsetsListener",
- "(Landroid/view/View$OnApplyWindowInsetsListener;)V");
-
- if (setOnApplyWindowInsetsListenerMethodId != nullptr)
- env->CallVoidMethod (view.get(), setOnApplyWindowInsetsListenerMethodId,
- CreateJavaInterface (new ViewWindowInsetsListener,
- "android/view/View$OnApplyWindowInsetsListener").get());
- }
-
- if (isFocused())
- handleFocusGain();
- }
-
- ~AndroidComponentPeer() override
- {
- stopTimer();
-
- auto* env = getEnv();
-
- env->CallVoidMethod (view, ComponentPeerView.clear);
- frontWindow = nullptr;
-
- GlobalRef localView (view);
- GlobalRef localViewGroup (viewGroup);
-
- callOnMessageThread ([env, localView, localViewGroup]
- {
- if (env->IsInstanceOf (localViewGroup.get(), AndroidActivity))
- env->CallVoidMethod (localViewGroup.get(), AndroidActivity.setContentView, nullptr);
- else
- env->CallVoidMethod (localViewGroup.get(), AndroidViewManager.removeView, localView.get());
- });
- }
-
- void* getNativeHandle() const override
- {
- return (void*) view.get();
- }
-
- void setVisible (bool shouldBeVisible) override
- {
- GlobalRef localView (view);
-
- callOnMessageThread ([localView, shouldBeVisible]
- {
- localView.callVoidMethod (ComponentPeerView.setVisible, shouldBeVisible);
- });
- }
-
- void setTitle (const String& title) override
- {
- view.callVoidMethod (ComponentPeerView.setViewName, javaString (title).get());
- }
-
- void setBounds (const Rectangle<int>& userRect, bool isNowFullScreen) override
- {
- auto bounds = (userRect.toFloat() * scale).toNearestInt();
-
- if (MessageManager::getInstance()->isThisTheMessageThread())
- {
- fullScreen = isNowFullScreen;
-
- view.callVoidMethod (AndroidView.layout,
- bounds.getX(), bounds.getY(), bounds.getRight(), bounds.getBottom());
-
- if (viewGroup != nullptr && viewGroupIsWindow)
- {
- auto* env = getEnv();
-
- LocalRef<jobject> windowLayoutParams (env->NewObject (AndroidWindowManagerLayoutParams, AndroidWindowManagerLayoutParams.create,
- bounds.getWidth(), bounds.getHeight(), bounds.getX(), bounds.getY(),
- TYPE_APPLICATION, FLAG_NOT_TOUCH_MODAL | FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_NO_LIMITS,
- component.isOpaque() ? PIXEL_FORMAT_OPAQUE : PIXEL_FORMAT_TRANSPARENT));
-
- env->SetIntField (windowLayoutParams.get(), AndroidWindowManagerLayoutParams.gravity, GRAVITY_LEFT | GRAVITY_TOP);
- env->CallVoidMethod (viewGroup.get(), AndroidViewManager.updateViewLayout, view.get(), windowLayoutParams.get());
- }
- }
- else
- {
- GlobalRef localView (view);
-
- MessageManager::callAsync ([localView, bounds]
- {
- localView.callVoidMethod (AndroidView.layout,
- bounds.getX(), bounds.getY(), bounds.getRight(), bounds.getBottom());
- });
- }
- }
-
- Rectangle<int> getBounds() const override
- {
- Rectangle<int> bounds (view.callIntMethod (AndroidView.getLeft),
- view.callIntMethod (AndroidView.getTop),
- view.callIntMethod (AndroidView.getWidth),
- view.callIntMethod (AndroidView.getHeight));
-
- return (bounds.toFloat() / scale).toNearestInt();
- }
-
- void handleScreenSizeChange() override
- {
- ComponentPeer::handleScreenSizeChange();
-
- if (isFullScreen())
- setFullScreen (true);
- }
-
- Point<int> getScreenPosition() const
- {
- auto* env = getEnv();
-
- LocalRef<jintArray> position (env->NewIntArray (2));
- env->CallVoidMethod (view.get(), AndroidView.getLocationOnScreen, position.get());
-
- jint* const screenPosition = env->GetIntArrayElements (position.get(), nullptr);
- Point<int> pos (screenPosition[0], screenPosition[1]);
- env->ReleaseIntArrayElements (position.get(), screenPosition, 0);
-
- return pos;
- }
-
- Point<float> localToGlobal (Point<float> relativePosition) override
- {
- return relativePosition + (getScreenPosition().toFloat() / scale);
- }
-
- using ComponentPeer::localToGlobal;
-
- Point<float> globalToLocal (Point<float> screenPosition) override
- {
- return screenPosition - (getScreenPosition().toFloat() / scale);
- }
-
- using ComponentPeer::globalToLocal;
-
- void setMinimised (bool /*shouldBeMinimised*/) override
- {
- // n/a
- }
-
- bool isMinimised() const override
- {
- return false;
- }
-
- void setFullScreen (bool shouldBeFullScreen) override
- {
- if (shouldNavBarsBeHidden (shouldBeFullScreen))
- {
- if (isTimerRunning())
- return;
-
- startTimer (500);
- }
- else
- {
- setNavBarsHidden (false);
- }
-
- auto newBounds = [&]
- {
- if (navBarsHidden || shouldBeFullScreen)
- if (auto* display = Desktop::getInstance().getDisplays().getPrimaryDisplay())
- return navBarsHidden ? display->totalArea
- : display->userArea;
-
- return lastNonFullscreenBounds.isEmpty() ? getBounds() : lastNonFullscreenBounds;
- }();
-
- if (! newBounds.isEmpty())
- setBounds (newBounds, shouldBeFullScreen);
-
- component.repaint();
- }
-
- bool isFullScreen() const override
- {
- return fullScreen;
- }
-
- void setIcon (const Image& /*newIcon*/) override
- {
- // n/a
- }
-
- bool contains (Point<int> localPos, bool trueIfInAChildWindow) const override
- {
- return isPositiveAndBelow (localPos.x, component.getWidth())
- && isPositiveAndBelow (localPos.y, component.getHeight())
- && ((! trueIfInAChildWindow) || view.callBooleanMethod (ComponentPeerView.containsPoint,
- (float) localPos.x * scale,
- (float) localPos.y * scale));
- }
-
- BorderSize<int> getFrameSize() const override
- {
- // TODO
- return {};
- }
-
- bool setAlwaysOnTop (bool /*alwaysOnTop*/) override
- {
- // TODO
- return false;
- }
-
- void toFront (bool makeActive) override
- {
- // Avoid calling bringToFront excessively: it's very slow
- if (frontWindow != this)
- {
- view.callVoidMethod (AndroidView.bringToFront);
- frontWindow = this;
- }
-
- if (makeActive)
- grabFocus();
-
- handleBroughtToFront();
- }
-
- void toBehind (ComponentPeer*) override
- {
- // TODO
- }
-
- //==============================================================================
- void handleMouseDownCallback (int index, Point<float> sysPos, int64 time)
- {
- lastMousePos = sysPos / scale;
- auto pos = globalToLocal (lastMousePos);
-
- // this forces a mouse-enter/up event, in case for some reason we didn't get a mouse-up before.
- handleMouseEvent (MouseInputSource::InputSourceType::touch,
- pos,
- ModifierKeys::currentModifiers.withoutMouseButtons(),
- MouseInputSource::invalidPressure,
- MouseInputSource::invalidOrientation,
- time,
- {},
- index);
-
- if (isValidPeer (this))
- handleMouseDragCallback (index, sysPos, time);
- }
-
- void handleMouseDragCallback (int index, Point<float> sysPos, int64 time)
- {
- lastMousePos = sysPos / scale;
- auto pos = globalToLocal (lastMousePos);
-
- jassert (index < 64);
- touchesDown = (touchesDown | (1 << (index & 63)));
-
- ModifierKeys::currentModifiers = ModifierKeys::currentModifiers.withoutMouseButtons().withFlags (ModifierKeys::leftButtonModifier);
-
- handleMouseEvent (MouseInputSource::InputSourceType::touch,
- pos,
- ModifierKeys::currentModifiers.withoutMouseButtons().withFlags (ModifierKeys::leftButtonModifier),
- MouseInputSource::invalidPressure,
- MouseInputSource::invalidOrientation,
- time,
- {},
- index);
- }
-
- void handleMouseUpCallback (int index, Point<float> sysPos, int64 time)
- {
- lastMousePos = sysPos / scale;
- auto pos = globalToLocal (lastMousePos);
-
- jassert (index < 64);
- touchesDown = (touchesDown & ~(1 << (index & 63)));
-
- if (touchesDown == 0)
- ModifierKeys::currentModifiers = ModifierKeys::currentModifiers.withoutMouseButtons();
-
- handleMouseEvent (MouseInputSource::InputSourceType::touch,
- pos,
- ModifierKeys::currentModifiers.withoutMouseButtons(),
- MouseInputSource::invalidPressure,
- MouseInputSource::invalidOrientation,
- time,
- {},
- index);
- }
-
- void handleKeyDownCallback (int k, int kc, int kbFlags)
- {
- ModifierKeys::currentModifiers = ModifierKeys::currentModifiers.withOnlyMouseButtons()
- .withFlags (translateAndroidKeyboardFlags (kbFlags));
- handleKeyPress (translateAndroidKeyCode (k), static_cast<juce_wchar> (kc));
- }
-
- void handleKeyUpCallback (int /*k*/, int /*kc*/)
- {
- }
-
- void handleBackButtonCallback()
- {
- bool handled = false;
-
- if (auto* app = JUCEApplicationBase::getInstance())
- handled = app->backButtonPressed();
-
- if (isKioskModeComponent())
- setNavBarsHidden (navBarsHidden);
-
- if (! handled)
- {
- auto* env = getEnv();
- LocalRef<jobject> activity (getCurrentActivity());
-
- if (activity != nullptr)
- {
- jmethodID finishMethod = env->GetMethodID (AndroidActivity, "finish", "()V");
-
- if (finishMethod != nullptr)
- env->CallVoidMethod (activity.get(), finishMethod);
- }
- }
- }
-
- void handleKeyboardHiddenCallback()
- {
- Component::unfocusAllComponents();
- }
-
- void handleAppPausedCallback() {}
-
- void handleAppResumedCallback()
- {
- if (isKioskModeComponent())
- setNavBarsHidden (navBarsHidden);
- }
-
- //==============================================================================
- AccessibilityNativeHandle* getNativeHandleForViewId (jint virtualViewId) const
- {
- if (auto* handler = (virtualViewId == HOST_VIEW_ID
- ? component.getAccessibilityHandler()
- : AccessibilityNativeHandle::getAccessibilityHandlerForVirtualViewId (virtualViewId)))
- {
- return handler->getNativeImplementation();
- }
-
- return nullptr;
- }
-
- jboolean populateAccessibilityNodeInfoCallback (jint virtualViewId, jobject info) const
- {
- if (auto* handle = getNativeHandleForViewId (virtualViewId))
- {
- handle->populateNodeInfo (info);
- return true;
- }
-
- return false;
- }
-
- jboolean handlePerformActionCallback (jint virtualViewId, jint action, jobject arguments) const
- {
- if (auto* handle = getNativeHandleForViewId (virtualViewId))
- return handle->performAction (action, arguments);
-
- return false;
- }
-
- static jobject getFocusViewIdForHandler (const AccessibilityHandler* handler)
- {
- if (handler != nullptr)
- return getEnv()->NewObject (JavaInteger,
- JavaInteger.constructor,
- handler->getNativeImplementation()->getVirtualViewId());
-
- return nullptr;
- }
-
- jobject getInputFocusViewIdCallback()
- {
- if (auto* comp = dynamic_cast<Component*> (findCurrentTextInputTarget()))
- return getFocusViewIdForHandler (comp->getAccessibilityHandler());
-
- return nullptr;
- }
-
- jobject getAccessibilityFocusViewIdCallback() const
- {
- if (auto* handler = component.getAccessibilityHandler())
- {
- if (auto* modal = Component::getCurrentlyModalComponent())
- {
- if (! component.isParentOf (modal)
- && component.isCurrentlyBlockedByAnotherModalComponent())
- {
- if (auto* modalHandler = modal->getAccessibilityHandler())
- {
- if (auto* focusChild = modalHandler->getChildFocus())
- return getFocusViewIdForHandler (focusChild);
-
- return getFocusViewIdForHandler (modalHandler);
- }
- }
- }
-
- if (auto* focusChild = handler->getChildFocus())
- return getFocusViewIdForHandler (focusChild);
- }
-
- return nullptr;
- }
-
- //==============================================================================
- bool isFocused() const override
- {
- if (view != nullptr)
- return view.callBooleanMethod (AndroidView.hasFocus);
-
- return false;
- }
-
- void grabFocus() override
- {
- if (view != nullptr)
- view.callBooleanMethod (AndroidView.requestFocus);
- }
-
- void handleFocusChangeCallback (bool hasFocus)
- {
- if (isFullScreen())
- setFullScreen (true);
-
- if (hasFocus)
- handleFocusGain();
- else
- handleFocusLoss();
- }
-
- static const char* getVirtualKeyboardType (TextInputTarget::VirtualKeyboardType type) noexcept
- {
- switch (type)
- {
- case TextInputTarget::textKeyboard: return "text";
- case TextInputTarget::numericKeyboard: return "number";
- case TextInputTarget::decimalKeyboard: return "numberDecimal";
- case TextInputTarget::urlKeyboard: return "textUri";
- case TextInputTarget::emailAddressKeyboard: return "textEmailAddress";
- case TextInputTarget::phoneNumberKeyboard: return "phone";
- default: jassertfalse; break;
- }
-
- return "text";
- }
-
- void textInputRequired (Point<int>, TextInputTarget& target) override
- {
- view.callVoidMethod (ComponentPeerView.showKeyboard,
- javaString (getVirtualKeyboardType (target.getKeyboardType())).get());
- }
-
- void dismissPendingTextInput() override
- {
- view.callVoidMethod (ComponentPeerView.showKeyboard, javaString ("").get());
-
- if (! isTimerRunning())
- startTimer (500);
- }
-
- //==============================================================================
- void handlePaintCallback (jobject canvas, jobject paint)
- {
- auto* env = getEnv();
-
- jobject rect = env->CallObjectMethod (canvas, AndroidCanvas.getClipBounds);
- auto left = env->GetIntField (rect, AndroidRect.left);
- auto top = env->GetIntField (rect, AndroidRect.top);
- auto right = env->GetIntField (rect, AndroidRect.right);
- auto bottom = env->GetIntField (rect, AndroidRect.bottom);
- env->DeleteLocalRef (rect);
-
- auto clip = Rectangle<int>::leftTopRightBottom (left, top, right, bottom);
-
- if (clip.isEmpty())
- return;
-
- auto sizeNeeded = clip.getWidth() * clip.getHeight();
-
- if (sizeAllocated < sizeNeeded)
- {
- buffer.clear();
- sizeAllocated = sizeNeeded;
- buffer = GlobalRef (LocalRef<jobject> ((jobject) env->NewIntArray (sizeNeeded)));
- }
-
- if (jint* dest = env->GetIntArrayElements ((jintArray) buffer.get(), nullptr))
- {
- {
- Image temp (new PreallocatedImage (clip.getWidth(), clip.getHeight(),
- dest, ! component.isOpaque()));
-
- {
- LowLevelGraphicsSoftwareRenderer g (temp);
- g.setOrigin (-clip.getPosition());
- g.addTransform (AffineTransform::scale (scale));
- handlePaint (g);
- }
- }
-
- env->ReleaseIntArrayElements ((jintArray) buffer.get(), dest, 0);
-
- env->CallVoidMethod (canvas, AndroidCanvas.drawBitmap, (jintArray) buffer.get(), 0, clip.getWidth(),
- (jfloat) clip.getX(), (jfloat) clip.getY(),
- clip.getWidth(), clip.getHeight(), true, paint);
- }
- }
-
- void repaint (const Rectangle<int>& userArea) override
- {
- auto area = (userArea.toFloat() * scale).toNearestInt();
-
- GlobalRef localView (view);
-
- callOnMessageThread ([area, localView]
- {
- localView.callVoidMethod (AndroidView.invalidate,
- area.getX(), area.getY(), area.getRight(), area.getBottom());
- });
- }
-
- void performAnyPendingRepaintsNow() override
- {
- // TODO
- }
-
- void setAlpha (float /*newAlpha*/) override
- {
- // TODO
- }
-
- StringArray getAvailableRenderingEngines() override
- {
- return StringArray ("Software Renderer");
- }
-
- //==============================================================================
- static Point<float> lastMousePos;
- static int64 touchesDown;
-
- //==============================================================================
- struct StartupActivityCallbackListener : public ActivityLifecycleCallbacks
- {
- void onActivityStarted (jobject /*activity*/) override
- {
- auto* env = getEnv();
- LocalRef<jobject> appContext (getAppContext());
-
- if (appContext.get() != nullptr)
- {
- env->CallVoidMethod (appContext.get(),
- AndroidApplication.unregisterActivityLifecycleCallbacks,
- activityCallbackListener.get());
- clear();
- activityCallbackListener.clear();
-
- forceDisplayUpdate();
- }
- }
- };
-
- private:
- //==============================================================================
- #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
- METHOD (create, "<init>", "(Landroid/content/Context;ZJ)V") \
- METHOD (clear, "clear", "()V") \
- METHOD (setViewName, "setViewName", "(Ljava/lang/String;)V") \
- METHOD (setVisible, "setVisible", "(Z)V") \
- METHOD (isVisible, "isVisible", "()Z") \
- METHOD (containsPoint, "containsPoint", "(II)Z") \
- METHOD (showKeyboard, "showKeyboard", "(Ljava/lang/String;)V") \
- METHOD (setSystemUiVisibilityCompat, "setSystemUiVisibilityCompat", "(I)V") \
- CALLBACK (handlePaintJni, "handlePaint", "(JLandroid/graphics/Canvas;Landroid/graphics/Paint;)V") \
- CALLBACK (handleMouseDownJni, "handleMouseDown", "(JIFFJ)V") \
- CALLBACK (handleMouseDragJni, "handleMouseDrag", "(JIFFJ)V") \
- CALLBACK (handleMouseUpJni, "handleMouseUp", "(JIFFJ)V") \
- CALLBACK (handleKeyDownJni, "handleKeyDown", "(JIII)V") \
- CALLBACK (handleKeyUpJni, "handleKeyUp", "(JII)V") \
- CALLBACK (handleBackButtonJni, "handleBackButton", "(J)V") \
- CALLBACK (handleKeyboardHiddenJni, "handleKeyboardHidden", "(J)V") \
- CALLBACK (viewSizeChangedJni, "viewSizeChanged", "(J)V") \
- CALLBACK (focusChangedJni, "focusChanged", "(JZ)V") \
- CALLBACK (handleAppPausedJni, "handleAppPaused", "(J)V") \
- CALLBACK (handleAppResumedJni, "handleAppResumed", "(J)V") \
- CALLBACK (populateAccessibilityNodeInfoJni, "populateAccessibilityNodeInfo", "(JILandroid/view/accessibility/AccessibilityNodeInfo;)Z") \
- CALLBACK (handlePerformActionJni, "handlePerformAction", "(JIILandroid/os/Bundle;)Z") \
- CALLBACK (getInputFocusViewIdJni, "getInputFocusViewId", "(J)Ljava/lang/Integer;") \
- CALLBACK (getAccessibilityFocusViewIdJni, "getAccessibilityFocusViewId", "(J)Ljava/lang/Integer;") \
-
- DECLARE_JNI_CLASS_WITH_BYTECODE (ComponentPeerView, "com/rmsl/juce/ComponentPeerView", 16, javaComponentPeerView, sizeof (javaComponentPeerView))
- #undef JNI_CLASS_MEMBERS
-
- static void JNICALL handlePaintJni (JNIEnv*, jobject /*view*/, jlong host, jobject canvas, jobject paint) { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handlePaintCallback (canvas, paint); }
- static void JNICALL handleMouseDownJni (JNIEnv*, jobject /*view*/, jlong host, jint i, jfloat x, jfloat y, jlong time) { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleMouseDownCallback (i, Point<float> ((float) x, (float) y), (int64) time); }
- static void JNICALL handleMouseDragJni (JNIEnv*, jobject /*view*/, jlong host, jint i, jfloat x, jfloat y, jlong time) { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleMouseDragCallback (i, Point<float> ((float) x, (float) y), (int64) time); }
- static void JNICALL handleMouseUpJni (JNIEnv*, jobject /*view*/, jlong host, jint i, jfloat x, jfloat y, jlong time) { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleMouseUpCallback (i, Point<float> ((float) x, (float) y), (int64) time); }
- static void JNICALL viewSizeChangedJni (JNIEnv*, jobject /*view*/, jlong host) { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleMovedOrResized(); }
- static void JNICALL focusChangedJni (JNIEnv*, jobject /*view*/, jlong host, jboolean hasFocus) { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleFocusChangeCallback (hasFocus); }
- static void JNICALL handleKeyDownJni (JNIEnv*, jobject /*view*/, jlong host, jint k, jint kc, jint kbFlags) { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleKeyDownCallback ((int) k, (int) kc, (int) kbFlags); }
- static void JNICALL handleKeyUpJni (JNIEnv*, jobject /*view*/, jlong host, jint k, jint kc) { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleKeyUpCallback ((int) k, (int) kc); }
- static void JNICALL handleBackButtonJni (JNIEnv*, jobject /*view*/, jlong host) { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleBackButtonCallback(); }
- static void JNICALL handleKeyboardHiddenJni (JNIEnv*, jobject /*view*/, jlong host) { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleKeyboardHiddenCallback(); }
- static void JNICALL handleAppPausedJni (JNIEnv*, jobject /*view*/, jlong host) { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleAppPausedCallback(); }
- static void JNICALL handleAppResumedJni (JNIEnv*, jobject /*view*/, jlong host) { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleAppResumedCallback(); }
-
- static jboolean JNICALL populateAccessibilityNodeInfoJni (JNIEnv*, jobject /*view*/, jlong host, jint virtualViewId, jobject info)
- {
- if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host))
- return myself->populateAccessibilityNodeInfoCallback (virtualViewId, info);
-
- return false;
- }
-
- static jboolean JNICALL handlePerformActionJni (JNIEnv*, jobject /*view*/, jlong host, jint virtualViewId, jint action, jobject arguments)
- {
- if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host))
- return myself->handlePerformActionCallback (virtualViewId, action, arguments);
-
- return false;
- }
-
- static jobject JNICALL getInputFocusViewIdJni (JNIEnv*, jobject /*view*/, jlong host)
- {
- if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host))
- return myself->getInputFocusViewIdCallback();
-
- return nullptr;
- }
-
- static jobject JNICALL getAccessibilityFocusViewIdJni (JNIEnv*, jobject /*view*/, jlong host)
- {
- if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host))
- return myself->getAccessibilityFocusViewIdCallback();
-
- return nullptr;
- }
-
- //==============================================================================
- struct ViewWindowInsetsListener : public juce::AndroidInterfaceImplementer
- {
- jobject onApplyWindowInsets (LocalRef<jobject> v, LocalRef<jobject> insets)
- {
- auto* env = getEnv();
-
- LocalRef<jobject> displayCutout (env->CallObjectMethod (insets.get(), AndroidWindowInsets.getDisplayCutout));
-
- if (displayCutout != nullptr)
- {
- const auto& mainDisplay = *Desktop::getInstance().getDisplays().getPrimaryDisplay();
- auto newSafeAreaInsets = androidDisplayCutoutToBorderSize (displayCutout, mainDisplay.scale);
-
- if (newSafeAreaInsets != mainDisplay.safeAreaInsets)
- forceDisplayUpdate();
-
- auto* fieldId = env->GetStaticFieldID (AndroidWindowInsets, "CONSUMED", "Landroid/view/WindowInsets");
- jassert (fieldId != nullptr);
-
- return env->GetStaticObjectField (AndroidWindowInsets, fieldId);
- }
-
- jmethodID onApplyWindowInsetsMethodId = env->GetMethodID (AndroidView,
- "onApplyWindowInsets",
- "(Landroid/view/WindowInsets;)Landroid/view/WindowInsets;");
-
- jassert (onApplyWindowInsetsMethodId != nullptr);
-
- return env->CallObjectMethod (v.get(), onApplyWindowInsetsMethodId, insets.get());
- }
-
- private:
- jobject invoke (jobject proxy, jobject method, jobjectArray args) override
- {
- auto* env = getEnv();
- auto methodName = juce::juceString ((jstring) env->CallObjectMethod (method, JavaMethod.getName));
-
- if (methodName == "onApplyWindowInsets")
- {
- jassert (env->GetArrayLength (args) == 2);
-
- LocalRef<jobject> windowView (env->GetObjectArrayElement (args, 0));
- LocalRef<jobject> insets (env->GetObjectArrayElement (args, 1));
-
- return onApplyWindowInsets (std::move (windowView), std::move (insets));
- }
-
- // invoke base class
- return AndroidInterfaceImplementer::invoke (proxy, method, args);
- }
- };
-
- //==============================================================================
- struct PreallocatedImage : public ImagePixelData
- {
- PreallocatedImage (int width_, int height_, jint* data_, bool hasAlpha_)
- : ImagePixelData (Image::ARGB, width_, height_), data (data_), hasAlpha (hasAlpha_)
- {
- if (hasAlpha_)
- zeromem (data_, static_cast<size_t> (width * height) * sizeof (jint));
- }
-
- ~PreallocatedImage() override
- {
- if (hasAlpha)
- {
- auto pix = (PixelARGB*) data;
-
- for (int i = width * height; --i >= 0;)
- {
- pix->unpremultiply();
- ++pix;
- }
- }
- }
-
- std::unique_ptr<ImageType> createType() const override
- {
- return std::make_unique<SoftwareImageType>();
- }
-
- std::unique_ptr<LowLevelGraphicsContext> createLowLevelContext() override
- {
- return std::make_unique<LowLevelGraphicsSoftwareRenderer> (Image (this));
- }
-
- void initialiseBitmapData (Image::BitmapData& bm, int x, int y, Image::BitmapData::ReadWriteMode /*mode*/) override
- {
- bm.lineStride = width * static_cast<int> (sizeof (jint));
- bm.pixelStride = static_cast<int> (sizeof (jint));
- bm.pixelFormat = Image::ARGB;
- bm.data = (uint8*) (data + x + y * width);
- }
-
- ImagePixelData::Ptr clone() override
- {
- auto s = new PreallocatedImage (width, height, nullptr, hasAlpha);
- s->allocatedData.malloc (sizeof (jint) * static_cast<size_t> (width * height));
- s->data = s->allocatedData;
- memcpy (s->data, data, sizeof (jint) * static_cast<size_t> (width * height));
- return s;
- }
-
- private:
- jint* data;
- HeapBlock<jint> allocatedData;
- bool hasAlpha;
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PreallocatedImage)
- };
-
- //==============================================================================
- void timerCallback() override
- {
- setNavBarsHidden (shouldNavBarsBeHidden (fullScreen));
- setFullScreen (fullScreen);
- stopTimer();
- }
-
- bool isKioskModeComponent() const
- {
- if (auto* kiosk = Desktop::getInstance().getKioskModeComponent())
- return kiosk->getPeer() == this;
-
- return false;
- }
-
- bool shouldNavBarsBeHidden (bool shouldBeFullScreen) const
- {
- return (shouldBeFullScreen && isKioskModeComponent());
- }
-
- void setNavBarsHidden (bool hidden)
- {
- if (navBarsHidden != hidden)
- {
- navBarsHidden = hidden;
-
- view.callVoidMethod (ComponentPeerView.setSystemUiVisibilityCompat,
- (navBarsHidden ? (jint) (fullScreenFlags) : (jint) (SYSTEM_UI_FLAG_VISIBLE)));
- }
- }
-
- template <typename Callback>
- static void callOnMessageThread (Callback&& callback)
- {
- if (MessageManager::getInstance()->isThisTheMessageThread())
- callback();
- else
- MessageManager::callAsync (std::forward<Callback> (callback));
- }
-
- //==============================================================================
- friend class Displays;
- static AndroidComponentPeer* frontWindow;
- static GlobalRef activityCallbackListener;
-
- static constexpr int GRAVITY_LEFT = 0x3, GRAVITY_TOP = 0x30;
- static constexpr int TYPE_APPLICATION = 0x2;
- static constexpr int FLAG_NOT_TOUCH_MODAL = 0x20, FLAG_LAYOUT_IN_SCREEN = 0x100, FLAG_LAYOUT_NO_LIMITS = 0x200;
- static constexpr int PIXEL_FORMAT_OPAQUE = -1, PIXEL_FORMAT_TRANSPARENT = -2;
- static constexpr int LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS = 0x3;
-
- GlobalRef view, viewGroup, buffer;
- bool viewGroupIsWindow = false, fullScreen = false, navBarsHidden = false;
- int sizeAllocated = 0;
- float scale = (float) Desktop::getInstance().getDisplays().getPrimaryDisplay()->scale;
-
- //==============================================================================
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AndroidComponentPeer)
- };
-
- Point<float> AndroidComponentPeer::lastMousePos;
- int64 AndroidComponentPeer::touchesDown = 0;
- AndroidComponentPeer* AndroidComponentPeer::frontWindow = nullptr;
- GlobalRef AndroidComponentPeer::activityCallbackListener;
- AndroidComponentPeer::ComponentPeerView_Class AndroidComponentPeer::ComponentPeerView;
-
- //==============================================================================
- ComponentPeer* Component::createNewPeer (int styleFlags, void* nativeWindow)
- {
- return new AndroidComponentPeer (*this, styleFlags, nativeWindow);
- }
-
- //==============================================================================
- bool Desktop::canUseSemiTransparentWindows() noexcept
- {
- return true;
- }
-
- class Desktop::NativeDarkModeChangeDetectorImpl : public ActivityLifecycleCallbacks
- {
- public:
- NativeDarkModeChangeDetectorImpl()
- {
- LocalRef<jobject> appContext (getAppContext());
-
- if (appContext != nullptr)
- {
- auto* env = getEnv();
-
- myself = GlobalRef (CreateJavaInterface (this, "android/app/Application$ActivityLifecycleCallbacks"));
- env->CallVoidMethod (appContext.get(), AndroidApplication.registerActivityLifecycleCallbacks, myself.get());
- }
- }
-
- ~NativeDarkModeChangeDetectorImpl() override
- {
- LocalRef<jobject> appContext (getAppContext());
-
- if (appContext != nullptr && myself != nullptr)
- {
- auto* env = getEnv();
-
- env->CallVoidMethod (appContext.get(),
- AndroidApplication.unregisterActivityLifecycleCallbacks,
- myself.get());
- clear();
- myself.clear();
- }
- }
-
- bool isDarkModeEnabled() const noexcept { return darkModeEnabled; }
-
- void onActivityStarted (jobject /*activity*/) override
- {
- const auto isEnabled = getDarkModeSetting();
-
- if (darkModeEnabled != isEnabled)
- {
- darkModeEnabled = isEnabled;
- Desktop::getInstance().darkModeChanged();
- }
- }
-
- private:
- static bool getDarkModeSetting()
- {
- auto* env = getEnv();
-
- const LocalRef<jobject> resources (env->CallObjectMethod (getAppContext().get(), AndroidContext.getResources));
- const LocalRef<jobject> configuration (env->CallObjectMethod (resources, AndroidResources.getConfiguration));
-
- const auto uiMode = env->GetIntField (configuration, AndroidConfiguration.uiMode);
-
- return ((uiMode & UI_MODE_NIGHT_MASK) == UI_MODE_NIGHT_YES);
- }
-
- static constexpr int UI_MODE_NIGHT_MASK = 0x00000030,
- UI_MODE_NIGHT_NO = 0x00000010,
- UI_MODE_NIGHT_UNDEFINED = 0x00000000,
- UI_MODE_NIGHT_YES = 0x00000020;
-
- GlobalRef myself;
- bool darkModeEnabled = getDarkModeSetting();
-
- //==============================================================================
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (NativeDarkModeChangeDetectorImpl)
- };
-
- std::unique_ptr<Desktop::NativeDarkModeChangeDetectorImpl> Desktop::createNativeDarkModeChangeDetectorImpl()
- {
- return std::make_unique<NativeDarkModeChangeDetectorImpl>();
- }
-
- bool Desktop::isDarkModeActive() const
- {
- return nativeDarkModeChangeDetectorImpl->isDarkModeEnabled();
- }
-
- double Desktop::getDefaultMasterScale()
- {
- return 1.0;
- }
-
- Desktop::DisplayOrientation Desktop::getCurrentOrientation() const
- {
- enum
- {
- ROTATION_0 = 0,
- ROTATION_90 = 1,
- ROTATION_180 = 2,
- ROTATION_270 = 3
- };
-
- JNIEnv* env = getEnv();
- LocalRef<jstring> windowServiceString (javaString ("window"));
-
-
- LocalRef<jobject> windowManager = LocalRef<jobject> (env->CallObjectMethod (getAppContext().get(), AndroidContext.getSystemService, windowServiceString.get()));
-
- if (windowManager.get() != nullptr)
- {
- LocalRef<jobject> display = LocalRef<jobject> (env->CallObjectMethod (windowManager, AndroidWindowManager.getDefaultDisplay));
-
- if (display.get() != nullptr)
- {
- int rotation = env->CallIntMethod (display, AndroidDisplay.getRotation);
-
- switch (rotation)
- {
- case ROTATION_0: return upright;
- case ROTATION_90: return rotatedAntiClockwise;
- case ROTATION_180: return upsideDown;
- case ROTATION_270: return rotatedClockwise;
- }
- }
- }
-
- jassertfalse;
- return upright;
- }
-
- bool MouseInputSource::SourceList::addSource()
- {
- addSource (sources.size(), MouseInputSource::InputSourceType::touch);
- return true;
- }
-
- bool MouseInputSource::SourceList::canUseTouch()
- {
- return true;
- }
-
- Point<float> MouseInputSource::getCurrentRawMousePosition()
- {
- return AndroidComponentPeer::lastMousePos;
- }
-
- void MouseInputSource::setRawMousePosition (Point<float>)
- {
- // not needed
- }
-
- //==============================================================================
- bool KeyPress::isKeyCurrentlyDown (int /*keyCode*/)
- {
- // TODO
- return false;
- }
-
- JUCE_API void JUCE_CALLTYPE Process::hide()
- {
- auto* env = getEnv();
- LocalRef<jobject> currentActivity (getCurrentActivity().get());
-
- if (env->CallBooleanMethod (currentActivity.get(), AndroidActivity.moveTaskToBack, true) == 0)
- {
- GlobalRef intent (LocalRef<jobject> (env->NewObject (AndroidIntent, AndroidIntent.constructor)));
- env->CallObjectMethod (intent, AndroidIntent.setAction, javaString ("android.intent.action.MAIN") .get());
- env->CallObjectMethod (intent, AndroidIntent.addCategory, javaString ("android.intent.category.HOME").get());
-
- env->CallVoidMethod (currentActivity.get(), AndroidContext.startActivity, intent.get());
- }
- }
-
- //==============================================================================
- // TODO
- JUCE_API bool JUCE_CALLTYPE Process::isForegroundProcess() { return true; }
- JUCE_API void JUCE_CALLTYPE Process::makeForegroundProcess() {}
-
- //==============================================================================
- #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
- METHOD (show, "show", "()V") \
- METHOD (getWindow, "getWindow", "()Landroid/view/Window;")
-
- DECLARE_JNI_CLASS (AndroidDialog, "android/app/Dialog")
- #undef JNI_CLASS_MEMBERS
-
- #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
- METHOD (construct, "<init>", "(Landroid/content/Context;)V") \
- METHOD (create, "create", "()Landroid/app/AlertDialog;") \
- METHOD (setTitle, "setTitle", "(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;") \
- METHOD (setMessage, "setMessage", "(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;") \
- METHOD (setCancelable, "setCancelable", "(Z)Landroid/app/AlertDialog$Builder;") \
- METHOD (setOnCancelListener, "setOnCancelListener", "(Landroid/content/DialogInterface$OnCancelListener;)Landroid/app/AlertDialog$Builder;") \
- METHOD (setPositiveButton, "setPositiveButton", "(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;") \
- METHOD (setNegativeButton, "setNegativeButton", "(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;") \
- METHOD (setNeutralButton, "setNeutralButton", "(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;")
-
- DECLARE_JNI_CLASS (AndroidAlertDialogBuilder, "android/app/AlertDialog$Builder")
- #undef JNI_CLASS_MEMBERS
-
- #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
- METHOD (dismiss, "dismiss", "()V")
-
- DECLARE_JNI_CLASS (AndroidDialogInterface, "android/content/DialogInterface")
- #undef JNI_CLASS_MEMBERS
-
- #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
-
- DECLARE_JNI_CLASS (AndroidDialogOnClickListener, "android/content/DialogInterface$OnClickListener")
- #undef JNI_CLASS_MEMBERS
-
- //==============================================================================
- class DialogListener : public juce::AndroidInterfaceImplementer
- {
- public:
- DialogListener (std::shared_ptr<ModalComponentManager::Callback> callbackToUse, int resultToUse)
- : callback (std::move (callbackToUse)), result (resultToUse)
- {}
-
- void onResult (jobject dialog)
- {
- auto* env = getEnv();
- env->CallVoidMethod (dialog, AndroidDialogInterface.dismiss);
-
- if (callback != nullptr)
- callback->modalStateFinished (result);
-
- callback = nullptr;
- }
-
- private:
- jobject invoke (jobject proxy, jobject method, jobjectArray args) override
- {
- auto* env = getEnv();
- auto methodName = juce::juceString ((jstring) env->CallObjectMethod (method, JavaMethod.getName));
-
- if (methodName == "onCancel" || methodName == "onClick")
- {
- onResult (env->GetObjectArrayElement (args, 0));
- return nullptr;
- }
-
- // invoke base class
- return AndroidInterfaceImplementer::invoke (proxy, method, args);
- }
-
- std::shared_ptr<ModalComponentManager::Callback> callback;
- int result;
- };
-
- //==============================================================================
- static void createAndroidDialog (const MessageBoxOptions& opts,
- ModalComponentManager::Callback* callbackIn,
- AlertWindowMappings::MapFn mapFn)
- {
- auto* env = getEnv();
-
- LocalRef<jobject> builder (env->NewObject (AndroidAlertDialogBuilder, AndroidAlertDialogBuilder.construct, getMainActivity().get()));
-
- builder = LocalRef<jobject> (env->CallObjectMethod (builder.get(), AndroidAlertDialogBuilder.setTitle, javaString (opts.getTitle()).get()));
- builder = LocalRef<jobject> (env->CallObjectMethod (builder.get(), AndroidAlertDialogBuilder.setMessage, javaString (opts.getMessage()).get()));
- builder = LocalRef<jobject> (env->CallObjectMethod (builder.get(), AndroidAlertDialogBuilder.setCancelable, true));
-
- std::shared_ptr<ModalComponentManager::Callback> sharedCallback (AlertWindowMappings::getWrappedCallback (callbackIn, mapFn));
-
- builder = LocalRef<jobject> (env->CallObjectMethod (builder.get(), AndroidAlertDialogBuilder.setOnCancelListener,
- CreateJavaInterface (new DialogListener (sharedCallback, 0),
- "android/content/DialogInterface$OnCancelListener").get()));
-
- builder = LocalRef<jobject> (env->CallObjectMethod (builder.get(), AndroidAlertDialogBuilder.setPositiveButton,
- javaString (opts.getButtonText (0)).get(),
- CreateJavaInterface (new DialogListener (sharedCallback, 0),
- "android/content/DialogInterface$OnClickListener").get()));
-
- if (opts.getButtonText (1).isNotEmpty())
- builder = LocalRef<jobject> (env->CallObjectMethod (builder.get(), AndroidAlertDialogBuilder.setNegativeButton,
- javaString (opts.getButtonText (1)).get(),
- CreateJavaInterface (new DialogListener (sharedCallback, 1),
- "android/content/DialogInterface$OnClickListener").get()));
-
- if (opts.getButtonText (2).isNotEmpty())
- builder = LocalRef<jobject> (env->CallObjectMethod (builder.get(), AndroidAlertDialogBuilder.setNeutralButton,
- javaString (opts.getButtonText (2)).get(),
- CreateJavaInterface (new DialogListener (sharedCallback, 2),
- "android/content/DialogInterface$OnClickListener").get()));
-
- LocalRef<jobject> dialog (env->CallObjectMethod (builder.get(), AndroidAlertDialogBuilder.create));
-
- LocalRef<jobject> window (env->CallObjectMethod (dialog.get(), AndroidDialog.getWindow));
-
- if (Desktop::getInstance().getKioskModeComponent() != nullptr)
- {
- env->CallVoidMethod (window.get(), AndroidWindow.setFlags, FLAG_NOT_FOCUSABLE, FLAG_NOT_FOCUSABLE);
- LocalRef<jobject> decorView (env->CallObjectMethod (window.get(), AndroidWindow.getDecorView));
- env->CallVoidMethod (decorView.get(), AndroidView.setSystemUiVisibility, fullScreenFlags);
- }
-
- env->CallVoidMethod (dialog.get(), AndroidDialog.show);
-
- if (Desktop::getInstance().getKioskModeComponent() != nullptr)
- env->CallVoidMethod (window.get(), AndroidWindow.clearFlags, FLAG_NOT_FOCUSABLE);
- }
-
- void JUCE_CALLTYPE NativeMessageBox::showMessageBoxAsync (MessageBoxIconType /*iconType*/,
- const String& title, const String& message,
- Component* /*associatedComponent*/,
- ModalComponentManager::Callback* callback)
- {
- createAndroidDialog (MessageBoxOptions()
- .withTitle (title)
- .withMessage (message)
- .withButton (TRANS("OK")),
- callback, AlertWindowMappings::messageBox);
- }
-
- bool JUCE_CALLTYPE NativeMessageBox::showOkCancelBox (MessageBoxIconType /*iconType*/,
- const String& title, const String& message,
- Component* /*associatedComponent*/,
- ModalComponentManager::Callback* callback)
- {
- createAndroidDialog (MessageBoxOptions()
- .withTitle (title)
- .withMessage (message)
- .withButton (TRANS("OK"))
- .withButton (TRANS("Cancel")),
- callback, AlertWindowMappings::okCancel);
-
- return false;
- }
-
- int JUCE_CALLTYPE NativeMessageBox::showYesNoCancelBox (MessageBoxIconType /*iconType*/,
- const String& title, const String& message,
- Component* /*associatedComponent*/,
- ModalComponentManager::Callback* callback)
- {
- createAndroidDialog (MessageBoxOptions()
- .withTitle (title)
- .withMessage (message)
- .withButton (TRANS("Yes"))
- .withButton (TRANS("No"))
- .withButton (TRANS("Cancel")),
- callback, AlertWindowMappings::yesNoCancel);
-
- return 0;
- }
-
- int JUCE_CALLTYPE NativeMessageBox::showYesNoBox (MessageBoxIconType /*iconType*/,
- const String& title, const String& message,
- Component* /*associatedComponent*/,
- ModalComponentManager::Callback* callback)
- {
- createAndroidDialog (MessageBoxOptions()
- .withTitle (title)
- .withMessage (message)
- .withButton (TRANS("Yes"))
- .withButton (TRANS("No")),
- callback, AlertWindowMappings::okCancel);
-
- return 0;
- }
-
- void JUCE_CALLTYPE NativeMessageBox::showAsync (const MessageBoxOptions& options,
- ModalComponentManager::Callback* callback)
- {
- createAndroidDialog (options, callback, AlertWindowMappings::noMapping);
- }
-
- void JUCE_CALLTYPE NativeMessageBox::showAsync (const MessageBoxOptions& options,
- std::function<void (int)> callback)
- {
- showAsync (options, ModalCallbackFunction::create (callback));
- }
-
- //==============================================================================
- static bool androidScreenSaverEnabled = true;
-
- void Desktop::setScreenSaverEnabled (bool shouldEnable)
- {
- constexpr auto FLAG_KEEP_SCREEN_ON = 0x80;
-
- if (shouldEnable != androidScreenSaverEnabled)
- {
- LocalRef<jobject> activity (getMainActivity());
-
- if (activity != nullptr)
- {
- auto* env = getEnv();
-
- LocalRef<jobject> mainWindow (env->CallObjectMethod (activity.get(), AndroidActivity.getWindow));
- env->CallVoidMethod (mainWindow.get(), AndroidWindow.setFlags, shouldEnable ? 0 : FLAG_KEEP_SCREEN_ON, FLAG_KEEP_SCREEN_ON);
- }
-
- androidScreenSaverEnabled = shouldEnable;
- }
- }
-
- bool Desktop::isScreenSaverEnabled()
- {
- return androidScreenSaverEnabled;
- }
-
- //==============================================================================
- void Desktop::setKioskComponent (Component* kioskComp, bool enableOrDisable, bool allowMenusAndBars)
- {
- ignoreUnused (allowMenusAndBars);
-
- if (AndroidComponentPeer* peer = dynamic_cast<AndroidComponentPeer*> (kioskComp->getPeer()))
- peer->setFullScreen (enableOrDisable);
- else
- jassertfalse; // (this should have been checked by the caller)
- }
-
- //==============================================================================
- static jint getAndroidOrientationFlag (int orientations) noexcept
- {
- enum
- {
- SCREEN_ORIENTATION_LANDSCAPE = 0,
- SCREEN_ORIENTATION_PORTRAIT = 1,
- SCREEN_ORIENTATION_USER = 2,
- SCREEN_ORIENTATION_REVERSE_LANDSCAPE = 8,
- SCREEN_ORIENTATION_REVERSE_PORTRAIT = 9,
- SCREEN_ORIENTATION_USER_LANDSCAPE = 11,
- SCREEN_ORIENTATION_USER_PORTRAIT = 12,
- };
-
- switch (orientations)
- {
- case Desktop::upright: return (jint) SCREEN_ORIENTATION_PORTRAIT;
- case Desktop::upsideDown: return (jint) SCREEN_ORIENTATION_REVERSE_PORTRAIT;
- case Desktop::upright + Desktop::upsideDown: return (jint) SCREEN_ORIENTATION_USER_PORTRAIT;
- case Desktop::rotatedAntiClockwise: return (jint) SCREEN_ORIENTATION_LANDSCAPE;
- case Desktop::rotatedClockwise: return (jint) SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
- case Desktop::rotatedClockwise + Desktop::rotatedAntiClockwise: return (jint) SCREEN_ORIENTATION_USER_LANDSCAPE;
- default: return (jint) SCREEN_ORIENTATION_USER;
- }
- }
-
- void Desktop::allowedOrientationsChanged()
- {
- LocalRef<jobject> activity (getMainActivity());
-
- if (activity != nullptr)
- getEnv()->CallVoidMethod (activity.get(), AndroidActivity.setRequestedOrientation, getAndroidOrientationFlag (allowedOrientations));
- }
-
- //==============================================================================
- bool juce_areThereAnyAlwaysOnTopWindows()
- {
- return false;
- }
-
- //==============================================================================
- #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
- METHOD (create, "<init>", "()V") \
- FIELD (density, "density", "F") \
- FIELD (widthPixels, "widthPixels", "I") \
- FIELD (heightPixels, "heightPixels", "I")
-
- DECLARE_JNI_CLASS (AndroidDisplayMetrics, "android/util/DisplayMetrics")
- #undef JNI_CLASS_MEMBERS
-
- //==============================================================================
- class LayoutChangeListener : public juce::AndroidInterfaceImplementer
- {
- public:
- virtual void onLayoutChange (LocalRef<jobject> view, int left, int top, int right, int bottom,
- int oldLeft, int oldTop, int oldRight, int oldBottom) = 0;
-
- private:
- jobject invoke (jobject proxy, jobject method, jobjectArray args) override
- {
- auto* env = getEnv();
- auto methodName = juce::juceString ((jstring) env->CallObjectMethod (method, JavaMethod.getName));
-
- if (methodName == "onLayoutChange")
- {
- jassert (env->GetArrayLength (args) == 9);
-
- LocalRef<jobject> view (env->GetObjectArrayElement (args, 0));
- int dims[8];
-
- for (int i = 1; i < 9; ++i)
- {
- LocalRef<jobject> integer (env->GetObjectArrayElement (args, i));
- dims[i - 1] = env->CallIntMethod (integer.get(), JavaInteger.intValue);
- }
-
- onLayoutChange (std::move (view), dims[0], dims[1], dims[2], dims[3],
- dims[4], dims[5], dims[6], dims[7]);
-
- return nullptr;
- }
-
- // invoke base class
- return AndroidInterfaceImplementer::invoke (proxy, method, args);
- }
-
- std::unique_ptr<ModalComponentManager::Callback> callback;
- };
-
- //==============================================================================
- struct MainActivityWindowLayoutListener : public LayoutChangeListener
- {
- MainActivityWindowLayoutListener (std::function<void()>&& updateDisplaysCb)
- : forceDisplayUpdate (std::move (updateDisplaysCb))
- {
- }
-
- void onLayoutChange (LocalRef<jobject> /*view*/, int left, int top, int right, int bottom,
- int oldLeft, int oldTop, int oldRight, int oldBottom) override
- {
- auto newBounds = Rectangle<int>::leftTopRightBottom (left, top, right, bottom);
- auto oldBounds = Rectangle<int>::leftTopRightBottom (oldLeft, oldTop, oldRight, oldBottom);
-
- if (newBounds != oldBounds)
- {
- const auto& mainDisplay = *Desktop::getInstance().getDisplays().getPrimaryDisplay();
- auto userArea = (newBounds.toFloat() / mainDisplay.scale).toNearestInt();
-
- if (userArea != mainDisplay.userArea)
- forceDisplayUpdate();
- }
- }
-
- std::function<void()> forceDisplayUpdate;
- };
-
- //==============================================================================
- void Displays::findDisplays (float masterScale)
- {
- auto* env = getEnv();
-
- LocalRef<jobject> usableSize (env->NewObject (AndroidPoint, AndroidPoint.create, 0, 0));
- LocalRef<jstring> windowServiceString (javaString ("window"));
- LocalRef<jobject> displayMetrics (env->NewObject (AndroidDisplayMetrics, AndroidDisplayMetrics.create));
- LocalRef<jobject> windowManager (env->CallObjectMethod (getAppContext().get(), AndroidContext.getSystemService, windowServiceString.get()));
- LocalRef <jobject> display (env->CallObjectMethod (windowManager, AndroidWindowManager.getDefaultDisplay));
-
- jmethodID getRealMetricsMethod = env->GetMethodID (AndroidDisplay, "getRealMetrics", "(Landroid/util/DisplayMetrics;)V");
-
- if (getRealMetricsMethod != nullptr)
- env->CallVoidMethod (display.get(), getRealMetricsMethod, displayMetrics.get());
- else
- env->CallVoidMethod (display.get(), AndroidDisplay.getMetrics, displayMetrics.get());
-
- env->CallVoidMethod (display.get(), AndroidDisplay.getSize, usableSize.get());
-
- Display d;
-
- d.isMain = true;
- d.scale = env->GetFloatField (displayMetrics.get(), AndroidDisplayMetrics.density);
- d.dpi = (d.scale * 160.f);
- d.scale *= masterScale;
-
- d.totalArea = Rectangle<int> (env->GetIntField (displayMetrics.get(), AndroidDisplayMetrics.widthPixels),
- env->GetIntField (displayMetrics.get(), AndroidDisplayMetrics.heightPixels)) / d.scale;
-
- d.userArea = Rectangle<int> (env->GetIntField (usableSize.get(), AndroidPoint.x),
- env->GetIntField (usableSize.get(), AndroidPoint.y)) / d.scale;
-
- // unfortunately usableSize still contains the nav bar
- // the best workaround is to try to get the size of the top-level view of
- // the main activity
- LocalRef<jobject> activity (getMainActivity());
-
- if (activity != nullptr)
- {
- LocalRef<jobject> mainWindow (env->CallObjectMethod (activity.get(), AndroidActivity.getWindow));
- LocalRef<jobject> decorView (env->CallObjectMethod (mainWindow.get(), AndroidWindow.getDecorView));
- LocalRef<jobject> contentView (env->CallObjectMethod (decorView.get(), AndroidView.findViewById, 0x01020002 /* android.R.id.content */));
-
- if (contentView != nullptr)
- {
- Rectangle<int> activityArea (env->CallIntMethod (contentView.get(), AndroidView.getLeft),
- env->CallIntMethod (contentView.get(), AndroidView.getTop),
- env->CallIntMethod (contentView.get(), AndroidView.getWidth),
- env->CallIntMethod (contentView.get(), AndroidView.getHeight));
-
- if (! activityArea.isEmpty())
- d.userArea = activityArea / d.scale;
-
- if (supportsDisplayCutout())
- {
- jmethodID getRootWindowInsetsMethodId = env->GetMethodID (AndroidView,
- "getRootWindowInsets",
- "()Landroid/view/WindowInsets;");
-
- if (getRootWindowInsetsMethodId != nullptr)
- {
- LocalRef<jobject> insets (env->CallObjectMethod (contentView.get(), getRootWindowInsetsMethodId));
-
- if (insets != nullptr)
- {
- LocalRef<jobject> displayCutout (env->CallObjectMethod (insets.get(), AndroidWindowInsets.getDisplayCutout));
-
- if (displayCutout.get() != nullptr)
- d.safeAreaInsets = androidDisplayCutoutToBorderSize (displayCutout, d.scale);
- }
- }
- }
-
- static bool hasAddedMainActivityListener = false;
-
- if (! hasAddedMainActivityListener)
- {
- hasAddedMainActivityListener = true;
-
- env->CallVoidMethod (contentView.get(), AndroidView.addOnLayoutChangeListener,
- CreateJavaInterface (new MainActivityWindowLayoutListener ([this] { refresh(); }),
- "android/view/View$OnLayoutChangeListener").get());
- }
- }
- }
- else
- {
- // the main activity may have not started yet so add an activity listener
- if (AndroidComponentPeer::activityCallbackListener == nullptr)
- {
- LocalRef<jobject> appContext (getAppContext());
-
- if (appContext.get() != nullptr)
- {
- AndroidComponentPeer::activityCallbackListener = GlobalRef (CreateJavaInterface (
- new AndroidComponentPeer::StartupActivityCallbackListener,
- "android/app/Application$ActivityLifecycleCallbacks"));
-
- env->CallVoidMethod (appContext.get(),
- AndroidApplication.registerActivityLifecycleCallbacks,
- AndroidComponentPeer::activityCallbackListener.get());
- }
- }
- }
-
- displays.add (d);
- }
-
- //==============================================================================
- Image juce_createIconForFile (const File& /*file*/)
- {
- return Image();
- }
-
- //==============================================================================
- class MouseCursor::PlatformSpecificHandle
- {
- public:
- PlatformSpecificHandle (const MouseCursor::StandardCursorType) {}
- PlatformSpecificHandle (const CustomMouseCursorInfo&) {}
-
- static void showInWindow (PlatformSpecificHandle*, ComponentPeer*) {}
- };
-
- //==============================================================================
- bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray& /*files*/, bool /*canMove*/,
- Component* /*srcComp*/, std::function<void()> /*callback*/)
- {
- jassertfalse; // no such thing on Android!
- return false;
- }
-
- bool DragAndDropContainer::performExternalDragDropOfText (const String& /*text*/, Component* /*srcComp*/,
- std::function<void()> /*callback*/)
- {
- jassertfalse; // no such thing on Android!
- return false;
- }
-
- //==============================================================================
- void LookAndFeel::playAlertSound()
- {
- }
-
- //==============================================================================
- #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
- METHOD (getText, "getText", "()Ljava/lang/CharSequence;") \
- METHOD (setText, "setText", "(Ljava/lang/CharSequence;)V")
-
- DECLARE_JNI_CLASS (AndroidClipboardManager, "android/content/ClipboardManager")
- #undef JNI_CLASS_MEMBERS
-
- //==============================================================================
- void SystemClipboard::copyTextToClipboard (const String& text)
- {
- auto* env = getEnv();
-
- LocalRef<jobject> clipboardManager (env->CallObjectMethod (getAppContext().get(), AndroidContext.getSystemService, javaString ("clipboard").get()));
- env->CallVoidMethod (clipboardManager.get(), AndroidClipboardManager.setText, javaString(text).get());
- }
-
- String SystemClipboard::getTextFromClipboard()
- {
- auto* env = getEnv();
-
- LocalRef<jobject> clipboardManager (env->CallObjectMethod (getAppContext().get(), AndroidContext.getSystemService, javaString ("clipboard").get()));
- LocalRef<jobject> charSequence (env->CallObjectMethod (clipboardManager.get(), AndroidClipboardManager.getText));
-
- if (charSequence == nullptr)
- return {};
-
- return juceString(LocalRef<jstring> ((jstring) env->CallObjectMethod(charSequence.get(), JavaCharSequence.toString)));
- }
-
- //==============================================================================
- constexpr int extendedKeyModifier = 0x10000;
-
- const int KeyPress::spaceKey = ' ';
- const int KeyPress::returnKey = extendedKeyModifier + 2;
- const int KeyPress::escapeKey = extendedKeyModifier + 3;
- const int KeyPress::backspaceKey = extendedKeyModifier + 4;
- const int KeyPress::leftKey = extendedKeyModifier + 5;
- const int KeyPress::rightKey = extendedKeyModifier + 6;
- const int KeyPress::upKey = extendedKeyModifier + 7;
- const int KeyPress::downKey = extendedKeyModifier + 8;
- const int KeyPress::pageUpKey = extendedKeyModifier + 9;
- const int KeyPress::pageDownKey = extendedKeyModifier + 10;
- const int KeyPress::endKey = extendedKeyModifier + 11;
- const int KeyPress::homeKey = extendedKeyModifier + 12;
- const int KeyPress::deleteKey = extendedKeyModifier + 13;
- const int KeyPress::insertKey = extendedKeyModifier + 14;
- const int KeyPress::tabKey = extendedKeyModifier + 15;
- const int KeyPress::F1Key = extendedKeyModifier + 16;
- const int KeyPress::F2Key = extendedKeyModifier + 17;
- const int KeyPress::F3Key = extendedKeyModifier + 18;
- const int KeyPress::F4Key = extendedKeyModifier + 19;
- const int KeyPress::F5Key = extendedKeyModifier + 20;
- const int KeyPress::F6Key = extendedKeyModifier + 21;
- const int KeyPress::F7Key = extendedKeyModifier + 22;
- const int KeyPress::F8Key = extendedKeyModifier + 23;
- const int KeyPress::F9Key = extendedKeyModifier + 24;
- const int KeyPress::F10Key = extendedKeyModifier + 25;
- const int KeyPress::F11Key = extendedKeyModifier + 26;
- const int KeyPress::F12Key = extendedKeyModifier + 27;
- const int KeyPress::F13Key = extendedKeyModifier + 28;
- const int KeyPress::F14Key = extendedKeyModifier + 29;
- const int KeyPress::F15Key = extendedKeyModifier + 30;
- const int KeyPress::F16Key = extendedKeyModifier + 31;
- const int KeyPress::F17Key = extendedKeyModifier + 32;
- const int KeyPress::F18Key = extendedKeyModifier + 33;
- const int KeyPress::F19Key = extendedKeyModifier + 34;
- const int KeyPress::F20Key = extendedKeyModifier + 35;
- const int KeyPress::F21Key = extendedKeyModifier + 36;
- const int KeyPress::F22Key = extendedKeyModifier + 37;
- const int KeyPress::F23Key = extendedKeyModifier + 38;
- const int KeyPress::F24Key = extendedKeyModifier + 39;
- const int KeyPress::F25Key = extendedKeyModifier + 40;
- const int KeyPress::F26Key = extendedKeyModifier + 41;
- const int KeyPress::F27Key = extendedKeyModifier + 42;
- const int KeyPress::F28Key = extendedKeyModifier + 43;
- const int KeyPress::F29Key = extendedKeyModifier + 44;
- const int KeyPress::F30Key = extendedKeyModifier + 45;
- const int KeyPress::F31Key = extendedKeyModifier + 46;
- const int KeyPress::F32Key = extendedKeyModifier + 47;
- const int KeyPress::F33Key = extendedKeyModifier + 48;
- const int KeyPress::F34Key = extendedKeyModifier + 49;
- const int KeyPress::F35Key = extendedKeyModifier + 50;
- const int KeyPress::numberPad0 = extendedKeyModifier + 51;
- const int KeyPress::numberPad1 = extendedKeyModifier + 52;
- const int KeyPress::numberPad2 = extendedKeyModifier + 53;
- const int KeyPress::numberPad3 = extendedKeyModifier + 54;
- const int KeyPress::numberPad4 = extendedKeyModifier + 55;
- const int KeyPress::numberPad5 = extendedKeyModifier + 56;
- const int KeyPress::numberPad6 = extendedKeyModifier + 57;
- const int KeyPress::numberPad7 = extendedKeyModifier + 58;
- const int KeyPress::numberPad8 = extendedKeyModifier + 59;
- const int KeyPress::numberPad9 = extendedKeyModifier + 60;
- const int KeyPress::numberPadAdd = extendedKeyModifier + 61;
- const int KeyPress::numberPadSubtract = extendedKeyModifier + 62;
- const int KeyPress::numberPadMultiply = extendedKeyModifier + 63;
- const int KeyPress::numberPadDivide = extendedKeyModifier + 64;
- const int KeyPress::numberPadSeparator = extendedKeyModifier + 65;
- const int KeyPress::numberPadDecimalPoint = extendedKeyModifier + 66;
- const int KeyPress::numberPadEquals = extendedKeyModifier + 67;
- const int KeyPress::numberPadDelete = extendedKeyModifier + 68;
- const int KeyPress::playKey = extendedKeyModifier + 69;
- const int KeyPress::stopKey = extendedKeyModifier + 70;
- const int KeyPress::fastForwardKey = extendedKeyModifier + 71;
- const int KeyPress::rewindKey = extendedKeyModifier + 72;
-
- //==============================================================================
- #ifdef JUCE_PUSH_NOTIFICATIONS_ACTIVITY
- struct JuceActivityNewIntentListener
- {
- #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
- CALLBACK (appNewIntent, "appNewIntent", "(Landroid/content/Intent;)V")
-
- DECLARE_JNI_CLASS (JavaActivity, JUCE_PUSH_NOTIFICATIONS_ACTIVITY)
- #undef JNI_CLASS_MEMBERS
-
- static void JNICALL appNewIntent (JNIEnv*, jobject /*activity*/, jobject intentData)
- {
- juce_handleNotificationIntent (static_cast<void*> (intentData));
- }
- };
-
- JuceActivityNewIntentListener::JavaActivity_Class JuceActivityNewIntentListener::JavaActivity;
- #endif
-
- } // namespace juce
|