package com.example.TestPlugin; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.content.ServiceConnection; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.RemoteException; import android.support.v4.app.ListFragment; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.morgoo.droidplugin.pm.PluginManager; import com.morgoo.helper.Log; import java.util.List; public class InstalledFragment extends ListFragment implements ServiceConnection { private ArrayAdapter<ApkItem> adapter; final Handler handler = new Handler(); public InstalledFragment() { } @Override public void onListItemClick(ListView l, View v, int position, long id) { ApkItem item = adapter.getItem(position); if (v.getId() == R.id.button2) { PackageManager pm = getActivity().getPackageManager(); Intent intent = pm.getLaunchIntentForPackage(item.packageInfo.packageName); if (intent != null) { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Log.i("DroidPlugin", "start " + item.packageInfo.packageName + "@" + intent); startActivity(intent); } else { Log.e("DroidPlugin", "pm " + pm.toString() + " no find intent " + item.packageInfo.packageName); } } else if (v.getId() == R.id.button3) { doUninstall(item); } } private void doUninstall(final ApkItem item) { AlertDialog.Builder builder = new Builder(getActivity()); builder.setTitle("警告,你确定要删除么?"); builder.setMessage("警告,你确定要删除" + item.title + "么?"); builder.setNegativeButton("删除", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (!PluginManager.getInstance().isConnected()) { Toast.makeText(getActivity(), "服务未连接", Toast.LENGTH_SHORT).show(); } else { try { PluginManager.getInstance().deletePackage(item.packageInfo.packageName, 0); Toast.makeText(getActivity(), "删除完成", Toast.LENGTH_SHORT).show(); } catch (RemoteException e) { e.printStackTrace(); } } } }); builder.setNeutralButton("取消", null); builder.show(); } @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { startLoad(); } private void startLoad() { new Thread("ApkScanner") { @Override public void run() { try { final List<PackageInfo> infos = PluginManager.getInstance().getInstalledPackages(0); final PackageManager pm = getActivity().getPackageManager(); for (final PackageInfo info : infos) { handler.post(new Runnable() { @Override public void run() { adapter.add(new ApkItem(pm, info, info.applicationInfo.publicSourceDir)); } }); } } catch (RemoteException e) { e.printStackTrace(); } handler.post(new Runnable() { @Override public void run() { setListShown(true); } }); } }.start(); } @Override public void onServiceDisconnected(ComponentName componentName) { } private MyBroadcastReceiver mMyBroadcastReceiver = new MyBroadcastReceiver(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mMyBroadcastReceiver.registerReceiver(getActivity().getApplication()); adapter = new ArrayAdapter<ApkItem>(getActivity(), 0) { @Override public View getView(final int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(getActivity()).inflate(R.layout.apk_item, null); } ApkItem item = getItem(position); ImageView icon = (ImageView) convertView.findViewById(R.id.imageView); icon.setImageDrawable(item.icon); TextView title = (TextView) convertView.findViewById(R.id.textView1); title.setText(item.title); final TextView version = (TextView) convertView.findViewById(R.id.textView2); version.setText(String.format("%s(%s)", item.versionName, item.versionCode)); TextView btn = (TextView) convertView.findViewById(R.id.button2); btn.setText("打开"); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { onListItemClick(getListView(), view, position, getItemId(position)); } }); btn = (TextView) convertView.findViewById(R.id.button3); btn.setText("卸载"); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { onListItemClick(getListView(), view, position, getItemId(position)); } }); return convertView; } }; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); setEmptyText("没有安装插件"); setListAdapter(adapter); setListShown(false); getListView().setOnItemClickListener(null); if (PluginManager.getInstance().isConnected()) { startLoad(); } else { PluginManager.getInstance().addServiceConnection(this); } } @Override public void onDestroy() { PluginManager.getInstance().removeServiceConnection(this); mMyBroadcastReceiver.unregisterReceiver(getActivity().getApplication()); super.onDestroy(); } private class MyBroadcastReceiver extends BroadcastReceiver { void registerReceiver(Context con) { IntentFilter f = new IntentFilter(); f.addAction(PluginManager.ACTION_PACKAGE_ADDED); f.addAction(PluginManager.ACTION_PACKAGE_REMOVED); f.addDataScheme("package"); con.registerReceiver(this, f); } void unregisterReceiver(Context con) { con.unregisterReceiver(this); } @Override public void onReceive(Context context, Intent intent) { if (PluginManager.ACTION_PACKAGE_ADDED.equals(intent.getAction())) { try { PackageManager pm = getActivity().getPackageManager(); String pkg = intent.getData().getAuthority(); PackageInfo info = PluginManager.getInstance().getPackageInfo(pkg, 0); adapter.add(new ApkItem(pm, info, info.applicationInfo.publicSourceDir)); } catch (Exception e) { e.printStackTrace(); } } else if (PluginManager.ACTION_PACKAGE_REMOVED.equals(intent.getAction())) { String pkg = intent.getData().getAuthority(); int N = adapter.getCount(); ApkItem iremovedItem = null; for (int i = 0; i < N; i++) { ApkItem item = adapter.getItem(i); if (TextUtils.equals(item.packageInfo.packageName, pkg)) { iremovedItem = item; break; } } if (iremovedItem != null) { adapter.remove(iremovedItem); } } } } }