Restore tag records when re-starting MyTag activity.
[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.RecordEditInfo;
23 import com.android.apps.tag.record.TextRecord;
24 import com.android.apps.tag.record.UriRecord;
25 import com.google.common.collect.Lists;
26
27 import android.app.Activity;
28 import android.content.Intent;
29 import android.nfc.NdefMessage;
30 import android.nfc.NdefRecord;
31 import android.nfc.NfcAdapter;
32 import android.os.Bundle;
33 import android.util.Log;
34 import android.view.View;
35 import android.view.View.OnClickListener;
36 import android.widget.CheckBox;
37 import android.widget.EditText;
38
39 import java.net.MalformedURLException;
40 import java.net.URL;
41 import java.util.ArrayList;
42 import java.util.List;
43 import java.util.Locale;
44
45 /**
46  * Editor {@link Activity} for the tag that can be programmed into the device.
47  */
48 public class MyTagActivity extends EditTagActivity implements OnClickListener {
49
50     private static final String LOG_TAG = "TagEditor";
51
52     private EditText mTitleView;
53     private EditText mTextView;
54     private CheckBox mEnabled;
55
56     /**
57      * Whether or not data was already parsed from an {@link Intent}. This happens when the user
58      * shares data via the My tag feature.
59      */
60     private boolean mParsedIntent = false;
61
62     @Override
63     protected void onCreate(Bundle savedInstanceState) {
64         super.onCreate(savedInstanceState);
65
66         setContentView(R.layout.my_tag_activity);
67
68         findViewById(R.id.toggle_enabled_target).setOnClickListener(this);
69         findViewById(R.id.add_content_target).setOnClickListener(this);
70
71         mTitleView = (EditText) findViewById(R.id.input_tag_title);
72         mTextView = (EditText) findViewById(R.id.input_tag_text);
73         mEnabled = (CheckBox) findViewById(R.id.toggle_enabled_checkbox);
74
75         populateEditor();
76     }
77
78     private void populateEditor() {
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             mRecords.clear();
111             for (int i = 2, len = records.size(); i < len; i++) {
112                 RecordEditInfo editInfo = records.get(i).getEditInfo(this);
113                 if (editInfo != null) {
114                     addRecord(editInfo);
115                 }
116             }
117             rebuildChildViews();
118         }
119     }
120
121     /**
122      * Populates the editor from extras in a given {@link Intent}
123      * @param intent the {@link Intent} to parse.
124      * @return whether or not the {@link Intent} could be handled.
125      */
126     private boolean buildFromIntent(final Intent intent) {
127         String type = intent.getType();
128
129         if ("text/plain".equals(type)) {
130             String title = getIntent().getStringExtra(Intent.EXTRA_SUBJECT);
131             mTitleView.setText((title == null) ? "" : title);
132
133             String text = getIntent().getStringExtra(Intent.EXTRA_TEXT);
134
135             try {
136                 URL parsed = new URL(text);
137
138                 // Valid URL.
139                 mTextView.setText("");
140                 mRecords.add(new UriRecord.UriRecordEditInfo(text));
141                 rebuildChildViews();
142
143             } catch (MalformedURLException ex) {
144                 // Ignore. Just treat as plain text.
145                 mTextView.setText((text == null) ? "" : text);
146             }
147
148             mEnabled.setChecked(true);
149             onSave();
150             return true;
151         }
152         // TODO: handle vcards and images.
153         return false;
154     }
155
156     /**
157      * Persists content to store.
158      */
159     private void onSave() {
160         String title = mTitleView.getText().toString();
161         String text = mTextView.getText().toString();
162         NfcAdapter nfc = NfcAdapter.getDefaultAdapter();
163
164         if ((title.isEmpty() && text.isEmpty()) || !mEnabled.isChecked()) {
165             nfc.setLocalNdefMessage(null);
166             return;
167         }
168
169         Locale locale = getResources().getConfiguration().locale;
170         ArrayList<NdefRecord> values = Lists.newArrayList(
171                 TextRecord.newTextRecord(title, locale),
172                 TextRecord.newTextRecord(text, locale)
173         );
174
175         values.addAll(getValues());
176
177         Log.d(LOG_TAG, "Writing local NdefMessage from tag app....");
178         nfc.setLocalNdefMessage(new NdefMessage(values.toArray(new NdefRecord[values.size()])));
179     }
180
181     @Override
182     public void onPause() {
183         super.onPause();
184         onSave();
185     }
186
187     @Override
188     public void onClick(View target) {
189         switch (target.getId()) {
190             case R.id.toggle_enabled_target:
191                 boolean enabled = !mEnabled.isChecked();
192                 mEnabled.setChecked(enabled);
193
194                 // TODO: Persist to some store.
195                 if (enabled) {
196                     onSave();
197                 } else {
198                     NfcAdapter.getDefaultAdapter().setLocalNdefMessage(null);
199                 }
200                 break;
201
202             case R.id.add_content_target:
203                 showAddContentDialog();
204                 break;
205         }
206     }
207
208 }