summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Koch <akoch@google.com>2013-10-30 23:44:10 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2013-10-30 23:44:10 +0000
commitddba6b876843c72e49b812d028f19e0be656ab9f (patch)
tree950e012b89f0f22ae61fffb425c163afd98f67bf
parent79efac6b3aedb6e5bcb54bec7566fa9038240f93 (diff)
parente77abcd465f0bf44007ee8ddb1a66ac91c0fbf4b (diff)
downloadandroid_development-ddba6b876843c72e49b812d028f19e0be656ab9f.tar.gz
android_development-ddba6b876843c72e49b812d028f19e0be656ab9f.tar.bz2
android_development-ddba6b876843c72e49b812d028f19e0be656ab9f.zip
Merge "KitKat SMS APIs DevByte Sample Code" into klp-dev
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/README7
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/SmsSample/build.gradle43
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/AndroidManifest.xml138
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/MainActivity.java203
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/Utils.java68
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/MessagingReceiver.java69
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/MmsReceiver.java24
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/MmsReceiverLegacy.java24
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/SmsReceiver.java24
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/SmsReceiverLegacy.java24
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/service/MessagingService.java58
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/service/RespondService.java46
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-hdpi/ic_launcher.pngbin0 -> 3964 bytes
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-mdpi/ic_launcher.pngbin0 -> 2424 bytes
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-xhdpi/ic_launcher.pngbin0 -> 5527 bytes
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-xxhdpi/ic_launcher.pngbin0 -> 9889 bytes
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/layout/activity_main.xml93
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/menu/main.xml23
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values-v11/styles.xml26
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values-v19/bools.xml19
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/bools.xml19
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/colors.xml20
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/dimens.xml19
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/strings.xml28
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/styles.xml35
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/build.gradle1
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/local.properties.sample7
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/settings.gradle1
28 files changed, 1019 insertions, 0 deletions
diff --git a/samples/devbytes/telephony/SmsSampleProject/README b/samples/devbytes/telephony/SmsSampleProject/README
new file mode 100644
index 000000000..a26768cab
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/README
@@ -0,0 +1,7 @@
+This is an Android Studio project:
+http://developer.android.com/sdk/installing/studio.html
+
+To build you should first copy local.properties.sample to
+local.properties and set your SDK path.
+
+Then use Android Studio to import the project.
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/build.gradle b/samples/devbytes/telephony/SmsSampleProject/SmsSample/build.gradle
new file mode 100644
index 000000000..d0f9b9766
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/SmsSample/build.gradle
@@ -0,0 +1,43 @@
+/*
+ * 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.
+ */
+
+buildscript {
+ repositories {
+ mavenCentral()
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:0.6.+'
+ }
+}
+apply plugin: 'android'
+
+repositories {
+ mavenCentral()
+}
+
+android {
+ compileSdkVersion 19
+ buildToolsVersion "18.1.1"
+
+ defaultConfig {
+ minSdkVersion 10
+ targetSdkVersion 19
+ }
+}
+
+dependencies {
+ compile 'com.android.support:support-v4:18.0.0'
+}
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/AndroidManifest.xml b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/AndroidManifest.xml
new file mode 100644
index 000000000..d6d43799d
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/AndroidManifest.xml
@@ -0,0 +1,138 @@
+<?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.android.smssample"
+ android:versionCode="1"
+ android:versionName="1.0" >
+
+ <uses-sdk
+ android:minSdkVersion="10"
+ android:targetSdkVersion="19" />
+
+ <uses-permission android:name="android.permission.WRITE_SMS" />
+ <uses-permission android:name="android.permission.READ_SMS" />
+ <uses-permission android:name="android.permission.SEND_SMS" />
+ <uses-permission android:name="android.permission.RECEIVE_SMS" />
+ <uses-permission android:name="android.permission.RECEIVE_MMS" />
+ <uses-permission android:name="android.permission.WAKE_LOCK" />
+
+ <application
+ android:allowBackup="true"
+ android:icon="@drawable/ic_launcher"
+ android:label="@string/app_name"
+ android:theme="@style/AppTheme" >
+
+ <activity
+ android:name=".MainActivity"
+ android:label="@string/app_name"
+ android:windowSoftInputMode="stateHidden">
+
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+
+ <intent-filter>
+ <action android:name="android.intent.action.SEND" />
+ <action android:name="android.intent.action.SENDTO" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <data android:scheme="sms" />
+ <data android:scheme="smsto" />
+ <data android:scheme="mms" />
+ <data android:scheme="mmsto" />
+ </intent-filter>
+
+ </activity>
+
+ <!-- BroadcastReceiver that listens for incoming SMS messages -->
+ <!-- Note the use of android:enabled that is linked to a bool. This will mean this receiver
+ is enabled on KitKat devices and above -->
+ <receiver android:name=".receiver.SmsReceiver"
+ android:enabled="@bool/hasKitKat"
+ android:permission="android.permission.BROADCAST_SMS">
+
+ <!-- KitKat+ SMS received action -->
+ <intent-filter>
+ <action android:name="android.provider.Telephony.SMS_DELIVER" />
+ </intent-filter>
+
+ </receiver>
+
+ <!-- BroadcastReceiver that listens for incoming SMS messages -->
+ <!-- Note the use of android:enabled that is linked to a bool. This will mean this receiver
+ is enabled on preKitKat devices -->
+ <receiver android:name=".receiver.SmsReceiverLegacy"
+ android:enabled="@bool/preKitKat">
+
+ <!-- Pre-KitKat SMS received action -->
+ <intent-filter>
+ <action android:name="android.provider.Telephony.SMS_RECEIVED" />
+ </intent-filter>
+
+ </receiver>
+
+ <!-- BroadcastReceiver that listens for incoming MMS messages -->
+ <!-- Note the use of android:enabled that is linked to a bool. This will mean this receiver
+ is enabled on KitKat devices and above -->
+ <receiver android:name=".receiver.MmsReceiver"
+ android:enabled="@bool/hasKitKat"
+ android:permission="android.permission.BROADCAST_WAP_PUSH">
+
+ <!-- KitKat+ MMS received action -->
+ <intent-filter>
+ <action android:name="android.provider.Telephony.WAP_PUSH_DELIVER" />
+ <data android:mimeType="application/vnd.wap.mms-message" />
+ </intent-filter>
+
+ </receiver>
+
+ <!-- BroadcastReceiver that listens for incoming MMS messages -->
+ <!-- Note the use of android:enabled that is linked to a bool. This will mean this receiver
+ is enabled on preKitKat devices -->
+ <receiver android:name=".receiver.MmsReceiverLegacy"
+ android:enabled="@bool/preKitKat">
+
+ <!-- Pre-KitKat MMS received action -->
+ <intent-filter>
+ <action android:name="android.provider.Telephony.WAP_PUSH_RECEIVED" />
+ <data android:mimeType="application/vnd.wap.mms-message" />
+ </intent-filter>
+
+ </receiver>
+
+ <!-- Service that delivers SMS messages received from the phone "quick response" -->
+ <service android:name=".service.RespondService"
+ android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE"
+ android:exported="true" >
+ <intent-filter>
+ <action android:name="android.intent.action.RESPOND_VIA_MESSAGE" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="sms" />
+ <data android:scheme="smsto" />
+ <data android:scheme="mms" />
+ <data android:scheme="mmsto" />
+ </intent-filter>
+ </service>
+
+ <!-- A service used internally to process incoming SMS/MMS -->
+ <service android:name=".service.MessagingService"
+ android:exported="false" />
+
+ </application>
+
+</manifest>
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/MainActivity.java b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/MainActivity.java
new file mode 100644
index 000000000..c94939704
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/MainActivity.java
@@ -0,0 +1,203 @@
+/*
+ * 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.smssample;
+
+import android.content.Intent;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.Telephony.Sms.Inbox;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.LoaderManager.LoaderCallbacks;
+import android.support.v4.content.CursorLoader;
+import android.support.v4.content.Loader;
+import android.support.v4.widget.SimpleCursorAdapter;
+import android.text.TextUtils;
+import android.view.Menu;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ListView;
+import android.widget.RelativeLayout;
+import android.widget.Toast;
+
+/**
+ * The main Activity that provides a sample of a few things:
+ * -detecting if this app is the default SMS app and then showing/hiding UI and enabling/disabling
+ * functionality. the UI that is shown has a button to prompt the user to set this app as the
+ * default.
+ * -a simple query to the SMS content provider to show a list of SMS messages in the inbox. even
+ * though the query uses KitKat APIs this query should still work on earlier versions of Android
+ * as the contract class and ContentProvider were still around (with essentially the same
+ * structure) but were private.
+ * -being triggered from another application when creating a new SMS. a good example is creating
+ * a new SMS from the system People application. although nothing is done with the incoming
+ * Intent in this case (just a Toast is displayed)
+ *
+ * Obviously this is far from a full implementation and should just be used as a sample of how
+ * an app could be set up to correctly integrate with the new Android 4.4 KitKat APIs while
+ * running normally on earlier Android versions.
+ */
+public class MainActivity extends FragmentActivity implements LoaderCallbacks<Cursor> {
+ private RelativeLayout mSetDefaultSmsLayout;
+ private Button mSendSmsButton;
+ private EditText mSendSmsEditText;
+ private SimpleCursorAdapter mAdapter;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+
+ // Find some views
+ mSetDefaultSmsLayout = (RelativeLayout) findViewById(R.id.set_default_sms_layout);
+ mSendSmsEditText = (EditText) findViewById(R.id.send_sms_edittext);
+ ListView listView = (ListView) findViewById(android.R.id.list);
+ listView.setEmptyView(findViewById(android.R.id.empty));
+ mSendSmsButton = (Button) findViewById(R.id.send_sms_button);
+ mSendSmsButton.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ sendSms(mSendSmsEditText.getText().toString());
+ }
+ });
+
+ // Create adapter and set it to our ListView
+ final String[] fromFields = new String[] {
+ SmsQuery.PROJECTION[SmsQuery.ADDRESS], SmsQuery.PROJECTION[SmsQuery.BODY] };
+ final int[] toViews = new int[] { android.R.id.text1, android.R.id.text2 };
+ mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, null,
+ fromFields, toViews, 0);
+ listView.setAdapter(mAdapter);
+
+ // Placeholder to process incoming SEND/SENDTO intents
+ String intentAction = getIntent() == null ? null : getIntent().getAction();
+ if (!TextUtils.isEmpty(intentAction) && (Intent.ACTION_SENDTO.equals(intentAction)
+ || Intent.ACTION_SEND.equals(intentAction))) {
+ // TODO: Handle incoming SEND and SENDTO intents by pre-populating UI components
+ Toast.makeText(this, "Handle SEND and SENDTO intents: " + getIntent().getDataString(),
+ Toast.LENGTH_SHORT).show();
+ }
+
+ // Simple query to show the most recent SMS messages in the inbox
+ getSupportLoaderManager().initLoader(SmsQuery.TOKEN, null, this);
+ }
+
+ /**
+ * Dummy sendSms method, would need the "to" address to actually send a message :)
+ */
+ private void sendSms(String smsText) {
+ if (!TextUtils.isEmpty(smsText)) {
+ if (Utils.isDefaultSmsApp(this)) {
+ // TODO: Use SmsManager to send SMS and then record the message in the system SMS
+ // ContentProvider
+ Toast.makeText(this, "Sending text message: " + smsText, Toast.LENGTH_SHORT).show();
+ } else {
+ // TODO: Notify the user the app is not default and provide a way to trigger
+ // Utils.setDefaultSmsApp() so they can set it.
+ Toast.makeText(this, "Not default", Toast.LENGTH_SHORT).show();
+ }
+ }
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ // Only do these checks/changes on KitKat+, the "mSetDefaultSmsLayout" has its visibility
+ // set to "gone" in the xml layout so it won't show at all on earlier Android versions.
+ if (Utils.hasKitKat()) {
+ if (Utils.isDefaultSmsApp(this)) {
+ // This app is the default, remove the "make this app the default" layout and
+ // enable message sending components.
+ mSetDefaultSmsLayout.setVisibility(View.GONE);
+ mSendSmsEditText.setHint(R.string.sms_send_new_hint);
+ mSendSmsEditText.setEnabled(true);
+ mSendSmsButton.setEnabled(true);
+ } else {
+ // Not the default, show the "make this app the default" layout and disable
+ // message sending components.
+ mSetDefaultSmsLayout.setVisibility(View.VISIBLE);
+ mSendSmsEditText.setText("");
+ mSendSmsEditText.setHint(R.string.sms_send_disabled);
+ mSendSmsEditText.setEnabled(false);
+ mSendSmsButton.setEnabled(false);
+
+ Button button = (Button) findViewById(R.id.set_default_sms_button);
+ button.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ Utils.setDefaultSmsApp(MainActivity.this);
+ }
+ });
+ }
+ }
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ // Inflate the menu; this adds items to the action bar if it is present.
+ getMenuInflater().inflate(R.menu.main, menu);
+ return true;
+ }
+
+ @Override
+ public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
+ if (i == SmsQuery.TOKEN) {
+ // This will fetch all SMS messages in the inbox, ordered by date desc
+ return new CursorLoader(this, SmsQuery.CONTENT_URI, SmsQuery.PROJECTION, null, null,
+ SmsQuery.SORT_ORDER);
+ }
+ return null;
+ }
+
+ @Override
+ public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
+ if (cursorLoader.getId() == SmsQuery.TOKEN && cursor != null) {
+ // Standard swap cursor in when load is done
+ mAdapter.swapCursor(cursor);
+ }
+ }
+
+ @Override
+ public void onLoaderReset(Loader<Cursor> cursorLoader) {
+ // Standard swap cursor to null when loader is reset
+ mAdapter.swapCursor(null);
+ }
+
+ /**
+ * A basic SmsQuery on android.provider.Telephony.Sms.Inbox
+ */
+ private interface SmsQuery {
+ int TOKEN = 1;
+
+ static final Uri CONTENT_URI = Inbox.CONTENT_URI;
+
+ static final String[] PROJECTION = {
+ Inbox._ID,
+ Inbox.ADDRESS,
+ Inbox.BODY,
+ };
+
+ static final String SORT_ORDER = Inbox.DEFAULT_SORT_ORDER;
+
+ int ID = 0;
+ int ADDRESS = 1;
+ int BODY = 2;
+ }
+}
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/Utils.java b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/Utils.java
new file mode 100644
index 000000000..00dc7d600
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/Utils.java
@@ -0,0 +1,68 @@
+/*
+ * 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.smssample;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build;
+import android.os.Build.VERSION_CODES;
+import android.provider.Telephony;
+import android.provider.Telephony.Sms.Intents;
+
+public class Utils {
+
+ /**
+ * Check if the device runs Android 4.3 (JB MR2) or higher.
+ */
+ public static boolean hasJellyBeanMR2() {
+ return Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR2;
+ }
+
+ /**
+ * Check if the device runs Android 4.4 (KitKat) or higher.
+ */
+ public static boolean hasKitKat() {
+ return Build.VERSION.SDK_INT >= VERSION_CODES.KITKAT;
+ }
+
+ /**
+ * Check if your app is the default system SMS app.
+ * @param context The Context
+ * @return True if it is default, False otherwise. Pre-KitKat will always return True.
+ */
+ public static boolean isDefaultSmsApp(Context context) {
+ if (hasKitKat()) {
+ return context.getPackageName().equals(Telephony.Sms.getDefaultSmsPackage(context));
+ }
+
+ return true;
+ }
+
+ /**
+ * Trigger the intent to open the system dialog that asks the user to change the default
+ * SMS app.
+ * @param context The Context
+ */
+ public static void setDefaultSmsApp(Context context) {
+ // This is a new intent which only exists on KitKat
+ if (hasKitKat()) {
+ Intent intent = new Intent(Intents.ACTION_CHANGE_DEFAULT);
+ intent.putExtra(Intents.EXTRA_PACKAGE_NAME, context.getPackageName());
+ context.startActivity(intent);
+ }
+ }
+}
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/MessagingReceiver.java b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/MessagingReceiver.java
new file mode 100644
index 000000000..4dcb05533
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/MessagingReceiver.java
@@ -0,0 +1,69 @@
+/*
+ * 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.smssample.receiver;
+
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Telephony.Sms.Intents;
+import android.support.v4.content.WakefulBroadcastReceiver;
+
+import com.example.android.smssample.service.MessagingService;
+import com.example.android.smssample.Utils;
+
+/**
+ * The main messaging receiver class. Note that this is not directly included in
+ * AndroidManifest.xml, instead, subclassed versions of this are included which allows
+ * them to be enabled/disabled independently as they will have a unique component name.
+ */
+public class MessagingReceiver extends WakefulBroadcastReceiver {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent == null ? null : intent.getAction();
+
+ // If on KitKat+ and default messaging app then look for new deliver actions actions.
+ if (Utils.hasKitKat() && Utils.isDefaultSmsApp(context)) {
+ if (Intents.SMS_DELIVER_ACTION.equals(action)) {
+ handleIncomingSms(context, intent);
+ } else if (Intents.WAP_PUSH_DELIVER_ACTION.equals(action)) {
+ handleIncomingMms(context, intent);
+ }
+ } else { // Otherwise look for old pre-KitKat actions
+ if (Intents.SMS_RECEIVED_ACTION.equals(action)) {
+ handleIncomingSms(context, intent);
+ } else if (Intents.WAP_PUSH_RECEIVED_ACTION.equals(action)) {
+ handleIncomingMms(context, intent);
+ }
+ }
+ }
+
+ private void handleIncomingSms(Context context, Intent intent) {
+ // TODO: Handle SMS here
+ // As an example, we'll start a wakeful service to handle the SMS
+ intent.setAction(MessagingService.ACTION_MY_RECEIVE_SMS);
+ intent.setClass(context, MessagingService.class);
+ startWakefulService(context, intent);
+ }
+
+ private void handleIncomingMms(Context context, Intent intent) {
+ // TODO: Handle MMS here
+ // As an example, we'll start a wakeful service to handle the MMS
+ intent.setAction(MessagingService.ACTION_MY_RECEIVE_MMS);
+ intent.setClass(context, MessagingService.class);
+ startWakefulService(context, intent);
+ }
+}
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/MmsReceiver.java b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/MmsReceiver.java
new file mode 100644
index 000000000..40f04bb60
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/MmsReceiver.java
@@ -0,0 +1,24 @@
+/*
+ * 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.smssample.receiver;
+
+/**
+ * Stub subclass to allow individual receiver components in AndroidManifest to be enabled/disabled.
+ */
+public class MmsReceiver extends MessagingReceiver {
+
+}
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/MmsReceiverLegacy.java b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/MmsReceiverLegacy.java
new file mode 100644
index 000000000..181fe45c5
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/MmsReceiverLegacy.java
@@ -0,0 +1,24 @@
+/*
+ * 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.smssample.receiver;
+
+/**
+ * Stub subclass to allow individual receiver components in AndroidManifest to be enabled/disabled.
+ */
+public class MmsReceiverLegacy extends MessagingReceiver {
+
+}
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/SmsReceiver.java b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/SmsReceiver.java
new file mode 100644
index 000000000..0c4a2cc76
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/SmsReceiver.java
@@ -0,0 +1,24 @@
+/*
+ * 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.smssample.receiver;
+
+/**
+ * Stub subclass to allow individual receiver components in AndroidManifest to be enabled/disabled.
+ */
+public class SmsReceiver extends MessagingReceiver {
+
+}
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/SmsReceiverLegacy.java b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/SmsReceiverLegacy.java
new file mode 100644
index 000000000..a02d18813
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/SmsReceiverLegacy.java
@@ -0,0 +1,24 @@
+/*
+ * 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.smssample.receiver;
+
+/**
+ * Stub subclass to allow individual receiver components in AndroidManifest to be enabled/disabled.
+ */
+public class SmsReceiverLegacy extends MessagingReceiver {
+
+}
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/service/MessagingService.java b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/service/MessagingService.java
new file mode 100644
index 000000000..af191e8b2
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/service/MessagingService.java
@@ -0,0 +1,58 @@
+/*
+ * 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.smssample.service;
+
+import android.app.IntentService;
+import android.content.Intent;
+
+import com.example.android.smssample.receiver.MessagingReceiver;
+
+/**
+ * This service is triggered internally only and is used to process incoming SMS and MMS messages
+ * that the {@link com.example.android.smssample.receiver.MessagingReceiver} passes over. It's
+ * preferable to handle these in a service in case there is significant work to do which may exceed
+ * the time allowed in a receiver.
+ */
+public class MessagingService extends IntentService {
+ private static final String TAG = "MessagingService";
+
+ // These actions are for this app only and are used by MessagingReceiver to start this service
+ public static final String ACTION_MY_RECEIVE_SMS = "com.example.android.smssample.RECEIVE_SMS";
+ public static final String ACTION_MY_RECEIVE_MMS = "com.example.android.smssample.RECEIVE_MMS";
+
+ public MessagingService() {
+ super(TAG);
+ }
+
+ @Override
+ protected void onHandleIntent(Intent intent) {
+ if (intent != null) {
+ String intentAction = intent.getAction();
+ if (ACTION_MY_RECEIVE_SMS.equals(intentAction)) {
+ // TODO: Handle incoming SMS
+
+ // Ensure wakelock is released that was created by the WakefulBroadcastReceiver
+ MessagingReceiver.completeWakefulIntent(intent);
+ } else if (ACTION_MY_RECEIVE_MMS.equals(intentAction)) {
+ // TODO: Handle incoming MMS
+
+ // Ensure wakelock is released that was created by the WakefulBroadcastReceiver
+ MessagingReceiver.completeWakefulIntent(intent);
+ }
+ }
+ }
+}
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/service/RespondService.java b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/service/RespondService.java
new file mode 100644
index 000000000..d88a762bc
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/service/RespondService.java
@@ -0,0 +1,46 @@
+/*
+ * 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.smssample.service;
+
+import android.app.IntentService;
+import android.content.Intent;
+import android.telephony.TelephonyManager;
+
+import com.example.android.smssample.Utils;
+
+/**
+ * This service handles the system intent ACTION_RESPOND_VIA_MESSAGE when we are the default SMS
+ * app.
+ */
+public class RespondService extends IntentService {
+ private static final String TAG = "RespondService";
+
+ public RespondService() {
+ super(TAG);
+ }
+
+ @Override
+ protected void onHandleIntent(Intent intent) {
+ if (intent != null) {
+ if (Utils.hasJellyBeanMR2() && Utils.isDefaultSmsApp(this) &&
+ // ACTION_RESPOND_VIA_MESSAGE was added in JB MR2
+ TelephonyManager.ACTION_RESPOND_VIA_MESSAGE.equals(intent.getAction())) {
+ // TODO: Handle "respond via message" quick reply
+ }
+ }
+ }
+}
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-hdpi/ic_launcher.png b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 000000000..98cfcc5a8
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-mdpi/ic_launcher.png b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 000000000..6ccb6e05e
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-xhdpi/ic_launcher.png b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 000000000..893b1ee4c
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-xxhdpi/ic_launcher.png b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-xxhdpi/ic_launcher.png
new file mode 100644
index 000000000..c51e62f69
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/layout/activity_main.xml b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/layout/activity_main.xml
new file mode 100644
index 000000000..3005568e3
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/layout/activity_main.xml
@@ -0,0 +1,93 @@
+<!--
+ 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"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ tools:context=".MainActivity">
+
+ <RelativeLayout
+ android:id="@+id/set_default_sms_layout"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:visibility="gone"
+ android:background="@color/alert_orange">
+
+ <Button
+ android:id="@+id/set_default_sms_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentRight="true"
+ android:layout_centerVertical="true"
+ android:layout_margin="@dimen/standard_margin"
+ android:text="@string/choose_sms_app" />
+
+ <TextView
+ android:id="@+id/set_default_sms_textview"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_toLeftOf="@+id/set_default_sms_button"
+ android:layout_centerVertical="true"
+ android:layout_margin="@dimen/standard_margin"
+ android:text="@string/set_default_sms_text" />
+
+ </RelativeLayout>
+
+ <ListView
+ android:id="@android:id/list"
+ android:layout_height="0dp"
+ android:layout_width="match_parent"
+ android:layout_weight="1"
+ android:fastScrollEnabled="true" />
+
+ <TextView
+ android:id="@android:id/empty"
+ android:layout_height="0dp"
+ android:layout_width="match_parent"
+ android:layout_weight="1"
+ android:gravity="center"
+ android:visibility="gone"
+ android:layout_margin="@dimen/standard_margin"
+ style="?android:textAppearanceMedium"
+ android:text="@string/sms_empty" />
+
+ <RelativeLayout
+ android:id="@+id/send_sms_layout"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:padding="@dimen/standard_margin"
+ android:background="@color/light_gray">
+
+ <Button
+ android:id="@+id/send_sms_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentRight="true"
+ android:layout_centerVertical="true"
+ android:text="@string/sms_send" />
+
+ <EditText
+ android:id="@+id/send_sms_edittext"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_toLeftOf="@+id/send_sms_button"
+ android:layout_centerVertical="true"
+ android:hint="@string/sms_send_new_hint"/>
+
+ </RelativeLayout>
+
+</LinearLayout>
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/menu/main.xml b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/menu/main.xml
new file mode 100644
index 000000000..e4ee086db
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/menu/main.xml
@@ -0,0 +1,23 @@
+<!--
+ 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/action_default"
+ android:title="@string/action_settings"
+ android:orderInCategory="100"
+ android:showAsAction="never" />
+
+</menu>
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values-v11/styles.xml b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values-v11/styles.xml
new file mode 100644
index 000000000..425c775b3
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values-v11/styles.xml
@@ -0,0 +1,26 @@
+<!--
+ 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>
+
+ <!--
+ Base application theme for API 11+. This theme completely replaces
+ AppBaseTheme from res/values/styles.xml on API 11+ devices.
+ -->
+ <style name="AppBaseTheme" parent="android:Theme.Holo.Light">
+ <!-- API 11 theme customizations can go here. -->
+ </style>
+
+</resources>
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values-v19/bools.xml b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values-v19/bools.xml
new file mode 100644
index 000000000..20c993a7c
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values-v19/bools.xml
@@ -0,0 +1,19 @@
+<!--
+ 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>
+ <bool name="hasKitKat">true</bool>
+ <bool name="preKitKat">false</bool>
+</resources> \ No newline at end of file
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/bools.xml b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/bools.xml
new file mode 100644
index 000000000..1bded920c
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/bools.xml
@@ -0,0 +1,19 @@
+<!--
+ 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>
+ <bool name="hasKitKat">false</bool>
+ <bool name="preKitKat">true</bool>
+</resources> \ No newline at end of file
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/colors.xml b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/colors.xml
new file mode 100644
index 000000000..7f13ecd5a
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/colors.xml
@@ -0,0 +1,20 @@
+<?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>
+ <color name="alert_orange">#FFBB33</color>
+ <color name="light_gray">#F4F4F4</color>
+</resources> \ No newline at end of file
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/dimens.xml b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/dimens.xml
new file mode 100644
index 000000000..020e4d3f6
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/dimens.xml
@@ -0,0 +1,19 @@
+<!--
+ 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>
+ <!-- Default screen margins, per the Android Design guidelines. -->
+ <dimen name="standard_margin">8dp</dimen>
+</resources>
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/strings.xml b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/strings.xml
new file mode 100644
index 000000000..c0f18e3de
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/strings.xml
@@ -0,0 +1,28 @@
+<?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">SmsDemoApp</string>
+ <string name="action_settings">Settings</string>
+ <string name="choose_sms_app">Set as default</string>
+ <string name="sms_empty">No SMS messages</string>
+ <string name="set_default_sms_text">This app is not the default SMS app</string>
+ <string name="sms_send_new_hint">Send new SMS</string>
+ <string name="sms_send">Send</string>
+ <string name="sms_send_disabled">SMS Sending Disabled</string>
+
+</resources>
diff --git a/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/styles.xml b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/styles.xml
new file mode 100644
index 000000000..848be93ad
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/styles.xml
@@ -0,0 +1,35 @@
+<!--
+ 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>
+
+ <!--
+ Base application theme, dependent on API level. This theme is replaced
+ by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
+ -->
+ <style name="AppBaseTheme" parent="android:Theme.Light">
+ <!--
+ Theme customizations available in newer API levels can go in
+ res/values-vXX/styles.xml, while customizations related to
+ backward-compatibility can go here.
+ -->
+ </style>
+
+ <!-- Application theme. -->
+ <style name="AppTheme" parent="AppBaseTheme">
+ <!-- All customizations that are NOT specific to a particular API-level can go here. -->
+ </style>
+
+</resources>
diff --git a/samples/devbytes/telephony/SmsSampleProject/build.gradle b/samples/devbytes/telephony/SmsSampleProject/build.gradle
new file mode 100644
index 000000000..495c5038e
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/build.gradle
@@ -0,0 +1 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
diff --git a/samples/devbytes/telephony/SmsSampleProject/local.properties.sample b/samples/devbytes/telephony/SmsSampleProject/local.properties.sample
new file mode 100644
index 000000000..37317f492
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/local.properties.sample
@@ -0,0 +1,7 @@
+# This file should be copied to local.properties and path set to point
+# to your Android SDK.
+
+# Location of the SDK. This is only used by Gradle.
+# For customization when using a Version Control System, please read the
+# header note.
+sdk.dir=/usr/local/lib/android-sdk \ No newline at end of file
diff --git a/samples/devbytes/telephony/SmsSampleProject/settings.gradle b/samples/devbytes/telephony/SmsSampleProject/settings.gradle
new file mode 100644
index 000000000..e0867f09e
--- /dev/null
+++ b/samples/devbytes/telephony/SmsSampleProject/settings.gradle
@@ -0,0 +1 @@
+include ':SmsSample' \ No newline at end of file