Path: blob/main/src/vs/workbench/services/activity/browser/activityService.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { IActivityService, IActivity } from '../common/activity.js';6import { IDisposable, Disposable, toDisposable } from '../../../../base/common/lifecycle.js';7import { InstantiationType, registerSingleton } from '../../../../platform/instantiation/common/extensions.js';8import { IViewDescriptorService, ViewContainer } from '../../../common/views.js';9import { GLOBAL_ACTIVITY_ID, ACCOUNTS_ACTIVITY_ID } from '../../../common/activity.js';10import { Emitter, Event } from '../../../../base/common/event.js';11import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';1213class ViewContainerActivityByView extends Disposable {1415private activity: IActivity | undefined = undefined;16private activityDisposable: IDisposable = Disposable.None;1718constructor(19private readonly viewId: string,20@IViewDescriptorService private readonly viewDescriptorService: IViewDescriptorService,21@IActivityService private readonly activityService: IActivityService,22) {23super();24this._register(Event.filter(this.viewDescriptorService.onDidChangeContainer, e => e.views.some(view => view.id === viewId))(() => this.update()));25this._register(Event.filter(this.viewDescriptorService.onDidChangeLocation, e => e.views.some(view => view.id === viewId))(() => this.update()));26}2728setActivity(activity: IActivity): void {29this.activity = activity;30this.update();31}3233clearActivity(): void {34this.activity = undefined;35this.update();36}3738private update(): void {39this.activityDisposable.dispose();40const container = this.viewDescriptorService.getViewContainerByViewId(this.viewId);41if (container && this.activity) {42this.activityDisposable = this.activityService.showViewContainerActivity(container.id, this.activity);43}44}4546override dispose() {47this.activityDisposable.dispose();48super.dispose();49}50}5152interface IViewActivity {53id: number;54readonly activity: ViewContainerActivityByView;55}5657export class ActivityService extends Disposable implements IActivityService {5859public _serviceBrand: undefined;6061private readonly viewActivities = new Map<string, IViewActivity>();6263private readonly _onDidChangeActivity = this._register(new Emitter<string | ViewContainer>());64readonly onDidChangeActivity = this._onDidChangeActivity.event;6566private readonly viewContainerActivities = new Map<string, IActivity[]>();67private readonly globalActivities = new Map<string, IActivity[]>();6869constructor(70@IViewDescriptorService private readonly viewDescriptorService: IViewDescriptorService,71@IInstantiationService private readonly instantiationService: IInstantiationService72) {73super();74}7576showViewContainerActivity(viewContainerId: string, activity: IActivity): IDisposable {77const viewContainer = this.viewDescriptorService.getViewContainerById(viewContainerId);78if (!viewContainer) {79return Disposable.None;80}8182let activities = this.viewContainerActivities.get(viewContainerId);83if (!activities) {84activities = [];85this.viewContainerActivities.set(viewContainerId, activities);86}8788// add activity89activities.push(activity);9091this._onDidChangeActivity.fire(viewContainer);9293return toDisposable(() => {94activities.splice(activities.indexOf(activity), 1);95if (activities.length === 0) {96this.viewContainerActivities.delete(viewContainerId);97}98this._onDidChangeActivity.fire(viewContainer);99});100}101102getViewContainerActivities(viewContainerId: string): IActivity[] {103const viewContainer = this.viewDescriptorService.getViewContainerById(viewContainerId);104if (viewContainer) {105return this.viewContainerActivities.get(viewContainerId) ?? [];106}107return [];108}109110showViewActivity(viewId: string, activity: IActivity): IDisposable {111let maybeItem = this.viewActivities.get(viewId);112113if (maybeItem) {114maybeItem.id++;115} else {116maybeItem = {117id: 1,118activity: this.instantiationService.createInstance(ViewContainerActivityByView, viewId)119};120121this.viewActivities.set(viewId, maybeItem);122}123124const id = maybeItem.id;125maybeItem.activity.setActivity(activity);126127const item = maybeItem;128return toDisposable(() => {129if (item.id === id) {130item.activity.dispose();131this.viewActivities.delete(viewId);132}133});134}135136showAccountsActivity(activity: IActivity): IDisposable {137return this.showActivity(ACCOUNTS_ACTIVITY_ID, activity);138}139140showGlobalActivity(activity: IActivity): IDisposable {141return this.showActivity(GLOBAL_ACTIVITY_ID, activity);142}143144getActivity(id: string): IActivity[] {145return this.globalActivities.get(id) ?? [];146}147148private showActivity(id: string, activity: IActivity): IDisposable {149let activities = this.globalActivities.get(id);150if (!activities) {151activities = [];152this.globalActivities.set(id, activities);153}154activities.push(activity);155this._onDidChangeActivity.fire(id);156return toDisposable(() => {157activities.splice(activities.indexOf(activity), 1);158if (activities.length === 0) {159this.globalActivities.delete(id);160}161this._onDidChangeActivity.fire(id);162});163}164}165166registerSingleton(IActivityService, ActivityService, InstantiationType.Delayed);167168169