From 62af45b653885ec0e051126d81e6752c52c95dcf Mon Sep 17 00:00:00 2001 From: FTCTechNH Date: Thu, 3 Aug 2017 08:15:56 -0400 Subject: [PATCH] removed files no longer needed with v3.2 project folder --- .../FtcRobotControllerWatchdogService.java | 128 ------------- .../internal/RunOnStartup.java | 180 ------------------ .../src/main/res/layout/header.xml | 69 ------- .../src/main/res/values-v11/styles.xml | 44 ----- .../src/main/res/values-v14/styles.xml | 45 ----- .../src/main/res/values/colors.xml | 46 ----- .../src/main/res/xml/preferences.xml | 82 -------- libs/ModernRobotics-release.aar | Bin 9935 -> 0 bytes 8 files changed, 594 deletions(-) delete mode 100644 FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/internal/FtcRobotControllerWatchdogService.java delete mode 100644 FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/internal/RunOnStartup.java delete mode 100644 FtcRobotController/src/main/res/layout/header.xml delete mode 100644 FtcRobotController/src/main/res/values-v11/styles.xml delete mode 100644 FtcRobotController/src/main/res/values-v14/styles.xml delete mode 100644 FtcRobotController/src/main/res/values/colors.xml delete mode 100644 FtcRobotController/src/main/res/xml/preferences.xml delete mode 100644 libs/ModernRobotics-release.aar diff --git a/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/internal/FtcRobotControllerWatchdogService.java b/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/internal/FtcRobotControllerWatchdogService.java deleted file mode 100644 index 2a104699d98..00000000000 --- a/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/internal/FtcRobotControllerWatchdogService.java +++ /dev/null @@ -1,128 +0,0 @@ -/* -Copyright (c) 2016 Robert Atkinson - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted (subject to the limitations in the disclaimer below) provided that -the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. - -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -Neither the name of Robert Atkinson nor the names of his contributors may be used to -endorse or promote products derived from this software without specific prior -written permission. - -NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS -LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESSFOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR -TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/package org.firstinspires.ftc.robotcontroller.internal; - -import android.app.Service; -import android.content.Context; -import android.content.Intent; -import android.os.IBinder; -import android.support.annotation.Nullable; - -import com.qualcomm.robotcore.hardware.configuration.LynxConstants; -import com.qualcomm.robotcore.util.RobotLog; - -/** - * {@link FtcRobotControllerWatchdogService} is a simple sticky service that we use to detect - * a crash of the robot controller process and auto-restart the robot controller activity when - * that happens. - */ -@SuppressWarnings("WeakerAccess") -public class FtcRobotControllerWatchdogService extends Service - { - //---------------------------------------------------------------------------------------------- - // State - //---------------------------------------------------------------------------------------------- - - public static final String TAG = "FtcRobotControllerWatchdogService"; - - //---------------------------------------------------------------------------------------------- - // Construction - //---------------------------------------------------------------------------------------------- - - @Nullable @Override public IBinder onBind(Intent intent) - { - return null; // we're not this kind of service: we're a 'startable' not a 'bindable' one - } - - //---------------------------------------------------------------------------------------------- - // Life Cycle - //---------------------------------------------------------------------------------------------- - - @Override public void onCreate() - { - super.onCreate(); - RobotLog.vv(TAG, "onCreate()"); - } - - /** On restart after crash, intent is always null; when the RC activity starts us, it's never null */ - @Override public int onStartCommand(Intent intent, int flags, int startId) - { - RobotLog.vv(TAG, "onStartCommand() intent=%s flags=0x%x startId=%d", intent, flags, startId); - boolean autoStart = shouldAutoLaunchRobotController(); - if (null == intent && autoStart) - { - launchRobotController(this); - } - return autoStart ? START_STICKY : START_NOT_STICKY; - } - - @Override public void onDestroy() - { - super.onDestroy(); - RobotLog.vv(TAG, "onDestroy()"); - } - - //---------------------------------------------------------------------------------------------- - // Operations - //---------------------------------------------------------------------------------------------- - - public static boolean shouldAutoLaunchRobotController() - { - boolean result = false; - - // We only *ever* autorun in the embedded, headless lynx case - if (LynxConstants.isDragonboardWithEmbeddedLynxModule()) - { - // But we might be asked to pretend we're not there - if (!LynxConstants.disableDragonboard()) - { - // We examine the policy flag - if (LynxConstants.autorunRobotController()) - { - result = true; - } - } - } - - RobotLog.vv(TAG, "shouldAutoLauchRobotController() result=%s", result); - return result; - } - - public static void launchRobotController(Context context) - { - RobotLog.vv(TAG, "launchRobotController()"); - Intent openApp = new Intent(context, FtcRobotControllerActivity.class); - openApp.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // nb: task != process - context.startActivity(openApp); - } - - } diff --git a/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/internal/RunOnStartup.java b/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/internal/RunOnStartup.java deleted file mode 100644 index 945ac85b506..00000000000 --- a/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/internal/RunOnStartup.java +++ /dev/null @@ -1,180 +0,0 @@ -/*Copyright (c) 2016, Justin Niezrecki - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted (subject to the limitations in the disclaimer below) provided that -the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. - -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -Neither the name of NAME nor the names of its contributors may be used to -endorse or promote products derived from this software without specific prior -written permission. - -NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS -LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESSFOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR -TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* -Copyright (c) 2016 Robert Atkinson - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted (subject to the limitations in the disclaimer below) provided that -the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. - -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -Neither the name of Robert Atkinson nor the names of his contributors may be used to -endorse or promote products derived from this software without specific prior -written permission. - -NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS -LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESSFOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR -TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package org.firstinspires.ftc.robotcontroller.internal; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; - -import com.qualcomm.ftcrobotcontroller.R; -import com.qualcomm.robotcore.hardware.configuration.LynxConstants; -import com.qualcomm.robotcore.util.RobotLog; - -import org.firstinspires.ftc.robotcore.internal.AppUtil; -import org.firstinspires.ftc.robotcore.internal.DragonboardLynxDragonboardIsPresentPin; -import org.firstinspires.ftc.robotcore.internal.PreferencesHelper; - -/** - * {@link RunOnStartup} is responsible for auto-starting the robot controller app when - * a headless device boots. - */ -public class RunOnStartup extends BroadcastReceiver - { - public static final String TAG = "RunOnStartup"; - - protected Context context = null; - protected PreferencesHelper preferencesHelper = null; - - @Override public void onReceive(Context context, Intent intent) - { - this.context = context; - if (preferencesHelper == null) - { - preferencesHelper = new PreferencesHelper(TAG, context); - } - - String action = intent.getAction(); - RobotLog.vv(TAG, "onReceive() action=%s", action); - - // Note: we will be *awakened if necessary* for each of these notifications since we're - // signed up to see them in our manifest. However, we *also* receive them even if the - // robot controller is executed manually. In the latter case, we especially don't want - // to inadvertently terminate this process :-). - - if (action.equals(Intent.ACTION_BOOT_COMPLETED)) - { - // On boot, we initialize the state that will help us auto-launch the robot - // controller *exactly* once. Note that we're taking advantage here of the fact - // that (a) we only ever receive ACTION_BOOT_COMPLETED at most one time, no matter - // how many times this BroadcastReceiver gets restarted, and (b) we receive - // ACTION_BOOT_COMPLETED before we receive other notifications that we might be - // interested in (note that currently *there*are*no* such notifications: we auto-launch - // here) - preferencesHelper.remove(context.getString(R.string.pref_autostarted_robot_controller)); - - if (shouldAutoLaunchRobotController()) - { - launchRobotController(); - } - else - { - // Having cleared that state, if we *still* shouldn't launch the robot - // controller, then we've got no business sticking around. - noteDragonboardPresenceAndExitIfNoRC(); - } - } - else - { - noteDragonboardPresenceAndExitIfNoRC(); - } - } - - /** If we're on the DB/Lynx comb, then ensure that the 'isPresent' pin is in the appropriate - * state. Then, unless the RC is running in *this* incarnation of this broadcast receiver, get - * the heck out of Dodge. */ - protected void noteDragonboardPresenceAndExitIfNoRC() - { - RobotLog.vv(TAG, "noteDragonboardPresenceAndExitIfNoRC()"); - // - if (LynxConstants.isDragonboardWithEmbeddedLynxModule()) - { - DragonboardLynxDragonboardIsPresentPin.getInstance().setState(!LynxConstants.disableDragonboard()); - } - // - if (!isRobotControllerRunningInThisProcess()) - { - AppUtil.getInstance().exitApplication(); - } - } - - protected boolean isRobotControllerRunningInThisProcess() - { - // If only this BroadcastReceiver has been executed, not the RC itself, then the root activity will be null - return AppUtil.getInstance().getRootActivity() instanceof FtcRobotControllerActivity; - } - - protected boolean shouldAutoLaunchRobotController() - { - boolean result = FtcRobotControllerWatchdogService.shouldAutoLaunchRobotController(); - if (result) - { - // Finally, we avoid auto-starting more than once (paranoia) - result = !preferencesHelper.readBoolean(context.getString(R.string.pref_autostarted_robot_controller), false); - } - - RobotLog.vv(TAG, "shouldAutoLauchRobotController() result=%s", result); - return result; - } - - protected void launchRobotController() - { - RobotLog.vv(TAG, "launchRobotController()"); - - // Start the guy - FtcRobotControllerWatchdogService.launchRobotController(context); - - // Remember that we did so so that we don't try to do that a second time - preferencesHelper.writeBooleanPrefIfDifferent(context.getString(R.string.pref_autostarted_robot_controller), true); - } - } diff --git a/FtcRobotController/src/main/res/layout/header.xml b/FtcRobotController/src/main/res/layout/header.xml deleted file mode 100644 index 86bfb0ee967..00000000000 --- a/FtcRobotController/src/main/res/layout/header.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/FtcRobotController/src/main/res/values-v11/styles.xml b/FtcRobotController/src/main/res/values-v11/styles.xml deleted file mode 100644 index abf62837bb0..00000000000 --- a/FtcRobotController/src/main/res/values-v11/styles.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - diff --git a/FtcRobotController/src/main/res/values-v14/styles.xml b/FtcRobotController/src/main/res/values-v14/styles.xml deleted file mode 100644 index 02b70dcf6e1..00000000000 --- a/FtcRobotController/src/main/res/values-v14/styles.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - diff --git a/FtcRobotController/src/main/res/values/colors.xml b/FtcRobotController/src/main/res/values/colors.xml deleted file mode 100644 index cd2c96f1ad5..00000000000 --- a/FtcRobotController/src/main/res/values/colors.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - #790E15 - #3F0206 - #4e0106 - #bf0510 - #A6040E - #ff0a19 - #FFFFFF - #000000 - #00000000 - diff --git a/FtcRobotController/src/main/res/xml/preferences.xml b/FtcRobotController/src/main/res/xml/preferences.xml deleted file mode 100644 index dc841b2ced5..00000000000 --- a/FtcRobotController/src/main/res/xml/preferences.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/libs/ModernRobotics-release.aar b/libs/ModernRobotics-release.aar deleted file mode 100644 index 3ae9e094e1baa240e282f277772d61d2bc663661..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9935 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 Wq#>dHtit@hdVW8}o`0`{fcy`lwSW!)