diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 9a8b7e5..96cc43e 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -1,7 +1,6 @@ - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index c1b4dde..1d9d626 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,8 +1,5 @@ - - - @@ -13,26 +10,10 @@ - + - - - - - Android API 18 Platform - - - - - - - \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations/Run_Android_Tests.xml b/.idea/runConfigurations/Run_Android_Tests.xml deleted file mode 100644 index 1f32fb7..0000000 --- a/.idea/runConfigurations/Run_Android_Tests.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/runConfigurations/Run_JUnit_Tests.xml b/.idea/runConfigurations/Run_JUnit_Tests.xml deleted file mode 100644 index 09ab733..0000000 --- a/.idea/runConfigurations/Run_JUnit_Tests.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/runConfigurations/Run_Sample_App.xml b/.idea/runConfigurations/Run_Sample_App.xml deleted file mode 100644 index 8873b95..0000000 --- a/.idea/runConfigurations/Run_Sample_App.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - \ No newline at end of file diff --git a/Bluetooth-LE-Library---Android.iml b/Bluetooth-LE-Library---Android.iml new file mode 100644 index 0000000..dcc5098 --- /dev/null +++ b/Bluetooth-LE-Library---Android.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/bluetooth-le-library.iml b/bluetooth-le-library.iml index cf2c73f..f36911a 100644 --- a/bluetooth-le-library.iml +++ b/bluetooth-le-library.iml @@ -8,7 +8,7 @@ - + diff --git a/build.gradle b/build.gradle index 327b2ba..1865bee 100644 --- a/build.gradle +++ b/build.gradle @@ -1,16 +1,16 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. -ext.compileSdkVersion = 22 -ext.buildToolsVersion = "22.0.1" +ext.compileSdkVersion = 24 +ext.buildToolsVersion = "24.0.1" ext.minSdkVersion = 18 -ext.targetSdkVersion = 22 +ext.targetSdkVersion = 24 buildscript { repositories { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.2.3' + classpath 'com.android.tools.build:gradle:2.1.3' } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0c71e76..edae9ca 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Apr 10 15:27:10 PDT 2013 +#Wed Aug 24 14:15:35 BST 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip diff --git a/library/library.iml b/library/library.iml index 7656b88..eccbfd6 100644 --- a/library/library.iml +++ b/library/library.iml @@ -12,19 +12,19 @@ - + @@ -34,7 +34,13 @@ - + + + + + + + @@ -42,6 +48,7 @@ + @@ -49,6 +56,7 @@ + @@ -56,6 +64,7 @@ + @@ -63,32 +72,35 @@ + + + + + + + + + + - - - - - - + + - - - - + + - + - diff --git a/sample_app/build.gradle b/sample_app/build.gradle index 38e6eb0..f2f4905 100644 --- a/sample_app/build.gradle +++ b/sample_app/build.gradle @@ -17,8 +17,9 @@ repositories { dependencies { compile 'com.jakewharton:butterknife:7.0.1' - compile 'com.android.support:appcompat-v7:22.2.0' + compile 'com.android.support:appcompat-v7:24.2.0' compile 'com.commonsware.cwac:merge:1.1.0' + compile 'com.anthonycr.grant:permissions:1.0' compile fileTree(include: ['*.jar'], dir: 'libs') compile project(':library') } diff --git a/sample_app/sample_app.iml b/sample_app/sample_app.iml index 756895c..a26e01b 100644 --- a/sample_app/sample_app.iml +++ b/sample_app/sample_app.iml @@ -12,9 +12,9 @@ - + @@ -33,7 +33,13 @@ - + + + + + + + @@ -41,6 +47,7 @@ + @@ -48,6 +55,7 @@ + @@ -55,6 +63,15 @@ + + + + + + + + + @@ -62,41 +79,60 @@ + + - - - - - + + + + + + + + + + - - - - + + + + + + - - + + + + + - + - + + + + + + + + + + + - - - - + \ No newline at end of file diff --git a/sample_app/src/main/AndroidManifest.xml b/sample_app/src/main/AndroidManifest.xml index 7546b22..d67bb8f 100644 --- a/sample_app/src/main/AndroidManifest.xml +++ b/sample_app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ + 0){ + for (final BluetoothService service : device.getBluetoothDeviceKnownSupportedServices()) { + if (sb.length() > 0) { sb.append(", "); } diff --git a/sample_app/src/main/java/uk/co/alt236/btlescan/activities/DialogFactory.java b/sample_app/src/main/java/uk/co/alt236/btlescan/activities/DialogFactory.java new file mode 100644 index 0000000..4ffb6f8 --- /dev/null +++ b/sample_app/src/main/java/uk/co/alt236/btlescan/activities/DialogFactory.java @@ -0,0 +1,47 @@ +package uk.co.alt236.btlescan.activities; + +import android.app.Activity; +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.support.v7.app.AlertDialog; +import android.text.SpannableString; +import android.text.method.LinkMovementMethod; +import android.text.util.Linkify; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.TextView; + +import uk.co.alt236.btlescan.R; + +/*package*/ final class DialogFactory { + + private DialogFactory() { + // NOOP + } + + public static Dialog createAboutDialog(final Context context) { + final View view = LayoutInflater.from(context).inflate(R.layout.dialog_textview, null); + final TextView textView = (TextView) view.findViewById(R.id.text); + + final SpannableString text = new SpannableString(context.getString(R.string.about_dialog_text)); + + textView.setText(text); + textView.setAutoLinkMask(Activity.RESULT_OK); + textView.setMovementMethod(LinkMovementMethod.getInstance()); + + Linkify.addLinks(text, Linkify.ALL); + + final DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() { + public void onClick(final DialogInterface dialog, final int id) { + } + }; + + return new AlertDialog.Builder(context) + .setTitle(R.string.menu_about) + .setCancelable(false) + .setPositiveButton(android.R.string.ok, listener) + .setView(view) + .create(); + } +} diff --git a/sample_app/src/main/java/uk/co/alt236/btlescan/activities/MainActivity.java b/sample_app/src/main/java/uk/co/alt236/btlescan/activities/MainActivity.java index 153f522..659c578 100644 --- a/sample_app/src/main/java/uk/co/alt236/btlescan/activities/MainActivity.java +++ b/sample_app/src/main/java/uk/co/alt236/btlescan/activities/MainActivity.java @@ -1,21 +1,22 @@ package uk.co.alt236.btlescan.activities; -import android.app.AlertDialog; +import android.Manifest; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; -import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; +import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; -import android.text.SpannableString; -import android.text.method.LinkMovementMethod; -import android.text.util.Linkify; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import android.widget.TextView; +import android.widget.Toast; + +import com.anthonycr.grant.PermissionsManager; +import com.anthonycr.grant.PermissionsResultAction; import butterknife.Bind; import butterknife.ButterKnife; @@ -62,32 +63,6 @@ public class MainActivity extends AppCompatActivity implements AdapterView.OnIte } }; - private void displayAboutDialog() { - // REALLY REALLY LAZY LINKIFIED DIALOG - final int paddingSizeDp = 5; - final float scale = getResources().getDisplayMetrics().density; - final int dpAsPixels = (int) (paddingSizeDp * scale + 0.5f); - - final TextView textView = new TextView(this); - final SpannableString text = new SpannableString(getString(R.string.about_dialog_text)); - - textView.setText(text); - textView.setAutoLinkMask(RESULT_OK); - textView.setMovementMethod(LinkMovementMethod.getInstance()); - textView.setPadding(dpAsPixels, dpAsPixels, dpAsPixels, dpAsPixels); - - Linkify.addLinks(text, Linkify.ALL); - new AlertDialog.Builder(this) - .setTitle(R.string.menu_about) - .setCancelable(false) - .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { - public void onClick(final DialogInterface dialog, final int id) { - } - }) - .setView(textView) - .show(); - } - @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -138,14 +113,29 @@ public class MainActivity extends AppCompatActivity implements AdapterView.OnIte public boolean onOptionsItemSelected(final MenuItem item) { switch (item.getItemId()) { case R.id.menu_scan: - startScan(); + PermissionsManager.getInstance().requestPermissionsIfNecessaryForResult(this, + new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, new PermissionsResultAction() { + + @Override + public void onGranted() { + startScan(); + } + + @Override + public void onDenied(String permission) { + Toast.makeText(MainActivity.this, + R.string.permission_not_granted_coarse_location, + Toast.LENGTH_SHORT) + .show(); + } + }); break; case R.id.menu_stop: mScanner.scanLeDevice(-1, false); invalidateOptionsMenu(); break; case R.id.menu_about: - displayAboutDialog(); + DialogFactory.createAboutDialog(this).show(); break; case R.id.menu_share: mDeviceStore.shareDataAsEmail(this); @@ -203,4 +193,10 @@ public class MainActivity extends AppCompatActivity implements AdapterView.OnIte String.valueOf(count))); } + @Override + public void onRequestPermissionsResult(int requestCode, + @NonNull String[] permissions, + @NonNull int[] grantResults) { + PermissionsManager.getInstance().notifyPermissionsChange(permissions, grantResults); + } } diff --git a/sample_app/src/main/res/layout/activity_gatt_services.xml b/sample_app/src/main/res/layout/activity_gatt_services.xml index af806fb..15d2827 100644 --- a/sample_app/src/main/res/layout/activity_gatt_services.xml +++ b/sample_app/src/main/res/layout/activity_gatt_services.xml @@ -57,7 +57,7 @@ android:layout_width="match_parent" android:layout_height="1dp" android:layout_below="@id/deviceInformation" - android:background="@android:color/holo_blue_dark"/> + android:background="@color/colorSeparator" /> + android:background="@color/colorSeparator" /> + tools:context=".activities.MainActivity"> + android:background="@color/colorSeparator" /> + android:background="@color/colorSeparator" /> + + + + \ No newline at end of file diff --git a/sample_app/src/main/res/layout/list_item_view_header.xml b/sample_app/src/main/res/layout/list_item_view_header.xml index e92024e..1958014 100644 --- a/sample_app/src/main/res/layout/list_item_view_header.xml +++ b/sample_app/src/main/res/layout/list_item_view_header.xml @@ -11,13 +11,13 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:textAllCaps="true" - android:textColor="@android:color/holo_blue_dark" + android:textColor="@color/colorSeparator" android:textSize="14sp" android:textStyle="bold"/> + android:background="@color/colorSeparator" /> \ No newline at end of file diff --git a/sample_app/src/main/res/values-v11/styles.xml b/sample_app/src/main/res/values-v11/styles.xml deleted file mode 100644 index c0ef0ed..0000000 --- a/sample_app/src/main/res/values-v11/styles.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - diff --git a/sample_app/src/main/res/values-v14/styles.xml b/sample_app/src/main/res/values-v14/styles.xml deleted file mode 100644 index 664f4f1..0000000 --- a/sample_app/src/main/res/values-v14/styles.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - diff --git a/sample_app/src/main/res/values-v21/styles.xml b/sample_app/src/main/res/values-v21/styles.xml new file mode 100644 index 0000000..7b9a811 --- /dev/null +++ b/sample_app/src/main/res/values-v21/styles.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/sample_app/src/main/res/values/colors.xml b/sample_app/src/main/res/values/colors.xml index c64f146..0065566 100644 --- a/sample_app/src/main/res/values/colors.xml +++ b/sample_app/src/main/res/values/colors.xml @@ -1,3 +1,9 @@ #66e0e0e0 + #0000FF + #4400FF + #F06292 + + + @color/colorAccent diff --git a/sample_app/src/main/res/values/strings.xml b/sample_app/src/main/res/values/strings.xml index 84c3f4f..c0c87be 100644 --- a/sample_app/src/main/res/values/strings.xml +++ b/sample_app/src/main/res/values/strings.xml @@ -21,6 +21,7 @@ %sm %sdb Items: %s + \'%s\' About @@ -72,4 +73,6 @@ UUID: Updated: Descriptor: + + The ACCESS_COARSE_LOCATION permission is needed to receive bluetooth scan results \ No newline at end of file diff --git a/sample_app/src/main/res/values/styles.xml b/sample_app/src/main/res/values/styles.xml index c503b3f..d8baf48 100644 --- a/sample_app/src/main/res/values/styles.xml +++ b/sample_app/src/main/res/values/styles.xml @@ -1,20 +1,11 @@ - - +