package com.wistron.WiGallery;
import java.util.ArrayList;
import java.util.List;
import com.wistron.swpc.wicamera3dii.R;
import Utilities.CSStaticData;
import Utilities.CSStaticData.MEDIA_META_TYPE;
import Utilities.CSStaticData.SHARE_MULTI_SELECT_TYPE;
import Utilities.FileTypeHelper;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.graphics.Color;
import android.net.Uri;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
/**
* Copyright (c) 2011 Wistron SWPC All rights reserved. created: 2012/03/22
* filename: ShareMenu.java
*
* @author WangWei purpose:分享菜单
*/
public class ShareToModule extends View implements OnItemClickListener {
private Context mContext = null;
private ListView mListView = null;
private ListAppAdapter mListAppAdapter = null;
protected List<ResolveInfo> mApps_image = new ArrayList<ResolveInfo>();
protected List<ResolveInfo> mApps_video = new ArrayList<ResolveInfo>();
private TextView mTitle = null;
private List<ResolveInfo> mApps = null;
private RelativeLayout mMainLayout = null;
private ArrayList<String> mImageFilePath = null,
mVideoFilePath = null;
private RelativeLayout.LayoutParams mMainLayoutParams = null;
private int mShareMenuX = 0,
mShareMenuY = 0,
mShareMenuWidth = 141,
mShareMenuHeight = 0,
mShareMenuAnchor = 0,
mTitleHeight = 55,
mListItemHeight = 60,
mListSelector = 0,
mListItemSelector = 0,
mListLayoutSelector = 0,
mIconWidth = 0,
mIconHeight = 0,
mTextSize = 18,
mTextColor = Color.WHITE, mListSize = 0;
private float mScreenWidth = 0,
mScreenHeight = 0;
private boolean mAllowHide = true,
mIsShow = false,
mIsMenuTouched = false;
private int mClickPosition;
private OnClickListener mOnClickListener;
private OnShareToListener mOnShareToListener;
private MEDIA_META_TYPE mCurMetaType = MEDIA_META_TYPE.ALL_MEDIA_TYPE;
private SHARE_MULTI_SELECT_TYPE mCurMultiSelectionType = SHARE_MULTI_SELECT_TYPE.NONE_LIMITE;
private static final String SHARE_IMAGE = "Share image",
SHARE_VIDEO = "Share video",
SHARE_VIDEO_AND_IMAGE = "Share video and image",
TAG = "ShareMenu";
public static final int ANCHOR_TOP_LEFT = 0x11,
ANCHOR_BUTTOM_LEFT = 0x12,
ANCHOR_CENTER = 0x13,
ANCHOR_TOP_RIGHT = 0x14,
ANCHOR_BUTTOM_RIGHT = 0x15,
TYPE_ONE_BUTTON = 0x16,
TYPE_TWO_BUTTON = 0x17,
TYPE_THREE_BUTTON = 0x18;
/**
* 初始化ShareMenu
*
* @param context
* :getBaseContext
* @param location
* :弹出的位置
* @param x
* :x坐标
* @param y
* :y坐标
*/
public ShareToModule(Context context, int x, int y) {
super(context);
mContext = context;
mShareMenuX = x;
mShareMenuY = y;
mImageFilePath = new ArrayList<String>();
mVideoFilePath = new ArrayList<String>();
mApps = new ArrayList<ResolveInfo>();
mMainLayout = new RelativeLayout(mContext);
mListView = new ListView(mContext);
mTitle = new TextView(mContext);
mListAppAdapter = new ListAppAdapter();
initData();
}
public void setLocation(int x,int y,int anchor){
mShareMenuX = x;
mShareMenuY = y;
setAnchor(anchor);
setMargin(mShareMenuX, mShareMenuY, 0, 0);
}
public void setMargin(int left,int top,int right,int bottom){
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(mShareMenuWidth, mShareMenuHeight);
layoutParams.setMargins(left, top, right, bottom);
mMainLayout.setLayoutParams(layoutParams);
mMainLayout.invalidate();
}
public void setLayoutParams(RelativeLayout.LayoutParams layoutParams) {
// TODO Auto-generated method stub
mMainLayoutParams = layoutParams;
}
private void initData() {
// 获取屏幕的宽高
WindowManager windowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
mScreenWidth = windowManager.getDefaultDisplay().getWidth();
mScreenHeight = windowManager.getDefaultDisplay().getHeight();
mMainLayout.setPadding(5, 5, 5, 5);
mShareMenuWidth = 300;
mShareMenuHeight = ViewGroup.LayoutParams.WRAP_CONTENT;
mMainLayoutParams = new RelativeLayout.LayoutParams(mShareMenuWidth, mShareMenuHeight);
mMainLayoutParams.setMargins(mShareMenuX, mShareMenuY, 0, 0);
// mMainLayout.setBackgroundResource(R.drawable.main_menu);
mListView.setFadingEdgeLength(0);
mListView.setScrollingCacheEnabled(false);
mListView.setLayoutParams(new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
mShareMenuHeight));
mListView.setBackgroundResource(R.drawable.main_menu);
mListView.setPadding(10, 55, 10, 20);
mTitle.setText("Share");
mTitle.setTextSize(mTextSize);
mTitle.setTextColor(mTextColor);
mTitle.setGravity(Gravity.CENTER);
mTitle.setId(0x1110);
mTitle.setLayoutParams(new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, mTitleHeight));
mIconWidth = 55;
mIconHeight = 55;
mIsMenuTouched = false;
mMainLayout.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
mIsMenuTouched = true;
return mIsMenuTouched;
}
});
}
public void setBackground(int resid) {
mMainLayout.setBackgroundResource(resid);
}
/**
* 将CSShareMenu添加到布局中
*
* @param layout
* :父布局
*/
public void addToLayout(ViewGroup layout) {
loadApps(MEDIA_META_TYPE.ALL_MEDIA_TYPE);
mListSize = mApps.size();
if(CSStaticData.DEBUG){
Log.w(TAG, "[addToLayout]找到 " + mApps.size() + " 个应用");
}
// Log.w(TAG, "mImageFilePath" + mImageFilePath.get(0) + "mImageFilePath.size()" + mImageFilePath.size());
mListView.setAdapter(mListAppAdapter);
mListView.setOnItemClickListener(this);
// RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
// ViewGroup.LayoutParams.MATCH_PARENT);
// layoutParams.addRule(RelativeLayout.BELOW, 0x1110);
mMainLayout.addView(mListView);
mMainLayout.addView(mTitle);
layout.addView(mMainLayout, mMainLayoutParams);
}
/**
* 加载可接受图片或视频的应用
*/
private void loadApps(MEDIA_META_TYPE metaType) {
Intent intent = new Intent();
mApps_image.clear();
mApps_video.clear();
if(mCurMultiSelectionType == SHARE_MULTI_SELECT_TYPE.NONE_LIMITE){
//Do Nothing
intent.setAction(Intent.ACTION_SEND);
intent.setType("image/*");
mApps_image = mContext.getPackageManager().queryIntentActivities(intent, 0);
intent.setType("video/*");
mApps_video = mContext.getPackageManager().queryIntentActivities(intent, 0);
ArrayList<ResolveInfo> list_image = new ArrayList<ResolveInfo>(mApps_image);
ArrayList<ResolveInfo> list_video = new ArrayList<ResolveInfo>(mApps_video);
List<ResolveInfo> list_aciton_send = unionApps(metaType,list_image,list_video);
// intent.setAction(Intent.ACTION_SEND_MULTIPLE);
// intent.setType("image/*");
// mApps_image = mContext.getPackageManager().queryIntentActivities(intent, 0);
//
// intent.setType("video/*");
// mApps_video = mContext.getPackageManager().queryIntentActivities(intent, 0);
// List<ResolveInfo> list_action_multipl = unionApps(metaType,mApps_image,mApps_video);
mApps.clear();
// mApps = unionApps(metaType, list_action_multipl, list_aciton_send);
mApps = list_aciton_send;
return;
}
if(mCurMultiSelectionType == SHARE_MULTI_SELECT_TYPE.SINGLE_SELECTION){
intent.setAction(Intent.ACTION_SEND);
}
if(mCurMultiSelectionType == SHARE_MULTI_SELECT_TYPE.MULTI_SELECTION){
intent.setAction(Intent.ACTION_SEND_MULTIPLE);
}
intent.setType("image/*");
mApps_image = mContext.getPackageManager().queryIntentActivities(intent, 0);
intent.setType("video/*");
mApps_video = mContext.getPackageManager().queryIntentActivities(intent, 0);
ArrayList<ResolveInfo> list_image = new ArrayList<ResolveInfo>(mApps_image);
ArrayList<ResolveInfo> list_video = new ArrayList<ResolveInfo>(mApps_video);
unionApps(metaType,list_image,list_video);
}
private List<ResolveInfo> unionApps(MEDIA_META_TYPE metaType,List<ResolveInfo> list_image,List<ResolveInfo> list_video){
List<ResolveInfo> mAppsList = new ArrayList<ResolveInfo>();
if (list_image.size() != 0 && list_video.size() != 0) {
int maxSize = list_image.size() > list_video.size() ? list_image.size() : list_video.size();
int list_image_size = list_image.size();
int list_video_size = list_video.size();
if(metaType == MEDIA_META_TYPE.ALL_MEDIA_TYPE){
if (list_image_size == maxSize) {
for(int i = 0;i<list_image_size;i++){
if(isContainInList(list_video, list_image.get(i))){
list_image.remove(i);
list_image_size--;
i--;
}
}
}else {
for(int i = 0;i<list_video_size;i++){
if(isContainInList(list_image, list_video.get(i))){
list_video.remove(i);
list_video_size--;
i--;
}
}
}
mAppsList.addAll(list_image);
mAppsList.addAll(list_video);
}
if(metaType == MEDIA_META_TYPE.NO_FILTER){
for (int i = 0; i < maxSize; i++) {
if (mApps_image.size() == maxSize) {
if(isContainInList(mApps_image, mApps_video.get(i))){
mApps_video.remove(mApps_video.get(i));
}
} else {
if(isContainInList(mApps_video, mApps_image.get(i))){
mApps_image.remove(mApps_image.get(i));
}
}
}
mAppsList.addAll(mApps_image);
mAppsList.addAll(mApps_video);
}
if(metaType == MEDIA_META_TYPE.IMAGE_MEDIA_TYPE){
mAppsList = mApps_image;
}
if(metaType == MEDIA_META_TYPE.VIDEO_MEDIA_TYPE){
mAppsList = mApps_video;
}
}
return mAppsList;
}
public void setOnClickListener(OnClickListener listener){
mOnClickListener = listener;
}
public interface OnClickListener {
abstract void OnClick();
}
/**
* ListAppAdapter继承BaseAdapter
*
*/
public class ListAppAdapter extends BaseAdapter {
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = holder.mListItemLayout;
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
ResolveInfo info = mApps.get(position);
holder.mIcon.setImageDrawable(info.activityInfo.loadIcon(mContext.getPackageManager()));
holder.mAppName.setText(info.activityInfo.loadLabel(mContext.getPackageManager()));
return convertView;
}
public final int getCount() {
return mApps.size();
}
public final Object getItem(int position) {
return mApps.get(position);
}
public final long getItemId(int position) {
return position;
}
}
/**
* 管理listItem的类
*
* @author WH1107017
*
*/
class ViewHolder {
private ImageView mIcon;
private TextView mAppName;
private RelativeLayout mListItemLayout;
private RelativeLayout.LayoutParams mLayoutParams;
public ViewHolder() {
mListItemLayout = new RelativeLayout(mContext);
mListItemLayout.setBackgroundResource(R.drawable.camera_menu_selecter);
mAppName = new TextView(mContext);
mAppName.setTextSize(mTextSize);
mAppName.setGravity(Gravity.CENTER_VERTICAL);
mAppName.setTextColor(mTextColor);
mIcon = new ImageView(mContext);
mIcon.setId(0x1220); //?
RelativeLayout.LayoutParams mIconLayoutParams = new RelativeLayout.LayoutParams(
55, 55);
mIconLayoutParams.setMargins(15, 0, 15, 0);
mIconLayoutParams.addRule(RelativeLayout.CENTER_VERTICAL);
mLayoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, mListItemHeight);
mLayoutParams.addRule(RelativeLayout.RIGHT_OF, 0x1220);
mListItemLayout.addView(mIcon, mIconLayoutParams);
mListItemLayout.addView(mAppName, mLayoutParams);
mListItemLayout.setGravity(Gravity.CENTER_VERTICAL);
}
}
/**
* 应用列表的点击事件
*
*/
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
int dataTypeSize = 0;
boolean isImageApp = false;
boolean isVideoApp = false;
mClickPosition = position;
// isImageApp = mApps_image.contains(mApps.get(position));
// isVideoApp = mApps_video.contains(mApps.get(position));
// Log.v(TAG, " mApps_image.size()"+ mApps_image.size());
if (isContainInList(mApps_image, mApps.get(position))) {
isImageApp = true;
}
if (isContainInList(mApps_video, mApps.get(position))) {
isVideoApp = true;
}
// if (mApps_image != null && mApps_image.size() != 0) {
// isImageApp = true;
//
// }
//
// if (mApps_video != null && mApps_video.size() != 0) {
// isVideoApp = true;
// Log.v(TAG, " mApps_video.size()"+ mApps_video.size());
// }
if(isImageApp){
mCurMetaType = MEDIA_META_TYPE.IMAGE_MEDIA_TYPE;
}
if(isVideoApp){
mCurMetaType = MEDIA_META_TYPE.VIDEO_MEDIA_TYPE;
}
if(isImageApp && isVideoApp){
mCurMetaType = MEDIA_META_TYPE.ALL_MEDIA_TYPE;
}
Log.v(TAG, "mCurMetaType"+mCurMetaType);
hide();
if(mOnClickListener != null){
mOnClickListener.OnClick();
}
}
public void sendShareList(List<String> fileList){
int size = 0;
ResolveInfo info = mApps.get(mClickPosition);
Intent intent = new Intent();
ArrayList<Uri> aFileList = new ArrayList<Uri>();
if(fileList == null || fileList.size() == 0){
return;
}
if(mImageFilePath == null){
mImageFilePath = new ArrayList<String>();
}
if(mVideoFilePath == null){
mVideoFilePath = new ArrayList<String>();
}
size = fileList.size();
mImageFilePath.clear();
mVideoFilePath.clear();
for(int i = 0; i < size; i++){
if(FileTypeHelper.isImageFile(fileList.get(i))){
mImageFilePath.add(fileList.get(i));
}
if(FileTypeHelper.isVideoFile(fileList.get(i))){
mVideoFilePath.add(fileList.get(i));
}
}
if (mImageFilePath.size() > 1 || mVideoFilePath.size() > 1
|| (mImageFilePath.size() != 0 && mVideoFilePath.size() != 0)) {
intent.setAction(Intent.ACTION_SEND_MULTIPLE);
if (mImageFilePath.size() >= 1 && mVideoFilePath.size() >= 1) {
intent.setType("*/*");
intent.putExtra(Intent.EXTRA_SUBJECT, SHARE_VIDEO_AND_IMAGE);
for (int i = 0; i < mImageFilePath.size(); i++) {
aFileList.add(Uri.parse(mImageFilePath.get(i)));
}
for (int j = 0; j < mVideoFilePath.size(); j++) {
aFileList.add(Uri.parse(mVideoFilePath.get(j)));
}
} else if (mImageFilePath.size() > 1 && mVideoFilePath.size() == 0) {
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_SUBJECT, SHARE_IMAGE);
for (int i = 0; i < mImageFilePath.size(); i++) {
aFileList.add(Uri.parse(mImageFilePath.get(i)));
}
} else if (mImageFilePath.size() == 0 && mVideoFilePath.size() > 1) {
intent.setType("video/*");
intent.putExtra(Intent.EXTRA_SUBJECT, SHARE_VIDEO);
for (int i = 0; i < mVideoFilePath.size(); i++) {
aFileList.add(Uri.parse(mVideoFilePath.get(i)));
}
}
intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, aFileList);
} else {
intent.setAction(Intent.ACTION_SEND);
if (mImageFilePath.size() == 1) {
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_SUBJECT, SHARE_IMAGE);
intent.putExtra(Intent.EXTRA_STREAM, Uri.parse(mImageFilePath.get(0)));
} else {
intent.setType("video/*");
intent.putExtra(Intent.EXTRA_SUBJECT, SHARE_VIDEO);
intent.putExtra(Intent.EXTRA_STREAM, Uri.parse(mVideoFilePath.get(0)));
}
}
try {
intent.setClassName(info.activityInfo.packageName, info.activityInfo.name);
mContext.startActivity(intent);
if(mOnShareToListener != null){
mOnShareToListener.onShared(intent, true);
}
} catch (Exception e) {
e.printStackTrace();
if(mOnShareToListener != null){
mOnShareToListener.onShared(intent, false);
}
} finally {
//Do Nothing
}
}
/**
* 分享菜单事件分发函数
*
* @param event
* @return 如果down事件是在菜单上,则返回true,反之菜单隐藏并返回false
*/
/* public boolean dispatchTouchEvent(MotionEvent event) {
mListView.dispatchTouchEvent(event);
if (event.getRawX() > mShareMenuX && event.getRawX() < mShareMenuX + mShareMenuWidth
&& event.getRawY() > mShareMenuY
&& event.getRawY() < mShareMenuY + mListItemHeight * mListSize + mTitleHeight) {
try {
mIsMenuTouched |= mListView.dispatchTouchEvent(event);
} catch (Exception e) {
e.printStackTrace();
}
if (mMainLayout.getVisibility() == View.VISIBLE) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
mAllowHide = false;
}
return true;
} else {
mAllowHide = true;
return false;
}
} else {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
mMainLayout.setVisibility(View.INVISIBLE);
mIsMenuTouched = false;
}
if (mMainLayout.getVisibility() == View.VISIBLE && event.getAction() == MotionEvent.ACTION_UP && mAllowHide) {
mMainLayout.setVisibility(View.INVISIBLE);
mIsMenuTouched = false;
}
}
return mIsMenuTouched;
}*/
/**
* 判断分享菜单是否被点击, 如果down事件是在菜单上,则返回true,反之菜单隐藏并返回false
*
* @return
*/
public boolean getIsShareMenuTouch() {
return mIsMenuTouched;
}
public void setIsShareMenuTouch(boolean b){
mIsMenuTouched = b;
}
/**
* 判断分享菜单是否显示
*
* @return
*/
public boolean isShown() {
return mIsShow;
}
/**
* 显示分享菜单
*
* @return
*/
public boolean show() {
if (mMainLayout != null) {
mMainLayout.setVisibility(View.VISIBLE);
mListView.setAdapter(mListAppAdapter);
}
mIsShow = true;
return mIsShow;
}
/**
* 隐藏分享菜单
*
* @return
*/
public void hide() {
if (mMainLayout != null) {
mMainLayout.setVisibility(View.GONE);
}
mIsShow = false;
}
/**
* 获取分享菜单的可见度
*
* @return
*/
public int getVisibility() {
if (mMainLayout == null) {
return View.INVISIBLE;
}
return mMainLayout.getVisibility();
}
/**
* 设置分享菜单的可见度
*
* @param visibility
*/
public void setVisibility(int visibility) {
if (mMainLayout == null) {
return;
}
mMainLayout.setVisibility(visibility);
}
/**
* 设置菜单是背景
*
* @param resid
*/
public void setListViewSelector(int resid) {
mListSelector = resid;
}
/**
* 设置菜单整个布局的背景
*
* @param resid
*/
public void setListLayoutSelector(int resid) {
mListLayoutSelector = resid;
}
/**
* 设置定位点
*
* @param anchor
* TOP_LEFT | TOP_RIGHT | BUTTOM_LEFT | BUTTOM_RIGHT | CENTER
*/
public void setAnchor(int anchor) {
mShareMenuAnchor = anchor;
switch (anchor) {
case ANCHOR_TOP_LEFT:
break;
case ANCHOR_BUTTOM_LEFT:
mShareMenuY = mShareMenuY - mShareMenuHeight;
break;
case ANCHOR_CENTER:
mShareMenuX = mShareMenuX - mShareMenuWidth / 2;
mShareMenuY = mShareMenuY - mShareMenuHeight / 2;
break;
case ANCHOR_TOP_RIGHT:
mShareMenuX = mShareMenuX - mShareMenuWidth;
break;
case ANCHOR_BUTTOM_RIGHT:
mShareMenuX = mShareMenuX - mShareMenuWidth;
mShareMenuY = mShareMenuY - mShareMenuHeight;
break;
}
}
@Override
public void setRotation(float rotation) {
mMainLayout.setRotation(rotation);
}
/**
* 设定分享菜单的应用媒体类型支持
* @param metaType
*/
public void setMetaType(MEDIA_META_TYPE metaType){
if(mApps != null){
mApps.clear();
}else{
mApps = new ArrayList<ResolveInfo>();
}
loadApps(metaType);
mListSize = mApps.size();
if(CSStaticData.DEBUG){
Log.w(TAG, "[addToLayout]找到 " + mApps.size() + " 个应用");
}
}
/**
* 获取分享菜单的应用媒体类型支持
* @return
*/
public MEDIA_META_TYPE getMetaType(){
return mCurMetaType;
}
/**
* 判断当前选中的应用是否可接受多个内容
* @return
*/
public SHARE_MULTI_SELECT_TYPE isMultiApp(){
return mCurMultiSelectionType;
}
public void setMultiSelectionMode(SHARE_MULTI_SELECT_TYPE multiMode){
mCurMultiSelectionType = multiMode;
setMetaType(mCurMetaType);
}
protected boolean isContainInList(List<ResolveInfo> list, ResolveInfo elem) {
int listSize = 0;
if(list == null){
return false;
}
listSize = list.size();
for(int i = 0; i < listSize; i++){
if(resolveInfoEquals(list.get(i), elem)){
return true;
}
}
return false;
}
protected boolean resolveInfoEquals(ResolveInfo elemA, ResolveInfo elemB) {
if(elemA.activityInfo.loadLabel(mContext.getPackageManager()).equals(elemB.activityInfo.loadLabel(mContext.getPackageManager()))){
return true;
}else{
return false;
}
}
public void setOnShareToListener(OnShareToListener listener){
mOnShareToListener = listener;
}
public int saveStatus(){
return mClickPosition;
}
public void restoreStatus(int position){
mClickPosition = position;
}
public interface OnShareToListener{
public void onShared(Intent intent, boolean isSuccess);
}
}