diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2009-01-09 17:51:25 -0800 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-01-09 17:51:25 -0800 |
commit | 0e320b21ad4b8d6efa1c08cea64f3be4343517b4 (patch) | |
tree | 90c23d46dff460e034a6dab674e6990b6cc11cf1 | |
parent | d097a1880f2339705486d50cd8b33c6088fa9fa5 (diff) | |
download | packages_apps_trebuchet-0e320b21ad4b8d6efa1c08cea64f3be4343517b4.zip packages_apps_trebuchet-0e320b21ad4b8d6efa1c08cea64f3be4343517b4.tar.gz packages_apps_trebuchet-0e320b21ad4b8d6efa1c08cea64f3be4343517b4.tar.bz2 |
auto import from //branches/cupcake/...@125939
-rw-r--r-- | res/drawable/ic_menu_gallery.png | bin | 2379 -> 0 bytes | |||
-rw-r--r-- | res/drawable/ic_menu_notifications.png | bin | 1771 -> 0 bytes | |||
-rwxr-xr-x | res/drawable/ic_menu_preferences.png | bin | 2144 -> 0 bytes | |||
-rw-r--r-- | res/layout/widget_search.xml | 1 | ||||
-rw-r--r-- | res/values-fr/strings.xml | 46 | ||||
-rw-r--r-- | res/values-it/strings.xml | 46 | ||||
-rw-r--r-- | res/values-zh-rCN/strings.xml | 46 | ||||
-rw-r--r-- | src/com/android/launcher/HandleView.java | 2 | ||||
-rw-r--r-- | src/com/android/launcher/Launcher.java | 163 | ||||
-rw-r--r-- | src/com/android/launcher/LauncherModel.java | 26 |
10 files changed, 265 insertions, 65 deletions
diff --git a/res/drawable/ic_menu_gallery.png b/res/drawable/ic_menu_gallery.png Binary files differdeleted file mode 100644 index f61bbd8..0000000 --- a/res/drawable/ic_menu_gallery.png +++ /dev/null diff --git a/res/drawable/ic_menu_notifications.png b/res/drawable/ic_menu_notifications.png Binary files differdeleted file mode 100644 index 866d4e0..0000000 --- a/res/drawable/ic_menu_notifications.png +++ /dev/null diff --git a/res/drawable/ic_menu_preferences.png b/res/drawable/ic_menu_preferences.png Binary files differdeleted file mode 100755 index b8e7141..0000000 --- a/res/drawable/ic_menu_preferences.png +++ /dev/null diff --git a/res/layout/widget_search.xml b/res/layout/widget_search.xml index 4343e27..95e8052 100644 --- a/res/layout/widget_search.xml +++ b/res/layout/widget_search.xml @@ -36,6 +36,7 @@ android:singleLine="true" android:selectAllOnFocus="true" android:completionThreshold="1" + android:inputType="textAutoComplete|textSearchString" /> <ImageButton android:id="@+id/search_go_btn" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml new file mode 100644 index 0000000..eb217e9 --- /dev/null +++ b/res/values-fr/strings.xml @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="application_name">"Accueil"</string> + <string name="folder_name">"Dossier"</string> + <string name="chooser_wallpaper">"Sélectionner l\'arrière-plan à partir de"</string> + <string name="wallpaper_instructions">"Configurer l\'arrière-plan"</string> + <string name="pick_wallpaper">"Galerie des arrière-plans"</string> + <string name="activity_not_found">"L\'application n\'est pas installée sur votre téléphone."</string> + <!-- no translation found for rename_folder_label (5646236631298452787) --> + <skip /> + <string name="rename_folder_title">"Renommer le dossier"</string> + <string name="rename_action">"OK"</string> + <string name="cancel_action">"Annuler"</string> + <!-- no translation found for menu_item_add_item (6233177331075781114) --> + <skip /> + <string name="group_applications">"Application"</string> + <string name="group_shortcuts">"Raccourci"</string> + <!-- no translation found for group_live_folders (3057578584715591220) --> + <skip /> + <string name="group_widgets">"Widget"</string> + <string name="group_wallpapers">"Arrière-plan"</string> + <string name="add_folder">"Dossier"</string> + <string name="add_clock">"Horloge"</string> + <string name="add_photo_frame">"Cadre d\'image"</string> + <string name="add_search">"Rechercher"</string> + <string name="out_of_space">"Plus d\'espace libre sur l\'écran Accueil."</string> + <string name="menu_add">"Ajouter"</string> + <string name="menu_wallpaper">"Arrière-plan"</string> + <string name="menu_search">"Rechercher"</string> + <string name="menu_notifications">"Notifications"</string> + <string name="menu_settings">"Paramètres"</string> + <string name="permlab_install_shortcut">"installer des raccourcis"</string> + <string name="permdesc_install_shortcut">"Permet à une application d\'ajouter des raccourcis sans l\'intervention de l\'utilisateur."</string> + <string name="permlab_uninstall_shortcut">"désinstaller les raccourcis"</string> + <string name="permdesc_uninstall_shortcut">"Permet à une application de supprimer les raccourcis sans l\'intervention de l\'utilisateur."</string> + <!-- no translation found for permlab_read_settings (3452408290738106747) --> + <skip /> + <!-- no translation found for permdesc_read_settings (8377434937176025492) --> + <skip /> + <!-- no translation found for permlab_write_settings (1360567537236705628) --> + <skip /> + <!-- no translation found for permdesc_write_settings (1098648778383349818) --> + <skip /> + <string name="search_hint">"Recherche Google"</string> +</resources> diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml new file mode 100644 index 0000000..d94a156 --- /dev/null +++ b/res/values-it/strings.xml @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="application_name">"Home"</string> + <string name="folder_name">"Cartella"</string> + <string name="chooser_wallpaper">"Seleziona sfondo da"</string> + <string name="wallpaper_instructions">"Imposta sfondo"</string> + <string name="pick_wallpaper">"Galleria sfondi"</string> + <string name="activity_not_found">"Applicazione non installata sul telefono."</string> + <!-- no translation found for rename_folder_label (5646236631298452787) --> + <skip /> + <string name="rename_folder_title">"Rinomina cartella"</string> + <string name="rename_action">"OK"</string> + <string name="cancel_action">"Annulla"</string> + <!-- no translation found for menu_item_add_item (6233177331075781114) --> + <skip /> + <string name="group_applications">"Applicazione"</string> + <string name="group_shortcuts">"Collegamento"</string> + <!-- no translation found for group_live_folders (3057578584715591220) --> + <skip /> + <string name="group_widgets">"Widget"</string> + <string name="group_wallpapers">"Sfondo"</string> + <string name="add_folder">"Cartella"</string> + <string name="add_clock">"Orologio"</string> + <string name="add_photo_frame">"Cornice immagini"</string> + <string name="add_search">"Ricerca"</string> + <string name="out_of_space">"Spazio nella schermata Home esaurito."</string> + <string name="menu_add">"Aggiungi"</string> + <string name="menu_wallpaper">"Sfondo"</string> + <string name="menu_search">"Cerca"</string> + <string name="menu_notifications">"Notifiche"</string> + <string name="menu_settings">"Impostazioni"</string> + <string name="permlab_install_shortcut">"aggiungere collegamenti"</string> + <string name="permdesc_install_shortcut">"Consente a un\'applicazione di aggiungere collegamenti automaticamente."</string> + <string name="permlab_uninstall_shortcut">"eliminare collegamenti"</string> + <string name="permdesc_uninstall_shortcut">"Consente a un\'applicazione di rimuovere collegamenti automaticamente."</string> + <!-- no translation found for permlab_read_settings (3452408290738106747) --> + <skip /> + <!-- no translation found for permdesc_read_settings (8377434937176025492) --> + <skip /> + <!-- no translation found for permlab_write_settings (1360567537236705628) --> + <skip /> + <!-- no translation found for permdesc_write_settings (1098648778383349818) --> + <skip /> + <string name="search_hint">"Ricerca Google"</string> +</resources> diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml new file mode 100644 index 0000000..7657890 --- /dev/null +++ b/res/values-zh-rCN/strings.xml @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="application_name">"主页"</string> + <string name="folder_name">"文件夹"</string> + <string name="chooser_wallpaper">"选择壁纸"</string> + <string name="wallpaper_instructions">"设置壁纸"</string> + <string name="pick_wallpaper">"壁纸图库"</string> + <string name="activity_not_found">"您的手机上没有安装应用程序。"</string> + <!-- no translation found for rename_folder_label (5646236631298452787) --> + <skip /> + <string name="rename_folder_title">"重命名文件夹"</string> + <string name="rename_action">"确定"</string> + <string name="cancel_action">"取消"</string> + <!-- no translation found for menu_item_add_item (6233177331075781114) --> + <skip /> + <string name="group_applications">"应用程序"</string> + <string name="group_shortcuts">"快捷键"</string> + <!-- no translation found for group_live_folders (3057578584715591220) --> + <skip /> + <string name="group_widgets">"小工具"</string> + <string name="group_wallpapers">"壁纸"</string> + <string name="add_folder">"文件夹"</string> + <string name="add_clock">"时钟"</string> + <string name="add_photo_frame">"相框"</string> + <string name="add_search">"搜索"</string> + <string name="out_of_space">"该“主页”屏幕上没有多余空间。"</string> + <string name="menu_add">"添加"</string> + <string name="menu_wallpaper">"壁纸"</string> + <string name="menu_search">"搜索"</string> + <string name="menu_notifications">"通知"</string> + <string name="menu_settings">"设置"</string> + <string name="permlab_install_shortcut">"安装快捷键"</string> + <string name="permdesc_install_shortcut">"允许应用程序在没有用户介入的情况下添加快捷键。"</string> + <string name="permlab_uninstall_shortcut">"卸载快捷键"</string> + <string name="permdesc_uninstall_shortcut">"允许应用程序在没有用户介入的情况下删除快捷键。"</string> + <!-- no translation found for permlab_read_settings (3452408290738106747) --> + <skip /> + <!-- no translation found for permdesc_read_settings (8377434937176025492) --> + <skip /> + <!-- no translation found for permlab_write_settings (1360567537236705628) --> + <skip /> + <!-- no translation found for permdesc_write_settings (1098648778383349818) --> + <skip /> + <string name="search_hint">"Google 搜索"</string> +</resources> diff --git a/src/com/android/launcher/HandleView.java b/src/com/android/launcher/HandleView.java index 437d559..9afe41c 100644 --- a/src/com/android/launcher/HandleView.java +++ b/src/com/android/launcher/HandleView.java @@ -49,7 +49,7 @@ public class HandleView extends ImageView { @Override public View focusSearch(int direction) { View newFocus = super.focusSearch(direction); - if (newFocus == null) { + if (newFocus == null && mLauncher.isDrawerDown()) { final Workspace workspace = mLauncher.getWorkspace(); workspace.dispatchUnhandledMove(null, direction); return (mOrientation == ORIENTATION_HORIZONTAL && direction == FOCUS_DOWN) ? diff --git a/src/com/android/launcher/Launcher.java b/src/com/android/launcher/Launcher.java index 928f4ca..01001c0 100644 --- a/src/com/android/launcher/Launcher.java +++ b/src/com/android/launcher/Launcher.java @@ -45,6 +45,7 @@ import android.os.IBinder; import android.os.Parcelable; import android.os.RemoteException; import android.os.ServiceManager; +import android.os.Message; import android.provider.*; import android.telephony.PhoneNumberUtils; import android.text.Selection; @@ -260,7 +261,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On private void startLoaders() { sModel.loadApplications(true, this, mLocaleChanged); - sModel.loadUserItems(!mLocaleChanged, this, mLocaleChanged); + sModel.loadUserItems(!mLocaleChanged, this, mLocaleChanged, true); mRestoring = false; } @@ -812,13 +813,13 @@ public final class Launcher extends Activity implements View.OnClickListener, On .setIcon(android.R.drawable.ic_menu_add) .setAlphabeticShortcut('A'); menu.add(0, MENU_WALLPAPER_SETTINGS, 0, R.string.menu_wallpaper) - .setIcon(R.drawable.ic_menu_gallery) + .setIcon(android.R.drawable.ic_menu_gallery) .setAlphabeticShortcut('W'); menu.add(0, MENU_SEARCH, 0, R.string.menu_search) .setIcon(android.R.drawable.ic_search_category_default) .setAlphabeticShortcut(SearchManager.MENU_KEY); menu.add(0, MENU_NOTIFICATIONS, 0, R.string.menu_notifications) - .setIcon(R.drawable.ic_menu_notifications) + .setIcon(android.R.drawable.ic_menu_notifications) .setAlphabeticShortcut('N'); final Intent settings = new Intent(android.provider.Settings.ACTION_SETTINGS); @@ -826,7 +827,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); menu.add(0, MENU_SETTINGS, 0, R.string.menu_settings) - .setIcon(R.drawable.ic_menu_preferences).setAlphabeticShortcut('P') + .setIcon(android.R.drawable.ic_menu_preferences).setAlphabeticShortcut('P') .setIntent(settings); return true; @@ -1111,7 +1112,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On private void onFavoritesChanged() { mDesktopLocked = true; mDrawer.lock(); - sModel.loadUserItems(false, this, false); + sModel.loadUserItems(false, this, false, false); } void onDesktopItemsLoaded() { @@ -1119,7 +1120,80 @@ public final class Launcher extends Activity implements View.OnClickListener, On bindDesktopItems(); mAllAppsGrid.setAdapter(Launcher.getModel().getApplicationsAdapter()); + } + + /** + * Refreshes the shortcuts shown on the workspace. + */ + private void bindDesktopItems() { + final ArrayList<ItemInfo> shortcuts = sModel.getDesktopItems(); + if (shortcuts == null) { + return; + } + + final Workspace workspace = mWorkspace; + int count = workspace.getChildCount(); + for (int i = 0; i < count; i++) { + ((ViewGroup) workspace.getChildAt(i)).removeAllViewsInLayout(); + } + + count = shortcuts.size(); + + final DesktopItemsBinder binder = new DesktopItemsBinder(this, shortcuts); + binder.obtainMessage(DesktopItemsBinder.MESSAGE_BIND_ITEMS, 0, count).sendToTarget(); + } + private void bindItems(Launcher.DesktopItemsBinder binder, + ArrayList<ItemInfo> shortcuts, int start, int count) { + + final Workspace workspace = mWorkspace; + final boolean desktopLocked = mDesktopLocked; + + final int end = Math.min(start + DesktopItemsBinder.ITEMS_COUNT, count); + int i = start; + + for ( ; i < end; i++) { + final ItemInfo item = shortcuts.get(i); + switch (item.itemType) { + case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION: + case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT: + final View shortcut = createShortcut((ApplicationInfo) item); + workspace.addInScreen(shortcut, item.screen, item.cellX, item.cellY, 1, 1, + !desktopLocked); + break; + case LauncherSettings.Favorites.ITEM_TYPE_USER_FOLDER: + final FolderIcon newFolder = FolderIcon.fromXml(R.layout.folder_icon, this, + (ViewGroup) workspace.getChildAt(workspace.getCurrentScreen()), + (UserFolderInfo) item); + workspace.addInScreen(newFolder, item.screen, item.cellX, item.cellY, 1, 1, + !desktopLocked); + break; + case LauncherSettings.Favorites.ITEM_TYPE_LIVE_FOLDER: + final FolderIcon newLiveFolder = LiveFolderIcon.fromXml( + R.layout.live_folder_icon, this, + (ViewGroup) workspace.getChildAt(workspace.getCurrentScreen()), + (LiveFolderInfo) item); + workspace.addInScreen(newLiveFolder, item.screen, item.cellX, item.cellY, 1, 1, + !desktopLocked); + break; + default: + final Widget widget = (Widget) item; + final View view = createWidget(mInflater, widget); + view.setTag(widget); + workspace.addWidget(view, widget, !desktopLocked); + } + } + + workspace.requestLayout(); + + if (end >= count) { + finishBindDesktopItems(); + } else { + binder.obtainMessage(DesktopItemsBinder.MESSAGE_BIND_ITEMS, i, count).sendToTarget(); + } + } + + private void finishBindDesktopItems() { if (mSavedState != null) { mWorkspace.getChildAt(mWorkspace.getCurrentScreen()).requestFocus(); @@ -1152,57 +1226,6 @@ public final class Launcher extends Activity implements View.OnClickListener, On mDrawer.unlock(); } - /** - * Refreshes the shortcuts shown on the workspace. - */ - private void bindDesktopItems() { - final ArrayList<ItemInfo> shortcuts = sModel.getDesktopItems(); - if (shortcuts == null) { - return; - } - - final Workspace workspace = mWorkspace; - int count = workspace.getChildCount(); - for (int i = 0; i < count; i++) { - ((ViewGroup) workspace.getChildAt(i)).removeAllViewsInLayout(); - } - - count = shortcuts.size(); - for (int i = 0; i < count; i++) { - final ItemInfo item = shortcuts.get(i); - switch (item.itemType) { - case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION: - case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT: - final View shortcut = createShortcut((ApplicationInfo) item); - workspace.addInScreen(shortcut, item.screen, item.cellX, item.cellY, 1, 1, - !mDesktopLocked); - break; - case LauncherSettings.Favorites.ITEM_TYPE_USER_FOLDER: - final FolderIcon newFolder = FolderIcon.fromXml(R.layout.folder_icon, this, - (ViewGroup) mWorkspace.getChildAt(mWorkspace.getCurrentScreen()), - ((UserFolderInfo) item)); - workspace.addInScreen(newFolder, item.screen, item.cellX, item.cellY, 1, 1, - !mDesktopLocked); - break; - case LauncherSettings.Favorites.ITEM_TYPE_LIVE_FOLDER: - final FolderIcon newLiveFolder = LiveFolderIcon.fromXml( - R.layout.live_folder_icon, this, - (ViewGroup) mWorkspace.getChildAt(mWorkspace.getCurrentScreen()), - ((LiveFolderInfo) item)); - workspace.addInScreen(newLiveFolder, item.screen, item.cellX, item.cellY, 1, 1, - !mDesktopLocked); - break; - default: - final Widget widget = (Widget)item; - final View view = createWidget(mInflater, widget); - view.setTag(widget); - workspace.addWidget(view, widget, !mDesktopLocked); - } - } - - workspace.requestLayout(); - } - private View createWidget(LayoutInflater inflater, Widget widget) { final Workspace workspace = mWorkspace; final int screen = workspace.getCurrentScreen(); @@ -1456,7 +1479,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On if (mDesktopLocked) { mDrawer.lock(); - sModel.loadUserItems(false, Launcher.this, false); + sModel.loadUserItems(false, Launcher.this, false, false); } else { final FolderIcon folderIcon = (FolderIcon) mWorkspace.getViewForTag(mFolderInfo); @@ -1466,7 +1489,7 @@ public final class Launcher extends Activity implements View.OnClickListener, On } else { mDesktopLocked = true; mDrawer.lock(); - sModel.loadUserItems(false, Launcher.this, false); + sModel.loadUserItems(false, Launcher.this, false, false); } } } @@ -1635,4 +1658,28 @@ public final class Launcher extends Activity implements View.OnClickListener, On public void onScrollEnded() { } } + + private static class DesktopItemsBinder extends Handler { + static final int MESSAGE_BIND_ITEMS = 0x1; + // Number of items to bind in every pass + static final int ITEMS_COUNT = 6; + + private final ArrayList<ItemInfo> mShortcuts; + private final WeakReference<Launcher> mLauncher; + + DesktopItemsBinder(Launcher launcher, ArrayList<ItemInfo> shortcuts) { + mLauncher = new WeakReference<Launcher>(launcher); + mShortcuts = shortcuts; + } + + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case MESSAGE_BIND_ITEMS: + Launcher launcher = mLauncher.get(); + if (launcher != null) launcher.bindItems(this, mShortcuts, msg.arg1, msg.arg2); + break; + } + } + } } diff --git a/src/com/android/launcher/LauncherModel.java b/src/com/android/launcher/LauncherModel.java index 0ef2a80..314a502 100644 --- a/src/com/android/launcher/LauncherModel.java +++ b/src/com/android/launcher/LauncherModel.java @@ -28,9 +28,9 @@ import android.content.res.Resources; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.graphics.drawable.BitmapDrawable; import android.net.Uri; import android.util.Log; +import android.os.Process; import java.util.ArrayList; import java.util.Collections; @@ -45,7 +45,6 @@ import java.net.URISyntaxException; * Maintains in-memory state of the Launcher. It is expected that there should be only one * LauncherModel object held in a static. Also provide APIs for updating the database state * for the Launcher - * */ public class LauncherModel { private static final int UI_NOTIFICATION_RATE = 4; @@ -104,6 +103,13 @@ public class LauncherModel { } mApplicationsLoaded = false; + + if (!isLaunching) { + startApplicationsLoader(launcher); + } + } + + private void startApplicationsLoader(Launcher launcher) { mApplicationsLoader = new ApplicationsLoader(launcher); mLoader = new Thread(mApplicationsLoader, "Applications Loader"); mLoader.start(); @@ -130,6 +136,8 @@ public class LauncherModel { public void run() { mRunning = true; + android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); + Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); @@ -221,8 +229,11 @@ public class LauncherModel { * Loads all of the items on the desktop, in folders, or in the dock. * These can be apps, shortcuts or widgets */ - void loadUserItems(boolean isLaunching, Launcher launcher, boolean localeChanged) { + void loadUserItems(boolean isLaunching, Launcher launcher, boolean localeChanged, + boolean loadApplications) { + if (isLaunching && mDesktopItems != null && mDesktopItemsLoaded) { + if (loadApplications) startApplicationsLoader(launcher); // We have already loaded our data from the DB launcher.onDesktopItemsLoaded(); return; @@ -240,7 +251,7 @@ public class LauncherModel { } mDesktopItemsLoaded = false; - mDesktopItemsLoader = new DesktopItemsLoader(launcher, localeChanged); + mDesktopItemsLoader = new DesktopItemsLoader(launcher, localeChanged, loadApplications); mDesktopLoader = new Thread(mDesktopItemsLoader, "Desktop Items Loader"); mDesktopLoader.start(); } @@ -317,9 +328,11 @@ public class LauncherModel { private volatile boolean mRunning; private final WeakReference<Launcher> mLauncher; - private boolean mLocaleChanged; + private final boolean mLocaleChanged; + private final boolean mLoadApplications; - DesktopItemsLoader(Launcher launcher, boolean localeChanged) { + DesktopItemsLoader(Launcher launcher, boolean localeChanged, boolean loadApplications) { + mLoadApplications = loadApplications; mLauncher = new WeakReference<Launcher>(launcher); mLocaleChanged = localeChanged; } @@ -532,6 +545,7 @@ public class LauncherModel { launcher.onDesktopItemsLoaded(); } }); + if (mLoadApplications) startApplicationsLoader(launcher); } if (!mStopped) { |