Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
A
appinventor-sources
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Analytics
Analytics
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
xpstem
appinventor-sources
Commits
1843bdd6
Commit
1843bdd6
authored
Jun 25, 2020
by
Evan W. Patton
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' into ucr
Change-Id: I6e67e5d15ce2d1999e971386bf9536fa99009219
parents
33f4061f
cc56b0a8
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
166 additions
and
48 deletions
+166
-48
appinventor/appengine/src/com/google/appinventor/client/OdeMessages.java
...engine/src/com/google/appinventor/client/OdeMessages.java
+4
-0
appinventor/appengine/src/com/google/appinventor/client/TopToolbar.java
...pengine/src/com/google/appinventor/client/TopToolbar.java
+56
-21
appinventor/appengine/src/com/google/appinventor/client/editor/FileEditor.java
.../src/com/google/appinventor/client/editor/FileEditor.java
+1
-1
appinventor/appengine/src/com/google/appinventor/client/editor/youngandroid/BlocklyPanel.java
.../appinventor/client/editor/youngandroid/BlocklyPanel.java
+4
-4
appinventor/appengine/src/com/google/appinventor/client/editor/youngandroid/YaBlocksEditor.java
...ppinventor/client/editor/youngandroid/YaBlocksEditor.java
+2
-2
appinventor/blocklyeditor/src/generators/yail.js
appinventor/blocklyeditor/src/generators/yail.js
+2
-1
appinventor/blocklyeditor/src/replmgr.js
appinventor/blocklyeditor/src/replmgr.js
+27
-12
appinventor/buildserver/src/com/google/appinventor/buildserver/Compiler.java
...rver/src/com/google/appinventor/buildserver/Compiler.java
+8
-0
appinventor/components/src/com/google/appinventor/components/runtime/ReplForm.java
...c/com/google/appinventor/components/runtime/ReplForm.java
+58
-4
appinventor/components/src/com/google/appinventor/components/runtime/util/WebRTCNativeMgr.java
.../appinventor/components/runtime/util/WebRTCNativeMgr.java
+4
-3
No files found.
appinventor/appengine/src/com/google/appinventor/client/OdeMessages.java
View file @
1843bdd6
...
@@ -584,6 +584,10 @@ public interface OdeMessages extends Messages, AutogeneratedOdeMessages {
...
@@ -584,6 +584,10 @@ public interface OdeMessages extends Messages, AutogeneratedOdeMessages {
@Description
(
"Message providing details about starting the wireless connection."
)
@Description
(
"Message providing details about starting the wireless connection."
)
String
AICompanionMenuItem
();
String
AICompanionMenuItem
();
@DefaultMessage
(
"Chromebook"
)
@Description
(
"Menu item for initiating a connection to the companion running on a Chromebook."
)
String
chromebookMenuItem
();
@DefaultMessage
(
"Emulator"
)
@DefaultMessage
(
"Emulator"
)
@Description
(
"Message providing details about starting the emulator connection."
)
@Description
(
"Message providing details about starting the emulator connection."
)
String
emulatorMenuItem
();
String
emulatorMenuItem
();
...
...
appinventor/appengine/src/com/google/appinventor/client/TopToolbar.java
View file @
1843bdd6
...
@@ -83,6 +83,7 @@ public class TopToolbar extends Composite {
...
@@ -83,6 +83,7 @@ public class TopToolbar extends Composite {
private
static
final
String
WIDGET_NAME_BUILD_YAIL
=
"Yail"
;
private
static
final
String
WIDGET_NAME_BUILD_YAIL
=
"Yail"
;
private
static
final
String
WIDGET_NAME_CONNECT_TO
=
"ConnectTo"
;
private
static
final
String
WIDGET_NAME_CONNECT_TO
=
"ConnectTo"
;
private
static
final
String
WIDGET_NAME_WIRELESS_BUTTON
=
"Wireless"
;
private
static
final
String
WIDGET_NAME_WIRELESS_BUTTON
=
"Wireless"
;
private
static
final
String
WIDGET_NAME_CHROMEBOOK
=
"Chromebook"
;
private
static
final
String
WIDGET_NAME_EMULATOR_BUTTON
=
"Emulator"
;
private
static
final
String
WIDGET_NAME_EMULATOR_BUTTON
=
"Emulator"
;
private
static
final
String
WIDGET_NAME_USB_BUTTON
=
"Usb"
;
private
static
final
String
WIDGET_NAME_USB_BUTTON
=
"Usb"
;
private
static
final
String
WIDGET_NAME_RESET_BUTTON
=
"Reset"
;
private
static
final
String
WIDGET_NAME_RESET_BUTTON
=
"Reset"
;
...
@@ -116,6 +117,8 @@ public class TopToolbar extends Composite {
...
@@ -116,6 +117,8 @@ public class TopToolbar extends Composite {
private
static
final
String
WINDOW_OPEN_FEATURES
=
"menubar=yes,location=yes,resizable=yes,scrollbars=yes,status=yes"
;
private
static
final
String
WINDOW_OPEN_FEATURES
=
"menubar=yes,location=yes,resizable=yes,scrollbars=yes,status=yes"
;
private
static
final
String
WINDOW_OPEN_LOCATION
=
"_ai2"
;
private
static
final
String
WINDOW_OPEN_LOCATION
=
"_ai2"
;
private
static
final
boolean
iamChromebook
=
isChromeBook
();
private
DropDownButton
fileDropDown
;
private
DropDownButton
fileDropDown
;
private
DropDownButton
connectDropDown
;
private
DropDownButton
connectDropDown
;
private
DropDownButton
buildDropDown
;
private
DropDownButton
buildDropDown
;
...
@@ -251,18 +254,25 @@ public class TopToolbar extends Composite {
...
@@ -251,18 +254,25 @@ public class TopToolbar extends Composite {
List
<
DropDownItem
>
connectItems
=
Lists
.
newArrayList
();
List
<
DropDownItem
>
connectItems
=
Lists
.
newArrayList
();
connectItems
.
add
(
new
DropDownItem
(
WIDGET_NAME_WIRELESS_BUTTON
,
connectItems
.
add
(
new
DropDownItem
(
WIDGET_NAME_WIRELESS_BUTTON
,
MESSAGES
.
AICompanionMenuItem
(),
new
WirelessAction
()));
MESSAGES
.
AICompanionMenuItem
(),
new
WirelessAction
()));
connectItems
.
add
(
new
DropDownItem
(
WIDGET_NAME_EMULATOR_BUTTON
,
if
(
iamChromebook
)
{
MESSAGES
.
emulatorMenuItem
(),
new
EmulatorAction
()));
connectItems
.
add
(
new
DropDownItem
(
WIDGET_NAME_CHROMEBOOK
,
connectItems
.
add
(
new
DropDownItem
(
WIDGET_NAME_USB_BUTTON
,
MESSAGES
.
usbMenuItem
(),
MESSAGES
.
chromebookMenuItem
(),
new
ChromebookAction
()));
new
UsbAction
()));
}
else
{
connectItems
.
add
(
new
DropDownItem
(
WIDGET_NAME_EMULATOR_BUTTON
,
MESSAGES
.
emulatorMenuItem
(),
new
EmulatorAction
()));
connectItems
.
add
(
new
DropDownItem
(
WIDGET_NAME_USB_BUTTON
,
MESSAGES
.
usbMenuItem
(),
new
UsbAction
()));
}
connectItems
.
add
(
null
);
connectItems
.
add
(
null
);
connectItems
.
add
(
new
DropDownItem
(
WIDGET_NAME_REFRESHCOMPANION_BUTTON
,
MESSAGES
.
refreshCompanionMenuItem
(),
connectItems
.
add
(
new
DropDownItem
(
WIDGET_NAME_REFRESHCOMPANION_BUTTON
,
MESSAGES
.
refreshCompanionMenuItem
(),
new
RefreshCompanionAction
()));
new
RefreshCompanionAction
()));
connectItems
.
add
(
null
);
connectItems
.
add
(
null
);
connectItems
.
add
(
new
DropDownItem
(
WIDGET_NAME_RESET_BUTTON
,
MESSAGES
.
resetConnectionsMenuItem
(),
connectItems
.
add
(
new
DropDownItem
(
WIDGET_NAME_RESET_BUTTON
,
MESSAGES
.
resetConnectionsMenuItem
(),
new
ResetAction
()));
new
ResetAction
()));
connectItems
.
add
(
new
DropDownItem
(
WIDGET_NAME_HARDRESET_BUTTON
,
MESSAGES
.
hardResetConnectionsMenuItem
(),
if
(!
iamChromebook
)
{
new
HardResetAction
()));
connectItems
.
add
(
new
DropDownItem
(
WIDGET_NAME_HARDRESET_BUTTON
,
MESSAGES
.
hardResetConnectionsMenuItem
(),
new
HardResetAction
()));
}
refreshMenu
(
connectDropDown
,
connectItems
);
refreshMenu
(
connectDropDown
,
connectItems
);
}
}
...
@@ -448,8 +458,17 @@ public class TopToolbar extends Composite {
...
@@ -448,8 +458,17 @@ public class TopToolbar extends Composite {
@Override
@Override
public
void
execute
()
{
public
void
execute
()
{
if
(
Ode
.
getInstance
().
okToConnect
())
{
if
(
Ode
.
getInstance
().
okToConnect
())
{
startRepl
(
true
,
false
,
false
);
// false means we are
startRepl
(
true
,
false
,
false
,
false
);
// false means we are
// *not* the emulator
// *not* the emulator
}
}
}
private
class
ChromebookAction
implements
Command
{
@Override
public
void
execute
()
{
if
(
Ode
.
getInstance
().
okToConnect
())
{
startRepl
(
true
,
true
,
false
,
false
);
}
}
}
}
}
}
...
@@ -458,8 +477,8 @@ public class TopToolbar extends Composite {
...
@@ -458,8 +477,8 @@ public class TopToolbar extends Composite {
@Override
@Override
public
void
execute
()
{
public
void
execute
()
{
if
(
Ode
.
getInstance
().
okToConnect
())
{
if
(
Ode
.
getInstance
().
okToConnect
())
{
startRepl
(
true
,
true
,
false
);
// true means we are the
startRepl
(
true
,
false
,
true
,
false
);
// true means we are the
// emulator
// emulator
}
}
}
}
}
}
...
@@ -468,7 +487,7 @@ public class TopToolbar extends Composite {
...
@@ -468,7 +487,7 @@ public class TopToolbar extends Composite {
@Override
@Override
public
void
execute
()
{
public
void
execute
()
{
if
(
Ode
.
getInstance
().
okToConnect
())
{
if
(
Ode
.
getInstance
().
okToConnect
())
{
startRepl
(
true
,
false
,
true
);
startRepl
(
true
,
false
,
false
,
true
);
}
}
}
}
}
}
...
@@ -477,7 +496,7 @@ public class TopToolbar extends Composite {
...
@@ -477,7 +496,7 @@ public class TopToolbar extends Composite {
@Override
@Override
public
void
execute
()
{
public
void
execute
()
{
if
(
Ode
.
getInstance
().
okToConnect
())
{
if
(
Ode
.
getInstance
().
okToConnect
())
{
startRepl
(
false
,
false
,
false
);
// We are really stopping the repl here
startRepl
(
false
,
false
,
false
,
false
);
// We are really stopping the repl here
}
}
}
}
}
}
...
@@ -972,13 +991,21 @@ public class TopToolbar extends Composite {
...
@@ -972,13 +991,21 @@ public class TopToolbar extends Composite {
private
void
updateConnectToDropDownButton
(
boolean
isEmulatorRunning
,
boolean
isCompanionRunning
,
boolean
isUsbRunning
){
private
void
updateConnectToDropDownButton
(
boolean
isEmulatorRunning
,
boolean
isCompanionRunning
,
boolean
isUsbRunning
){
if
(!
isEmulatorRunning
&&
!
isCompanionRunning
&&
!
isUsbRunning
)
{
if
(!
isEmulatorRunning
&&
!
isCompanionRunning
&&
!
isUsbRunning
)
{
connectDropDown
.
setItemEnabled
(
MESSAGES
.
AICompanionMenuItem
(),
true
);
connectDropDown
.
setItemEnabled
(
MESSAGES
.
AICompanionMenuItem
(),
true
);
connectDropDown
.
setItemEnabled
(
MESSAGES
.
emulatorMenuItem
(),
true
);
if
(
iamChromebook
)
{
connectDropDown
.
setItemEnabled
(
MESSAGES
.
usbMenuItem
(),
true
);
connectDropDown
.
setItemEnabled
(
MESSAGES
.
chromebookMenuItem
(),
true
);
}
else
{
connectDropDown
.
setItemEnabled
(
MESSAGES
.
emulatorMenuItem
(),
true
);
connectDropDown
.
setItemEnabled
(
MESSAGES
.
usbMenuItem
(),
true
);
}
connectDropDown
.
setItemEnabled
(
MESSAGES
.
refreshCompanionMenuItem
(),
false
);
connectDropDown
.
setItemEnabled
(
MESSAGES
.
refreshCompanionMenuItem
(),
false
);
}
else
{
}
else
{
connectDropDown
.
setItemEnabled
(
MESSAGES
.
AICompanionMenuItem
(),
false
);
connectDropDown
.
setItemEnabled
(
MESSAGES
.
AICompanionMenuItem
(),
false
);
connectDropDown
.
setItemEnabled
(
MESSAGES
.
emulatorMenuItem
(),
false
);
if
(
iamChromebook
)
{
connectDropDown
.
setItemEnabled
(
MESSAGES
.
usbMenuItem
(),
false
);
connectDropDown
.
setItemEnabled
(
MESSAGES
.
chromebookMenuItem
(),
false
);
}
else
{
connectDropDown
.
setItemEnabled
(
MESSAGES
.
emulatorMenuItem
(),
false
);
connectDropDown
.
setItemEnabled
(
MESSAGES
.
usbMenuItem
(),
false
);
}
connectDropDown
.
setItemEnabled
(
MESSAGES
.
refreshCompanionMenuItem
(),
true
);
connectDropDown
.
setItemEnabled
(
MESSAGES
.
refreshCompanionMenuItem
(),
true
);
}
}
}
}
...
@@ -994,16 +1021,16 @@ public class TopToolbar extends Composite {
...
@@ -994,16 +1021,16 @@ public class TopToolbar extends Composite {
/**
/**
* startRepl -- Start/Stop the connection to the companion.
* startRepl -- Start/Stop the connection to the companion.
* If both forEmulator and forUsb are false, then we are connecting
* via Wireless.
*
*
* @param start -- true to start the repl, false to stop it.
* @param start -- true to start the repl, false to stop it.
* @param forChromebook -- true if we are connecting to a chromebook.
* @param forEmulator -- true if we are connecting to the emulator.
* @param forEmulator -- true if we are connecting to the emulator.
* @param forUsb -- true if this is a USB connection.
* @param forUsb -- true if this is a USB connection.
*
* If both forEmulator and forUsb are false, then we are connecting
* via Wireless.
*/
*/
private
void
startRepl
(
boolean
start
,
boolean
forEmulator
,
boolean
forUsb
)
{
private
void
startRepl
(
boolean
start
,
boolean
for
Chromebook
,
boolean
for
Emulator
,
boolean
forUsb
)
{
DesignToolbar
.
DesignProject
currentProject
=
Ode
.
getInstance
().
getDesignToolbar
().
getCurrentProject
();
DesignToolbar
.
DesignProject
currentProject
=
Ode
.
getInstance
().
getDesignToolbar
().
getCurrentProject
();
if
(
currentProject
==
null
)
{
if
(
currentProject
==
null
)
{
OdeLog
.
wlog
(
"DesignToolbar.currentProject is null. "
OdeLog
.
wlog
(
"DesignToolbar.currentProject is null. "
...
@@ -1011,7 +1038,7 @@ public class TopToolbar extends Composite {
...
@@ -1011,7 +1038,7 @@ public class TopToolbar extends Composite {
return
;
return
;
}
}
DesignToolbar
.
Screen
screen
=
currentProject
.
screens
.
get
(
currentProject
.
currentScreen
);
DesignToolbar
.
Screen
screen
=
currentProject
.
screens
.
get
(
currentProject
.
currentScreen
);
screen
.
blocksEditor
.
startRepl
(!
start
,
forEmulator
,
forUsb
);
screen
.
blocksEditor
.
startRepl
(!
start
,
for
Chromebook
,
for
Emulator
,
forUsb
);
if
(
start
)
{
if
(
start
)
{
if
(
forEmulator
)
{
// We are starting the emulator...
if
(
forEmulator
)
{
// We are starting the emulator...
updateConnectToDropDownButton
(
true
,
false
,
false
);
updateConnectToDropDownButton
(
true
,
false
,
false
);
...
@@ -1170,4 +1197,12 @@ public class TopToolbar extends Composite {
...
@@ -1170,4 +1197,12 @@ public class TopToolbar extends Composite {
}
}
}
}
private
static
native
boolean
isChromeBook
()
/*-{
if (/\bCrOS\b/.test(navigator.userAgent)) {
return true;
} else {
return false;
}
}-*/
;
}
}
appinventor/appengine/src/com/google/appinventor/client/editor/FileEditor.java
View file @
1843bdd6
...
@@ -144,7 +144,7 @@ public abstract class FileEditor extends Composite {
...
@@ -144,7 +144,7 @@ public abstract class FileEditor extends Composite {
* but the YaBlocksEditor overrides this version with one that start the
* but the YaBlocksEditor overrides this version with one that start the
* Repl going.
* Repl going.
*/
*/
public
void
startRepl
(
boolean
alreadyRunning
,
boolean
forEmulator
,
boolean
forUsb
)
{
public
void
startRepl
(
boolean
alreadyRunning
,
boolean
for
Chromebook
,
boolean
for
Emulator
,
boolean
forUsb
)
{
}
}
/**
/**
...
...
appinventor/appengine/src/com/google/appinventor/client/editor/youngandroid/BlocklyPanel.java
View file @
1843bdd6
...
@@ -280,9 +280,9 @@ public class BlocklyPanel extends HTMLPanel {
...
@@ -280,9 +280,9 @@ public class BlocklyPanel extends HTMLPanel {
}
}
}
}
public
void
startRepl
(
boolean
alreadyRunning
,
boolean
forEmulator
,
boolean
forUsb
)
{
// Start the Repl
public
void
startRepl
(
boolean
alreadyRunning
,
boolean
for
Chromebook
,
boolean
for
Emulator
,
boolean
forUsb
)
{
// Start the Repl
makeActive
();
makeActive
();
doStartRepl
(
alreadyRunning
,
forEmulator
,
forUsb
);
doStartRepl
(
alreadyRunning
,
for
Chromebook
,
for
Emulator
,
forUsb
);
}
}
public
void
hardReset
()
{
public
void
hardReset
()
{
...
@@ -834,8 +834,8 @@ public class BlocklyPanel extends HTMLPanel {
...
@@ -834,8 +834,8 @@ public class BlocklyPanel extends HTMLPanel {
}
}
}-*/
;
}-*/
;
public
native
void
doStartRepl
(
boolean
alreadyRunning
,
boolean
forEmulator
,
boolean
forUsb
)
/*-{
public
native
void
doStartRepl
(
boolean
alreadyRunning
,
boolean
for
Chromebook
,
boolean
for
Emulator
,
boolean
forUsb
)
/*-{
Blockly.ReplMgr.startRepl(alreadyRunning, forEmulator, forUsb);
Blockly.ReplMgr.startRepl(alreadyRunning, for
Chromebook, for
Emulator, forUsb);
}-*/
;
}-*/
;
public
native
void
doHardReset
()
/*-{
public
native
void
doHardReset
()
/*-{
...
...
appinventor/appengine/src/com/google/appinventor/client/editor/youngandroid/YaBlocksEditor.java
View file @
1843bdd6
...
@@ -637,8 +637,8 @@ public final class YaBlocksEditor extends FileEditor
...
@@ -637,8 +637,8 @@ public final class YaBlocksEditor extends FileEditor
* Start up the Repl (call into the Blockly.ReplMgr via the BlocklyPanel.
* Start up the Repl (call into the Blockly.ReplMgr via the BlocklyPanel.
*/
*/
@Override
@Override
public
void
startRepl
(
boolean
alreadyRunning
,
boolean
forEmulator
,
boolean
forUsb
)
{
public
void
startRepl
(
boolean
alreadyRunning
,
boolean
for
Chromebook
,
boolean
for
Emulator
,
boolean
forUsb
)
{
blocksArea
.
startRepl
(
alreadyRunning
,
forEmulator
,
forUsb
);
blocksArea
.
startRepl
(
alreadyRunning
,
for
Chromebook
,
for
Emulator
,
forUsb
);
}
}
/*
/*
...
...
appinventor/blocklyeditor/src/generators/yail.js
View file @
1843bdd6
...
@@ -390,7 +390,8 @@ Blockly.Yail.getPropertySettersLines = function(componentJson, componentName, co
...
@@ -390,7 +390,8 @@ Blockly.Yail.getPropertySettersLines = function(componentJson, componentName, co
var
code
=
[];
var
code
=
[];
var
type
=
componentDb
.
getType
(
componentJson
[
'
$Type
'
]);
var
type
=
componentDb
.
getType
(
componentJson
[
'
$Type
'
]);
function
shouldSendProperty
(
prop
,
info
)
{
function
shouldSendProperty
(
prop
,
info
)
{
return
(
prop
.
charAt
(
0
)
!==
'
$
'
&&
prop
!==
'
Uuid
'
&&
prop
!==
'
TutorialURL
'
)
||
return
(
prop
.
charAt
(
0
)
!==
'
$
'
&&
prop
!==
'
Uuid
'
&&
prop
!==
'
TutorialURL
'
&&
prop
!==
'
BlocksToolkit
'
)
||
(
info
&&
info
[
'
alwaysSend
'
]);
(
info
&&
info
[
'
alwaysSend
'
]);
}
}
// Gather all of the properties together
// Gather all of the properties together
...
...
appinventor/blocklyeditor/src/replmgr.js
View file @
1843bdd6
...
@@ -485,7 +485,9 @@ Blockly.ReplMgr.putYail = (function() {
...
@@ -485,7 +485,9 @@ Blockly.ReplMgr.putYail = (function() {
// Ready to actually exchange data
// Ready to actually exchange data
webrtcrunning
=
true
;
webrtcrunning
=
true
;
top
.
webrtcdata
=
webrtcdata
;
// For debugging
top
.
webrtcdata
=
webrtcdata
;
// For debugging
rs
.
dialog
.
hide
();
// Take down QR Code dialog
if
(
rs
.
dialog
)
{
rs
.
dialog
.
hide
();
// Take down QR Code dialog
}
RefreshAssets
(
function
()
{
RefreshAssets
(
function
()
{
Blockly
.
ReplMgr
.
loadExtensions
();
Blockly
.
ReplMgr
.
loadExtensions
();
});
});
...
@@ -1348,7 +1350,7 @@ Blockly.ReplMgr.quoteUnicode = function(input) {
...
@@ -1348,7 +1350,7 @@ Blockly.ReplMgr.quoteUnicode = function(input) {
return
sb
.
join
(
""
);
return
sb
.
join
(
""
);
};
};
Blockly
.
ReplMgr
.
startRepl
=
function
(
already
,
emulator
,
usb
)
{
Blockly
.
ReplMgr
.
startRepl
=
function
(
already
,
chromebook
,
emulator
,
usb
)
{
var
rs
=
top
.
ReplState
;
var
rs
=
top
.
ReplState
;
var
me
=
this
;
var
me
=
this
;
rs
.
didversioncheck
=
false
;
// Re-check
rs
.
didversioncheck
=
false
;
// Re-check
...
@@ -1376,20 +1378,29 @@ Blockly.ReplMgr.startRepl = function(already, emulator, usb) {
...
@@ -1376,20 +1378,29 @@ Blockly.ReplMgr.startRepl = function(already, emulator, usb) {
rs
=
top
.
ReplState
;
rs
=
top
.
ReplState
;
rs
.
state
=
this
.
rsState
.
RENDEZVOUS
;
// We are now rendezvousing
rs
.
state
=
this
.
rsState
.
RENDEZVOUS
;
// We are now rendezvousing
rs
.
replcode
=
this
.
genCode
();
rs
.
replcode
=
this
.
genCode
();
if
(
chromebook
)
{
window
.
open
(
"
intent://comp/
"
+
rs
.
replcode
+
"
#Intent;scheme=aicompanion;package=
"
+
top
.
ACCEPTABLE_COMPANION_PACKAGE
+
"
;end
"
);
}
rs
.
rendezvouscode
=
this
.
sha1
(
rs
.
replcode
);
rs
.
rendezvouscode
=
this
.
sha1
(
rs
.
replcode
);
rs
.
seq_count
=
1
;
// used for the creating the hmac mac
rs
.
seq_count
=
1
;
// used for the creating the hmac mac
rs
.
count
=
0
;
rs
.
count
=
0
;
rs
.
dialog
=
new
Blockly
.
Util
.
Dialog
(
Blockly
.
Msg
.
REPL_CONNECT_TO_COMPANION
,
this
.
makeDialogMessage
(
rs
.
replcode
),
Blockly
.
Msg
.
REPL_CANCEL
,
false
,
null
,
1
,
function
()
{
if
(
!
chromebook
)
{
rs
.
dialog
.
hide
();
rs
.
dialog
=
new
Blockly
.
Util
.
Dialog
(
Blockly
.
Msg
.
REPL_CONNECT_TO_COMPANION
,
this
.
makeDialogMessage
(
rs
.
replcode
),
Blockly
.
Msg
.
REPL_CANCEL
,
false
,
null
,
1
,
function
()
{
rs
.
state
=
Blockly
.
ReplMgr
.
rsState
.
IDLE
;
// We're punting
rs
.
dialog
.
hide
();
rs
.
connection
=
null
;
rs
.
state
=
Blockly
.
ReplMgr
.
rsState
.
IDLE
;
// We're punting
me
.
putYail
.
reset
(
true
);
// Shutdown any polling
rs
.
connection
=
null
;
top
.
BlocklyPanel_indicateDisconnect
();
me
.
putYail
.
reset
(
true
);
// Shutdown any polling
});
top
.
BlocklyPanel_indicateDisconnect
();
});
}
this
.
getFromRendezvous
();
this
.
getFromRendezvous
();
}
else
{
}
else
{
if
(
top
.
ReplState
.
state
==
this
.
rsState
.
RENDEZVOUS
)
{
if
(
top
.
ReplState
.
state
==
this
.
rsState
.
RENDEZVOUS
)
{
top
.
ReplState
.
dialog
.
hide
();
if
(
top
.
ReplState
.
dialog
)
{
// It might not be showing if we are on a Chromebook
top
.
ReplState
.
dialog
.
hide
();
}
}
}
try
{
try
{
top
.
webrtcdata
.
send
(
"
#DONE#
"
);
// This should kill the companion
top
.
webrtcdata
.
send
(
"
#DONE#
"
);
// This should kill the companion
...
@@ -1434,7 +1445,9 @@ Blockly.ReplMgr.getFromRendezvous = function() {
...
@@ -1434,7 +1445,9 @@ Blockly.ReplMgr.getFromRendezvous = function() {
setTimeout
(
poller
,
2000
);
setTimeout
(
poller
,
2000
);
return
;
return
;
}
}
rs
.
dialog
.
hide
();
// Take down the QRCode dialog
if
(
rs
.
dialog
)
{
// Dialog won't be present when we connect via chromebook
rs
.
dialog
.
hide
();
// Take down the QRCode dialog
}
// Keep the user informed about the connection
// Keep the user informed about the connection
top
.
ConnectProgressBar_start
();
top
.
ConnectProgressBar_start
();
top
.
ConnectProgressBar_setProgress
(
10
,
Blockly
.
Msg
.
DIALOG_FOUND_COMPANION
);
top
.
ConnectProgressBar_setProgress
(
10
,
Blockly
.
Msg
.
DIALOG_FOUND_COMPANION
);
...
@@ -1601,7 +1614,9 @@ Blockly.ReplMgr.rendPoll = function() {
...
@@ -1601,7 +1614,9 @@ Blockly.ReplMgr.rendPoll = function() {
top
.
ReplState
.
count
=
top
.
ReplState
.
count
+
1
;
top
.
ReplState
.
count
=
top
.
ReplState
.
count
+
1
;
if
(
top
.
ReplState
.
count
>
40
)
{
if
(
top
.
ReplState
.
count
>
40
)
{
top
.
ReplState
.
state
=
this
.
rsState
.
IDLE
;
top
.
ReplState
.
state
=
this
.
rsState
.
IDLE
;
top
.
ReplState
.
dialog
.
hide
();
// Punt the dialog
if
(
top
.
ReplState
.
dialog
)
{
top
.
ReplState
.
dialog
.
hide
();
// Punt the dialog
}
dialog
=
new
Blockly
.
Util
.
Dialog
(
Blockly
.
Msg
.
REPL_CONNECTION_FAILURE1
,
Blockly
.
Msg
.
REPL_TRY_AGAIN1
,
Blockly
.
Msg
.
REPL_OK
,
false
,
null
,
0
,
function
()
{
dialog
=
new
Blockly
.
Util
.
Dialog
(
Blockly
.
Msg
.
REPL_CONNECTION_FAILURE1
,
Blockly
.
Msg
.
REPL_TRY_AGAIN1
,
Blockly
.
Msg
.
REPL_OK
,
false
,
null
,
0
,
function
()
{
dialog
.
hide
();
dialog
.
hide
();
});
});
...
...
appinventor/buildserver/src/com/google/appinventor/buildserver/Compiler.java
View file @
1843bdd6
...
@@ -1067,6 +1067,14 @@ public final class Compiler {
...
@@ -1067,6 +1067,14 @@ public final class Compiler {
out
.
write
(
" <category android:name=\"android.intent.category.LAUNCHER\" />\n"
);
out
.
write
(
" <category android:name=\"android.intent.category.LAUNCHER\" />\n"
);
}
}
out
.
write
(
" </intent-filter>\n"
);
out
.
write
(
" </intent-filter>\n"
);
if
(
isForCompanion
)
{
out
.
write
(
"<intent-filter>\n"
);
out
.
write
(
"<action android:name=\"android.intent.action.VIEW\" />\n"
);
out
.
write
(
"<category android:name=\"android.intent.category.DEFAULT\" />\n"
);
out
.
write
(
"<category android:name=\"android.intent.category.BROWSABLE\" />\n"
);
out
.
write
(
"<data android:scheme=\"aicompanion\" android:host=\"comp\" />\n"
);
out
.
write
(
"</intent-filter>\n"
);
}
if
(
simpleCompTypes
.
contains
(
"com.google.appinventor.components.runtime.NearField"
)
&&
if
(
simpleCompTypes
.
contains
(
"com.google.appinventor.components.runtime.NearField"
)
&&
!
isForCompanion
&&
isMain
)
{
!
isForCompanion
&&
isMain
)
{
...
...
appinventor/components/src/com/google/appinventor/components/runtime/ReplForm.java
View file @
1843bdd6
...
@@ -29,6 +29,7 @@ import com.google.appinventor.components.common.ComponentConstants;
...
@@ -29,6 +29,7 @@ import com.google.appinventor.components.common.ComponentConstants;
import
com.google.appinventor.components.runtime.util.AppInvHTTPD
;
import
com.google.appinventor.components.runtime.util.AppInvHTTPD
;
import
com.google.appinventor.components.runtime.util.ErrorMessages
;
import
com.google.appinventor.components.runtime.util.ErrorMessages
;
import
com.google.appinventor.components.runtime.util.OnInitializeListener
;
import
com.google.appinventor.components.runtime.util.RetValManager
;
import
com.google.appinventor.components.runtime.util.RetValManager
;
import
com.google.appinventor.components.runtime.util.WebRTCNativeMgr
;
import
com.google.appinventor.components.runtime.util.WebRTCNativeMgr
;
...
@@ -124,13 +125,14 @@ public class ReplForm extends Form {
...
@@ -124,13 +125,14 @@ public class ReplForm extends Form {
Log
.
d
(
LOG_TAG
,
"onCreate"
);
Log
.
d
(
LOG_TAG
,
"onCreate"
);
loadedExternalDexs
=
new
ArrayList
<
String
>();
loadedExternalDexs
=
new
ArrayList
<
String
>();
Intent
intent
=
getIntent
();
Intent
intent
=
getIntent
();
processExtras
(
intent
,
false
);
processExtras
AndData
(
intent
,
false
);
themeHelper
.
setActionBarAnimation
(
false
);
themeHelper
.
setActionBarAnimation
(
false
);
}
}
@Override
@Override
void
onCreateFinish
()
{
void
onCreateFinish
()
{
super
.
onCreateFinish
();
super
.
onCreateFinish
();
Log
.
d
(
LOG_TAG
,
"onCreateFinish() Called in Repl"
);
if
(!
isEmulator
()
&&
AppInventorFeatures
.
doCompanionSplashScreen
())
if
(!
isEmulator
()
&&
AppInventorFeatures
.
doCompanionSplashScreen
())
{
// Only show REPL splash if not in emulator and enabled
{
// Only show REPL splash if not in emulator and enabled
...
@@ -138,6 +140,53 @@ public class ReplForm extends Form {
...
@@ -138,6 +140,53 @@ public class ReplForm extends Form {
webviewIntent
.
setClassName
(
activeForm
.
$context
(),
SPLASH_ACTIVITY_CLASS
);
webviewIntent
.
setClassName
(
activeForm
.
$context
(),
SPLASH_ACTIVITY_CLASS
);
activeForm
.
$context
().
startActivity
(
webviewIntent
);
activeForm
.
$context
().
startActivity
(
webviewIntent
);
}
}
Intent
intent
=
getIntent
();
Log
.
d
(
LOG_TAG
,
"Intent = "
+
intent
);
final
String
data
=
intent
.
getDataString
();
if
(
data
!=
null
)
{
Log
.
d
(
LOG_TAG
,
"Got data = "
+
data
);
}
else
{
Log
.
d
(
LOG_TAG
,
"Did not receive any data"
);
}
/////////////////////////////////////////////////////////////////////////
// Chromebook Support: //
// //
// The code below parses the data provided in the intent to get the //
// code to use to talk to the rendezvous server. It appears to need to //
// run on the UI thread (I'm not sure what thread we are on here in //
// onCreateFinish(). I'm not sure why we need the delay, but it //
// doesn't work if we do not include the delay. I'm continuing to look //
// into why that is and the delay may be removed in a future //
// revision. (jis). //
// //
// Also: the rendezvous server location is hardcoded in this version. //
// a future version will let you customize the location of the //
// rendezvous server. //
/////////////////////////////////////////////////////////////////////////
if
(
data
!=
null
&&
(
data
.
startsWith
(
"aicompanion"
)))
{
registerForOnInitialize
(
new
OnInitializeListener
()
{
@Override
public
void
onInitialize
()
{
String
code
=
data
.
substring
(
data
.
indexOf
(
"//comp/"
)
+
7
);
PhoneStatus
status
=
new
PhoneStatus
(
ReplForm
.
this
);
status
.
WebRTC
(
true
);
code
=
status
.
setHmacSeedReturnCode
(
code
,
"rendezvous.appinventor.mit.edu"
);
String
ipAddress
=
PhoneStatus
.
GetWifiIpAddress
();
int
api
=
status
.
SdkLevel
();
String
version
=
status
.
GetVersionName
();
String
aid
=
status
.
InstallationId
();
Log
.
d
(
LOG_TAG
,
"InstallationId = "
+
aid
);
Web
web
=
new
Web
(
ReplForm
.
this
);
web
.
Url
(
"http://rendezvous.appinventor.mit.edu/rendezvous/"
);
web
.
PostText
(
"ipaddr="
+
ipAddress
+
"&port=9987&webrtc=true"
+
"&version="
+
version
+
"&api="
+
api
+
"&aid="
+
aid
+
"&installer="
+
status
.
GetInstaller
()
+
"&r2=true&key="
+
code
);
status
.
startWebRTC
(
"rendezvous.appinventor.mit.edu"
,
"OK"
);
}
});
}
}
}
@Override
@Override
...
@@ -243,7 +292,7 @@ public class ReplForm extends Form {
...
@@ -243,7 +292,7 @@ public class ReplForm extends Form {
protected
void
onNewIntent
(
Intent
intent
)
{
protected
void
onNewIntent
(
Intent
intent
)
{
super
.
onNewIntent
(
intent
);
super
.
onNewIntent
(
intent
);
Log
.
d
(
LOG_TAG
,
"onNewIntent Called"
);
Log
.
d
(
LOG_TAG
,
"onNewIntent Called"
);
processExtras
(
intent
,
true
);
processExtras
AndData
(
intent
,
true
);
}
}
void
HandleReturnValues
()
{
void
HandleReturnValues
()
{
...
@@ -255,7 +304,7 @@ public class ReplForm extends Form {
...
@@ -255,7 +304,7 @@ public class ReplForm extends Form {
}
}
}
}
pr
otected
void
processExtras
(
Intent
intent
,
boolean
restart
)
{
pr
ivate
void
processExtrasAndData
(
Intent
intent
,
boolean
restart
)
{
Bundle
extras
=
intent
.
getExtras
();
Bundle
extras
=
intent
.
getExtras
();
if
(
extras
!=
null
)
{
if
(
extras
!=
null
)
{
Log
.
d
(
LOG_TAG
,
"extras: "
+
extras
);
Log
.
d
(
LOG_TAG
,
"extras: "
+
extras
);
...
@@ -264,8 +313,13 @@ public class ReplForm extends Form {
...
@@ -264,8 +313,13 @@ public class ReplForm extends Form {
Log
.
d
(
LOG_TAG
,
"Extra Key: "
+
keys
.
next
());
Log
.
d
(
LOG_TAG
,
"Extra Key: "
+
keys
.
next
());
}
}
}
}
String
data
=
intent
.
getDataString
();
if
(
data
!=
null
&&
(
data
.
startsWith
(
"aicompanion"
)))
{
isDirect
=
true
;
assetsLoaded
=
true
;
}
if
((
extras
!=
null
)
&&
extras
.
getBoolean
(
"rundirect"
))
{
if
((
extras
!=
null
)
&&
extras
.
getBoolean
(
"rundirect"
))
{
Log
.
d
(
LOG_TAG
,
"processExtras rundirect is true and restart is "
+
restart
);
Log
.
d
(
LOG_TAG
,
"processExtras
AndData
rundirect is true and restart is "
+
restart
);
isDirect
=
true
;
isDirect
=
true
;
assetsLoaded
=
true
;
assetsLoaded
=
true
;
if
(
restart
)
{
if
(
restart
)
{
...
...
appinventor/components/src/com/google/appinventor/components/runtime/util/WebRTCNativeMgr.java
View file @
1843bdd6
...
@@ -239,9 +239,10 @@ public class WebRTCNativeMgr {
...
@@ -239,9 +239,10 @@ public class WebRTCNativeMgr {
/* Provide a default when the rendezvous server doesn't provide one */
/* Provide a default when the rendezvous server doesn't provide one */
rendezvousResult
=
"{\"rendezvous2\" : \""
+
YaVersion
.
RENDEZVOUS_SERVER
+
"\","
+
rendezvousResult
=
"{\"rendezvous2\" : \""
+
YaVersion
.
RENDEZVOUS_SERVER
+
"\","
+
"\"iceservers\" : "
+
"\"iceservers\" : "
+
"[{ \"server\" : \"turn:turn.appinventor.mit.edu:3478\","
+
"[{ \"server\" : \"stun:stun.l.google.com:19302\" },"
+
"\"username\" : \"oh\","
+
"{ \"server\" : \"turn:turn.appinventor.mit.edu:3478\","
+
"\"password\" : \"boy\"}]}"
;
"\"username\" : \"oh\","
+
"\"password\" : \"boy\"}]}"
;
}
}
try
{
try
{
JSONObject
resultJson
=
new
JSONObject
(
rendezvousResult
);
JSONObject
resultJson
=
new
JSONObject
(
rendezvousResult
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment