반응형
1. Shortcuts 이란?
Shortcuts의 종류는 두가지가 있다.
- Static Shortcuts : 정적 숏컷, xml 형식으로 변동이 없는 데이터를 Shortcuts에 저장하여 사용할 때 사용한다.
- Dynamic Shortcuts : 동적 숏컷, 코드 형식으로 변동이 있는 데이터를 Shortcuts에 저장하여 사용할 때 사용한다.
두 숏컷 사이에는 차이점이 있다. Static shortcuts은 xml형식으로 저장하여 데이터의 변동이 없이 숏컷에 한번 코드로 등록하면 고정적으로 사용할 때 사용한다. 반면 Dynamic shortcuts은 채팅이나, 업데이트 사항이 반영되어야 하는 상황에서 숏컷의 클릭시 이동경로나, 숏컷의 순서를 업데이트 적용하기 위해 사용한다.
2. Code
코드를 세가지 용도에 따라 분류하였다
"나와의 채팅"
카카오의 숏컷을 보고 따라 만들었으며 첫번째 "나와의 채팅"은 숏컷이 변동되지 않고 고정적이다.
public static void addDynamicShortCutsAlone(Context context){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
ShortcutManager shortcutManager = context.getSystemService(ShortcutManager.class);
Intent intent = new Intent(context, MainActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.putExtra("shortcutAlone", "Alone");
intent.putExtra("shortcutName", "shortcut");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
ShortcutInfo shortcut = new ShortcutInfo.Builder(context, "first")
.setIntent(intent)
.setRank(1)
.setLongLabel(context.getString(R.string.chat_with_me))
.setShortLabel(context.getString(R.string.chat_with_me))
.setDisabledMessage(context.getString(R.string.shortcuts_are_not_available))
.setIcon(Icon.createWithResource(context, R.drawable.shortcuts_profile_alone))
.build();
shortcutlist.add(shortcut);
shortcutManager.setDynamicShortcuts(shortcutlist);
}
}
}
"나머지 3개의 숏컷"
나머지 3개의 숏컷은 메서드가 동작되는 순서에 따라 순차대로 업데이트 되게 설계되었다.
if문으로 iconFile로 나눈 이유는 해당 아이콘이 없을시 기본아이콘으로 사용하기 위함이다.
여기서 주의할점은 순서에 맞춰 숏컷을 너어야 한다는 것에 주의하자
해당 코드는 for문을 통하여 로직을 설계하면 된다.
public static void addDynamicShortCuts(Context context, ChatMstVO chatMstVO){
try{
String roomkey = chatMstVO.getChatRoomKey();
String entryName = getEntryName(chatMstVO);
File iconFile = CmmAndUtil.cashIcon(roomkey, context);
if(iconFile != null){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
Bitmap bitmap = BitmapFactory.decodeFile(iconFile.getPath());
ShortcutManager shortcutManager = context.getSystemService(ShortcutManager.class);
Intent intent = new Intent(context, MainActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.putExtra("shortcutRoomkey", roomkey);
intent.putExtra("shortcutName", "shortcut");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
ShortcutInfo shortcut = new ShortcutInfo.Builder(context, roomkey)
.setIntent(intent)
.setLongLabel(entryName)
.setShortLabel(entryName)
.setDisabledMessage(context.getString(R.string.shortcuts_are_not_available))
.setIcon(Icon.createWithBitmap(bitmap))
.build();
shortcutlist.add(shortcut);
shortcutManager.setDynamicShortcuts(shortcutlist);
}
}
}else{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
ShortcutManager shortcutManager = context.getSystemService(ShortcutManager.class);
Intent intent = new Intent(context, MainActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.putExtra("shortcutRoomkey", roomkey);
intent.putExtra("shortcutName", "shortcut");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
ShortcutInfo shortcut = new ShortcutInfo.Builder(context, roomkey)
.setIntent(intent)
.setLongLabel(entryName)
.setShortLabel(entryName)
.setDisabledMessage(context.getString(R.string.shortcuts_are_not_available))
.setIcon(Icon.createWithResource(context, R.drawable.ic_contact_picture))
.build();
shortcutlist.add(shortcut);
shortcutManager.setDynamicShortcuts(shortcutlist);
}
}
}
}catch (Exception e){
Log.d(TAG, "addDynamicShortCuts: " + e);
}
}
"특별한 로직에 의해 업데이트 되는 숏컷"
특정한 방법에 의해 숏컷이 업데이트될 수 있도록 설계하였다.
public static void addDynamicShortCutsForChatView(Context context, ChatMstVO chatMstVO){
try{
String roomkey = chatMstVO.getChatRoomKey();
String entryName = getEntryName(chatMstVO);
File iconFile = CmmAndUtil.cashIcon(roomkey, context);
if( iconFile != null ){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
Bitmap bitmap = BitmapFactory.decodeFile(iconFile.getPath());
ShortcutManager shortcutManager = context.getSystemService(ShortcutManager.class);
Intent intent = new Intent(context, MainActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.putExtra("shortcutRoomkey", roomkey);
intent.putExtra("shortcutName", "shortcut");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
ShortcutInfo shortcut = new ShortcutInfo.Builder(context, roomkey)
.setIntent(intent)
.setLongLabel(entryName)
.setShortLabel(entryName)
.setDisabledMessage(context.getString(R.string.shortcuts_are_not_available))
.setIcon(Icon.createWithBitmap(bitmap))
.build();
if(ChatListFragment.getShortcutlist().size()>=1){
ChatListFragment.getShortcutlist().add(1, shortcut);
if(ChatListFragment.getShortcutlist().size() == 6){
ChatListFragment.getShortcutlist().remove(5);
}
shortcutManager.setDynamicShortcuts(ChatListFragment.getShortcutlist());
}
}
}
}else{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
ShortcutManager shortcutManager = context.getSystemService(ShortcutManager.class);
Intent intent = new Intent(context, MainActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.putExtra("shortcutRoomkey", roomkey);
intent.putExtra("shortcutName", "shortcut");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
ShortcutInfo shortcut = new ShortcutInfo.Builder(context, roomkey)
.setIntent(intent)
.setLongLabel(entryName)
.setShortLabel(entryName)
.setDisabledMessage(context.getString(R.string.shortcuts_are_not_available))
.setIcon(Icon.createWithResource(context, R.drawable.ic_contact_picture))
.build();
if(ChatListFragment.getShortcutlist().size()>=1){
ChatListFragment.getShortcutlist().add(1, shortcut);
if(ChatListFragment.getShortcutlist().size() == 6){
ChatListFragment.getShortcutlist().remove(5);
}
shortcutManager.setDynamicShortcuts(ChatListFragment.getShortcutlist());
}
}
}
}
}catch (Exception e){
Log.d(TAG, "addDynamicShortCutsForChatView: " + e);
}
}
Preference
https://developer.android.com/guide/topics/ui/shortcuts/creating-shortcuts?hl=ko
https://www.boltuix.com/2022/09/how-to-create-app-shortcuts-in-android.html
반응형
'Android > Android Java' 카테고리의 다른 글
[Android Java] Notification (0) | 2023.11.09 |
---|---|
[Android Java] Clipboard 사용하기 (0) | 2023.11.03 |
[Android Java] File.mkdir()과 File.mkdirs()의 차이 (0) | 2023.11.03 |
[Android Java] File 삭제, Cache 삭제 (1) | 2023.11.03 |
[Android Java] Bitmap을 PNG 파일로 Cash 저장하기 (0) | 2023.11.02 |