e6bd5ec230e8143ddc1c03521f2d1d813e23a8e9
[android/platform/packages/apps/Tag.git] / src / com / android / apps / tag / MyTagActivity.java
1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package com.android.apps.tag;
18
19 import com.android.apps.tag.message.NdefMessageParser;
20 import com.android.apps.tag.message.ParsedNdefMessage;
21 import com.android.apps.tag.record.ParsedNdefRecord;
22 import com.android.apps.tag.record.TextRecord;
23 import com.android.apps.tag.record.UriRecord;
24 import com.google.common.collect.Lists;
25
26 import android.app.Activity;
27 import android.content.Intent;
28 import android.nfc.NdefMessage;
29 import android.nfc.NdefRecord;
30 import android.nfc.NfcAdapter;
31 import android.os.Bundle;
32 import android.util.Log;
33 import android.view.View;
34 import android.view.View.OnClickListener;
35 import android.widget.CheckBox;
36 import android.widget.EditText;
37
38 import java.net.MalformedURLException;
39 import java.net.URL;
40 import java.util.ArrayList;
41 import java.util.List;
42 import java.util.Locale;
43
44 /**
45  * Editor {@link Activity} for the tag that can be programmed into the device.
46  */
47 public class MyTagActivity extends EditTagActivity implements OnClickListener {
48
49     private static final String LOG_TAG = "TagEditor";
50
51     private EditText mTitleView;
52     private EditText mTextView;
53     private CheckBox mEnabled;
54
55     /**
56      * Whether or not data was already parsed from an {@link Intent}. This happens when the user
57      * shares data via the My tag feature.
58      */
59     private boolean mParsedIntent = false;
60
61     @Override
62     protected void onCreate(Bundle savedInstanceState) {
63         super.onCreate(savedInstanceState);
64
65         setContentView(R.layout.my_tag_activity);
66
67         findViewById(R.id.toggle_enabled_target).setOnClickListener(this);
68         findViewById(R.id.add_content_target).setOnClickListener(this);
69
70         mTitleView = (EditText) findViewById(R.id.input_tag_title);
71         mTextView = (EditText) findViewById(R.id.input_tag_text);
72         mEnabled = (CheckBox) findViewById(R.id.toggle_enabled_checkbox);
73     }
74
75     @Override
76     public void onStart() {
77         super.onStart();
78
79         NdefMessage localMessage = NfcAdapter.getDefaultAdapter().getLocalNdefMessage();
80
81         if (Intent.ACTION_SEND.equals(getIntent().getAction()) && !mParsedIntent) {
82             if (localMessage != null) {
83                 // TODO: prompt user for confirmation about wiping their old tag.
84             }
85
86             if (buildFromIntent(getIntent())) {
87                 return;
88             }
89
90             mParsedIntent = true;
91
92         } else if (localMessage == null) {
93             mEnabled.setChecked(false);
94             return;
95
96         } else {
97             // Locally stored message.
98             ParsedNdefMessage parsed = NdefMessageParser.parse(localMessage);
99             List<ParsedNdefRecord> records = parsed.getRecords();
100
101             // There is always a "Title" and a "Text" record for My Tag.
102             if (records.size() < 2) {
103                 Log.w(LOG_TAG, "Local record not in expected format");
104                 return;
105             }
106             mEnabled.setChecked(true);
107             mTitleView.setText(((TextRecord) records.get(0)).getText());
108             mTextView.setText(((TextRecord) records.get(1)).getText());
109
110             // TODO: rebuild the records!
111         }
112     }
113
114     /**
115      * Populates the editor from extras in a given {@link Intent}
116      * @param intent the {@link Intent} to parse.
117      * @return whether or not the {@link Intent} could be handled.
118      */
119     private boolean buildFromIntent(final Intent intent) {
120         String type = intent.getType();
121
122         if ("text/plain".equals(type)) {
123             String title = getIntent().getStringExtra(Intent.EXTRA_SUBJECT);
124             mTitleView.setText((title == null) ? "" : title);
125
126             String text = getIntent().getStringExtra(Intent.EXTRA_TEXT);
127
128             try {
129                 URL parsed = new URL(text);
130
131                 // Valid URL.
132                 mTextView.setText("");
133                 mRecords.add(new UriRecord.UriRecordEditInfo(text));
134                 rebuildChildViews();
135
136             } catch (MalformedURLException ex) {
137                 // Ignore. Just treat as plain text.
138                 mTextView.setText((text == null) ? "" : text);
139             }
140
141             mEnabled.setChecked(true);
142             onSave();
143             return true;
144         }
145         // TODO: handle vcards and images.
146         return false;
147     }
148
149     /**
150      * Persists content to store.
151      */
152     private void onSave() {
153         String title = mTitleView.getText().toString();
154         String text = mTextView.getText().toString();
155         NfcAdapter nfc = NfcAdapter.getDefaultAdapter();
156
157         if ((title.isEmpty() && text.isEmpty()) || !mEnabled.isChecked()) {
158             nfc.setLocalNdefMessage(null);
159             return;
160         }
161
162         Locale locale = getResources().getConfiguration().locale;
163         ArrayList<NdefRecord> values = Lists.newArrayList(
164                 TextRecord.newTextRecord(title, locale),
165                 TextRecord.newTextRecord(text, locale)
166         );
167
168         values.addAll(getValues());
169
170         Log.d(LOG_TAG, "Writing local NdefMessage from tag app....");
171         nfc.setLocalNdefMessage(new NdefMessage(values.toArray(new NdefRecord[values.size()])));
172     }
173
174     @Override
175     public void onPause() {
176         super.onPause();
177         onSave();
178     }
179
180     @Override
181     public void onClick(View target) {
182         switch (target.getId()) {
183             case R.id.toggle_enabled_target:
184                 boolean enabled = !mEnabled.isChecked();
185                 mEnabled.setChecked(enabled);
186
187                 // TODO: Persist to some store.
188                 if (enabled) {
189                     onSave();
190                 } else {
191                     NfcAdapter.getDefaultAdapter().setLocalNdefMessage(null);
192                 }
193                 break;
194
195             case R.id.add_content_target:
196                 showAddContentDialog();
197                 break;
198         }
199     }
200
201 }