summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTrevor Johns <trevorjohns@google.com>2013-07-24 12:36:28 -0700
committerTrevor Johns <trevorjohns@google.com>2013-07-24 12:36:28 -0700
commit2a4aa3cd5dc0f13f676ed1994e6748a156eb5801 (patch)
treece88664220c9ac0bdbc9df62e6a3ec7c0478c54e
parentf8a92396babb6592bb8780866def23795f3dab70 (diff)
downloadandroid_development-2a4aa3cd5dc0f13f676ed1994e6748a156eb5801.tar.gz
android_development-2a4aa3cd5dc0f13f676ed1994e6748a156eb5801.tar.bz2
android_development-2a4aa3cd5dc0f13f676ed1994e6748a156eb5801.zip
Remove AppRestrictions and BluetoothLeGatt samples
These have been moved to the new samples repository in developers/samples/android. Change-Id: I77312ea146ccb47ec8ecf38c9448149ec4c34962
-rw-r--r--build/sdk.atree2
-rw-r--r--samples/AppRestrictions/Android.mk17
-rw-r--r--samples/AppRestrictions/AndroidManifest.xml44
-rwxr-xr-xsamples/AppRestrictions/res/drawable-hdpi/ic_launcher.pngbin4216 -> 0 bytes
-rwxr-xr-xsamples/AppRestrictions/res/drawable-mdpi/ic_launcher.pngbin2627 -> 0 bytes
-rwxr-xr-xsamples/AppRestrictions/res/drawable-xhdpi/ic_launcher.pngbin5833 -> 0 bytes
-rwxr-xr-xsamples/AppRestrictions/res/drawable-xxhdpi/ic_launcher.pngbin10458 -> 0 bytes
-rw-r--r--samples/AppRestrictions/res/layout/main.xml114
-rw-r--r--samples/AppRestrictions/res/values/strings.xml65
-rw-r--r--samples/AppRestrictions/res/xml/custom_prefs.xml33
-rw-r--r--samples/AppRestrictions/src/com/example/android/apprestrictions/CustomRestrictionsActivity.java44
-rw-r--r--samples/AppRestrictions/src/com/example/android/apprestrictions/CustomRestrictionsFragment.java202
-rw-r--r--samples/AppRestrictions/src/com/example/android/apprestrictions/GetRestrictionsReceiver.java162
-rw-r--r--samples/AppRestrictions/src/com/example/android/apprestrictions/MainActivity.java131
-rw-r--r--samples/BluetoothLeGatt/Android.mk16
-rw-r--r--samples/BluetoothLeGatt/AndroidManifest.xml45
-rwxr-xr-xsamples/BluetoothLeGatt/res/drawable-hdpi/ic_launcher.pngbin5170 -> 0 bytes
-rwxr-xr-xsamples/BluetoothLeGatt/res/drawable-mdpi/ic_launcher.pngbin3025 -> 0 bytes
-rwxr-xr-xsamples/BluetoothLeGatt/res/drawable-xhdpi/ic_launcher.pngbin7227 -> 0 bytes
-rwxr-xr-xsamples/BluetoothLeGatt/res/drawable-xxhdpi/ic_launcher.pngbin12800 -> 0 bytes
-rw-r--r--samples/BluetoothLeGatt/res/layout/actionbar_indeterminate_progress.xml23
-rw-r--r--samples/BluetoothLeGatt/res/layout/gatt_services_characteristics.xml71
-rw-r--r--samples/BluetoothLeGatt/res/layout/listitem_device.xml28
-rw-r--r--samples/BluetoothLeGatt/res/menu/gatt_services.xml29
-rw-r--r--samples/BluetoothLeGatt/res/menu/main.xml29
-rw-r--r--samples/BluetoothLeGatt/res/values/strings.xml37
-rw-r--r--samples/BluetoothLeGatt/src/com/example/bluetooth/le/BluetoothLeService.java319
-rw-r--r--samples/BluetoothLeGatt/src/com/example/bluetooth/le/DeviceControlActivity.java309
-rw-r--r--samples/BluetoothLeGatt/src/com/example/bluetooth/le/DeviceScanActivity.java269
-rw-r--r--samples/BluetoothLeGatt/src/com/example/bluetooth/le/SampleGattAttributes.java42
30 files changed, 0 insertions, 2031 deletions
diff --git a/build/sdk.atree b/build/sdk.atree
index 5f7a27256..edc47fecc 100644
--- a/build/sdk.atree
+++ b/build/sdk.atree
@@ -201,12 +201,10 @@ development/samples/ActionBarCompat samples/${PLATFORM_NAME}/legacy/A
development/samples/AndroidBeamDemo samples/${PLATFORM_NAME}/legacy/AndroidBeamDemo
development/samples/ApiDemos samples/${PLATFORM_NAME}/legacy/ApiDemos
development/samples/AppNavigation samples/${PLATFORM_NAME}/legacy/AppNavigation
-development/samples/AppRestrictions samples/${PLATFORM_NAME}/legacy/AppRestrictions
development/samples/BackupRestore samples/${PLATFORM_NAME}/legacy/BackupRestore
development/samples/BasicGLSurfaceView samples/${PLATFORM_NAME}/legacy/BasicGLSurfaceView
development/samples/BluetoothChat samples/${PLATFORM_NAME}/legacy/BluetoothChat
development/samples/BluetoothHDP samples/${PLATFORM_NAME}/legacy/BluetoothHDP
-development/samples/BluetoothLeGatt samples/${PLATFORM_NAME}/legacy/BluetoothLeGatt
development/samples/ContactManager samples/${PLATFORM_NAME}/legacy/ContactManager
development/samples/CrossCompatibility samples/${PLATFORM_NAME}/legacy/CrossCompatibility
development/samples/CubeLiveWallpaper samples/${PLATFORM_NAME}/legacy/CubeLiveWallpaper
diff --git a/samples/AppRestrictions/Android.mk b/samples/AppRestrictions/Android.mk
deleted file mode 100644
index 6ab20da63..000000000
--- a/samples/AppRestrictions/Android.mk
+++ /dev/null
@@ -1,17 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := samples tests
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_PACKAGE_NAME := AppRestrictions
-
-LOCAL_SDK_VERSION := current
-
-include $(BUILD_PACKAGE)
-
-LOCAL_PROGUARD_FLAG_FILES := proguard.flags
-
-# Use the following include to make our test apk.
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/samples/AppRestrictions/AndroidManifest.xml b/samples/AppRestrictions/AndroidManifest.xml
deleted file mode 100644
index dd9fc092b..000000000
--- a/samples/AppRestrictions/AndroidManifest.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2013 The Android Open Source Project
-
- 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.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- android:versionCode="1"
- android:versionName="1"
- package="com.example.android.apprestrictions">
-
- <uses-sdk android:minSdkVersion="18" />
-
- <application android:label="@string/app_name"
- android:icon="@drawable/ic_launcher">
-
- <activity android:name="MainActivity"
- android:label="@string/app_name" >
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
-
- <activity android:name="CustomRestrictionsActivity"
- android:label="@string/restrictions_activity_label" />
-
- <receiver android:name="GetRestrictionsReceiver">
- <intent-filter>
- <action android:name="android.intent.action.GET_RESTRICTION_ENTRIES" />
- </intent-filter>
- </receiver>
- </application>
-</manifest>
diff --git a/samples/AppRestrictions/res/drawable-hdpi/ic_launcher.png b/samples/AppRestrictions/res/drawable-hdpi/ic_launcher.png
deleted file mode 100755
index f36c473a1..000000000
--- a/samples/AppRestrictions/res/drawable-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples/AppRestrictions/res/drawable-mdpi/ic_launcher.png b/samples/AppRestrictions/res/drawable-mdpi/ic_launcher.png
deleted file mode 100755
index 5ab2e0d33..000000000
--- a/samples/AppRestrictions/res/drawable-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples/AppRestrictions/res/drawable-xhdpi/ic_launcher.png b/samples/AppRestrictions/res/drawable-xhdpi/ic_launcher.png
deleted file mode 100755
index 76228388e..000000000
--- a/samples/AppRestrictions/res/drawable-xhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples/AppRestrictions/res/drawable-xxhdpi/ic_launcher.png b/samples/AppRestrictions/res/drawable-xxhdpi/ic_launcher.png
deleted file mode 100755
index 7f55feff2..000000000
--- a/samples/AppRestrictions/res/drawable-xxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples/AppRestrictions/res/layout/main.xml b/samples/AppRestrictions/res/layout/main.xml
deleted file mode 100644
index 55e2c8eb4..000000000
--- a/samples/AppRestrictions/res/layout/main.xml
+++ /dev/null
@@ -1,114 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2013 The Android Open Source Project
-
-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.
--->
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
- <LinearLayout android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_margin="20dp">
-
- <TextView android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="10dp"
- android:textSize="18sp"
- android:text="@string/sample_app_description"/>
-
- <LinearLayout android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginBottom="15dp">
- <CheckBox android:id="@+id/custom_app_limits"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:onClick="onCustomClicked"/>
- <TextView android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="18sp"
- android:text="@string/custom_description"
- android:onClick="onCustomClicked"
- android:layout_weight="1"/>
- </LinearLayout>
-
- <!-- Separator -->
- <View android:layout_height="1dp"
- android:background="@android:color/white"
- android:layout_width="match_parent"
- android:layout_margin="25dp"/>
-
- <!-- Section to show app restriction settings under a restricted profile. -->
- <TextView android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="20sp"
- android:text="@string/current_app_limits_label"/>
- <TextView android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="18sp"
- android:layout_marginBottom="10dp"
- android:text="@string/current_app_limits_description"/>
-
- <LinearLayout android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginLeft="20dp">
- <TextView android:layout_width="210dp"
- android:layout_height="wrap_content"
- android:textSize="18sp"
- android:text="@string/boolean_entry_title"/>
- <Space android:layout_height="1dp"
- android:layout_width="15dp"/>
- <TextView android:id="@+id/boolean_entry_id"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="18sp"
- android:text="@string/boolean_entry_title"/>
- </LinearLayout>
-
- <LinearLayout android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginLeft="20dp">
- <TextView android:layout_width="210dp"
- android:layout_height="wrap_content"
- android:textSize="18sp"
- android:text="@string/choice_entry_title"/>
- <Space android:layout_height="1dp"
- android:layout_width="15dp"/>
- <TextView android:id="@+id/choice_entry_id"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="18sp"
- android:text="@string/boolean_entry_title"/>
- </LinearLayout>
-
- <LinearLayout android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginLeft="20dp">
- <TextView android:layout_width="210dp"
- android:layout_height="wrap_content"
- android:textSize="18sp"
- android:text="@string/multi_entry_title"/>
- <Space android:layout_height="1dp"
- android:layout_width="15dp"/>
- <TextView android:id="@+id/multi_entry_id"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="18sp"
- android:text="@string/multi_entry_title"/>
- </LinearLayout>
- </LinearLayout>
-</ScrollView> \ No newline at end of file
diff --git a/samples/AppRestrictions/res/values/strings.xml b/samples/AppRestrictions/res/values/strings.xml
deleted file mode 100644
index 2dac3b1bf..000000000
--- a/samples/AppRestrictions/res/values/strings.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2013 The Android Open Source Project
-
- 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.
--->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_name">App Restrictions Demo</string>
- <string name="restrictions_activity_label">Custom app restrictions</string>
- <string name="boolean_entry_title">Test boolean type</string>
- <string name="choice_entry_title">Test choice type</string>
- <string name="multi_entry_title">Test multi-select type</string>
- <string name="custom_description">If checked, use a custom app restriction Activity. Otherwise,
- use standard restriction types.
- </string>
- <string name="sample_app_description">Note: This sample app requires the restricted profile
- feature.\n\n
- 1. If this is the primary user, go to Settings &gt; Users.\n\n
- 2. Create a restricted profile, if one doesn\'t exist already.\n\n
- 3. Open the profile settings, locate the sample app, and tap the app restriction settings
- icon. Configure app restrictions for the app.\n\n
- 4. In the lock screen, switch to the user\'s restricted profile, launch this sample app,
- and see the configured app restrictions displayed.\n
- </string>
- <string name="settings_button_label">Go to Settings</string>
- <string name="current_app_limits_label">Current app restriction settings:</string>
- <string name="na">N/A</string>
- <string name="current_app_limits_description">Your app can restrict its content based on these
- settings, which can be configured through the primary user\'s Users Settings.
- </string>
-
- <string-array name="multi_entry_entries">
- <item>Ice Cream</item>
- <item>Jelly Bean</item>
- <item>More Jelly Bean</item>
- </string-array>
-
- <string-array name="multi_entry_values" translateable="false">
- <item>1</item>
- <item>2</item>
- <item>3</item>
- </string-array>
-
- <string-array name="choice_entry_entries">
- <item>Ice Cream</item>
- <item>Jelly Bean</item>
- <item>More Jelly Bean</item>
- </string-array>
-
- <string-array name="choice_entry_values" translateable="false">
- <item>1</item>
- <item>2</item>
- <item>3</item>
- </string-array>
-
-</resources> \ No newline at end of file
diff --git a/samples/AppRestrictions/res/xml/custom_prefs.xml b/samples/AppRestrictions/res/xml/custom_prefs.xml
deleted file mode 100644
index 5a3cf0df5..000000000
--- a/samples/AppRestrictions/res/xml/custom_prefs.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2013 The Android Open Source Project
-
- 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.
--->
-
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
- android:title="@string/restrictions_activity_label">
-
- <CheckBoxPreference android:key="pref_boolean"
- android:title="@string/boolean_entry_title" />
-
- <ListPreference android:key="pref_choice"
- android:title="@string/choice_entry_title"
- android:entries="@array/choice_entry_entries"
- android:entryValues="@array/choice_entry_values" />
-
- <MultiSelectListPreference android:key="pref_multi"
- android:title="@string/multi_entry_title"
- android:entries="@array/multi_entry_entries"
- android:entryValues="@array/multi_entry_values" />
-
-</PreferenceScreen>
diff --git a/samples/AppRestrictions/src/com/example/android/apprestrictions/CustomRestrictionsActivity.java b/samples/AppRestrictions/src/com/example/android/apprestrictions/CustomRestrictionsActivity.java
deleted file mode 100644
index 213b31357..000000000
--- a/samples/AppRestrictions/src/com/example/android/apprestrictions/CustomRestrictionsActivity.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * 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.example.android.apprestrictions;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-/**
- * This activity demonstrates how an app can integrate its own custom app restriction settings
- * with the restricted profile feature.
- *
- * This sample app maintains custom app restriction settings in shared preferences. When
- * the activity is invoked (from Settings > Users), the stored settings are used to initialize
- * the custom configuration on the user interface. Three sample input types are
- * shown: checkbox, single-choice, and multi-choice. When the settings are modified by the user,
- * the corresponding restriction entries are saved, which are retrievable under a restricted
- * profile.
- */
-public class CustomRestrictionsActivity extends Activity {
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- if (savedInstanceState == null) {
- getFragmentManager().beginTransaction().replace(android.R.id.content,
- new CustomRestrictionsFragment()).commit();
- }
- }
-}
diff --git a/samples/AppRestrictions/src/com/example/android/apprestrictions/CustomRestrictionsFragment.java b/samples/AppRestrictions/src/com/example/android/apprestrictions/CustomRestrictionsFragment.java
deleted file mode 100644
index b04dfd1f7..000000000
--- a/samples/AppRestrictions/src/com/example/android/apprestrictions/CustomRestrictionsFragment.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * 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.example.android.apprestrictions;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.content.RestrictionEntry;
-import android.os.Bundle;
-import android.os.UserManager;
-import android.preference.CheckBoxPreference;
-import android.preference.ListPreference;
-import android.preference.MultiSelectListPreference;
-import android.preference.Preference;
-import android.preference.PreferenceFragment;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * This fragment is included in {@code CustomRestrictionsActivity}. It demonstrates how an app
- * can integrate its own custom app restriction settings with the restricted profile feature.
- *
- * This sample app maintains custom app restriction settings in shared preferences. Your app
- * can use other methods to maintain the settings. When this activity is invoked
- * (from Settings > Users > Restricted Profile), the shared preferences are used to initialize
- * the custom configuration on the user interface.
- *
- * Three sample input types are shown: checkbox, single-choice, and multi-choice. When the
- * settings are modified by the user, the corresponding restriction entries are saved in the
- * platform. The saved restriction entries are retrievable when the app is launched under a
- * restricted profile.
- */
-public class CustomRestrictionsFragment extends PreferenceFragment
- implements Preference.OnPreferenceChangeListener {
-
- // Shared preference key for the boolean restriction.
- private static final String KEY_BOOLEAN_PREF = "pref_boolean";
- // Shared preference key for the single-select restriction.
- private static final String KEY_CHOICE_PREF = "pref_choice";
- // Shared preference key for the multi-select restriction.
- private static final String KEY_MULTI_PREF = "pref_multi";
-
-
- private List<RestrictionEntry> mRestrictions;
- private Bundle mRestrictionsBundle;
-
- // Shared preferences for each of the sample input types.
- private CheckBoxPreference mBooleanPref;
- private ListPreference mChoicePref;
- private MultiSelectListPreference mMultiPref;
-
- // Restriction entries for each of the sample input types.
- private RestrictionEntry mBooleanEntry;
- private RestrictionEntry mChoiceEntry;
- private RestrictionEntry mMultiEntry;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- addPreferencesFromResource(R.xml.custom_prefs);
-
- // This sample app uses shared preferences to maintain app restriction settings. Your app
- // can use other methods to maintain the settings.
- mBooleanPref = (CheckBoxPreference) findPreference(KEY_BOOLEAN_PREF);
- mChoicePref = (ListPreference) findPreference(KEY_CHOICE_PREF);
- mMultiPref = (MultiSelectListPreference) findPreference(KEY_MULTI_PREF);
-
- mBooleanPref.setOnPreferenceChangeListener(this);
- mChoicePref.setOnPreferenceChangeListener(this);
- mMultiPref.setOnPreferenceChangeListener(this);
-
- setRetainInstance(true);
- }
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- final Activity activity = getActivity();
-
- // BEGIN_INCLUDE (GET_CURRENT_RESTRICTIONS)
- // Existing app restriction settings, if exist, can be retrieved from the Bundle.
- mRestrictionsBundle =
- activity.getIntent().getBundleExtra(Intent.EXTRA_RESTRICTIONS_BUNDLE);
-
- if (mRestrictionsBundle == null) {
- mRestrictionsBundle =
- ((UserManager) activity.getSystemService(Context.USER_SERVICE))
- .getApplicationRestrictions(activity.getPackageName());
- }
-
- if (mRestrictionsBundle == null) {
- mRestrictionsBundle = new Bundle();
- }
-
- mRestrictions = activity.getIntent().getParcelableArrayListExtra(
- Intent.EXTRA_RESTRICTIONS_LIST);
- // END_INCLUDE (GET_CURRENT_RESTRICTIONS)
-
- // Transfers the saved values into the preference hierarchy.
- if (mRestrictions != null) {
- for (RestrictionEntry entry : mRestrictions) {
- if (entry.getKey().equals(GetRestrictionsReceiver.KEY_BOOLEAN)) {
- mBooleanPref.setChecked(entry.getSelectedState());
- mBooleanEntry = entry;
- } else if (entry.getKey().equals(GetRestrictionsReceiver.KEY_CHOICE)) {
- mChoicePref.setValue(entry.getSelectedString());
- mChoiceEntry = entry;
- } else if (entry.getKey().equals(GetRestrictionsReceiver.KEY_MULTI_SELECT)) {
- HashSet<String> set = new HashSet<String>();
- for (String value : entry.getAllSelectedStrings()) {
- set.add(value);
- }
- mMultiPref.setValues(set);
- mMultiEntry = entry;
- }
- }
- } else {
- mRestrictions = new ArrayList<RestrictionEntry>();
-
- // Initializes the boolean restriction entry and updates its corresponding shared
- // preference value.
- mBooleanEntry = new RestrictionEntry(GetRestrictionsReceiver.KEY_BOOLEAN,
- mRestrictionsBundle.getBoolean(GetRestrictionsReceiver.KEY_BOOLEAN, false));
- mBooleanEntry.setType(RestrictionEntry.TYPE_BOOLEAN);
- mBooleanPref.setChecked(mBooleanEntry.getSelectedState());
-
- // Initializes the single choice restriction entry and updates its corresponding
- // shared preference value.
- mChoiceEntry = new RestrictionEntry(GetRestrictionsReceiver.KEY_CHOICE,
- mRestrictionsBundle.getString(GetRestrictionsReceiver.KEY_CHOICE));
- mChoiceEntry.setType(RestrictionEntry.TYPE_CHOICE);
- mChoicePref.setValue(mChoiceEntry.getSelectedString());
-
- // Initializes the multi-select restriction entry and updates its corresponding
- // shared preference value.
- mMultiEntry = new RestrictionEntry(GetRestrictionsReceiver.KEY_MULTI_SELECT,
- mRestrictionsBundle.getStringArray(
- GetRestrictionsReceiver.KEY_MULTI_SELECT));
- mMultiEntry.setType(RestrictionEntry.TYPE_MULTI_SELECT);
- if (mMultiEntry.getAllSelectedStrings() != null) {
- HashSet<String> set = new HashSet<String>();
- final String[] values = mRestrictionsBundle.getStringArray(
- GetRestrictionsReceiver.KEY_MULTI_SELECT);
- if (values != null) {
- for (String value : values) {
- set.add(value);
- }
- }
- mMultiPref.setValues(set);
- }
- mRestrictions.add(mBooleanEntry);
- mRestrictions.add(mChoiceEntry);
- mRestrictions.add(mMultiEntry);
- }
- // Prepares result to be passed back to the Settings app when the custom restrictions
- // activity finishes.
- Intent intent = new Intent(getActivity().getIntent());
- intent.putParcelableArrayListExtra(Intent.EXTRA_RESTRICTIONS_LIST,
- new ArrayList<RestrictionEntry>(mRestrictions));
- getActivity().setResult(Activity.RESULT_OK, intent);
- }
-
- @Override
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- if (preference == mBooleanPref) {
- mBooleanEntry.setSelectedState((Boolean) newValue);
- } else if (preference == mChoicePref) {
- mChoiceEntry.setSelectedString((String) newValue);
- } else if (preference == mMultiPref) {
- String[] selectedStrings = new String[((Set<String>)newValue).size()];
- int i = 0;
- for (String value : (Set<String>) newValue) {
- selectedStrings[i++] = value;
- }
- mMultiEntry.setAllSelectedStrings(selectedStrings);
- }
-
- // Saves all the app restriction configuration changes from the custom activity.
- Intent intent = new Intent(getActivity().getIntent());
- intent.putParcelableArrayListExtra(Intent.EXTRA_RESTRICTIONS_LIST,
- new ArrayList<RestrictionEntry>(mRestrictions));
- getActivity().setResult(Activity.RESULT_OK, intent);
- return true;
- }
-}
diff --git a/samples/AppRestrictions/src/com/example/android/apprestrictions/GetRestrictionsReceiver.java b/samples/AppRestrictions/src/com/example/android/apprestrictions/GetRestrictionsReceiver.java
deleted file mode 100644
index bb5a28391..000000000
--- a/samples/AppRestrictions/src/com/example/android/apprestrictions/GetRestrictionsReceiver.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * 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.example.android.apprestrictions;
-
-import android.app.Activity;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.RestrictionEntry;
-import android.content.res.Resources;
-import android.os.Bundle;
-import android.preference.PreferenceManager;
-import android.util.Log;
-
-import java.util.ArrayList;
-
-public class GetRestrictionsReceiver extends BroadcastReceiver {
- private static final String TAG = GetRestrictionsReceiver.class.getSimpleName();
-
- // Keys for referencing app restriction settings from the platform.
- public static final String KEY_BOOLEAN = "boolean_key";
- public static final String KEY_CHOICE = "choice_key";
- public static final String KEY_MULTI_SELECT = "multi_key";
-
- @Override
- public void onReceive(final Context context, Intent intent) {
- final PendingResult result = goAsync();
-
- // If app restriction settings are already created, they will be included in the Bundle
- // as key/value pairs.
- final Bundle existingRestrictions =
- intent.getBundleExtra(Intent.EXTRA_RESTRICTIONS_BUNDLE);
- Log.i(TAG, "existingRestrictions = " + existingRestrictions);
-
- new Thread() {
- public void run() {
- createRestrictions(context, result, existingRestrictions);
- }
- }.start();
- }
-
- // Initializes a boolean type restriction entry.
- public static void populateBooleanEntry(Resources res, RestrictionEntry entry) {
- entry.setType(RestrictionEntry.TYPE_BOOLEAN);
- entry.setTitle(res.getString(R.string.boolean_entry_title));
- }
-
- // Initializes a single choice type restriction entry.
- public static void populateChoiceEntry(Resources res, RestrictionEntry reSingleChoice) {
- String[] choiceEntries = res.getStringArray(R.array.choice_entry_entries);
- String[] choiceValues = res.getStringArray(R.array.choice_entry_values);
- if (reSingleChoice.getSelectedString() == null) {
- reSingleChoice.setSelectedString(choiceValues[0]);
- }
- reSingleChoice.setTitle(res.getString(R.string.choice_entry_title));
- reSingleChoice.setChoiceEntries(choiceEntries);
- reSingleChoice.setChoiceValues(choiceValues);
- reSingleChoice.setType(RestrictionEntry.TYPE_CHOICE);
- }
-
- // Initializes a multi-select type restriction entry.
- public static void populateMultiEntry(Resources res, RestrictionEntry reMultiSelect) {
- String[] multiEntries = res.getStringArray(R.array.multi_entry_entries);
- String[] multiValues = res.getStringArray(R.array.multi_entry_values);
- if (reMultiSelect.getAllSelectedStrings() == null) {
- reMultiSelect.setAllSelectedStrings(new String[0]);
- }
- reMultiSelect.setTitle(res.getString(R.string.multi_entry_title));
- reMultiSelect.setChoiceEntries(multiEntries);
- reMultiSelect.setChoiceValues(multiValues);
- reMultiSelect.setType(RestrictionEntry.TYPE_MULTI_SELECT);
- }
-
- // Demonstrates the creation of standard app restriction types: boolean, single choice, and
- // multi-select.
- private ArrayList<RestrictionEntry> initRestrictions(Context context) {
- ArrayList<RestrictionEntry> newRestrictions = new ArrayList<RestrictionEntry>();
- Resources res = context.getResources();
-
- RestrictionEntry reBoolean = new RestrictionEntry(KEY_BOOLEAN, false);
- populateBooleanEntry(res, reBoolean);
- newRestrictions.add(reBoolean);
-
- RestrictionEntry reSingleChoice = new RestrictionEntry(KEY_CHOICE, (String) null);
- populateChoiceEntry(res, reSingleChoice);
- newRestrictions.add(reSingleChoice);
-
- RestrictionEntry reMultiSelect = new RestrictionEntry(KEY_MULTI_SELECT, (String[]) null);
- populateMultiEntry(res, reMultiSelect);
- newRestrictions.add(reMultiSelect);
-
- return newRestrictions;
- }
-
- private void createRestrictions(Context context, PendingResult result,
- Bundle existingRestrictions) {
- // The incoming restrictions bundle contains key/value pairs representing existing app
- // restrictions for this package. In order to retain existing app restrictions, you need to
- // construct new restriction entries and then copy in any existing values for the new keys.
- ArrayList<RestrictionEntry> newEntries = initRestrictions(context);
-
- // If app restrictions were not previously configured for the package, create the default
- // restrictions entries and return them.
- if (existingRestrictions == null) {
- Bundle extras = new Bundle();
- extras.putParcelableArrayList(Intent.EXTRA_RESTRICTIONS_LIST, newEntries);
- result.setResult(Activity.RESULT_OK, null, extras);
- result.finish();
- return;
- }
-
- // Retains current restriction settings by transferring existing restriction entries to
- // new ones.
- for (RestrictionEntry entry : newEntries) {
- final String key = entry.getKey();
- if (KEY_BOOLEAN.equals(key)) {
- entry.setSelectedState(existingRestrictions.getBoolean(KEY_BOOLEAN));
- } else if (KEY_CHOICE.equals(key)) {
- if (existingRestrictions.containsKey(KEY_CHOICE)) {
- entry.setSelectedString(existingRestrictions.getString(KEY_CHOICE));
- }
- } else if (KEY_MULTI_SELECT.equals(key)) {
- if (existingRestrictions.containsKey(KEY_MULTI_SELECT)) {
- entry.setAllSelectedStrings(existingRestrictions.getStringArray(key));
- }
- }
- }
-
- final Bundle extras = new Bundle();
-
- // This path demonstrates the use of a custom app restriction activity instead of standard
- // types. When a custom activity is set, the standard types will not be available under
- // app restriction settings.
- //
- // If your app has an existing activity for app restriction configuration, you can set it
- // up with the intent here.
- if (PreferenceManager.getDefaultSharedPreferences(context)
- .getBoolean(MainActivity.CUSTOM_CONFIG_KEY, false)) {
- final Intent customIntent = new Intent();
- customIntent.setClass(context, CustomRestrictionsActivity.class);
- extras.putParcelable(Intent.EXTRA_RESTRICTIONS_INTENT, customIntent);
- }
-
- extras.putParcelableArrayList(Intent.EXTRA_RESTRICTIONS_LIST, newEntries);
- result.setResult(Activity.RESULT_OK, null, extras);
- result.finish();
- }
-}
diff --git a/samples/AppRestrictions/src/com/example/android/apprestrictions/MainActivity.java b/samples/AppRestrictions/src/com/example/android/apprestrictions/MainActivity.java
deleted file mode 100644
index 57c443906..000000000
--- a/samples/AppRestrictions/src/com/example/android/apprestrictions/MainActivity.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * 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.example.android.apprestrictions;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.os.Bundle;
-import android.os.UserManager;
-import android.preference.PreferenceManager;
-import android.view.View;
-import android.widget.CheckBox;
-import android.widget.TextView;
-
-/**
- * This is the main user interface of the App Restrictions sample app. It demonstrates the use
- * of the App Restriction feature, which is available on Android 4.3 and above tablet devices
- * with the multiuser feature.
- *
- * When launched under the primary User account, you can toggle between standard app restriction
- * types and custom. When launched under a restricted profile, this activity displays app
- * restriction settings, if available.
- *
- * Follow these steps to exercise the feature:
- * 1. If this is the primary user, go to Settings > Users.
- * 2. Create a restricted profile, if one doesn't exist already.
- * 3. Open the profile settings, locate the sample app, and tap the app restriction settings
- * icon. Configure app restrictions for the app.
- * 4. In the lock screen, switch to the user's restricted profile, launch this sample app,
- * and see the configured app restrictions displayed.
- */
-public class MainActivity extends Activity {
- private Bundle mRestrictionsBundle;
-
- // Checkbox to indicate whether custom or standard app restriction types are selected.
- private CheckBox mCustomConfig;
-
- public static final String CUSTOM_CONFIG_KEY = "custom_config";
-
- private TextView mMultiEntryValue;
- private TextView mChoiceEntryValue;
- private TextView mBooleanEntryValue;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- // Sets up user interface elements.
- setContentView(R.layout.main);
-
- mCustomConfig = (CheckBox) findViewById(R.id.custom_app_limits);
- final boolean customChecked =
- PreferenceManager.getDefaultSharedPreferences(this).getBoolean(
- CUSTOM_CONFIG_KEY, false);
- if (customChecked) mCustomConfig.setChecked(true);
-
- mMultiEntryValue = (TextView) findViewById(R.id.multi_entry_id);
- mChoiceEntryValue = (TextView) findViewById(R.id.choice_entry_id);
- mBooleanEntryValue = (TextView) findViewById(R.id.boolean_entry_id);
- }
-
- @Override
- protected void onResume() {
- super.onResume();
-
- // If app restrictions are set for this package, when launched from a restricted profile,
- // the settings are available in the returned Bundle as key/value pairs.
- mRestrictionsBundle =
- ((UserManager) getSystemService(Context.USER_SERVICE))
- .getApplicationRestrictions(getPackageName());
- if (mRestrictionsBundle == null) {
- mRestrictionsBundle = new Bundle();
- }
-
- // Reads and displays values from a boolean type restriction entry, if available.
- // An app can utilize these settings to restrict its content under a restricted profile.
- final String booleanRestrictionValue =
- mRestrictionsBundle.containsKey(GetRestrictionsReceiver.KEY_BOOLEAN) ?
- mRestrictionsBundle.getBoolean(GetRestrictionsReceiver.KEY_BOOLEAN) + "":
- getString(R.string.na);
- mBooleanEntryValue.setText(booleanRestrictionValue);
-
- // Reads and displays values from a single choice restriction entry, if available.
- final String singleChoiceRestrictionValue =
- mRestrictionsBundle.containsKey(GetRestrictionsReceiver.KEY_CHOICE) ?
- mRestrictionsBundle.getString(GetRestrictionsReceiver.KEY_CHOICE) :
- getString(R.string.na);
- mChoiceEntryValue.setText(singleChoiceRestrictionValue);
-
- // Reads and displays values from a multi-select restriction entry, if available.
- final String[] multiSelectValues =
- mRestrictionsBundle.getStringArray(GetRestrictionsReceiver.KEY_MULTI_SELECT);
- if (multiSelectValues == null || multiSelectValues.length == 0) {
- mMultiEntryValue.setText(getString(R.string.na));
- } else {
- String tempValue = "";
- for (String value : multiSelectValues) {
- tempValue = tempValue + value + " ";
- }
- mMultiEntryValue.setText(tempValue);
- }
- }
-
- /**
- * Saves custom app restriction to the shared preference.
- *
- * This flag is used by {@code GetRestrictionsReceiver} to determine if a custom app
- * restriction activity should be used.
- *
- * @param view
- */
- public void onCustomClicked(View view) {
- final SharedPreferences.Editor editor =
- PreferenceManager.getDefaultSharedPreferences(this).edit();
- editor.putBoolean(CUSTOM_CONFIG_KEY, mCustomConfig.isChecked()).commit();
- }
-}
diff --git a/samples/BluetoothLeGatt/Android.mk b/samples/BluetoothLeGatt/Android.mk
deleted file mode 100644
index 1e30b2242..000000000
--- a/samples/BluetoothLeGatt/Android.mk
+++ /dev/null
@@ -1,16 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := samples
-
-# Only compile source java files in this apk.
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_PACKAGE_NAME := BluetoothLeGatt
-
-LOCAL_SDK_VERSION := current
-
-include $(BUILD_PACKAGE)
-
-# Use the following include to make our test apk.
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/samples/BluetoothLeGatt/AndroidManifest.xml b/samples/BluetoothLeGatt/AndroidManifest.xml
deleted file mode 100644
index 019d2587d..000000000
--- a/samples/BluetoothLeGatt/AndroidManifest.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright (C) 2013 The Android Open Source Project
-
-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.
--->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.bluetooth.le"
- android:versionCode="1"
- android:versionName="1.0">
- <uses-sdk android:minSdkVersion="18"
- android:targetSdkVersion="18"/>
- <!-- Declare this required feature if you want to make the app available to BLE-capable
- devices only. If you want to make your app available to devices that don't support BLE,
- you should omit this in the manifest. Instead, determine BLE capability by using
- PackageManager.hasSystemFeature(FEATURE_BLUETOOTH_LE) -->
- <uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
-
- <uses-permission android:name="android.permission.BLUETOOTH"/>
- <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
-
- <application android:label="@string/app_name"
- android:icon="@drawable/ic_launcher"
- android:theme="@android:style/Theme.Holo.Light">
- <activity android:name=".DeviceScanActivity"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- <category android:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
- <activity android:name=".DeviceControlActivity"/>
- <service android:name=".BluetoothLeService" android:enabled="true"/>
- </application>
-</manifest>
diff --git a/samples/BluetoothLeGatt/res/drawable-hdpi/ic_launcher.png b/samples/BluetoothLeGatt/res/drawable-hdpi/ic_launcher.png
deleted file mode 100755
index 15367c050..000000000
--- a/samples/BluetoothLeGatt/res/drawable-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples/BluetoothLeGatt/res/drawable-mdpi/ic_launcher.png b/samples/BluetoothLeGatt/res/drawable-mdpi/ic_launcher.png
deleted file mode 100755
index ba810a766..000000000
--- a/samples/BluetoothLeGatt/res/drawable-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples/BluetoothLeGatt/res/drawable-xhdpi/ic_launcher.png b/samples/BluetoothLeGatt/res/drawable-xhdpi/ic_launcher.png
deleted file mode 100755
index 14f1d7467..000000000
--- a/samples/BluetoothLeGatt/res/drawable-xhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples/BluetoothLeGatt/res/drawable-xxhdpi/ic_launcher.png b/samples/BluetoothLeGatt/res/drawable-xxhdpi/ic_launcher.png
deleted file mode 100755
index 81ff9cc8b..000000000
--- a/samples/BluetoothLeGatt/res/drawable-xxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/samples/BluetoothLeGatt/res/layout/actionbar_indeterminate_progress.xml b/samples/BluetoothLeGatt/res/layout/actionbar_indeterminate_progress.xml
deleted file mode 100644
index a950833f8..000000000
--- a/samples/BluetoothLeGatt/res/layout/actionbar_indeterminate_progress.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<!--
- Copyright 2013 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.
- -->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_height="wrap_content"
- android:layout_width="56dp"
- android:minWidth="56dp">
- <ProgressBar android:layout_width="32dp"
- android:layout_height="32dp"
- android:layout_gravity="center"/>
-</FrameLayout>
diff --git a/samples/BluetoothLeGatt/res/layout/gatt_services_characteristics.xml b/samples/BluetoothLeGatt/res/layout/gatt_services_characteristics.xml
deleted file mode 100644
index 2f3106103..000000000
--- a/samples/BluetoothLeGatt/res/layout/gatt_services_characteristics.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2013 The Android Open Source Project
-
- 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.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_margin="10dp">
- <LinearLayout android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_margin="10dp">
- <TextView android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/label_device_address"
- android:textSize="18sp"/>
- <Space android:layout_width="5dp"
- android:layout_height="wrap_content"/>
- <TextView android:id="@+id/device_address"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textSize="18sp"/>
- </LinearLayout>
- <LinearLayout android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_margin="10dp">
- <TextView android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/label_state"
- android:textSize="18sp"/>
- <Space android:layout_width="5dp"
- android:layout_height="wrap_content"/>
- <TextView android:id="@+id/connection_state"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/disconnected"
- android:textSize="18sp"/>
- </LinearLayout>
- <LinearLayout android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_margin="10dp">
- <TextView android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/label_data"
- android:textSize="18sp"/>
- <Space android:layout_width="5dp"
- android:layout_height="wrap_content"/>
- <TextView android:id="@+id/data_value"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/no_data"
- android:textSize="18sp"/>
- </LinearLayout>
- <ExpandableListView android:id="@+id/gatt_services_list"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"/>
-</LinearLayout> \ No newline at end of file
diff --git a/samples/BluetoothLeGatt/res/layout/listitem_device.xml b/samples/BluetoothLeGatt/res/layout/listitem_device.xml
deleted file mode 100644
index eff44fcdd..000000000
--- a/samples/BluetoothLeGatt/res/layout/listitem_device.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2013 The Android Open Source Project
-
- 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.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
- <TextView android:id="@+id/device_name"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textSize="24dp"/>
- <TextView android:id="@+id/device_address"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textSize="12dp"/>
-</LinearLayout> \ No newline at end of file
diff --git a/samples/BluetoothLeGatt/res/menu/gatt_services.xml b/samples/BluetoothLeGatt/res/menu/gatt_services.xml
deleted file mode 100644
index 464d32ff7..000000000
--- a/samples/BluetoothLeGatt/res/menu/gatt_services.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2013 The Android Open Source Project
-
- 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.
--->
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:id="@+id/menu_refresh"
- android:checkable="false"
- android:orderInCategory="1"
- android:showAsAction="ifRoom"/>
- <item android:id="@+id/menu_connect"
- android:title="@string/menu_connect"
- android:orderInCategory="100"
- android:showAsAction="ifRoom|withText"/>
- <item android:id="@+id/menu_disconnect"
- android:title="@string/menu_disconnect"
- android:orderInCategory="101"
- android:showAsAction="ifRoom|withText"/>
-</menu>
diff --git a/samples/BluetoothLeGatt/res/menu/main.xml b/samples/BluetoothLeGatt/res/menu/main.xml
deleted file mode 100644
index 39dd66aa4..000000000
--- a/samples/BluetoothLeGatt/res/menu/main.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2013 The Android Open Source Project
-
- 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.
--->
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:id="@+id/menu_refresh"
- android:checkable="false"
- android:orderInCategory="1"
- android:showAsAction="ifRoom"/>
- <item android:id="@+id/menu_scan"
- android:title="@string/menu_scan"
- android:orderInCategory="100"
- android:showAsAction="ifRoom|withText"/>
- <item android:id="@+id/menu_stop"
- android:title="@string/menu_stop"
- android:orderInCategory="101"
- android:showAsAction="ifRoom|withText"/>
-</menu>
diff --git a/samples/BluetoothLeGatt/res/values/strings.xml b/samples/BluetoothLeGatt/res/values/strings.xml
deleted file mode 100644
index d828aa018..000000000
--- a/samples/BluetoothLeGatt/res/values/strings.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2013 The Android Open Source Project
-
- 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.
--->
-<resources>
- <string name="app_name">BLE Sample</string>
- <string name="ble_not_supported">BLE is not supported</string>
- <string name="label_data">Data:</string>
- <string name="label_device_address">Device address:</string>
- <string name="label_state">State:</string>
- <string name="no_data">No data</string>
- <string name="connected">Connected</string>
- <string name="disconnected">Disconnected</string>
- <string name="title_devices">BLE Device Scan</string>
- <string name="error_bluetooth_not_supported">Bluetooth not supported.</string>
-
- <string name="unknown_device">Unknown device</string>
- <string name="unknown_characteristic">Unknown characteristic</string>
- <string name="unknown_service">Unknown service</string>
-
- <!-- Menu items -->
- <string name="menu_connect">Connect</string>
- <string name="menu_disconnect">Disconnect</string>
- <string name="menu_scan">Scan</string>
- <string name="menu_stop">Stop</string>
-</resources>
diff --git a/samples/BluetoothLeGatt/src/com/example/bluetooth/le/BluetoothLeService.java b/samples/BluetoothLeGatt/src/com/example/bluetooth/le/BluetoothLeService.java
deleted file mode 100644
index 9e7aabd83..000000000
--- a/samples/BluetoothLeGatt/src/com/example/bluetooth/le/BluetoothLeService.java
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * 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.example.bluetooth.le;
-
-import android.app.Service;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothGatt;
-import android.bluetooth.BluetoothGattCallback;
-import android.bluetooth.BluetoothGattCharacteristic;
-import android.bluetooth.BluetoothGattDescriptor;
-import android.bluetooth.BluetoothGattService;
-import android.bluetooth.BluetoothManager;
-import android.bluetooth.BluetoothProfile;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Binder;
-import android.os.IBinder;
-import android.util.Log;
-
-import java.util.List;
-import java.util.UUID;
-
-/**
- * Service for managing connection and data communication with a GATT server hosted on a
- * given Bluetooth LE device.
- */
-public class BluetoothLeService extends Service {
- private final static String TAG = BluetoothLeService.class.getSimpleName();
-
- private BluetoothManager mBluetoothManager;
- private BluetoothAdapter mBluetoothAdapter;
- private String mBluetoothDeviceAddress;
- private BluetoothGatt mBluetoothGatt;
- private int mConnectionState = STATE_DISCONNECTED;
-
- private static final int STATE_DISCONNECTED = 0;
- private static final int STATE_CONNECTING = 1;
- private static final int STATE_CONNECTED = 2;
-
- public final static String ACTION_GATT_CONNECTED =
- "com.example.bluetooth.le.ACTION_GATT_CONNECTED";
- public final static String ACTION_GATT_DISCONNECTED =
- "com.example.bluetooth.le.ACTION_GATT_DISCONNECTED";
- public final static String ACTION_GATT_SERVICES_DISCOVERED =
- "com.example.bluetooth.le.ACTION_GATT_SERVICES_DISCOVERED";
- public final static String ACTION_DATA_AVAILABLE =
- "com.example.bluetooth.le.ACTION_DATA_AVAILABLE";
- public final static String EXTRA_DATA =
- "com.example.bluetooth.le.EXTRA_DATA";
-
- public final static UUID UUID_HEART_RATE_MEASUREMENT =
- UUID.fromString(SampleGattAttributes.HEART_RATE_MEASUREMENT);
-
- // Implements callback methods for GATT events that the app cares about. For example,
- // connection change and services discovered.
- private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
- @Override
- public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
- String intentAction;
- if (newState == BluetoothProfile.STATE_CONNECTED) {
- intentAction = ACTION_GATT_CONNECTED;
- mConnectionState = STATE_CONNECTED;
- broadcastUpdate(intentAction);
- Log.i(TAG, "Connected to GATT server.");
- // Attempts to discover services after successful connection.
- Log.i(TAG, "Attempting to start service discovery:" +
- mBluetoothGatt.discoverServices());
-
- } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
- intentAction = ACTION_GATT_DISCONNECTED;
- mConnectionState = STATE_DISCONNECTED;
- Log.i(TAG, "Disconnected from GATT server.");
- broadcastUpdate(intentAction);
- }
- }
-
- @Override
- public void onServicesDiscovered(BluetoothGatt gatt, int status) {
- if (status == BluetoothGatt.GATT_SUCCESS) {
- broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);
- } else {
- Log.w(TAG, "onServicesDiscovered received: " + status);
- }
- }
-
- @Override
- public void onCharacteristicRead(BluetoothGatt gatt,
- BluetoothGattCharacteristic characteristic,
- int status) {
- if (status == BluetoothGatt.GATT_SUCCESS) {
- broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
- }
- }
-
- @Override
- public void onCharacteristicChanged(BluetoothGatt gatt,
- BluetoothGattCharacteristic characteristic) {
- broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
- }
- };
-
- private void broadcastUpdate(final String action) {
- final Intent intent = new Intent(action);
- sendBroadcast(intent);
- }
-
- private void broadcastUpdate(final String action,
- final BluetoothGattCharacteristic characteristic) {
- final Intent intent = new Intent(action);
-
- // This is special handling for the Heart Rate Measurement profile. Data parsing is
- // carried out as per profile specifications:
- // http://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.heart_rate_measurement.xml
- if (UUID_HEART_RATE_MEASUREMENT.equals(characteristic.getUuid())) {
- int flag = characteristic.getProperties();
- int format = -1;
- if ((flag & 0x01) != 0) {
- format = BluetoothGattCharacteristic.FORMAT_UINT16;
- Log.d(TAG, "Heart rate format UINT16.");
- } else {
- format = BluetoothGattCharacteristic.FORMAT_UINT8;
- Log.d(TAG, "Heart rate format UINT8.");
- }
- final int heartRate = characteristic.getIntValue(format, 1);
- Log.d(TAG, String.format("Received heart rate: %d", heartRate));
- intent.putExtra(EXTRA_DATA, String.valueOf(heartRate));
- } else {
- // For all other profiles, writes the data formatted in HEX.
- final byte[] data = characteristic.getValue();
- if (data != null && data.length > 0) {
- final StringBuilder stringBuilder = new StringBuilder(data.length);
- for(byte byteChar : data)
- stringBuilder.append(String.format("%02X ", byteChar));
- intent.putExtra(EXTRA_DATA, new String(data) + "\n" + stringBuilder.toString());
- }
- }
- sendBroadcast(intent);
- }
-
- public class LocalBinder extends Binder {
- BluetoothLeService getService() {
- return BluetoothLeService.this;
- }
- }
-
- @Override
- public IBinder onBind(Intent intent) {
- return mBinder;
- }
-
- @Override
- public boolean onUnbind(Intent intent) {
- // After using a given device, you should make sure that BluetoothGatt.close() is called
- // such that resources are cleaned up properly. In this particular example, close() is
- // invoked when the UI is disconnected from the Service.
- close();
- return super.onUnbind(intent);
- }
-
- private final IBinder mBinder = new LocalBinder();
-
- /**
- * Initializes a reference to the local Bluetooth adapter.
- *
- * @return Return true if the initialization is successful.
- */
- public boolean initialize() {
- // For API level 18 and above, get a reference to BluetoothAdapter through
- // BluetoothManager.
- if (mBluetoothManager == null) {
- mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
- if (mBluetoothManager == null) {
- Log.e(TAG, "Unable to initialize BluetoothManager.");
- return false;
- }
- }
-
- mBluetoothAdapter = mBluetoothManager.getAdapter();
- if (mBluetoothAdapter == null) {
- Log.e(TAG, "Unable to obtain a BluetoothAdapter.");
- return false;
- }
-
- return true;
- }
-
- /**
- * Connects to the GATT server hosted on the Bluetooth LE device.
- *
- * @param address The device address of the destination device.
- *
- * @return Return true if the connection is initiated successfully. The connection result
- * is reported asynchronously through the
- * {@code BluetoothGattCallback#onConnectionStateChange(android.bluetooth.BluetoothGatt, int, int)}
- * callback.
- */
- public boolean connect(final String address) {
- if (mBluetoothAdapter == null || address == null) {
- Log.w(TAG, "BluetoothAdapter not initialized or unspecified address.");
- return false;
- }
-
- // Previously connected device. Try to reconnect.
- if (mBluetoothDeviceAddress != null && address.equals(mBluetoothDeviceAddress)
- && mBluetoothGatt != null) {
- Log.d(TAG, "Trying to use an existing mBluetoothGatt for connection.");
- if (mBluetoothGatt.connect()) {
- mConnectionState = STATE_CONNECTING;
- return true;
- } else {
- return false;
- }
- }
-
- final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
- if (device == null) {
- Log.w(TAG, "Device not found. Unable to connect.");
- return false;
- }
- // We want to directly connect to the device, so we are setting the autoConnect
- // parameter to false.
- mBluetoothGatt = device.connectGatt(this, false, mGattCallback);
- Log.d(TAG, "Trying to create a new connection.");
- mBluetoothDeviceAddress = address;
- mConnectionState = STATE_CONNECTING;
- return true;
- }
-
- /**
- * Disconnects an existing connection or cancel a pending connection. The disconnection result
- * is reported asynchronously through the
- * {@code BluetoothGattCallback#onConnectionStateChange(android.bluetooth.BluetoothGatt, int, int)}
- * callback.
- */
- public void disconnect() {
- if (mBluetoothAdapter == null || mBluetoothGatt == null) {
- Log.w(TAG, "BluetoothAdapter not initialized");
- return;
- }
- mBluetoothGatt.disconnect();
- }
-
- /**
- * After using a given BLE device, the app must call this method to ensure resources are
- * released properly.
- */
- public void close() {
- if (mBluetoothGatt == null) {
- return;
- }
- mBluetoothGatt.close();
- mBluetoothGatt = null;
- }
-
- /**
- * Request a read on a given {@code BluetoothGattCharacteristic}. The read result is reported
- * asynchronously through the {@code BluetoothGattCallback#onCharacteristicRead(android.bluetooth.BluetoothGatt, android.bluetooth.BluetoothGattCharacteristic, int)}
- * callback.
- *
- * @param characteristic The characteristic to read from.
- */
- public void readCharacteristic(BluetoothGattCharacteristic characteristic) {
- if (mBluetoothAdapter == null || mBluetoothGatt == null) {
- Log.w(TAG, "BluetoothAdapter not initialized");
- return;
- }
- mBluetoothGatt.readCharacteristic(characteristic);
- }
-
- /**
- * Enables or disables notification on a give characteristic.
- *
- * @param characteristic Characteristic to act on.
- * @param enabled If true, enable notification. False otherwise.
- */
- public void setCharacteristicNotification(BluetoothGattCharacteristic characteristic,
- boolean enabled) {
- if (mBluetoothAdapter == null || mBluetoothGatt == null) {
- Log.w(TAG, "BluetoothAdapter not initialized");
- return;
- }
- mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);
-
- // This is specific to Heart Rate Measurement.
- if (UUID_HEART_RATE_MEASUREMENT.equals(characteristic.getUuid())) {
- BluetoothGattDescriptor descriptor = characteristic.getDescriptor(
- UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
- descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
- mBluetoothGatt.writeDescriptor(descriptor);
- }
- }
-
- /**
- * Retrieves a list of supported GATT services on the connected device. This should be
- * invoked only after {@code BluetoothGatt#discoverServices()} completes successfully.
- *
- * @return A {@code List} of supported services.
- */
- public List<BluetoothGattService> getSupportedGattServices() {
- if (mBluetoothGatt == null) return null;
-
- return mBluetoothGatt.getServices();
- }
-}
diff --git a/samples/BluetoothLeGatt/src/com/example/bluetooth/le/DeviceControlActivity.java b/samples/BluetoothLeGatt/src/com/example/bluetooth/le/DeviceControlActivity.java
deleted file mode 100644
index 06b3bb465..000000000
--- a/samples/BluetoothLeGatt/src/com/example/bluetooth/le/DeviceControlActivity.java
+++ /dev/null
@@ -1,309 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * 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.example.bluetooth.le;
-
-import android.app.Activity;
-import android.bluetooth.BluetoothGattCharacteristic;
-import android.bluetooth.BluetoothGattService;
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.ServiceConnection;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.util.Log;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.widget.ExpandableListView;
-import android.widget.SimpleExpandableListAdapter;
-import android.widget.TextView;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-/**
- * For a given BLE device, this Activity provides the user interface to connect, display data,
- * and display GATT services and characteristics supported by the device. The Activity
- * communicates with {@code BluetoothLeService}, which in turn interacts with the
- * Bluetooth LE API.
- */
-public class DeviceControlActivity extends Activity {
- private final static String TAG = DeviceControlActivity.class.getSimpleName();
-
- public static final String EXTRAS_DEVICE_NAME = "DEVICE_NAME";
- public static final String EXTRAS_DEVICE_ADDRESS = "DEVICE_ADDRESS";
-
- private TextView mConnectionState;
- private TextView mDataField;
- private String mDeviceName;
- private String mDeviceAddress;
- private ExpandableListView mGattServicesList;
- private BluetoothLeService mBluetoothLeService;
- private ArrayList<ArrayList<BluetoothGattCharacteristic>> mGattCharacteristics =
- new ArrayList<ArrayList<BluetoothGattCharacteristic>>();
- private boolean mConnected = false;
- private BluetoothGattCharacteristic mNotifyCharacteristic;
-
- private final String LIST_NAME = "NAME";
- private final String LIST_UUID = "UUID";
-
- // Code to manage Service lifecycle.
- private final ServiceConnection mServiceConnection = new ServiceConnection() {
-
- @Override
- public void onServiceConnected(ComponentName componentName, IBinder service) {
- mBluetoothLeService = ((BluetoothLeService.LocalBinder) service).getService();
- if (!mBluetoothLeService.initialize()) {
- Log.e(TAG, "Unable to initialize Bluetooth");
- finish();
- }
- // Automatically connects to the device upon successful start-up initialization.
- mBluetoothLeService.connect(mDeviceAddress);
- }
-
- @Override
- public void onServiceDisconnected(ComponentName componentName) {
- mBluetoothLeService = null;
- }
- };
-
- // Handles various events fired by the Service.
- // ACTION_GATT_CONNECTED: connected to a GATT server.
- // ACTION_GATT_DISCONNECTED: disconnected from a GATT server.
- // ACTION_GATT_SERVICES_DISCOVERED: discovered GATT services.
- // ACTION_DATA_AVAILABLE: received data from the device. This can be a result of read
- // or notification operations.
- private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- final String action = intent.getAction();
- if (BluetoothLeService.ACTION_GATT_CONNECTED.equals(action)) {
- mConnected = true;
- updateConnectionState(R.string.connected);
- invalidateOptionsMenu();
- } else if (BluetoothLeService.ACTION_GATT_DISCONNECTED.equals(action)) {
- mConnected = false;
- updateConnectionState(R.string.disconnected);
- invalidateOptionsMenu();
- clearUI();
- } else if (BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED.equals(action)) {
- // Show all the supported services and characteristics on the user interface.
- displayGattServices(mBluetoothLeService.getSupportedGattServices());
- } else if (BluetoothLeService.ACTION_DATA_AVAILABLE.equals(action)) {
- displayData(intent.getStringExtra(BluetoothLeService.EXTRA_DATA));
- }
- }
- };
-
- // If a given GATT characteristic is selected, check for supported features. This sample
- // demonstrates 'Read' and 'Notify' features. See
- // http://d.android.com/reference/android/bluetooth/BluetoothGatt.html for the complete
- // list of supported characteristic features.
- private final ExpandableListView.OnChildClickListener servicesListClickListner =
- new ExpandableListView.OnChildClickListener() {
- @Override
- public boolean onChildClick(ExpandableListView parent, View v, int groupPosition,
- int childPosition, long id) {
- if (mGattCharacteristics != null) {
- final BluetoothGattCharacteristic characteristic =
- mGattCharacteristics.get(groupPosition).get(childPosition);
- final int charaProp = characteristic.getProperties();
- if ((charaProp | BluetoothGattCharacteristic.PROPERTY_READ) > 0) {
- // If there is an active notification on a characteristic, clear
- // it first so it doesn't update the data field on the user interface.
- if (mNotifyCharacteristic != null) {
- mBluetoothLeService.setCharacteristicNotification(
- mNotifyCharacteristic, false);
- mNotifyCharacteristic = null;
- }
- mBluetoothLeService.readCharacteristic(characteristic);
- }
- if ((charaProp | BluetoothGattCharacteristic.PROPERTY_NOTIFY) > 0) {
- mNotifyCharacteristic = characteristic;
- mBluetoothLeService.setCharacteristicNotification(
- characteristic, true);
- }
- return true;
- }
- return false;
- }
- };
-
- private void clearUI() {
- mGattServicesList.setAdapter((SimpleExpandableListAdapter) null);
- mDataField.setText(R.string.no_data);
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.gatt_services_characteristics);
-
- final Intent intent = getIntent();
- mDeviceName = intent.getStringExtra(EXTRAS_DEVICE_NAME);
- mDeviceAddress = intent.getStringExtra(EXTRAS_DEVICE_ADDRESS);
-
- // Sets up UI references.
- ((TextView) findViewById(R.id.device_address)).setText(mDeviceAddress);
- mGattServicesList = (ExpandableListView) findViewById(R.id.gatt_services_list);
- mGattServicesList.setOnChildClickListener(servicesListClickListner);
- mConnectionState = (TextView) findViewById(R.id.connection_state);
- mDataField = (TextView) findViewById(R.id.data_value);
-
- getActionBar().setTitle(mDeviceName);
- getActionBar().setDisplayHomeAsUpEnabled(true);
- Intent gattServiceIntent = new Intent(this, BluetoothLeService.class);
- bindService(gattServiceIntent, mServiceConnection, BIND_AUTO_CREATE);
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- registerReceiver(mGattUpdateReceiver, makeGattUpdateIntentFilter());
- if (mBluetoothLeService != null) {
- final boolean result = mBluetoothLeService.connect(mDeviceAddress);
- Log.d(TAG, "Connect request result=" + result);
- }
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- unregisterReceiver(mGattUpdateReceiver);
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- unbindService(mServiceConnection);
- mBluetoothLeService = null;
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.gatt_services, menu);
- if (mConnected) {
- menu.findItem(R.id.menu_connect).setVisible(false);
- menu.findItem(R.id.menu_disconnect).setVisible(true);
- } else {
- menu.findItem(R.id.menu_connect).setVisible(true);
- menu.findItem(R.id.menu_disconnect).setVisible(false);
- }
- return true;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch(item.getItemId()) {
- case R.id.menu_connect:
- mBluetoothLeService.connect(mDeviceAddress);
- return true;
- case R.id.menu_disconnect:
- mBluetoothLeService.disconnect();
- return true;
- case android.R.id.home:
- onBackPressed();
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
-
- private void updateConnectionState(final int resourceId) {
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- mConnectionState.setText(resourceId);
- }
- });
- }
-
- private void displayData(String data) {
- if (data != null) {
- mDataField.setText(data);
- }
- }
-
- // Demonstrates how to iterate through the supported GATT Services/Characteristics.
- // In this sample, we populate the data structure that is bound to the ExpandableListView
- // on the UI.
- private void displayGattServices(List<BluetoothGattService> gattServices) {
- if (gattServices == null) return;
- String uuid = null;
- String unknownServiceString = getResources().getString(R.string.unknown_service);
- String unknownCharaString = getResources().getString(R.string.unknown_characteristic);
- ArrayList<HashMap<String, String>> gattServiceData = new ArrayList<HashMap<String, String>>();
- ArrayList<ArrayList<HashMap<String, String>>> gattCharacteristicData
- = new ArrayList<ArrayList<HashMap<String, String>>>();
- mGattCharacteristics = new ArrayList<ArrayList<BluetoothGattCharacteristic>>();
-
- // Loops through available GATT Services.
- for (BluetoothGattService gattService : gattServices) {
- HashMap<String, String> currentServiceData = new HashMap<String, String>();
- uuid = gattService.getUuid().toString();
- currentServiceData.put(
- LIST_NAME, SampleGattAttributes.lookup(uuid, unknownServiceString));
- currentServiceData.put(LIST_UUID, uuid);
- gattServiceData.add(currentServiceData);
-
- ArrayList<HashMap<String, String>> gattCharacteristicGroupData =
- new ArrayList<HashMap<String, String>>();
- List<BluetoothGattCharacteristic> gattCharacteristics =
- gattService.getCharacteristics();
- ArrayList<BluetoothGattCharacteristic> charas =
- new ArrayList<BluetoothGattCharacteristic>();
-
- // Loops through available Characteristics.
- for (BluetoothGattCharacteristic gattCharacteristic : gattCharacteristics) {
- charas.add(gattCharacteristic);
- HashMap<String, String> currentCharaData = new HashMap<String, String>();
- uuid = gattCharacteristic.getUuid().toString();
- currentCharaData.put(
- LIST_NAME, SampleGattAttributes.lookup(uuid, unknownCharaString));
- currentCharaData.put(LIST_UUID, uuid);
- gattCharacteristicGroupData.add(currentCharaData);
- }
- mGattCharacteristics.add(charas);
- gattCharacteristicData.add(gattCharacteristicGroupData);
- }
-
- SimpleExpandableListAdapter gattServiceAdapter = new SimpleExpandableListAdapter(
- this,
- gattServiceData,
- android.R.layout.simple_expandable_list_item_2,
- new String[] {LIST_NAME, LIST_UUID},
- new int[] { android.R.id.text1, android.R.id.text2 },
- gattCharacteristicData,
- android.R.layout.simple_expandable_list_item_2,
- new String[] {LIST_NAME, LIST_UUID},
- new int[] { android.R.id.text1, android.R.id.text2 }
- );
- mGattServicesList.setAdapter(gattServiceAdapter);
- }
-
- private static IntentFilter makeGattUpdateIntentFilter() {
- final IntentFilter intentFilter = new IntentFilter();
- intentFilter.addAction(BluetoothLeService.ACTION_GATT_CONNECTED);
- intentFilter.addAction(BluetoothLeService.ACTION_GATT_DISCONNECTED);
- intentFilter.addAction(BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED);
- intentFilter.addAction(BluetoothLeService.ACTION_DATA_AVAILABLE);
- return intentFilter;
- }
-}
diff --git a/samples/BluetoothLeGatt/src/com/example/bluetooth/le/DeviceScanActivity.java b/samples/BluetoothLeGatt/src/com/example/bluetooth/le/DeviceScanActivity.java
deleted file mode 100644
index 1cc954df2..000000000
--- a/samples/BluetoothLeGatt/src/com/example/bluetooth/le/DeviceScanActivity.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * 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.example.bluetooth.le;
-
-import android.app.Activity;
-import android.app.ListActivity;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothManager;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.os.Bundle;
-import android.os.Handler;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.BaseAdapter;
-import android.widget.ListView;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import java.util.ArrayList;
-import java.util.UUID;
-
-/**
- * Activity for scanning and displaying available Bluetooth LE devices.
- */
-public class DeviceScanActivity extends ListActivity {
- private LeDeviceListAdapter mLeDeviceListAdapter;
- private BluetoothAdapter mBluetoothAdapter;
- private boolean mScanning;
- private Handler mHandler;
-
- private static final int REQUEST_ENABLE_BT = 1;
- // Stops scanning after 10 seconds.
- private static final long SCAN_PERIOD = 10000;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- getActionBar().setTitle(R.string.title_devices);
- mHandler = new Handler();
-
- // Use this check to determine whether BLE is supported on the device. Then you can
- // selectively disable BLE-related features.
- if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
- Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show();
- finish();
- }
-
- // Initializes a Bluetooth adapter. For API level 18 and above, get a reference to
- // BluetoothAdapter through BluetoothManager.
- final BluetoothManager bluetoothManager =
- (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
- mBluetoothAdapter = bluetoothManager.getAdapter();
-
- // Checks if Bluetooth is supported on the device.
- if (mBluetoothAdapter == null) {
- Toast.makeText(this, R.string.error_bluetooth_not_supported, Toast.LENGTH_SHORT).show();
- finish();
- return;
- }
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.main, menu);
- if (!mScanning) {
- menu.findItem(R.id.menu_stop).setVisible(false);
- menu.findItem(R.id.menu_scan).setVisible(true);
- menu.findItem(R.id.menu_refresh).setActionView(null);
- } else {
- menu.findItem(R.id.menu_stop).setVisible(true);
- menu.findItem(R.id.menu_scan).setVisible(false);
- menu.findItem(R.id.menu_refresh).setActionView(
- R.layout.actionbar_indeterminate_progress);
- }
- return true;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.menu_scan:
- mLeDeviceListAdapter.clear();
- scanLeDevice(true);
- break;
- case R.id.menu_stop:
- scanLeDevice(false);
- break;
- }
- return true;
- }
-
- @Override
- protected void onResume() {
- super.onResume();
-
- // Ensures Bluetooth is enabled on the device. If Bluetooth is not currently enabled,
- // fire an intent to display a dialog asking the user to grant permission to enable it.
- if (!mBluetoothAdapter.isEnabled()) {
- if (!mBluetoothAdapter.isEnabled()) {
- Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
- startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
- }
- }
-
- // Initializes list view adapter.
- mLeDeviceListAdapter = new LeDeviceListAdapter();
- setListAdapter(mLeDeviceListAdapter);
- scanLeDevice(true);
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- // User chose not to enable Bluetooth.
- if (requestCode == REQUEST_ENABLE_BT && resultCode == Activity.RESULT_CANCELED) {
- finish();
- return;
- }
- super.onActivityResult(requestCode, resultCode, data);
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- scanLeDevice(false);
- mLeDeviceListAdapter.clear();
- }
-
- @Override
- protected void onListItemClick(ListView l, View v, int position, long id) {
- final BluetoothDevice device = mLeDeviceListAdapter.getDevice(position);
- if (device == null) return;
- final Intent intent = new Intent(this, DeviceControlActivity.class);
- intent.putExtra(DeviceControlActivity.EXTRAS_DEVICE_NAME, device.getName());
- intent.putExtra(DeviceControlActivity.EXTRAS_DEVICE_ADDRESS, device.getAddress());
- if (mScanning) {
- mBluetoothAdapter.stopLeScan(mLeScanCallback);
- mScanning = false;
- }
- startActivity(intent);
- }
-
- private void scanLeDevice(final boolean enable) {
- if (enable) {
- // Stops scanning after a pre-defined scan period.
- mHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- mScanning = false;
- mBluetoothAdapter.stopLeScan(mLeScanCallback);
- invalidateOptionsMenu();
- }
- }, SCAN_PERIOD);
-
- mScanning = true;
- mBluetoothAdapter.startLeScan(mLeScanCallback);
- } else {
- mScanning = false;
- mBluetoothAdapter.stopLeScan(mLeScanCallback);
- }
- invalidateOptionsMenu();
- }
-
- // Adapter for holding devices found through scanning.
- private class LeDeviceListAdapter extends BaseAdapter {
- private ArrayList<BluetoothDevice> mLeDevices;
- private LayoutInflater mInflator;
-
- public LeDeviceListAdapter() {
- super();
- mLeDevices = new ArrayList<BluetoothDevice>();
- mInflator = DeviceScanActivity.this.getLayoutInflater();
- }
-
- public void addDevice(BluetoothDevice device) {
- if(!mLeDevices.contains(device)) {
- mLeDevices.add(device);
- }
- }
-
- public BluetoothDevice getDevice(int position) {
- return mLeDevices.get(position);
- }
-
- public void clear() {
- mLeDevices.clear();
- }
-
- @Override
- public int getCount() {
- return mLeDevices.size();
- }
-
- @Override
- public Object getItem(int i) {
- return mLeDevices.get(i);
- }
-
- @Override
- public long getItemId(int i) {
- return i;
- }
-
- @Override
- public View getView(int i, View view, ViewGroup viewGroup) {
- ViewHolder viewHolder;
- // General ListView optimization code.
- if (view == null) {
- view = mInflator.inflate(R.layout.listitem_device, null);
- viewHolder = new ViewHolder();
- viewHolder.deviceAddress = (TextView) view.findViewById(R.id.device_address);
- viewHolder.deviceName = (TextView) view.findViewById(R.id.device_name);
- view.setTag(viewHolder);
- } else {
- viewHolder = (ViewHolder) view.getTag();
- }
-
- BluetoothDevice device = mLeDevices.get(i);
- final String deviceName = device.getName();
- if (deviceName != null && deviceName.length() > 0)
- viewHolder.deviceName.setText(deviceName);
- else
- viewHolder.deviceName.setText(R.string.unknown_device);
- viewHolder.deviceAddress.setText(device.getAddress());
-
- return view;
- }
- }
-
- // Device scan callback.
- private BluetoothAdapter.LeScanCallback mLeScanCallback =
- new BluetoothAdapter.LeScanCallback() {
-
- @Override
- public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- mLeDeviceListAdapter.addDevice(device);
- mLeDeviceListAdapter.notifyDataSetChanged();
- }
- });
- }
- };
-
- static class ViewHolder {
- TextView deviceName;
- TextView deviceAddress;
- }
-} \ No newline at end of file
diff --git a/samples/BluetoothLeGatt/src/com/example/bluetooth/le/SampleGattAttributes.java b/samples/BluetoothLeGatt/src/com/example/bluetooth/le/SampleGattAttributes.java
deleted file mode 100644
index 255653eb0..000000000
--- a/samples/BluetoothLeGatt/src/com/example/bluetooth/le/SampleGattAttributes.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * 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.example.bluetooth.le;
-
-import java.util.HashMap;
-
-/**
- * This class includes a small subset of standard GATT attributes for demonstration purposes.
- */
-public class SampleGattAttributes {
- private static HashMap<String, String> attributes = new HashMap();
- public static String HEART_RATE_MEASUREMENT = "00002a37-0000-1000-8000-00805f9b34fb";
- public static String CLIENT_CHARACTERISTIC_CONFIG = "00002902-0000-1000-8000-00805f9b34fb";
-
- static {
- // Sample Services.
- attributes.put("0000180d-0000-1000-8000-00805f9b34fb", "Heart Rate Service");
- attributes.put("0000180a-0000-1000-8000-00805f9b34fb", "Device Information Service");
- // Sample Characteristics.
- attributes.put(HEART_RATE_MEASUREMENT, "Heart Rate Measurement");
- attributes.put("00002a29-0000-1000-8000-00805f9b34fb", "Manufacturer Name String");
- }
-
- public static String lookup(String uuid, String defaultName) {
- String name = attributes.get(uuid);
- return name == null ? defaultName : name;
- }
-}