package com.android.launcher;
import java.net.URISyntaxException;
import java.util.List;
import android.app.ListActivity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnCreateContextMenuListener;
import android.widget.AdapterView;
import android.widget.CursorAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
public class ExtendedDrawerSettings extends ListActivity {
LayoutInflater mInflater;
Cursor mCursor;
SQLiteDatabase mDatabase;
ApplicationsAdapter mAdapter;
ListView mListView;
public static Launcher activeLauncher;
public static final int mnuAddItem = Menu.FIRST + 1;
public static final int mnuDeleteItem = Menu.FIRST + 2;
@Override
public boolean onContextItemSelected(MenuItem item)
{
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
int itemId = Integer.valueOf(String.valueOf(info.position));
mCursor.moveToPosition(itemId);
int ApplicationId = mCursor.getInt(0);
switch(item.getItemId())
{
case mnuDeleteItem:
DeleteApplication(ApplicationId);
break;
}
refreshCursor();
return super.onContextItemSelected(item);
}
/** Database */
protected static class ExtendedDrawerDBHelper extends SQLiteOpenHelper {
public ExtendedDrawerDBHelper(Context context) {
super(context, "extendeddrawer.sqlite", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
String ddlScripts = "create table extendeddrawer_hidden (_id integer primary key, name text, intent text);";
db.execSQL(ddlScripts);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
/** Cursor adapter */
public class ApplicationsAdapter extends CursorAdapter {
public ApplicationsAdapter(Context context, Cursor c) {
super(context, c);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
TextView ApplicationNameText = (TextView) view.findViewById(R.id.txtTitle);
String applicationName = cursor.getString(1);
ApplicationNameText.setText(applicationName);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View view = mInflater.inflate(R.layout.extended_drawersettings_row, null);
bindView(view, context, cursor);
return view;
}
}
private void refreshCursor() {
mCursor = mDatabase.query(false, "extendeddrawer_hidden", new String[] { "_id", "name" }, null, null, null, null, null, null);
mAdapter = new ApplicationsAdapter(this, mCursor);
setListAdapter(mAdapter);
}
@Override
protected void onResume()
{
refreshCursor();
super.onResume();
}
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.extended_drawersettings);
mListView = (ListView) findViewById(android.R.id.list);
mInflater = getLayoutInflater();
ExtendedDrawerDBHelper hlp = new ExtendedDrawerDBHelper(this);
mDatabase = hlp.getWritableDatabase();
refreshCursor();
//Listview Context
mListView.setOnCreateContextMenuListener(
new OnCreateContextMenuListener()
{
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
menu.add(0, mnuDeleteItem, 0, "Add to application drawer");
}
}
);
//Listview clicked
mListView.setOnItemClickListener(
new OnItemClickListener()
{
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
/*
//Execute the selected script
mCursor.moveToPosition(position);
int ScriptId = mCursor.getInt(0);
ExecuteScript(ScriptId);
*/
}
}
);
}
/**Delete application*/
void DeleteApplication(int ApplicationId)
{
Cursor data = mDatabase.query(false, "extendeddrawer_hidden", new String[] { "_id", "name", "intent" }, "_id = "+ApplicationId, null, null, null, null, null);
ApplicationInfo info = null;
PackageManager manager = getPackageManager();
while(data.moveToNext())
{
Intent intent;
try {
intent = Intent.getIntent(data.getString(2));
if(intent.resolveActivity(manager) == null)
{
continue;
}
} catch (URISyntaxException e) {
Log.d("ExtendedDrawer", "Could not get intent from uri!");
continue;
}
final List<ResolveInfo> apps = manager.queryIntentActivities(intent, 0);
if(apps.size() <= 0)
continue;
ResolveInfo rinfo = apps.get(0);
String apptitle = rinfo.loadLabel(manager).toString();
if (apptitle == null) {
apptitle = rinfo.activityInfo.name;
}
ComponentName componentName = new ComponentName(
rinfo.activityInfo.applicationInfo.packageName,
rinfo.activityInfo.name);
info = new ApplicationInfo();
info.container = ItemInfo.NO_ID;
updateApplicationInfoTitleAndIcon(manager, rinfo, info, this);
info.setActivity(componentName,
Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
}
data.close();
mDatabase.execSQL("DELETE FROM extendeddrawer_hidden WHERE _id = " + ApplicationId);
refreshCursor();
final LauncherModel model = Launcher.getModel();
if(info != null)
model.addApplicationInfo(info);
else
{
model.dropApplications();
model.loadApplications(false, activeLauncher, false);
}
}
private static void updateApplicationInfoTitleAndIcon(PackageManager manager, ResolveInfo info,
ApplicationInfo application, Context context) {
application.title = info.loadLabel(manager);
if (application.title == null) {
application.title = info.activityInfo.name;
}
application.icon =
Utilities.createIconThumbnail(info.activityInfo.loadIcon(manager), context);
application.filtered = false;
}
}