AddBookmarkPage.java revision aac7aa6fcfcb519755987ec126be066323f589c8
10c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project/* 20c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 30c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 40c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 50c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * you may not use this file except in compliance with the License. 60c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * You may obtain a copy of the License at 70c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 80c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 90c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * 100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * See the License for the specific language governing permissions and 140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * limitations under the License. 150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectpackage com.android.browser; 180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.app.Activity; 200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.ContentResolver; 210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.Intent; 220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.res.Resources; 233918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scottimport android.database.Cursor; 24aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdochimport android.graphics.Bitmap; 250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.net.ParseException; 260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.net.WebAddress; 270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.Bundle; 280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.provider.Browser; 290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.View; 300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.Window; 310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.EditText; 320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.TextView; 330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.Toast; 340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 35f2407c682fafef77d568deba9987b193a5f2d361Cary Clarkimport java.net.URI; 36f2407c682fafef77d568deba9987b193a5f2d361Cary Clarkimport java.net.URISyntaxException; 370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport java.util.Date; 380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectpublic class AddBookmarkPage extends Activity { 400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private final String LOGTAG = "Bookmarks"; 420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private EditText mTitle; 440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private EditText mAddress; 450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private TextView mButton; 460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private View mCancelButton; 470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private boolean mEditingExisting; 480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private Bundle mMap; 493918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott private String mTouchIconUrl; 50aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdoch private Bitmap mThumbnail; 51aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdoch private String mOriginalUrl; 520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private View.OnClickListener mSaveBookmark = new View.OnClickListener() { 540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(View v) { 550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (save()) { 560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project finish(); 570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Toast.makeText(AddBookmarkPage.this, R.string.bookmark_saved, 580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Toast.LENGTH_LONG).show(); 590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project private View.OnClickListener mCancel = new View.OnClickListener() { 640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project public void onClick(View v) { 650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project finish(); 660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project }; 680c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 690c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project protected void onCreate(Bundle icicle) { 700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project super.onCreate(icicle); 710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project requestWindowFeature(Window.FEATURE_LEFT_ICON); 720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setContentView(R.layout.browser_add_bookmark); 730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setTitle(R.string.save_to_bookmarks); 740c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getWindow().setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, R.drawable.ic_dialog_bookmark); 750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String title = null; 770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String url = null; 780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMap = getIntent().getExtras(); 790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mMap != null) { 800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Bundle b = mMap.getBundle("bookmark"); 810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (b != null) { 820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMap = b; 830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mEditingExisting = true; 840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setTitle(R.string.edit_bookmark); 850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project title = mMap.getString("title"); 87aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdoch url = mOriginalUrl = mMap.getString("url"); 883918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott mTouchIconUrl = mMap.getString("touch_icon_url"); 89aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdoch mThumbnail = (Bitmap) mMap.getParcelable("thumbnail"); 900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTitle = (EditText) findViewById(R.id.title); 930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTitle.setText(title); 940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mAddress = (EditText) findViewById(R.id.address); 950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mAddress.setText(url); 960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project View.OnClickListener accept = mSaveBookmark; 990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mButton = (TextView) findViewById(R.id.OK); 1000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mButton.setOnClickListener(accept); 1010c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCancelButton = findViewById(R.id.cancel); 1030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mCancelButton.setOnClickListener(mCancel); 1040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (!getWindow().getDecorView().isInTouchMode()) { 1060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mButton.requestFocus(); 1070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project 1100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project /** 1110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Save the data to the database. 1120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Also, change the view to dialog stating 1130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * that the webpage has been saved. 1140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */ 1150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean save() { 1160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String title = mTitle.getText().toString().trim(); 1170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String unfilteredUrl = 1180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project BrowserActivity.fixUrl(mAddress.getText().toString()); 1190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean emptyTitle = title.length() == 0; 1200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project boolean emptyUrl = unfilteredUrl.trim().length() == 0; 1210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project Resources r = getResources(); 1220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (emptyTitle || emptyUrl) { 1230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (emptyTitle) { 1240c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mTitle.setError(r.getText(R.string.bookmark_needs_title)); 1250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (emptyUrl) { 1270c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mAddress.setError(r.getText(R.string.bookmark_needs_url)); 1280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 1300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project String url = unfilteredUrl; 132f2407c682fafef77d568deba9987b193a5f2d361Cary Clark try { 133f2407c682fafef77d568deba9987b193a5f2d361Cary Clark URI uriObj = new URI(url); 134f2407c682fafef77d568deba9987b193a5f2d361Cary Clark String scheme = uriObj.getScheme(); 135f2407c682fafef77d568deba9987b193a5f2d361Cary Clark if (!("about".equals(scheme) || "data".equals(scheme) 136f2407c682fafef77d568deba9987b193a5f2d361Cary Clark || "javascript".equals(scheme) 137f2407c682fafef77d568deba9987b193a5f2d361Cary Clark || "file".equals(scheme) || "content".equals(scheme))) { 138f2407c682fafef77d568deba9987b193a5f2d361Cary Clark WebAddress address; 139f2407c682fafef77d568deba9987b193a5f2d361Cary Clark try { 140f2407c682fafef77d568deba9987b193a5f2d361Cary Clark address = new WebAddress(unfilteredUrl); 141f2407c682fafef77d568deba9987b193a5f2d361Cary Clark } catch (ParseException e) { 142f2407c682fafef77d568deba9987b193a5f2d361Cary Clark throw new URISyntaxException("", ""); 143f2407c682fafef77d568deba9987b193a5f2d361Cary Clark } 144f2407c682fafef77d568deba9987b193a5f2d361Cary Clark if (address.mHost.length() == 0) { 145f2407c682fafef77d568deba9987b193a5f2d361Cary Clark throw new URISyntaxException("", ""); 146f2407c682fafef77d568deba9987b193a5f2d361Cary Clark } 147f2407c682fafef77d568deba9987b193a5f2d361Cary Clark url = address.toString(); 1480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 149f2407c682fafef77d568deba9987b193a5f2d361Cary Clark } catch (URISyntaxException e) { 150f2407c682fafef77d568deba9987b193a5f2d361Cary Clark mAddress.setError(r.getText(R.string.bookmark_url_not_valid)); 151f2407c682fafef77d568deba9987b193a5f2d361Cary Clark return false; 1520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project try { 1540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project if (mEditingExisting) { 1550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMap.putString("title", title); 1560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project mMap.putString("url", url); 1570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setResult(RESULT_OK, (new Intent()).setAction( 1580c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project getIntent().toString()).putExtras(mMap)); 1590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } else { 1603918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott final ContentResolver cr = getContentResolver(); 161aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdoch 162aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdoch // Only use mThumbnail if url and mOriginalUrl are matches. 163aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdoch // Otherwise the user edited the url and the thumbnail no longer applies. 164aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdoch if (mOriginalUrl.equals(url)) { 165aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdoch Bookmarks.addBookmark(null, cr, url, title, mThumbnail, true); 166aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdoch } else { 167aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdoch Bookmarks.addBookmark(null, cr, url, title, null, true); 168aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdoch } 1693918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott if (mTouchIconUrl != null) { 1703918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott final Cursor c = 1713918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott BrowserBookmarksAdapter.queryBookmarksForUrl( 172a5d669e4c08f0e64387c2c539c41a26ac8c845abLeon Scroggins cr, null, url, true); 17359ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott new DownloadTouchIcon(cr, c, url).execute(mTouchIconUrl); 1743918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 1750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setResult(RESULT_OK); 1760c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } catch (IllegalStateException e) { 1780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project setTitle(r.getText(R.string.no_database)); 1790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return false; 1800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1810c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project return true; 1820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project } 1830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project} 184