blob: 0feba9a4fd2cc87dc598a7fe75c0fd6648ec9da5 [file] [log] [blame]
/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.browser;
import android.content.Context;
import android.graphics.Bitmap;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
import android.widget.TextView;
interface OnCloseTab {
void onCloseTab(int position);
}
public class ActiveTabsPage extends LinearLayout implements OnClickListener,
OnItemClickListener, OnCloseTab {
private Context mContext;
private UiController mController;
private TabControl mTabControl;
private View mNewTab, mNewIncognitoTab;
private TabAdapter mAdapter;
private AbsListView mTabsList;
public ActiveTabsPage(Context context, UiController controller) {
super(context);
mContext = context;
mController = controller;
mTabControl = mController.getTabControl();
setOrientation(VERTICAL);
setBackgroundResource(R.drawable.bg_browser);
LayoutInflater inflate = LayoutInflater.from(mContext);
inflate.inflate(R.layout.active_tabs, this, true);
mNewTab = findViewById(R.id.new_tab);
mNewIncognitoTab = findViewById(R.id.new_incognito_tab);
mNewTab.setOnClickListener(this);
mNewIncognitoTab.setOnClickListener(this);
int visibility = mTabControl.canCreateNewTab() ? View.VISIBLE : View.GONE;
mNewTab.setVisibility(visibility);
mNewIncognitoTab.setVisibility(visibility);
mTabsList = (AbsListView) findViewById(android.R.id.list);
mAdapter = new TabAdapter(mContext, mTabControl);
mAdapter.setOnCloseListener(this);
mTabsList.setAdapter(mAdapter);
mTabsList.setOnItemClickListener(this);
}
@Override
public void onClick(View v) {
if (v == mNewTab) {
mController.openTabToHomePage();
} else if (v == mNewIncognitoTab) {
mController.openIncognitoTab();
}
mController.removeActiveTabsPage(false);
}
@Override
public void onItemClick(
AdapterView<?> parent, View view, int position, long id) {
final Tab tab = mTabControl.getTab(position);
boolean needToAttach = !mController.switchToTab(tab);
mController.removeActiveTabsPage(needToAttach);
}
@Override
public void onCloseTab(int position) {
Tab tab = mTabControl.getTab(position);
if (tab != null) {
mController.closeTab(tab);
if (mTabControl.getTabCount() == 0) {
mController.openTabToHomePage();
mController.removeActiveTabsPage(false);
} else {
mAdapter.notifyDataSetChanged();
}
}
}
/**
* Special class to hold the close drawable. Its sole purpose is to allow
* the parent to be pressed without being pressed itself. This way the line
* of a tab can be pressed, but the close button itself is not.
*/
public static class CloseHolder extends ImageView {
public CloseHolder(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void setPressed(boolean pressed) {
// If the parent is pressed, do not set to pressed.
if (pressed && ((View) getParent()).isPressed()) {
return;
}
super.setPressed(pressed);
}
}
static class TabAdapter extends BaseAdapter implements OnClickListener {
LayoutInflater mInflater;
OnCloseTab mCloseListener;
TabControl mTabControl;
TabAdapter(Context context, TabControl tabs) {
mInflater = LayoutInflater.from(context);
mTabControl = tabs;
}
void setOnCloseListener(OnCloseTab listener) {
mCloseListener = listener;
}
@Override
public View getView(int position, View view, ViewGroup parent) {
if (view == null) {
view = mInflater.inflate(R.layout.tab_view, parent, false);
}
ImageView favicon = (ImageView) view.findViewById(R.id.favicon);
ImageView thumbnail = (ImageView) view.findViewById(R.id.thumb);
TextView title = (TextView) view.findViewById(R.id.label);
Tab tab = getItem(position);
String label = tab.getTitle();
if (TextUtils.isEmpty(label)) {
label = tab.getUrl();
}
title.setText(label);
Bitmap thumbnailBitmap = tab.getScreenshot();
if (thumbnailBitmap == null) {
thumbnail.setImageResource(R.drawable.browser_thumbnail);
} else {
thumbnail.setImageBitmap(thumbnailBitmap);
}
Bitmap faviconBitmap = tab.getFavicon();
if (tab.isPrivateBrowsingEnabled()) {
favicon.setImageResource(R.drawable.ic_incognito_holo_dark);
} else {
if (faviconBitmap == null) {
favicon.setImageResource(R.drawable.app_web_browser_sm);
} else {
favicon.setImageBitmap(faviconBitmap);
}
}
View close = view.findViewById(R.id.close);
close.setTag(position);
close.setOnClickListener(this);
return view;
}
@Override
public void onClick(View v) {
int position = (Integer) v.getTag();
if (mCloseListener != null) {
mCloseListener.onCloseTab(position);
}
}
@Override
public int getCount() {
return mTabControl.getTabCount();
}
@Override
public Tab getItem(int position) {
return mTabControl.getTab(position);
}
@Override
public long getItemId(int position) {
return position;
}
}
}