Merge "Keyboard shortcuts: icons for application group" into nyc-dev

am: 2b2b7ed

* commit '2b2b7ed8118320b7b699e2bc48cb5beb8e5f9067':
  Keyboard shortcuts: icons for application group

Change-Id: I51c9568d4404b1977f24ec75427a096f9574e12b
This commit is contained in:
Andrei Stingaceanu
2016-04-08 10:21:55 +00:00
committed by android-build-merger
2 changed files with 196 additions and 65 deletions

View File

@@ -22,8 +22,17 @@
android:paddingStart="24dp" android:paddingStart="24dp"
android:paddingEnd="24dp" android:paddingEnd="24dp"
android:paddingBottom="8dp"> android:paddingBottom="8dp">
<ImageView
android:id="@+id/keyboard_shortcuts_icon"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginEnd="32dp"
android:layout_gravity="center_vertical"
android:visibility="gone"
android:layout_alignParentStart="true"/>
<TextView <TextView
android:id="@+id/keyboard_shortcuts_keyword" android:id="@+id/keyboard_shortcuts_keyword"
android:layout_toEndOf="@+id/keyboard_shortcuts_icon"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingEnd="12dp" android:paddingEnd="12dp"

View File

@@ -17,16 +17,24 @@
package com.android.systemui.statusbar; package com.android.systemui.statusbar;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.AppGlobals;
import android.app.Dialog; import android.app.Dialog;
import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener; import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.pm.IPackageManager;
import android.content.pm.PackageInfo;
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Icon;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.hardware.input.InputManager; import android.hardware.input.InputManager;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.os.RemoteException;
import android.util.Log; import android.util.Log;
import android.util.SparseArray; import android.util.SparseArray;
import android.view.ContextThemeWrapper; import android.view.ContextThemeWrapper;
@@ -42,8 +50,10 @@ import android.view.Window;
import android.view.WindowManager.KeyboardShortcutsReceiver; import android.view.WindowManager.KeyboardShortcutsReceiver;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView; import android.widget.TextView;
import com.android.internal.app.AssistUtils;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.recents.Recents; import com.android.systemui.recents.Recents;
@@ -58,7 +68,6 @@ import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG;
*/ */
public final class KeyboardShortcuts { public final class KeyboardShortcuts {
private static final String TAG = KeyboardShortcuts.class.getSimpleName(); private static final String TAG = KeyboardShortcuts.class.getSimpleName();
private final SparseArray<String> mSpecialCharacterNames = new SparseArray<>(); private final SparseArray<String> mSpecialCharacterNames = new SparseArray<>();
private final SparseArray<String> mModifierNames = new SparseArray<>(); private final SparseArray<String> mModifierNames = new SparseArray<>();
private final SparseArray<Drawable> mSpecialCharacterDrawables = new SparseArray<>(); private final SparseArray<Drawable> mSpecialCharacterDrawables = new SparseArray<>();
@@ -66,6 +75,7 @@ public final class KeyboardShortcuts {
private final Handler mHandler = new Handler(Looper.getMainLooper()); private final Handler mHandler = new Handler(Looper.getMainLooper());
private final Context mContext; private final Context mContext;
private final IPackageManager mPackageManager;
private final OnClickListener dialogCloseListener = new DialogInterface.OnClickListener() { private final OnClickListener dialogCloseListener = new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) { public void onClick(DialogInterface dialog, int id) {
dismissKeyboardShortcutsDialog(); dismissKeyboardShortcutsDialog();
@@ -77,6 +87,7 @@ public final class KeyboardShortcuts {
public KeyboardShortcuts(Context context) { public KeyboardShortcuts(Context context) {
this.mContext = new ContextThemeWrapper(context, android.R.style.Theme_Material_Light); this.mContext = new ContextThemeWrapper(context, android.R.style.Theme_Material_Light);
this.mPackageManager = AppGlobals.getPackageManager();
loadResources(context); loadResources(context);
} }
@@ -254,68 +265,11 @@ public final class KeyboardShortcuts {
@Override @Override
public void onKeyboardShortcutsReceived( public void onKeyboardShortcutsReceived(
final List<KeyboardShortcutGroup> result) { final List<KeyboardShortcutGroup> result) {
KeyboardShortcutGroup systemGroup = new KeyboardShortcutGroup( result.add(getSystemShortcuts());
mContext.getString(R.string.keyboard_shortcut_group_system), true); final KeyboardShortcutGroup appShortcuts = getDefaultApplicationShortcuts();
systemGroup.addItem(new KeyboardShortcutInfo( if (appShortcuts != null) {
mContext.getString(R.string.keyboard_shortcut_group_system_home), result.add(appShortcuts);
KeyEvent.KEYCODE_ENTER, KeyEvent.META_META_ON)); }
systemGroup.addItem(new KeyboardShortcutInfo(
mContext.getString(R.string.keyboard_shortcut_group_system_back),
KeyEvent.KEYCODE_DEL, KeyEvent.META_META_ON));
systemGroup.addItem(new KeyboardShortcutInfo(
mContext.getString(R.string.keyboard_shortcut_group_system_recents),
KeyEvent.KEYCODE_TAB, KeyEvent.META_ALT_ON));
systemGroup.addItem(new KeyboardShortcutInfo(
mContext.getString(
R.string.keyboard_shortcut_group_system_notifications),
KeyEvent.KEYCODE_N, KeyEvent.META_META_ON));
systemGroup.addItem(new KeyboardShortcutInfo(
mContext.getString(
R.string.keyboard_shortcut_group_system_shortcuts_helper),
KeyEvent.KEYCODE_SLASH, KeyEvent.META_META_ON));
systemGroup.addItem(new KeyboardShortcutInfo(
mContext.getString(
R.string.keyboard_shortcut_group_system_switch_input),
KeyEvent.KEYCODE_SPACE, KeyEvent.META_META_ON));
result.add(systemGroup);
KeyboardShortcutGroup applicationGroup = new KeyboardShortcutGroup(
mContext.getString(R.string.keyboard_shortcut_group_applications),
true);
applicationGroup.addItem(new KeyboardShortcutInfo(
mContext.getString(
R.string.keyboard_shortcut_group_applications_assist),
KeyEvent.KEYCODE_UNKNOWN, KeyEvent.META_META_ON));
applicationGroup.addItem(new KeyboardShortcutInfo(
mContext.getString(
R.string.keyboard_shortcut_group_applications_browser),
KeyEvent.KEYCODE_B, KeyEvent.META_META_ON));
applicationGroup.addItem(new KeyboardShortcutInfo(
mContext.getString(
R.string.keyboard_shortcut_group_applications_contacts),
KeyEvent.KEYCODE_C, KeyEvent.META_META_ON));
applicationGroup.addItem(new KeyboardShortcutInfo(
mContext.getString(
R.string.keyboard_shortcut_group_applications_email),
KeyEvent.KEYCODE_E, KeyEvent.META_META_ON));
applicationGroup.addItem(new KeyboardShortcutInfo(
mContext.getString(
R.string.keyboard_shortcut_group_applications_im),
KeyEvent.KEYCODE_T, KeyEvent.META_META_ON));
applicationGroup.addItem(new KeyboardShortcutInfo(
mContext.getString(
R.string.keyboard_shortcut_group_applications_music),
KeyEvent.KEYCODE_P, KeyEvent.META_META_ON));
applicationGroup.addItem(new KeyboardShortcutInfo(
mContext.getString(
R.string.keyboard_shortcut_group_applications_youtube),
KeyEvent.KEYCODE_Y, KeyEvent.META_META_ON));
applicationGroup.addItem(new KeyboardShortcutInfo(
mContext.getString(
R.string.keyboard_shortcut_group_applications_calendar),
KeyEvent.KEYCODE_L, KeyEvent.META_META_ON));
result.add(applicationGroup);
showKeyboardShortcutsDialog(result); showKeyboardShortcutsDialog(result);
} }
}, deviceId); }, deviceId);
@@ -331,6 +285,160 @@ public final class KeyboardShortcuts {
} }
} }
private KeyboardShortcutGroup getSystemShortcuts() {
final KeyboardShortcutGroup systemGroup = new KeyboardShortcutGroup(
mContext.getString(R.string.keyboard_shortcut_group_system), true);
systemGroup.addItem(new KeyboardShortcutInfo(
mContext.getString(R.string.keyboard_shortcut_group_system_home),
KeyEvent.KEYCODE_ENTER,
KeyEvent.META_META_ON));
systemGroup.addItem(new KeyboardShortcutInfo(
mContext.getString(R.string.keyboard_shortcut_group_system_back),
KeyEvent.KEYCODE_DEL,
KeyEvent.META_META_ON));
systemGroup.addItem(new KeyboardShortcutInfo(
mContext.getString(R.string.keyboard_shortcut_group_system_recents),
KeyEvent.KEYCODE_TAB,
KeyEvent.META_ALT_ON));
systemGroup.addItem(new KeyboardShortcutInfo(
mContext.getString(
R.string.keyboard_shortcut_group_system_notifications),
KeyEvent.KEYCODE_N,
KeyEvent.META_META_ON));
systemGroup.addItem(new KeyboardShortcutInfo(
mContext.getString(
R.string.keyboard_shortcut_group_system_shortcuts_helper),
KeyEvent.KEYCODE_SLASH,
KeyEvent.META_META_ON));
systemGroup.addItem(new KeyboardShortcutInfo(
mContext.getString(
R.string.keyboard_shortcut_group_system_switch_input),
KeyEvent.KEYCODE_SPACE,
KeyEvent.META_META_ON));
return systemGroup;
}
private KeyboardShortcutGroup getDefaultApplicationShortcuts() {
final int userId = mContext.getUserId();
final KeyboardShortcutGroup applicationGroup = new KeyboardShortcutGroup(
mContext.getString(R.string.keyboard_shortcut_group_applications),
true);
// Assist.
final AssistUtils assistUtils = new AssistUtils(mContext);
final ComponentName assistComponent = assistUtils.getAssistComponentForUser(userId);
PackageInfo assistPackageInfo = null;
try {
assistPackageInfo = mPackageManager.getPackageInfo(
assistComponent.getPackageName(), 0, userId);
} catch (RemoteException e) {
Log.e(TAG, "PackageManagerService is dead");
}
if (assistPackageInfo != null) {
final Icon assistIcon = Icon.createWithResource(
assistPackageInfo.applicationInfo.packageName,
assistPackageInfo.applicationInfo.icon);
applicationGroup.addItem(new KeyboardShortcutInfo(
mContext.getString(R.string.keyboard_shortcut_group_applications_assist),
assistIcon,
KeyEvent.KEYCODE_UNKNOWN,
KeyEvent.META_META_ON));
}
// Browser.
final Icon browserIcon = getIconForIntentCategory(Intent.CATEGORY_APP_BROWSER, userId);
if (browserIcon != null) {
applicationGroup.addItem(new KeyboardShortcutInfo(
mContext.getString(R.string.keyboard_shortcut_group_applications_browser),
browserIcon,
KeyEvent.KEYCODE_B,
KeyEvent.META_META_ON));
}
// Contacts.
final Icon contactsIcon = getIconForIntentCategory(Intent.CATEGORY_APP_CONTACTS, userId);
if (contactsIcon != null) {
applicationGroup.addItem(new KeyboardShortcutInfo(
mContext.getString(R.string.keyboard_shortcut_group_applications_contacts),
contactsIcon,
KeyEvent.KEYCODE_C,
KeyEvent.META_META_ON));
}
// Email.
final Icon emailIcon = getIconForIntentCategory(Intent.CATEGORY_APP_EMAIL, userId);
if (emailIcon != null) {
applicationGroup.addItem(new KeyboardShortcutInfo(
mContext.getString(R.string.keyboard_shortcut_group_applications_email),
emailIcon,
KeyEvent.KEYCODE_E,
KeyEvent.META_META_ON));
}
// Messaging.
final Icon messagingIcon = getIconForIntentCategory(Intent.CATEGORY_APP_MESSAGING, userId);
if (messagingIcon != null) {
applicationGroup.addItem(new KeyboardShortcutInfo(
mContext.getString(R.string.keyboard_shortcut_group_applications_im),
messagingIcon,
KeyEvent.KEYCODE_T,
KeyEvent.META_META_ON));
}
// Music.
final Icon musicIcon = getIconForIntentCategory(Intent.CATEGORY_APP_MUSIC, userId);
if (musicIcon != null) {
applicationGroup.addItem(new KeyboardShortcutInfo(
mContext.getString(R.string.keyboard_shortcut_group_applications_music),
musicIcon,
KeyEvent.KEYCODE_P,
KeyEvent.META_META_ON));
}
// Calendar.
final Icon calendarIcon = getIconForIntentCategory(Intent.CATEGORY_APP_CALENDAR, userId);
if (calendarIcon != null) {
applicationGroup.addItem(new KeyboardShortcutInfo(
mContext.getString(R.string.keyboard_shortcut_group_applications_calendar),
calendarIcon,
KeyEvent.KEYCODE_L,
KeyEvent.META_META_ON));
}
return applicationGroup.getItems().size() == 0 ? null : applicationGroup;
}
private Icon getIconForIntentCategory(String intentCategory, int userId) {
final Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(intentCategory);
final PackageInfo packageInfo = getPackageInfoForIntent(intent, userId);
if (packageInfo != null && packageInfo.applicationInfo.icon != 0) {
return Icon.createWithResource(
packageInfo.applicationInfo.packageName,
packageInfo.applicationInfo.icon);
}
return null;
}
private PackageInfo getPackageInfoForIntent(Intent intent, int userId) {
try {
ResolveInfo handler;
handler = mPackageManager.resolveIntent(
intent, intent.resolveTypeIfNeeded(mContext.getContentResolver()), 0, userId);
if (handler == null || handler.activityInfo == null) {
return null;
}
return mPackageManager.getPackageInfo(handler.activityInfo.packageName, 0, userId);
} catch (RemoteException e) {
Log.e(TAG, "PackageManagerService is dead", e);
return null;
}
}
private void showKeyboardShortcutsDialog( private void showKeyboardShortcutsDialog(
final List<KeyboardShortcutGroup> keyboardShortcutGroups) { final List<KeyboardShortcutGroup> keyboardShortcutGroups) {
// Need to post on the main thread. // Need to post on the main thread.
@@ -394,9 +502,23 @@ public final class KeyboardShortcuts {
} }
View shortcutView = inflater.inflate(R.layout.keyboard_shortcut_app_item, View shortcutView = inflater.inflate(R.layout.keyboard_shortcut_app_item,
shortcutContainer, false); shortcutContainer, false);
TextView textView = (TextView) shortcutView
if (info.getIcon() != null) {
ImageView shortcutIcon = (ImageView) shortcutView
.findViewById(R.id.keyboard_shortcuts_icon);
shortcutIcon.setImageIcon(info.getIcon());
shortcutIcon.setVisibility(View.VISIBLE);
}
TextView shortcutKeyword = (TextView) shortcutView
.findViewById(R.id.keyboard_shortcuts_keyword); .findViewById(R.id.keyboard_shortcuts_keyword);
textView.setText(info.getLabel()); shortcutKeyword.setText(info.getLabel());
if (info.getIcon() != null) {
RelativeLayout.LayoutParams lp =
(RelativeLayout.LayoutParams) shortcutKeyword.getLayoutParams();
lp.removeRule(RelativeLayout.ALIGN_PARENT_START);
shortcutKeyword.setLayoutParams(lp);
}
ViewGroup shortcutItemsContainer = (ViewGroup) shortcutView ViewGroup shortcutItemsContainer = (ViewGroup) shortcutView
.findViewById(R.id.keyboard_shortcuts_item_container); .findViewById(R.id.keyboard_shortcuts_item_container);