blob: 3750d3e53da8598e7ab145ceed6a48166399b769 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.bookmarks;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import org.chromium.base.Log;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.SynchronousInitializationActivity;
import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkItem;
import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkModelObserver;
import org.chromium.chrome.browser.widget.EmptyAlertEditText;
import org.chromium.chrome.browser.widget.TintedDrawable;
import org.chromium.components.bookmarks.BookmarkId;
import org.chromium.components.url_formatter.UrlFormatter;
/**
* The activity that enables the user to modify the title, url and parent folder of a bookmark.
*/
public class BookmarkEditActivity extends SynchronousInitializationActivity {
/** The intent extra specifying the ID of the bookmark to be edited. */
public static final String INTENT_BOOKMARK_ID = "BookmarkEditActivity.BookmarkId";
private static final String TAG = "BookmarkEdit";
private BookmarkModel mModel;
private BookmarkId mBookmarkId;
private EmptyAlertEditText mTitleEditText;
private EmptyAlertEditText mUrlEditText;
private TextView mFolderTextView;
private MenuItem mDeleteButton;
private BookmarkModelObserver mBookmarkModelObserver = new BookmarkModelObserver() {
@Override
public void bookmarkModelChanged() {
if (mModel.doesBookmarkExist(mBookmarkId)) {
updateViewContent(true);
} else {
// This happens either when the user clicks delete button or partner bookmark is
// removed in background.
finish();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mModel = new BookmarkModel();
mBookmarkId = BookmarkId.getBookmarkIdFromString(
getIntent().getStringExtra(INTENT_BOOKMARK_ID));
mModel.addObserver(mBookmarkModelObserver);
BookmarkItem item = mModel.getBookmarkById(mBookmarkId);
if (!mModel.doesBookmarkExist(mBookmarkId) || item == null) {
finish();
return;
}
setContentView(R.layout.bookmark_edit);
mTitleEditText = (EmptyAlertEditText) findViewById(R.id.title_text);
mFolderTextView = (TextView) findViewById(R.id.folder_text);
mUrlEditText = (EmptyAlertEditText) findViewById(R.id.url_text);
mFolderTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
BookmarkFolderSelectActivity.startFolderSelectActivity(
BookmarkEditActivity.this, mBookmarkId);
}
});
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
updateViewContent(false);
View shadow = findViewById(R.id.shadow);
View scrollView = findViewById(R.id.scroll_view);
scrollView.getViewTreeObserver().addOnScrollChangedListener(() -> {
shadow.setVisibility(scrollView.getScrollY() > 0 ? View.VISIBLE : View.GONE);
});
}
/**
* @param modelChanged Whether this view update is due to a model change in background.
*/
private void updateViewContent(boolean modelChanged) {
BookmarkItem bookmarkItem = mModel.getBookmarkById(mBookmarkId);
// While the user is editing the bookmark, do not override user's input.
if (!modelChanged) {
mTitleEditText.setText(bookmarkItem.getTitle());
mUrlEditText.setText(bookmarkItem.getUrl());
}
mFolderTextView.setText(mModel.getBookmarkTitle(bookmarkItem.getParentId()));
mTitleEditText.setEnabled(bookmarkItem.isEditable());
mUrlEditText.setEnabled(bookmarkItem.isUrlEditable());
mFolderTextView.setEnabled(bookmarkItem.isMovable());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
mDeleteButton = menu.add(R.string.bookmark_action_bar_delete)
.setIcon(TintedDrawable.constructTintedDrawable(
this, R.drawable.ic_delete_white_24dp))
.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item == mDeleteButton) {
// Log added for detecting delete button double clicking.
Log.i(TAG, "Delete button pressed by user! isFinishing() == " + isFinishing());
mModel.deleteBookmark(mBookmarkId);
finish();
return true;
} else if (item.getItemId() == android.R.id.home) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onStop() {
if (mModel.doesBookmarkExist(mBookmarkId)) {
final String originalUrl =
mModel.getBookmarkById(mBookmarkId).getUrl();
final String title = mTitleEditText.getTrimmedText();
final String url = mUrlEditText.getTrimmedText();
if (!mTitleEditText.isEmpty()) {
mModel.setBookmarkTitle(mBookmarkId, title);
}
if (!mUrlEditText.isEmpty()
&& mModel.getBookmarkById(mBookmarkId).isUrlEditable()) {
String fixedUrl = UrlFormatter.fixupUrl(url);
if (fixedUrl != null && !fixedUrl.equals(originalUrl)) {
mModel.setBookmarkUrl(mBookmarkId, fixedUrl);
}
}
}
super.onStop();
}
@Override
protected void onDestroy() {
mModel.removeObserver(mBookmarkModelObserver);
mModel.destroy();
mModel = null;
super.onDestroy();
}
private void openBookmark() {
// TODO(kkimlabs): Refactor this out to handle the intent in ChromeActivity.
// If this activity was started via startActivityForResult(), set the result. Otherwise,
// launch the bookmark directly.
if (getCallingActivity() != null) {
Intent intent = new Intent();
intent.putExtra(BookmarkActivity.INTENT_VISIT_BOOKMARK_ID, mBookmarkId.toString());
setResult(RESULT_OK, intent);
} else {
BookmarkUtils.openBookmark(
mModel, this, mBookmarkId, BookmarkLaunchLocation.BOOKMARK_EDITOR);
}
finish();
}
}