From 1661fc96b2c31f20c2262c83fb8bac8032f617c3 Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Tue, 25 Jun 2019 05:58:21 +0200 Subject: [PATCH] Removed support for ANT+. --- myTracks/build.gradle | 1 - myTracks/libs/antlib.jar | Bin 23490 -> 0 bytes myTracks/proguard.cfg | 5 - myTracks/src/main/AndroidManifest.xml | 2 - .../sensors/SensorManagerFactory.java | 2 - .../sensors/ant/AntSensorManager.java | 588 ------------------ .../services/sensors/ant/AntSensorValue.java | 60 -- .../ant/BikeCadenceChannelConfiguration.java | 55 -- .../services/sensors/ant/CadenceCounter.java | 178 ------ .../sensors/ant/ChannelConfiguration.java | 123 ---- .../ant/CombinedBikeChannelConfiguration.java | 56 -- .../ant/HeartRateChannelConfiguration.java | 51 -- .../SpeedDistanceChannelConfiguration.java | 55 -- .../settings/SensorSettingsActivity.java | 70 +-- .../res/values/arrays_do_not_translate.xml | 12 - .../src/main/res/values/do_not_translate.xml | 1 - myTracks/src/main/res/values/keys.xml | 5 - myTracks/src/main/res/values/strings.xml | 7 - myTracks/src/main/res/xml/sensor_settings.xml | 20 - 19 files changed, 6 insertions(+), 1285 deletions(-) delete mode 100644 myTracks/libs/antlib.jar delete mode 100644 myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/AntSensorManager.java delete mode 100644 myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/AntSensorValue.java delete mode 100644 myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/BikeCadenceChannelConfiguration.java delete mode 100644 myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/CadenceCounter.java delete mode 100644 myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/ChannelConfiguration.java delete mode 100644 myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/CombinedBikeChannelConfiguration.java delete mode 100644 myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/HeartRateChannelConfiguration.java delete mode 100644 myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/SpeedDistanceChannelConfiguration.java diff --git a/myTracks/build.gradle b/myTracks/build.gradle index 3600df7eb..2aca26ae5 100644 --- a/myTracks/build.gradle +++ b/myTracks/build.gradle @@ -22,7 +22,6 @@ android { dependencies { implementation project(':myTracksLib') - compile files('libs/antlib.jar') androidTestCompile files('libs/AndroidMockGenerator.jar') androidTestCompile files('libs/robotium-solo-5.0.1.jar') diff --git a/myTracks/libs/antlib.jar b/myTracks/libs/antlib.jar deleted file mode 100644 index 21d141ba9787ab1fb7bb6bfc86b07d5544374e34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23490 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 diff --git a/myTracks/proguard.cfg b/myTracks/proguard.cfg index fc8bb4eb1..3bdeb3eef 100644 --- a/myTracks/proguard.cfg +++ b/myTracks/proguard.cfg @@ -106,8 +106,3 @@ # class name is enough to get the file name. -renamesourcefileattribute MT -keepattributes SourceFile,LineNumberTable - -# Keep services needed by ANT+ protocol --keep public class com.dsi.ant.IAnt_6 --keep public class com.dsi.ant.IAnt --keep public class com.dsi.ant.IServiceSettings diff --git a/myTracks/src/main/AndroidManifest.xml b/myTracks/src/main/AndroidManifest.xml index 7baa899e5..b7c5cb75e 100644 --- a/myTracks/src/main/AndroidManifest.xml +++ b/myTracks/src/main/AndroidManifest.xml @@ -30,8 +30,6 @@ limitations under the License. - - diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/SensorManagerFactory.java b/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/SensorManagerFactory.java index d8c17e946..c070d2a56 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/SensorManagerFactory.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/SensorManagerFactory.java @@ -16,7 +16,6 @@ package com.google.android.apps.mytracks.services.sensors; -import com.google.android.apps.mytracks.services.sensors.ant.AntSensorManager; import com.google.android.apps.mytracks.util.PreferencesUtils; import com.google.android.maps.mytracks.R; @@ -96,7 +95,6 @@ public class SensorManagerFactory { context, R.string.sensor_type_key, PreferencesUtils.SENSOR_TYPE_DEFAULT); switch (sensorType) { - case "ANT": return new AntSensorManager(context); case "ZEPHYR": return new ZephyrSensorManager(context); case "POLAR": return new PolarSensorManager(context); } diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/AntSensorManager.java b/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/AntSensorManager.java deleted file mode 100644 index 7da1fe8f6..000000000 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/AntSensorManager.java +++ /dev/null @@ -1,588 +0,0 @@ -/* - * Copyright 2012 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ - -package com.google.android.apps.mytracks.services.sensors.ant; - -import com.dsi.ant.AntDefine; -import com.dsi.ant.AntInterface; -import com.dsi.ant.AntInterfaceIntent; -import com.dsi.ant.AntMesg; -import com.dsi.ant.exception.AntInterfaceException; -import com.dsi.ant.exception.AntServiceNotConnectedException; -import com.google.android.apps.mytracks.content.Sensor; -import com.google.android.apps.mytracks.content.Sensor.SensorDataSet; -import com.google.android.apps.mytracks.content.Sensor.SensorState; -import com.google.android.apps.mytracks.services.sensors.SensorManager; -import com.google.android.apps.mytracks.util.PreferencesUtils; -import com.google.android.maps.mytracks.R; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.provider.Settings; -import android.util.Log; -import android.widget.Toast; - -import java.lang.reflect.Field; -import java.util.Locale; - -/** - * Ant Sensor Manager. - * - * @author Jimmy Shih - */ -public class AntSensorManager extends SensorManager { - - /** - * Channel States - */ - public enum ChannelStates { - CLOSED, // Channel is closed - PENDING_OPEN, // User has requested opening the channel, waiting for a reset - SEARCHING, // Channel is opened, but has not received data - TRACKING_STATUS, // Channel is opened and has received status data recently - TRACKING_DATA, // Channel is opened and has received measurement data - // recently - OFFLINE // Channel is closed as the result of a search timeout - } - public static final short WILDCARD = 0; - - private static final String TAG = AntSensorManager.class.getSimpleName(); - private static final int CHANNELS = 4; - private static final String RADIO_ANT = "ant"; - private static final byte ANT_NETWORK = (byte) 0x01; - - private final Context context; - private final ChannelConfiguration channelConfig[]; - private final IntentFilter statusIntentFilter; - private final AntInterface antInterface; - - private boolean serviceConnected = false; - private boolean hasClaimedInterface = false; - - private SensorDataSet sensorDataSet = null; - private long lastSensorDataSetTime = 0; - private AntSensorValue antSensorValue = new AntSensorValue(); - - private boolean requestedReset = false; - - private AntInterface.ServiceListener serviceListener = new AntInterface.ServiceListener() { - @Override - public void onServiceConnected() { - setSensorState(Sensor.SensorState.CONNECTING); - serviceConnected = true; - try { - hasClaimedInterface = antInterface.hasClaimedInterface(); - if (!hasClaimedInterface) { - hasClaimedInterface = antInterface.claimInterface(); - } - if (!hasClaimedInterface) { - tryClaimAnt(); - return; - } - if (!antInterface.isEnabled()) { - antInterface.enable(); - } - requestReset(); - enableDataMessage(true); - } catch (AntInterfaceException e) { - handleAntError(); - } - } - - @Override - public void onServiceDisconnected() { - serviceConnected = false; - if (hasClaimedInterface) { - enableDataMessage(false); - } - setSensorState(SensorState.DISCONNECTED); - } - }; - - /** - * Constructor. - * - * @param context the context - */ - public AntSensorManager(Context context) { - this.context = context; - - channelConfig = new ChannelConfiguration[CHANNELS]; - channelConfig[0] = new HeartRateChannelConfiguration(); - channelConfig[1] = new SpeedDistanceChannelConfiguration(); - channelConfig[2] = new BikeCadenceChannelConfiguration(); - channelConfig[3] = new CombinedBikeChannelConfiguration(); - - statusIntentFilter = new IntentFilter(); - statusIntentFilter.addAction(AntInterfaceIntent.ANT_ENABLED_ACTION); - statusIntentFilter.addAction(AntInterfaceIntent.ANT_ENABLING_ACTION); - statusIntentFilter.addAction(AntInterfaceIntent.ANT_DISABLED_ACTION); - statusIntentFilter.addAction(AntInterfaceIntent.ANT_DISABLING_ACTION); - statusIntentFilter.addAction(AntInterfaceIntent.ANT_RESET_ACTION); - statusIntentFilter.addAction(AntInterfaceIntent.ANT_INTERFACE_CLAIMED_ACTION); - statusIntentFilter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); - - antInterface = new AntInterface(); - } - - @Override - protected synchronized void setUpChannel() { - tearDownChannel(); - if (AntInterface.hasAntSupport(context)) { - context.registerReceiver(statusReceiver, statusIntentFilter); - if (!antInterface.initService(context, serviceListener)) { - AntInterface.goToMarket(context); - } - } - } - - @Override - protected void tearDownChannel() { - try { - context.unregisterReceiver(statusReceiver); - } catch (IllegalArgumentException e) { - // Can safely ignore - } - enableDataMessage(false); - if (serviceConnected) { - try { - if (hasClaimedInterface) { - antInterface.releaseInterface(); - } - hasClaimedInterface = false; - antInterface.stopRequestForceClaimInterface(); - } catch (AntServiceNotConnectedException e) { - // Can safely ignore - } catch (AntInterfaceException e) { - Log.w(TAG, "Exception in tearDonwChannel.", e); - } - antInterface.releaseService(); - serviceConnected = false; - } - setSensorState(SensorState.DISCONNECTED); - } - - @Override - public SensorDataSet getSensorDataSet() { - return sensorDataSet; - } - - /** - * Tries to claim the ant interface. - */ - private void tryClaimAnt() { - try { - antInterface.requestForceClaimInterface(context.getString(R.string.my_tracks_app_name)); - } catch (AntInterfaceException e) { - handleAntError(); - } - } - - /** - * Configures ant radio. - */ - private void configureAntRadio() { - try { - if (serviceConnected && hasClaimedInterface && antInterface.isEnabled()) { - try { - antInterface.ANTDisableEventBuffering(); - } catch (AntInterfaceException e) { - Log.e(TAG, "Cannot disable event buffering.", e); - } - } else { - Log.i(TAG, "Cannot disable event buffering now."); - } - } catch (AntInterfaceException e) { - Log.e(TAG, "Unable to check enabled state.", e); - } - } - - /** - * Handles ant error. - */ - private void handleAntError() { - clearAllChannels(); - } - - /** - * Opens a channel. - * - * @param channel the channel - */ - private void openChannel(byte channel) { - short deviceNumber = (short) PreferencesUtils.getInt( - context, channelConfig[channel].getDeviceIdKey(), WILDCARD); - channelConfig[channel].setDeviceNumber(deviceNumber); - channelConfig[channel].setChannelState(ChannelStates.PENDING_OPEN); - setupAntChannel(ANT_NETWORK, channel); - } - - /** - * Closes a channel. - * - * @param channel the channel - */ - private void closeChannel(byte channel) { - channelConfig[channel].setInitializing(false); - channelConfig[channel].setDeinitializing(true); - channelConfig[channel].setChannelState(ChannelStates.CLOSED); - try { - antInterface.ANTCloseChannel(channel); - // Note, unassign channel after getting channel closed event - } catch (AntInterfaceException e) { - Log.w(TAG, "Unable to close channel: " + channel, e); - handleAntError(); - } - } - - /** - * Clears all channels. - */ - private void clearAllChannels() { - for (int i = 0; i < CHANNELS; i++) { - channelConfig[i].setChannelState(ChannelStates.CLOSED); - } - setSensorState(SensorState.DISCONNECTED); - } - - /** - * Requests reset. - */ - private void requestReset() { - try { - requestedReset = true; - antInterface.ANTResetSystem(); - configureAntRadio(); - } catch (AntInterfaceException e) { - Log.e(TAG, "Unable to reset ant.", e); - requestedReset = false; - } - } - - @Override - public boolean isEnabled() { - if (antInterface == null || !antInterface.isServiceConnected()) { - return false; - } - try { - return antInterface.isEnabled(); - } catch (AntInterfaceException e) { - Log.w(TAG, "Unable to check enabled.", e); - return false; - } - } - - private final BroadcastReceiver statusReceiver = new BroadcastReceiver() { - public void onReceive(Context c, Intent intent) { - String ANTAction = intent.getAction(); - if (ANTAction.equals(AntInterfaceIntent.ANT_DISABLED_ACTION)) { - clearAllChannels(); - } else if (ANTAction.equals(AntInterfaceIntent.ANT_RESET_ACTION)) { - if (!requestedReset) { - // Someone else triggered an ant reset - clearAllChannels(); - } else { - requestedReset = false; - configureAntRadio(); - } - } else if (ANTAction.equals(AntInterfaceIntent.ANT_INTERFACE_CLAIMED_ACTION)) { - boolean wasClaimed = hasClaimedInterface; - - // Could also read ANT_INTERFACE_CLAIMED_PID from intent and see if it - // matches the current process PID. - try { - hasClaimedInterface = antInterface.hasClaimedInterface(); - if (hasClaimedInterface) { - enableDataMessage(true); - } else { - if (wasClaimed) { - // Claimed by another application - enableDataMessage(false); - setSensorState(SensorState.DISCONNECTED); - } - } - } catch (AntInterfaceException e) { - handleAntError(); - } - } else if (ANTAction.equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)) { - if (isAirPlaneMode()) { - clearAllChannels(); - } - } - } - }; - - private final BroadcastReceiver dataReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context c, Intent intent) { - if (intent.getAction().equals(AntInterfaceIntent.ANT_RX_MESSAGE_ACTION)) { - byte[] antRxMessage = intent.getByteArrayExtra(AntInterfaceIntent.ANT_MESSAGE); - byte channel; - switch (antRxMessage[AntMesg.MESG_ID_OFFSET]) { - case AntMesg.MESG_BROADCAST_DATA_ID: - case AntMesg.MESG_ACKNOWLEDGED_DATA_ID: - channel = antRxMessage[AntMesg.MESG_DATA_OFFSET]; - if (channelConfig[channel].getChannelState() != ChannelStates.CLOSED) { - channelConfig[channel].setChannelState(ChannelStates.TRACKING_DATA); - } - - if (channelConfig[channel].getDeviceNumber() == WILDCARD) { - try { - antInterface.ANTRequestMessage(channel, AntMesg.MESG_CHANNEL_ID_ID); - } catch (AntInterfaceException e) { - handleAntError(); - } - } - channelConfig[channel].decodeMessage(antRxMessage, antSensorValue); - setSensorDataSet(); - break; - case AntMesg.MESG_RESPONSE_EVENT_ID: - handleResponseEventMessage(antRxMessage); - break; - case AntMesg.MESG_CHANNEL_ID_ID: - channel = antRxMessage[AntMesg.MESG_DATA_OFFSET]; - short deviceNumber = (short) ((antRxMessage[AntMesg.MESG_DATA_OFFSET + 1] & 0xFF - | ((antRxMessage[AntMesg.MESG_DATA_OFFSET + 2] & 0xFF) << 8)) & 0xFFFF); - channelConfig[channel].setDeviceNumber(deviceNumber); - PreferencesUtils.setInt(context, channelConfig[channel].getDeviceIdKey(), deviceNumber); - Toast.makeText(context, - context.getString(R.string.settings_sensor_connected, deviceNumber), - Toast.LENGTH_SHORT).show(); - setSensorState(SensorState.CONNECTED); - break; - default: - break; - } - } - } - - /** - * Handles response event message. - * - * @param message the message - */ - private void handleResponseEventMessage(byte[] message) { - // For a list of possible message codes see ANT Message Protocol and Usage - // section 9.5.6.1 available from thisisant.com - byte channel = message[AntMesg.MESG_DATA_OFFSET]; - if ((message[AntMesg.MESG_DATA_OFFSET + 1] == AntMesg.MESG_EVENT_ID) - && (message[AntMesg.MESG_DATA_OFFSET + 2] == AntDefine.EVENT_RX_SEARCH_TIMEOUT)) { - // A channel timed out searching, unassign it - channelConfig[channel].setInitializing(false); - channelConfig[channel].setDeinitializing(false); - channelConfig[channel].setChannelState(ChannelStates.OFFLINE); - try { - antInterface.ANTUnassignChannel(channel); - } catch (AntInterfaceException e) { - handleAntError(); - } - setSensorState(SensorState.DISCONNECTED); - } - - if (channelConfig[channel].isInitializing()) { - if (message[AntMesg.MESG_DATA_OFFSET + 2] != 0) { - // Error response - Log.e(TAG, String.format(Locale.US, - "Error code(%#02x) on message ID(%#02x) on channel %d", - message[AntMesg.MESG_DATA_OFFSET + 2], message[AntMesg.MESG_DATA_OFFSET + 1], - channel)); - } else { - // Switch on message id - switch (message[AntMesg.MESG_DATA_OFFSET + 1]) { - case AntMesg.MESG_ASSIGN_CHANNEL_ID: - try { - antInterface.ANTSetChannelId(channel, channelConfig[channel].getDeviceNumber(), - channelConfig[channel].getDeviceType(), ChannelConfiguration.TRANSMISSION_TYPE); - } catch (AntInterfaceException e) { - handleAntError(); - } - break; - case AntMesg.MESG_CHANNEL_ID_ID: - try { - antInterface.ANTSetChannelPeriod(channel, channelConfig[channel].getMessagPeriod()); - } catch (AntInterfaceException e) { - handleAntError(); - } - break; - case AntMesg.MESG_CHANNEL_MESG_PERIOD_ID: - try { - antInterface.ANTSetChannelRFFreq(channel, ChannelConfiguration.FREQUENCY); - } catch (AntInterfaceException e) { - handleAntError(); - } - break; - case AntMesg.MESG_CHANNEL_RADIO_FREQ_ID: - try { - // Disable high priority search - antInterface.ANTSetChannelSearchTimeout(channel, (byte) 0); - } catch (AntInterfaceException e) { - handleAntError(); - } - break; - case AntMesg.MESG_CHANNEL_SEARCH_TIMEOUT_ID: - try { - // Set search timeout to 30 seconds (low priority search) - antInterface.ANTSetLowPriorityChannelSearchTimeout(channel, (byte) 12); - } catch (AntInterfaceException e) { - handleAntError(); - } - break; - case AntMesg.MESG_SET_LP_SEARCH_TIMEOUT_ID: - if (channelConfig[channel].getDeviceNumber() == WILDCARD) { - try { - // Configure proximity search, if using wild card search - antInterface.ANTSetProximitySearch( - channel, ChannelConfiguration.PROXIMITY_SEARCH); - } catch (AntInterfaceException e) { - handleAntError(); - } - } else { - try { - antInterface.ANTOpenChannel(channel); - } catch (AntInterfaceException e) { - handleAntError(); - } - } - break; - case AntMesg.MESG_PROX_SEARCH_CONFIG_ID: - try { - antInterface.ANTOpenChannel(channel); - } catch (AntInterfaceException e) { - handleAntError(); - } - break; - case AntMesg.MESG_OPEN_CHANNEL_ID: - channelConfig[channel].setInitializing(false); - channelConfig[channel].setChannelState(ChannelStates.SEARCHING); - break; - default: - break; - } - } - } else if (channelConfig[channel].isDeinitializing()) { - if ((message[AntMesg.MESG_DATA_OFFSET + 1] == AntMesg.MESG_EVENT_ID) - && (message[AntMesg.MESG_DATA_OFFSET + 2] == AntDefine.EVENT_CHANNEL_CLOSED)) { - try { - antInterface.ANTUnassignChannel(channel); - } catch (AntInterfaceException e) { - handleAntError(); - } - } else if ((message[AntMesg.MESG_DATA_OFFSET + 1] == AntMesg.MESG_UNASSIGN_CHANNEL_ID) - && (message[AntMesg.MESG_DATA_OFFSET + 2] == AntDefine.RESPONSE_NO_ERROR)) { - channelConfig[channel].setDeinitializing(false); - } - } - } - }; - - /** - * Sets sensor data set. - */ - private void setSensorDataSet() { - long now = System.currentTimeMillis(); - // Data comes in at ~4Hz rate from the sensors, so after >300 msec fresh - // data is here from all the connected sensors - if (now < lastSensorDataSetTime + 300) { - return; - } - lastSensorDataSetTime = now; - - SensorDataSet.Builder builder = Sensor.SensorDataSet.newBuilder(); - int heartRate = antSensorValue.getHeartRate(); - if (heartRate != -1) { - builder.setHeartRate(Sensor.SensorData.newBuilder() - .setValue(heartRate).setState(Sensor.SensorState.SENDING)); - } - int cadence = antSensorValue.getCadence(); - if (cadence != -1) { - builder.setCadence(Sensor.SensorData.newBuilder() - .setValue(cadence).setState(Sensor.SensorState.SENDING)); - } - sensorDataSet = builder.setCreationTime(now).build(); - setSensorState(SensorState.SENDING); - } - - /** - * Sets up ant channel. - * - * @param networkNumber the network number - * @param channel the channel - */ - private void setupAntChannel(byte networkNumber, byte channel) { - try { - channelConfig[channel].setInitializing(true); - channelConfig[channel].setDeinitializing(false); - - // Assign as slave channel on selected network - antInterface.ANTAssignChannel(channel, AntDefine.PARAMETER_RX_NOT_TX, networkNumber); - - // The rest of the channel configuration will occur after the response is - // received in handleResponseEventMessage - } catch (AntInterfaceException aie) { - handleAntError(); - } - } - - /** - * Enables data message. - * - * @param enabled true to enable - */ - private void enableDataMessage(boolean enabled) { - if (enabled) { - context.registerReceiver( - dataReceiver, new IntentFilter(AntInterfaceIntent.ANT_RX_MESSAGE_ACTION)); - for (int i = 0; i < CHANNELS; i++) { - openChannel((byte) i); - } - } else { - try { - context.unregisterReceiver(dataReceiver); - for (int i = 0; i < CHANNELS; i++) { - closeChannel((byte) i); - } - } catch (IllegalArgumentException e) { - // Can safely ignore - } - } - } - - /** - * Returns true if in airplane mode. - */ - private boolean isAirPlaneMode() { - if (!Settings.System.getString( - context.getContentResolver(), Settings.System.AIRPLANE_MODE_RADIOS) - .contains(RADIO_ANT)) { - return false; - } - if (Settings.System.getInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) - == 0) { - return false; - } - - try { - Field field = Settings.System.class.getField("AIRPLANE_MODE_TOGGLEABLE_RADIOS"); - return !Settings.System.getString(context.getContentResolver(), (String) field.get(null)) - .contains(RADIO_ANT); - } catch (Exception e) { - // This is expected if the list does not yet exist, so just return true - return true; - } - } -} diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/AntSensorValue.java b/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/AntSensorValue.java deleted file mode 100644 index ca74d3946..000000000 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/AntSensorValue.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2012 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ - -package com.google.android.apps.mytracks.services.sensors.ant; - -/** - * Contains the latest ant sensor value. - * - * @author Jimmy Shih - */ -public class AntSensorValue { - - private int heartRate = -1; - private int cadence = -1; - - /** - * Gets the heart rate. - */ - public int getHeartRate() { - return heartRate; - } - - /** - * Sets the heart rate. - * - * @param heartRate the heart rate to set - */ - public void setHeartRate(int heartRate) { - this.heartRate = heartRate; - } - - /** - * Gets the cadence. - */ - public int getCadence() { - return cadence; - } - - /** - * Sets the cadence. - * - * @param cadence the cadence to set - */ - public void setCadence(int cadence) { - this.cadence = cadence; - } -} diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/BikeCadenceChannelConfiguration.java b/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/BikeCadenceChannelConfiguration.java deleted file mode 100644 index 061fd71fc..000000000 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/BikeCadenceChannelConfiguration.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2012 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ - -package com.google.android.apps.mytracks.services.sensors.ant; - -import com.google.android.maps.mytracks.R; - -/** - * Bike cadence sensor channel configuration. - * - * @author Jimmy Shih - */ -public class BikeCadenceChannelConfiguration extends ChannelConfiguration { - - private static final int DEVICE_ID_KEY = R.string.ant_bike_cadence_sensor_id_key; - private static final byte DEVICE_TYPE = 0x7A; - private static final short MESSAGE_PERIOD = 8102; - - private CadenceCounter cadenceCounter = new CadenceCounter(); - - @Override - public int getDeviceIdKey() { - return DEVICE_ID_KEY; - } - - @Override - public byte getDeviceType() { - return DEVICE_TYPE; - } - - @Override - public short getMessagPeriod() { - return MESSAGE_PERIOD; - } - - @Override - public void decodeMessage(byte[] message, AntSensorValue antSensorValue) { - int revolutionCount = ((int) message[9] & 0xFF) + ((int) message[10] & 0xFF) * 256; - int eventTime = ((int) message[7] & 0xFF) + ((int) message[8] & 0xFF) * 256; - antSensorValue.setCadence(cadenceCounter.getEventsPerMinute(revolutionCount, eventTime)); - } -} diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/CadenceCounter.java b/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/CadenceCounter.java deleted file mode 100644 index d49e66ab9..000000000 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/CadenceCounter.java +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright 2012 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ - -package com.google.android.apps.mytracks.services.sensors.ant; - -import java.util.LinkedList; - -/** - * A counter that processes an Ant+ sensor data (count + event time) and returns - * the instantaneous cadence value. - * - * @author Laszlo Molnar - */ -public class CadenceCounter { - - private static final int MILLIS_PER_MINUTE = 60000; - private static final int MAX_HISTORY_TIME_IN_MILLIS = 5000; // 5 seconds - private static final int MAX_HISTORY_SIZE = 100; - private static final int EVENT_TIME_PER_MINUTE = 60 * 1024; - - /** - * Cadence data. - * - * @author Laszlo Molnar - */ - private static class CadenceData { - final long systemTime; - final int count; - final int eventTime; - - private CadenceData(long systemTime, int count, int eventTime) { - this.systemTime = systemTime; - this.count = count; - this.eventTime = eventTime; - } - } - - // The last count - private int lastCount; - - // The last calculated cadence - private int eventsPerMinute; - - // The history of the previous sensor data, oldest first - private LinkedList history; - - public CadenceCounter() { - lastCount = -1; - eventsPerMinute = 0; - history = new LinkedList(); - } - - /** - * Gets the cadence value. - * - * @param count count - * @param eventTime event time - */ - public int getEventsPerMinute(int count, int eventTime) { - long now = System.currentTimeMillis(); - int countChange = (count - lastCount) & 0xFFFF; - - if (lastCount < 0) { - /* - * eventTime for the initial count value is probably out of date, so not - * updating the history. - */ - lastCount = count; - eventsPerMinute = 0; - return 0; - } - - lastCount = count; - - if (countChange != 0) { - if (removeOldHistory(now)) { - CadenceData lastCadenceData = history.getLast(); - int eventTimeChange = (eventTime - lastCadenceData.eventTime) & 0xFFFF; - if (eventTimeChange != 0) { - countChange = (count - lastCadenceData.count) & 0xFFFF; - eventsPerMinute = countChange * EVENT_TIME_PER_MINUTE / eventTimeChange; - } - } - history.addLast(new CadenceData(now, count, eventTime)); - return eventsPerMinute; - } else { - // The sensor has resent old data - if (history.isEmpty()) { - eventsPerMinute = 0; - return 0; - } - - CadenceData lastCadenceData = history.getLast(); - if ((now - lastCadenceData.systemTime) * eventsPerMinute < MILLIS_PER_MINUTE) { - // The last eventsPerMinute is still valid - return eventsPerMinute; - } - - // Update the history - if (!removeOldHistory(now)) { - eventsPerMinute = 0; - return 0; - } - - /* - * Too much time has passed since the last count change. A smaller value - * than eventsPerMinute must be returned. The value is calculated from the - * history. - */ - return getValueFromHistory(now); - } - } - - /** - * Gets the cadence value from the history when the sensor only resends the - * old data. - * - * @param now the current system time - */ - private int getValueFromHistory(long now) { - CadenceData firstCadenceData = history.getFirst(); - CadenceData lastCadenceData = history.getLast(); - int eventTimeChange = (lastCadenceData.eventTime - firstCadenceData.eventTime) & 0xFFFF; - int countChange = (lastCount - firstCadenceData.count) & 0xFFFF; - - // (now - lastCadenceData) + (lastCadenceData - firstCadenceData) - int systemTimeChange = (int) (now - lastCadenceData.systemTime - + (eventTimeChange * MILLIS_PER_MINUTE) / EVENT_TIME_PER_MINUTE); - - /* - * eventsPerMinute is not updated because it is still needed when a new - * sensor event arrives. - */ - if (systemTimeChange == 0) { - return eventsPerMinute; - } - int value = (countChange * MILLIS_PER_MINUTE) / systemTimeChange; - - /* - * Do not return a larger number than eventsPerMinute because this function - * is only called when more time has passed after the last count change than - * the interval from eventsPerMinute. - */ - return value < eventsPerMinute ? value : eventsPerMinute; - } - - /** - * Removes old data from the history. - * - * @param now the current system time - * @return true if the remaining history is not empty. - */ - private boolean removeOldHistory(long now) { - CadenceData historyElement = history.peek(); - while (historyElement != null) { - if (now - historyElement.systemTime <= MAX_HISTORY_TIME_IN_MILLIS - && history.size() < MAX_HISTORY_SIZE) { - return true; - } - history.removeFirst(); - historyElement = history.peek(); - } - return false; - } -} diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/ChannelConfiguration.java b/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/ChannelConfiguration.java deleted file mode 100644 index f13cd15f8..000000000 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/ChannelConfiguration.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright 2012 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ - -package com.google.android.apps.mytracks.services.sensors.ant; - -import com.google.android.apps.mytracks.services.sensors.ant.AntSensorManager.ChannelStates; - -/** - * Ant channel configuration. - * - * @author Jimmy Shih - */ -public abstract class ChannelConfiguration { - - public static final byte FREQUENCY = 57; // 2457Mhz (Ant+ frequency) - public static final byte TRANSMISSION_TYPE = 0; // 0 for wild card search - public static final byte PROXIMITY_SEARCH = 7; - - private short deviceNumber = AntSensorManager.WILDCARD; - private ChannelStates channelState = ChannelStates.CLOSED; - private boolean isInitializing = false; - private boolean isDeinitializing = false; - - /** - * Gets the My Tracks settings device id key. - */ - public abstract int getDeviceIdKey(); - - /** - * Gets the device type. - */ - public abstract byte getDeviceType(); - - /** - * Gets the message period. - */ - public abstract short getMessagPeriod(); - - /** - * Decodes the message and places the value in antSensorValue. - * - * @param message the message - * @param antSensorValue the ant sensor value - */ - public abstract void decodeMessage(byte[] message, AntSensorValue antSensorValue); - - /** - * Gets the device number. - */ - public short getDeviceNumber() { - return deviceNumber; - } - - /** - * Sets the device number. - * - * @param deviceNumber the device number to set - */ - public void setDeviceNumber(short deviceNumber) { - this.deviceNumber = deviceNumber; - } - - /** - * Gets the channel state. - */ - public ChannelStates getChannelState() { - return channelState; - } - - /** - * Sets the channel state. - * - * @param channelState the channelState to set - */ - public void setChannelState(ChannelStates channelState) { - this.channelState = channelState; - } - - /** - * Returns true if initializing. - */ - public boolean isInitializing() { - return isInitializing; - } - - /** - * Sets isInitializing. - * - * @param isInitializing true if isInitializing - */ - public void setInitializing(boolean isInitializing) { - this.isInitializing = isInitializing; - } - - /** - * Returns true if deinitializing. - */ - public boolean isDeinitializing() { - return isDeinitializing; - } - - /** - * Sets isDeinitializing. - * - * @param isDeinitializing true if isDeinitializing - */ - public void setDeinitializing(boolean isDeinitializing) { - this.isDeinitializing = isDeinitializing; - } -} diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/CombinedBikeChannelConfiguration.java b/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/CombinedBikeChannelConfiguration.java deleted file mode 100644 index 784aaa4da..000000000 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/CombinedBikeChannelConfiguration.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2012 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ - -package com.google.android.apps.mytracks.services.sensors.ant; - -import com.google.android.maps.mytracks.R; - -/** - * Combined bike sensor channel configuration. - * - * @author Jimmy Shih - */ -public class CombinedBikeChannelConfiguration extends ChannelConfiguration { - - private static final int DEVICE_ID_KEY = R.string.ant_combined_bike_sensor_id_key; - private static final byte DEVICE_TYPE = 0x79; - private static final short MESSAGE_PERIOD = 8086; - - private CadenceCounter cadenceCounter = new CadenceCounter(); - - @Override - public int getDeviceIdKey() { - return DEVICE_ID_KEY; - } - - @Override - public byte getDeviceType() { - return DEVICE_TYPE; - } - - @Override - public short getMessagPeriod() { - return MESSAGE_PERIOD; - } - - @Override - public void decodeMessage(byte[] message, AntSensorValue antSensorValue) { - int revolutionCount = ((int) message[5] & 0xFF) + ((int) message[6] & 0xFF) * 256; - int eventTime = ((int) message[3] & 0xFF) + ((int) message[4] & 0xFF) * 256; - - antSensorValue.setCadence(cadenceCounter.getEventsPerMinute(revolutionCount, eventTime)); - } -} diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/HeartRateChannelConfiguration.java b/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/HeartRateChannelConfiguration.java deleted file mode 100644 index 6ae2d2ae7..000000000 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/HeartRateChannelConfiguration.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2012 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ - -package com.google.android.apps.mytracks.services.sensors.ant; - -import com.google.android.maps.mytracks.R; - -/** - * Heart rate monitor channel configuration. - * - * @author Jimmy Shih - */ -public class HeartRateChannelConfiguration extends ChannelConfiguration { - - private static final int DEVICE_ID_KEY = R.string.ant_heart_rate_monitor_id_key; - private static final byte DEVICE_TYPE = 0x78; - private static final short MESSAGE_PERIOD = 8070; - - @Override - public int getDeviceIdKey() { - return DEVICE_ID_KEY; - } - - @Override - public byte getDeviceType() { - return DEVICE_TYPE; - } - - @Override - public short getMessagPeriod() { - return MESSAGE_PERIOD; - } - - @Override - public void decodeMessage(byte[] message, AntSensorValue antSensorValue) { - antSensorValue.setHeartRate(message[10] & 0xFF); - } -} diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/SpeedDistanceChannelConfiguration.java b/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/SpeedDistanceChannelConfiguration.java deleted file mode 100644 index a107bcec9..000000000 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/services/sensors/ant/SpeedDistanceChannelConfiguration.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2012 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ - -package com.google.android.apps.mytracks.services.sensors.ant; - -import com.google.android.maps.mytracks.R; - -/** - * Speed distance monitor channel configuration. - * - * @author Jimmy Shih - */ -public class SpeedDistanceChannelConfiguration extends ChannelConfiguration { - - private static final int DEVICE_ID_KEY = R.string.ant_speed_distance_monitor_id_key; - private static final byte DEVICE_TYPE = 0x7C; - private static final short MESSAGE_PERIOD = 8134; - - @Override - public int getDeviceIdKey() { - return DEVICE_ID_KEY; - } - - @Override - public byte getDeviceType() { - return DEVICE_TYPE; - } - - @Override - public short getMessagPeriod() { - return MESSAGE_PERIOD; - } - - @Override - public void decodeMessage(byte[] message, AntSensorValue antSensorValue) { - // Check page 2 data - if (message[3] == 0x02) { - antSensorValue.setCadence( - (int) ((message[6] & 0xFF) + (((message[7] >>> 4) & 0x0F) / 16.0f))); - } - } -} diff --git a/myTracks/src/main/java/com/google/android/apps/mytracks/settings/SensorSettingsActivity.java b/myTracks/src/main/java/com/google/android/apps/mytracks/settings/SensorSettingsActivity.java index bed1455b5..31a6cc603 100644 --- a/myTracks/src/main/java/com/google/android/apps/mytracks/settings/SensorSettingsActivity.java +++ b/myTracks/src/main/java/com/google/android/apps/mytracks/settings/SensorSettingsActivity.java @@ -16,8 +16,6 @@ package com.google.android.apps.mytracks.settings; -import com.dsi.ant.AntInterface; -import com.google.android.apps.mytracks.services.sensors.ant.AntSensorManager; import com.google.android.apps.mytracks.util.BluetoothDeviceUtils; import com.google.android.apps.mytracks.util.PreferencesUtils; import com.google.android.maps.mytracks.R; @@ -48,9 +46,7 @@ public class SensorSettingsActivity extends AbstractSettingsActivity { super.onCreate(bundle); addPreferencesFromResource(R.xml.sensor_settings); - boolean hasAntSupport = AntInterface.hasAntSupport(this); - - configSensorType(hasAntSupport); + configSensorType(); findPreference(getString(R.string.settings_sensor_bluetooth_pairing_key)) .setOnPreferenceClickListener(new OnPreferenceClickListener() { @@ -60,30 +56,15 @@ public class SensorSettingsActivity extends AbstractSettingsActivity { return true; } }); - - if (!hasAntSupport) { - PreferenceScreen rootPreferenceScreen = (PreferenceScreen) findPreference( - getString(R.string.settings_sensor_root_key)); - rootPreferenceScreen.removePreference( - findPreference(getString(R.string.settings_sensor_ant_key))); - } } @SuppressWarnings("deprecation") - private void configSensorType(boolean hasAntSupport) { - ListPreference preference = (ListPreference) findPreference( - getString(R.string.sensor_type_key)); + private void configSensorType() { + ListPreference preference = (ListPreference) findPreference(getString(R.string.sensor_type_key)); String value = PreferencesUtils.getString( this, R.string.sensor_type_key, PreferencesUtils.SENSOR_TYPE_DEFAULT); - String[] options = getResources().getStringArray( - hasAntSupport ? R.array.sensor_type_all_options : R.array.sensor_type_bluetooth_options); - String[] values = getResources().getStringArray( - hasAntSupport ? R.array.sensor_type_all_values : R.array.sensor_type_bluetooth_values); - - if (!hasAntSupport && value.equals(R.string.sensor_type_value_ant)) { - value = PreferencesUtils.SENSOR_TYPE_DEFAULT; - PreferencesUtils.setString(this, R.string.sensor_type_key, value); - } + String[] options = getResources().getStringArray(R.array.sensor_type_bluetooth_options); + String[] values = getResources().getStringArray( R.array.sensor_type_bluetooth_values); OnPreferenceChangeListener listener = new OnPreferenceChangeListener() { @Override @@ -102,49 +83,10 @@ public class SensorSettingsActivity extends AbstractSettingsActivity { */ @SuppressWarnings("deprecation") private void updateUiBySensorType(String sensorType) { - boolean isBluetooth = getString(R.string.sensor_type_value_polar).equals(sensorType) - || getString(R.string.sensor_type_value_zephyr).equals(sensorType); + boolean isBluetooth = getString(R.string.sensor_type_value_polar).equals(sensorType) || getString(R.string.sensor_type_value_zephyr).equals(sensorType); findPreference(getString(R.string.settings_sensor_bluetooth_key)).setEnabled(isBluetooth); - - boolean isAnt = getString(R.string.sensor_type_value_ant).equals(sensorType); - updateAntSensor(R.string.settings_sensor_ant_reset_heart_rate_monitor_key, - R.string.ant_heart_rate_monitor_id_key, isAnt); - updateAntSensor(R.string.settings_sensor_ant_reset_speed_distance_monitor_key, - R.string.ant_speed_distance_monitor_id_key, isAnt); - updateAntSensor(R.string.settings_sensor_ant_reset_bike_cadence_sensor_key, - R.string.ant_bike_cadence_sensor_id_key, isAnt); - updateAntSensor(R.string.settings_sensor_ant_reset_combined_bike_sensor_key, - R.string.ant_combined_bike_sensor_id_key, isAnt); } - /** - * Updates an ant sensor. - * - * @param preferenceKey the preference key - * @param valueKey the value key - * @param enabled true if enabled - */ - @SuppressWarnings("deprecation") - private void updateAntSensor(int preferenceKey, final int valueKey, boolean enabled) { - Preference preference = findPreference(getString(preferenceKey)); - if (preference != null) { - preference.setEnabled(enabled); - int deviceId = PreferencesUtils.getInt(this, valueKey, AntSensorManager.WILDCARD); - if (deviceId == AntSensorManager.WILDCARD) { - preference.setSummary(R.string.settings_sensor_ant_not_connected); - } else { - preference.setSummary(getString(R.string.settings_sensor_ant_paired, deviceId)); - } - preference.setOnPreferenceClickListener(new OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference pref) { - PreferencesUtils.setInt(SensorSettingsActivity.this, valueKey, AntSensorManager.WILDCARD); - pref.setSummary(R.string.settings_sensor_ant_not_connected); - return true; - } - }); - } - } @Override protected void onResume() { diff --git a/myTracks/src/main/res/values/arrays_do_not_translate.xml b/myTracks/src/main/res/values/arrays_do_not_translate.xml index 499dbca46..7f331672a 100644 --- a/myTracks/src/main/res/values/arrays_do_not_translate.xml +++ b/myTracks/src/main/res/values/arrays_do_not_translate.xml @@ -167,18 +167,6 @@ limitations under the License. 1000 2000 - - @string/settings_sensor_type_polar - @string/settings_sensor_type_zephyr - @string/settings_sensor_type_ant - @string/value_none - - - @string/sensor_type_value_polar - @string/sensor_type_value_zephyr - @string/sensor_type_value_ant - @string/sensor_type_value_none - @string/settings_sensor_type_polar @string/settings_sensor_type_zephyr diff --git a/myTracks/src/main/res/values/do_not_translate.xml b/myTracks/src/main/res/values/do_not_translate.xml index 8b8d3ca33..f0811b8ab 100644 --- a/myTracks/src/main/res/values/do_not_translate.xml +++ b/myTracks/src/main/res/values/do_not_translate.xml @@ -78,7 +78,6 @@ Google은 이용자에 대한 위치정보의 이용∙제공사실을 위치정 My Tracks Recording Service www.google.com/mobile/mytracks com.google.android.apps.mytracks.MYTRACKS_NOTIFICATIONS - ANT NONE POLAR ZEPHYR diff --git a/myTracks/src/main/res/values/keys.xml b/myTracks/src/main/res/values/keys.xml index 286ff70b2..b953f078c 100644 --- a/myTracks/src/main/res/values/keys.xml +++ b/myTracks/src/main/res/values/keys.xml @@ -80,11 +80,6 @@ limitations under the License. settingsRecording settingsReset settingsSensor - settingsSensorAnt - settingsSensorAntResetBikeCadenceSensor - settingsSensorAntResetCombinedBikeSensor - settingsSensorAntResetHeartRateMonitor - settingsSensorAntResetSpeedDistanceMonitor settingsSensorBluetooth settingsSensorBluetoothPairing settingsSensorRoot diff --git a/myTracks/src/main/res/values/strings.xml b/myTracks/src/main/res/values/strings.xml index d4197ce5a..26ff05cc3 100644 --- a/myTracks/src/main/res/values/strings.xml +++ b/myTracks/src/main/res/values/strings.xml @@ -1814,13 +1814,6 @@ limitations under the License. Character limit: ~23 (1 line)"> Sensor type - - ANT+ - - - - - - - \ No newline at end of file