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