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 000000000..98cfcc5a8 Binary files /dev/null and b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-hdpi/ic_launcher.png 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 Binary files /dev/null and b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-mdpi/ic_launcher.png 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 Binary files /dev/null and b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-xhdpi/ic_launcher.png 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 Binary files /dev/null and b/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/res/drawable-xxhdpi/ic_launcher.png 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 @@ + + + + + +