/*
* Copyright (C) 2008 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.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.database.DataSetObserver;
import android.graphics.Color;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.LayoutInflater;
import android.webkit.WebView;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.TextView;
import java.util.ArrayList;
/**
* Adapter used by ImageGrid.
*/
public class ImageAdapter implements ListAdapter {
ArrayList<TabControl.Tab> mItems; // Items shown in the grid
private ArrayList<DataSetObserver> mDataObservers; // Data change listeners
private Context mContext; // Context to use to inflate views
private boolean mMaxedOut;
private ImageGrid mImageGrid;
private boolean mIsLive;
private int mTabHeight;
ImageAdapter(Context context, ImageGrid grid, boolean live) {
mContext = context;
mIsLive = live;
mItems = new ArrayList<TabControl.Tab>();
mImageGrid = grid;
mDataObservers = new ArrayList<DataSetObserver>();
}
void heightChanged(int newHeight) {
mTabHeight = newHeight;
}
/**
* Whether the adapter is at its limit, determined by TabControl.MAX_TABS
*
* @return True if the number of Tabs represented in this Adapter is at its
* maximum.
*/
public boolean maxedOut() {
return mMaxedOut;
}
/**
* Clear the internal WebViews and remove their picture listeners.
*/
public void clear() {
for (TabControl.Tab t : mItems) {
clearPictureListeners(t);
}
mItems.clear();
notifyObservers();
}
private void clearPictureListeners(TabControl.Tab t) {
if (t.getWebView() != null) {
t.getWebView().setPictureListener(null);
if (t.getSubWebView() != null) {
t.getSubWebView().setPictureListener(null);
}
}
}
/**
* Add a new window web page to the grid
*
* @param t The tab to display
*/
public void add(TabControl.Tab t) {
if (mMaxedOut) {
return;
}
mItems.add(t);
notifyObservers();
if (mItems.size() == TabControl.MAX_TABS) {
mMaxedOut = true;
}
}
/**
* Remove a window from the list. At this point, the window
* has already gone. It just needs to be removed from the screen
*
* @param index window to remove
*/
public void remove(int index) {
if (index >= 0 && index < mItems.size()) {
clearPictureListeners(mItems.remove(index));
notifyObservers();
mMaxedOut = false;
}
}
/* (non-Javadoc)
* @see android.widget.ListAdapter#areAllItemsSelectable()
*/
public boolean areAllItemsEnabled() {
return true;
}
/* (non-Javadoc)
* @see android.widget.ListAdapter#isSelectable(int)
*/
public boolean isEnabled(int position) {
if (position >= 0 && position <= mItems.size()) {
return true;
}
return false;
}
/* (non-Javadoc)
* @see android.widget.Adapter#getCount()
*/
public int getCount() {
// Include the New Window button if we have not reached the tab limit
if (!mMaxedOut) {
return mItems.size()+1;
}
return mItems.size();
}
/* (non-Javadoc)
* @see android.widget.Adapter#getItem(int)
*/
public Object getItem(int position) {
if (!mMaxedOut) {
if (0 == position) {
return null;
}
return mItems.get(position);
}
return mItems.get(position);
}
/* (non-Javadoc)
* @see android.widget.Adapter#getItemId(int)
*/
public long getItemId(int position) {
return position;
}
/* (non-Javadoc)
* @see android.widget.Adapter#getView(int, android.view.View,
* android.view.ViewGroup)
*/
public View getView(int position, View convertView, ViewGroup parent) {
View v = null;
if (convertView != null) {
v = convertView;
} else {
LayoutInflater factory = LayoutInflater.from(mContext);
v = factory.inflate(R.layout.tabitem, null);
}
FakeWebView img = (FakeWebView) v.findViewById(R.id.icon);
ImageView close = (ImageView) v.findViewById(R.id.close);
TextView tv = (TextView) v.findViewById(R.id.label);
// position needs to be in the range of Tab indices.
if (!mMaxedOut) {
position--;
}
// Create the View for actual tabs
if (position != ImageGrid.NEW_TAB) {
TabControl.Tab t = mItems.get(position);
img.setTab(t);
tv.setText(t.getTitle());
// Do not put the 'X' if the tab picker isn't "live" (meaning the
// user cannot click on a tab)
if (!mIsLive) {
close.setVisibility(View.GONE);
} else {
close.setVisibility(View.VISIBLE);
final int pos = position;
close.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
ImageAdapter.this.confirmClose(pos);
}
});
}
} else {
img.setBackgroundColor(Color.BLACK);
img.setImageResource(R.drawable.ic_new_window);
img.setScaleType(ImageView.ScaleType.CENTER);
img.setPadding(0, 0, 0, 34);
tv.setText(R.string.new_window);
close.setVisibility(View.GONE);
}
ViewGroup.LayoutParams lp = img.getLayoutParams();
if (lp.height != mTabHeight) {
lp.height = mTabHeight;
img.requestLayout();
}
return v;
}
/*
* Pop a confirmation dialog to the user asking if they want to close this
* tab.
*/
private void confirmClose(final int position) {
final ImageGrid.Listener l = mImageGrid.getListener();
if (l == null) {
return;
}
l.remove(position);
}
/* (non-Javadoc)
* @see android.widget.Adapter#registerDataSetObserver(android.database.DataSetObserver)
*/
public void registerDataSetObserver(DataSetObserver observer) {
mDataObservers.add(observer);
}
/* (non-Javadoc)
* @see android.widget.Adapter#hasStableIds()
*/
public boolean hasStableIds() {
return true;
}
/* (non-Javadoc)
* @see android.widget.Adapter#unregisterDataSetObserver(android.database.DataSetObserver)
*/
public void unregisterDataSetObserver(DataSetObserver observer) {
mDataObservers.remove(observer);
}
/**
* Notify all the observers that a change has happened.
*/
void notifyObservers() {
for (DataSetObserver observer : mDataObservers) {
observer.onChanged();
}
}
public int getItemViewType(int position) {
return 0;
}
public int getViewTypeCount() {
return 1;
}
public boolean isEmpty() {
return getCount() == 0;
}
}
|