diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..073d492 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/gen +/bin +/libs diff --git a/res/layout/all_activities_child_item.xml b/res/layout/all_activities_child_item.xml new file mode 100644 index 0000000..fb33ecc --- /dev/null +++ b/res/layout/all_activities_child_item.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/res/layout/all_activities_group_item.xml b/res/layout/all_activities_group_item.xml new file mode 100644 index 0000000..1da80fd --- /dev/null +++ b/res/layout/all_activities_group_item.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/res/layout/frament_all_list.xml b/res/layout/frament_all_list.xml index ddc015c..bcb80cf 100644 --- a/res/layout/frament_all_list.xml +++ b/res/layout/frament_all_list.xml @@ -1,12 +1,12 @@ - + android:layout_height="fill_parent" + android:orientation="vertical"> + android:layout_height="match_parent"> - - \ No newline at end of file + \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml index 37169e6..9c0c9b9 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -5,4 +5,9 @@ All activities Launch activity Create shortcut + Starting activity: %s + Starting application: %s + Creating activity shortcut for %s + Creating application shortcut for %s + Error diff --git a/src/de/szalkowski/activitylauncher/AllTasksListAdapter.java b/src/de/szalkowski/activitylauncher/AllTasksListAdapter.java index e028513..bef6cd2 100644 --- a/src/de/szalkowski/activitylauncher/AllTasksListAdapter.java +++ b/src/de/szalkowski/activitylauncher/AllTasksListAdapter.java @@ -8,20 +8,17 @@ import java.util.Map; import android.content.ComponentName; import android.content.Context; 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.util.Log; import android.util.Pair; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; +import android.widget.ImageView; import android.widget.TextView; public class AllTasksListAdapter extends BaseExpandableListAdapter { - final static private String LOG = "de.szalkowski.activitylauncher.alltaskslistadapter"; protected List packages = null; protected List activities = null; protected Map,Integer> index = null; @@ -41,14 +38,15 @@ public class AllTasksListAdapter extends BaseExpandableListAdapter { int pack_pos = this.packages.size(); for(ActivityInfo activity : pack.activities) { - if(activity.isEnabled()) { + if(activity.isEnabled() && activity.exported) { ComponentName acomp = new ComponentName(activity.packageName, activity.name); MyActivityInfo myactivity = new MyActivityInfo(acomp, pm); myactivity.package_id = pack_pos; int act_pos = this.activities.size(); this.activities.add(myactivity); - this.index.put(new Pair(pack_pos, n_activities), act_pos); + this.index.put(new Pair(pack_pos, n_activities), act_pos); + n_activities++; } } if(n_activities > 0) { @@ -73,12 +71,13 @@ public class AllTasksListAdapter extends BaseExpandableListAdapter { public View getChildView (int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { MyActivityInfo activity = activities.get(index.get(new Pair(groupPosition,childPosition))); LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - View view = inflater.inflate(android.R.layout.simple_expandable_list_item_2, null); + View view = inflater.inflate(R.layout.all_activities_child_item, null); TextView text = (TextView) view.findViewById(android.R.id.text1); - text.setText(activity.name); - - Log.d(LOG, "createChild " + activity.name); + text.setText(activity.name + " (" + activity.component_name.getClassName() + ")"); + + ImageView icon = (ImageView) view.findViewById(android.R.id.icon); + icon.setImageDrawable(activity.icon); return view; } @@ -107,11 +106,13 @@ public class AllTasksListAdapter extends BaseExpandableListAdapter { public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { MyPackageInfo pack = this.packages.get(groupPosition); LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - View view = inflater.inflate(android.R.layout.simple_expandable_list_item_1, null); + View view = inflater.inflate(R.layout.all_activities_group_item, null); TextView text = (TextView) view.findViewById(android.R.id.text1); text.setText(pack.name); - Log.d(LOG, "createGroup " + pack.name); + + ImageView icon = (ImageView) view.findViewById(android.R.id.icon); + icon.setImageDrawable(pack.icon); return view; } diff --git a/src/de/szalkowski/activitylauncher/AllTasksListFragment.java b/src/de/szalkowski/activitylauncher/AllTasksListFragment.java index 0d7a1c6..8b68bf2 100644 --- a/src/de/szalkowski/activitylauncher/AllTasksListFragment.java +++ b/src/de/szalkowski/activitylauncher/AllTasksListFragment.java @@ -1,22 +1,94 @@ package de.szalkowski.activitylauncher; +import org.thirdparty.LauncherIconCreator; + +import android.content.Intent; +import android.content.pm.PackageManager; import android.os.Bundle; import android.support.v4.app.Fragment; +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.widget.ExpandableListAdapter; import android.widget.ExpandableListView; +import android.widget.ExpandableListView.ExpandableListContextMenuInfo; +import android.widget.ExpandableListView.OnChildClickListener; +import android.widget.Toast; public class AllTasksListFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.frament_all_list, container); - + View view = inflater.inflate(R.layout.frament_all_list, null); + ExpandableListView list = (ExpandableListView) view.findViewById(R.id.expandableListView1); list.setAdapter(new AllTasksListAdapter(this.getActivity())); + list.setOnChildClickListener(new OnChildClickListener() { + @Override + public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { + ExpandableListAdapter adapter = parent.getExpandableListAdapter(); + MyActivityInfo info = (MyActivityInfo)adapter.getChild(groupPosition, childPosition); + LauncherIconCreator.launchActivity(getActivity(), info.component_name); + return false; + } + }); + return view; } -} + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + ExpandableListView list = (ExpandableListView) getView().findViewById(R.id.expandableListView1); + this.registerForContextMenu(list); + } + + @Override + public void onCreateContextMenu(ContextMenu menu, View v, + ContextMenuInfo menuInfo) { + menu.add(Menu.NONE, 0, Menu.NONE, R.string.context_action_shortcut); + menu.add(Menu.NONE, 1, Menu.NONE, R.string.context_action_launch); + super.onCreateContextMenu(menu, v, menuInfo); + } + + @Override + public boolean onContextItemSelected(MenuItem item) { + ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo)item.getMenuInfo(); + ExpandableListView list = (ExpandableListView) getView().findViewById(R.id.expandableListView1); + + switch(ExpandableListView.getPackedPositionType(info.packedPosition)) { + case ExpandableListView.PACKED_POSITION_TYPE_CHILD: + MyActivityInfo activity = (MyActivityInfo) list.getExpandableListAdapter().getChild(ExpandableListView.getPackedPositionGroup(info.packedPosition), ExpandableListView.getPackedPositionChild(info.packedPosition)); + switch(item.getItemId()) { + case 0: + LauncherIconCreator.createLauncherIcon(getActivity(), activity); + break; + case 1: + LauncherIconCreator.launchActivity(getActivity(), activity.component_name); + break; + } + break; + + case ExpandableListView.PACKED_POSITION_TYPE_GROUP: + MyPackageInfo pack = (MyPackageInfo) list.getExpandableListAdapter().getGroup(ExpandableListView.getPackedPositionGroup(info.packedPosition)); + switch(item.getItemId()) { + case 0: + LauncherIconCreator.createLauncherIcon(getActivity(), pack); + break; + case 1: + PackageManager pm = getActivity().getPackageManager(); + Intent intent = pm.getLaunchIntentForPackage(pack.package_name); + Toast.makeText(getActivity(), String.format(getText(R.string.starting_application).toString(), pack.name), Toast.LENGTH_LONG).show(); + getActivity().startActivity(intent); + break; + } + } + return super.onContextItemSelected(item); + } +} \ No newline at end of file diff --git a/src/de/szalkowski/activitylauncher/MainActivity.java b/src/de/szalkowski/activitylauncher/MainActivity.java index 7ae398e..203d4b5 100644 --- a/src/de/szalkowski/activitylauncher/MainActivity.java +++ b/src/de/szalkowski/activitylauncher/MainActivity.java @@ -7,7 +7,6 @@ import android.content.Context; import android.os.Build; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; -import android.util.Log; import android.widget.ArrayAdapter; public class MainActivity extends FragmentActivity implements diff --git a/src/de/szalkowski/activitylauncher/MyActivityInfo.java b/src/de/szalkowski/activitylauncher/MyActivityInfo.java index 07b1dd4..dbf9aff 100644 --- a/src/de/szalkowski/activitylauncher/MyActivityInfo.java +++ b/src/de/szalkowski/activitylauncher/MyActivityInfo.java @@ -8,7 +8,7 @@ import android.graphics.drawable.BitmapDrawable; public class MyActivityInfo { public MyActivityInfo(ComponentName activity, PackageManager pm) { - this.componentName = activity; + this.component_name = activity; ActivityInfo act; try { @@ -27,12 +27,14 @@ public class MyActivityInfo { this.icon_resource = 0; } - try { - this.icon_resource_name = pm.getResourcesForActivity(activity).getResourceName(this.icon_resource); - } catch (Exception e) {} + if(this.icon_resource != 0) { + try { + this.icon_resource_name = pm.getResourcesForActivity(activity).getResourceName(this.icon_resource); + } catch (Exception e) {} + } } - public ComponentName componentName; + public ComponentName component_name; public BitmapDrawable icon; public int icon_resource; public String icon_resource_name; diff --git a/src/de/szalkowski/activitylauncher/MyPackageInfo.java b/src/de/szalkowski/activitylauncher/MyPackageInfo.java index dfb4f1b..10bd21d 100644 --- a/src/de/szalkowski/activitylauncher/MyPackageInfo.java +++ b/src/de/szalkowski/activitylauncher/MyPackageInfo.java @@ -25,9 +25,11 @@ public class MyPackageInfo { this.icon_resource = 0; } - try { - this.icon_resource_name = pm.getResourcesForApplication(app).getResourceName(this.icon_resource); - } catch (Exception e) {} + if(this.icon_resource != 0) { + try { + this.icon_resource_name = pm.getResourcesForApplication(app).getResourceName(this.icon_resource); + } catch (Exception e) {} + } } public String package_name; diff --git a/src/de/szalkowski/activitylauncher/RecentTaskListFragment.java b/src/de/szalkowski/activitylauncher/RecentTaskListFragment.java index c02a33b..d20dbf1 100644 --- a/src/de/szalkowski/activitylauncher/RecentTaskListFragment.java +++ b/src/de/szalkowski/activitylauncher/RecentTaskListFragment.java @@ -8,7 +8,6 @@ import org.thirdparty.LauncherIconCreator; import android.app.ActivityManager; import android.content.ComponentName; import android.content.Context; -import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; import android.support.v4.app.ListFragment; @@ -26,7 +25,6 @@ import android.widget.ListView; import android.widget.TextView; public class RecentTaskListFragment extends ListFragment { - final private String LOG = "de.szalkowski.activitylauncher"; protected List activities; @Override @@ -66,9 +64,8 @@ public class RecentTaskListFragment extends ListFragment { @Override public void onListItemClick(ListView l, View v, int position, long id) { - ComponentName activity = RecentTaskListFragment.this.activities.get(position).componentName; - Intent intent = LauncherIconCreator.getActivityIntent(activity); - RecentTaskListFragment.this.getActivity().startActivity(intent); + ComponentName activity = RecentTaskListFragment.this.activities.get(position).component_name; + LauncherIconCreator.launchActivity(getActivity(), activity); } @Override @@ -89,8 +86,7 @@ public class RecentTaskListFragment extends ListFragment { LauncherIconCreator.createLauncherIcon(getActivity(), activity); break; case 1: - Intent intent = LauncherIconCreator.getActivityIntent(activity.componentName); - getActivity().startActivity(intent); + LauncherIconCreator.launchActivity(getActivity(), activity.component_name); break; } return super.onContextItemSelected(item); diff --git a/src/org/thirdparty/LauncherIconCreator.java b/src/org/thirdparty/LauncherIconCreator.java index 97b9711..5cdfc99 100644 --- a/src/org/thirdparty/LauncherIconCreator.java +++ b/src/org/thirdparty/LauncherIconCreator.java @@ -12,16 +12,16 @@ package org.thirdparty; import de.szalkowski.activitylauncher.MyActivityInfo; +import de.szalkowski.activitylauncher.MyPackageInfo; +import de.szalkowski.activitylauncher.R; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; -import android.util.Log; +import android.widget.Toast; public class LauncherIconCreator { - final static private String LOG = "de.szalkowski.thirdparty.launchericoncreator"; - public static Intent getActivityIntent(ComponentName activity) { Intent intent = new Intent(); intent.setComponent(activity); @@ -32,10 +32,17 @@ public class LauncherIconCreator { } public static void createLauncherIcon(Context context, MyActivityInfo activity) { - createLauncherIcon(context, activity.componentName, activity.name, activity.icon_resource_name); + createLauncherIcon(context, activity.component_name, activity.name, activity.icon_resource_name); + } + + public static void createLauncherIcon(Context context, MyPackageInfo pack) { + Intent intent = context.getPackageManager().getLaunchIntentForPackage(pack.package_name); + createLauncherIcon(context, intent, pack.name, pack.icon_resource_name); } public static void createLauncherIcon(Context context, ComponentName activity, String name, BitmapDrawable icon) { + Toast.makeText(context, String.format(context.getText(R.string.creating_activity_shortcut).toString(), activity.flattenToShortString()), Toast.LENGTH_LONG).show(); + Intent shortcutIntent = new Intent(); shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, getActivityIntent(activity)); shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name); @@ -45,7 +52,10 @@ public class LauncherIconCreator { context.sendBroadcast(shortcutIntent); //finish(); } + public static void createLauncherIcon(Context context, ComponentName activity, String name, String icon_resource_name) { + Toast.makeText(context, String.format(context.getText(R.string.creating_activity_shortcut).toString(), activity.flattenToShortString()), Toast.LENGTH_LONG).show(); + Intent shortcutIntent = new Intent(); shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, getActivityIntent(activity)); shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name); @@ -57,4 +67,31 @@ public class LauncherIconCreator { context.sendBroadcast(shortcutIntent); //finish(); } + + public static void createLauncherIcon(Context context, Intent intent, String name, String icon_resource_name) { + Toast.makeText(context, String.format(context.getText(R.string.creating_application_shortcut).toString(), name), Toast.LENGTH_LONG).show(); + + Intent shortcutIntent = new Intent(); + shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent); + shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name); + Intent.ShortcutIconResource ir = new Intent.ShortcutIconResource(); + ir.packageName = intent.getPackage(); + ir.resourceName = icon_resource_name; + shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, ir); + shortcutIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT"); + context.sendBroadcast(shortcutIntent); + //finish(); + } + + public static void launchActivity(Context context, ComponentName activity) { + Intent intent = LauncherIconCreator.getActivityIntent(activity); + Toast.makeText(context, String.format(context.getText(R.string.starting_activity).toString(), activity.flattenToShortString()), Toast.LENGTH_LONG).show(); + try { + context.startActivity(intent); + } + catch(Exception e) { + Toast.makeText(context, context.getText(R.string.error).toString() + ": " + e.toString(), Toast.LENGTH_LONG).show(); + } + + } }