blob: a9c721788bd3d2acd056eb08f07007df169c45a0 [file] [log] [blame]
The Android Open Source Project0c908882009-03-03 19:32:16 -08001/*
2 * Copyright (C) 2006 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
17package com.android.browser;
18
19import android.app.Activity;
20import android.content.ContentResolver;
The Android Open Source Project0c908882009-03-03 19:32:16 -080021import android.content.Intent;
22import android.content.res.Resources;
Patrick Scott3918d442009-08-04 13:22:29 -040023import android.database.Cursor;
Ben Murdochaac7aa62009-09-17 16:57:40 +010024import android.graphics.Bitmap;
The Android Open Source Project0c908882009-03-03 19:32:16 -080025import android.net.ParseException;
26import android.net.WebAddress;
27import android.os.Bundle;
Ben Murdoch1794fe22009-09-29 18:14:30 +010028import android.os.Handler;
29import android.os.Message;
The Android Open Source Project0c908882009-03-03 19:32:16 -080030import android.provider.Browser;
31import android.view.View;
32import android.view.Window;
The Android Open Source Project0c908882009-03-03 19:32:16 -080033import android.widget.EditText;
34import android.widget.TextView;
35import android.widget.Toast;
36
Cary Clarkf2407c62009-09-04 12:25:10 -040037import java.net.URI;
38import java.net.URISyntaxException;
The Android Open Source Project0c908882009-03-03 19:32:16 -080039import java.util.Date;
40
41public class AddBookmarkPage extends Activity {
42
43 private final String LOGTAG = "Bookmarks";
44
45 private EditText mTitle;
46 private EditText mAddress;
47 private TextView mButton;
48 private View mCancelButton;
49 private boolean mEditingExisting;
50 private Bundle mMap;
Patrick Scott3918d442009-08-04 13:22:29 -040051 private String mTouchIconUrl;
Ben Murdochaac7aa62009-09-17 16:57:40 +010052 private Bitmap mThumbnail;
53 private String mOriginalUrl;
The Android Open Source Project0c908882009-03-03 19:32:16 -080054
Ben Murdoch1794fe22009-09-29 18:14:30 +010055 // Message IDs
56 private static final int SAVE_BOOKMARK = 100;
57
58 private Handler mHandler;
59
The Android Open Source Project0c908882009-03-03 19:32:16 -080060 private View.OnClickListener mSaveBookmark = new View.OnClickListener() {
61 public void onClick(View v) {
62 if (save()) {
63 finish();
The Android Open Source Project0c908882009-03-03 19:32:16 -080064 }
65 }
66 };
67
68 private View.OnClickListener mCancel = new View.OnClickListener() {
69 public void onClick(View v) {
70 finish();
71 }
72 };
73
74 protected void onCreate(Bundle icicle) {
75 super.onCreate(icicle);
76 requestWindowFeature(Window.FEATURE_LEFT_ICON);
77 setContentView(R.layout.browser_add_bookmark);
78 setTitle(R.string.save_to_bookmarks);
Ben Murdocha753d002009-10-01 11:36:19 +010079 getWindow().setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, R.drawable.ic_list_bookmark);
The Android Open Source Project0c908882009-03-03 19:32:16 -080080
81 String title = null;
82 String url = null;
83 mMap = getIntent().getExtras();
84 if (mMap != null) {
85 Bundle b = mMap.getBundle("bookmark");
86 if (b != null) {
87 mMap = b;
88 mEditingExisting = true;
89 setTitle(R.string.edit_bookmark);
90 }
91 title = mMap.getString("title");
Ben Murdochaac7aa62009-09-17 16:57:40 +010092 url = mOriginalUrl = mMap.getString("url");
Patrick Scott3918d442009-08-04 13:22:29 -040093 mTouchIconUrl = mMap.getString("touch_icon_url");
Ben Murdochaac7aa62009-09-17 16:57:40 +010094 mThumbnail = (Bitmap) mMap.getParcelable("thumbnail");
The Android Open Source Project0c908882009-03-03 19:32:16 -080095 }
96
97 mTitle = (EditText) findViewById(R.id.title);
98 mTitle.setText(title);
99 mAddress = (EditText) findViewById(R.id.address);
100 mAddress.setText(url);
101
The Android Open Source Project0c908882009-03-03 19:32:16 -0800102 View.OnClickListener accept = mSaveBookmark;
103 mButton = (TextView) findViewById(R.id.OK);
104 mButton.setOnClickListener(accept);
105
106 mCancelButton = findViewById(R.id.cancel);
107 mCancelButton.setOnClickListener(mCancel);
108
109 if (!getWindow().getDecorView().isInTouchMode()) {
110 mButton.requestFocus();
111 }
112 }
Ben Murdoch1794fe22009-09-29 18:14:30 +0100113
114 private void createHandler() {
115 if (mHandler == null) {
116 mHandler = new Handler() {
117 @Override
118 public void handleMessage(Message msg) {
119 switch (msg.what) {
120 case SAVE_BOOKMARK:
121 // Unbundle bookmark data.
122 Bundle bundle = msg.getData();
123 String title = bundle.getString("title");
124 String url = bundle.getString("url");
125 boolean invalidateThumbnail = bundle.getBoolean("invalidateThumbnail");
126 Bitmap thumbnail = invalidateThumbnail
127 ? null : (Bitmap) bundle.getParcelable("thumbnail");
128 String touchIconUrl = bundle.getString("touchIconUrl");
129
130 // Save to the bookmarks DB.
131 if (updateBookmarksDB(title, url, thumbnail, touchIconUrl)) {
132 Toast.makeText(AddBookmarkPage.this, R.string.bookmark_saved,
133 Toast.LENGTH_LONG).show();
134 } else {
135 Toast.makeText(AddBookmarkPage.this, R.string.bookmark_not_saved,
136 Toast.LENGTH_LONG).show();
137 }
138 break;
139 }
140 }
141 };
142 }
143 }
144
145 private boolean updateBookmarksDB(String title, String url, Bitmap thumbnail, String touchIconUrl) {
146 try {
147 final ContentResolver cr = getContentResolver();
148 Bookmarks.addBookmark(null, cr, url, title, thumbnail, true);
149 if (touchIconUrl != null) {
150 final Cursor c =
151 BrowserBookmarksAdapter.queryBookmarksForUrl(cr, null, url, true);
152 new DownloadTouchIcon(cr, c, url).execute(mTouchIconUrl);
153 }
154 } catch (IllegalStateException e) {
155 return false;
156 }
157 return true;
158 }
159
The Android Open Source Project0c908882009-03-03 19:32:16 -0800160 /**
Ben Murdoch1794fe22009-09-29 18:14:30 +0100161 * Parse the data entered in the dialog and post a message to update the bookmarks database.
The Android Open Source Project0c908882009-03-03 19:32:16 -0800162 */
163 boolean save() {
Ben Murdoch1794fe22009-09-29 18:14:30 +0100164 createHandler();
165
The Android Open Source Project0c908882009-03-03 19:32:16 -0800166 String title = mTitle.getText().toString().trim();
167 String unfilteredUrl =
168 BrowserActivity.fixUrl(mAddress.getText().toString());
169 boolean emptyTitle = title.length() == 0;
170 boolean emptyUrl = unfilteredUrl.trim().length() == 0;
171 Resources r = getResources();
172 if (emptyTitle || emptyUrl) {
173 if (emptyTitle) {
174 mTitle.setError(r.getText(R.string.bookmark_needs_title));
175 }
176 if (emptyUrl) {
177 mAddress.setError(r.getText(R.string.bookmark_needs_url));
178 }
179 return false;
180 }
Ben Murdochca12cfa2009-11-17 13:57:44 +0000181 String url = unfilteredUrl.trim();
Cary Clarkf2407c62009-09-04 12:25:10 -0400182 try {
Ben Murdochca12cfa2009-11-17 13:57:44 +0000183 // We allow bookmarks with a javascript: scheme, but these will in most cases
184 // fail URI parsing, so don't try it if that's the kind of bookmark we have.
185
186 if (!url.toLowerCase().startsWith("javascript:")) {
187 URI uriObj = new URI(url);
188 String scheme = uriObj.getScheme();
189 if (!Bookmarks.urlHasAcceptableScheme(url)) {
190 // If the scheme was non-null, let the user know that we
191 // can't save their bookmark. If it was null, we'll assume
192 // they meant http when we parse it in the WebAddress class.
193 if (scheme != null) {
194 mAddress.setError(r.getText(R.string.bookmark_cannot_save_url));
195 return false;
196 }
197 WebAddress address;
198 try {
199 address = new WebAddress(unfilteredUrl);
200 } catch (ParseException e) {
201 throw new URISyntaxException("", "");
202 }
203 if (address.mHost.length() == 0) {
204 throw new URISyntaxException("", "");
205 }
206 url = address.toString();
Ben Murdochde353622009-10-12 10:29:00 +0100207 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800208 }
Cary Clarkf2407c62009-09-04 12:25:10 -0400209 } catch (URISyntaxException e) {
210 mAddress.setError(r.getText(R.string.bookmark_url_not_valid));
211 return false;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800212 }
Ben Murdochaac7aa62009-09-17 16:57:40 +0100213
Ben Murdoch1794fe22009-09-29 18:14:30 +0100214 if (mEditingExisting) {
215 mMap.putString("title", title);
216 mMap.putString("url", url);
217 mMap.putBoolean("invalidateThumbnail", !url.equals(mOriginalUrl));
218 setResult(RESULT_OK, (new Intent()).setAction(
219 getIntent().toString()).putExtras(mMap));
220 } else {
221 // Post a message to write to the DB.
222 Bundle bundle = new Bundle();
223 bundle.putString("title", title);
224 bundle.putString("url", url);
225 bundle.putParcelable("thumbnail", mThumbnail);
226 bundle.putBoolean("invalidateThumbnail", !url.equals(mOriginalUrl));
227 bundle.putString("touchIconUrl", mTouchIconUrl);
228 Message msg = Message.obtain(mHandler, SAVE_BOOKMARK);
229 msg.setData(bundle);
230 mHandler.sendMessage(msg);
231 setResult(RESULT_OK);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800232 }
233 return true;
234 }
235}