popupwindow

package cn.itcast.mobilesafe;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout.LayoutParams;
import android.widget.AbsListView;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.PopupWindow.OnDismissListener;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

public class AppManagerActivity extends Activity {
	protected static final int GET_APP_FINISHED = 80;
	protected static final String TAG = "AppManagerActivity";
	ListView lv_appmanage;
	// 包管理器 获取安装的程序
	PopupWindow mPopupWindow;
	PackageManager packageManager;
	List<ApplicationInfo> appInfos;
	List<ApplicationInfo> userAppInfos;
	ProgressDialog pd;
	LayoutInflater inflater;
	TextView tv_asset_title;
	boolean isAllapp = true;
	// 实例化一个动画效果的插入器 , 插入器是作用在某个view对象上的
	Interpolator mInterpolator = new Interpolator() {

		public float getInterpolation(float input) {
			final float inner = (input * 1.55f) - 1.1f;
			return 1.2f - inner * inner;
		}
	};

	Handler handler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			super.handleMessage(msg);
			switch (msg.what) {
			case GET_APP_FINISHED:
				pd.dismiss();
				getUserApp();
				lv_appmanage.setAdapter(new AppListAdapter(appInfos));
				break;
			default:
				break;
			}
		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.applationinstall);
		packageManager = getPackageManager();
		inflater = LayoutInflater.from(this);
		pd = new ProgressDialog(this);
		pd.setMessage("正在搜索应用程序");
		getInstallApp();
		userAppInfos = new ArrayList<ApplicationInfo>();

		tv_asset_title = (TextView) this.findViewById(R.id.asset_title);

		tv_asset_title.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				if (isAllapp) {
					tv_asset_title.setText("用户程序");
					isAllapp = false;
					lv_appmanage.setAdapter(new AppListAdapter(userAppInfos));
				}else{
					isAllapp = true;
					tv_asset_title.setText("所有程序");
					lv_appmanage
					.setAdapter(new AppListAdapter(appInfos));
				}

			}
		});

		lv_appmanage = (ListView) this.findViewById(R.id.lv_appmanage);
		// 监听listview的滚动状态
		lv_appmanage.setOnScrollListener(new OnScrollListener() {

			// 当滚动状态改变的回调方法
			public void onScrollStateChanged(AbsListView view, int scrollState) {
				// TODO Auto-generated method stub
				dismissPopUpwindow();
			}

			// listview滚动 的时候 会执行的回调方法
			public void onScroll(AbsListView view, int firstVisibleItem,
					int visibleItemCount, int totalItemCount) {
				// TODO Auto-generated method stub
			}
		});
		lv_appmanage.setOnItemClickListener(new OnItemClickListener() {
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				// TODO Auto-generated method stub
				// 用户点击某个item之前 判断 当前界面上是不是有popwindow
				dismissPopUpwindow();
				// 要知道view在listview中的位置

				showPopWindow(view, position);
			}

		});

	}

	private void dismissPopUpwindow() {
		if (mPopupWindow != null && mPopupWindow.isShowing()) {
			mPopupWindow.dismiss();
			mPopupWindow = null;
		}
	}

	private void getInstallApp() {
		pd.show();
		new Thread() {
			@Override
			public void run() {
				// 获取到所有的安装的程序的信息
				appInfos = packageManager
						.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
				Message msg = new Message();
				msg.what = GET_APP_FINISHED;
				handler.sendMessage(msg);
			}
		}.start();

	}
	
	private void getUserApp(){
		for (ApplicationInfo appinfo : appInfos) {
			if (filterApp(appinfo)) {
				userAppInfos.add(appinfo);
			}

		}
	}
	/*
	 * 创建一个popupwindow 在指定的位置 参数view 是以那一个控件为 初始位置去显示 popupwindow
	 */
	public void showPopWindow(View view, int position) {
		int[] arrayOfInt = new int[2];
		// 获取到 当前listview里面item 在窗体中显示的位置
		view.getLocationInWindow(arrayOfInt);
		// 获取到popupwindow的布局
		final View myview = inflater.inflate(R.layout.popup_item, null);

		ImageButton ib_share = (ImageButton) myview
				.findViewById(R.id.ib_popup_share);
		ImageButton ib_start = (ImageButton) myview
				.findViewById(R.id.ib_popup_start);
		ImageButton ib_uninstall = (ImageButton) myview
				.findViewById(R.id.ib_popup_uninstall);
		ib_share.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				// TODO Auto-generated method stub
				Log.i(TAG,
						"当前popupwindow 对应item的 position"
								+ (Integer) myview.getTag());
				int posi = (Integer) myview.getTag();
				ApplicationInfo appinfo;
				if (isAllapp){
				appinfo = appInfos.get(posi);
				}else {
					appinfo= userAppInfos.get(posi);
				}
				String packname = appinfo.packageName;
				Intent localIntent1 = new Intent("android.intent.action.SEND");
				localIntent1 = localIntent1.setType("text/plain");
				localIntent1 = localIntent1.putExtra(
						"android.intent.extra.SUBJECT", "f分享");
				localIntent1 = localIntent1.putExtra(
						"android.intent.extra.TEXT", "推荐你使用一款软件  名字为"
								+ packname);
				localIntent1.createChooser(localIntent1, "分享");
				startActivity(localIntent1);

			}
		});
		ib_start.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				// TODO Auto-generated method stub
				int posi = (Integer) myview.getTag();
				ApplicationInfo appinfo;
				if (isAllapp){
				appinfo = appInfos.get(posi);
				}else {
					appinfo= userAppInfos.get(posi);
				}
				String packname = appinfo.packageName;
				// Intent intent = new Intent();
				// intent= packageManager.getLaunchIntentForPackage(packname);
				// <action android:name="android.intent.action.MAIN" />
				// <category android:name="android.intent.category.LAUNCHER" />
				// Intent i = new Intent();
				// i.setAction("android.intent.action.MAIN");
				// i.addCategory("android.intent.category.LAUNCHER");
				//
				// List<ResolveInfo> lists =
				// packageManager.queryIntentActivities(i,
				// PackageManager.MATCH_DEFAULT_ONLY);
				// for(ResolveInfo list :lists){
				//
				// }
				try {
					PackageInfo packinfo = packageManager.getPackageInfo(
							packname, PackageManager.GET_ACTIVITIES);
					ActivityInfo[] activityinfos = packinfo.activities;
					ActivityInfo lunchactivity = activityinfos[0];
					Intent intent = new Intent();
					intent.setComponent(new ComponentName(packname,
							lunchactivity.name));
					startActivity(intent);

				} catch (NameNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				// if(intent==null){
				// Toast.makeText(getApplicationContext(), "无法启动改应用", 1).show();
				// return;
				// }
				// intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
				// startActivity(intent);
			}
		});
		ib_uninstall.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				int posi = (Integer) myview.getTag();
				ApplicationInfo appinfo;
				if (isAllapp){
				appinfo = appInfos.get(posi);
				}else {
					appinfo= userAppInfos.get(posi);
				}
				String packname = appinfo.packageName;
				Intent intent = new Intent();
				intent.setAction(Intent.ACTION_DELETE);
				Uri data = Uri.parse("package:" + packname);
				intent.setData(data);
				startActivity(intent);
			}
		});

		// 把 position 设置给 myView 对象
		myview.setTag(position);
		// 设置popupwindow显示的内容

		mPopupWindow = new PopupWindow(myview, LayoutParams.WRAP_CONTENT,
				LayoutParams.WRAP_CONTENT);
		mPopupWindow.setFocusable(true);
		mPopupWindow.setOutsideTouchable(true);
		
		
		int i = arrayOfInt[0] + 60;
		int j = arrayOfInt[1];
		// 设置popupwindow的动画效果
		mPopupWindow.setAnimationStyle(R.anim.popup_enter);
		Animation anim = AnimationUtils.loadAnimation(this, R.anim.popup_enter);
		anim.setInterpolator(mInterpolator);
		anim.setDuration(1000);
		// 第一个参数 是popupwindow被挂载到哪个view对象上
		//
		mPopupWindow.showAtLocation(view, 51, i, j);
		myview.startAnimation(anim);
	}

	/*
	 * 绑定数据显示
	 */
	public class AppListAdapter extends BaseAdapter {
		private List<ApplicationInfo> myappInfos;

		public AppListAdapter(List<ApplicationInfo> appInfos) {
			myappInfos = appInfos;
		}

		public int getCount() {
			// TODO Auto-generated method stub
			return myappInfos.size();
		}

		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return myappInfos.get(position);
		}

		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return position;
		}

		public View getView(int position, View convertView, ViewGroup parent) {
			View view = null;
			if (convertView == null) {
				view = inflater.inflate(R.layout.applationinstall_item, null);
			} else {
				view = convertView;
			}
			ImageView iv = (ImageView) view.findViewById(R.id.lv_appicon);
			TextView tv = (TextView) view.findViewById(R.id.lv_appname);
			ApplicationInfo appinfo = myappInfos.get(position);
			// 获取appinfo的图标
			Drawable icon = appinfo.loadIcon(packageManager);
			iv.setImageDrawable(icon);
			String appname = (String) appinfo.loadLabel(packageManager);
			tv.setText(appname);
			return view;
		}
	}

	public boolean filterApp(ApplicationInfo info) {
		// 系统的软件被升级后的程序
		if ((info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
			// 用户安装的程序 替换掉了 系统的程序
			return true;
		} else if ((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
			// 用户自己安装的app
			return true;
		}
		return false;
	}

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		// TODO Auto-generated method stub
		
		if (event.getKeyCode()==KeyEvent.KEYCODE_BACK){
			dismissPopUpwindow();
		}
		
		return super.onKeyDown(keyCode, event);
	}
	
	
	
}

  

posted @ 2012-07-21 10:50  ligang305  阅读(572)  评论(0)    收藏  举报