State.java revision d4b17531701c13b77793ac5566978d4bc3056b89
1/*
2 * Copyright (C) 2013 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
17package com.android.documentsui;
18
19import static com.android.documentsui.Shared.DEBUG;
20
21import android.annotation.IntDef;
22import android.content.Intent;
23import android.os.Parcel;
24import android.os.Parcelable;
25import android.util.Log;
26import android.util.SparseArray;
27
28import com.android.documentsui.dirlist.MultiSelectManager.Selection;
29import com.android.documentsui.model.DocumentInfo;
30import com.android.documentsui.model.DocumentStack;
31import com.android.documentsui.model.DurableUtils;
32import com.android.documentsui.model.RootInfo;
33
34import java.lang.annotation.Retention;
35import java.lang.annotation.RetentionPolicy;
36import java.util.ArrayList;
37import java.util.HashMap;
38import java.util.List;
39
40public class State implements android.os.Parcelable {
41
42    private static final String TAG = "State";
43
44    public static final int ACTION_OPEN = 1;
45    public static final int ACTION_CREATE = 2;
46    public static final int ACTION_GET_CONTENT = 3;
47    public static final int ACTION_OPEN_TREE = 4;
48    public static final int ACTION_MANAGE = 5;
49    public static final int ACTION_BROWSE = 6;
50    public static final int ACTION_PICK_COPY_DESTINATION = 8;
51
52    @IntDef(flag = true, value = {
53            MODE_UNKNOWN,
54            MODE_LIST,
55            MODE_GRID
56    })
57    @Retention(RetentionPolicy.SOURCE)
58    public @interface ViewMode {}
59    public static final int MODE_UNKNOWN = 0;
60    public static final int MODE_LIST = 1;
61    public static final int MODE_GRID = 2;
62
63    public static final int SORT_ORDER_UNKNOWN = 0;
64    public static final int SORT_ORDER_DISPLAY_NAME = 1;
65    public static final int SORT_ORDER_LAST_MODIFIED = 2;
66    public static final int SORT_ORDER_SIZE = 3;
67
68    public int action;
69    public String[] acceptMimes;
70
71    /** Derived from local preferences */
72    public @ViewMode int derivedMode = MODE_GRID;
73
74    /** Explicit user choice */
75    public int userSortOrder = SORT_ORDER_UNKNOWN;
76    /** Derived after loader */
77    public int derivedSortOrder = SORT_ORDER_DISPLAY_NAME;
78
79    public boolean allowMultiple;
80    public boolean forceSize;
81    public boolean showSize;
82    public boolean localOnly;
83    public boolean forceAdvanced;
84    public boolean showAdvanced;
85    public boolean restored;
86    public boolean directoryCopy;
87    public boolean openableOnly;
88    /** Transfer mode for file copy/move operations. */
89    public int transferMode;
90
91    /** Current user navigation stack; empty implies recents. */
92    public DocumentStack stack = new DocumentStack();
93    private boolean mStackTouched;
94    private boolean mInitialRootChanged;
95    private boolean mInitialDocChanged;
96
97    /** Currently active search, overriding any stack. */
98    public String currentSearch;
99
100    /** Instance state for every shown directory */
101    public HashMap<String, SparseArray<Parcelable>> dirState = new HashMap<>();
102
103    /** UI selection */
104    public Selection selectedDocuments = new Selection();
105
106    /** Currently copying file */
107    public List<DocumentInfo> selectedDocumentsForCopy = new ArrayList<>();
108
109    /** Name of the package that started DocsUI */
110    public List<String> excludedAuthorities = new ArrayList<>();
111
112    public void initAcceptMimes(Intent intent) {
113        if (intent.hasExtra(Intent.EXTRA_MIME_TYPES)) {
114            acceptMimes = intent.getStringArrayExtra(Intent.EXTRA_MIME_TYPES);
115        } else {
116            String glob = intent.getType();
117            acceptMimes = new String[] { glob != null ? glob : "*/*" };
118        }
119    }
120
121    public void onRootChanged(RootInfo root) {
122        if (DEBUG) Log.d(TAG, "Root changed to: " + root);
123        if (!mInitialRootChanged && stack.root != null && !root.equals(stack.root)) {
124            mInitialRootChanged = true;
125        }
126        stack.root = root;
127        stack.clear();
128        mStackTouched = true;
129    }
130
131    public void pushDocument(DocumentInfo info) {
132        if (DEBUG) Log.d(TAG, "Adding doc to stack: " + info);
133        if (!mInitialDocChanged && stack.size() > 0 && !info.equals(stack.peek())) {
134            mInitialDocChanged = true;
135        }
136        stack.push(info);
137        mStackTouched = true;
138    }
139
140    public void popDocument() {
141        if (DEBUG) Log.d(TAG, "Popping doc off stack.");
142        stack.pop();
143        mStackTouched = true;
144    }
145
146    public void setStack(DocumentStack stack) {
147        if (DEBUG) Log.d(TAG, "Setting the whole darn stack to: " + stack);
148        this.stack = stack;
149        mStackTouched = true;
150    }
151
152    public boolean hasLocationChanged() {
153        return mStackTouched;
154    }
155
156    public boolean initialLocationHasChanged() {
157        return mInitialRootChanged || mInitialDocChanged;
158    }
159
160    @Override
161    public int describeContents() {
162        return 0;
163    }
164
165    @Override
166    public void writeToParcel(Parcel out, int flags) {
167        out.writeInt(action);
168        out.writeStringArray(acceptMimes);
169        out.writeInt(userSortOrder);
170        out.writeInt(allowMultiple ? 1 : 0);
171        out.writeInt(forceSize ? 1 : 0);
172        out.writeInt(showSize ? 1 : 0);
173        out.writeInt(localOnly ? 1 : 0);
174        out.writeInt(forceAdvanced ? 1 : 0);
175        out.writeInt(showAdvanced ? 1 : 0);
176        out.writeInt(restored ? 1 : 0);
177        DurableUtils.writeToParcel(out, stack);
178        out.writeString(currentSearch);
179        out.writeMap(dirState);
180        out.writeParcelable(selectedDocuments, 0);
181        out.writeList(selectedDocumentsForCopy);
182        out.writeList(excludedAuthorities);
183        out.writeInt(openableOnly ? 1 : 0);
184        out.writeInt(mStackTouched ? 1 : 0);
185        out.writeInt(mInitialRootChanged ? 1 : 0);
186        out.writeInt(mInitialDocChanged ? 1 : 0);
187    }
188
189    public static final ClassLoaderCreator<State> CREATOR = new ClassLoaderCreator<State>() {
190        @Override
191        public State createFromParcel(Parcel in) {
192            return createFromParcel(in, null);
193        }
194
195        @Override
196        public State createFromParcel(Parcel in, ClassLoader loader) {
197            final State state = new State();
198            state.action = in.readInt();
199            state.acceptMimes = in.readStringArray();
200            state.userSortOrder = in.readInt();
201            state.allowMultiple = in.readInt() != 0;
202            state.forceSize = in.readInt() != 0;
203            state.showSize = in.readInt() != 0;
204            state.localOnly = in.readInt() != 0;
205            state.forceAdvanced = in.readInt() != 0;
206            state.showAdvanced = in.readInt() != 0;
207            state.restored = in.readInt() != 0;
208            DurableUtils.readFromParcel(in, state.stack);
209            state.currentSearch = in.readString();
210            in.readMap(state.dirState, loader);
211            state.selectedDocuments = in.readParcelable(loader);
212            in.readList(state.selectedDocumentsForCopy, loader);
213            in.readList(state.excludedAuthorities, loader);
214            state.openableOnly = in.readInt() != 0;
215            state.mStackTouched = in.readInt() != 0;
216            state.mInitialRootChanged = in.readInt() != 0;
217            state.mInitialDocChanged = in.readInt() != 0;
218            return state;
219        }
220
221        @Override
222        public State[] newArray(int size) {
223            return new State[size];
224        }
225    };
226}
227