package org.bbs.apklauncher; import org.bbs.apkparser.PackageInfoX; import org.bbs.apkparser.PackageInfoX.ActivityInfoX; import android.annotation.TargetApi; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.util.Log; import android.view.ActionMode; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnLongClickListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ListAdapter; import android.widget.ListView; @TargetApi(Build.VERSION_CODES.GINGERBREAD) public class PluginsActivity extends Activity { private static final int MENU_PICK = R.layout.apklauncher_activity_plugins; private static final String TAG = PluginsActivity.class.getSimpleName(); private ActivityInfoX mDeleteAct; private ActionMode mActionMode; private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() { // Called when the action mode is created; startActionMode() was called @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { // Inflate a menu resource providing context menu items MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.apklauncher_plugins_context_menu, menu); return true; } // Called each time the action mode is shown. Always called after onCreateActionMode, but // may be called multiple times if the mode is invalidated. @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; // Return false if nothing is done } // Called when the user selects a contextual menu item @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { int itemId = item.getItemId(); if (itemId == R.id.delete) { deletePlguin(); mode.finish(); // Action picked, so close the CAB return true; } else { return false; } } // Called when the user exits the action mode @Override public void onDestroyActionMode(ActionMode mode) { mActionMode = null; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.apklauncher_activity_plugins); populateUi(); // getActionBar().get } protected void deletePlguin() { ApkPackageManager.getInstance().deleteApk(mDeleteAct.mPackageInfo); populateUi(); } @Override protected void onResume() { super.onResume(); // populateUi(); } private void populateUi() { ApkPackageManager apks = ApkPackageManager.getInstance(); ListAdapter adapter = new ArrayAdapter<PackageInfoX.ActivityInfoX>(this, android.R.layout.simple_list_item_1, apks.getLauncherActivityInfo()){ @Override public View getView(final int position, View convertView, ViewGroup parent) { View v = super.getView(position, convertView, parent); v.setTag(getItem(position)); v.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { PackageInfoX.ActivityInfoX a = (ActivityInfoX) v.getTag(); onAppClick(a); } }); v.setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View v) { mActionMode = startActionMode(mActionModeCallback); mDeleteAct = getItem(position); return true; } }); return v ; } }; ListView mListView = (ListView)findViewById(R.id.apk_container); mListView.setAdapter(adapter);; mListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { PackageInfoX.ActivityInfoX a = (ActivityInfoX) view.getTag(); onAppClick(a); } }); mListView.setEmptyView(findViewById(android.R.id.empty));; } protected void onAppClick(ActivityInfoX info){ Log.d(TAG, "onClick. activity: " + info); ApkLauncher.getInstance().startActivity(PluginsActivity.this, info); } @Override public boolean onCreateOptionsMenu(Menu menu) { // XXX not work, why??? // menu.add(Menu.NONE, MENU_PICK, 0, "pick plugin"); getMenuInflater().inflate(R.menu.apklauncher_plugin, menu); // return true; return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { // XXX not work, why??? // if (MENU_PICK == item.getItemId()){ if (item.getItemId() == R.id.pick) { Intent pick = new Intent(Intent.ACTION_GET_CONTENT); pick.setType("*/*"); // Intent pick = new Intent(Intent.ACTION_PICK); startActivityForResult(pick, 0); return true; } return super.onOptionsItemSelected(item); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (0 == requestCode && RESULT_OK == resultCode){ Uri uri = data.getData(); Log.d(TAG, "uri: " + uri); if ("file".equals(uri.getScheme())){ String apkPath = uri.getPath(); ApkPackageManager.getInstance().parseApkFile(apkPath); populateUi(); } } super.onActivityResult(requestCode, resultCode, data); } }