1 /*
2  * Copyright (C) 2015 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.os.storage;
18 
19 import android.annotation.NonNull;
20 import android.annotation.Nullable;
21 import android.annotation.UserIdInt;
22 import android.os.IVold;
23 
24 import java.util.List;
25 import java.util.Set;
26 
27 /**
28  * Mount service local interface.
29  *
30  * @hide Only for use within the system server.
31  */
32 public abstract class StorageManagerInternal {
33     /**
34      * Gets the mount mode to use for a given UID
35      *
36      * @param uid The UID for which to get mount mode.
37      * @param packageName The package in the UID for making the call.
38      * @return The mount mode.
39      */
getExternalStorageMountMode(int uid, String packageName)40     public abstract int getExternalStorageMountMode(int uid, String packageName);
41 
42     /**
43      * Checks whether the {@code packageName} with {@code uid} has full external storage access via
44      * the {@link MANAGE_EXTERNAL_STORAGE} permission.
45      *
46      * @param uid the UID for which to check access.
47      * @param packageName the package in the UID for making the call.
48      * @return whether the {@code packageName} has full external storage access.
49      * Returns {@code true} if it has access, {@code false} otherwise.
50      */
hasExternalStorageAccess(int uid, String packageName)51     public abstract boolean hasExternalStorageAccess(int uid, String packageName);
52 
53     /**
54      * A listener for reset events in the StorageManagerService.
55      */
56     public interface ResetListener {
57         /**
58          * A method that should be triggered internally by StorageManagerInternal
59          * when StorageManagerService reset happens.
60          *
61          * @param vold The binder object to vold.
62          */
onReset(IVold vold)63         void onReset(IVold vold);
64     }
65 
66     /**
67      * Return true if fuse is mounted.
68      */
isFuseMounted(int userId)69     public abstract boolean isFuseMounted(int userId);
70 
71     /**
72      * Create storage directories if it does not exist.
73      * Return true if the directories were setup correctly, otherwise false.
74      */
prepareStorageDirs(int userId, Set<String> packageList, String processName)75     public abstract boolean prepareStorageDirs(int userId, Set<String> packageList,
76             String processName);
77 
78     /**
79      * Add a listener to listen to reset event in StorageManagerService.
80      *
81      * @param listener The listener that will be notified on reset events.
82      */
addResetListener(ResetListener listener)83     public abstract void addResetListener(ResetListener listener);
84 
85     /**
86      * Notified when any app op changes so that storage mount points can be updated if the app op
87      * affects them.
88      */
onAppOpsChanged(int code, int uid, @Nullable String packageName, int mode, int previousMode)89     public abstract void onAppOpsChanged(int code, int uid,
90             @Nullable String packageName, int mode, int previousMode);
91 
92     /**
93      * Asks the StorageManager to reset all state for the provided user; this will result
94      * in the unmounting for all volumes of the user, and, if the user is still running, the
95      * volumes will be re-mounted as well.
96      *
97      * @param userId the userId for which to reset storage
98      */
resetUser(int userId)99     public abstract void resetUser(int userId);
100 
101     /**
102      * Returns {@code true} if the immediate last installed version of an app with {@code uid} had
103      * legacy storage, {@code false} otherwise.
104      */
hasLegacyExternalStorage(int uid)105     public abstract boolean hasLegacyExternalStorage(int uid);
106 
107     /**
108      * Makes sure app-private data directories on external storage are setup correctly
109      * after an application is installed or upgraded. The main use for this is OBB dirs,
110      * which can be created/modified by the installer.
111      *
112      * @param packageName the package name of the package
113      * @param uid the uid of the package
114      */
prepareAppDataAfterInstall(@onNull String packageName, int uid)115     public abstract void prepareAppDataAfterInstall(@NonNull String packageName, int uid);
116 
117     /**
118      * Return true if uid is external storage service.
119      */
isExternalStorageService(int uid)120     public abstract boolean isExternalStorageService(int uid);
121 
122     /**
123      * Frees cache held by ExternalStorageService.
124      *
125      * <p> Blocks until the service frees the cache or fails in doing so.
126      *
127      * @param volumeUuid uuid of the {@link StorageVolume} from which cache needs to be freed,
128      *                   null value indicates private internal volume.
129      * @param bytes number of bytes which need to be freed
130      */
freeCache(@ullable String volumeUuid, long bytes)131     public abstract void freeCache(@Nullable String volumeUuid, long bytes);
132 
133     /**
134      * Returns the {@link VolumeInfo#getId()} values for the volumes matching
135      * {@link VolumeInfo#isPrimary()}
136      */
getPrimaryVolumeIds()137     public abstract List<String> getPrimaryVolumeIds();
138 
139     /**
140      * Tells StorageManager that CE storage for this user has been prepared.
141      *
142      * @param userId userId for which CE storage has been prepared
143      */
markCeStoragePrepared(@serIdInt int userId)144     public abstract void markCeStoragePrepared(@UserIdInt int userId);
145 
146     /**
147      * Returns true when CE storage for this user has been prepared.
148      *
149      * When the user key is unlocked and CE storage has been prepared,
150      * it's ok to access and modify CE directories on volumes for this user.
151      */
isCeStoragePrepared(@serIdInt int userId)152     public abstract boolean isCeStoragePrepared(@UserIdInt int userId);
153 
154     /**
155      * A listener for changes to the cloud provider.
156      */
157     public interface CloudProviderChangeListener {
158         /**
159          * Triggered when the cloud provider changes. A {@code null} value means there's currently
160          * no cloud provider.
161          */
onCloudProviderChanged(int userId, @Nullable String authority)162         void onCloudProviderChanged(int userId, @Nullable String authority);
163     }
164 
165     /**
166      * Register a {@link CloudProviderChangeListener} to be notified when a cloud media provider
167      * changes. The listener will be called after registration with any currently set cloud media
168      * providers.
169      */
registerCloudProviderChangeListener( @onNull CloudProviderChangeListener listener)170     public abstract void registerCloudProviderChangeListener(
171             @NonNull CloudProviderChangeListener listener);
172 }
173