Commit Graph

40 Commits

Author SHA1 Message Date
Steven Ng 074f83205d Filter out potential null widget item from recommended widgets
There is a likely a race condition which the recommended widgets
contain widget that have not been added to mAllWidgets. Instead
of introducing a lock mechanism, let's simply filter null widgets.

Test: manual

Bug: 183619699
Change-Id: Ia82778b8ac8c42265bdf6838e059f81022a0d4ef
2021-03-25 17:01:13 +00:00
Steven Ng 3a8353256a Widgets recommendation backend
Add a widgets recommendation mechanism based on AiAI app predication
ranking with the following changes:

1. Only one widget is picked from one app.
2. Widgets that are already added to the workspace are excluded from
   the recommendation.

Test: run PredicationUpdateTaskTest

Bug: 179797520
Change-Id: Ia697bc6df0bae75969e68b7b3de32d57901f7461
2021-03-08 23:37:51 +00:00
Steven Ng 2f5648a911 Refactoring before adding a new view type in the WidgetsListAdapter
Changes made:
1. Model: added an abstract class for storing common information for
   entries shown in the full page widgets picker.
2. Introduced a ViewHolderBinder interface to split the logic of binding
   data to ViewHolder into separate classes.
3. Move the view holder binding of WidgetsListRow from WidgetListAdapter
   to its new class.
4. Move some widgets picker classes into a new picker package.

Test: Auto: Run WidgetsListAdapterTest, WidgetsListRowEntryTest and
      WidgetsListRowViewHolderBinderTest.
      Manual: open the all apps widgets tray and navigate the list.

Bug: 179797520
Change-Id: Iab29557842bb79156cad84d00a4c5d0db0c5aa06
2021-02-10 21:23:40 +00:00
Sunny Goyal d4d2a73b67 Removing MultiHashMap and using java-streams instead
This makes it easier to choose different collection
implementations

Change-Id: Ic44e128b7478fcbbb1b546027685e058945af3f9
2020-08-27 15:26:18 -07:00
Tony Wickham 646e4486be Dump notification dot counts
This could help us determine whether our data model or
UI is wrong if dots aren't appearing.

Bug: 152435463
Change-Id: I46065b130b6b1cbb3b2d1db471654b3959332ff5
2020-04-10 01:10:13 +00:00
Sunny Goyal e396abf502 Moving model data structures to a separate file
Change-Id: I77ad7a5219e72d2e0d6c1803de2ac3ed6a65a8f7
2020-04-09 13:20:39 -07:00
Sunny Goyal 9c2b96090b Adding SecondaryDisplayLauncher in Launcher using common listener
Bug: 141596722
Change-Id: I480bfadf592f7d0309f17c33a3fe14bb77fb5586
2020-01-30 08:27:27 +00:00
Sunny Goyal 7c53d355bf Moving some notification binder calls to worker thread
Change-Id: I16c4aded7b709282a9b3d0df64111a9a40366b50
2019-10-21 15:01:10 -07:00
Pinyao Ting 49a3e699f9 show dot in deep shortcuts when notification contains exactly identical
set of person

Bug: 132336512
Change-Id: I975524e28168c10a186cdc24b188c161faf433cf
2019-08-05 20:41:58 -07:00
Pinyao Ting 0cd5bd5f95 Ensure each dot contains only relevant notification to the shortcut
and displays system shortcut when long click on deep shortcut.

In this CR we
1) for each shortcut, we filters the notifications to ensure we only
 get notifications with identical shortcutId.
2) allow system shortcut to be displayed when user long click on a
DeepShortcut

Bug: 132336512
Change-Id: Idc9eaed55e900ed4027a43ee9c3fd7dc6f4480b2
2019-08-01 02:47:24 +00:00
Pinyao Ting 559dd806d7 show dot on shortcut when incoming notification contains exactly the
same shortcut id

Bug: 132336512
Change-Id: Iddf4cfe8ad60c12e8de8b171bed392f1bb0a6761
2019-07-29 16:53:52 -07:00
Sunny Goyal 202ae0b0f5 Sending notification and widget changes to a listner so that
popups outside Launcher can also listen for changes

Change-Id: I2eb2d8374a6806381e1c682eaef3cc35f30693df
2019-02-11 16:23:11 -08:00
Sunny Goyal aae6fbb903 Moving some utility methods around
Change-Id: I8abca49a0dbf656212b21e0552502036a1619164
2019-01-31 16:07:40 -08:00
Tony Wickham c70f2fd5f1 Remove some obsolete notification badging code
Now that we only show dots instead of badges, we can simplify some logic
and remove a couple unused methods.

Change-Id: I72056eeb12e8968ec67b4c5b3a450d2ed5d4ee84
2018-12-04 15:58:56 -08:00
Tony Wickham f34bee819c Rename "badges" to "dots" where appropriate
This will reduce confusion with the other "badging" concept we use for,
e.g. work profiles. It is also consistent with the external name
"notification dots".

Change-Id: I2a2c9d96dc0d6284eb0c48adc78a856271caad4d
2018-12-04 10:46:40 -08:00
Zak Cohen 658c67a609 Deepshortcuts - only keep the per package shortcut count in memory.
Change to only keep the per Activity shortcut count in memory, not
the list of ids.
The full shortcuts are loaded at long press time so saves memory.

Bug:117239104
Test:Manual and ran instrumentation tests
Change-Id: Iee974ecba2c977216be4f078396ceed22b931f5d
2018-10-22 11:38:09 -07:00
Sunny Goyal 194f58525a Adding a provider class for various popup actions
so that it can be customized easily.

Change-Id: I633846631ac3d4c70ebb3ea35a3edc2feee8339e
2018-09-17 17:05:32 -07:00
Sunny Goyal d230307a95 Migrating to android-x
Change-Id: I9a774152d13a541e8496dd84f2469bfed407f86d
2018-08-14 15:22:12 -07:00
Tony 0f3d892a87 Only cancel the group notification if launcher canceled last child
Bug: 74429562
Change-Id: I82329b84d4d50f89218b431440dccb9ef33b1ba5
2018-03-13 16:20:45 +00:00
Sunny Goyal 6bb51f425b Removing some unused code path
Change-Id: I16a651d77c6557b33f8389407a222f058a8168d4
2018-01-04 11:12:44 -08:00
Sunny Goyal 00ac920241 Simplifying app icon popup
> Using a single linearLayout instead of multiple nested views
> Using clipToOutline for rounded corners instead of using canvas.saveLayer
> Removing nested view elevations and overdraw
> Using LayoutTransition for animating layout changes, instead of manually creating animators

Change-Id: I8e57092f52ca5a032a2756594fdd39788acc5a0d
2017-11-15 16:43:20 -08:00
Sunny Goyal f1fbc3fbe7 Converting widget panel into a floating view
> The widget panel is only inflated when needed
> Using the swipe up/down interaction for widgets tray
> Removing additional view wrappers from all-apps
> Widget tray is preserved across activity recreation
> Launcher no longer has WIDGET state, the actual code around
  the states will be removed in a follow-up cl

Bug: 67678570
Bug: 67585158
Change-Id: Ia29a7c33ec81e6c53cc24e2906b7022b6f41755b
2017-10-13 18:47:54 -07:00
Sunny Goyal 10a1bd0e65 Converting PopupContainerWithArrow into a base class so that it is easier
to create other types of popup

Bug: 67585158
Change-Id: I966ae7bb90f941951b26feaf71b3ea30c3f3c0cc
2017-10-10 10:28:05 -07:00
Mario Bertschler f41edbe875 Install long-click action for apps that are not installed.
Bug: 65059282
Change-Id: Ifec3ac15c9cf52c456e695846eb91024b07fe333
2017-08-31 12:09:13 -07:00
Tony Wickham 0530e8c608 Support notifications with 0 count (show as dots)
- Show number if number > 0
- Show icon if number == 0 and a notification specified an icon to show
- Show a dot otherwise
- In cases of multiple notifications, stack a second badge behind the
  first (visuals will be updated in future CL, as well as support
  stacked dots)
- Folders always show dot if any app within has a badge.

Change-Id: I0a89059b0e0a0d174fe739c9da4f75fa18c0edfa
2017-04-26 19:39:05 -07:00
Tony Wickham a7e1c1c088 Only add widgets system shortcut if widgets exist
Before we were adding it in a disabled state, and then enabling it once
widgets were bound (if widgets existed for that app). Now we load all
widgets when launcher starts so that we can use the values for the
purpose of animating the popup container. Then, as the container opens,
we reload widgets/shortcuts for that particular app and add/remove the
widgets shortcut if necessary.

Bug: 34940468
Change-Id: I64bd009442d10d3d1f9a977bdedfdb639a7dd193
2017-04-20 15:10:38 -07:00
Tony Wickham 2f54a1625a Small UI fix for widgets/app info shortcuts
- Switch order of widgets & more and app info.
- Start binding widgets after starting to update these shortcuts on the
  UI thread, so that they will show up without waiting for the bind
  logic, which can take a while. We already have a callback mechanism
  for enabling widgets & more after widgets are bound, so this was how
  it was supposed to work already.

Change-Id: I5f702f9c0814d30acf6298be309c6dc30727316e
2017-04-03 15:58:50 -07:00
Tony Wickham 26b1746593 Add support for system shortcuts in popup container
- Currently the system shortcuts are just widgets and app info
- As shortcuts, they live in ShortcutsItemView
- They are populated either as icons only (if there are deep
  shortcuts) or as icons + text
- Widgets are disabled until binding them is complete (we request for
  them to be bound on long-press now). We should revisit this.

Bug: 34940468
Change-Id: Ia51d002c3b3ede87658bdab57abfc3eeca1ed242
2017-03-30 16:35:56 -07:00
Tony Wickham 3621062339 Use notification counts (instead of assuming all 1)
We still ignore group summary headers, which means, for example,
we won't get Gmail unread count. But single notifications that
have numbers associated, such as messages from a single contact
will be included in the badge count. So if you have 2 hangounts
threads, one with 10 messages and one with 8, the badge would
say 18.

Bug: 34939841
Change-Id: I20b9a857d91715e10c0da400a1cee209d7b837b8
2017-03-27 08:27:12 -07:00
Tony Wickham 2f5bb16915 De-dupe shortcuts with the same id as the main notification.
- Pass NotificationKeyData, which includes the shortcut id, instead of
  just the notification key from NotificationListener
- Remove the shortcut with the same shortcut id as the first
  notification, if it has one, in PopupPopulator#sortAndFilterShorcuts()
- Add some unit tests

Bug: 36571718
Change-Id: I308941b34c525b34686583476e3f82ccb8b7e2d8
2017-03-24 14:18:53 -07:00
Tony ff7364a883 Remove badge info from map when count is 0.
Bug: 35803112
Change-Id: I680b92aac24bf5d083d64e9a4cd35471637a3809
2017-03-13 12:51:44 -04:00
Tony be3c7d0c56 Remove badges when launcher loses notification access
- NotificationListener.getInstance() has been changed to
  getInstanceIfConnected() (same behavior as before).
- When starting launcher, we send a full refresh of badges
  regardless of whether the NotificationListner is connected.
  If it is not connected, we pass an empty list for the
  active notifications, so that all pre-existing badges are
  removed.

Bug: 35221052
Change-Id: If920317f10814c010e02b5a30ce86a58ac7bc61c
2017-02-21 08:44:28 -08:00
Tony Wickham 988f34b7f2 Ensure that filtered notifications are removed from BadgeInfo.
There are cases where a BadgeInfo can contain a key that is later
used for a notification that should be filtered out. So instead
of simply not sending filtered notifications to PopupDataProvider,
now we explicitly send them and remove the corresponding key from
the BadgeInfo if it exists.

Bug: 35239510
Change-Id: I9532f47b1f07b44234f8707657b15b0de519b347
2017-02-13 07:02:26 -08:00
Tony Wickham 580edcf529 Create a singleton HashMap instead of using Collections.singleton()
The Set returned by Collections.singleton() doesn't support all
operations, causing crashes in certain situations (namely, whenever
a notification is updated rather than added or removed).

Change-Id: Ie104b7f99c4a32db5f1f7e43ec3775d34dc26ce1
2017-02-09 10:30:06 -08:00
Tony Wickham a799bed803 Show notification icon in place of "1" in badge.
- When notifications update, add the NotificationInfo to the
  BadgeInfo if there is only one for an app. BadgeRenderer
  will use the NotificationInfo to get the icon to draw.
- When retrieving the icon from the NotificationInfo, we draw
  it into a shader (similar to MaskableIconDrawable), which is
  rendered by BadgeRenderer.
- For now, we only use the notification icon if it is large.

Bug: 34839959
Bug: 32410600
Bug: 33553066
Change-Id: I31851804008dd15bab75d2759441187830c3265e
2017-02-07 09:48:43 -08:00
Tony Wickham 4d096298ce Ensure getNotificationKeysForItem() returns empty on unsupported items.
We were bypassing the check in getBadgeInfoForItem(), which meant
we would return notifications based on package/user regardless of
the item type. In particular, deep shortcuts would show notifications
when long-pressed.

Bug: 34866646
Change-Id: I6575a28539313c0c5d0eea1cbf7b7726f747bcd5
2017-02-01 09:58:40 -08:00
Tony Wickham 2efcdd0c78 Store notification keys in a List instead of a Set.
This will preserve the order when iterating over the notifications to
populate the popup container.

Bug: 34735689
Change-Id: Ic390ffef140e454566ffc6ab1763950349df25ce
2017-01-26 11:28:43 -08:00
Tony Wickham 9438ed414f Add swipe-to-dismiss notifications in popup menu.
- Next secondary icon animates up to replace dismissed main notification
- Add padding around main notification so it always aligns with the
  straight edges of the view (not the rounded corners); looks more
  dismissable
- Notification view collapses as notifications are dismissed
- To mimic system notification behavior, we copy SwipeHelper,
  FlingAnimationUtils, and Interpolators. We also apply elevation
  to notifications and reveal a darker color beneath when dismissing.

Bug: 32410600
Change-Id: I9fbf10e73bb4996f17ef061c856efb013967d972
2017-01-25 17:36:31 -08:00
Tony Wickham 540913eadf Refactor DeepShortcutsContainer to PopupContainerWithArrow
- Also added PopupItemView, which takes animation logic from
  DeepShortcutView, and which DeepShortcutView now extends.
- Renamed ShortcutFilter to PopupPopulator, which has support
  for new item types (not yet used). Also moved populating
  logic (e.g. UpdateShortcutChild Runnable) to PopupPopulator.

Bug: 32410600
Change-Id: Ib6e444ac7ca99c80ba438801c26e62d9542e0ad9
2017-01-25 11:21:47 -08:00
Tony Wickham 010d255018 Add NotificationListener to launcher.
- NotificationListener extends NotificationListenerService, and is
  added to the manifest.
- Added PopupDataProvider, which contains logic for storing and
  interacting with data that goes into the long-press popup menu
  (shortcuts and notifications). A follow-up CL will rename
  DeepShortcutsContainer to a generic PopupContainerWithArrow.
- If Launcher has notification access, NotificationListener will
  get callbacks when notifications are posted and removed; upon
  receiving these callbacks, NotificationListener passes them to
  PopupDataProvider via a NotificationsChangedListener interface.
- Upon receiving the changed notifications, PopupDataProvider maps
  them to the corresponding package/user and tells launcher to
  update relevant icons on the workspace and all apps.

This is guarded by FeatureFlags.BADGE_ICONS.

Bug: 32410600
Change-Id: I59aeb31a7f92399c9c4b831ab551e51e13f44f5c
2017-01-25 09:51:06 -08:00