forked from upstream-mirrors/OpenTracks
Renamed SensorManager to RemoteSensorManager.
This commit is contained in:
@@ -31,6 +31,9 @@ import androidx.annotation.NonNull;
|
|||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import androidx.fragment.app.FragmentActivity;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
|
|
||||||
|
import java.util.EnumSet;
|
||||||
|
|
||||||
|
import de.dennisguse.opentracks.R;
|
||||||
import de.dennisguse.opentracks.TrackDetailActivity;
|
import de.dennisguse.opentracks.TrackDetailActivity;
|
||||||
import de.dennisguse.opentracks.content.Track;
|
import de.dennisguse.opentracks.content.Track;
|
||||||
import de.dennisguse.opentracks.content.TrackDataHub;
|
import de.dennisguse.opentracks.content.TrackDataHub;
|
||||||
@@ -40,6 +43,7 @@ import de.dennisguse.opentracks.content.Waypoint;
|
|||||||
import de.dennisguse.opentracks.content.sensor.SensorDataSet;
|
import de.dennisguse.opentracks.content.sensor.SensorDataSet;
|
||||||
import de.dennisguse.opentracks.services.ITrackRecordingService;
|
import de.dennisguse.opentracks.services.ITrackRecordingService;
|
||||||
import de.dennisguse.opentracks.services.TrackRecordingServiceConnection;
|
import de.dennisguse.opentracks.services.TrackRecordingServiceConnection;
|
||||||
|
import de.dennisguse.opentracks.services.sensors.RemoteSensorManager;
|
||||||
import de.dennisguse.opentracks.stats.TripStatistics;
|
import de.dennisguse.opentracks.stats.TripStatistics;
|
||||||
import de.dennisguse.opentracks.util.LocationUtils;
|
import de.dennisguse.opentracks.util.LocationUtils;
|
||||||
import de.dennisguse.opentracks.util.PreferencesUtils;
|
import de.dennisguse.opentracks.util.PreferencesUtils;
|
||||||
@@ -47,9 +51,6 @@ import de.dennisguse.opentracks.util.StatsUtils;
|
|||||||
import de.dennisguse.opentracks.util.TrackIconUtils;
|
import de.dennisguse.opentracks.util.TrackIconUtils;
|
||||||
import de.dennisguse.opentracks.util.TrackRecordingServiceConnectionUtils;
|
import de.dennisguse.opentracks.util.TrackRecordingServiceConnectionUtils;
|
||||||
import de.dennisguse.opentracks.util.UnitConversions;
|
import de.dennisguse.opentracks.util.UnitConversions;
|
||||||
import de.dennisguse.opentracks.R;
|
|
||||||
|
|
||||||
import java.util.EnumSet;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A fragment to display track statistics to the user.
|
* A fragment to display track statistics to the user.
|
||||||
@@ -297,7 +298,7 @@ public class StatsFragment extends Fragment implements TrackDataListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tries to fetch most recent {@link SensorDataSet} {@link de.dennisguse.opentracks.services.sensors.SensorManager}.
|
* Tries to fetch most recent {@link SensorDataSet} {@link RemoteSensorManager}.
|
||||||
*/
|
*/
|
||||||
private void updateSensorDataUI() {
|
private void updateSensorDataUI() {
|
||||||
ITrackRecordingService trackRecordingService = trackRecordingServiceConnection.getServiceIfBound();
|
ITrackRecordingService trackRecordingService = trackRecordingServiceConnection.getServiceIfBound();
|
||||||
|
|||||||
@@ -58,8 +58,8 @@ import de.dennisguse.opentracks.content.Waypoint.WaypointType;
|
|||||||
import de.dennisguse.opentracks.content.WaypointCreationRequest;
|
import de.dennisguse.opentracks.content.WaypointCreationRequest;
|
||||||
import de.dennisguse.opentracks.content.sensor.SensorDataSet;
|
import de.dennisguse.opentracks.content.sensor.SensorDataSet;
|
||||||
import de.dennisguse.opentracks.content.sensor.SensorState;
|
import de.dennisguse.opentracks.content.sensor.SensorState;
|
||||||
import de.dennisguse.opentracks.services.sensors.SensorManager;
|
import de.dennisguse.opentracks.services.sensors.RemoteSensorManager;
|
||||||
import de.dennisguse.opentracks.services.sensors.SensorManagerFactory;
|
import de.dennisguse.opentracks.services.sensors.RemoteSensorManagerFactory;
|
||||||
import de.dennisguse.opentracks.services.tasks.AnnouncementPeriodicTaskFactory;
|
import de.dennisguse.opentracks.services.tasks.AnnouncementPeriodicTaskFactory;
|
||||||
import de.dennisguse.opentracks.services.tasks.PeriodicTaskExecutor;
|
import de.dennisguse.opentracks.services.tasks.PeriodicTaskExecutor;
|
||||||
import de.dennisguse.opentracks.services.tasks.SplitPeriodicTaskFactory;
|
import de.dennisguse.opentracks.services.tasks.SplitPeriodicTaskFactory;
|
||||||
@@ -181,7 +181,7 @@ public class TrackRecordingService extends Service {
|
|||||||
};
|
};
|
||||||
private TripStatisticsUpdater markerTripStatisticsUpdater;
|
private TripStatisticsUpdater markerTripStatisticsUpdater;
|
||||||
private WakeLock wakeLock;
|
private WakeLock wakeLock;
|
||||||
private SensorManager sensorManager;
|
private RemoteSensorManager remoteSensorManager;
|
||||||
private Location lastLocation;
|
private Location lastLocation;
|
||||||
private boolean currentSegmentHasLocation;
|
private boolean currentSegmentHasLocation;
|
||||||
private boolean isIdle; // true if idle
|
private boolean isIdle; // true if idle
|
||||||
@@ -280,9 +280,9 @@ public class TrackRecordingService extends Service {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDestroy() {
|
public void onDestroy() {
|
||||||
if (sensorManager != null) {
|
if (remoteSensorManager != null) {
|
||||||
SensorManagerFactory.releaseSystemSensorManager();
|
RemoteSensorManagerFactory.releaseSystemSensorManager();
|
||||||
sensorManager = null;
|
remoteSensorManager = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reverse order from onCreate
|
// Reverse order from onCreate
|
||||||
@@ -617,7 +617,7 @@ public class TrackRecordingService extends Service {
|
|||||||
*/
|
*/
|
||||||
private void startRecording(boolean trackStarted) {
|
private void startRecording(boolean trackStarted) {
|
||||||
// Update instance variables
|
// Update instance variables
|
||||||
sensorManager = SensorManagerFactory.getSystemSensorManager(this);
|
remoteSensorManager = RemoteSensorManagerFactory.getSystemSensorManager(this);
|
||||||
lastLocation = null;
|
lastLocation = null;
|
||||||
currentSegmentHasLocation = false;
|
currentSegmentHasLocation = false;
|
||||||
isIdle = false;
|
isIdle = false;
|
||||||
@@ -715,9 +715,9 @@ public class TrackRecordingService extends Service {
|
|||||||
splitExecutor.shutdown();
|
splitExecutor.shutdown();
|
||||||
|
|
||||||
// Update instance variables
|
// Update instance variables
|
||||||
if (sensorManager != null) {
|
if (remoteSensorManager != null) {
|
||||||
SensorManagerFactory.releaseSystemSensorManager();
|
RemoteSensorManagerFactory.releaseSystemSensorManager();
|
||||||
sensorManager = null;
|
remoteSensorManager = null;
|
||||||
}
|
}
|
||||||
lastLocation = null;
|
lastLocation = null;
|
||||||
|
|
||||||
@@ -931,10 +931,10 @@ public class TrackRecordingService extends Service {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private SensorDataSet getSensorDataSet() {
|
private SensorDataSet getSensorDataSet() {
|
||||||
if (sensorManager == null || !sensorManager.isEnabled() || !sensorManager.isSensorDataSetValid()) {
|
if (remoteSensorManager == null || !remoteSensorManager.isEnabled() || !remoteSensorManager.isSensorDataSetValid()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return sensorManager.getSensorDataSet();
|
return remoteSensorManager.getSensorDataSet();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1104,24 +1104,24 @@ public class TrackRecordingService extends Service {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SensorDataSet getSensorData() {
|
public SensorDataSet getSensorData() {
|
||||||
if (trackRecordingService.sensorManager == null) {
|
if (trackRecordingService.remoteSensorManager == null) {
|
||||||
Log.d(TAG, "sensorManager is null.");
|
Log.d(TAG, "remoteSensorManager is null.");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (trackRecordingService.getSensorDataSet() == null) {
|
if (trackRecordingService.getSensorDataSet() == null) {
|
||||||
Log.d(TAG, "Sensor data set is null.");
|
Log.d(TAG, "Sensor data set is null.");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return trackRecordingService.sensorManager.getSensorDataSet();
|
return trackRecordingService.remoteSensorManager.getSensorDataSet();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SensorState getSensorState() {
|
public SensorState getSensorState() {
|
||||||
if (trackRecordingService.sensorManager == null) {
|
if (trackRecordingService.remoteSensorManager == null) {
|
||||||
Log.d(TAG, "sensorManager is null.");
|
Log.d(TAG, "remoteSensorManager is null.");
|
||||||
return SensorState.NONE;
|
return SensorState.NONE;
|
||||||
}
|
}
|
||||||
return trackRecordingService.sensorManager.getSensorState();
|
return trackRecordingService.remoteSensorManager.getSensorState();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+5
-5
@@ -24,13 +24,13 @@ import android.os.Looper;
|
|||||||
import android.os.Message;
|
import android.os.Message;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import de.dennisguse.opentracks.R;
|
||||||
import de.dennisguse.opentracks.content.sensor.SensorDataSet;
|
import de.dennisguse.opentracks.content.sensor.SensorDataSet;
|
||||||
import de.dennisguse.opentracks.content.sensor.SensorState;
|
import de.dennisguse.opentracks.content.sensor.SensorState;
|
||||||
import de.dennisguse.opentracks.util.PreferencesUtils;
|
import de.dennisguse.opentracks.util.PreferencesUtils;
|
||||||
import de.dennisguse.opentracks.util.UnitConversions;
|
import de.dennisguse.opentracks.util.UnitConversions;
|
||||||
import de.dennisguse.opentracks.R;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Bluetooth sensor manager.
|
* Bluetooth sensor manager.
|
||||||
@@ -39,7 +39,7 @@ import java.util.ArrayList;
|
|||||||
*
|
*
|
||||||
* @author Sandor Dornbush
|
* @author Sandor Dornbush
|
||||||
*/
|
*/
|
||||||
public class BluetoothSensorManager extends SensorManager {
|
public class BluetoothRemoteSensorManager extends RemoteSensorManager {
|
||||||
|
|
||||||
private static final String TAG = BluetoothConnectionManager.class.getSimpleName();
|
private static final String TAG = BluetoothConnectionManager.class.getSimpleName();
|
||||||
private static final BluetoothAdapter bluetoothAdapter = getDefaultBluetoothAdapter();
|
private static final BluetoothAdapter bluetoothAdapter = getDefaultBluetoothAdapter();
|
||||||
@@ -71,7 +71,7 @@ public class BluetoothSensorManager extends SensorManager {
|
|||||||
/**
|
/**
|
||||||
* @param context the context
|
* @param context the context
|
||||||
*/
|
*/
|
||||||
public BluetoothSensorManager(Context context) {
|
public BluetoothRemoteSensorManager(Context context) {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
bluetoothConnectionManager = new BluetoothConnectionManager(context, messageHandler);
|
bluetoothConnectionManager = new BluetoothConnectionManager(context, messageHandler);
|
||||||
}
|
}
|
||||||
+7
-7
@@ -18,23 +18,23 @@ package de.dennisguse.opentracks.services.sensors;
|
|||||||
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import de.dennisguse.opentracks.content.sensor.SensorDataSet;
|
|
||||||
import de.dennisguse.opentracks.content.sensor.SensorState;
|
|
||||||
|
|
||||||
import java.util.Timer;
|
import java.util.Timer;
|
||||||
import java.util.TimerTask;
|
import java.util.TimerTask;
|
||||||
|
|
||||||
|
import de.dennisguse.opentracks.content.sensor.SensorDataSet;
|
||||||
|
import de.dennisguse.opentracks.content.sensor.SensorState;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Manage the connection to a sensor.
|
* Manage the connection to a remote sensor.
|
||||||
*
|
*
|
||||||
* @author Sandor Dornbush
|
* @author Sandor Dornbush
|
||||||
*/
|
*/
|
||||||
public abstract class SensorManager {
|
public abstract class RemoteSensorManager {
|
||||||
|
|
||||||
public static final long MAX_SENSOR_DATE_SET_AGE = 5000;
|
public static final long MAX_SENSOR_DATE_SET_AGE = 5000;
|
||||||
public static final long MAX_SENSOR_STATE_AGE = 20000;
|
public static final long MAX_SENSOR_STATE_AGE = 20000;
|
||||||
|
|
||||||
private static final String TAG = SensorManager.class.getSimpleName();
|
private static final String TAG = RemoteSensorManager.class.getSimpleName();
|
||||||
private static final int RETRY_PERIOD = 20000;
|
private static final int RETRY_PERIOD = 20000;
|
||||||
|
|
||||||
private SensorState sensorState = SensorState.NONE;
|
private SensorState sensorState = SensorState.NONE;
|
||||||
@@ -88,7 +88,7 @@ public abstract class SensorManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
timer = new Timer(SensorManager.class.getSimpleName());
|
timer = new Timer(RemoteSensorManager.class.getSimpleName());
|
||||||
timer.schedule(timerTask, RETRY_PERIOD, RETRY_PERIOD);
|
timer.schedule(timerTask, RETRY_PERIOD, RETRY_PERIOD);
|
||||||
}
|
}
|
||||||
|
|
||||||
+22
-26
@@ -19,16 +19,16 @@ package de.dennisguse.opentracks.services.sensors;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A factory of {@link SensorManager}.
|
* A factory of {@link RemoteSensorManager}.
|
||||||
*
|
*
|
||||||
* @author Sandor Dornbush
|
* @author Sandor Dornbush
|
||||||
*/
|
*/
|
||||||
public class SensorManagerFactory {
|
public class RemoteSensorManagerFactory {
|
||||||
|
|
||||||
private static SensorManager systemSensorManager = null;
|
private static RemoteSensorManager remoteSensorManagerSystem = null;
|
||||||
private static SensorManager sensorManagerTemporary = null;
|
private static RemoteSensorManager remoteSensorManagerTemporary = null;
|
||||||
|
|
||||||
private SensorManagerFactory() {
|
private RemoteSensorManagerFactory() {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -36,49 +36,45 @@ public class SensorManagerFactory {
|
|||||||
*
|
*
|
||||||
* @param context the context
|
* @param context the context
|
||||||
*/
|
*/
|
||||||
public static SensorManager getSystemSensorManager(Context context) {
|
public static RemoteSensorManager getSystemSensorManager(Context context) {
|
||||||
releaseSensorManagerTemporary();
|
releaseSensorManagerTemporary();
|
||||||
releaseSystemSensorManager();
|
releaseSystemSensorManager();
|
||||||
systemSensorManager = getSensorManager(context);
|
remoteSensorManagerSystem = getSensorManager(context);
|
||||||
if (systemSensorManager != null) {
|
remoteSensorManagerSystem.startSensor();
|
||||||
systemSensorManager.startSensor();
|
return remoteSensorManagerSystem;
|
||||||
}
|
|
||||||
return systemSensorManager;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Releases the system sensor manager.
|
* Releases the system sensor manager.
|
||||||
*/
|
*/
|
||||||
public static void releaseSystemSensorManager() {
|
public static void releaseSystemSensorManager() {
|
||||||
if (systemSensorManager != null) {
|
if (remoteSensorManagerSystem != null) {
|
||||||
systemSensorManager.stopSensor();
|
remoteSensorManagerSystem.stopSensor();
|
||||||
}
|
}
|
||||||
systemSensorManager = null;
|
remoteSensorManagerSystem = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the temp sensor manager.
|
* Gets the temp sensor manager.
|
||||||
*/
|
*/
|
||||||
public static SensorManager getSensorManagerTemporary(Context context) {
|
public static RemoteSensorManager getSensorManagerTemporary(Context context) {
|
||||||
releaseSensorManagerTemporary();
|
releaseSensorManagerTemporary();
|
||||||
if (systemSensorManager != null) {
|
if (remoteSensorManagerSystem != null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
sensorManagerTemporary = getSensorManager(context);
|
remoteSensorManagerTemporary = getSensorManager(context);
|
||||||
if (sensorManagerTemporary != null) {
|
remoteSensorManagerTemporary.startSensor();
|
||||||
sensorManagerTemporary.startSensor();
|
return remoteSensorManagerTemporary;
|
||||||
}
|
|
||||||
return sensorManagerTemporary;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Releases the temp sensor manager.
|
* Releases the temp sensor manager.
|
||||||
*/
|
*/
|
||||||
public static void releaseSensorManagerTemporary() {
|
public static void releaseSensorManagerTemporary() {
|
||||||
if (sensorManagerTemporary != null) {
|
if (remoteSensorManagerTemporary != null) {
|
||||||
sensorManagerTemporary.stopSensor();
|
remoteSensorManagerTemporary.stopSensor();
|
||||||
}
|
}
|
||||||
sensorManagerTemporary = null;
|
remoteSensorManagerTemporary = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -86,7 +82,7 @@ public class SensorManagerFactory {
|
|||||||
*
|
*
|
||||||
* @param context the context
|
* @param context the context
|
||||||
*/
|
*/
|
||||||
private static SensorManager getSensorManager(Context context) {
|
private static RemoteSensorManager getSensorManager(Context context) {
|
||||||
return new BluetoothSensorManager(context);
|
return new BluetoothRemoteSensorManager(context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -23,13 +23,13 @@ import android.view.View;
|
|||||||
import android.widget.Spinner;
|
import android.widget.Spinner;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import de.dennisguse.opentracks.content.sensor.SensorDataSet;
|
|
||||||
import de.dennisguse.opentracks.services.sensors.SensorManager;
|
|
||||||
import de.dennisguse.opentracks.stats.TripStatistics;
|
|
||||||
import de.dennisguse.opentracks.R;
|
|
||||||
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
|
import de.dennisguse.opentracks.R;
|
||||||
|
import de.dennisguse.opentracks.content.sensor.SensorDataSet;
|
||||||
|
import de.dennisguse.opentracks.services.sensors.RemoteSensorManager;
|
||||||
|
import de.dennisguse.opentracks.stats.TripStatistics;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utilities for updating the statistics UI labels and values.
|
* Utilities for updating the statistics UI labels and values.
|
||||||
*
|
*
|
||||||
@@ -294,7 +294,7 @@ public class StatsUtils {
|
|||||||
private static void setHeartRateData(Context context, View viewValue, View viewSensor, SensorDataSet sensorDataSet) {
|
private static void setHeartRateData(Context context, View viewValue, View viewSensor, SensorDataSet sensorDataSet) {
|
||||||
String heartRate = context.getString(R.string.value_unknown);
|
String heartRate = context.getString(R.string.value_unknown);
|
||||||
String sensor = context.getString(R.string.value_unknown);
|
String sensor = context.getString(R.string.value_unknown);
|
||||||
if (sensorDataSet != null && sensorDataSet.hasHeartRate() && sensorDataSet.isRecent(SensorManager.MAX_SENSOR_DATE_SET_AGE)) {
|
if (sensorDataSet != null && sensorDataSet.hasHeartRate() && sensorDataSet.isRecent(RemoteSensorManager.MAX_SENSOR_DATE_SET_AGE)) {
|
||||||
heartRate = StringUtils.formatDecimal(sensorDataSet.getHeartRate(), 0);
|
heartRate = StringUtils.formatDecimal(sensorDataSet.getHeartRate(), 0);
|
||||||
sensor = sensorDataSet.getSensorName();
|
sensor = sensorDataSet.getSensorName();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -122,7 +122,7 @@ limitations under the License.
|
|||||||
<include
|
<include
|
||||||
android:id="@+id/stats_elevation"
|
android:id="@+id/stats_elevation"
|
||||||
layout="@layout/stats_small_group_item" />
|
layout="@layout/stats_small_group_item" />
|
||||||
<!-- TODO DISABLED AS computation from GPS is not precise enough, go for getAltitude(SensorManager.PRESSURE_STANDARD_ATMOSPHERE, pressure) -->
|
<!-- TODO DISABLED AS computation from GPS is not precise enough, go for getAltitude(RemoteSensorManager.PRESSURE_STANDARD_ATMOSPHERE, pressure) -->
|
||||||
<!-- Elevation gain -->
|
<!-- Elevation gain -->
|
||||||
<!--<include-->
|
<!--<include-->
|
||||||
<!--android:id="@+id/stats_elevation_gain"-->
|
<!--android:id="@+id/stats_elevation_gain"-->
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ limitations under the License.
|
|||||||
android:id="@+id/stats_elevation"
|
android:id="@+id/stats_elevation"
|
||||||
layout="@layout/stats_small_group_item" />
|
layout="@layout/stats_small_group_item" />
|
||||||
<!-- Elevation gain -->
|
<!-- Elevation gain -->
|
||||||
<!-- TODO DISABLED AS computation from GPS is not precise enough, go for getAltitude(SensorManager.PRESSURE_STANDARD_ATMOSPHERE, pressure) -->
|
<!-- TODO DISABLED AS computation from GPS is not precise enough, go for getAltitude(RemoteSensorManager.PRESSURE_STANDARD_ATMOSPHERE, pressure) -->
|
||||||
<!--<include-->
|
<!--<include-->
|
||||||
<!--android:id="@+id/stats_elevation_gain"-->
|
<!--android:id="@+id/stats_elevation_gain"-->
|
||||||
<!--layout="@layout/stats_small_group_item" />-->
|
<!--layout="@layout/stats_small_group_item" />-->
|
||||||
|
|||||||
Reference in New Issue
Block a user