• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2012 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.commands.settings;
18 
19 import android.app.ActivityManagerNative;
20 import android.app.IActivityManager;
21 import android.app.IActivityManager.ContentProviderHolder;
22 import android.content.IContentProvider;
23 import android.os.Binder;
24 import android.os.Bundle;
25 import android.os.IBinder;
26 import android.os.RemoteException;
27 import android.os.UserHandle;
28 import android.provider.Settings;
29 
30 public final class SettingsCmd {
31     static final String TAG = "settings";
32 
33     enum CommandVerb {
34         UNSPECIFIED,
35         GET,
36         PUT
37     }
38 
39     static String[] mArgs;
40     int mNextArg;
41     int mUser = -1;     // unspecified
42     CommandVerb mVerb = CommandVerb.UNSPECIFIED;
43     String mTable = null;
44     String mKey = null;
45     String mValue = null;
46 
main(String[] args)47     public static void main(String[] args) {
48         if (args == null || args.length < 3) {
49             printUsage();
50             return;
51         }
52 
53         mArgs = args;
54         try {
55             new SettingsCmd().run();
56         } catch (Exception e) {
57             System.err.println("Unable to run settings command");
58         }
59     }
60 
run()61     public void run() {
62         boolean valid = false;
63         String arg;
64         try {
65             while ((arg = nextArg()) != null) {
66                 if ("--user".equals(arg)) {
67                     if (mUser != -1) {
68                         // --user specified more than once; invalid
69                         break;
70                     }
71                     mUser = Integer.parseInt(nextArg());
72                 } else if (mVerb == CommandVerb.UNSPECIFIED) {
73                     if ("get".equalsIgnoreCase(arg)) {
74                         mVerb = CommandVerb.GET;
75                     } else if ("put".equalsIgnoreCase(arg)) {
76                         mVerb = CommandVerb.PUT;
77                     } else {
78                         // invalid
79                         System.err.println("Invalid command: " + arg);
80                         break;
81                     }
82                 } else if (mTable == null) {
83                     if (!"system".equalsIgnoreCase(arg)
84                             && !"secure".equalsIgnoreCase(arg)
85                             && !"global".equalsIgnoreCase(arg)) {
86                         System.err.println("Invalid namespace '" + arg + "'");
87                         break;  // invalid
88                     }
89                     mTable = arg.toLowerCase();
90                 } else if (mVerb == CommandVerb.GET) {
91                     mKey = arg;
92                     if (mNextArg >= mArgs.length) {
93                         valid = true;
94                     } else {
95                         System.err.println("Too many arguments");
96                     }
97                     break;
98                 } else if (mKey == null) {
99                     mKey = arg;
100                     // keep going; there's another PUT arg
101                 } else {    // PUT, final arg
102                     mValue = arg;
103                     if (mNextArg >= mArgs.length) {
104                         valid = true;
105                     } else {
106                         System.err.println("Too many arguments");
107                     }
108                     break;
109                 }
110             }
111         } catch (Exception e) {
112             valid = false;
113         }
114 
115         if (valid) {
116             if (mUser < 0) {
117                 mUser = UserHandle.USER_OWNER;
118             }
119 
120             try {
121                 IActivityManager activityManager = ActivityManagerNative.getDefault();
122                 IContentProvider provider = null;
123                 IBinder token = new Binder();
124                 try {
125                     ContentProviderHolder holder = activityManager.getContentProviderExternal(
126                             "settings", UserHandle.USER_OWNER, token);
127                     if (holder == null) {
128                         throw new IllegalStateException("Could not find settings provider");
129                     }
130                     provider = holder.provider;
131 
132                     switch (mVerb) {
133                         case GET:
134                             System.out.println(getForUser(provider, mUser, mTable, mKey));
135                             break;
136                         case PUT:
137                             putForUser(provider, mUser, mTable, mKey, mValue);
138                             break;
139                         default:
140                             System.err.println("Unspecified command");
141                             break;
142                     }
143 
144                 } finally {
145                     if (provider != null) {
146                         activityManager.removeContentProviderExternal("settings", token);
147                     }
148                 }
149             } catch (Exception e) {
150                 System.err.println("Error while accessing settings provider");
151                 e.printStackTrace();
152             }
153 
154         } else {
155             printUsage();
156         }
157     }
158 
nextArg()159     private String nextArg() {
160         if (mNextArg >= mArgs.length) {
161             return null;
162         }
163         String arg = mArgs[mNextArg];
164         mNextArg++;
165         return arg;
166     }
167 
getForUser(IContentProvider provider, int userHandle, final String table, final String key)168     String getForUser(IContentProvider provider, int userHandle,
169             final String table, final String key) {
170         final String callGetCommand;
171         if ("system".equals(table)) callGetCommand = Settings.CALL_METHOD_GET_SYSTEM;
172         else if ("secure".equals(table)) callGetCommand = Settings.CALL_METHOD_GET_SECURE;
173         else if ("global".equals(table)) callGetCommand = Settings.CALL_METHOD_GET_GLOBAL;
174         else {
175             System.err.println("Invalid table; no put performed");
176             throw new IllegalArgumentException("Invalid table " + table);
177         }
178 
179         String result = null;
180         try {
181             Bundle arg = new Bundle();
182             arg.putInt(Settings.CALL_METHOD_USER_KEY, userHandle);
183             Bundle b = provider.call(null, callGetCommand, key, arg);
184             if (b != null) {
185                 result = b.getPairValue();
186             }
187         } catch (RemoteException e) {
188             System.err.println("Can't read key " + key + " in " + table + " for user " + userHandle);
189         }
190         return result;
191     }
192 
putForUser(IContentProvider provider, int userHandle, final String table, final String key, final String value)193     void putForUser(IContentProvider provider, int userHandle,
194             final String table, final String key, final String value) {
195         final String callPutCommand;
196         if ("system".equals(table)) callPutCommand = Settings.CALL_METHOD_PUT_SYSTEM;
197         else if ("secure".equals(table)) callPutCommand = Settings.CALL_METHOD_PUT_SECURE;
198         else if ("global".equals(table)) callPutCommand = Settings.CALL_METHOD_PUT_GLOBAL;
199         else {
200             System.err.println("Invalid table; no put performed");
201             return;
202         }
203 
204         try {
205             Bundle arg = new Bundle();
206             arg.putString(Settings.NameValueTable.VALUE, value);
207             arg.putInt(Settings.CALL_METHOD_USER_KEY, userHandle);
208             provider.call(null, callPutCommand, key, arg);
209         } catch (RemoteException e) {
210             System.err.println("Can't set key " + key + " in " + table + " for user " + userHandle);
211         }
212     }
213 
printUsage()214     private static void printUsage() {
215         System.err.println("usage:  settings [--user NUM] get namespace key");
216         System.err.println("        settings [--user NUM] put namespace key value");
217         System.err.println("\n'namespace' is one of {system, secure, global}, case-insensitive");
218         System.err.println("If '--user NUM' is not given, the operations are performed on the owner user.");
219     }
220 }
221