|
- /*
- ==============================================================================
-
- This file is part of the JUCE library.
- Copyright (c) 2017 - ROLI Ltd.
-
- 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 5 End-User License
- Agreement and JUCE 5 Privacy Policy (both updated and effective as of the
- 27th April 2017).
-
- End User License Agreement: www.juce.com/juce-5-licence
- Privacy Policy: www.juce.com/juce-5-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/roli/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,248,105,229,91,0,3,67,111,109,112,111,110,101,110,116,80,101,101,114,86,105,101,119,46,100,101,120,0,165,154,
- 11,124,92,85,157,199,255,231,220,59,51,201,100,50,153,76,210,164,73,38,233,228,217,105,155,38,83,160,208,146,180,244,13,
- 105,147,182,52,105,160,73,129,222,76,110,146,105,39,247,78,103,38,143,10,46,225,177,148,69,228,225,118,1,5,93,68,100,171,
- 162,219,34,178,5,92,101,149,197,174,162,91,124,176,85,235,10,10,31,145,45,136,221,186,174,136,178,191,115,238,153,100,
- 250,2,117,39,159,239,252,255,231,127,254,247,188,207,255,156,153,204,160,57,233,141,158,191,152,158,156,245,224,205,149,
- 149,85,69,59,14,196,31,217,241,202,99,15,124,242,195,239,188,245,102,211,239,146,201,249,68,73,34,154,236,189,32,72,234,
- 245,232,60,162,227,228,216,23,129,176,78,116,17,228,43,144,165,194,215,67,52,4,57,59,143,72,131,188,172,128,232,112,13,
- 209,126,200,19,229,68,39,193,59,160,116,54,81,57,168,2,53,160,14,52,130,121,96,21,88,11,58,64,23,216,2,118,130,7,193,211,
- 224,69,240,107,80,92,129,54,128,237,96,28,220,9,30,6,79,129,239,129,95,129,202,74,162,86,208,1,110,0,15,129,239,130,223,
- 129,198,42,162,30,240,0,248,15,240,54,168,9,17,45,7,6,184,22,220,1,30,3,71,193,27,32,80,77,212,0,86,131,43,192,45,224,33,
- 176,31,60,1,158,4,255,12,158,5,135,193,17,240,34,56,6,94,6,175,130,215,193,175,192,73,240,54,248,35,112,99,140,242,129,
- 31,148,130,10,80,13,234,64,19,152,15,150,131,110,112,13,216,5,38,192,77,224,78,240,0,120,24,28,4,79,131,23,193,15,193,
- 113,112,18,188,3,244,57,68,133,160,20,212,130,22,176,28,116,129,94,112,21,136,129,33,48,10,174,5,183,128,143,131,71,193,
- 19,224,107,224,8,248,49,120,11,252,30,248,194,24,103,80,15,154,193,82,176,1,244,131,36,184,30,220,9,62,15,190,8,158,4,95,
- 6,223,6,63,5,191,6,84,139,182,129,122,112,1,88,11,122,128,1,118,129,155,193,29,96,31,184,23,124,10,236,7,79,130,195,224,
- 135,224,21,112,2,188,13,220,117,152,43,80,5,26,192,50,208,9,186,193,0,24,1,73,48,9,174,5,55,128,219,192,93,224,30,240,25,
- 240,21,112,4,252,28,80,61,81,9,104,2,139,193,70,208,11,76,48,6,166,192,157,224,62,240,16,56,8,190,10,190,1,142,128,31,
- 129,151,193,27,224,36,248,45,168,106,192,88,129,21,96,45,216,10,98,224,58,112,59,248,24,120,28,124,11,188,6,126,3,244,70,
- 244,11,132,65,11,88,6,186,192,118,48,14,174,3,55,131,219,193,71,192,189,224,227,224,31,192,103,193,65,240,20,120,6,188,0,
- 142,129,55,193,219,224,15,128,154,80,7,200,107,114,246,175,11,96,75,147,31,20,129,0,40,6,34,32,148,144,179,231,103,129,
- 50,80,46,246,61,192,182,35,108,47,194,118,34,108,25,194,242,38,44,63,154,35,226,133,51,213,164,134,148,208,37,82,213,210,
- 92,16,1,8,49,132,208,67,11,64,51,88,8,90,64,43,136,170,184,115,30,56,31,92,0,22,131,37,224,82,208,5,54,130,77,96,51,57,
- 125,200,190,116,37,31,44,115,250,197,84,218,173,116,97,23,125,229,202,158,167,244,253,176,123,149,159,120,249,84,222,1,
- 101,247,43,187,87,141,75,86,159,149,227,47,198,229,80,153,163,139,49,121,70,61,91,171,124,10,212,88,136,54,20,170,241,56,
- 172,252,133,126,68,249,71,148,127,161,26,163,163,101,78,223,23,40,251,82,165,139,114,46,86,250,75,208,219,148,126,28,122,
- 187,210,79,66,95,166,116,29,147,183,92,233,1,232,151,40,61,4,125,133,210,27,160,175,202,206,75,142,253,130,28,189,29,250,
- 26,165,175,201,177,111,206,209,175,204,209,119,228,148,57,146,99,79,66,95,173,244,201,28,251,93,101,51,186,24,195,149,74,
- 159,202,41,231,214,28,127,49,110,107,179,207,194,190,78,233,247,229,248,236,207,209,15,148,59,235,168,89,141,231,101,74,
- 63,4,123,135,210,159,129,190,94,233,207,67,239,84,250,247,161,111,80,250,177,28,251,43,57,246,227,229,98,78,25,93,69,142,
- 60,70,98,223,132,233,74,37,239,148,146,209,71,148,220,167,228,223,41,121,143,146,247,42,255,7,73,236,181,102,250,123,41,
- 171,232,71,36,246,93,136,126,168,228,207,164,172,164,87,197,92,98,53,223,37,101,21,125,66,202,102,250,178,148,5,244,85,
- 185,254,106,233,66,18,123,166,132,14,146,216,35,213,244,117,18,235,222,77,163,82,6,232,3,144,249,200,103,82,46,164,231,
- 72,172,203,90,153,46,80,246,2,236,162,111,200,254,57,233,34,212,155,144,178,152,44,149,190,86,172,51,101,15,96,103,238,
- 86,233,49,41,53,26,39,39,214,76,40,57,41,37,163,41,37,111,32,177,215,56,165,164,172,163,235,73,196,163,26,89,95,9,162,
- 195,19,82,46,162,127,146,114,22,61,69,98,63,54,81,159,146,207,146,136,89,141,210,191,2,145,228,14,41,235,233,155,82,46,
- 166,239,203,241,156,43,243,43,81,194,151,228,56,206,147,233,42,216,47,87,114,139,148,62,234,150,178,132,126,160,228,139,
- 114,92,231,72,255,16,70,178,71,202,8,109,149,178,132,182,43,105,72,25,37,83,202,74,218,37,165,91,222,175,66,170,127,33,
- 68,191,180,148,249,180,71,74,47,93,167,242,63,40,101,30,253,149,148,206,56,132,208,179,155,148,188,89,201,191,150,114,54,
- 221,162,228,94,101,191,85,202,114,250,27,37,111,83,242,67,82,86,208,237,82,182,210,253,74,62,32,101,136,62,171,214,209,
- 231,148,124,84,201,207,171,252,47,168,244,63,42,121,64,173,179,199,164,12,211,23,165,108,164,199,165,116,230,43,164,230,
- 75,164,15,169,245,249,164,148,206,252,133,16,237,159,150,114,1,29,86,242,223,164,108,160,231,165,44,165,239,72,57,159,
- 254,93,165,143,40,191,23,148,252,174,202,255,158,234,255,207,73,196,224,32,101,164,188,144,62,38,247,129,159,94,38,17,
- 119,157,245,219,132,104,107,147,136,189,26,13,72,201,233,83,36,226,111,17,125,148,156,179,142,200,137,211,34,62,137,51,
- 99,7,228,87,84,176,174,82,107,184,73,249,137,252,36,242,95,80,249,226,60,40,38,231,60,189,79,61,63,5,249,187,200,140,255,
- 109,208,239,142,56,231,217,253,144,15,129,71,35,206,185,245,37,105,231,206,222,107,18,251,18,119,175,96,1,37,3,6,108,65,
- 218,30,240,202,51,42,15,41,241,124,41,124,250,69,125,238,82,170,227,62,248,229,227,233,158,116,1,245,156,239,35,43,112,
- 62,188,124,44,72,75,89,251,140,53,124,17,118,199,140,207,34,248,120,181,45,56,178,182,52,50,58,216,115,55,105,250,226,29,
- 149,180,53,237,165,37,90,25,5,181,237,208,178,254,61,153,2,218,29,104,194,62,247,233,187,3,243,33,11,244,221,209,5,180,
- 218,37,252,151,106,30,186,104,135,139,130,37,226,25,63,234,42,195,92,88,129,89,104,239,233,117,68,190,35,206,113,77,142,
- 201,210,38,231,78,210,31,244,169,190,214,97,46,146,225,90,140,118,127,192,79,253,37,133,178,223,76,254,33,126,55,57,119,
- 128,100,64,220,52,252,211,246,203,167,237,17,105,231,234,102,176,77,221,129,122,2,133,114,126,52,216,69,189,70,147,115,
- 46,247,132,11,209,74,113,3,65,15,107,69,187,171,80,179,127,218,111,228,156,126,33,233,231,71,92,16,61,177,225,39,214,127,
- 208,29,156,149,12,151,211,103,168,78,23,179,231,65,171,250,247,33,186,233,85,148,140,214,211,190,252,254,125,1,10,233,46,
- 148,112,13,61,76,94,125,137,126,21,205,241,138,52,195,202,237,123,160,8,90,63,197,105,251,253,136,180,225,30,218,134,247,
- 173,242,189,23,43,181,14,43,35,25,16,61,45,209,75,169,126,229,66,106,98,34,142,89,97,23,218,211,35,106,114,121,49,126,
- 110,18,37,230,33,102,5,53,43,48,128,167,124,122,165,235,91,20,108,170,31,106,165,160,103,32,175,132,186,242,220,158,96,
- 121,40,175,64,106,86,244,106,234,113,251,180,37,90,41,5,121,176,161,126,77,148,130,174,221,129,29,232,157,207,221,229,
- 214,93,193,89,65,41,173,168,73,127,171,99,12,2,28,81,204,167,207,209,157,214,239,163,200,39,11,245,200,73,112,2,188,5,
- 126,4,142,98,202,229,29,115,230,53,117,9,253,89,233,211,95,78,190,56,191,203,16,143,76,114,206,19,174,213,223,204,234,
- 110,100,243,166,24,159,123,43,107,188,133,57,243,45,94,63,80,235,160,59,92,36,247,177,88,127,34,125,44,187,110,162,203,
- 168,86,19,179,233,236,175,87,213,186,236,94,81,68,101,92,222,87,249,82,228,248,165,37,25,189,152,116,22,121,123,166,252,
- 55,154,156,251,168,184,67,247,161,14,191,170,67,188,254,187,201,217,255,193,64,209,244,186,252,131,106,207,214,64,177,
- 172,135,171,117,204,231,58,119,68,43,176,88,236,28,220,5,117,249,92,144,34,127,212,84,121,121,115,157,152,225,151,207,57,
- 55,221,64,142,205,13,155,240,44,159,251,222,125,88,162,250,144,245,15,191,143,255,210,233,62,59,237,152,119,150,118,44,
- 58,139,109,73,142,77,87,117,93,50,215,185,55,7,153,136,188,253,81,78,142,212,104,219,34,68,145,183,182,69,61,180,45,234,
- 86,214,124,172,31,220,220,3,219,162,58,242,243,176,11,202,208,158,106,10,179,98,213,95,49,246,27,231,58,49,248,236,237,
- 239,89,21,164,228,150,149,164,95,30,249,95,241,25,65,147,243,222,123,206,103,206,95,251,238,187,178,223,43,90,73,55,196,
- 51,249,176,139,122,98,115,157,251,122,176,184,123,0,79,233,226,41,174,203,153,194,248,53,123,196,103,36,145,99,5,124,136,
- 215,216,141,155,219,168,41,205,2,145,19,118,116,54,141,231,121,41,242,134,21,136,162,221,62,220,46,52,248,137,81,66,190,
- 184,232,113,167,93,217,207,96,37,106,220,4,94,228,136,250,175,159,235,124,158,10,178,233,250,57,234,199,147,69,108,169,
- 39,31,229,121,209,86,47,15,214,159,119,158,135,236,21,21,52,126,159,151,69,78,88,129,2,17,7,248,18,254,198,187,89,221,10,
- 199,208,106,175,108,175,108,167,22,44,142,252,196,25,31,81,215,71,231,58,159,129,78,29,31,167,167,194,38,250,232,70,93,
- 201,45,237,24,217,96,32,242,27,231,174,41,94,143,228,204,123,62,74,19,229,61,174,198,219,190,178,146,122,198,115,75,93,
- 130,58,157,117,118,21,214,153,243,89,149,203,207,104,255,138,103,66,40,168,251,5,120,99,241,44,98,76,91,202,208,6,86,196,
- 172,128,56,31,188,249,86,64,196,226,2,207,15,238,126,151,22,176,255,145,163,19,249,117,247,119,177,115,152,21,14,224,86,
- 233,213,45,236,53,248,186,172,64,80,72,183,231,133,241,188,229,226,116,45,142,28,123,127,207,21,142,231,55,222,223,243,
- 18,120,90,1,17,3,188,5,193,226,139,170,230,83,176,182,62,212,130,24,121,30,125,155,130,149,139,159,170,37,81,138,40,227,
- 11,162,140,112,137,144,44,232,90,227,242,185,110,220,250,220,44,43,92,234,88,202,214,184,125,238,27,135,158,43,203,150,
- 123,212,139,153,124,9,237,184,169,148,209,187,184,55,220,253,178,151,229,45,245,206,166,63,181,7,243,104,232,221,220,246,
- 252,37,45,17,37,69,126,252,231,183,96,185,106,65,227,255,187,5,203,101,11,196,182,241,200,181,38,214,150,136,21,173,74,
- 138,24,35,238,165,105,185,246,184,60,163,47,142,56,223,65,160,141,56,17,61,88,253,149,26,230,163,180,126,13,78,68,215,
- 128,27,39,162,60,221,174,166,243,116,31,91,138,146,253,184,53,70,254,8,222,9,6,235,235,112,30,106,226,60,204,195,153,215,
- 165,115,77,156,131,187,121,228,205,66,30,57,14,94,7,175,137,245,94,140,182,137,251,162,216,25,156,207,45,107,156,173,213,
- 71,234,154,231,205,207,137,137,131,145,153,189,161,41,107,34,226,220,251,150,112,15,246,151,21,222,6,15,63,5,87,68,126,
- 47,250,231,196,205,177,136,243,157,137,136,31,226,134,87,201,239,131,167,134,88,42,98,73,5,226,210,108,228,13,98,135,122,
- 217,50,86,130,209,182,162,97,138,162,199,23,74,127,43,58,135,2,122,207,162,0,238,114,13,178,252,108,78,144,91,209,26,10,
- 112,39,79,124,170,138,156,112,190,243,205,125,61,126,90,250,217,211,210,162,79,165,228,156,119,197,104,5,83,54,231,51,
- 148,35,243,148,44,87,178,74,249,55,225,51,148,72,71,84,58,130,217,212,41,123,247,83,231,163,154,235,236,57,202,213,92,
- 103,207,79,71,247,200,239,98,184,164,57,199,46,100,161,76,235,170,110,183,202,115,195,143,43,155,71,201,124,37,125,234,
- 89,63,90,228,204,175,58,207,213,51,33,53,127,226,51,147,200,111,86,109,108,206,105,183,96,161,146,45,234,121,166,238,26,
- 66,22,77,219,138,84,93,206,115,129,233,186,152,250,28,131,182,182,199,173,120,102,57,149,173,182,71,147,182,101,90,153,
- 205,166,153,234,141,155,19,45,59,141,113,220,161,215,17,95,215,65,172,131,120,7,196,122,226,235,59,169,124,131,185,103,
- 192,54,82,131,107,226,233,209,120,58,221,25,79,103,76,203,76,17,235,36,222,9,215,206,78,210,58,241,86,214,105,88,131,41,
- 59,62,216,106,36,147,173,43,99,153,248,120,60,179,167,141,46,56,213,158,76,38,226,49,35,19,183,173,134,172,79,103,124,
- 200,140,237,137,37,204,213,70,34,49,96,196,118,165,219,168,226,92,79,229,102,197,108,11,109,201,180,174,22,114,50,147,
- 155,53,156,50,146,35,241,88,186,117,181,97,141,27,40,176,230,44,89,118,194,78,173,139,39,50,102,234,220,249,93,70,38,21,
- 159,108,163,121,239,153,127,74,81,179,207,116,221,108,196,45,180,175,252,204,156,45,102,12,25,37,211,25,118,186,117,213,
- 152,53,152,48,219,168,52,215,216,177,42,110,13,138,210,103,202,24,199,204,181,98,122,214,142,155,162,240,202,83,51,186,
- 108,49,92,42,111,222,169,121,98,206,27,54,89,235,236,216,88,122,245,136,97,13,155,217,105,205,109,202,180,107,110,151,
- 166,141,151,166,236,177,100,27,93,120,102,78,79,202,52,55,13,164,205,212,184,153,66,45,151,38,236,1,35,209,105,236,177,
- 199,50,51,213,204,121,239,231,218,168,229,84,135,184,149,28,203,140,154,153,17,123,176,117,149,145,54,59,68,26,19,111,97,
- 252,228,178,104,60,183,255,218,193,120,198,78,117,88,67,118,27,205,63,183,219,25,69,46,124,31,223,46,169,119,25,150,49,
- 44,90,188,174,51,102,143,182,166,236,68,188,117,231,88,204,108,61,99,155,53,156,99,47,53,156,218,243,165,127,105,57,109,
- 84,251,126,143,182,81,93,231,160,145,24,143,239,106,53,44,203,206,200,61,213,186,214,138,37,236,116,220,26,94,157,48,210,
- 114,179,156,233,211,129,113,73,169,252,218,179,228,119,153,163,3,202,193,76,139,21,35,98,74,107,2,139,171,21,75,44,213,
- 109,238,30,51,173,24,150,117,113,110,142,83,94,93,142,169,35,145,48,135,141,196,202,88,204,76,167,215,78,198,204,164,51,
- 25,13,103,241,73,13,143,141,162,115,57,94,37,185,94,136,10,195,206,168,204,24,55,218,221,99,177,17,103,230,114,158,11,
- 230,184,108,26,216,41,55,101,117,142,173,219,140,141,165,16,171,206,241,72,55,130,128,53,44,86,204,140,45,101,14,37,80,
- 14,154,49,110,59,177,171,199,72,13,155,185,173,173,60,139,187,211,180,54,210,123,182,109,94,75,190,220,165,65,172,151,
- 120,111,7,185,122,59,240,130,186,158,220,189,235,59,214,173,91,79,58,100,135,120,23,225,184,119,125,31,50,133,210,185,94,
- 188,73,173,15,185,157,125,8,234,189,125,120,170,79,150,192,250,72,235,19,207,225,173,83,168,136,233,125,66,17,129,189,31,
- 199,65,127,7,5,251,207,156,175,146,254,179,12,151,215,144,83,214,16,141,70,167,245,69,57,250,121,57,250,249,57,250,5,208,
- 11,28,125,93,194,24,78,147,219,144,251,79,24,133,236,52,6,204,4,229,25,234,180,160,10,99,112,240,236,81,133,216,0,21,139,
- 3,100,213,88,38,99,91,155,83,40,210,28,36,247,128,141,228,40,164,12,172,228,142,201,51,129,60,49,25,250,6,201,133,179,
- 199,72,81,65,204,30,52,55,219,136,212,43,51,34,49,29,221,201,47,19,61,41,195,74,15,217,169,81,42,20,39,15,66,122,90,122,
- 163,32,231,0,66,65,246,24,210,250,96,124,104,136,152,73,46,83,132,95,242,13,205,4,218,65,202,199,26,88,233,244,112,150,
- 80,103,206,54,117,142,81,33,204,98,207,160,203,102,42,77,121,34,41,6,158,188,66,83,78,62,177,148,68,241,61,241,81,83,22,
- 122,153,25,31,30,201,80,9,212,78,181,226,54,89,221,49,44,32,75,230,59,43,139,138,160,202,118,99,183,202,230,250,102,12,
- 29,131,228,65,106,139,49,113,101,86,217,70,5,66,177,237,140,136,31,20,64,162,123,15,198,123,180,27,107,50,30,51,201,15,
- 203,86,43,46,6,79,52,90,214,127,122,56,151,93,234,141,167,227,3,241,132,152,67,241,204,21,56,208,236,137,30,123,23,154,
- 23,154,78,75,167,132,137,200,150,76,24,123,214,165,12,116,78,71,238,149,242,29,87,219,17,42,194,64,98,30,49,112,155,141,
- 49,49,193,129,105,195,22,51,141,136,48,109,89,53,189,22,168,208,177,32,114,174,177,39,176,182,166,147,91,147,84,58,157,
- 144,81,245,178,248,224,32,218,164,170,233,178,81,135,124,230,20,67,202,24,206,150,41,13,40,70,149,41,207,122,202,27,49,
- 210,242,124,165,242,145,248,160,217,109,15,101,228,153,177,46,101,143,58,61,133,11,28,123,196,92,234,35,118,58,67,44,78,
- 94,204,229,38,25,28,210,164,197,71,71,169,72,92,217,226,70,98,181,145,76,119,97,132,169,80,25,186,205,196,90,107,112,58,
- 31,201,238,140,145,202,80,190,60,165,122,246,36,77,242,73,245,26,231,196,34,119,28,113,104,151,137,42,210,29,86,58,99,32,
- 22,83,94,60,189,41,105,32,48,227,177,180,26,121,242,236,50,247,172,22,85,149,239,58,199,213,175,48,155,209,61,34,198,197,
- 149,144,59,180,16,243,101,166,68,205,27,113,228,144,158,48,135,50,228,78,152,214,112,102,132,220,170,21,204,34,221,18,
- 115,234,177,204,137,141,114,114,237,196,224,136,124,159,160,98,219,202,94,10,87,167,76,35,131,153,44,153,49,173,49,211,
- 153,148,189,71,76,239,140,81,45,129,156,39,179,107,160,106,198,212,109,140,155,217,78,99,152,50,102,174,191,28,183,83,
- 139,232,206,216,201,36,76,133,182,37,150,80,54,144,148,99,139,202,102,157,118,83,32,183,109,97,65,76,8,255,156,59,21,249,
- 237,83,194,20,229,219,86,118,253,21,74,181,107,44,145,137,39,197,152,203,36,214,80,158,136,119,210,25,30,221,241,15,152,
- 217,168,225,195,241,97,227,228,146,91,30,21,58,211,230,113,228,53,120,110,12,81,43,131,104,225,74,202,245,231,77,26,41,
- 120,202,61,235,74,202,48,197,82,84,151,50,135,197,44,166,206,125,247,166,80,202,28,181,199,77,167,229,155,172,211,66,172,
- 43,37,131,140,150,54,51,228,79,139,112,52,125,243,37,31,210,178,255,134,88,71,229,185,169,14,167,245,114,9,139,199,114,
- 238,79,242,177,206,236,218,161,217,72,157,245,106,74,179,210,217,208,179,53,158,19,75,170,206,106,22,55,31,3,97,60,237,4,
- 35,185,212,10,211,167,4,33,111,54,153,112,218,116,69,60,145,216,104,103,228,76,250,210,88,218,217,128,128,7,145,154,222,
- 194,112,22,75,198,105,23,142,125,100,99,189,204,36,103,167,157,214,116,204,212,165,122,170,103,70,226,56,223,196,123,67,
- 84,201,69,176,138,8,174,161,12,168,98,8,242,198,50,67,75,100,44,101,227,228,26,55,18,98,166,165,216,52,68,186,184,139,82,
- 145,120,207,93,31,249,194,208,99,111,77,155,20,24,63,61,250,122,199,103,122,205,38,136,77,18,159,140,130,69,196,246,208,
- 65,206,200,227,239,107,167,67,248,0,220,220,175,241,175,179,194,189,26,251,23,86,50,71,163,56,111,153,252,237,206,118,86,
- 92,28,111,231,233,234,118,122,144,115,122,149,121,252,252,226,109,252,210,137,133,244,113,206,94,71,242,12,249,8,10,243,
- 63,78,159,115,68,141,54,252,21,118,55,243,52,243,23,168,141,191,201,38,248,215,63,56,113,43,227,46,239,202,133,237,45,
- 237,237,203,251,53,26,244,94,167,49,179,165,253,145,90,77,251,52,91,192,202,103,69,107,52,254,16,227,172,184,220,197,249,
- 229,213,46,114,49,151,230,246,242,5,15,187,188,110,114,51,55,119,107,243,231,243,241,102,23,159,207,211,205,84,225,84,93,
- 193,95,103,255,37,148,151,68,199,110,11,17,206,50,255,6,122,66,227,191,100,199,133,125,39,210,244,168,38,222,143,105,188,
- 239,26,200,23,53,214,7,241,140,20,120,228,23,82,249,80,136,142,40,135,159,57,14,223,116,196,207,57,251,42,243,84,111,216,
- 176,176,111,67,95,11,25,108,135,124,234,70,141,191,196,238,64,21,31,170,90,72,191,100,252,19,108,151,167,122,47,15,86,
- 243,100,53,47,106,251,52,207,84,111,255,52,159,172,166,219,185,246,9,54,130,76,94,120,11,31,175,190,167,127,231,94,141,
- 126,202,120,31,221,200,229,83,254,189,225,208,61,244,123,238,50,62,197,126,194,158,99,87,163,210,19,92,127,141,221,196,
- 62,203,62,131,26,150,237,237,163,61,210,145,31,166,106,254,212,245,213,27,180,252,43,121,167,230,57,198,48,133,180,141,
- 175,104,102,37,69,81,135,64,167,86,240,8,227,203,218,53,223,215,88,235,50,198,52,239,71,24,95,200,66,133,151,184,188,46,
- 223,34,87,193,78,183,183,133,149,148,241,107,219,218,221,190,101,172,122,150,176,159,106,228,235,88,181,159,238,214,216,
- 47,80,127,88,99,71,49,73,193,50,238,107,230,163,213,88,42,59,35,53,46,18,178,169,222,69,47,71,231,211,135,53,182,95,12,
- 247,65,141,109,247,248,227,33,250,54,99,255,9,195,179,26,237,99,149,45,59,55,76,238,168,216,75,188,154,189,196,102,87,
- 241,26,222,171,243,71,88,249,69,142,33,36,13,65,24,242,249,28,24,66,108,118,101,86,169,34,206,152,151,179,187,194,181,83,
- 83,250,243,229,117,236,173,114,210,220,228,187,43,140,213,194,235,111,152,210,15,85,176,91,195,175,137,183,169,74,188,
- 221,87,201,248,1,112,180,146,244,162,138,34,206,228,223,60,56,78,85,33,251,193,26,188,29,170,209,111,228,148,15,216,159,
- 64,8,52,179,35,53,140,77,205,97,236,129,57,165,236,0,228,97,112,28,76,133,25,219,7,158,5,39,193,173,181,240,1,7,192,205,
- 117,140,29,2,199,5,245,140,29,109,96,250,190,70,166,239,111,100,236,88,163,206,30,158,15,191,5,156,61,11,94,91,160,190,
- 203,201,126,71,150,149,217,223,97,138,239,120,178,191,197,20,223,9,101,127,143,169,211,204,111,50,197,119,74,217,223,101,
- 102,191,183,18,191,205,212,2,142,46,190,171,99,97,231,55,72,207,67,119,135,29,187,248,63,54,11,56,223,171,201,255,109,
- 135,157,122,197,111,57,53,229,47,254,231,172,135,157,114,197,255,169,73,61,43,255,255,29,112,218,42,126,55,250,127,111,
- 26,247,20,112,42,0,0};
-
- //==============================================================================
- #if JUCE_PUSH_NOTIFICATIONS && JUCE_MODULE_AVAILABLE_juce_gui_extra
- // Returns true if the intent was handled.
- 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
-
- #if JUCE_IN_APP_PURCHASES && JUCE_MODULE_AVAILABLE_juce_product_unlocking
- extern void juce_inAppPurchaseCompleted (void*);
- #endif
-
- extern void juce_contentSharingCompleted (int);
-
- //==============================================================================
- #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 (getDecorView, "getDecorView", "()Landroid/view/View;") \
- METHOD (setFlags, "setFlags", "(II)V")
-
- DECLARE_JNI_CLASS (AndroidWindow, "android/view/Window")
- #undef JNI_CLASS_MEMBERS
-
-
- //==============================================================================
- class AndroidComponentPeer : public ComponentPeer,
- private Timer
- {
- public:
- AndroidComponentPeer (Component& comp, const int windowStyleFlags, void* nativeViewHandle)
- : ComponentPeer (comp, windowStyleFlags),
- fullScreen (false),
- navBarsHidden (false),
- sizeAllocated (0),
- scale ((float) Desktop::getInstance().getDisplays().getMainDisplay().scale)
- {
- 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());
-
- Rectangle<int> physicalBounds = comp.getBoundsInParent() * scale;
-
- 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,
- 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 */);
- viewGroup = GlobalRef (LocalRef<jobject> (env->CallObjectMethod (getCurrentActivity().get(), AndroidContext.getSystemService, javaString ("window").get())));
-
- env->CallVoidMethod (viewGroup.get(), AndroidViewManager.addView, view.get(), windowLayoutParams.get());
- }
-
- if (isFocused())
- handleFocusGain();
- }
-
- ~AndroidComponentPeer()
- {
- auto* env = getEnv();
-
- env->CallVoidMethod (view, ComponentPeerView.clear);
- frontWindow = nullptr;
-
- if (MessageManager::getInstance()->isThisTheMessageThread())
- {
- if (env->IsInstanceOf (viewGroup.get(), AndroidActivity))
- env->CallVoidMethod (viewGroup.get(), AndroidActivity.setContentView, nullptr);
- else
- env->CallVoidMethod (viewGroup.get(), AndroidViewManager.removeView, view.get());
- }
- else
- {
- struct ViewDeleter : public CallbackMessage
- {
- ViewDeleter (const GlobalRef& view_, const GlobalRef& viewGroup_) : view (view_), group (viewGroup_) {}
-
- void messageCallback() override
- {
- auto* callbackEnv = getEnv();
-
- if (callbackEnv->IsInstanceOf (group.get(), AndroidActivity))
- callbackEnv->CallVoidMethod (group.get(), AndroidActivity.setContentView, nullptr);
- else
- callbackEnv->CallVoidMethod (group.get(), AndroidViewManager.removeView, view.get());
- }
-
- private:
- GlobalRef view, group;
- };
-
- (new ViewDeleter (view, viewGroup))->post();
- }
- }
-
- void* getNativeHandle() const override
- {
- return (void*) view.get();
- }
-
- void setVisible (bool shouldBeVisible) override
- {
- if (MessageManager::getInstance()->isThisTheMessageThread())
- {
- view.callVoidMethod (ComponentPeerView.setVisible, shouldBeVisible);
- }
- else
- {
- struct VisibilityChanger : public CallbackMessage
- {
- VisibilityChanger (const GlobalRef& view_, bool shouldBeVisible_)
- : view (view_), shouldBeVisible (shouldBeVisible_)
- {}
-
- void messageCallback() override
- {
- view.callVoidMethod (ComponentPeerView.setVisible, shouldBeVisible);
- }
-
- GlobalRef view;
- bool shouldBeVisible;
- };
-
- (new VisibilityChanger (view, shouldBeVisible))->post();
- }
- }
-
- void setTitle (const String& title) override
- {
- view.callVoidMethod (ComponentPeerView.setViewName, javaString (title).get());
- }
-
- void setBounds (const Rectangle<int>& userRect, bool isNowFullScreen) override
- {
- Rectangle<int> r = (userRect.toFloat() * scale).toNearestInt();
-
- if (MessageManager::getInstance()->isThisTheMessageThread())
- {
- auto* env = getEnv();
-
- fullScreen = isNowFullScreen;
-
- {
- view.callVoidMethod (AndroidView.layout,
- r.getX(), r.getY(), r.getRight(), r.getBottom());
-
- if (viewGroup != nullptr && viewGroupIsWindow)
- {
- LocalRef<jobject> windowLayoutParams (env->NewObject (AndroidWindowManagerLayoutParams, AndroidWindowManagerLayoutParams.create,
- r.getWidth(), r.getHeight(),
- r.getX(), r.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, 0x3 /* LEFT */ | 0x30 /* TOP */);
- env->CallVoidMethod (viewGroup.get(), AndroidViewManager.updateViewLayout, view.get(), windowLayoutParams.get());
- }
- }
- }
- else
- {
- class ViewMover : public CallbackMessage
- {
- public:
- ViewMover (const GlobalRef& v, const Rectangle<int>& boundsToUse) : view (v), bounds (boundsToUse) {}
-
- void messageCallback() override
- {
- view.callVoidMethod (AndroidView.layout,
- bounds.getX(), bounds.getY(), bounds.getRight(), bounds.getBottom());
- }
-
- private:
- GlobalRef view;
- Rectangle<int> bounds;
- };
-
- (new ViewMover (view, r))->post();
- }
- }
-
- Rectangle<int> getBounds() const override
- {
- Rectangle<int> r (view.callIntMethod (AndroidView.getLeft),
- view.callIntMethod (AndroidView.getTop),
- view.callIntMethod (AndroidView.getWidth),
- view.callIntMethod (AndroidView.getHeight));
-
- return r / scale;
- }
-
- 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(), 0);
- 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);
- }
-
- Point<float> globalToLocal (Point<float> screenPosition) override
- {
- return screenPosition - (getScreenPosition().toFloat() / scale);
- }
-
- void setMinimised (bool /*shouldBeMinimised*/) override
- {
- // n/a
- }
-
- bool isMinimised() const override
- {
- return false;
- }
-
- bool shouldNavBarsBeHidden (bool shouldBeFullScreen) const
- {
- if (shouldBeFullScreen)
- if (Component* kiosk = Desktop::getInstance().getKioskModeComponent())
- if (kiosk->getPeer() == this)
- return true;
-
- return false;
- }
-
- void setNavBarsHidden (bool hidden)
- {
- 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
- };
-
- view.callVoidMethod (ComponentPeerView.setSystemUiVisibilityCompat,
- hidden ? (jint) (SYSTEM_UI_FLAG_HIDE_NAVIGATION | SYSTEM_UI_FLAG_FULLSCREEN | SYSTEM_UI_FLAG_IMMERSIVE_STICKY)
- : (jint) (SYSTEM_UI_FLAG_VISIBLE));
-
- navBarsHidden = hidden;
- }
-
- void setFullScreen (bool shouldBeFullScreen) override
- {
- // updating the nav bar visibility is a bit odd on Android - need to wait for
- if (shouldNavBarsBeHidden (shouldBeFullScreen))
- {
- if (! navBarsHidden && ! isTimerRunning())
- {
- startTimer (500);
- }
- }
- else
- {
- setNavBarsHidden (false);
- }
-
- Rectangle<int> r (shouldBeFullScreen ? Desktop::getInstance().getDisplays().getMainDisplay().userArea
- : lastNonFullscreenBounds);
-
- if ((! shouldBeFullScreen) && r.isEmpty())
- r = getBounds();
-
- // (can't call the component's setBounds method because that'll reset our fullscreen flag)
- if (! r.isEmpty())
- setBounds (r, shouldBeFullScreen);
-
- component.repaint();
- }
-
- bool isFullScreen() const override
- {
- return fullScreen;
- }
-
- void timerCallback() override
- {
- setNavBarsHidden (shouldNavBarsBeHidden (fullScreen));
- setFullScreen (fullScreen);
- stopTimer();
- }
-
- 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,
- localPos.x * scale,
- localPos.y * scale));
- }
-
- BorderSize<int> getFrameSize() const override
- {
- // TODO
- return BorderSize<int>();
- }
-
- 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;
- Point<float> 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;
- Point<float> 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;
- Point<float> 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)
- {
- handleKeyPress (k, static_cast<juce_wchar> (kc));
- }
-
- void handleKeyUpCallback (int /*k*/, int /*kc*/)
- {
- }
-
- void handleBackButtonCallback()
- {
- if (auto* app = JUCEApplicationBase::getInstance())
- app->backButtonPressed();
-
- if (Component* kiosk = Desktop::getInstance().getKioskModeComponent())
- if (kiosk->getPeer() == this)
- setNavBarsHidden (navBarsHidden);
- }
-
- void handleKeyboardHiddenCallback()
- {
- Component::unfocusAllComponents();
- }
-
- void handleAppPausedCallback() {}
-
- void handleAppResumedCallback()
- {
- if (Component* kiosk = Desktop::getInstance().getKioskModeComponent())
- if (kiosk->getPeer() == this)
- setNavBarsHidden (navBarsHidden);
- }
-
- //==============================================================================
- 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 (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());
-
- // updating the nav bar visibility is a bit odd on Android - need to wait for
- if (! isTimerRunning())
- hideNavBarDelayed();
- }
-
- void hideNavBarDelayed()
- {
- startTimer (500);
- }
-
- //==============================================================================
- void handlePaintCallback (jobject canvas, jobject paint)
- {
- auto* env = getEnv();
-
- jobject rect = env->CallObjectMethod (canvas, AndroidCanvas.getClipBounds);
- const int left = env->GetIntField (rect, AndroidRect.left);
- const int top = env->GetIntField (rect, AndroidRect.top);
- const int right = env->GetIntField (rect, AndroidRect.right);
- const int bottom = env->GetIntField (rect, AndroidRect.bottom);
- env->DeleteLocalRef (rect);
-
- const Rectangle<int> clip (left, top, right - left, bottom - top);
-
- const int sizeNeeded = clip.getWidth() * clip.getHeight();
- if (sizeAllocated < sizeNeeded)
- {
- buffer.clear();
- sizeAllocated = sizeNeeded;
- buffer = GlobalRef (LocalRef<jobject> ((jobject) env->NewIntArray (sizeNeeded)));
- }
- else if (sizeNeeded == 0)
- {
- return;
- }
-
- if (jint* dest = env->GetIntArrayElements ((jintArray) buffer.get(), 0))
- {
- {
- 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
- {
- Rectangle<int> area = userArea * scale;
-
- if (MessageManager::getInstance()->isThisTheMessageThread())
- {
- view.callVoidMethod (AndroidView.invalidate, area.getX(), area.getY(), area.getRight(), area.getBottom());
- }
- else
- {
- struct ViewRepainter : public CallbackMessage
- {
- ViewRepainter (const GlobalRef& view_, const Rectangle<int>& area_)
- : view (view_), area (area_) {}
-
- void messageCallback() override
- {
- view.callVoidMethod (AndroidView.invalidate, area.getX(), area.getY(),
- area.getRight(), area.getBottom());
- }
-
- private:
- GlobalRef view;
- const Rectangle<int> area;
- };
-
- (new ViewRepainter (view, area))->post();
- }
- }
-
- 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 : 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();
-
- const_cast<Displays &> (Desktop::getInstance().getDisplays()).refresh();
- }
- }
- };
-
- private:
- //==============================================================================
- GlobalRef view, viewGroup;
- bool viewGroupIsWindow = false;
- GlobalRef buffer;
- bool fullScreen;
- bool navBarsHidden;
- int sizeAllocated;
- float scale;
-
- //==============================================================================
- #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", "(JII)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") \
-
- DECLARE_JNI_CLASS_WITH_BYTECODE (ComponentPeerView, "com/roli/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) { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleKeyDownCallback ((int) k, (int) kc); }
- 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(); }
-
- //==============================================================================
- 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;
-
- struct PreallocatedImage : public ImagePixelData
- {
- PreallocatedImage (const int width_, const 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()
- {
- if (hasAlpha)
- {
- PixelARGB* pix = (PixelARGB*) data;
-
- for (int i = width * height; --i >= 0;)
- {
- pix->unpremultiply();
- ++pix;
- }
- }
- }
-
- ImageType* createType() const override { return new SoftwareImageType(); }
- LowLevelGraphicsContext* createLowLevelContext() override { return new 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
- {
- PreallocatedImage* s = new PreallocatedImage (width, height, 0, 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)
- };
-
- 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;
- }
-
- 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() != 0)
- {
- LocalRef<jobject> display = LocalRef<jobject> (env->CallObjectMethod (windowManager, AndroidWindowManager.getDefaultDisplay));
-
- if (display.get() != 0)
- {
- 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 (const 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")
-
- 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 (ModalComponentManager::Callback* callbackToUse, int resultToUse)
- : callback (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::unique_ptr<ModalComponentManager::Callback> callback;
- int result;
- };
-
- //==============================================================================
- static void createAndroidDialog (const String& title, const String& message,
- ModalComponentManager::Callback* callback,
- const String& positiveButton = {}, const String& negativeButton = {},
- const String& neutralButton = {})
- {
- auto* env = getEnv();
-
- LocalRef<jobject> builder (env->NewObject (AndroidAlertDialogBuilder, AndroidAlertDialogBuilder.construct, getMainActivity().get()));
-
- builder = LocalRef<jobject> (env->CallObjectMethod (builder.get(), AndroidAlertDialogBuilder.setTitle, javaString (title).get()));
- builder = LocalRef<jobject> (env->CallObjectMethod (builder.get(), AndroidAlertDialogBuilder.setMessage, javaString (message).get()));
- builder = LocalRef<jobject> (env->CallObjectMethod (builder.get(), AndroidAlertDialogBuilder.setCancelable, true));
-
- builder = LocalRef<jobject> (env->CallObjectMethod (builder.get(), AndroidAlertDialogBuilder.setOnCancelListener,
- CreateJavaInterface (new DialogListener (callback, 0),
- "android/content/DialogInterface$OnCancelListener").get()));
-
- auto positiveButtonText = positiveButton.isEmpty() ? String ("OK") : positiveButton;
-
- builder = LocalRef<jobject> (env->CallObjectMethod (builder.get(), AndroidAlertDialogBuilder.setPositiveButton,
- javaString (positiveButtonText).get(),
- CreateJavaInterface (new DialogListener (callback, positiveButton.isEmpty() ? 0 : 1),
- "android/content/DialogInterface$OnClickListener").get()));
-
- if (negativeButton.isNotEmpty())
- builder = LocalRef<jobject> (env->CallObjectMethod (builder.get(), AndroidAlertDialogBuilder.setNegativeButton,
- javaString (negativeButton).get(),
- CreateJavaInterface (new DialogListener (callback, neutralButton.isEmpty() ? 0 : 2),
- "android/content/DialogInterface$OnClickListener").get()));
-
- if (neutralButton.isNotEmpty())
- builder = LocalRef<jobject> (env->CallObjectMethod (builder.get(), AndroidAlertDialogBuilder.setNegativeButton,
- javaString (neutralButton).get(),
- CreateJavaInterface (new DialogListener (callback, 0),
- "android/content/DialogInterface$OnClickListener").get()));
-
- LocalRef<jobject> dialog (env->CallObjectMethod (builder.get(), AndroidAlertDialogBuilder.create));
- env->CallVoidMethod (dialog.get(), AndroidDialog.show);
- }
-
- void JUCE_CALLTYPE NativeMessageBox::showMessageBoxAsync (AlertWindow::AlertIconType /*iconType*/,
- const String& title, const String& message,
- Component* /*associatedComponent*/,
- ModalComponentManager::Callback* callback)
- {
- createAndroidDialog (title, message, callback);
- }
-
- bool JUCE_CALLTYPE NativeMessageBox::showOkCancelBox (AlertWindow::AlertIconType /*iconType*/,
- const String& title, const String& message,
- Component* /*associatedComponent*/,
- ModalComponentManager::Callback* callback)
- {
- jassert (callback != nullptr); // on android, all alerts must be non-modal!!
-
- createAndroidDialog (title, message, callback, "OK", "Cancel");
- return false;
- }
-
- int JUCE_CALLTYPE NativeMessageBox::showYesNoCancelBox (AlertWindow::AlertIconType /*iconType*/,
- const String& title, const String& message,
- Component* /*associatedComponent*/,
- ModalComponentManager::Callback* callback)
- {
- jassert (callback != nullptr); // on android, all alerts must be non-modal!!
-
- createAndroidDialog (title, message, callback, "Yes", "No", "Cancel");
- return 0;
- }
-
- int JUCE_CALLTYPE NativeMessageBox::showYesNoBox (AlertWindow::AlertIconType /*iconType*/,
- const String& title, const String& message,
- Component* /*associatedComponent*/,
- ModalComponentManager::Callback* callback)
- {
- jassert (callback != nullptr); // on android, all alerts must be non-modal!!
-
- createAndroidDialog (title, message, callback, "Yes", "No");
- return 0;
- }
-
- //==============================================================================
- static bool androidScreenSaverEnabled = false;
-
- void Desktop::setScreenSaverEnabled (const 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 ? FLAG_KEEP_SCREEN_ON : 0, 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;
- };
-
- //==============================================================================
- class MainActivityWindowLayoutListener : public LayoutChangeListener
- {
- public:
- 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)
- {
- auto& displays = Desktop::getInstance().getDisplays();
- auto& mainDisplay = displays.getMainDisplay();
-
- Rectangle<int> userArea = newBounds / mainDisplay.scale;
-
- if (userArea != mainDisplay.userArea)
- const_cast<Displays&> (displays).refresh();
- }
- }
- };
-
- //==============================================================================
- 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 != 0)
- 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;
-
- static bool hasAddedMainActivityListener = false;
-
- if (! hasAddedMainActivityListener)
- {
- hasAddedMainActivityListener = true;
-
- env->CallVoidMethod (contentView.get(), AndroidView.addOnLayoutChangeListener,
- CreateJavaInterface (new MainActivityWindowLayoutListener,
- "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();
- }
-
- //==============================================================================
- void* CustomMouseCursorInfo::create() const { return nullptr; }
- void* MouseCursor::createStandardMouseCursor (const MouseCursor::StandardCursorType) { return nullptr; }
- void MouseCursor::deleteMouseCursor (void* const /*cursorHandle*/, const bool /*isStandard*/) {}
-
- //==============================================================================
- void MouseCursor::showInWindow (ComponentPeer*) const {}
-
- //==============================================================================
- bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray& /*files*/, const 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)));
- }
-
- //==============================================================================
- const int extendedKeyModifier = 0x10000;
-
- const int KeyPress::spaceKey = ' ';
- const int KeyPress::returnKey = 66;
- const int KeyPress::escapeKey = 4;
- const int KeyPress::backspaceKey = 67;
- const int KeyPress::leftKey = extendedKeyModifier + 1;
- const int KeyPress::rightKey = extendedKeyModifier + 2;
- const int KeyPress::upKey = extendedKeyModifier + 3;
- const int KeyPress::downKey = extendedKeyModifier + 4;
- const int KeyPress::pageUpKey = extendedKeyModifier + 5;
- const int KeyPress::pageDownKey = extendedKeyModifier + 6;
- const int KeyPress::endKey = extendedKeyModifier + 7;
- const int KeyPress::homeKey = extendedKeyModifier + 8;
- const int KeyPress::deleteKey = extendedKeyModifier + 9;
- const int KeyPress::insertKey = -1;
- const int KeyPress::tabKey = 61;
- const int KeyPress::F1Key = extendedKeyModifier + 10;
- const int KeyPress::F2Key = extendedKeyModifier + 11;
- const int KeyPress::F3Key = extendedKeyModifier + 12;
- const int KeyPress::F4Key = extendedKeyModifier + 13;
- const int KeyPress::F5Key = extendedKeyModifier + 14;
- const int KeyPress::F6Key = extendedKeyModifier + 16;
- const int KeyPress::F7Key = extendedKeyModifier + 17;
- const int KeyPress::F8Key = extendedKeyModifier + 18;
- const int KeyPress::F9Key = extendedKeyModifier + 19;
- const int KeyPress::F10Key = extendedKeyModifier + 20;
- const int KeyPress::F11Key = extendedKeyModifier + 21;
- const int KeyPress::F12Key = extendedKeyModifier + 22;
- const int KeyPress::F13Key = extendedKeyModifier + 23;
- const int KeyPress::F14Key = extendedKeyModifier + 24;
- const int KeyPress::F15Key = extendedKeyModifier + 25;
- const int KeyPress::F16Key = extendedKeyModifier + 26;
- const int KeyPress::F17Key = extendedKeyModifier + 50;
- const int KeyPress::F18Key = extendedKeyModifier + 51;
- const int KeyPress::F19Key = extendedKeyModifier + 52;
- const int KeyPress::F20Key = extendedKeyModifier + 53;
- const int KeyPress::F21Key = extendedKeyModifier + 54;
- const int KeyPress::F22Key = extendedKeyModifier + 55;
- const int KeyPress::F23Key = extendedKeyModifier + 56;
- const int KeyPress::F24Key = extendedKeyModifier + 57;
- const int KeyPress::F25Key = extendedKeyModifier + 58;
- const int KeyPress::F26Key = extendedKeyModifier + 59;
- const int KeyPress::F27Key = extendedKeyModifier + 60;
- const int KeyPress::F28Key = extendedKeyModifier + 61;
- const int KeyPress::F29Key = extendedKeyModifier + 62;
- const int KeyPress::F30Key = extendedKeyModifier + 63;
- const int KeyPress::F31Key = extendedKeyModifier + 64;
- const int KeyPress::F32Key = extendedKeyModifier + 65;
- const int KeyPress::F33Key = extendedKeyModifier + 66;
- const int KeyPress::F34Key = extendedKeyModifier + 67;
- const int KeyPress::F35Key = extendedKeyModifier + 68;
- const int KeyPress::numberPad0 = extendedKeyModifier + 27;
- const int KeyPress::numberPad1 = extendedKeyModifier + 28;
- const int KeyPress::numberPad2 = extendedKeyModifier + 29;
- const int KeyPress::numberPad3 = extendedKeyModifier + 30;
- const int KeyPress::numberPad4 = extendedKeyModifier + 31;
- const int KeyPress::numberPad5 = extendedKeyModifier + 32;
- const int KeyPress::numberPad6 = extendedKeyModifier + 33;
- const int KeyPress::numberPad7 = extendedKeyModifier + 34;
- const int KeyPress::numberPad8 = extendedKeyModifier + 35;
- const int KeyPress::numberPad9 = extendedKeyModifier + 36;
- const int KeyPress::numberPadAdd = extendedKeyModifier + 37;
- const int KeyPress::numberPadSubtract = extendedKeyModifier + 38;
- const int KeyPress::numberPadMultiply = extendedKeyModifier + 39;
- const int KeyPress::numberPadDivide = extendedKeyModifier + 40;
- const int KeyPress::numberPadSeparator = extendedKeyModifier + 41;
- const int KeyPress::numberPadDecimalPoint = extendedKeyModifier + 42;
- const int KeyPress::numberPadEquals = extendedKeyModifier + 43;
- const int KeyPress::numberPadDelete = extendedKeyModifier + 44;
- const int KeyPress::playKey = extendedKeyModifier + 45;
- const int KeyPress::stopKey = extendedKeyModifier + 46;
- const int KeyPress::fastForwardKey = extendedKeyModifier + 47;
- const int KeyPress::rewindKey = extendedKeyModifier + 48;
-
- } // namespace juce
|