package com.wistron.WiGallery;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import Utilities.CSStaticData;
import Utilities.FileOperation;
import android.util.Log;
import com.wistron.WiGallery.Element;
import com.wistron.WiGallery.GEO.GeoParser;
import com.wistron.WiGallery.WiGalleryInterface.onRequestListListener;
public class DataManager
{
private List<Element> m_request_list = null; //请求文件列表
private List<Element> m_need_load_texture_request_list = null; //请求文件列表
private List<Element> m_list = null; //主文件列表
private List<Element> m_load_file_list = null; //加载了纹理的文件列表
private List<Element> m_need_delete_element_list = null;
private List<Element> m_selected_element_list = null; //已选中的元素列表
private onRequestListListener requestListListener = null;
private final String TAG = "DataManager";
public DataManager()
{
if (m_list != null)
m_list.clear();
else
m_list = new LinkedList<Element>();
if (m_request_list != null)
m_request_list.clear();
else
m_request_list = new ArrayList<Element>();
if (m_load_file_list != null)
m_load_file_list.clear();
else
m_load_file_list = new ArrayList<Element>();
if (m_need_load_texture_request_list != null)
m_need_load_texture_request_list.clear();
else
m_need_load_texture_request_list = new ArrayList<Element>();
m_need_delete_element_list = new ArrayList<Element>();
}
/**
* DataManager析构函数
*/
public void destoryDataManager(){
// if (m_list != null){
// m_list.clear();
// m_list = null;
// }
if(m_request_list != null){
m_request_list.clear();
m_request_list = null;
}
if (m_load_file_list != null){
m_load_file_list.clear();
m_load_file_list = null;
}
if(m_need_load_texture_request_list != null){
m_need_load_texture_request_list.clear();
m_need_load_texture_request_list = null;
}
if(m_need_delete_element_list != null){
m_need_delete_element_list.clear();
m_need_delete_element_list = null;
}
if(m_selected_element_list != null){
m_selected_element_list.clear();
m_selected_element_list = null;
}
System.gc();
}
public void AddNeedDeleteElement(Element elem)
{
if (elem != null)
{
if (m_need_delete_element_list == null)
m_need_delete_element_list = new ArrayList<Element>();
synchronized(m_need_delete_element_list)
{
m_need_delete_element_list.add(elem);
}
}
}
/**
* 删除Element对象兵从主链表清除该元素,该函数必须在ondraw调用
*/
public void DeleteNeedDeleteElement()
{
if (m_need_delete_element_list == null)
return;
synchronized(m_need_delete_element_list)
{
Iterator<Element> it = m_need_delete_element_list.iterator();
while (it.hasNext())
{
Element elem = it.next();
if (elem != null)
{
Delete(elem.getName());
it.remove();
}
}
}
}
public void AddNeedLoadTextureFile(Element file)
{
if (file == null)
return ;
if ( m_need_load_texture_request_list == null)
m_need_load_texture_request_list = new ArrayList<Element>();
synchronized(m_need_load_texture_request_list)
{
m_need_load_texture_request_list.add(file);
if (CSStaticData.DEBUG)
Log.i(TAG, String.format("[+][%d][AddNeedLoadTextureFile][%s]", m_need_load_texture_request_list.size(),file.getName()));
}
}
public Element GetNeedLoadTextureFile(int index)
{
if (m_need_load_texture_request_list == null)
return null;
synchronized(m_need_load_texture_request_list)
{
if (index < 0 || index >= m_need_load_texture_request_list.size())
return null;
Element elem = m_need_load_texture_request_list.get(index);
m_need_load_texture_request_list.remove(index);
//Log.d(TAG, String.format("[-][%d][AddNeedLoadTextureFile][%s]", m_need_load_texture_request_list.size(), elem.getName()));
return elem;
}
}
/**
* 删除所有的纹理
*/
public void ReleaseAllTexture()
{
if(m_list == null || m_list.size() <= 0){
return;
}
synchronized(m_list)
{
for (int i = 0 ; i < m_list.size(); i++)
{
Element elem = m_list.get(i);
// WiGalleryOpenGLRenderer.m_resource_manager.DeleteTextureID(elem); //[For Black Block]
WiGalleryOpenGLRenderer.m_resource_manager.ReinitTextureID(elem); //[For Black Block]
}
}
}
/**
* 向主文件列表中添加信息
* @param file
* @return
*/
public int Add(Element elem)
{
if (m_list == null)
{
m_list = new LinkedList<Element>();
}
synchronized(m_list)
{
if (m_list == null)
{
m_list = new LinkedList<Element>();
}
m_list.add(elem);
return m_list.size() - 1;
}
}
public Element Get(int index)
{
if(m_list == null){
return null;
}
if (index < 0)
return null;
else if (index >= m_list.size())
return null;
synchronized(m_list)
{
if(m_list == null){
return null;
}
return m_list.get(index);
}
}
public Element Get(String fileName)
{
if (fileName == null || m_list == null) return null;
synchronized(m_list)
{
Iterator<Element> it = m_list.iterator();
while (it.hasNext())
{
Element file = it.next();
if (file != null && fileName.compareToIgnoreCase(file.getName()) == 0)
{
return file;
}
}
}
return null;
}
/**
* 获取主链表长度
* @return
*/
public int getMainListSize(){
int size = 0;
if(m_list == null){
return size;
}
synchronized (m_list) {
if(m_list == null){
return 0;
}
size = m_list.size();
}
return size;
}
/**
* 拷贝方式获取主数据链表
* @return
*/
public List<Element> cloneMainList(){
List<Element> result = null;
if(m_list == null){
return null;
}
synchronized(m_list)
{
result = new ArrayList<Element>(m_list);
}
return result;
}
public ElementList GetList (CSStaticData.LIST_TYPE type, String name)
{
if (type == CSStaticData.LIST_TYPE.LIST_NONE)
{
return null;
}
else
{
ElementList list = new ElementList(type);
list.setName(name);
int mainListNum = m_list.size();
if (type == CSStaticData.LIST_TYPE.LIST_DATE)
{
for (int j = 0; j < mainListNum; j++)
{
Element elem = m_list.get(j);
if (elem != null && name.compareToIgnoreCase(elem.getDate()) == 0)
{
list.add(elem);
}
}
}
else
{
// 地理信息分组
//~!
}
return list;
}
}
public List<ElementList> GetListArray (CSStaticData.LIST_TYPE type, CSStaticData.LIST_ELEMENT_TYPE elementType)
{
List<ElementList> mainList = new LinkedList<ElementList>();
if (type == CSStaticData.LIST_TYPE.LIST_NONE)
{
ElementList list = new ElementList(WiGalleryOpenGLRenderer.m_data_manager.m_list, type);
if (list != null)
{
if(elementType == CSStaticData.LIST_ELEMENT_TYPE.LIST_ELEMENT_ALL)
{
mainList.add(list);
}
else if (elementType == CSStaticData.LIST_ELEMENT_TYPE.LIST_ELEMENT_2D)
{
if (WiGalleryOpenGLRenderer.m_data_manager.m_list == null)
return null;
ElementList clist = new ElementList(type);
int num = WiGalleryOpenGLRenderer.m_data_manager.m_list.size();
for (int i = 0; i < num; i++)
{
Element elem = WiGalleryOpenGLRenderer.m_data_manager.m_list.get(i);
if (elem.getFileType() == CSStaticData.MEDIA_TYPE.NORMAL_IMAGE || elem.getFileType() == CSStaticData.MEDIA_TYPE.NORMAL_VIDEO)
{
clist.add(elem);
}
}
mainList.add(clist);
}
else if (elementType == CSStaticData.LIST_ELEMENT_TYPE.LIST_ELEMENT_3D)
{
if (WiGalleryOpenGLRenderer.m_data_manager.m_list == null)
return null;
ElementList clist = new ElementList(type);
int num = WiGalleryOpenGLRenderer.m_data_manager.m_list.size();
for (int i = 0; i < num; i++)
{
Element elem = WiGalleryOpenGLRenderer.m_data_manager.m_list.get(i);
if (elem.getFileType() == CSStaticData.MEDIA_TYPE.STOERE_IMAGE || elem.getFileType() == CSStaticData.MEDIA_TYPE.STOERE_VIDEO)
{
clist.add(elem);
}
}
mainList.add(clist);
}
else
{
// 不做处理
}
}
}
else if (type == CSStaticData.LIST_TYPE.LIST_DATE)
{
// 查找当前文件有多少个日期分类
// 以下可以优化
List<String> strList = WiGalleryOpenGLRenderer.m_data_manager.GetAlbumName();
if (strList == null)
return null;
for (int i = 0; i < strList.size(); i++)
{
String strDate = strList.get(i);
ElementList list = new ElementList(type);
list.setName(strDate);
int mainListNum = Size();
for (int j = 0; j < mainListNum; j++)
{
Element elem = Get(j);
if (elem != null && strDate.compareToIgnoreCase(FileOperation.getDate(elem.getDate())) == 0)
{
if(elementType == CSStaticData.LIST_ELEMENT_TYPE.LIST_ELEMENT_ALL)
{
list.add(elem);
}
else if (elementType == CSStaticData.LIST_ELEMENT_TYPE.LIST_ELEMENT_3D)
{
if (elem.getFileType() == CSStaticData.MEDIA_TYPE.STOERE_IMAGE || elem.getFileType() == CSStaticData.MEDIA_TYPE.STOERE_VIDEO)
{
list.add(elem);
}
}
else if (elementType == CSStaticData.LIST_ELEMENT_TYPE.LIST_ELEMENT_2D)
{
if (elem.getFileType() == CSStaticData.MEDIA_TYPE.NORMAL_IMAGE || elem.getFileType() == CSStaticData.MEDIA_TYPE.NORMAL_VIDEO)
{
list.add(elem);
}
}
else
{
// 不做处理
}
}
}
if (list.size() > 0)
mainList.add(list);
}
}
else
{
// 地理信息分组
//~!
WiGalleryOpenGLRenderer.mAsyncFileProvider.SortListByLocation(mainList, type);
}
return mainList;
}
/**
* 在activity隐藏时调用 ,该函数删除所有的bitmap
*/
public void DelAllBitmap()
{
if(m_list == null){
return;
}
synchronized (m_list) {
for (int i = 0; i < m_list.size(); i++)
{
Element elem = m_list.get(i);
if (elem != null)
{
if (elem.m_bmpL != null)
{
elem.m_bmpL.recycle();
elem.m_bmpL = null;
}
if (elem.m_bmpR != null)
{
elem.m_bmpR.recycle();
elem.m_bmpR = null;
}
}
}
}
}
/**
* 根据字符串首字母排序
* @param elementLists
* @param locationList
* @return
*/
public List<ElementList> GetListArrayByAleph(List<ElementList> elementList,Locale locale){
if (elementList.size() == 0) {
return null;
}else {
Comparator<Object> comparator=Collator.getInstance(locale);
Collections.sort(elementList, comparator);
return elementList;
}
}
public int Size()
{
if (m_list != null)
return m_list.size();
else
return 0;
}
public void Delete(int index)
{
if (index < 0) return;
else if (index >= m_list.size()) return;
synchronized(m_list)
{
Element elem = m_list.get(index);
WiGalleryOpenGLRenderer.m_resource_manager.DeleteTextureID(elem);
m_list.remove(index);
}
}
/**
* 从主链表删除元素以及对应的纹理ID
*/
public void Delete(String fileName)
{
if (fileName == null) return;
synchronized(m_list)
{
Iterator<Element> it = m_list.iterator();
while (it.hasNext())
{
Element file = it.next();
if (file != null && fileName.compareToIgnoreCase(file.getName()) == 0)
{
WiGalleryOpenGLRenderer.m_resource_manager.DeleteTextureID(file);
it.remove();
return;
}
}
}
}
/**
*
* @param name
* @param mode 0:日期 1:位置
* CSStaticData.LIST_TYPE 该参数在mode = 1时有效
*/
public void DeleteAlbum(String name, int mode, CSStaticData.LIST_TYPE locType)
{
if (name == null) return;
synchronized(m_list)
{
Iterator<Element> it = m_list.iterator();
if (mode == 0)
{
while (it.hasNext())
{
Element elem = it.next();
if (elem != null && name.compareToIgnoreCase(elem.getDate()) == 0)
{
WiGalleryOpenGLRenderer.m_resource_manager.DeleteTextureID(elem);
it.remove();
}
}
}
else if (mode == 1)
{
while (it.hasNext())
{
Element elem = it.next();
if (elem != null)
{
String loc = GeoParser.parserGeo(WiGalleryOpenGLRenderer.m_context, elem.m_longitude, elem.m_latitude, locType);
if (elem != null && name.compareToIgnoreCase(loc) == 0)
{
WiGalleryOpenGLRenderer.m_resource_manager.DeleteTextureID(elem);
it.remove();
}
}
}
}
else
{
}
}
}
/**
* 清空主文件列表
*/
public void DeleteAll()
{
synchronized(m_list)
{
Iterator<Element> it = m_list.iterator();
while (it.hasNext())
{
Element file = it.next();
if (file != null)
{
WiGalleryOpenGLRenderer.m_resource_manager.DeleteTextureID(file);
it.remove();
}
}
}
}
public List<String> GetAlbumName()
{
List<String> list = new LinkedList<String>();
if (m_list == null)
return null;
synchronized(m_list)
{
if (m_list == null)
return null;
for (int i = 0; i < m_list.size(); i++)
{
Element elem = m_list.get(i);
if (elem != null)
{
String str = null;
str = FileOperation.getDate(elem.getDate());
// 遍历查找
if (list.size() == 0)
{
list.add(str);
}
else
{
boolean bFind = false;
for (int j = 0; j < list.size(); j++)
{
if (list.get(j).compareTo(str) == 0)
{
bFind = true;
break;
}
}
if (!bFind)
{
list.add(str);
}
}
}
}
}
return list;
}
/**
* 升序排列
* @param list
* @return
*/
public List<Element> sortByAsc(List<Element> list)
{
long startTime = System.currentTimeMillis();
if (list == null || list.size() <= 0) return null;
List<Element> output = new ArrayList<Element>();
for (int i = 0; i < list.size(); i++)
{
Element file = list.get(i);
if (file != null)
{
if (output.size() == 0)
{
output.add(file);
}
else
{
boolean isInsert = false;
String date = file.getDate();
for (int j = 0; j < output.size(); j++)
{
String TmpDate = output.get(j).getDate();
if (TmpDate.compareTo(date) > 0)
{
// 当前元素值大于待插入的值,则插入
output.add(j, file);
isInsert = true;
break;
}
}
if (!isInsert)
{
output.add(file);
}
}
}
}
list.clear();
// List<Element> result = FileOperation.quickSortByAsc(list);
long endTime = System.currentTimeMillis();
if(CSStaticData.DEBUG){
Log.w(TAG, "[sortByAsc]排序时间: " + (endTime - startTime));
}
// return result;
return output;
}
/**
* 降序排列
* @param list
* @return
*/
public List<Element> sortByDesc(List<Element> list)
{
long startTime = System.currentTimeMillis();
if (list == null || list.size() <= 0) return null;
List<Element> output = new ArrayList<Element>();
for (int i = 0; i < list.size(); i++)
{
Element file = list.get(i);
if (file != null)
{
if (output.size() == 0)
{
output.add(file);
}
else
{
boolean isInsert = false;
String date = file.getDate();
for (int j = 0; j < output.size(); j++)
{
String TmpDate = output.get(j).getDate();
if (TmpDate.compareTo(date) < 0)
{
// 当前元素值大于待插入的值,则插入
output.add(j, file);
isInsert = true;
break;
}
}
if (!isInsert)
{
output.add(file);
}
}
}
}
list.clear();
// List<Element> result = FileOperation.quickSortByDesc(list);
long endTime = System.currentTimeMillis();
if(CSStaticData.DEBUG){
Log.w(TAG, "[sortByDesc]排序时间: " + (endTime - startTime));
}
// return result;
return output;
}
/**
* 为主链表排序
* @param isAsc
*/
public void sortMainList(boolean isAsc){
if(isAsc){
m_list = sortByAsc(m_list);
}else{
m_list = sortByDesc(m_list);
}
}
/**
* 地理位置排序
* @param list
* @param type
*/
public static void SortListByLocation(List<ElementList> list, CSStaticData.LIST_TYPE type){
int mainListSize = 0,
inputListSize = 0;
boolean hasCanceled = false;
boolean hasInserted = false; //是否以找到对应的列表,没有找到则新建一个列表
String tempAddr = "";
List<Element> mainDataList = null;
Element tempElement = null;
if(WiGalleryOpenGLRenderer.m_data_manager == null){
return;
}else{
mainDataList = WiGalleryOpenGLRenderer.m_data_manager.cloneMainList();
mainListSize = mainDataList.size();
}
if(list != null){
list.clear();
}
for(int i = 0; i < mainListSize; i++){//遍历主链表
if(hasCanceled){
return; //可以直接return
}
// tempAddr = GeoParser.parserGeo(mContext, mainDataList.get(i).m_latitude, mainDataList.get(i).m_latitude, type);
tempElement = mainDataList.get(i);
for(int m = 0; m < tempElement.m_str_address.length; m++){
tempAddr = tempElement.m_str_address[m] + ", ";
}
if(tempAddr.length() >= 2){
tempAddr = tempAddr.substring(0, tempAddr.length() - 2);
}
inputListSize = list.size();
hasInserted = false;
for(int j = 0; j < list.size(); j++){
if(hasCanceled){
return; //可以直接return
}
//比较list中的每条列表的头结点
if(list.get(j).getName().equals(tempAddr)){
list.get(j).add(mainDataList.get(i));
hasInserted = true;
break;
}
}
//没有找到对应的链表,新建一个列表
if(!hasInserted){
if(hasCanceled){
return; //可以直接return
}
ArrayList<Element> appendElementList = new ArrayList<Element>();
ElementList tmpElementList = null;
appendElementList.add(mainDataList.get(i));
tmpElementList = new ElementList(appendElementList, type);
tmpElementList.setName(tempAddr);
list.add(tmpElementList);
}
}
}
/**
* 读取请求文件列表
* @return
*/
public List<Element> getRequestLoadFileList(){
List<Element> output = new ArrayList<Element>();
if (m_request_list == null)
{
return null;
}
synchronized (m_request_list) {
if (m_request_list == null)
{
return null;
}
for(int i = 0; i < m_request_list.size(); i++){
output.add(m_request_list.get(i));
}
m_request_list.clear();
}
//调用读取完毕回调
if(requestListListener != null)
requestListListener.onRequestListReadCompleted();
return output;
}
/**
* 写入请求文件列表
*/
public void setRequestLoadFileList(Element file){
if (file == null)
{
return;
}
if(file.isRequest())
{
return;
}
if (m_request_list == null)
{
m_request_list = new ArrayList<Element>();
}
synchronized (m_request_list){
//遍历是否有重复元素
int cnt = m_request_list.size();
for(int i = 0; i < cnt; i++){
if(m_request_list.get(i).toString().equals(file.getName())){
return;
}
}
//遍历后没有重复元素,添加
m_request_list.add(file);
file.setRequest( true );
if (CSStaticData.DEBUG)
Log.d(TAG, String.format("[Add][%d][setRequestLoadFileList][%s]", m_request_list.size(), file.getName()));
}
//调用写入完毕回调
if(requestListListener != null)
requestListListener.onRequestListWriteCompleted();
}
/**
* 设置请求文件列表监听
* @param listener onRequestListListener
*/
public void setOnRequestListListener(onRequestListListener listener){
requestListListener = listener;
}
public void clearMainList() {
if(m_list != null){
m_list.clear();
}
}
/**
* 设订元素的选中状态
* @param elem
*/
public void setElementSelected(Element elem){
if(m_selected_element_list == null){
m_selected_element_list = new ArrayList<Element>();
}
synchronized (m_selected_element_list) {
if(m_selected_element_list == null){
m_selected_element_list = new ArrayList<Element>();
}
m_selected_element_list.add(elem);
}
}
/**
* 取消元素的选中状态
* @param elem
*/
public void setElementUnselected(Element elem){
if(m_selected_element_list == null){
m_selected_element_list = new ArrayList<Element>();
}
synchronized (m_selected_element_list) {
if(m_selected_element_list == null){
m_selected_element_list = new ArrayList<Element>();
}
m_selected_element_list.remove(elem);
}
}
public synchronized List<Element> getSelectedElementsList(){
return m_selected_element_list;
}
}