summaryrefslogtreecommitdiffstats
path: root/src/net/hoopajoo/android/SoftKeys/RecentAppsChunk.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/hoopajoo/android/SoftKeys/RecentAppsChunk.java')
-rw-r--r--src/net/hoopajoo/android/SoftKeys/RecentAppsChunk.java166
1 files changed, 166 insertions, 0 deletions
diff --git a/src/net/hoopajoo/android/SoftKeys/RecentAppsChunk.java b/src/net/hoopajoo/android/SoftKeys/RecentAppsChunk.java
new file mode 100644
index 0000000..3937f82
--- /dev/null
+++ b/src/net/hoopajoo/android/SoftKeys/RecentAppsChunk.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package net.hoopajoo.android.SoftKeys;
+
+import java.util.List;
+
+import android.app.Activity;
+import android.app.ActivityManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.TextView;
+
+public class RecentAppsChunk {
+ /// for recent apps
+ //private static final boolean DBG_FORCE_EMPTY_LIST = false;
+ private static final int NUM_BUTTONS = 6;
+ private static final int MAX_RECENT_TASKS = NUM_BUTTONS * 2; // allow for some discards
+ final View[] mButtons = new View[NUM_BUTTONS];
+ private int mIconSize;
+ private Activity context;
+
+ public RecentAppsChunk( Activity a ) {
+ context = a;
+
+ // recent apps buttons
+ OnClickListener press = new OnClickListener() {
+ public void onClick(View v) {
+
+ for (View b : mButtons) {
+ if (b == v) {
+ // prepare a launch intent and send it
+ Intent intent = (Intent)b.getTag();
+ intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
+ getContext().startActivity(intent);
+ }
+ }
+ //dismiss();
+ }
+ };
+
+ int[] rbuttons = { R.id.recentbutton0,
+ R.id.recentbutton1,
+ R.id.recentbutton2,
+ R.id.recentbutton3,
+ R.id.recentbutton4,
+ R.id.recentbutton5
+ };
+
+ for( int i = 0; i < NUM_BUTTONS; i++ ) {
+ mButtons[ i ] = context.findViewById( rbuttons[ i ] );
+ mButtons[ i ].setOnClickListener( press );
+ }
+
+ final Resources resources = context.getResources();
+ mIconSize = (int) resources.getDimension(android.R.dimen.app_icon_size);
+ }
+
+
+ // basically from the recent apps dialog
+ private Context getContext() {
+ // this emulates some of the stuff that happened in the constructor, and also
+ // the getcontext allowing reloadButtons to be included without modification`
+ return( context );
+ }
+
+ public void reloadButtons() {
+
+ final Context context = getContext();
+ final PackageManager pm = context.getPackageManager();
+ final ActivityManager am = (ActivityManager)
+ context.getSystemService(Context.ACTIVITY_SERVICE);
+ final List<ActivityManager.RecentTaskInfo> recentTasks =
+ am.getRecentTasks(MAX_RECENT_TASKS, 0);
+
+ ResolveInfo homeInfo = pm.resolveActivity(
+ new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME),
+ 0);
+
+ // Performance note: Our android performance guide says to prefer Iterator when
+ // using a List class, but because we know that getRecentTasks() always returns
+ // an ArrayList<>, we'll use a simple index instead.
+ int button = 0;
+ int numTasks = recentTasks.size();
+ for (int i = 0; i < numTasks && (button < NUM_BUTTONS); ++i) {
+ final ActivityManager.RecentTaskInfo info = recentTasks.get(i);
+
+ // for debug purposes only, disallow first result to create empty lists
+ //if (DBG_FORCE_EMPTY_LIST && (i == 0)) continue;
+
+ Intent intent = new Intent(info.baseIntent);
+ if (info.origActivity != null) {
+ intent.setComponent(info.origActivity);
+ }
+
+ // Skip the current home activity.
+ if (homeInfo != null) {
+ if (homeInfo.activityInfo.packageName.equals(
+ intent.getComponent().getPackageName())
+ && homeInfo.activityInfo.name.equals(
+ intent.getComponent().getClassName())) {
+ continue;
+ }
+ }
+
+ intent.setFlags((intent.getFlags()&~Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)
+ | Intent.FLAG_ACTIVITY_NEW_TASK);
+ final ResolveInfo resolveInfo = pm.resolveActivity(intent, 0);
+ if (resolveInfo != null) {
+ final ActivityInfo activityInfo = resolveInfo.activityInfo;
+ final String title = activityInfo.loadLabel(pm).toString();
+ final Drawable icon = activityInfo.loadIcon(pm);
+
+ if (title != null && title.length() > 0 && icon != null) {
+ final View b = mButtons[button];
+ setButtonAppearance(b, title, icon);
+ b.setTag(intent);
+ b.setVisibility(View.VISIBLE);
+ b.setPressed(false);
+ b.clearFocus();
+ ++button;
+ }
+ }
+ }
+
+ // handle the case of "no icons to show"
+ //mNoAppsText.setVisibility((button == 0) ? View.VISIBLE : View.GONE);
+
+ // hide the rest
+ for ( ; button < NUM_BUTTONS; ++button) {
+ mButtons[button].setVisibility(View.GONE);
+ }
+ }
+
+ /**
+ * Adjust appearance of each icon-button
+ */
+ private void setButtonAppearance(View theButton, final String theTitle, final Drawable icon) {
+ TextView tv = (TextView) theButton;
+ tv.setText(theTitle);
+ if (icon != null) {
+ icon.setBounds(0, 0, mIconSize, mIconSize);
+ }
+ tv.setCompoundDrawables(null, icon, null, null);
+ }
+}