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:
@@ -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"
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user