• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.health.connect.aidl;
18 
19 import static android.health.connect.Constants.DEFAULT_LONG;
20 
21 import android.annotation.NonNull;
22 import android.health.connect.DeleteUsingFiltersRequest;
23 import android.health.connect.TimeRangeFilterHelper;
24 import android.health.connect.datatypes.DataOrigin;
25 import android.health.connect.internal.datatypes.utils.RecordMapper;
26 import android.os.Parcel;
27 import android.os.Parcelable;
28 
29 import java.util.Arrays;
30 import java.util.Collections;
31 import java.util.List;
32 import java.util.Objects;
33 import java.util.stream.Collectors;
34 
35 /**
36  * @see DeleteUsingFiltersRequest
37  * @hide
38  */
39 public class DeleteUsingFiltersRequestParcel implements Parcelable {
40     public static final Creator<DeleteUsingFiltersRequestParcel> CREATOR =
41             new Creator<>() {
42                 @Override
43                 public DeleteUsingFiltersRequestParcel createFromParcel(Parcel in) {
44                     return new DeleteUsingFiltersRequestParcel(in);
45                 }
46 
47                 @Override
48                 public DeleteUsingFiltersRequestParcel[] newArray(int size) {
49                     return new DeleteUsingFiltersRequestParcel[size];
50                 }
51             };
52     private List<String> mPackageNameFilters;
53     private final int[] mRecordTypeFilters;
54     private final long mStartTime;
55     private final long mEndTime;
56     private final RecordIdFiltersParcel mRecordIdFiltersParcel;
57     private final boolean mLocalTimeFilter;
58 
DeleteUsingFiltersRequestParcel(Parcel in)59     protected DeleteUsingFiltersRequestParcel(Parcel in) {
60         mPackageNameFilters = in.createStringArrayList();
61         mRecordTypeFilters = in.createIntArray();
62         mStartTime = in.readLong();
63         mEndTime = in.readLong();
64         mLocalTimeFilter = in.readBoolean();
65         mRecordIdFiltersParcel =
66                 in.readParcelable(
67                         RecordIdFiltersParcel.class.getClassLoader(), RecordIdFiltersParcel.class);
68     }
69 
DeleteUsingFiltersRequestParcel(DeleteUsingFiltersRequest request)70     public DeleteUsingFiltersRequestParcel(DeleteUsingFiltersRequest request) {
71         mPackageNameFilters =
72                 request.getDataOrigins().stream()
73                         .map(DataOrigin::getPackageName)
74                         .collect(Collectors.toList());
75         mRecordTypeFilters =
76                 request.getRecordTypes().stream()
77                         .mapToInt(
78                                 recordType -> RecordMapper.getInstance().getRecordType(recordType))
79                         .toArray();
80 
81         if (request.getTimeRangeFilter() == null) {
82             // Use defaults values to signal filters not set
83             mStartTime = DEFAULT_LONG;
84             mEndTime = DEFAULT_LONG;
85         } else {
86             mStartTime =
87                     TimeRangeFilterHelper.getFilterStartTimeMillis(request.getTimeRangeFilter());
88             mEndTime = TimeRangeFilterHelper.getFilterEndTimeMillis(request.getTimeRangeFilter());
89         }
90         mLocalTimeFilter = TimeRangeFilterHelper.isLocalTimeFilter(request.getTimeRangeFilter());
91         mRecordIdFiltersParcel = new RecordIdFiltersParcel(Collections.emptyList());
92     }
93 
DeleteUsingFiltersRequestParcel( RecordIdFiltersParcel recordIdFiltersParcel, String packageName)94     public DeleteUsingFiltersRequestParcel(
95             RecordIdFiltersParcel recordIdFiltersParcel, String packageName) {
96         mPackageNameFilters = Collections.singletonList(packageName);
97         // Not required with ids
98         mRecordTypeFilters = new int[0];
99         mStartTime = DEFAULT_LONG;
100         mEndTime = DEFAULT_LONG;
101         mLocalTimeFilter = false;
102         mRecordIdFiltersParcel = recordIdFiltersParcel;
103     }
104 
getRecordIdFiltersParcel()105     public RecordIdFiltersParcel getRecordIdFiltersParcel() {
106         return mRecordIdFiltersParcel;
107     }
108 
getPackageNameFilters()109     public List<String> getPackageNameFilters() {
110         return mPackageNameFilters;
111     }
112 
setPackageNameFilters(@onNull List<String> packages)113     public void setPackageNameFilters(@NonNull List<String> packages) {
114         Objects.requireNonNull(packages);
115         mPackageNameFilters = packages;
116     }
117 
getRecordTypeFilters()118     public List<Integer> getRecordTypeFilters() {
119         if (mRecordIdFiltersParcel != null
120                 && !mRecordIdFiltersParcel.getRecordIdFilters().isEmpty()) {
121             return mRecordIdFiltersParcel.getRecordIdFilters().stream()
122                     .map(
123                             (recordIdFilter) ->
124                                     RecordMapper.getInstance()
125                                             .getRecordType(recordIdFilter.getRecordType()))
126                     .toList()
127                     .stream()
128                     .distinct()
129                     .toList();
130         }
131 
132         return Arrays.stream(mRecordTypeFilters).boxed().toList();
133     }
134 
getStartTime()135     public long getStartTime() {
136         return mStartTime;
137     }
138 
getEndTime()139     public long getEndTime() {
140         return mEndTime;
141     }
142 
usesIdFilters()143     public boolean usesIdFilters() {
144         return mRecordIdFiltersParcel.getRecordIdFilters() != null
145                 && !mRecordIdFiltersParcel.getRecordIdFilters().isEmpty();
146     }
147 
148     @Override
describeContents()149     public int describeContents() {
150         return 0;
151     }
152 
153     @Override
writeToParcel(@onNull Parcel dest, int flags)154     public void writeToParcel(@NonNull Parcel dest, int flags) {
155         dest.writeStringList(mPackageNameFilters);
156         dest.writeIntArray(mRecordTypeFilters);
157         dest.writeLong(mStartTime);
158         dest.writeLong(mEndTime);
159         dest.writeBoolean(mLocalTimeFilter);
160         dest.writeParcelable(mRecordIdFiltersParcel, 0);
161     }
162 
isLocalTimeFilter()163     public boolean isLocalTimeFilter() {
164         return mLocalTimeFilter;
165     }
166 
usesNonIdFilters()167     public boolean usesNonIdFilters() {
168         return mRecordTypeFilters.length != 0
169                 || mStartTime != DEFAULT_LONG
170                 || mEndTime != DEFAULT_LONG;
171     }
172 }
173