StatusBarNotification.java revision 1a497d3a2b1496c12949e47e55f8e46d8f585be5
1bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai/*
2bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai * Copyright (C) 2008 The Android Open Source Project
3bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai *
4bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai * Licensed under the Apache License, Version 2.0 (the "License");
5bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai * you may not use this file except in compliance with the License.
6bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai * You may obtain a copy of the License at
72251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka *
82251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka *      http://www.apache.org/licenses/LICENSE-2.0
9bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai *
1037cdc8d0b9803e0c3dc17640534b74cd45fa4bd8Daniel Nicoara * Unless required by applicable law or agreed to in writing, software
112d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai * distributed under the License is distributed on an "AS IS" BASIS,
122251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai * See the License for the specific language governing permissions and
14960bcfffefa76d535c5aecd303d755be3fbc59f1Jiwen 'Steve' Cai * limitations under the License.
15960bcfffefa76d535c5aecd303d755be3fbc59f1Jiwen 'Steve' Cai */
16bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai
17bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Caipackage android.service.notification;
182251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
192251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaimport android.app.Notification;
202251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaimport android.os.Parcel;
21bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Caiimport android.os.Parcelable;
222251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaimport android.os.UserHandle;
23bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai
24bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai/**
252251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka * Class encapsulating a Notification. Sent by the NotificationManagerService to clients including
26bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai * the status bar and any {@link android.service.notification.NotificationListenerService}s.
27bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai */
28bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Caipublic class StatusBarNotification implements Parcelable {
29bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai    /** The package of the app that posted the notification. */
302d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai    public final String pkg;
312251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    /** The id supplied to {@link android.app.NotificationManager#notify}. */
322d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai    public final int id;
3374cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai    /** The tag supplied to {@link android.app.NotificationManager#notify}, or null if no tag
342251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka     * was specified. */
352251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    public final String tag;
362251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
372251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    /** The notifying app's calling uid. @hide */
382251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    public final int uid;
3974cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai    /** The notifying app's base package. @hide */
4028b58bfdcce253358120d1554755d71c2226f8fdJohn Bates    public final String basePkg;
4128b58bfdcce253358120d1554755d71c2226f8fdJohn Bates    /** @hide */
422251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    public final int initialPid;
432251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    // TODO: make this field private and move callers to an accessor that
442251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    // ensures sourceUser is applied.
452251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
462251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    /** The {@link android.app.Notification} supplied to
472251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka     * {@link android.app.NotificationManager#notify}. */
482251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    public final Notification notification;
492251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    /** The {@link android.os.UserHandle} for whom this notification is intended. */
502251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    public final UserHandle user;
512251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    /** The time (in {@link System#currentTimeMillis} time) the notification was posted,
522251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka     * which may be different than {@link android.app.Notification#when}.
532251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka     */
542251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    public final long postTime;
552251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
562251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    /** @hide */
572251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    public final int score;
582251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
592251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    /** This is temporarily needed for the JB MR1 PDK.
602251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka     * @hide */
612251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    @Deprecated
622251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    public StatusBarNotification(String pkg, int id, String tag, int uid, int initialPid, int score,
632251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka            Notification notification) {
642251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        this(pkg, id, tag, uid, initialPid, score, notification, UserHandle.OWNER);
652251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    }
662251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
672251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    /** @hide */
682251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    public StatusBarNotification(String pkg, int id, String tag, int uid, int initialPid, int score,
692251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka            Notification notification, UserHandle user) {
702251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        this(pkg, null, id, tag, uid, initialPid, score, notification, user);
712251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    }
722251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
732251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    /** @hide */
742251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    public StatusBarNotification(String pkg, String basePkg, int id, String tag, int uid,
752251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka            int initialPid, int score, Notification notification, UserHandle user) {
762251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        this(pkg, basePkg, id, tag, uid, initialPid, score, notification, user,
772251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                System.currentTimeMillis());
782251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    }
792251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
802251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    public StatusBarNotification(String pkg, String basePkg, int id, String tag, int uid,
812251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka            int initialPid, int score, Notification notification, UserHandle user,
822251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka            long postTime) {
832251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        if (pkg == null) throw new NullPointerException();
842251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        if (notification == null) throw new NullPointerException();
852251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
862251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        this.pkg = pkg;
872251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        this.basePkg = pkg;
88bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai        this.id = id;
89bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai        this.tag = tag;
902251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        this.uid = uid;
912251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        this.initialPid = initialPid;
922251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        this.score = score;
932251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        this.notification = notification;
942251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        this.user = user;
95bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai        this.notification.setUser(user);
962251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
972251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        this.postTime = postTime;
982251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    }
992251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1002251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    public StatusBarNotification(Parcel in) {
101bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai        this.pkg = in.readString();
1022251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        this.basePkg = in.readString();
1032251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        this.id = in.readInt();
10428b58bfdcce253358120d1554755d71c2226f8fdJohn Bates        if (in.readInt() != 0) {
105bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai            this.tag = in.readString();
1062251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        } else {
1072251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka            this.tag = null;
1082251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        }
1092251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        this.uid = in.readInt();
1102251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        this.initialPid = in.readInt();
111bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai        this.score = in.readInt();
1122251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        this.notification = new Notification(in);
1132251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        this.user = UserHandle.readFromParcel(in);
114bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai        this.notification.setUser(this.user);
115bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai        this.postTime = in.readLong();
1162251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    }
117bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai
1182251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    public void writeToParcel(Parcel out, int flags) {
1192251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        out.writeString(this.pkg);
12028b58bfdcce253358120d1554755d71c2226f8fdJohn Bates        out.writeString(this.basePkg);
12128b58bfdcce253358120d1554755d71c2226f8fdJohn Bates        out.writeInt(this.id);
1222251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        if (this.tag != null) {
1232251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka            out.writeInt(1);
1242251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka            out.writeString(this.tag);
1252251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        } else {
12628b58bfdcce253358120d1554755d71c2226f8fdJohn Bates            out.writeInt(0);
127bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai        }
1282d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai        out.writeInt(this.uid);
1292d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai        out.writeInt(this.initialPid);
1302251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        out.writeInt(this.score);
1312d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai        this.notification.writeToParcel(out, flags);
1322251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        user.writeToParcel(out, flags);
133960bcfffefa76d535c5aecd303d755be3fbc59f1Jiwen 'Steve' Cai
134960bcfffefa76d535c5aecd303d755be3fbc59f1Jiwen 'Steve' Cai        out.writeLong(this.postTime);
1352d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai    }
1362d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
1372d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai    public int describeContents() {
1382d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai        return 0;
1392251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    }
1402d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
1412d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai    public static final Parcelable.Creator<StatusBarNotification> CREATOR
1422251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka            = new Parcelable.Creator<StatusBarNotification>()
1432d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai    {
1442251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        public StatusBarNotification createFromParcel(Parcel parcel)
1452d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai        {
1462d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai            return new StatusBarNotification(parcel);
1472d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai        }
1482d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
1492251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        public StatusBarNotification[] newArray(int size)
1502d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai        {
1512d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai            return new StatusBarNotification[size];
1522d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai        }
153bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai    };
154eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar
1552251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    /**
1562251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka     * @hide
1572251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka     */
1582251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    public StatusBarNotification cloneLight() {
1592251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        final Notification no = new Notification();
1602251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        this.notification.cloneInto(no, false); // light copy
1612251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka        return new StatusBarNotification(this.pkg, this.basePkg,
1622251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                this.id, this.tag, this.uid, this.initialPid,
1632251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                this.score, no, this.user, this.postTime);
1642251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    }
165108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar
166108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar    @Override
167bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai    public StatusBarNotification clone() {
168bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai        return new StatusBarNotification(this.pkg, this.basePkg,
1692251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                this.id, this.tag, this.uid, this.initialPid,
1702251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                this.score, this.notification.clone(), this.user, this.postTime);
1712251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    }
17284d90f316c01aadd1e6e0acbc94d51be24ec211fHendrik Wagenaar
17384d90f316c01aadd1e6e0acbc94d51be24ec211fHendrik Wagenaar    @Override
17484d90f316c01aadd1e6e0acbc94d51be24ec211fHendrik Wagenaar    public String toString() {
175bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai        return String.format(
176bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai                "StatusBarNotification(pkg=%s user=%s id=%d tag=%s score=%d: %s)",
1772251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                this.pkg, this.user, this.id, this.tag,
1782251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka                this.score, this.notification);
17984d90f316c01aadd1e6e0acbc94d51be24ec211fHendrik Wagenaar    }
18084d90f316c01aadd1e6e0acbc94d51be24ec211fHendrik Wagenaar
18184d90f316c01aadd1e6e0acbc94d51be24ec211fHendrik Wagenaar    /** Convenience method to check the notification's flags for
18284d90f316c01aadd1e6e0acbc94d51be24ec211fHendrik Wagenaar     * {@link Notification#FLAG_ONGOING_EVENT}.
18384d90f316c01aadd1e6e0acbc94d51be24ec211fHendrik Wagenaar     */
18484d90f316c01aadd1e6e0acbc94d51be24ec211fHendrik Wagenaar    public boolean isOngoing() {
185bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai        return (notification.flags & Notification.FLAG_ONGOING_EVENT) != 0;
186bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai    }
18784d90f316c01aadd1e6e0acbc94d51be24ec211fHendrik Wagenaar
18884d90f316c01aadd1e6e0acbc94d51be24ec211fHendrik Wagenaar    /** Convenience method to check the notification's flags for
18984d90f316c01aadd1e6e0acbc94d51be24ec211fHendrik Wagenaar     * either {@link Notification#FLAG_ONGOING_EVENT} or
19084d90f316c01aadd1e6e0acbc94d51be24ec211fHendrik Wagenaar     * {@link Notification#FLAG_NO_CLEAR}.
19184d90f316c01aadd1e6e0acbc94d51be24ec211fHendrik Wagenaar     */
19284d90f316c01aadd1e6e0acbc94d51be24ec211fHendrik Wagenaar    public boolean isClearable() {
19384d90f316c01aadd1e6e0acbc94d51be24ec211fHendrik Wagenaar        return ((notification.flags & Notification.FLAG_ONGOING_EVENT) == 0)
19484d90f316c01aadd1e6e0acbc94d51be24ec211fHendrik Wagenaar                && ((notification.flags & Notification.FLAG_NO_CLEAR) == 0);
19584d90f316c01aadd1e6e0acbc94d51be24ec211fHendrik Wagenaar    }
196bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai
19737cdc8d0b9803e0c3dc17640534b74cd45fa4bd8Daniel Nicoara    /** Returns a userHandle for the instance of the app that posted this notification. */
19837cdc8d0b9803e0c3dc17640534b74cd45fa4bd8Daniel Nicoara    public int getUserId() {
19937cdc8d0b9803e0c3dc17640534b74cd45fa4bd8Daniel Nicoara        return this.user.getIdentifier();
200eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar    }
20137cdc8d0b9803e0c3dc17640534b74cd45fa4bd8Daniel Nicoara}
20237cdc8d0b9803e0c3dc17640534b74cd45fa4bd8Daniel Nicoara