summaryrefslogtreecommitdiffstats
path: root/samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/MainActivity.java
diff options
context:
space:
mode:
Diffstat (limited to 'samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/MainActivity.java')
-rw-r--r--samples/devbytes/telephony/SmsSampleProject/SmsSample/src/main/java/com/example/android/smssample/MainActivity.java203
1 files changed, 203 insertions, 0 deletions
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;
+ }
+}