1 /*
2  * Copyright (C) 2016 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 com.android.documentsui.sorting;
18 
19 import android.annotation.IntDef;
20 import android.os.Parcel;
21 import android.os.Parcelable;
22 import android.support.annotation.StringRes;
23 import android.view.View;
24 
25 import java.lang.annotation.Retention;
26 import java.lang.annotation.RetentionPolicy;
27 
28 /**
29  * A model class that describes a sort dimension and its sort state.
30  */
31 public class SortDimension implements Parcelable {
32 
33     /**
34      * This enum is defined as flag because it's also used to denote whether a column can be sorted
35      * in a certain direction.
36      */
37     @IntDef(flag = true, value = {
38             SORT_DIRECTION_NONE,
39             SORT_DIRECTION_ASCENDING,
40             SORT_DIRECTION_DESCENDING
41     })
42     @Retention(RetentionPolicy.SOURCE)
43     public @interface SortDirection {}
44     public static final int SORT_DIRECTION_NONE = 0;
45     public static final int SORT_DIRECTION_ASCENDING = 1;
46     public static final int SORT_DIRECTION_DESCENDING = 2;
47 
48     @IntDef({
49             SORT_CAPABILITY_NONE,
50             SORT_CAPABILITY_BOTH_DIRECTION
51     })
52     @Retention(RetentionPolicy.SOURCE)
53     @interface SortCapability {}
54     public static final int SORT_CAPABILITY_NONE = 0;
55     public static final int SORT_CAPABILITY_BOTH_DIRECTION =
56             SORT_DIRECTION_ASCENDING | SORT_DIRECTION_DESCENDING;
57 
58     @IntDef({
59             DATA_TYPE_STRING,
60             DATA_TYPE_NUMBER
61     })
62     @Retention(RetentionPolicy.SOURCE)
63     public @interface DataType {}
64     public static final int DATA_TYPE_STRING = 0;
65     public static final int DATA_TYPE_NUMBER = 1;
66 
67     private final int mId;
68     private final @StringRes int mLabelId;
69     private final @DataType int mDataType;
70     private final @SortCapability int mSortCapability;
71     private final @SortDirection int mDefaultSortDirection;
72 
73     @SortDirection int mSortDirection = SORT_DIRECTION_NONE;
74     int mVisibility;
75 
SortDimension(int id, @StringRes int labelId, @DataType int dataType, @SortCapability int sortCapability, @SortDirection int defaultSortDirection)76     private SortDimension(int id, @StringRes int labelId, @DataType int dataType,
77             @SortCapability int sortCapability, @SortDirection int defaultSortDirection) {
78         mId = id;
79         mLabelId = labelId;
80         mDataType = dataType;
81         mSortCapability = sortCapability;
82         mDefaultSortDirection = defaultSortDirection;
83     }
84 
getId()85     public int getId() {
86         return mId;
87     }
88 
getLabelId()89     public @StringRes int getLabelId() {
90         return mLabelId;
91     }
92 
getDataType()93     public @DataType int getDataType() {
94         return mDataType;
95     }
96 
getSortCapability()97     public @SortCapability int getSortCapability() {
98         return mSortCapability;
99     }
100 
getDefaultSortDirection()101     public @SortDirection int getDefaultSortDirection() {
102         return mDefaultSortDirection;
103     }
104 
getNextDirection()105     public @SortDirection int getNextDirection() {
106         @SortDimension.SortDirection int alternativeDirection =
107                 (mDefaultSortDirection == SortDimension.SORT_DIRECTION_ASCENDING)
108                         ? SortDimension.SORT_DIRECTION_DESCENDING
109                         : SortDimension.SORT_DIRECTION_ASCENDING;
110         @SortDimension.SortDirection int direction =
111                 (mSortDirection == mDefaultSortDirection)
112                         ? alternativeDirection
113                         : mDefaultSortDirection;
114 
115         return direction;
116     }
117 
getSortDirection()118     public @SortDirection int getSortDirection() {
119         return mSortDirection;
120     }
121 
getVisibility()122     public int getVisibility() {
123         return mVisibility;
124     }
125 
126     @Override
hashCode()127     public int hashCode() {
128         return mId;
129     }
130 
131     @Override
equals(Object o)132     public boolean equals(Object o) {
133         if (o == null || !(o instanceof SortDimension)) {
134             return false;
135         }
136 
137         if (this == o) {
138             return true;
139         }
140 
141         SortDimension other = (SortDimension) o;
142 
143         return mId == other.mId
144                 && mLabelId == other.mLabelId
145                 && mDataType == other.mDataType
146                 && mSortCapability == other.mSortCapability
147                 && mDefaultSortDirection == other.mDefaultSortDirection
148                 && mSortDirection == other.mSortDirection
149                 && mVisibility == other.mVisibility;
150     }
151 
152     @Override
toString()153     public String toString() {
154         return new StringBuilder().append("SortDimension{")
155                 .append("id=").append(mId)
156                 .append(", labelId=").append(mLabelId)
157                 .append(", dataType=").append(mDataType)
158                 .append(", sortCapability=").append(mSortCapability)
159                 .append(", defaultSortDirection=").append(mDefaultSortDirection)
160                 .append(", sortDirection=").append(mSortDirection)
161                 .append(", visibility=").append(mVisibility)
162                 .append("}")
163                 .toString();
164     }
165 
166     @Override
describeContents()167     public int describeContents() {
168         return 0;
169     }
170 
171     @Override
writeToParcel(Parcel out, int flag)172     public void writeToParcel(Parcel out, int flag) {
173         out.writeInt(mId);
174         out.writeInt(mLabelId);
175         out.writeInt(mDataType);
176         out.writeInt(mSortCapability);
177         out.writeInt(mDefaultSortDirection);
178         out.writeInt(mSortDirection);
179         out.writeInt(mVisibility);
180     }
181 
182     public static Parcelable.Creator<SortDimension> CREATOR =
183             new Parcelable.Creator<SortDimension>() {
184 
185         @Override
186         public SortDimension createFromParcel(Parcel in) {
187             int id = in.readInt();
188             @StringRes int labelId = in.readInt();
189             @DataType  int dataType = in.readInt();
190             int sortCapability = in.readInt();
191             int defaultSortDirection = in.readInt();
192 
193             SortDimension column =
194                     new SortDimension(id, labelId, dataType, sortCapability, defaultSortDirection);
195 
196             column.mSortDirection = in.readInt();
197             column.mVisibility = in.readInt();
198 
199             return column;
200         }
201 
202         @Override
203         public SortDimension[] newArray(int size) {
204             return new SortDimension[size];
205         }
206     };
207 
208     static class Builder {
209         private int mId;
210         private @StringRes int mLabelId;
211         private @DataType int mDataType = DATA_TYPE_STRING;
212         private @SortCapability int mSortCapability = SORT_CAPABILITY_BOTH_DIRECTION;
213         private @SortDirection int mDefaultSortDirection = SORT_DIRECTION_ASCENDING;
214         private int mVisibility = View.VISIBLE;
215 
withId(int id)216         Builder withId(int id) {
217             mId = id;
218             return this;
219         }
220 
withLabelId(@tringRes int labelId)221         Builder withLabelId(@StringRes int labelId) {
222             mLabelId = labelId;
223             return this;
224         }
225 
withDataType(@ataType int dataType)226         Builder withDataType(@DataType int dataType) {
227             mDataType = dataType;
228             return this;
229         }
230 
withSortCapability(@ortCapability int sortCapability)231         Builder withSortCapability(@SortCapability int sortCapability) {
232             mSortCapability = sortCapability;
233             return this;
234         }
235 
withVisibility(int visibility)236         Builder withVisibility(int visibility) {
237             mVisibility = visibility;
238             return this;
239         }
240 
withDefaultSortDirection(@ortDirection int defaultSortDirection)241         Builder withDefaultSortDirection(@SortDirection int defaultSortDirection) {
242             mDefaultSortDirection = defaultSortDirection;
243             return this;
244         }
245 
build()246         SortDimension build() {
247             if (mLabelId == 0) {
248                 throw new IllegalStateException("Must set labelId.");
249             }
250 
251             SortDimension dimension = new SortDimension(
252                     mId, mLabelId, mDataType, mSortCapability, mDefaultSortDirection);
253             dimension.mVisibility = mVisibility;
254             return dimension;
255         }
256     }
257 }
258