Added share button to share device info

This commit is contained in:
Alexandros Schillings
2014-04-09 15:53:41 +01:00
parent e207f1ae73
commit 96df6d51fc
10 changed files with 161 additions and 15 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 445 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 548 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 911 B

+24 -8
View File
@@ -63,15 +63,37 @@
android:layout_height="1dp" android:layout_height="1dp"
android:background="@android:color/holo_blue_dark" /> android:background="@android:color/holo_blue_dark" />
<LinearLayout <RelativeLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical" > android:orientation="vertical" >
<LinearLayout
android:id="@+id/infoContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:orientation="vertical" >
<View
android:id="@+id/lowerSepparator"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@android:color/holo_blue_dark" />
<TextView
android:id="@+id/tvItemCount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/formatter_item_count" />
</LinearLayout>
<LinearLayout <LinearLayout
android:id="@+id/listContainer" android:id="@+id/listContainer"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_above="@id/infoContainer"
android:orientation="vertical" > android:orientation="vertical" >
<ListView <ListView
@@ -86,12 +108,6 @@
android:gravity="center_vertical|center_horizontal" android:gravity="center_vertical|center_horizontal"
android:text="@string/no_data" /> android:text="@string/no_data" />
</LinearLayout> </LinearLayout>
</RelativeLayout>
<View
android:id="@+id/lowerSepparator"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@android:color/holo_blue_dark" />
</LinearLayout>
</LinearLayout> </LinearLayout>
+8 -2
View File
@@ -32,9 +32,15 @@
android:showAsAction="ifRoom|withText" android:showAsAction="ifRoom|withText"
android:title="@string/menu_stop"/> android:title="@string/menu_stop"/>
<item <item
android:id="@+id/menu_about" android:id="@+id/menu_share"
android:orderInCategory="102" android:orderInCategory="102"
android:showAsAction="ifRoom|withText" android:showAsAction="ifRoom"
android:icon="@drawable/ic_action_share"
android:title="@string/menu_share"/>
<item
android:id="@+id/menu_about"
android:orderInCategory="103"
android:showAsAction="never"
android:title="@string/menu_about"/> android:title="@string/menu_about"/>
</menu> </menu>
+6 -4
View File
@@ -17,13 +17,17 @@
<!-- Formatters --> <!-- Formatters -->
<string name="formatter_meters">%sm</string> <string name="formatter_meters">%sm</string>
<string name="formatter_db">%sdb</string> <string name="formatter_db">%sdb</string>
<string name="formatter_item_count">Items: %s</string>
<!-- Menu items --> <!-- Menu items -->
<string name="menu_about">About</string> <string name="menu_about">About</string>
<string name="menu_connect">Connect</string> <string name="menu_connect">Connect</string>
<string name="menu_disconnect">Disconnect</string> <string name="menu_disconnect">Disconnect</string>
<string name="menu_scan">Scan</string> <string name="menu_scan">Scan</string>
<string name="menu_stop">Stop</string> <string name="menu_stop">Stop</string>
<string name="menu_share">Share</string>
<!-- List Items --> <!-- List Items -->
<string name="label_data">Data:</string> <string name="label_data">Data:</string>
@@ -36,8 +40,6 @@
<string name="label_state">State:</string> <string name="label_state">State:</string>
<string name="label_tx_power">TX Power:</string> <string name="label_tx_power">TX Power:</string>
<string name="label_uuid">UUID:</string> <string name="label_uuid">UUID:</string>
<string name="about_dialog_text">This is a sample application using the Bluetooth LE Library.\n\nGithub: https://github.com/alt236/Bluetooth-LE-Library---Android\n\nCopyright: Alexandros Schillings</string>
<string name="about_dialog_text">This is a sample application using the Bluetooth LE Library.\n\nGithub: https://github.com/alt236/Bluetooth-LE-Library---Android\n\nCopyright: Alexandros Schillings</string>
</resources> </resources>
@@ -27,6 +27,7 @@ import butterknife.InjectView;
public class MainActivity extends ListActivity { public class MainActivity extends ListActivity {
@InjectView(R.id.tvBluetoothLe) TextView mTvBluetoothLeStatus; @InjectView(R.id.tvBluetoothLe) TextView mTvBluetoothLeStatus;
@InjectView(R.id.tvBluetoothStatus) TextView mTvBluetoothStatus; @InjectView(R.id.tvBluetoothStatus) TextView mTvBluetoothStatus;
@InjectView(R.id.tvItemCount) TextView mTvItemCount;
private BluetoothUtils mBluetoothUtils; private BluetoothUtils mBluetoothUtils;
private BluetoothLeScanner mScanner; private BluetoothLeScanner mScanner;
@@ -44,13 +45,21 @@ public class MainActivity extends ListActivity {
public void run() { public void run() {
mDeviceStore.addDevice(deviceLe); mDeviceStore.addDevice(deviceLe);
mLeDeviceListAdapter.replaceData(mDeviceStore.getDeviceList()); mLeDeviceListAdapter.replaceData(mDeviceStore.getDeviceList());
updateItemCount(mLeDeviceListAdapter.getCount());
} }
}); });
} }
}; };
private void updateItemCount(int count){
mTvItemCount.setText(
getString(
R.string.formatter_item_count,
String.valueOf(count)));
}
private void displayAboutDialog(){ private void displayAboutDialog(){
// REALLY REALLY LAZY LIKIFIED DIALOG // REALLY REALLY LAZY LINKIFIED DIALOG
final int paddingSizeDp = 5; final int paddingSizeDp = 5;
final float scale = getResources().getDisplayMetrics().density; final float scale = getResources().getDisplayMetrics().density;
final int dpAsPixels = (int) (paddingSizeDp * scale + 0.5f); final int dpAsPixels = (int) (paddingSizeDp * scale + 0.5f);
@@ -83,6 +92,7 @@ public class MainActivity extends ListActivity {
mDeviceStore = new BluetoothLeDeviceStore(); mDeviceStore = new BluetoothLeDeviceStore();
mBluetoothUtils = new BluetoothUtils(this); mBluetoothUtils = new BluetoothUtils(this);
mScanner = new BluetoothLeScanner(mLeScanCallback, mBluetoothUtils); mScanner = new BluetoothLeScanner(mLeScanCallback, mBluetoothUtils);
updateItemCount(0);
} }
@Override @Override
@@ -97,6 +107,13 @@ public class MainActivity extends ListActivity {
menu.findItem(R.id.menu_scan).setVisible(false); menu.findItem(R.id.menu_scan).setVisible(false);
menu.findItem(R.id.menu_refresh).setActionView(R.layout.actionbar_progress_indeterminate); menu.findItem(R.id.menu_refresh).setActionView(R.layout.actionbar_progress_indeterminate);
} }
if(getListView().getCount() > 0){
menu.findItem(R.id.menu_share).setVisible(true);
} else {
menu.findItem(R.id.menu_share).setVisible(false);
}
return true; return true;
} }
@@ -125,6 +142,8 @@ public class MainActivity extends ListActivity {
case R.id.menu_about: case R.id.menu_about:
displayAboutDialog(); displayAboutDialog();
break; break;
case R.id.menu_share:
mDeviceStore.shareDataAsEmail(this);
} }
return true; return true;
} }
@@ -160,6 +179,7 @@ public class MainActivity extends ListActivity {
final boolean mIsBluetoothOn = mBluetoothUtils.isBluetoothOn(); final boolean mIsBluetoothOn = mBluetoothUtils.isBluetoothOn();
final boolean mIsBluetoothLePresent = mBluetoothUtils.isBluetoothLeSupported(); final boolean mIsBluetoothLePresent = mBluetoothUtils.isBluetoothLeSupported();
mDeviceStore.clear(); mDeviceStore.clear();
updateItemCount(0);
mLeDeviceListAdapter = new LeDeviceListAdapter(this, mDeviceStore.getDeviceList()); mLeDeviceListAdapter = new LeDeviceListAdapter(this, mDeviceStore.getDeviceList());
setListAdapter(mLeDeviceListAdapter); setListAdapter(mLeDeviceListAdapter);
@@ -1,5 +1,8 @@
package uk.co.alt236.btlescan.containers; package uk.co.alt236.btlescan.containers;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
@@ -8,6 +11,11 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import uk.co.alt236.bluetoothlelib.device.BluetoothLeDevice; import uk.co.alt236.bluetoothlelib.device.BluetoothLeDevice;
import uk.co.alt236.bluetoothlelib.util.ByteUtils;
import uk.co.alt236.btlescan.util.CsvWriterHelper;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
public class BluetoothLeDeviceStore { public class BluetoothLeDeviceStore {
private final Map<String, BluetoothLeDevice> mDeviceMap; private final Map<String, BluetoothLeDevice> mDeviceMap;
@@ -29,6 +37,26 @@ public class BluetoothLeDeviceStore {
mDeviceMap.clear(); mDeviceMap.clear();
} }
private FileWriter generateFile(File file, String contents){
FileWriter writer = null;
try {
writer = new FileWriter(file);
writer.append(contents);
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return writer;
}
public List<BluetoothLeDevice> getDeviceList(){ public List<BluetoothLeDevice> getDeviceList(){
final List<BluetoothLeDevice> methodResult = new ArrayList<BluetoothLeDevice>(mDeviceMap.values()); final List<BluetoothLeDevice> methodResult = new ArrayList<BluetoothLeDevice>(mDeviceMap.values());
@@ -42,4 +70,55 @@ public class BluetoothLeDeviceStore {
return methodResult; return methodResult;
} }
private String getListAsCsv(){
final List<BluetoothLeDevice> list = getDeviceList();
final StringBuilder sb = new StringBuilder();
sb.append(CsvWriterHelper.addStuff("mac"));
sb.append(CsvWriterHelper.addStuff("name"));
sb.append(CsvWriterHelper.addStuff("firstTimestamp"));
sb.append(CsvWriterHelper.addStuff("firstRssi"));
sb.append(CsvWriterHelper.addStuff("currentTimestamp"));
sb.append(CsvWriterHelper.addStuff("currentRssi"));
sb.append(CsvWriterHelper.addStuff("adRecord"));
sb.append('\n');
for(BluetoothLeDevice device : list){
sb.append(CsvWriterHelper.addStuff(device.getAddress()));
sb.append(CsvWriterHelper.addStuff(device.getName()));
sb.append(CsvWriterHelper.addStuff(device.getFirstTimestamp()));
sb.append(CsvWriterHelper.addStuff(device.getFirstRssi()));
sb.append(CsvWriterHelper.addStuff(device.getTimestamp()));
sb.append(CsvWriterHelper.addStuff(device.getRssi()));
sb.append(CsvWriterHelper.addStuff(ByteUtils.byteArrayToHexString(device.getScanRecord())));
sb.append('\n');
}
return sb.toString();
}
public void shareDataAsEmail(Context context){
String to = null;
String subject = "Bluetooth LE Scan Results";
String message = "Please find attached the scan results.";
final Intent i = new Intent(Intent.ACTION_SEND);
i.setType("plain/text");
try {
final File outputDir = context.getCacheDir();
final File outputFile = File.createTempFile("export_tmp", ".csv", outputDir);
outputFile.setReadable(true, false);
generateFile(outputFile, getListAsCsv());
i.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(outputFile));
i.putExtra(Intent.EXTRA_EMAIL, new String[] { to });
i.putExtra(Intent.EXTRA_SUBJECT, subject);
i.putExtra(Intent.EXTRA_TEXT, message);
context.startActivity(Intent.createChooser(i, "Please select your email client:"));
} catch (IOException e) {
e.printStackTrace();
}
}
} }
@@ -0,0 +1,23 @@
package uk.co.alt236.btlescan.util;
public class CsvWriterHelper {
private static final String QUOTE = "\"";
public static String addStuff(Integer text){
return QUOTE + text + QUOTE + ",";
}
public static String addStuff(Long text){
return QUOTE + text + QUOTE + ",";
}
public static String addStuff(boolean value){
return QUOTE + value + QUOTE + ",";
}
public static String addStuff(String text){
if(text == null){text = "<blank>";}
text = text.replace(QUOTE, "'");
return QUOTE + text.trim() + QUOTE + ",";
}
}