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