Rearranged app packages and started splitting classes
This commit is contained in:
Generated
+27
@@ -1,5 +1,32 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project version="4">
|
<project version="4">
|
||||||
|
<component name="EntryPointsManager">
|
||||||
|
<entry_points version="2.0" />
|
||||||
|
</component>
|
||||||
|
<component name="NullableNotNullManager">
|
||||||
|
<option name="myDefaultNullable" value="android.support.annotation.Nullable" />
|
||||||
|
<option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
|
||||||
|
<option name="myNullables">
|
||||||
|
<value>
|
||||||
|
<list size="4">
|
||||||
|
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
|
||||||
|
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
|
||||||
|
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
|
||||||
|
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
|
||||||
|
</list>
|
||||||
|
</value>
|
||||||
|
</option>
|
||||||
|
<option name="myNotNulls">
|
||||||
|
<value>
|
||||||
|
<list size="4">
|
||||||
|
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
|
||||||
|
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
|
||||||
|
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
|
||||||
|
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
|
||||||
|
</list>
|
||||||
|
</value>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
|
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
|
||||||
<OptionsSetting value="true" id="Add" />
|
<OptionsSetting value="true" id="Add" />
|
||||||
<OptionsSetting value="true" id="Remove" />
|
<OptionsSetting value="true" id="Remove" />
|
||||||
|
|||||||
@@ -82,6 +82,7 @@
|
|||||||
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
|
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
|
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
|
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/builds" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
|
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
|
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
|
||||||
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />
|
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:theme="@style/AppTheme">
|
android:theme="@style/AppTheme">
|
||||||
<activity
|
<activity
|
||||||
android:name="uk.co.alt236.btlescan.activities.MainActivity"
|
android:name=".ui.main.MainActivity"
|
||||||
android:label="@string/app_name">
|
android:label="@string/app_name">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN"/>
|
<action android:name="android.intent.action.MAIN"/>
|
||||||
@@ -26,10 +26,10 @@
|
|||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
<activity
|
<activity
|
||||||
android:name="uk.co.alt236.btlescan.activities.DeviceDetailsActivity"
|
android:name=".ui.details.DeviceDetailsActivity"
|
||||||
android:label="@string/app_name">
|
android:label="@string/app_name">
|
||||||
</activity>
|
</activity>
|
||||||
<activity android:name="uk.co.alt236.btlescan.activities.DeviceControlActivity"/>
|
<activity android:name=".ui.control.DeviceControlActivity"/>
|
||||||
|
|
||||||
<service
|
<service
|
||||||
android:name="uk.co.alt236.btlescan.services.BluetoothLeService"
|
android:name="uk.co.alt236.btlescan.services.BluetoothLeService"
|
||||||
|
|||||||
+5
-52
@@ -14,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package uk.co.alt236.btlescan.activities;
|
package uk.co.alt236.btlescan.ui.control;
|
||||||
|
|
||||||
import android.bluetooth.BluetoothGattCharacteristic;
|
import android.bluetooth.BluetoothGattCharacteristic;
|
||||||
import android.bluetooth.BluetoothGattService;
|
import android.bluetooth.BluetoothGattService;
|
||||||
@@ -71,6 +71,7 @@ public class DeviceControlActivity extends AppCompatActivity {
|
|||||||
protected TextView mDataAsString;
|
protected TextView mDataAsString;
|
||||||
@Bind(R.id.data_as_array)
|
@Bind(R.id.data_as_array)
|
||||||
protected TextView mDataAsArray;
|
protected TextView mDataAsArray;
|
||||||
|
private Exporter mExporter;
|
||||||
private BluetoothGattCharacteristic mNotifyCharacteristic;
|
private BluetoothGattCharacteristic mNotifyCharacteristic;
|
||||||
private BluetoothLeService mBluetoothLeService;
|
private BluetoothLeService mBluetoothLeService;
|
||||||
private List<List<BluetoothGattCharacteristic>> mGattCharacteristics = new ArrayList<>();
|
private List<List<BluetoothGattCharacteristic>> mGattCharacteristics = new ArrayList<>();
|
||||||
@@ -172,7 +173,7 @@ public class DeviceControlActivity extends AppCompatActivity {
|
|||||||
// on the UI.
|
// on the UI.
|
||||||
private void displayGattServices(final List<BluetoothGattService> gattServices) {
|
private void displayGattServices(final List<BluetoothGattService> gattServices) {
|
||||||
if (gattServices == null) return;
|
if (gattServices == null) return;
|
||||||
generateExportString(gattServices);
|
mExportString = mExporter.generateExportString(mDeviceName, mDeviceAddress, gattServices);
|
||||||
|
|
||||||
String uuid = null;
|
String uuid = null;
|
||||||
final String unknownServiceString = getResources().getString(R.string.unknown_service);
|
final String unknownServiceString = getResources().getString(R.string.unknown_service);
|
||||||
@@ -223,55 +224,6 @@ public class DeviceControlActivity extends AppCompatActivity {
|
|||||||
invalidateOptionsMenu();
|
invalidateOptionsMenu();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void generateExportString(final List<BluetoothGattService> gattServices) {
|
|
||||||
final String unknownServiceString = getResources().getString(R.string.unknown_service);
|
|
||||||
final String unknownCharaString = getResources().getString(R.string.unknown_characteristic);
|
|
||||||
final StringBuilder exportBuilder = new StringBuilder();
|
|
||||||
|
|
||||||
exportBuilder.append("Device Name: ");
|
|
||||||
exportBuilder.append(mDeviceName);
|
|
||||||
exportBuilder.append('\n');
|
|
||||||
exportBuilder.append("Device Address: ");
|
|
||||||
exportBuilder.append(mDeviceAddress);
|
|
||||||
exportBuilder.append('\n');
|
|
||||||
exportBuilder.append('\n');
|
|
||||||
|
|
||||||
exportBuilder.append("Services:");
|
|
||||||
exportBuilder.append("--------------------------");
|
|
||||||
exportBuilder.append('\n');
|
|
||||||
|
|
||||||
String uuid = null;
|
|
||||||
for (final BluetoothGattService gattService : gattServices) {
|
|
||||||
uuid = gattService.getUuid().toString();
|
|
||||||
|
|
||||||
exportBuilder.append(GattAttributeResolver.getAttributeName(uuid, unknownServiceString));
|
|
||||||
exportBuilder.append(" (");
|
|
||||||
exportBuilder.append(uuid);
|
|
||||||
exportBuilder.append(')');
|
|
||||||
exportBuilder.append('\n');
|
|
||||||
|
|
||||||
final List<BluetoothGattCharacteristic> gattCharacteristics = gattService.getCharacteristics();
|
|
||||||
for (final BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics) {
|
|
||||||
uuid = gattCharacteristic.getUuid().toString();
|
|
||||||
|
|
||||||
exportBuilder.append('\t');
|
|
||||||
exportBuilder.append(GattAttributeResolver.getAttributeName(uuid, unknownCharaString));
|
|
||||||
exportBuilder.append(" (");
|
|
||||||
exportBuilder.append(uuid);
|
|
||||||
exportBuilder.append(')');
|
|
||||||
exportBuilder.append('\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
exportBuilder.append('\n');
|
|
||||||
exportBuilder.append('\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
exportBuilder.append("--------------------------");
|
|
||||||
exportBuilder.append('\n');
|
|
||||||
|
|
||||||
mExportString = exportBuilder.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(final Bundle savedInstanceState) {
|
public void onCreate(final Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
@@ -281,7 +233,6 @@ public class DeviceControlActivity extends AppCompatActivity {
|
|||||||
final BluetoothLeDevice device = intent.getParcelableExtra(EXTRA_DEVICE);
|
final BluetoothLeDevice device = intent.getParcelableExtra(EXTRA_DEVICE);
|
||||||
mDeviceName = device.getName();
|
mDeviceName = device.getName();
|
||||||
mDeviceAddress = device.getAddress();
|
mDeviceAddress = device.getAddress();
|
||||||
|
|
||||||
ButterKnife.bind(this);
|
ButterKnife.bind(this);
|
||||||
|
|
||||||
// Sets up UI references.
|
// Sets up UI references.
|
||||||
@@ -291,6 +242,8 @@ public class DeviceControlActivity extends AppCompatActivity {
|
|||||||
getSupportActionBar().setTitle(mDeviceName);
|
getSupportActionBar().setTitle(mDeviceName);
|
||||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||||
|
|
||||||
|
mExporter = new Exporter(this);
|
||||||
|
|
||||||
final Intent gattServiceIntent = new Intent(this, BluetoothLeService.class);
|
final Intent gattServiceIntent = new Intent(this, BluetoothLeService.class);
|
||||||
bindService(gattServiceIntent, mServiceConnection, BIND_AUTO_CREATE);
|
bindService(gattServiceIntent, mServiceConnection, BIND_AUTO_CREATE);
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
package uk.co.alt236.btlescan.ui.control;
|
||||||
|
|
||||||
|
import android.bluetooth.BluetoothGattCharacteristic;
|
||||||
|
import android.bluetooth.BluetoothGattService;
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import uk.co.alt236.bluetoothlelib.resolvers.GattAttributeResolver;
|
||||||
|
import uk.co.alt236.btlescan.R;
|
||||||
|
|
||||||
|
/*package*/ class Exporter {
|
||||||
|
private final Context mContext;
|
||||||
|
|
||||||
|
public Exporter(final Context context) {
|
||||||
|
mContext = context.getApplicationContext();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String generateExportString(final String deviceName,
|
||||||
|
final String deviceAddress,
|
||||||
|
final List<BluetoothGattService> gattServices) {
|
||||||
|
|
||||||
|
final String unknownServiceString = mContext.getString(R.string.unknown_service);
|
||||||
|
final String unknownCharaString = mContext.getString(R.string.unknown_characteristic);
|
||||||
|
final StringBuilder exportBuilder = new StringBuilder();
|
||||||
|
|
||||||
|
exportBuilder.append("Device Name: ");
|
||||||
|
exportBuilder.append(deviceName);
|
||||||
|
exportBuilder.append('\n');
|
||||||
|
exportBuilder.append("Device Address: ");
|
||||||
|
exportBuilder.append(deviceAddress);
|
||||||
|
exportBuilder.append('\n');
|
||||||
|
exportBuilder.append('\n');
|
||||||
|
|
||||||
|
exportBuilder.append("Services:");
|
||||||
|
exportBuilder.append("--------------------------");
|
||||||
|
exportBuilder.append('\n');
|
||||||
|
|
||||||
|
String uuid = null;
|
||||||
|
for (final BluetoothGattService gattService : gattServices) {
|
||||||
|
uuid = gattService.getUuid().toString();
|
||||||
|
|
||||||
|
exportBuilder.append(GattAttributeResolver.getAttributeName(uuid, unknownServiceString));
|
||||||
|
exportBuilder.append(" (");
|
||||||
|
exportBuilder.append(uuid);
|
||||||
|
exportBuilder.append(')');
|
||||||
|
exportBuilder.append('\n');
|
||||||
|
|
||||||
|
final List<BluetoothGattCharacteristic> gattCharacteristics = gattService.getCharacteristics();
|
||||||
|
for (final BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics) {
|
||||||
|
uuid = gattCharacteristic.getUuid().toString();
|
||||||
|
|
||||||
|
exportBuilder.append('\t');
|
||||||
|
exportBuilder.append(GattAttributeResolver.getAttributeName(uuid, unknownCharaString));
|
||||||
|
exportBuilder.append(" (");
|
||||||
|
exportBuilder.append(uuid);
|
||||||
|
exportBuilder.append(')');
|
||||||
|
exportBuilder.append('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
exportBuilder.append('\n');
|
||||||
|
exportBuilder.append('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
exportBuilder.append("--------------------------");
|
||||||
|
exportBuilder.append('\n');
|
||||||
|
|
||||||
|
return exportBuilder.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
+2
-1
@@ -1,4 +1,4 @@
|
|||||||
package uk.co.alt236.btlescan.activities;
|
package uk.co.alt236.btlescan.ui.details;
|
||||||
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
@@ -28,6 +28,7 @@ import uk.co.alt236.bluetoothlelib.resolvers.CompanyIdentifierResolver;
|
|||||||
import uk.co.alt236.bluetoothlelib.util.AdRecordUtils;
|
import uk.co.alt236.bluetoothlelib.util.AdRecordUtils;
|
||||||
import uk.co.alt236.bluetoothlelib.util.ByteUtils;
|
import uk.co.alt236.bluetoothlelib.util.ByteUtils;
|
||||||
import uk.co.alt236.btlescan.R;
|
import uk.co.alt236.btlescan.R;
|
||||||
|
import uk.co.alt236.btlescan.ui.control.DeviceControlActivity;
|
||||||
import uk.co.alt236.btlescan.util.TimeFormatter;
|
import uk.co.alt236.btlescan.util.TimeFormatter;
|
||||||
|
|
||||||
public class DeviceDetailsActivity extends AppCompatActivity {
|
public class DeviceDetailsActivity extends AppCompatActivity {
|
||||||
+3
-3
@@ -1,4 +1,4 @@
|
|||||||
package uk.co.alt236.btlescan.adapters;
|
package uk.co.alt236.btlescan.ui.main;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.support.v4.widget.SimpleCursorAdapter;
|
import android.support.v4.widget.SimpleCursorAdapter;
|
||||||
@@ -17,11 +17,11 @@ import uk.co.alt236.btlescan.util.Constants;
|
|||||||
import uk.co.alt236.easycursor.objectcursor.EasyObjectCursor;
|
import uk.co.alt236.easycursor.objectcursor.EasyObjectCursor;
|
||||||
|
|
||||||
// Adapter for holding devices found through scanning.
|
// Adapter for holding devices found through scanning.
|
||||||
public class LeDeviceListAdapter extends SimpleCursorAdapter {
|
/*package*/ class DeviceListAdapter extends SimpleCursorAdapter {
|
||||||
private final LayoutInflater mInflator;
|
private final LayoutInflater mInflator;
|
||||||
private final Activity mActivity;
|
private final Activity mActivity;
|
||||||
|
|
||||||
public LeDeviceListAdapter(final Activity activity, final EasyObjectCursor<BluetoothLeDevice> cursor) {
|
public DeviceListAdapter(final Activity activity, final EasyObjectCursor<BluetoothLeDevice> cursor) {
|
||||||
super(activity, R.layout.list_item_device, cursor, new String[0], new int[0], 0);
|
super(activity, R.layout.list_item_device, cursor, new String[0], new int[0], 0);
|
||||||
mInflator = activity.getLayoutInflater();
|
mInflator = activity.getLayoutInflater();
|
||||||
mActivity = activity;
|
mActivity = activity;
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package uk.co.alt236.btlescan.activities;
|
package uk.co.alt236.btlescan.ui.main;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.Dialog;
|
import android.app.Dialog;
|
||||||
+8
-8
@@ -1,4 +1,4 @@
|
|||||||
package uk.co.alt236.btlescan.activities;
|
package uk.co.alt236.btlescan.ui.main;
|
||||||
|
|
||||||
import android.Manifest;
|
import android.Manifest;
|
||||||
import android.bluetooth.BluetoothAdapter;
|
import android.bluetooth.BluetoothAdapter;
|
||||||
@@ -22,8 +22,8 @@ import butterknife.Bind;
|
|||||||
import butterknife.ButterKnife;
|
import butterknife.ButterKnife;
|
||||||
import uk.co.alt236.bluetoothlelib.device.BluetoothLeDevice;
|
import uk.co.alt236.bluetoothlelib.device.BluetoothLeDevice;
|
||||||
import uk.co.alt236.btlescan.R;
|
import uk.co.alt236.btlescan.R;
|
||||||
import uk.co.alt236.btlescan.adapters.LeDeviceListAdapter;
|
|
||||||
import uk.co.alt236.btlescan.containers.BluetoothLeDeviceStore;
|
import uk.co.alt236.btlescan.containers.BluetoothLeDeviceStore;
|
||||||
|
import uk.co.alt236.btlescan.ui.details.DeviceDetailsActivity;
|
||||||
import uk.co.alt236.btlescan.util.BluetoothLeScanner;
|
import uk.co.alt236.btlescan.util.BluetoothLeScanner;
|
||||||
import uk.co.alt236.btlescan.util.BluetoothUtils;
|
import uk.co.alt236.btlescan.util.BluetoothUtils;
|
||||||
import uk.co.alt236.easycursor.objectcursor.EasyObjectCursor;
|
import uk.co.alt236.easycursor.objectcursor.EasyObjectCursor;
|
||||||
@@ -42,7 +42,7 @@ public class MainActivity extends AppCompatActivity implements AdapterView.OnIte
|
|||||||
|
|
||||||
private BluetoothUtils mBluetoothUtils;
|
private BluetoothUtils mBluetoothUtils;
|
||||||
private BluetoothLeScanner mScanner;
|
private BluetoothLeScanner mScanner;
|
||||||
private LeDeviceListAdapter mLeDeviceListAdapter;
|
private DeviceListAdapter mDeviceListAdapter;
|
||||||
private BluetoothLeDeviceStore mDeviceStore;
|
private BluetoothLeDeviceStore mDeviceStore;
|
||||||
|
|
||||||
private final BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {
|
private final BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {
|
||||||
@@ -56,8 +56,8 @@ public class MainActivity extends AppCompatActivity implements AdapterView.OnIte
|
|||||||
runOnUiThread(new Runnable() {
|
runOnUiThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
mLeDeviceListAdapter.swapCursor(c);
|
mDeviceListAdapter.swapCursor(c);
|
||||||
updateItemCount(mLeDeviceListAdapter.getCount());
|
updateItemCount(mDeviceListAdapter.getCount());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -100,7 +100,7 @@ public class MainActivity extends AppCompatActivity implements AdapterView.OnIte
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
|
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
|
||||||
final BluetoothLeDevice device = mLeDeviceListAdapter.getItem(position);
|
final BluetoothLeDevice device = mDeviceListAdapter.getItem(position);
|
||||||
if (device == null) return;
|
if (device == null) return;
|
||||||
|
|
||||||
final Intent intent = new Intent(this, DeviceDetailsActivity.class);
|
final Intent intent = new Intent(this, DeviceDetailsActivity.class);
|
||||||
@@ -176,8 +176,8 @@ public class MainActivity extends AppCompatActivity implements AdapterView.OnIte
|
|||||||
mDeviceStore.clear();
|
mDeviceStore.clear();
|
||||||
updateItemCount(0);
|
updateItemCount(0);
|
||||||
|
|
||||||
mLeDeviceListAdapter = new LeDeviceListAdapter(this, mDeviceStore.getDeviceCursor());
|
mDeviceListAdapter = new DeviceListAdapter(this, mDeviceStore.getDeviceCursor());
|
||||||
mList.setAdapter(mLeDeviceListAdapter);
|
mList.setAdapter(mDeviceListAdapter);
|
||||||
|
|
||||||
mBluetoothUtils.askUserToEnableBluetoothIfNeeded();
|
mBluetoothUtils.askUserToEnableBluetoothIfNeeded();
|
||||||
if (mIsBluetoothOn && mIsBluetoothLePresent) {
|
if (mIsBluetoothOn && mIsBluetoothLePresent) {
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
android:paddingLeft="@dimen/activity_horizontal_margin"
|
android:paddingLeft="@dimen/activity_horizontal_margin"
|
||||||
android:paddingRight="@dimen/activity_horizontal_margin"
|
android:paddingRight="@dimen/activity_horizontal_margin"
|
||||||
android:paddingTop="@dimen/activity_vertical_margin"
|
android:paddingTop="@dimen/activity_vertical_margin"
|
||||||
tools:context=".activities.MainActivity">
|
tools:context=".ui.main.MainActivity">
|
||||||
|
|
||||||
<GridLayout
|
<GridLayout
|
||||||
android:id="@+id/gridLayout1"
|
android:id="@+id/gridLayout1"
|
||||||
|
|||||||
Reference in New Issue
Block a user