From e77abcd465f0bf44007ee8ddb1a66ac91c0fbf4b Mon Sep 17 00:00:00 2001 From: Adam Koch Date: Wed, 30 Oct 2013 15:56:59 -0400 Subject: [PATCH] KitKat SMS APIs DevByte Sample Code Change-Id: I9f0a414e73b37183f4939b95c21c4ce1d5dc52f0 --- .../telephony/SmsSampleProject/README | 7 + .../SmsSampleProject/SmsSample/build.gradle | 43 ++++ .../SmsSample/src/main/AndroidManifest.xml | 138 ++++++++++++ .../android/smssample/MainActivity.java | 203 ++++++++++++++++++ .../com/example/android/smssample/Utils.java | 68 ++++++ .../smssample/receiver/MessagingReceiver.java | 69 ++++++ .../smssample/receiver/MmsReceiver.java | 24 +++ .../smssample/receiver/MmsReceiverLegacy.java | 24 +++ .../smssample/receiver/SmsReceiver.java | 24 +++ .../smssample/receiver/SmsReceiverLegacy.java | 24 +++ .../smssample/service/MessagingService.java | 58 +++++ .../smssample/service/RespondService.java | 46 ++++ .../main/res/drawable-hdpi/ic_launcher.png | Bin 0 -> 3964 bytes .../main/res/drawable-mdpi/ic_launcher.png | Bin 0 -> 2424 bytes .../main/res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 5527 bytes .../main/res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 9889 bytes .../src/main/res/layout/activity_main.xml | 93 ++++++++ .../SmsSample/src/main/res/menu/main.xml | 23 ++ .../src/main/res/values-v11/styles.xml | 26 +++ .../src/main/res/values-v19/bools.xml | 19 ++ .../SmsSample/src/main/res/values/bools.xml | 19 ++ .../SmsSample/src/main/res/values/colors.xml | 20 ++ .../SmsSample/src/main/res/values/dimens.xml | 19 ++ .../SmsSample/src/main/res/values/strings.xml | 28 +++ .../SmsSample/src/main/res/values/styles.xml | 35 +++ .../telephony/SmsSampleProject/build.gradle | 1 + .../SmsSampleProject/local.properties.sample | 7 + .../SmsSampleProject/settings.gradle | 1 + 28 files changed, 1019 insertions(+) create mode 100644 samples/devbytes/telephony/SmsSampleProject/README create mode 100644 samples/devbytes/telephony/SmsSampleProject/SmsSample/build.gradle create mode 100644 samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/AndroidManifest.xml create mode 100644 samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/MainActivity.java create mode 100644 samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/Utils.java create mode 100644 samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/MessagingReceiver.java create mode 100644 samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/MmsReceiver.java create mode 100644 samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/MmsReceiverLegacy.java create mode 100644 samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/SmsReceiver.java create mode 100644 samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/receiver/SmsReceiverLegacy.java create mode 100644 samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/service/MessagingService.java create mode 100644 samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/service/RespondService.java create mode 100644 samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-hdpi/ic_launcher.png create mode 100644 samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-mdpi/ic_launcher.png create mode 100644 samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-xhdpi/ic_launcher.png create mode 100644 samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-xxhdpi/ic_launcher.png create mode 100644 samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/layout/activity_main.xml create mode 100644 samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/menu/main.xml create mode 100644 samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values-v11/styles.xml create mode 100644 samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values-v19/bools.xml create mode 100644 samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/bools.xml create mode 100644 samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/colors.xml create mode 100644 samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/dimens.xml create mode 100644 samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/strings.xml create mode 100644 samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/values/styles.xml create mode 100644 samples/devbytes/telephony/SmsSampleProject/build.gradle create mode 100644 samples/devbytes/telephony/SmsSampleProject/local.properties.sample create mode 100644 samples/devbytes/telephony/SmsSampleProject/settings.gradle 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 { + 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 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 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 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 0000000000000000000000000000000000000000..98cfcc5a85f1c324b828ee22ee1379fd6d0152b4 GIT binary patch literal 3964 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%0AX(AZ|PL~LLllfG+^Lc zo(3?uJadk>AJ1f+ib_C>WzYbAazUmL{J&y^DVk8r2^jF^*FFu-QxLxBuHR$738>WA~9J1&yO@@ zyk5)za_TJ=0vKEky0+)uwr-iz(>(EF;KJ-b6PYadsCTv^2v9(oIY5{u*o*A$@49e*ghX{%!liWE8X-YusrMaAB>n)^)bW`hVSd7Zm*#~*3_2zWif6i* z#Pd-JXbcT7gNjFj4REq1NK3f)w5M(F{hA>6g4tk6RzNcuWNf4Wws?Y)8x*63-{tz$>$2 z+H_5ky>A%jdKE%ID&U4`gO*^UHHI9i5mMUA>wu-Svn0nHGY1km<3v&)<|iac;O5fg zh#JuFrHv{T5d>g7uwy1%A!a5l5{fZDiENKJ?{mQNct8XsHNo4~7jZi*&B>A?+bR0x zZP83ngGK92F31~65b!uF-+ZXv3rAi%j654)Nig3jl?j;54_hCb3~81m$Uz~giv3}0 zNOQRz_brT82hzIKcjgG+k@4vrd+_-TsQA<0h9EUP- ztG0B*CgAPfw|48+?S?5+rVOJOc{h#Th42GtbPUcj~K^{L7awJM{Ye{CV@{{f>6= zieI;*Rwo)h|NQey8#ivOt|79VsZ*y;q&k;EIt#&S^b~!%cI}$Y_d0(3_`x}I<~&7h zgudCff(8%Ue~8LXDo3e=Y5?wsAKT*BZg_Cg^O6t?!3Jx(PvQKV-;|pFIBf z<1>l4G?IMW&)KnK$J`k+W-OMVRQyntAYG&at@a5?wK>>@3m0Y*_&dq`v;-Ica?6%2 z8vzh?^3PQ8rtvTh$olA`kM=cd)=YtT{``68jyvw?O7-3M@>?K6knl$MK8qGDn%%#D z|J&--tLI$2coF9AB$1Fy8WcueCGg=jSzQFAz5VvvFLmzR`4IpC5YL`Hd-1Wy9-BsB ztfTJb+md3TkVPS~kAOjg2E`+QH9P0}>#x84g%@5}(7JW&t4c~r6bbZqbN+MW$dUh8 z$yyLdWVH~mV#SJ^va_>cLNbi$aaOHb^~UVkvlmb=|3U@t*SF_QascHa0At19N9a9s z=FDjX_|F9Y22j zl+&kAe@=Zwl#s|NmWKcgA3qA~OlI#E3bXUbA-6>Y1r4MqYW-bz-8CeR*{c+8s+@q= zUw?fp4g7yt`ar<4Wy@YzvSi82G{Uc`#0@_U3gsmLmm|Q)oiu6Eghw8E*RN zbdxG0VDaL`oqP7|iLkRN$KV?`Zd^BQ+O#>;kF8WNMGp%*Z9Jk9fUp!Pmm3!>Sn%}V z!GmwdtQrJRNPBMg?%lbQCr_@Dzo%AJ1f;$5&O6H~?0gWZ07(C-Q>O|aee}^M^7HdQ zCLs1w@g=DeNMKX~&^(fk**Q5mgGe}@Z`ZC}6PQKx?Z}ZMD=12Oh|b50#41Eds)PW_ ztPbeatJlXg15M|!^R2hu`qTXR^YdsF+o_yRaj+FZ0LI>&O0VhDr%$2G@BJJYkS3Ip zZyH1y%ug!>7t}ZWSwG~;Q~6}ATeof> zCD)WA$4r>)d7_C}Q2Y3^U7aXV*YDL=U(KVrNe6_bn>TNER<2z6`MdAFds_--F_r$i zbt|0!T8#JwnVzL^yfjc};J|?x+`m&e`X}neE-K~8MrKi}d>=(qFc*ph${&@7004n( z?{y?3_mhzPYU|dm&i3uwl_{be(?ptaFDnaf$AM%y0J=En57fU%!6y={tk^i2T(4O`A6LqH|{wHBjF3 zm8}7pv~V(_Lx&DiiG*Al)O&mP?p;Kk#o~l-Whlh~WYGlbWlCrK*Z{SD*REYZk3ax$ zKv>$F{J;}5Q@@)QQg%|C&k+d_mP*T%RyF|`)D2Xwp@MaW0%LmcS4C3^J8gdON|wK& zl5I}xrSH#7`zdniR!3Nhzara*3ff2B{#zj|UY^5zSDV0qCI*3pY;Nu$uiMQ04 z?0}HZL7OP}04$Vb@<{RSp_VSGKyVNmqs>%9Qw~+DRtv Z{{z2lu~D>|ecb>6002ovPDHLkV1kM3lO_NF literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c51e62f69000247ef0e804b4aead0b0bf3b34a84 GIT binary patch literal 9889 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 TeR6lk00000NkvXXu0mjf|Az43 literal 0 HcmV?d00001 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 @@ + + + + + +