ActivityManagerNative.java revision f5b4b98fada53d91c4c2ebeb5a1d33ccc95c94d2
1/*
2 * Copyright (C) 2006 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 android.app;
18
19import android.content.ComponentName;
20import android.content.ContentResolver;
21import android.content.Intent;
22import android.content.IntentFilter;
23import android.content.pm.ConfigurationInfo;
24import android.content.pm.IPackageDataObserver;
25import android.content.res.Configuration;
26import android.graphics.Bitmap;
27import android.net.Uri;
28import android.os.Binder;
29import android.os.Bundle;
30import android.os.Parcelable;
31import android.os.ParcelFileDescriptor;
32import android.os.RemoteException;
33import android.os.IBinder;
34import android.os.Parcel;
35import android.os.ServiceManager;
36import android.text.TextUtils;
37import android.util.Config;
38import android.util.Log;
39
40import java.io.FileNotFoundException;
41import java.io.FileDescriptor;
42import java.io.IOException;
43import java.util.ArrayList;
44import java.util.List;
45
46/** {@hide} */
47public abstract class ActivityManagerNative extends Binder implements IActivityManager
48{
49    /**
50     * Cast a Binder object into an activity manager interface, generating
51     * a proxy if needed.
52     */
53    static public IActivityManager asInterface(IBinder obj)
54    {
55        if (obj == null) {
56            return null;
57        }
58        IActivityManager in =
59            (IActivityManager)obj.queryLocalInterface(descriptor);
60        if (in != null) {
61            return in;
62        }
63
64        return new ActivityManagerProxy(obj);
65    }
66
67    /**
68     * Retrieve the system's default/global activity manager.
69     */
70    static public IActivityManager getDefault()
71    {
72        if (gDefault != null) {
73            //if (Config.LOGV) Log.v(
74            //    "ActivityManager", "returning cur default = " + gDefault);
75            return gDefault;
76        }
77        IBinder b = ServiceManager.getService("activity");
78        if (Config.LOGV) Log.v(
79            "ActivityManager", "default service binder = " + b);
80        gDefault = asInterface(b);
81        if (Config.LOGV) Log.v(
82            "ActivityManager", "default service = " + gDefault);
83        return gDefault;
84    }
85
86    /**
87     * Convenience for checking whether the system is ready.  For internal use only.
88     */
89    static public boolean isSystemReady() {
90        if (!sSystemReady) {
91            sSystemReady = getDefault().testIsSystemReady();
92        }
93        return sSystemReady;
94    }
95    static boolean sSystemReady = false;
96
97    /**
98     * Convenience for sending a sticky broadcast.  For internal use only.
99     * If you don't care about permission, use null.
100     */
101    static public void broadcastStickyIntent(Intent intent, String permission)
102    {
103        try {
104            getDefault().broadcastIntent(
105                null, intent, null, null, Activity.RESULT_OK, null, null,
106                null /*permission*/, false, true);
107        } catch (RemoteException ex) {
108        }
109    }
110
111    static public void noteWakeupAlarm(PendingIntent ps) {
112        try {
113            getDefault().noteWakeupAlarm(ps.getTarget());
114        } catch (RemoteException ex) {
115        }
116    }
117
118    public ActivityManagerNative()
119    {
120        attachInterface(this, descriptor);
121    }
122
123    public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
124            throws RemoteException {
125        switch (code) {
126        case START_ACTIVITY_TRANSACTION:
127        {
128            data.enforceInterface(IActivityManager.descriptor);
129            IBinder b = data.readStrongBinder();
130            IApplicationThread app = ApplicationThreadNative.asInterface(b);
131            Intent intent = Intent.CREATOR.createFromParcel(data);
132            String resolvedType = data.readString();
133            Uri[] grantedUriPermissions = data.createTypedArray(Uri.CREATOR);
134            int grantedMode = data.readInt();
135            IBinder resultTo = data.readStrongBinder();
136            String resultWho = data.readString();
137            int requestCode = data.readInt();
138            boolean onlyIfNeeded = data.readInt() != 0;
139            boolean debug = data.readInt() != 0;
140            int result = startActivity(app, intent, resolvedType,
141                    grantedUriPermissions, grantedMode, resultTo, resultWho,
142                    requestCode, onlyIfNeeded, debug);
143            reply.writeNoException();
144            reply.writeInt(result);
145            return true;
146        }
147
148        case START_NEXT_MATCHING_ACTIVITY_TRANSACTION:
149        {
150            data.enforceInterface(IActivityManager.descriptor);
151            IBinder callingActivity = data.readStrongBinder();
152            Intent intent = Intent.CREATOR.createFromParcel(data);
153            boolean result = startNextMatchingActivity(callingActivity, intent);
154            reply.writeNoException();
155            reply.writeInt(result ? 1 : 0);
156            return true;
157        }
158
159        case FINISH_ACTIVITY_TRANSACTION: {
160            data.enforceInterface(IActivityManager.descriptor);
161            IBinder token = data.readStrongBinder();
162            Intent resultData = null;
163            int resultCode = data.readInt();
164            if (data.readInt() != 0) {
165                resultData = Intent.CREATOR.createFromParcel(data);
166            }
167            boolean res = finishActivity(token, resultCode, resultData);
168            reply.writeNoException();
169            reply.writeInt(res ? 1 : 0);
170            return true;
171        }
172
173        case FINISH_SUB_ACTIVITY_TRANSACTION: {
174            data.enforceInterface(IActivityManager.descriptor);
175            IBinder token = data.readStrongBinder();
176            String resultWho = data.readString();
177            int requestCode = data.readInt();
178            finishSubActivity(token, resultWho, requestCode);
179            reply.writeNoException();
180            return true;
181        }
182
183        case REGISTER_RECEIVER_TRANSACTION:
184        {
185            data.enforceInterface(IActivityManager.descriptor);
186            IBinder b = data.readStrongBinder();
187            IApplicationThread app =
188                b != null ? ApplicationThreadNative.asInterface(b) : null;
189            b = data.readStrongBinder();
190            IIntentReceiver rec
191                = b != null ? IIntentReceiver.Stub.asInterface(b) : null;
192            IntentFilter filter = IntentFilter.CREATOR.createFromParcel(data);
193            String perm = data.readString();
194            Intent intent = registerReceiver(app, rec, filter, perm);
195            reply.writeNoException();
196            if (intent != null) {
197                reply.writeInt(1);
198                intent.writeToParcel(reply, 0);
199            } else {
200                reply.writeInt(0);
201            }
202            return true;
203        }
204
205        case UNREGISTER_RECEIVER_TRANSACTION:
206        {
207            data.enforceInterface(IActivityManager.descriptor);
208            IBinder b = data.readStrongBinder();
209            if (b == null) {
210                return true;
211            }
212            IIntentReceiver rec = IIntentReceiver.Stub.asInterface(b);
213            unregisterReceiver(rec);
214            reply.writeNoException();
215            return true;
216        }
217
218        case BROADCAST_INTENT_TRANSACTION:
219        {
220            data.enforceInterface(IActivityManager.descriptor);
221            IBinder b = data.readStrongBinder();
222            IApplicationThread app =
223                b != null ? ApplicationThreadNative.asInterface(b) : null;
224            Intent intent = Intent.CREATOR.createFromParcel(data);
225            String resolvedType = data.readString();
226            b = data.readStrongBinder();
227            IIntentReceiver resultTo =
228                b != null ? IIntentReceiver.Stub.asInterface(b) : null;
229            int resultCode = data.readInt();
230            String resultData = data.readString();
231            Bundle resultExtras = data.readBundle();
232            String perm = data.readString();
233            boolean serialized = data.readInt() != 0;
234            boolean sticky = data.readInt() != 0;
235            int res = broadcastIntent(app, intent, resolvedType, resultTo,
236                    resultCode, resultData, resultExtras, perm,
237                    serialized, sticky);
238            reply.writeNoException();
239            reply.writeInt(res);
240            return true;
241        }
242
243        case UNBROADCAST_INTENT_TRANSACTION:
244        {
245            data.enforceInterface(IActivityManager.descriptor);
246            IBinder b = data.readStrongBinder();
247            IApplicationThread app = b != null ? ApplicationThreadNative.asInterface(b) : null;
248            Intent intent = Intent.CREATOR.createFromParcel(data);
249            unbroadcastIntent(app, intent);
250            reply.writeNoException();
251            return true;
252        }
253
254        case FINISH_RECEIVER_TRANSACTION: {
255            data.enforceInterface(IActivityManager.descriptor);
256            IBinder who = data.readStrongBinder();
257            int resultCode = data.readInt();
258            String resultData = data.readString();
259            Bundle resultExtras = data.readBundle();
260            boolean resultAbort = data.readInt() != 0;
261            if (who != null) {
262                finishReceiver(who, resultCode, resultData, resultExtras, resultAbort);
263            }
264            reply.writeNoException();
265            return true;
266        }
267
268        case SET_PERSISTENT_TRANSACTION: {
269            data.enforceInterface(IActivityManager.descriptor);
270            IBinder token = data.readStrongBinder();
271            boolean isPersistent = data.readInt() != 0;
272            if (token != null) {
273                setPersistent(token, isPersistent);
274            }
275            reply.writeNoException();
276            return true;
277        }
278
279        case ATTACH_APPLICATION_TRANSACTION: {
280            data.enforceInterface(IActivityManager.descriptor);
281            IApplicationThread app = ApplicationThreadNative.asInterface(
282                    data.readStrongBinder());
283            if (app != null) {
284                attachApplication(app);
285            }
286            reply.writeNoException();
287            return true;
288        }
289
290        case ACTIVITY_IDLE_TRANSACTION: {
291            data.enforceInterface(IActivityManager.descriptor);
292            IBinder token = data.readStrongBinder();
293            if (token != null) {
294                activityIdle(token);
295            }
296            reply.writeNoException();
297            return true;
298        }
299
300        case ACTIVITY_PAUSED_TRANSACTION: {
301            data.enforceInterface(IActivityManager.descriptor);
302            IBinder token = data.readStrongBinder();
303            Bundle map = data.readBundle();
304            activityPaused(token, map);
305            reply.writeNoException();
306            return true;
307        }
308
309        case ACTIVITY_STOPPED_TRANSACTION: {
310            data.enforceInterface(IActivityManager.descriptor);
311            IBinder token = data.readStrongBinder();
312            Bitmap thumbnail = data.readInt() != 0
313                ? Bitmap.CREATOR.createFromParcel(data) : null;
314            CharSequence description = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(data);
315            activityStopped(token, thumbnail, description);
316            reply.writeNoException();
317            return true;
318        }
319
320        case ACTIVITY_DESTROYED_TRANSACTION: {
321            data.enforceInterface(IActivityManager.descriptor);
322            IBinder token = data.readStrongBinder();
323            activityDestroyed(token);
324            reply.writeNoException();
325            return true;
326        }
327
328        case GET_CALLING_PACKAGE_TRANSACTION: {
329            data.enforceInterface(IActivityManager.descriptor);
330            IBinder token = data.readStrongBinder();
331            String res = token != null ? getCallingPackage(token) : null;
332            reply.writeNoException();
333            reply.writeString(res);
334            return true;
335        }
336
337        case GET_CALLING_ACTIVITY_TRANSACTION: {
338            data.enforceInterface(IActivityManager.descriptor);
339            IBinder token = data.readStrongBinder();
340            ComponentName cn = getCallingActivity(token);
341            reply.writeNoException();
342            ComponentName.writeToParcel(cn, reply);
343            return true;
344        }
345
346        case GET_TASKS_TRANSACTION: {
347            data.enforceInterface(IActivityManager.descriptor);
348            int maxNum = data.readInt();
349            int fl = data.readInt();
350            IBinder receiverBinder = data.readStrongBinder();
351            IThumbnailReceiver receiver = receiverBinder != null
352                ? IThumbnailReceiver.Stub.asInterface(receiverBinder)
353                : null;
354            List list = getTasks(maxNum, fl, receiver);
355            reply.writeNoException();
356            int N = list != null ? list.size() : -1;
357            reply.writeInt(N);
358            int i;
359            for (i=0; i<N; i++) {
360                ActivityManager.RunningTaskInfo info =
361                        (ActivityManager.RunningTaskInfo)list.get(i);
362                info.writeToParcel(reply, 0);
363            }
364            return true;
365        }
366
367        case GET_RECENT_TASKS_TRANSACTION: {
368            data.enforceInterface(IActivityManager.descriptor);
369            int maxNum = data.readInt();
370            int fl = data.readInt();
371            List<ActivityManager.RecentTaskInfo> list = getRecentTasks(maxNum,
372                    fl);
373            reply.writeNoException();
374            reply.writeTypedList(list);
375            return true;
376        }
377
378        case GET_SERVICES_TRANSACTION: {
379            data.enforceInterface(IActivityManager.descriptor);
380            int maxNum = data.readInt();
381            int fl = data.readInt();
382            List list = getServices(maxNum, fl);
383            reply.writeNoException();
384            int N = list != null ? list.size() : -1;
385            reply.writeInt(N);
386            int i;
387            for (i=0; i<N; i++) {
388                ActivityManager.RunningServiceInfo info =
389                        (ActivityManager.RunningServiceInfo)list.get(i);
390                info.writeToParcel(reply, 0);
391            }
392            return true;
393        }
394
395        case GET_PROCESSES_IN_ERROR_STATE_TRANSACTION: {
396            data.enforceInterface(IActivityManager.descriptor);
397            List<ActivityManager.ProcessErrorStateInfo> list = getProcessesInErrorState();
398            reply.writeNoException();
399            reply.writeTypedList(list);
400            return true;
401        }
402
403        case GET_RUNNING_APP_PROCESSES_TRANSACTION: {
404            data.enforceInterface(IActivityManager.descriptor);
405            List<ActivityManager.RunningAppProcessInfo> list = getRunningAppProcesses();
406            reply.writeNoException();
407            reply.writeTypedList(list);
408            return true;
409        }
410
411        case MOVE_TASK_TO_FRONT_TRANSACTION: {
412            data.enforceInterface(IActivityManager.descriptor);
413            int task = data.readInt();
414            moveTaskToFront(task);
415            reply.writeNoException();
416            return true;
417        }
418
419        case MOVE_TASK_TO_BACK_TRANSACTION: {
420            data.enforceInterface(IActivityManager.descriptor);
421            int task = data.readInt();
422            moveTaskToBack(task);
423            reply.writeNoException();
424            return true;
425        }
426
427        case MOVE_ACTIVITY_TASK_TO_BACK_TRANSACTION: {
428            data.enforceInterface(IActivityManager.descriptor);
429            IBinder token = data.readStrongBinder();
430            boolean nonRoot = data.readInt() != 0;
431            boolean res = moveActivityTaskToBack(token, nonRoot);
432            reply.writeNoException();
433            reply.writeInt(res ? 1 : 0);
434            return true;
435        }
436
437        case MOVE_TASK_BACKWARDS_TRANSACTION: {
438            data.enforceInterface(IActivityManager.descriptor);
439            int task = data.readInt();
440            moveTaskBackwards(task);
441            reply.writeNoException();
442            return true;
443        }
444
445        case GET_TASK_FOR_ACTIVITY_TRANSACTION: {
446            data.enforceInterface(IActivityManager.descriptor);
447            IBinder token = data.readStrongBinder();
448            boolean onlyRoot = data.readInt() != 0;
449            int res = token != null
450                ? getTaskForActivity(token, onlyRoot) : -1;
451                reply.writeNoException();
452            reply.writeInt(res);
453            return true;
454        }
455
456        case FINISH_OTHER_INSTANCES_TRANSACTION: {
457            data.enforceInterface(IActivityManager.descriptor);
458            IBinder token = data.readStrongBinder();
459            ComponentName className = ComponentName.readFromParcel(data);
460            finishOtherInstances(token, className);
461            reply.writeNoException();
462            return true;
463        }
464
465        case REPORT_THUMBNAIL_TRANSACTION: {
466            data.enforceInterface(IActivityManager.descriptor);
467            IBinder token = data.readStrongBinder();
468            Bitmap thumbnail = data.readInt() != 0
469                ? Bitmap.CREATOR.createFromParcel(data) : null;
470            CharSequence description = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(data);
471            reportThumbnail(token, thumbnail, description);
472            reply.writeNoException();
473            return true;
474        }
475
476        case GET_CONTENT_PROVIDER_TRANSACTION: {
477            data.enforceInterface(IActivityManager.descriptor);
478            IBinder b = data.readStrongBinder();
479            IApplicationThread app = ApplicationThreadNative.asInterface(b);
480            String name = data.readString();
481            ContentProviderHolder cph = getContentProvider(app, name);
482            reply.writeNoException();
483            if (cph != null) {
484                reply.writeInt(1);
485                cph.writeToParcel(reply, 0);
486            } else {
487                reply.writeInt(0);
488            }
489            return true;
490        }
491
492        case PUBLISH_CONTENT_PROVIDERS_TRANSACTION: {
493            data.enforceInterface(IActivityManager.descriptor);
494            IBinder b = data.readStrongBinder();
495            IApplicationThread app = ApplicationThreadNative.asInterface(b);
496            ArrayList<ContentProviderHolder> providers =
497                data.createTypedArrayList(ContentProviderHolder.CREATOR);
498            publishContentProviders(app, providers);
499            reply.writeNoException();
500            return true;
501        }
502
503        case REMOVE_CONTENT_PROVIDER_TRANSACTION: {
504            data.enforceInterface(IActivityManager.descriptor);
505            IBinder b = data.readStrongBinder();
506            IApplicationThread app = ApplicationThreadNative.asInterface(b);
507            String name = data.readString();
508            removeContentProvider(app, name);
509            reply.writeNoException();
510            return true;
511        }
512
513        case START_SERVICE_TRANSACTION: {
514            data.enforceInterface(IActivityManager.descriptor);
515            IBinder b = data.readStrongBinder();
516            IApplicationThread app = ApplicationThreadNative.asInterface(b);
517            Intent service = Intent.CREATOR.createFromParcel(data);
518            String resolvedType = data.readString();
519            ComponentName cn = startService(app, service, resolvedType);
520            reply.writeNoException();
521            ComponentName.writeToParcel(cn, reply);
522            return true;
523        }
524
525        case STOP_SERVICE_TRANSACTION: {
526            data.enforceInterface(IActivityManager.descriptor);
527            IBinder b = data.readStrongBinder();
528            IApplicationThread app = ApplicationThreadNative.asInterface(b);
529            Intent service = Intent.CREATOR.createFromParcel(data);
530            String resolvedType = data.readString();
531            int res = stopService(app, service, resolvedType);
532            reply.writeNoException();
533            reply.writeInt(res);
534            return true;
535        }
536
537        case STOP_SERVICE_TOKEN_TRANSACTION: {
538            data.enforceInterface(IActivityManager.descriptor);
539            ComponentName className = ComponentName.readFromParcel(data);
540            IBinder token = data.readStrongBinder();
541            int startId = data.readInt();
542            boolean res = stopServiceToken(className, token, startId);
543            reply.writeNoException();
544            reply.writeInt(res ? 1 : 0);
545            return true;
546        }
547
548        case SET_SERVICE_FOREGROUND_TRANSACTION: {
549            data.enforceInterface(IActivityManager.descriptor);
550            ComponentName className = ComponentName.readFromParcel(data);
551            IBinder token = data.readStrongBinder();
552            boolean isForeground = data.readInt() != 0;
553            setServiceForeground(className, token, isForeground);
554            reply.writeNoException();
555            return true;
556        }
557
558        case BIND_SERVICE_TRANSACTION: {
559            data.enforceInterface(IActivityManager.descriptor);
560            IBinder b = data.readStrongBinder();
561            IApplicationThread app = ApplicationThreadNative.asInterface(b);
562            IBinder token = data.readStrongBinder();
563            Intent service = Intent.CREATOR.createFromParcel(data);
564            String resolvedType = data.readString();
565            b = data.readStrongBinder();
566            int fl = data.readInt();
567            IServiceConnection conn = IServiceConnection.Stub.asInterface(b);
568            int res = bindService(app, token, service, resolvedType, conn, fl);
569            reply.writeNoException();
570            reply.writeInt(res);
571            return true;
572        }
573
574        case UNBIND_SERVICE_TRANSACTION: {
575            data.enforceInterface(IActivityManager.descriptor);
576            IBinder b = data.readStrongBinder();
577            IServiceConnection conn = IServiceConnection.Stub.asInterface(b);
578            boolean res = unbindService(conn);
579            reply.writeNoException();
580            reply.writeInt(res ? 1 : 0);
581            return true;
582        }
583
584        case PUBLISH_SERVICE_TRANSACTION: {
585            data.enforceInterface(IActivityManager.descriptor);
586            IBinder token = data.readStrongBinder();
587            Intent intent = Intent.CREATOR.createFromParcel(data);
588            IBinder service = data.readStrongBinder();
589            publishService(token, intent, service);
590            reply.writeNoException();
591            return true;
592        }
593
594        case UNBIND_FINISHED_TRANSACTION: {
595            data.enforceInterface(IActivityManager.descriptor);
596            IBinder token = data.readStrongBinder();
597            Intent intent = Intent.CREATOR.createFromParcel(data);
598            boolean doRebind = data.readInt() != 0;
599            unbindFinished(token, intent, doRebind);
600            reply.writeNoException();
601            return true;
602        }
603
604        case SERVICE_DONE_EXECUTING_TRANSACTION: {
605            data.enforceInterface(IActivityManager.descriptor);
606            IBinder token = data.readStrongBinder();
607            serviceDoneExecuting(token);
608            reply.writeNoException();
609            return true;
610        }
611
612        case START_INSTRUMENTATION_TRANSACTION: {
613            data.enforceInterface(IActivityManager.descriptor);
614            ComponentName className = ComponentName.readFromParcel(data);
615            String profileFile = data.readString();
616            int fl = data.readInt();
617            Bundle arguments = data.readBundle();
618            IBinder b = data.readStrongBinder();
619            IInstrumentationWatcher w = IInstrumentationWatcher.Stub.asInterface(b);
620            boolean res = startInstrumentation(className, profileFile, fl, arguments, w);
621            reply.writeNoException();
622            reply.writeInt(res ? 1 : 0);
623            return true;
624        }
625
626
627        case FINISH_INSTRUMENTATION_TRANSACTION: {
628            data.enforceInterface(IActivityManager.descriptor);
629            IBinder b = data.readStrongBinder();
630            IApplicationThread app = ApplicationThreadNative.asInterface(b);
631            int resultCode = data.readInt();
632            Bundle results = data.readBundle();
633            finishInstrumentation(app, resultCode, results);
634            reply.writeNoException();
635            return true;
636        }
637
638        case GET_CONFIGURATION_TRANSACTION: {
639            data.enforceInterface(IActivityManager.descriptor);
640            Configuration config = getConfiguration();
641            reply.writeNoException();
642            config.writeToParcel(reply, 0);
643            return true;
644        }
645
646        case UPDATE_CONFIGURATION_TRANSACTION: {
647            data.enforceInterface(IActivityManager.descriptor);
648            Configuration config = Configuration.CREATOR.createFromParcel(data);
649            updateConfiguration(config);
650            reply.writeNoException();
651            return true;
652        }
653
654        case SET_REQUESTED_ORIENTATION_TRANSACTION: {
655            data.enforceInterface(IActivityManager.descriptor);
656            IBinder token = data.readStrongBinder();
657            int requestedOrientation = data.readInt();
658            setRequestedOrientation(token, requestedOrientation);
659            reply.writeNoException();
660            return true;
661        }
662
663        case GET_REQUESTED_ORIENTATION_TRANSACTION: {
664            data.enforceInterface(IActivityManager.descriptor);
665            IBinder token = data.readStrongBinder();
666            int req = getRequestedOrientation(token);
667            reply.writeNoException();
668            reply.writeInt(req);
669            return true;
670        }
671
672        case GET_ACTIVITY_CLASS_FOR_TOKEN_TRANSACTION: {
673            data.enforceInterface(IActivityManager.descriptor);
674            IBinder token = data.readStrongBinder();
675            ComponentName cn = getActivityClassForToken(token);
676            reply.writeNoException();
677            ComponentName.writeToParcel(cn, reply);
678            return true;
679        }
680
681        case GET_PACKAGE_FOR_TOKEN_TRANSACTION: {
682            data.enforceInterface(IActivityManager.descriptor);
683            IBinder token = data.readStrongBinder();
684            reply.writeNoException();
685            reply.writeString(getPackageForToken(token));
686            return true;
687        }
688
689        case GET_INTENT_SENDER_TRANSACTION: {
690            data.enforceInterface(IActivityManager.descriptor);
691            int type = data.readInt();
692            String packageName = data.readString();
693            IBinder token = data.readStrongBinder();
694            String resultWho = data.readString();
695            int requestCode = data.readInt();
696            Intent requestIntent = data.readInt() != 0
697                    ? Intent.CREATOR.createFromParcel(data) : null;
698            String requestResolvedType = data.readString();
699            int fl = data.readInt();
700            IIntentSender res = getIntentSender(type, packageName, token,
701                    resultWho, requestCode, requestIntent,
702                    requestResolvedType, fl);
703            reply.writeNoException();
704            reply.writeStrongBinder(res != null ? res.asBinder() : null);
705            return true;
706        }
707
708        case CANCEL_INTENT_SENDER_TRANSACTION: {
709            data.enforceInterface(IActivityManager.descriptor);
710            IIntentSender r = IIntentSender.Stub.asInterface(
711                data.readStrongBinder());
712            cancelIntentSender(r);
713            reply.writeNoException();
714            return true;
715        }
716
717        case GET_PACKAGE_FOR_INTENT_SENDER_TRANSACTION: {
718            data.enforceInterface(IActivityManager.descriptor);
719            IIntentSender r = IIntentSender.Stub.asInterface(
720                data.readStrongBinder());
721            String res = getPackageForIntentSender(r);
722            reply.writeNoException();
723            reply.writeString(res);
724            return true;
725        }
726
727        case SET_PROCESS_LIMIT_TRANSACTION: {
728            data.enforceInterface(IActivityManager.descriptor);
729            int max = data.readInt();
730            setProcessLimit(max);
731            reply.writeNoException();
732            return true;
733        }
734
735        case GET_PROCESS_LIMIT_TRANSACTION: {
736            data.enforceInterface(IActivityManager.descriptor);
737            int limit = getProcessLimit();
738            reply.writeNoException();
739            reply.writeInt(limit);
740            return true;
741        }
742
743        case SET_PROCESS_FOREGROUND_TRANSACTION: {
744            data.enforceInterface(IActivityManager.descriptor);
745            IBinder token = data.readStrongBinder();
746            int pid = data.readInt();
747            boolean isForeground = data.readInt() != 0;
748            setProcessForeground(token, pid, isForeground);
749            reply.writeNoException();
750            return true;
751        }
752
753        case CHECK_PERMISSION_TRANSACTION: {
754            data.enforceInterface(IActivityManager.descriptor);
755            String perm = data.readString();
756            int pid = data.readInt();
757            int uid = data.readInt();
758            int res = checkPermission(perm, pid, uid);
759            reply.writeNoException();
760            reply.writeInt(res);
761            return true;
762        }
763
764        case CHECK_URI_PERMISSION_TRANSACTION: {
765            data.enforceInterface(IActivityManager.descriptor);
766            Uri uri = Uri.CREATOR.createFromParcel(data);
767            int pid = data.readInt();
768            int uid = data.readInt();
769            int mode = data.readInt();
770            int res = checkUriPermission(uri, pid, uid, mode);
771            reply.writeNoException();
772            reply.writeInt(res);
773            return true;
774        }
775
776        case CLEAR_APP_DATA_TRANSACTION: {
777            data.enforceInterface(IActivityManager.descriptor);
778            String packageName = data.readString();
779            IPackageDataObserver observer = IPackageDataObserver.Stub.asInterface(
780                    data.readStrongBinder());
781            boolean res = clearApplicationUserData(packageName, observer);
782            reply.writeNoException();
783            reply.writeInt(res ? 1 : 0);
784            return true;
785        }
786
787        case GRANT_URI_PERMISSION_TRANSACTION: {
788            data.enforceInterface(IActivityManager.descriptor);
789            IBinder b = data.readStrongBinder();
790            IApplicationThread app = ApplicationThreadNative.asInterface(b);
791            String targetPkg = data.readString();
792            Uri uri = Uri.CREATOR.createFromParcel(data);
793            int mode = data.readInt();
794            grantUriPermission(app, targetPkg, uri, mode);
795            reply.writeNoException();
796            return true;
797        }
798
799        case REVOKE_URI_PERMISSION_TRANSACTION: {
800            data.enforceInterface(IActivityManager.descriptor);
801            IBinder b = data.readStrongBinder();
802            IApplicationThread app = ApplicationThreadNative.asInterface(b);
803            Uri uri = Uri.CREATOR.createFromParcel(data);
804            int mode = data.readInt();
805            revokeUriPermission(app, uri, mode);
806            reply.writeNoException();
807            return true;
808        }
809
810        case SHOW_WAITING_FOR_DEBUGGER_TRANSACTION: {
811            data.enforceInterface(IActivityManager.descriptor);
812            IBinder b = data.readStrongBinder();
813            IApplicationThread app = ApplicationThreadNative.asInterface(b);
814            boolean waiting = data.readInt() != 0;
815            showWaitingForDebugger(app, waiting);
816            reply.writeNoException();
817            return true;
818        }
819
820        case GET_MEMORY_INFO_TRANSACTION: {
821            data.enforceInterface(IActivityManager.descriptor);
822            ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();
823            getMemoryInfo(mi);
824            reply.writeNoException();
825            mi.writeToParcel(reply, 0);
826            return true;
827        }
828
829        case UNHANDLED_BACK_TRANSACTION: {
830            data.enforceInterface(IActivityManager.descriptor);
831            unhandledBack();
832            reply.writeNoException();
833            return true;
834        }
835
836        case OPEN_CONTENT_URI_TRANSACTION: {
837            data.enforceInterface(IActivityManager.descriptor);
838            Uri uri = Uri.parse(data.readString());
839            ParcelFileDescriptor pfd = openContentUri(uri);
840            reply.writeNoException();
841            if (pfd != null) {
842                reply.writeInt(1);
843                pfd.writeToParcel(reply, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
844            } else {
845                reply.writeInt(0);
846            }
847            return true;
848        }
849
850        case GOING_TO_SLEEP_TRANSACTION: {
851            data.enforceInterface(IActivityManager.descriptor);
852            goingToSleep();
853            reply.writeNoException();
854            return true;
855        }
856
857        case WAKING_UP_TRANSACTION: {
858            data.enforceInterface(IActivityManager.descriptor);
859            wakingUp();
860            reply.writeNoException();
861            return true;
862        }
863
864        case SET_DEBUG_APP_TRANSACTION: {
865            data.enforceInterface(IActivityManager.descriptor);
866            String pn = data.readString();
867            boolean wfd = data.readInt() != 0;
868            boolean per = data.readInt() != 0;
869            setDebugApp(pn, wfd, per);
870            reply.writeNoException();
871            return true;
872        }
873
874        case SET_ALWAYS_FINISH_TRANSACTION: {
875            data.enforceInterface(IActivityManager.descriptor);
876            boolean enabled = data.readInt() != 0;
877            setAlwaysFinish(enabled);
878            reply.writeNoException();
879            return true;
880        }
881
882        case SET_ACTIVITY_WATCHER_TRANSACTION: {
883            data.enforceInterface(IActivityManager.descriptor);
884            IActivityWatcher watcher = IActivityWatcher.Stub.asInterface(
885                    data.readStrongBinder());
886            setActivityWatcher(watcher);
887            return true;
888        }
889
890        case ENTER_SAFE_MODE_TRANSACTION: {
891            data.enforceInterface(IActivityManager.descriptor);
892            enterSafeMode();
893            reply.writeNoException();
894            return true;
895        }
896
897        case NOTE_WAKEUP_ALARM_TRANSACTION: {
898            data.enforceInterface(IActivityManager.descriptor);
899            IIntentSender is = IIntentSender.Stub.asInterface(
900                    data.readStrongBinder());
901            noteWakeupAlarm(is);
902            reply.writeNoException();
903            return true;
904        }
905
906        case KILL_PIDS_FOR_MEMORY_TRANSACTION: {
907            data.enforceInterface(IActivityManager.descriptor);
908            int[] pids = data.createIntArray();
909            boolean res = killPidsForMemory(pids);
910            reply.writeNoException();
911            reply.writeInt(res ? 1 : 0);
912            return true;
913        }
914
915        case REPORT_PSS_TRANSACTION: {
916            data.enforceInterface(IActivityManager.descriptor);
917            IBinder b = data.readStrongBinder();
918            IApplicationThread app = ApplicationThreadNative.asInterface(b);
919            int pss = data.readInt();
920            reportPss(app, pss);
921            reply.writeNoException();
922            return true;
923        }
924
925        case START_RUNNING_TRANSACTION: {
926            data.enforceInterface(IActivityManager.descriptor);
927            String pkg = data.readString();
928            String cls = data.readString();
929            String action = data.readString();
930            String indata = data.readString();
931            startRunning(pkg, cls, action, indata);
932            reply.writeNoException();
933            return true;
934        }
935
936        case SYSTEM_READY_TRANSACTION: {
937            data.enforceInterface(IActivityManager.descriptor);
938            systemReady();
939            reply.writeNoException();
940            return true;
941        }
942
943        case HANDLE_APPLICATION_ERROR_TRANSACTION: {
944            data.enforceInterface(IActivityManager.descriptor);
945            IBinder app = data.readStrongBinder();
946            int fl = data.readInt();
947            String tag = data.readString();
948            String shortMsg = data.readString();
949            String longMsg = data.readString();
950            byte[] crashData = data.createByteArray();
951            int res = handleApplicationError(app, fl, tag, shortMsg, longMsg,
952                    crashData);
953            reply.writeNoException();
954            reply.writeInt(res);
955            return true;
956        }
957
958        case SIGNAL_PERSISTENT_PROCESSES_TRANSACTION: {
959            data.enforceInterface(IActivityManager.descriptor);
960            int sig = data.readInt();
961            signalPersistentProcesses(sig);
962            reply.writeNoException();
963            return true;
964        }
965
966        case RESTART_PACKAGE_TRANSACTION: {
967            data.enforceInterface(IActivityManager.descriptor);
968            String packageName = data.readString();
969            restartPackage(packageName);
970            reply.writeNoException();
971            return true;
972        }
973
974        case GET_DEVICE_CONFIGURATION_TRANSACTION: {
975            data.enforceInterface(IActivityManager.descriptor);
976            ConfigurationInfo config = getDeviceConfigurationInfo();
977            reply.writeNoException();
978            config.writeToParcel(reply, 0);
979            return true;
980        }
981
982        case PROFILE_CONTROL_TRANSACTION: {
983            data.enforceInterface(IActivityManager.descriptor);
984            String process = data.readString();
985            boolean start = data.readInt() != 0;
986            String path = data.readString();
987            boolean res = profileControl(process, start, path);
988            reply.writeNoException();
989            reply.writeInt(res ? 1 : 0);
990            return true;
991        }
992
993        case PEEK_SERVICE_TRANSACTION: {
994            data.enforceInterface(IActivityManager.descriptor);
995            Intent service = Intent.CREATOR.createFromParcel(data);
996            String resolvedType = data.readString();
997            IBinder binder = peekService(service, resolvedType);
998            reply.writeNoException();
999            reply.writeStrongBinder(binder);
1000            return true;
1001        }
1002        }
1003
1004        return super.onTransact(code, data, reply, flags);
1005    }
1006
1007    public IBinder asBinder()
1008    {
1009        return this;
1010    }
1011
1012    private static IActivityManager gDefault;
1013}
1014
1015class ActivityManagerProxy implements IActivityManager
1016{
1017    public ActivityManagerProxy(IBinder remote)
1018    {
1019        mRemote = remote;
1020    }
1021
1022    public IBinder asBinder()
1023    {
1024        return mRemote;
1025    }
1026
1027    public int startActivity(IApplicationThread caller, Intent intent,
1028            String resolvedType, Uri[] grantedUriPermissions, int grantedMode,
1029            IBinder resultTo, String resultWho,
1030            int requestCode, boolean onlyIfNeeded,
1031            boolean debug) throws RemoteException {
1032        Parcel data = Parcel.obtain();
1033        Parcel reply = Parcel.obtain();
1034        data.writeInterfaceToken(IActivityManager.descriptor);
1035        data.writeStrongBinder(caller != null ? caller.asBinder() : null);
1036        intent.writeToParcel(data, 0);
1037        data.writeString(resolvedType);
1038        data.writeTypedArray(grantedUriPermissions, 0);
1039        data.writeInt(grantedMode);
1040        data.writeStrongBinder(resultTo);
1041        data.writeString(resultWho);
1042        data.writeInt(requestCode);
1043        data.writeInt(onlyIfNeeded ? 1 : 0);
1044        data.writeInt(debug ? 1 : 0);
1045        mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0);
1046        reply.readException();
1047        int result = reply.readInt();
1048        reply.recycle();
1049        data.recycle();
1050        return result;
1051    }
1052    public boolean startNextMatchingActivity(IBinder callingActivity,
1053            Intent intent) throws RemoteException {
1054        Parcel data = Parcel.obtain();
1055        Parcel reply = Parcel.obtain();
1056        data.writeInterfaceToken(IActivityManager.descriptor);
1057        data.writeStrongBinder(callingActivity);
1058        intent.writeToParcel(data, 0);
1059        mRemote.transact(START_NEXT_MATCHING_ACTIVITY_TRANSACTION, data, reply, 0);
1060        reply.readException();
1061        int result = reply.readInt();
1062        reply.recycle();
1063        data.recycle();
1064        return result != 0;
1065    }
1066    public boolean finishActivity(IBinder token, int resultCode, Intent resultData)
1067            throws RemoteException {
1068        Parcel data = Parcel.obtain();
1069        Parcel reply = Parcel.obtain();
1070        data.writeInterfaceToken(IActivityManager.descriptor);
1071        data.writeStrongBinder(token);
1072        data.writeInt(resultCode);
1073        if (resultData != null) {
1074            data.writeInt(1);
1075            resultData.writeToParcel(data, 0);
1076        } else {
1077            data.writeInt(0);
1078        }
1079        mRemote.transact(FINISH_ACTIVITY_TRANSACTION, data, reply, 0);
1080        reply.readException();
1081        boolean res = reply.readInt() != 0;
1082        data.recycle();
1083        reply.recycle();
1084        return res;
1085    }
1086    public void finishSubActivity(IBinder token, String resultWho, int requestCode) throws RemoteException
1087    {
1088        Parcel data = Parcel.obtain();
1089        Parcel reply = Parcel.obtain();
1090        data.writeInterfaceToken(IActivityManager.descriptor);
1091        data.writeStrongBinder(token);
1092        data.writeString(resultWho);
1093        data.writeInt(requestCode);
1094        mRemote.transact(FINISH_SUB_ACTIVITY_TRANSACTION, data, reply, 0);
1095        reply.readException();
1096        data.recycle();
1097        reply.recycle();
1098    }
1099    public Intent registerReceiver(IApplicationThread caller,
1100            IIntentReceiver receiver,
1101            IntentFilter filter, String perm) throws RemoteException
1102    {
1103        Parcel data = Parcel.obtain();
1104        Parcel reply = Parcel.obtain();
1105        data.writeInterfaceToken(IActivityManager.descriptor);
1106        data.writeStrongBinder(caller != null ? caller.asBinder() : null);
1107        data.writeStrongBinder(receiver != null ? receiver.asBinder() : null);
1108        filter.writeToParcel(data, 0);
1109        data.writeString(perm);
1110        mRemote.transact(REGISTER_RECEIVER_TRANSACTION, data, reply, 0);
1111        reply.readException();
1112        Intent intent = null;
1113        int haveIntent = reply.readInt();
1114        if (haveIntent != 0) {
1115            intent = Intent.CREATOR.createFromParcel(reply);
1116        }
1117        reply.recycle();
1118        data.recycle();
1119        return intent;
1120    }
1121    public void unregisterReceiver(IIntentReceiver receiver) throws RemoteException
1122    {
1123        Parcel data = Parcel.obtain();
1124        Parcel reply = Parcel.obtain();
1125        data.writeInterfaceToken(IActivityManager.descriptor);
1126        data.writeStrongBinder(receiver.asBinder());
1127        mRemote.transact(UNREGISTER_RECEIVER_TRANSACTION, data, reply, 0);
1128        reply.readException();
1129        data.recycle();
1130        reply.recycle();
1131    }
1132    public int broadcastIntent(IApplicationThread caller,
1133            Intent intent, String resolvedType,  IIntentReceiver resultTo,
1134            int resultCode, String resultData, Bundle map,
1135            String requiredPermission, boolean serialized,
1136            boolean sticky) throws RemoteException
1137    {
1138        Parcel data = Parcel.obtain();
1139        Parcel reply = Parcel.obtain();
1140        data.writeInterfaceToken(IActivityManager.descriptor);
1141        data.writeStrongBinder(caller != null ? caller.asBinder() : null);
1142        intent.writeToParcel(data, 0);
1143        data.writeString(resolvedType);
1144        data.writeStrongBinder(resultTo != null ? resultTo.asBinder() : null);
1145        data.writeInt(resultCode);
1146        data.writeString(resultData);
1147        data.writeBundle(map);
1148        data.writeString(requiredPermission);
1149        data.writeInt(serialized ? 1 : 0);
1150        data.writeInt(sticky ? 1 : 0);
1151        mRemote.transact(BROADCAST_INTENT_TRANSACTION, data, reply, 0);
1152        reply.readException();
1153        int res = reply.readInt();
1154        reply.recycle();
1155        data.recycle();
1156        return res;
1157    }
1158    public void unbroadcastIntent(IApplicationThread caller, Intent intent) throws RemoteException
1159    {
1160        Parcel data = Parcel.obtain();
1161        Parcel reply = Parcel.obtain();
1162        data.writeInterfaceToken(IActivityManager.descriptor);
1163        data.writeStrongBinder(caller != null ? caller.asBinder() : null);
1164        intent.writeToParcel(data, 0);
1165        mRemote.transact(UNBROADCAST_INTENT_TRANSACTION, data, reply, 0);
1166        reply.readException();
1167        data.recycle();
1168        reply.recycle();
1169    }
1170    public void finishReceiver(IBinder who, int resultCode, String resultData, Bundle map, boolean abortBroadcast) throws RemoteException
1171    {
1172        Parcel data = Parcel.obtain();
1173        Parcel reply = Parcel.obtain();
1174        data.writeInterfaceToken(IActivityManager.descriptor);
1175        data.writeStrongBinder(who);
1176        data.writeInt(resultCode);
1177        data.writeString(resultData);
1178        data.writeBundle(map);
1179        data.writeInt(abortBroadcast ? 1 : 0);
1180        mRemote.transact(FINISH_RECEIVER_TRANSACTION, data, reply, IBinder.FLAG_ONEWAY);
1181        reply.readException();
1182        data.recycle();
1183        reply.recycle();
1184    }
1185    public void setPersistent(IBinder token, boolean isPersistent) throws RemoteException
1186    {
1187        Parcel data = Parcel.obtain();
1188        Parcel reply = Parcel.obtain();
1189        data.writeInterfaceToken(IActivityManager.descriptor);
1190        data.writeStrongBinder(token);
1191        data.writeInt(isPersistent ? 1 : 0);
1192        mRemote.transact(SET_PERSISTENT_TRANSACTION, data, reply, 0);
1193        reply.readException();
1194        data.recycle();
1195        reply.recycle();
1196    }
1197    public void attachApplication(IApplicationThread app) throws RemoteException
1198    {
1199        Parcel data = Parcel.obtain();
1200        Parcel reply = Parcel.obtain();
1201        data.writeInterfaceToken(IActivityManager.descriptor);
1202        data.writeStrongBinder(app.asBinder());
1203        mRemote.transact(ATTACH_APPLICATION_TRANSACTION, data, reply, 0);
1204        reply.readException();
1205        data.recycle();
1206        reply.recycle();
1207    }
1208    public void activityIdle(IBinder token) throws RemoteException
1209    {
1210        Parcel data = Parcel.obtain();
1211        Parcel reply = Parcel.obtain();
1212        data.writeInterfaceToken(IActivityManager.descriptor);
1213        data.writeStrongBinder(token);
1214        mRemote.transact(ACTIVITY_IDLE_TRANSACTION, data, reply, IBinder.FLAG_ONEWAY);
1215        reply.readException();
1216        data.recycle();
1217        reply.recycle();
1218    }
1219    public void activityPaused(IBinder token, Bundle state) throws RemoteException
1220    {
1221        Parcel data = Parcel.obtain();
1222        Parcel reply = Parcel.obtain();
1223        data.writeInterfaceToken(IActivityManager.descriptor);
1224        data.writeStrongBinder(token);
1225        data.writeBundle(state);
1226        mRemote.transact(ACTIVITY_PAUSED_TRANSACTION, data, reply, 0);
1227        reply.readException();
1228        data.recycle();
1229        reply.recycle();
1230    }
1231    public void activityStopped(IBinder token,
1232                                Bitmap thumbnail, CharSequence description) throws RemoteException
1233    {
1234        Parcel data = Parcel.obtain();
1235        Parcel reply = Parcel.obtain();
1236        data.writeInterfaceToken(IActivityManager.descriptor);
1237        data.writeStrongBinder(token);
1238        if (thumbnail != null) {
1239            data.writeInt(1);
1240            thumbnail.writeToParcel(data, 0);
1241        } else {
1242            data.writeInt(0);
1243        }
1244        TextUtils.writeToParcel(description, data, 0);
1245        mRemote.transact(ACTIVITY_STOPPED_TRANSACTION, data, reply, IBinder.FLAG_ONEWAY);
1246        reply.readException();
1247        data.recycle();
1248        reply.recycle();
1249    }
1250    public void activityDestroyed(IBinder token) throws RemoteException
1251    {
1252        Parcel data = Parcel.obtain();
1253        Parcel reply = Parcel.obtain();
1254        data.writeInterfaceToken(IActivityManager.descriptor);
1255        data.writeStrongBinder(token);
1256        mRemote.transact(ACTIVITY_DESTROYED_TRANSACTION, data, reply, IBinder.FLAG_ONEWAY);
1257        reply.readException();
1258        data.recycle();
1259        reply.recycle();
1260    }
1261    public String getCallingPackage(IBinder token) throws RemoteException
1262    {
1263        Parcel data = Parcel.obtain();
1264        Parcel reply = Parcel.obtain();
1265        data.writeInterfaceToken(IActivityManager.descriptor);
1266        data.writeStrongBinder(token);
1267        mRemote.transact(GET_CALLING_PACKAGE_TRANSACTION, data, reply, 0);
1268        reply.readException();
1269        String res = reply.readString();
1270        data.recycle();
1271        reply.recycle();
1272        return res;
1273    }
1274    public ComponentName getCallingActivity(IBinder token)
1275            throws RemoteException {
1276        Parcel data = Parcel.obtain();
1277        Parcel reply = Parcel.obtain();
1278        data.writeInterfaceToken(IActivityManager.descriptor);
1279        data.writeStrongBinder(token);
1280        mRemote.transact(GET_CALLING_ACTIVITY_TRANSACTION, data, reply, 0);
1281        reply.readException();
1282        ComponentName res = ComponentName.readFromParcel(reply);
1283        data.recycle();
1284        reply.recycle();
1285        return res;
1286    }
1287    public List getTasks(int maxNum, int flags,
1288            IThumbnailReceiver receiver) throws RemoteException {
1289        Parcel data = Parcel.obtain();
1290        Parcel reply = Parcel.obtain();
1291        data.writeInterfaceToken(IActivityManager.descriptor);
1292        data.writeInt(maxNum);
1293        data.writeInt(flags);
1294        data.writeStrongBinder(receiver != null ? receiver.asBinder() : null);
1295        mRemote.transact(GET_TASKS_TRANSACTION, data, reply, 0);
1296        reply.readException();
1297        ArrayList list = null;
1298        int N = reply.readInt();
1299        if (N >= 0) {
1300            list = new ArrayList();
1301            while (N > 0) {
1302                ActivityManager.RunningTaskInfo info =
1303                        ActivityManager.RunningTaskInfo.CREATOR
1304                        .createFromParcel(reply);
1305                list.add(info);
1306                N--;
1307            }
1308        }
1309        data.recycle();
1310        reply.recycle();
1311        return list;
1312    }
1313    public List<ActivityManager.RecentTaskInfo> getRecentTasks(int maxNum,
1314            int flags) throws RemoteException {
1315        Parcel data = Parcel.obtain();
1316        Parcel reply = Parcel.obtain();
1317        data.writeInterfaceToken(IActivityManager.descriptor);
1318        data.writeInt(maxNum);
1319        data.writeInt(flags);
1320        mRemote.transact(GET_RECENT_TASKS_TRANSACTION, data, reply, 0);
1321        reply.readException();
1322        ArrayList<ActivityManager.RecentTaskInfo> list
1323            = reply.createTypedArrayList(ActivityManager.RecentTaskInfo.CREATOR);
1324        data.recycle();
1325        reply.recycle();
1326        return list;
1327    }
1328    public List getServices(int maxNum, int flags) throws RemoteException {
1329        Parcel data = Parcel.obtain();
1330        Parcel reply = Parcel.obtain();
1331        data.writeInterfaceToken(IActivityManager.descriptor);
1332        data.writeInt(maxNum);
1333        data.writeInt(flags);
1334        mRemote.transact(GET_SERVICES_TRANSACTION, data, reply, 0);
1335        reply.readException();
1336        ArrayList list = null;
1337        int N = reply.readInt();
1338        if (N >= 0) {
1339            list = new ArrayList();
1340            while (N > 0) {
1341                ActivityManager.RunningServiceInfo info =
1342                        ActivityManager.RunningServiceInfo.CREATOR
1343                        .createFromParcel(reply);
1344                list.add(info);
1345                N--;
1346            }
1347        }
1348        data.recycle();
1349        reply.recycle();
1350        return list;
1351    }
1352    public List<ActivityManager.ProcessErrorStateInfo> getProcessesInErrorState()
1353            throws RemoteException {
1354        Parcel data = Parcel.obtain();
1355        Parcel reply = Parcel.obtain();
1356        data.writeInterfaceToken(IActivityManager.descriptor);
1357        mRemote.transact(GET_PROCESSES_IN_ERROR_STATE_TRANSACTION, data, reply, 0);
1358        reply.readException();
1359        ArrayList<ActivityManager.ProcessErrorStateInfo> list
1360            = reply.createTypedArrayList(ActivityManager.ProcessErrorStateInfo.CREATOR);
1361        data.recycle();
1362        reply.recycle();
1363        return list;
1364    }
1365    public List<ActivityManager.RunningAppProcessInfo> getRunningAppProcesses()
1366            throws RemoteException {
1367        Parcel data = Parcel.obtain();
1368        Parcel reply = Parcel.obtain();
1369        data.writeInterfaceToken(IActivityManager.descriptor);
1370        mRemote.transact(GET_RUNNING_APP_PROCESSES_TRANSACTION, data, reply, 0);
1371        reply.readException();
1372        ArrayList<ActivityManager.RunningAppProcessInfo> list
1373        = reply.createTypedArrayList(ActivityManager.RunningAppProcessInfo.CREATOR);
1374        data.recycle();
1375        reply.recycle();
1376        return list;
1377    }
1378    public void moveTaskToFront(int task) throws RemoteException
1379    {
1380        Parcel data = Parcel.obtain();
1381        Parcel reply = Parcel.obtain();
1382        data.writeInterfaceToken(IActivityManager.descriptor);
1383        data.writeInt(task);
1384        mRemote.transact(MOVE_TASK_TO_FRONT_TRANSACTION, data, reply, 0);
1385        reply.readException();
1386        data.recycle();
1387        reply.recycle();
1388    }
1389    public void moveTaskToBack(int task) throws RemoteException
1390    {
1391        Parcel data = Parcel.obtain();
1392        Parcel reply = Parcel.obtain();
1393        data.writeInterfaceToken(IActivityManager.descriptor);
1394        data.writeInt(task);
1395        mRemote.transact(MOVE_TASK_TO_BACK_TRANSACTION, data, reply, 0);
1396        reply.readException();
1397        data.recycle();
1398        reply.recycle();
1399    }
1400    public boolean moveActivityTaskToBack(IBinder token, boolean nonRoot)
1401            throws RemoteException {
1402        Parcel data = Parcel.obtain();
1403        Parcel reply = Parcel.obtain();
1404        data.writeInterfaceToken(IActivityManager.descriptor);
1405        data.writeStrongBinder(token);
1406        data.writeInt(nonRoot ? 1 : 0);
1407        mRemote.transact(MOVE_ACTIVITY_TASK_TO_BACK_TRANSACTION, data, reply, 0);
1408        reply.readException();
1409        boolean res = reply.readInt() != 0;
1410        data.recycle();
1411        reply.recycle();
1412        return res;
1413    }
1414    public void moveTaskBackwards(int task) throws RemoteException
1415    {
1416        Parcel data = Parcel.obtain();
1417        Parcel reply = Parcel.obtain();
1418        data.writeInterfaceToken(IActivityManager.descriptor);
1419        data.writeInt(task);
1420        mRemote.transact(MOVE_TASK_BACKWARDS_TRANSACTION, data, reply, 0);
1421        reply.readException();
1422        data.recycle();
1423        reply.recycle();
1424    }
1425    public int getTaskForActivity(IBinder token, boolean onlyRoot) throws RemoteException
1426    {
1427        Parcel data = Parcel.obtain();
1428        Parcel reply = Parcel.obtain();
1429        data.writeInterfaceToken(IActivityManager.descriptor);
1430        data.writeStrongBinder(token);
1431        data.writeInt(onlyRoot ? 1 : 0);
1432        mRemote.transact(GET_TASK_FOR_ACTIVITY_TRANSACTION, data, reply, 0);
1433        reply.readException();
1434        int res = reply.readInt();
1435        data.recycle();
1436        reply.recycle();
1437        return res;
1438    }
1439    public void finishOtherInstances(IBinder token, ComponentName className) throws RemoteException
1440    {
1441        Parcel data = Parcel.obtain();
1442        Parcel reply = Parcel.obtain();
1443        data.writeInterfaceToken(IActivityManager.descriptor);
1444        data.writeStrongBinder(token);
1445        ComponentName.writeToParcel(className, data);
1446        mRemote.transact(FINISH_OTHER_INSTANCES_TRANSACTION, data, reply, 0);
1447        reply.readException();
1448        data.recycle();
1449        reply.recycle();
1450    }
1451    public void reportThumbnail(IBinder token,
1452                                Bitmap thumbnail, CharSequence description) throws RemoteException
1453    {
1454        Parcel data = Parcel.obtain();
1455        Parcel reply = Parcel.obtain();
1456        data.writeInterfaceToken(IActivityManager.descriptor);
1457        data.writeStrongBinder(token);
1458        if (thumbnail != null) {
1459            data.writeInt(1);
1460            thumbnail.writeToParcel(data, 0);
1461        } else {
1462            data.writeInt(0);
1463        }
1464        TextUtils.writeToParcel(description, data, 0);
1465        mRemote.transact(REPORT_THUMBNAIL_TRANSACTION, data, reply, IBinder.FLAG_ONEWAY);
1466        reply.readException();
1467        data.recycle();
1468        reply.recycle();
1469    }
1470    public ContentProviderHolder getContentProvider(IApplicationThread caller,
1471                                                    String name) throws RemoteException
1472    {
1473        Parcel data = Parcel.obtain();
1474        Parcel reply = Parcel.obtain();
1475        data.writeInterfaceToken(IActivityManager.descriptor);
1476        data.writeStrongBinder(caller != null ? caller.asBinder() : null);
1477        data.writeString(name);
1478        mRemote.transact(GET_CONTENT_PROVIDER_TRANSACTION, data, reply, 0);
1479        reply.readException();
1480        int res = reply.readInt();
1481        ContentProviderHolder cph = null;
1482        if (res != 0) {
1483            cph = ContentProviderHolder.CREATOR.createFromParcel(reply);
1484        }
1485        data.recycle();
1486        reply.recycle();
1487        return cph;
1488    }
1489    public void publishContentProviders(IApplicationThread caller,
1490                                        List<ContentProviderHolder> providers) throws RemoteException
1491    {
1492        Parcel data = Parcel.obtain();
1493        Parcel reply = Parcel.obtain();
1494        data.writeInterfaceToken(IActivityManager.descriptor);
1495        data.writeStrongBinder(caller != null ? caller.asBinder() : null);
1496        data.writeTypedList(providers);
1497        mRemote.transact(PUBLISH_CONTENT_PROVIDERS_TRANSACTION, data, reply, 0);
1498        reply.readException();
1499        data.recycle();
1500        reply.recycle();
1501    }
1502
1503    public void removeContentProvider(IApplicationThread caller,
1504            String name) throws RemoteException {
1505        Parcel data = Parcel.obtain();
1506        Parcel reply = Parcel.obtain();
1507        data.writeInterfaceToken(IActivityManager.descriptor);
1508        data.writeStrongBinder(caller != null ? caller.asBinder() : null);
1509        data.writeString(name);
1510        mRemote.transact(REMOVE_CONTENT_PROVIDER_TRANSACTION, data, reply, 0);
1511        reply.readException();
1512        data.recycle();
1513        reply.recycle();
1514    }
1515
1516    public ComponentName startService(IApplicationThread caller, Intent service,
1517            String resolvedType) throws RemoteException
1518    {
1519        Parcel data = Parcel.obtain();
1520        Parcel reply = Parcel.obtain();
1521        data.writeInterfaceToken(IActivityManager.descriptor);
1522        data.writeStrongBinder(caller != null ? caller.asBinder() : null);
1523        service.writeToParcel(data, 0);
1524        data.writeString(resolvedType);
1525        mRemote.transact(START_SERVICE_TRANSACTION, data, reply, 0);
1526        reply.readException();
1527        ComponentName res = ComponentName.readFromParcel(reply);
1528        data.recycle();
1529        reply.recycle();
1530        return res;
1531    }
1532    public int stopService(IApplicationThread caller, Intent service,
1533            String resolvedType) throws RemoteException
1534    {
1535        Parcel data = Parcel.obtain();
1536        Parcel reply = Parcel.obtain();
1537        data.writeInterfaceToken(IActivityManager.descriptor);
1538        data.writeStrongBinder(caller != null ? caller.asBinder() : null);
1539        service.writeToParcel(data, 0);
1540        data.writeString(resolvedType);
1541        mRemote.transact(STOP_SERVICE_TRANSACTION, data, reply, 0);
1542        reply.readException();
1543        int res = reply.readInt();
1544        reply.recycle();
1545        data.recycle();
1546        return res;
1547    }
1548    public boolean stopServiceToken(ComponentName className, IBinder token,
1549            int startId) throws RemoteException {
1550        Parcel data = Parcel.obtain();
1551        Parcel reply = Parcel.obtain();
1552        data.writeInterfaceToken(IActivityManager.descriptor);
1553        ComponentName.writeToParcel(className, data);
1554        data.writeStrongBinder(token);
1555        data.writeInt(startId);
1556        mRemote.transact(STOP_SERVICE_TOKEN_TRANSACTION, data, reply, 0);
1557        reply.readException();
1558        boolean res = reply.readInt() != 0;
1559        data.recycle();
1560        reply.recycle();
1561        return res;
1562    }
1563    public void setServiceForeground(ComponentName className, IBinder token,
1564            boolean isForeground) throws RemoteException {
1565        Parcel data = Parcel.obtain();
1566        Parcel reply = Parcel.obtain();
1567        data.writeInterfaceToken(IActivityManager.descriptor);
1568        ComponentName.writeToParcel(className, data);
1569        data.writeStrongBinder(token);
1570        data.writeInt(isForeground ? 1 : 0);
1571        mRemote.transact(SET_SERVICE_FOREGROUND_TRANSACTION, data, reply, 0);
1572        reply.readException();
1573        data.recycle();
1574        reply.recycle();
1575    }
1576    public int bindService(IApplicationThread caller, IBinder token,
1577            Intent service, String resolvedType, IServiceConnection connection,
1578            int flags) throws RemoteException {
1579        Parcel data = Parcel.obtain();
1580        Parcel reply = Parcel.obtain();
1581        data.writeInterfaceToken(IActivityManager.descriptor);
1582        data.writeStrongBinder(caller != null ? caller.asBinder() : null);
1583        data.writeStrongBinder(token);
1584        service.writeToParcel(data, 0);
1585        data.writeString(resolvedType);
1586        data.writeStrongBinder(connection.asBinder());
1587        data.writeInt(flags);
1588        mRemote.transact(BIND_SERVICE_TRANSACTION, data, reply, 0);
1589        reply.readException();
1590        int res = reply.readInt();
1591        data.recycle();
1592        reply.recycle();
1593        return res;
1594    }
1595    public boolean unbindService(IServiceConnection connection) throws RemoteException
1596    {
1597        Parcel data = Parcel.obtain();
1598        Parcel reply = Parcel.obtain();
1599        data.writeInterfaceToken(IActivityManager.descriptor);
1600        data.writeStrongBinder(connection.asBinder());
1601        mRemote.transact(UNBIND_SERVICE_TRANSACTION, data, reply, 0);
1602        reply.readException();
1603        boolean res = reply.readInt() != 0;
1604        data.recycle();
1605        reply.recycle();
1606        return res;
1607    }
1608
1609    public void publishService(IBinder token,
1610            Intent intent, IBinder service) throws RemoteException {
1611        Parcel data = Parcel.obtain();
1612        Parcel reply = Parcel.obtain();
1613        data.writeInterfaceToken(IActivityManager.descriptor);
1614        data.writeStrongBinder(token);
1615        intent.writeToParcel(data, 0);
1616        data.writeStrongBinder(service);
1617        mRemote.transact(PUBLISH_SERVICE_TRANSACTION, data, reply, 0);
1618        reply.readException();
1619        data.recycle();
1620        reply.recycle();
1621    }
1622
1623    public void unbindFinished(IBinder token, Intent intent, boolean doRebind)
1624            throws RemoteException {
1625        Parcel data = Parcel.obtain();
1626        Parcel reply = Parcel.obtain();
1627        data.writeInterfaceToken(IActivityManager.descriptor);
1628        data.writeStrongBinder(token);
1629        intent.writeToParcel(data, 0);
1630        data.writeInt(doRebind ? 1 : 0);
1631        mRemote.transact(UNBIND_FINISHED_TRANSACTION, data, reply, 0);
1632        reply.readException();
1633        data.recycle();
1634        reply.recycle();
1635    }
1636
1637    public void serviceDoneExecuting(IBinder token) throws RemoteException {
1638        Parcel data = Parcel.obtain();
1639        Parcel reply = Parcel.obtain();
1640        data.writeInterfaceToken(IActivityManager.descriptor);
1641        data.writeStrongBinder(token);
1642        mRemote.transact(SERVICE_DONE_EXECUTING_TRANSACTION, data, reply, IBinder.FLAG_ONEWAY);
1643        reply.readException();
1644        data.recycle();
1645        reply.recycle();
1646    }
1647
1648    public IBinder peekService(Intent service, String resolvedType) throws RemoteException {
1649        Parcel data = Parcel.obtain();
1650        Parcel reply = Parcel.obtain();
1651        data.writeInterfaceToken(IActivityManager.descriptor);
1652        service.writeToParcel(data, 0);
1653        data.writeString(resolvedType);
1654        mRemote.transact(PEEK_SERVICE_TRANSACTION, data, reply, 0);
1655        reply.readException();
1656        IBinder binder = reply.readStrongBinder();
1657        reply.recycle();
1658        data.recycle();
1659        return binder;
1660    }
1661
1662    public boolean startInstrumentation(ComponentName className, String profileFile,
1663            int flags, Bundle arguments, IInstrumentationWatcher watcher)
1664            throws RemoteException {
1665        Parcel data = Parcel.obtain();
1666        Parcel reply = Parcel.obtain();
1667        data.writeInterfaceToken(IActivityManager.descriptor);
1668        ComponentName.writeToParcel(className, data);
1669        data.writeString(profileFile);
1670        data.writeInt(flags);
1671        data.writeBundle(arguments);
1672        data.writeStrongBinder(watcher != null ? watcher.asBinder() : null);
1673        mRemote.transact(START_INSTRUMENTATION_TRANSACTION, data, reply, 0);
1674        reply.readException();
1675        boolean res = reply.readInt() != 0;
1676        reply.recycle();
1677        data.recycle();
1678        return res;
1679    }
1680
1681    public void finishInstrumentation(IApplicationThread target,
1682            int resultCode, Bundle results) throws RemoteException {
1683        Parcel data = Parcel.obtain();
1684        Parcel reply = Parcel.obtain();
1685        data.writeInterfaceToken(IActivityManager.descriptor);
1686        data.writeStrongBinder(target != null ? target.asBinder() : null);
1687        data.writeInt(resultCode);
1688        data.writeBundle(results);
1689        mRemote.transact(FINISH_INSTRUMENTATION_TRANSACTION, data, reply, 0);
1690        reply.readException();
1691        data.recycle();
1692        reply.recycle();
1693    }
1694    public Configuration getConfiguration() throws RemoteException
1695    {
1696        Parcel data = Parcel.obtain();
1697        Parcel reply = Parcel.obtain();
1698        data.writeInterfaceToken(IActivityManager.descriptor);
1699        mRemote.transact(GET_CONFIGURATION_TRANSACTION, data, reply, 0);
1700        reply.readException();
1701        Configuration res = Configuration.CREATOR.createFromParcel(reply);
1702        reply.recycle();
1703        data.recycle();
1704        return res;
1705    }
1706    public void updateConfiguration(Configuration values) throws RemoteException
1707    {
1708        Parcel data = Parcel.obtain();
1709        Parcel reply = Parcel.obtain();
1710        data.writeInterfaceToken(IActivityManager.descriptor);
1711        values.writeToParcel(data, 0);
1712        mRemote.transact(UPDATE_CONFIGURATION_TRANSACTION, data, reply, 0);
1713        reply.readException();
1714        data.recycle();
1715        reply.recycle();
1716    }
1717    public void setRequestedOrientation(IBinder token, int requestedOrientation)
1718            throws RemoteException {
1719        Parcel data = Parcel.obtain();
1720        Parcel reply = Parcel.obtain();
1721        data.writeInterfaceToken(IActivityManager.descriptor);
1722        data.writeStrongBinder(token);
1723        data.writeInt(requestedOrientation);
1724        mRemote.transact(SET_REQUESTED_ORIENTATION_TRANSACTION, data, reply, 0);
1725        reply.readException();
1726        data.recycle();
1727        reply.recycle();
1728    }
1729    public int getRequestedOrientation(IBinder token) throws RemoteException {
1730        Parcel data = Parcel.obtain();
1731        Parcel reply = Parcel.obtain();
1732        data.writeInterfaceToken(IActivityManager.descriptor);
1733        data.writeStrongBinder(token);
1734        mRemote.transact(GET_REQUESTED_ORIENTATION_TRANSACTION, data, reply, 0);
1735        reply.readException();
1736        int res = reply.readInt();
1737        data.recycle();
1738        reply.recycle();
1739        return res;
1740    }
1741    public ComponentName getActivityClassForToken(IBinder token)
1742            throws RemoteException {
1743        Parcel data = Parcel.obtain();
1744        Parcel reply = Parcel.obtain();
1745        data.writeInterfaceToken(IActivityManager.descriptor);
1746        data.writeStrongBinder(token);
1747        mRemote.transact(GET_ACTIVITY_CLASS_FOR_TOKEN_TRANSACTION, data, reply, 0);
1748        reply.readException();
1749        ComponentName res = ComponentName.readFromParcel(reply);
1750        data.recycle();
1751        reply.recycle();
1752        return res;
1753    }
1754    public String getPackageForToken(IBinder token) throws RemoteException
1755    {
1756        Parcel data = Parcel.obtain();
1757        Parcel reply = Parcel.obtain();
1758        data.writeInterfaceToken(IActivityManager.descriptor);
1759        data.writeStrongBinder(token);
1760        mRemote.transact(GET_PACKAGE_FOR_TOKEN_TRANSACTION, data, reply, 0);
1761        reply.readException();
1762        String res = reply.readString();
1763        data.recycle();
1764        reply.recycle();
1765        return res;
1766    }
1767    public IIntentSender getIntentSender(int type,
1768            String packageName, IBinder token, String resultWho,
1769            int requestCode, Intent intent, String resolvedType, int flags)
1770            throws RemoteException {
1771        Parcel data = Parcel.obtain();
1772        Parcel reply = Parcel.obtain();
1773        data.writeInterfaceToken(IActivityManager.descriptor);
1774        data.writeInt(type);
1775        data.writeString(packageName);
1776        data.writeStrongBinder(token);
1777        data.writeString(resultWho);
1778        data.writeInt(requestCode);
1779        if (intent != null) {
1780            data.writeInt(1);
1781            intent.writeToParcel(data, 0);
1782        } else {
1783            data.writeInt(0);
1784        }
1785        data.writeString(resolvedType);
1786        data.writeInt(flags);
1787        mRemote.transact(GET_INTENT_SENDER_TRANSACTION, data, reply, 0);
1788        reply.readException();
1789        IIntentSender res = IIntentSender.Stub.asInterface(
1790            reply.readStrongBinder());
1791        data.recycle();
1792        reply.recycle();
1793        return res;
1794    }
1795    public void cancelIntentSender(IIntentSender sender) throws RemoteException {
1796        Parcel data = Parcel.obtain();
1797        Parcel reply = Parcel.obtain();
1798        data.writeInterfaceToken(IActivityManager.descriptor);
1799        data.writeStrongBinder(sender.asBinder());
1800        mRemote.transact(CANCEL_INTENT_SENDER_TRANSACTION, data, reply, 0);
1801        reply.readException();
1802        data.recycle();
1803        reply.recycle();
1804    }
1805    public String getPackageForIntentSender(IIntentSender sender) throws RemoteException {
1806        Parcel data = Parcel.obtain();
1807        Parcel reply = Parcel.obtain();
1808        data.writeInterfaceToken(IActivityManager.descriptor);
1809        data.writeStrongBinder(sender.asBinder());
1810        mRemote.transact(GET_PACKAGE_FOR_INTENT_SENDER_TRANSACTION, data, reply, 0);
1811        reply.readException();
1812        String res = reply.readString();
1813        data.recycle();
1814        reply.recycle();
1815        return res;
1816    }
1817    public void setProcessLimit(int max) throws RemoteException
1818    {
1819        Parcel data = Parcel.obtain();
1820        Parcel reply = Parcel.obtain();
1821        data.writeInterfaceToken(IActivityManager.descriptor);
1822        data.writeInt(max);
1823        mRemote.transact(SET_PROCESS_LIMIT_TRANSACTION, data, reply, 0);
1824        reply.readException();
1825        data.recycle();
1826        reply.recycle();
1827    }
1828    public int getProcessLimit() throws RemoteException
1829    {
1830        Parcel data = Parcel.obtain();
1831        Parcel reply = Parcel.obtain();
1832        data.writeInterfaceToken(IActivityManager.descriptor);
1833        mRemote.transact(GET_PROCESS_LIMIT_TRANSACTION, data, reply, 0);
1834        reply.readException();
1835        int res = reply.readInt();
1836        data.recycle();
1837        reply.recycle();
1838        return res;
1839    }
1840    public void setProcessForeground(IBinder token, int pid,
1841            boolean isForeground) throws RemoteException {
1842        Parcel data = Parcel.obtain();
1843        Parcel reply = Parcel.obtain();
1844        data.writeInterfaceToken(IActivityManager.descriptor);
1845        data.writeStrongBinder(token);
1846        data.writeInt(pid);
1847        data.writeInt(isForeground ? 1 : 0);
1848        mRemote.transact(SET_PROCESS_FOREGROUND_TRANSACTION, data, reply, 0);
1849        reply.readException();
1850        data.recycle();
1851        reply.recycle();
1852    }
1853    public int checkPermission(String permission, int pid, int uid)
1854            throws RemoteException {
1855        Parcel data = Parcel.obtain();
1856        Parcel reply = Parcel.obtain();
1857        data.writeInterfaceToken(IActivityManager.descriptor);
1858        data.writeString(permission);
1859        data.writeInt(pid);
1860        data.writeInt(uid);
1861        mRemote.transact(CHECK_PERMISSION_TRANSACTION, data, reply, 0);
1862        reply.readException();
1863        int res = reply.readInt();
1864        data.recycle();
1865        reply.recycle();
1866        return res;
1867    }
1868    public boolean clearApplicationUserData(final String packageName,
1869            final IPackageDataObserver observer) throws RemoteException {
1870        Parcel data = Parcel.obtain();
1871        Parcel reply = Parcel.obtain();
1872        data.writeInterfaceToken(IActivityManager.descriptor);
1873        data.writeString(packageName);
1874        data.writeStrongBinder(observer.asBinder());
1875        mRemote.transact(CLEAR_APP_DATA_TRANSACTION, data, reply, 0);
1876        reply.readException();
1877        boolean res = reply.readInt() != 0;
1878        data.recycle();
1879        reply.recycle();
1880        return res;
1881    }
1882    public int checkUriPermission(Uri uri, int pid, int uid, int mode)
1883            throws RemoteException {
1884        Parcel data = Parcel.obtain();
1885        Parcel reply = Parcel.obtain();
1886        data.writeInterfaceToken(IActivityManager.descriptor);
1887        uri.writeToParcel(data, 0);
1888        data.writeInt(pid);
1889        data.writeInt(uid);
1890        data.writeInt(mode);
1891        mRemote.transact(CHECK_URI_PERMISSION_TRANSACTION, data, reply, 0);
1892        reply.readException();
1893        int res = reply.readInt();
1894        data.recycle();
1895        reply.recycle();
1896        return res;
1897    }
1898    public void grantUriPermission(IApplicationThread caller, String targetPkg,
1899            Uri uri, int mode) throws RemoteException {
1900        Parcel data = Parcel.obtain();
1901        Parcel reply = Parcel.obtain();
1902        data.writeInterfaceToken(IActivityManager.descriptor);
1903        data.writeStrongBinder(caller.asBinder());
1904        data.writeString(targetPkg);
1905        uri.writeToParcel(data, 0);
1906        data.writeInt(mode);
1907        mRemote.transact(GRANT_URI_PERMISSION_TRANSACTION, data, reply, 0);
1908        reply.readException();
1909        data.recycle();
1910        reply.recycle();
1911    }
1912    public void revokeUriPermission(IApplicationThread caller, Uri uri,
1913            int mode) throws RemoteException {
1914        Parcel data = Parcel.obtain();
1915        Parcel reply = Parcel.obtain();
1916        data.writeInterfaceToken(IActivityManager.descriptor);
1917        data.writeStrongBinder(caller.asBinder());
1918        uri.writeToParcel(data, 0);
1919        data.writeInt(mode);
1920        mRemote.transact(REVOKE_URI_PERMISSION_TRANSACTION, data, reply, 0);
1921        reply.readException();
1922        data.recycle();
1923        reply.recycle();
1924    }
1925    public void showWaitingForDebugger(IApplicationThread who, boolean waiting)
1926            throws RemoteException {
1927        Parcel data = Parcel.obtain();
1928        Parcel reply = Parcel.obtain();
1929        data.writeInterfaceToken(IActivityManager.descriptor);
1930        data.writeStrongBinder(who.asBinder());
1931        data.writeInt(waiting ? 1 : 0);
1932        mRemote.transact(SHOW_WAITING_FOR_DEBUGGER_TRANSACTION, data, reply, 0);
1933        reply.readException();
1934        data.recycle();
1935        reply.recycle();
1936    }
1937    public void getMemoryInfo(ActivityManager.MemoryInfo outInfo) throws RemoteException {
1938        Parcel data = Parcel.obtain();
1939        Parcel reply = Parcel.obtain();
1940        data.writeInterfaceToken(IActivityManager.descriptor);
1941        mRemote.transact(GET_MEMORY_INFO_TRANSACTION, data, reply, 0);
1942        reply.readException();
1943        outInfo.readFromParcel(reply);
1944        data.recycle();
1945        reply.recycle();
1946    }
1947    public void unhandledBack() throws RemoteException
1948    {
1949        Parcel data = Parcel.obtain();
1950        Parcel reply = Parcel.obtain();
1951        data.writeInterfaceToken(IActivityManager.descriptor);
1952        mRemote.transact(UNHANDLED_BACK_TRANSACTION, data, reply, 0);
1953        reply.readException();
1954        data.recycle();
1955        reply.recycle();
1956    }
1957    public ParcelFileDescriptor openContentUri(Uri uri) throws RemoteException
1958    {
1959        Parcel data = Parcel.obtain();
1960        Parcel reply = Parcel.obtain();
1961        data.writeInterfaceToken(IActivityManager.descriptor);
1962        mRemote.transact(OPEN_CONTENT_URI_TRANSACTION, data, reply, 0);
1963        reply.readException();
1964        ParcelFileDescriptor pfd = null;
1965        if (reply.readInt() != 0) {
1966            pfd = ParcelFileDescriptor.CREATOR.createFromParcel(reply);
1967        }
1968        data.recycle();
1969        reply.recycle();
1970        return pfd;
1971    }
1972    public void goingToSleep() throws RemoteException
1973    {
1974        Parcel data = Parcel.obtain();
1975        Parcel reply = Parcel.obtain();
1976        data.writeInterfaceToken(IActivityManager.descriptor);
1977        mRemote.transact(GOING_TO_SLEEP_TRANSACTION, data, reply, 0);
1978        reply.readException();
1979        data.recycle();
1980        reply.recycle();
1981    }
1982    public void wakingUp() throws RemoteException
1983    {
1984        Parcel data = Parcel.obtain();
1985        Parcel reply = Parcel.obtain();
1986        data.writeInterfaceToken(IActivityManager.descriptor);
1987        mRemote.transact(WAKING_UP_TRANSACTION, data, reply, 0);
1988        reply.readException();
1989        data.recycle();
1990        reply.recycle();
1991    }
1992    public void setDebugApp(
1993        String packageName, boolean waitForDebugger, boolean persistent)
1994        throws RemoteException
1995    {
1996        Parcel data = Parcel.obtain();
1997        Parcel reply = Parcel.obtain();
1998        data.writeInterfaceToken(IActivityManager.descriptor);
1999        data.writeString(packageName);
2000        data.writeInt(waitForDebugger ? 1 : 0);
2001        data.writeInt(persistent ? 1 : 0);
2002        mRemote.transact(SET_DEBUG_APP_TRANSACTION, data, reply, 0);
2003        reply.readException();
2004        data.recycle();
2005        reply.recycle();
2006    }
2007    public void setAlwaysFinish(boolean enabled) throws RemoteException
2008    {
2009        Parcel data = Parcel.obtain();
2010        Parcel reply = Parcel.obtain();
2011        data.writeInterfaceToken(IActivityManager.descriptor);
2012        data.writeInt(enabled ? 1 : 0);
2013        mRemote.transact(SET_ALWAYS_FINISH_TRANSACTION, data, reply, 0);
2014        reply.readException();
2015        data.recycle();
2016        reply.recycle();
2017    }
2018    public void setActivityWatcher(IActivityWatcher watcher) throws RemoteException
2019    {
2020        Parcel data = Parcel.obtain();
2021        Parcel reply = Parcel.obtain();
2022        data.writeInterfaceToken(IActivityManager.descriptor);
2023        data.writeStrongBinder(watcher != null ? watcher.asBinder() : null);
2024        mRemote.transact(SET_ACTIVITY_WATCHER_TRANSACTION, data, reply, 0);
2025        reply.readException();
2026        data.recycle();
2027        reply.recycle();
2028    }
2029    public void enterSafeMode() throws RemoteException {
2030        Parcel data = Parcel.obtain();
2031        data.writeInterfaceToken(IActivityManager.descriptor);
2032        mRemote.transact(ENTER_SAFE_MODE_TRANSACTION, data, null, 0);
2033        data.recycle();
2034    }
2035    public void noteWakeupAlarm(IIntentSender sender) throws RemoteException {
2036        Parcel data = Parcel.obtain();
2037        data.writeStrongBinder(sender.asBinder());
2038        data.writeInterfaceToken(IActivityManager.descriptor);
2039        mRemote.transact(NOTE_WAKEUP_ALARM_TRANSACTION, data, null, 0);
2040        data.recycle();
2041    }
2042    public boolean killPidsForMemory(int[] pids) throws RemoteException {
2043        Parcel data = Parcel.obtain();
2044        Parcel reply = Parcel.obtain();
2045        data.writeInterfaceToken(IActivityManager.descriptor);
2046        data.writeIntArray(pids);
2047        mRemote.transact(KILL_PIDS_FOR_MEMORY_TRANSACTION, data, reply, 0);
2048        boolean res = reply.readInt() != 0;
2049        data.recycle();
2050        reply.recycle();
2051        return res;
2052    }
2053    public void reportPss(IApplicationThread caller, int pss) throws RemoteException {
2054        Parcel data = Parcel.obtain();
2055        data.writeInterfaceToken(IActivityManager.descriptor);
2056        data.writeStrongBinder(caller.asBinder());
2057        data.writeInt(pss);
2058        mRemote.transact(REPORT_PSS_TRANSACTION, data, null, 0);
2059        data.recycle();
2060    }
2061    public void startRunning(String pkg, String cls, String action,
2062            String indata) throws RemoteException {
2063        Parcel data = Parcel.obtain();
2064        Parcel reply = Parcel.obtain();
2065        data.writeInterfaceToken(IActivityManager.descriptor);
2066        data.writeString(pkg);
2067        data.writeString(cls);
2068        data.writeString(action);
2069        data.writeString(indata);
2070        mRemote.transact(START_RUNNING_TRANSACTION, data, reply, 0);
2071        reply.readException();
2072        data.recycle();
2073        reply.recycle();
2074    }
2075    public void systemReady() throws RemoteException
2076    {
2077        Parcel data = Parcel.obtain();
2078        Parcel reply = Parcel.obtain();
2079        data.writeInterfaceToken(IActivityManager.descriptor);
2080        mRemote.transact(SYSTEM_READY_TRANSACTION, data, reply, 0);
2081        reply.readException();
2082        data.recycle();
2083        reply.recycle();
2084    }
2085    public boolean testIsSystemReady()
2086    {
2087        /* this base class version is never called */
2088        return true;
2089    }
2090    public int handleApplicationError(IBinder app, int flags,
2091            String tag, String shortMsg, String longMsg,
2092            byte[] crashData) throws RemoteException
2093    {
2094        Parcel data = Parcel.obtain();
2095        Parcel reply = Parcel.obtain();
2096        data.writeInterfaceToken(IActivityManager.descriptor);
2097        data.writeStrongBinder(app);
2098        data.writeInt(flags);
2099        data.writeString(tag);
2100        data.writeString(shortMsg);
2101        data.writeString(longMsg);
2102        data.writeByteArray(crashData);
2103        mRemote.transact(HANDLE_APPLICATION_ERROR_TRANSACTION, data, reply, 0);
2104        reply.readException();
2105        int res = reply.readInt();
2106        reply.recycle();
2107        data.recycle();
2108        return res;
2109    }
2110
2111    public void signalPersistentProcesses(int sig) throws RemoteException {
2112        Parcel data = Parcel.obtain();
2113        Parcel reply = Parcel.obtain();
2114        data.writeInterfaceToken(IActivityManager.descriptor);
2115        data.writeInt(sig);
2116        mRemote.transact(SIGNAL_PERSISTENT_PROCESSES_TRANSACTION, data, reply, 0);
2117        reply.readException();
2118        data.recycle();
2119        reply.recycle();
2120    }
2121
2122    public void restartPackage(String packageName) throws RemoteException {
2123        Parcel data = Parcel.obtain();
2124        Parcel reply = Parcel.obtain();
2125        data.writeInterfaceToken(IActivityManager.descriptor);
2126        data.writeString(packageName);
2127        mRemote.transact(RESTART_PACKAGE_TRANSACTION, data, reply, 0);
2128        reply.readException();
2129        data.recycle();
2130        reply.recycle();
2131    }
2132
2133    public ConfigurationInfo getDeviceConfigurationInfo() throws RemoteException
2134    {
2135        Parcel data = Parcel.obtain();
2136        Parcel reply = Parcel.obtain();
2137        data.writeInterfaceToken(IActivityManager.descriptor);
2138        mRemote.transact(GET_DEVICE_CONFIGURATION_TRANSACTION, data, reply, 0);
2139        reply.readException();
2140        ConfigurationInfo res = ConfigurationInfo.CREATOR.createFromParcel(reply);
2141        reply.recycle();
2142        data.recycle();
2143        return res;
2144    }
2145
2146    public boolean profileControl(String process, boolean start,
2147            String path) throws RemoteException
2148    {
2149        Parcel data = Parcel.obtain();
2150        Parcel reply = Parcel.obtain();
2151        data.writeInterfaceToken(IActivityManager.descriptor);
2152        data.writeString(process);
2153        data.writeInt(start ? 1 : 0);
2154        data.writeString(path);
2155        mRemote.transact(PROFILE_CONTROL_TRANSACTION, data, reply, 0);
2156        reply.readException();
2157        boolean res = reply.readInt() != 0;
2158        reply.recycle();
2159        data.recycle();
2160        return res;
2161    }
2162
2163    private IBinder mRemote;
2164}
2165