ActivityManagerNative.java revision 0c5001d776d56bae02a5cc2663286a125d99bc5e
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.Intent;
21import android.content.IntentFilter;
22import android.content.IIntentSender;
23import android.content.IIntentReceiver;
24import android.content.IntentSender;
25import android.content.pm.ApplicationInfo;
26import android.content.pm.ConfigurationInfo;
27import android.content.pm.IPackageDataObserver;
28import android.content.res.Configuration;
29import android.graphics.Bitmap;
30import android.net.Uri;
31import android.os.Binder;
32import android.os.Bundle;
33import android.os.Debug;
34import android.os.Parcelable;
35import android.os.ParcelFileDescriptor;
36import android.os.RemoteException;
37import android.os.IBinder;
38import android.os.Parcel;
39import android.os.ServiceManager;
40import android.os.StrictMode;
41import android.text.TextUtils;
42import android.util.Log;
43import android.util.Singleton;
44
45import java.util.ArrayList;
46import java.util.List;
47
48/** {@hide} */
49public abstract class ActivityManagerNative extends Binder implements IActivityManager
50{
51    /**
52     * Cast a Binder object into an activity manager interface, generating
53     * a proxy if needed.
54     */
55    static public IActivityManager asInterface(IBinder obj) {
56        if (obj == null) {
57            return null;
58        }
59        IActivityManager in =
60            (IActivityManager)obj.queryLocalInterface(descriptor);
61        if (in != null) {
62            return in;
63        }
64
65        return new ActivityManagerProxy(obj);
66    }
67
68    /**
69     * Retrieve the system's default/global activity manager.
70     */
71    static public IActivityManager getDefault() {
72        return gDefault.get();
73    }
74
75    /**
76     * Convenience for checking whether the system is ready.  For internal use only.
77     */
78    static public boolean isSystemReady() {
79        if (!sSystemReady) {
80            sSystemReady = getDefault().testIsSystemReady();
81        }
82        return sSystemReady;
83    }
84    static boolean sSystemReady = false;
85
86    /**
87     * Convenience for sending a sticky broadcast.  For internal use only.
88     * If you don't care about permission, use null.
89     */
90    static public void broadcastStickyIntent(Intent intent, String permission) {
91        try {
92            getDefault().broadcastIntent(
93                null, intent, null, null, Activity.RESULT_OK, null, null,
94                null /*permission*/, false, true);
95        } catch (RemoteException ex) {
96        }
97    }
98
99    static public void noteWakeupAlarm(PendingIntent ps) {
100        try {
101            getDefault().noteWakeupAlarm(ps.getTarget());
102        } catch (RemoteException ex) {
103        }
104    }
105
106    public ActivityManagerNative() {
107        attachInterface(this, descriptor);
108    }
109
110    public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
111            throws RemoteException {
112        switch (code) {
113        case START_ACTIVITY_TRANSACTION:
114        {
115            data.enforceInterface(IActivityManager.descriptor);
116            IBinder b = data.readStrongBinder();
117            IApplicationThread app = ApplicationThreadNative.asInterface(b);
118            Intent intent = Intent.CREATOR.createFromParcel(data);
119            String resolvedType = data.readString();
120            Uri[] grantedUriPermissions = data.createTypedArray(Uri.CREATOR);
121            int grantedMode = data.readInt();
122            IBinder resultTo = data.readStrongBinder();
123            String resultWho = data.readString();
124            int requestCode = data.readInt();
125            boolean onlyIfNeeded = data.readInt() != 0;
126            boolean debug = data.readInt() != 0;
127            int result = startActivity(app, intent, resolvedType,
128                    grantedUriPermissions, grantedMode, resultTo, resultWho,
129                    requestCode, onlyIfNeeded, debug);
130            reply.writeNoException();
131            reply.writeInt(result);
132            return true;
133        }
134
135        case START_ACTIVITY_AND_WAIT_TRANSACTION:
136        {
137            data.enforceInterface(IActivityManager.descriptor);
138            IBinder b = data.readStrongBinder();
139            IApplicationThread app = ApplicationThreadNative.asInterface(b);
140            Intent intent = Intent.CREATOR.createFromParcel(data);
141            String resolvedType = data.readString();
142            Uri[] grantedUriPermissions = data.createTypedArray(Uri.CREATOR);
143            int grantedMode = data.readInt();
144            IBinder resultTo = data.readStrongBinder();
145            String resultWho = data.readString();
146            int requestCode = data.readInt();
147            boolean onlyIfNeeded = data.readInt() != 0;
148            boolean debug = data.readInt() != 0;
149            WaitResult result = startActivityAndWait(app, intent, resolvedType,
150                    grantedUriPermissions, grantedMode, resultTo, resultWho,
151                    requestCode, onlyIfNeeded, debug);
152            reply.writeNoException();
153            result.writeToParcel(reply, 0);
154            return true;
155        }
156
157        case START_ACTIVITY_WITH_CONFIG_TRANSACTION:
158        {
159            data.enforceInterface(IActivityManager.descriptor);
160            IBinder b = data.readStrongBinder();
161            IApplicationThread app = ApplicationThreadNative.asInterface(b);
162            Intent intent = Intent.CREATOR.createFromParcel(data);
163            String resolvedType = data.readString();
164            Uri[] grantedUriPermissions = data.createTypedArray(Uri.CREATOR);
165            int grantedMode = data.readInt();
166            IBinder resultTo = data.readStrongBinder();
167            String resultWho = data.readString();
168            int requestCode = data.readInt();
169            boolean onlyIfNeeded = data.readInt() != 0;
170            boolean debug = data.readInt() != 0;
171            Configuration config = Configuration.CREATOR.createFromParcel(data);
172            int result = startActivityWithConfig(app, intent, resolvedType,
173                    grantedUriPermissions, grantedMode, resultTo, resultWho,
174                    requestCode, onlyIfNeeded, debug, config);
175            reply.writeNoException();
176            reply.writeInt(result);
177            return true;
178        }
179
180        case START_ACTIVITY_INTENT_SENDER_TRANSACTION:
181        {
182            data.enforceInterface(IActivityManager.descriptor);
183            IBinder b = data.readStrongBinder();
184            IApplicationThread app = ApplicationThreadNative.asInterface(b);
185            IntentSender intent = IntentSender.CREATOR.createFromParcel(data);
186            Intent fillInIntent = null;
187            if (data.readInt() != 0) {
188                fillInIntent = Intent.CREATOR.createFromParcel(data);
189            }
190            String resolvedType = data.readString();
191            IBinder resultTo = data.readStrongBinder();
192            String resultWho = data.readString();
193            int requestCode = data.readInt();
194            int flagsMask = data.readInt();
195            int flagsValues = data.readInt();
196            int result = startActivityIntentSender(app, intent,
197                    fillInIntent, resolvedType, resultTo, resultWho,
198                    requestCode, flagsMask, flagsValues);
199            reply.writeNoException();
200            reply.writeInt(result);
201            return true;
202        }
203
204        case START_NEXT_MATCHING_ACTIVITY_TRANSACTION:
205        {
206            data.enforceInterface(IActivityManager.descriptor);
207            IBinder callingActivity = data.readStrongBinder();
208            Intent intent = Intent.CREATOR.createFromParcel(data);
209            boolean result = startNextMatchingActivity(callingActivity, intent);
210            reply.writeNoException();
211            reply.writeInt(result ? 1 : 0);
212            return true;
213        }
214
215        case FINISH_ACTIVITY_TRANSACTION: {
216            data.enforceInterface(IActivityManager.descriptor);
217            IBinder token = data.readStrongBinder();
218            Intent resultData = null;
219            int resultCode = data.readInt();
220            if (data.readInt() != 0) {
221                resultData = Intent.CREATOR.createFromParcel(data);
222            }
223            boolean res = finishActivity(token, resultCode, resultData);
224            reply.writeNoException();
225            reply.writeInt(res ? 1 : 0);
226            return true;
227        }
228
229        case FINISH_SUB_ACTIVITY_TRANSACTION: {
230            data.enforceInterface(IActivityManager.descriptor);
231            IBinder token = data.readStrongBinder();
232            String resultWho = data.readString();
233            int requestCode = data.readInt();
234            finishSubActivity(token, resultWho, requestCode);
235            reply.writeNoException();
236            return true;
237        }
238
239        case WILL_ACTIVITY_BE_VISIBLE_TRANSACTION: {
240            data.enforceInterface(IActivityManager.descriptor);
241            IBinder token = data.readStrongBinder();
242            boolean res = willActivityBeVisible(token);
243            reply.writeNoException();
244            reply.writeInt(res ? 1 : 0);
245            return true;
246        }
247
248        case REGISTER_RECEIVER_TRANSACTION:
249        {
250            data.enforceInterface(IActivityManager.descriptor);
251            IBinder b = data.readStrongBinder();
252            IApplicationThread app =
253                b != null ? ApplicationThreadNative.asInterface(b) : null;
254            b = data.readStrongBinder();
255            IIntentReceiver rec
256                = b != null ? IIntentReceiver.Stub.asInterface(b) : null;
257            IntentFilter filter = IntentFilter.CREATOR.createFromParcel(data);
258            String perm = data.readString();
259            Intent intent = registerReceiver(app, rec, filter, perm);
260            reply.writeNoException();
261            if (intent != null) {
262                reply.writeInt(1);
263                intent.writeToParcel(reply, 0);
264            } else {
265                reply.writeInt(0);
266            }
267            return true;
268        }
269
270        case UNREGISTER_RECEIVER_TRANSACTION:
271        {
272            data.enforceInterface(IActivityManager.descriptor);
273            IBinder b = data.readStrongBinder();
274            if (b == null) {
275                return true;
276            }
277            IIntentReceiver rec = IIntentReceiver.Stub.asInterface(b);
278            unregisterReceiver(rec);
279            reply.writeNoException();
280            return true;
281        }
282
283        case BROADCAST_INTENT_TRANSACTION:
284        {
285            data.enforceInterface(IActivityManager.descriptor);
286            IBinder b = data.readStrongBinder();
287            IApplicationThread app =
288                b != null ? ApplicationThreadNative.asInterface(b) : null;
289            Intent intent = Intent.CREATOR.createFromParcel(data);
290            String resolvedType = data.readString();
291            b = data.readStrongBinder();
292            IIntentReceiver resultTo =
293                b != null ? IIntentReceiver.Stub.asInterface(b) : null;
294            int resultCode = data.readInt();
295            String resultData = data.readString();
296            Bundle resultExtras = data.readBundle();
297            String perm = data.readString();
298            boolean serialized = data.readInt() != 0;
299            boolean sticky = data.readInt() != 0;
300            int res = broadcastIntent(app, intent, resolvedType, resultTo,
301                    resultCode, resultData, resultExtras, perm,
302                    serialized, sticky);
303            reply.writeNoException();
304            reply.writeInt(res);
305            return true;
306        }
307
308        case UNBROADCAST_INTENT_TRANSACTION:
309        {
310            data.enforceInterface(IActivityManager.descriptor);
311            IBinder b = data.readStrongBinder();
312            IApplicationThread app = b != null ? ApplicationThreadNative.asInterface(b) : null;
313            Intent intent = Intent.CREATOR.createFromParcel(data);
314            unbroadcastIntent(app, intent);
315            reply.writeNoException();
316            return true;
317        }
318
319        case FINISH_RECEIVER_TRANSACTION: {
320            data.enforceInterface(IActivityManager.descriptor);
321            IBinder who = data.readStrongBinder();
322            int resultCode = data.readInt();
323            String resultData = data.readString();
324            Bundle resultExtras = data.readBundle();
325            boolean resultAbort = data.readInt() != 0;
326            if (who != null) {
327                finishReceiver(who, resultCode, resultData, resultExtras, resultAbort);
328            }
329            reply.writeNoException();
330            return true;
331        }
332
333        case ATTACH_APPLICATION_TRANSACTION: {
334            data.enforceInterface(IActivityManager.descriptor);
335            IApplicationThread app = ApplicationThreadNative.asInterface(
336                    data.readStrongBinder());
337            if (app != null) {
338                attachApplication(app);
339            }
340            reply.writeNoException();
341            return true;
342        }
343
344        case ACTIVITY_IDLE_TRANSACTION: {
345            data.enforceInterface(IActivityManager.descriptor);
346            IBinder token = data.readStrongBinder();
347            Configuration config = null;
348            if (data.readInt() != 0) {
349                config = Configuration.CREATOR.createFromParcel(data);
350            }
351            if (token != null) {
352                activityIdle(token, config);
353            }
354            reply.writeNoException();
355            return true;
356        }
357
358        case ACTIVITY_PAUSED_TRANSACTION: {
359            data.enforceInterface(IActivityManager.descriptor);
360            IBinder token = data.readStrongBinder();
361            activityPaused(token);
362            reply.writeNoException();
363            return true;
364        }
365
366        case ACTIVITY_STOPPED_TRANSACTION: {
367            data.enforceInterface(IActivityManager.descriptor);
368            IBinder token = data.readStrongBinder();
369            Bundle map = data.readBundle();
370            Bitmap thumbnail = data.readInt() != 0
371                ? Bitmap.CREATOR.createFromParcel(data) : null;
372            CharSequence description = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(data);
373            activityStopped(token, map, thumbnail, description);
374            reply.writeNoException();
375            return true;
376        }
377
378        case ACTIVITY_SLEPT_TRANSACTION: {
379            data.enforceInterface(IActivityManager.descriptor);
380            IBinder token = data.readStrongBinder();
381            activitySlept(token);
382            reply.writeNoException();
383            return true;
384        }
385
386        case ACTIVITY_DESTROYED_TRANSACTION: {
387            data.enforceInterface(IActivityManager.descriptor);
388            IBinder token = data.readStrongBinder();
389            activityDestroyed(token);
390            reply.writeNoException();
391            return true;
392        }
393
394        case GET_CALLING_PACKAGE_TRANSACTION: {
395            data.enforceInterface(IActivityManager.descriptor);
396            IBinder token = data.readStrongBinder();
397            String res = token != null ? getCallingPackage(token) : null;
398            reply.writeNoException();
399            reply.writeString(res);
400            return true;
401        }
402
403        case GET_CALLING_ACTIVITY_TRANSACTION: {
404            data.enforceInterface(IActivityManager.descriptor);
405            IBinder token = data.readStrongBinder();
406            ComponentName cn = getCallingActivity(token);
407            reply.writeNoException();
408            ComponentName.writeToParcel(cn, reply);
409            return true;
410        }
411
412        case GET_TASKS_TRANSACTION: {
413            data.enforceInterface(IActivityManager.descriptor);
414            int maxNum = data.readInt();
415            int fl = data.readInt();
416            IBinder receiverBinder = data.readStrongBinder();
417            IThumbnailReceiver receiver = receiverBinder != null
418                ? IThumbnailReceiver.Stub.asInterface(receiverBinder)
419                : null;
420            List list = getTasks(maxNum, fl, receiver);
421            reply.writeNoException();
422            int N = list != null ? list.size() : -1;
423            reply.writeInt(N);
424            int i;
425            for (i=0; i<N; i++) {
426                ActivityManager.RunningTaskInfo info =
427                        (ActivityManager.RunningTaskInfo)list.get(i);
428                info.writeToParcel(reply, 0);
429            }
430            return true;
431        }
432
433        case GET_RECENT_TASKS_TRANSACTION: {
434            data.enforceInterface(IActivityManager.descriptor);
435            int maxNum = data.readInt();
436            int fl = data.readInt();
437            List<ActivityManager.RecentTaskInfo> list = getRecentTasks(maxNum,
438                    fl);
439            reply.writeNoException();
440            reply.writeTypedList(list);
441            return true;
442        }
443
444        case GET_TASK_THUMBNAILS_TRANSACTION: {
445            data.enforceInterface(IActivityManager.descriptor);
446            int id = data.readInt();
447            ActivityManager.TaskThumbnails bm = getTaskThumbnails(id);
448            reply.writeNoException();
449            if (bm != null) {
450                reply.writeInt(1);
451                bm.writeToParcel(reply, 0);
452            } else {
453                reply.writeInt(0);
454            }
455            return true;
456        }
457
458        case GET_SERVICES_TRANSACTION: {
459            data.enforceInterface(IActivityManager.descriptor);
460            int maxNum = data.readInt();
461            int fl = data.readInt();
462            List list = getServices(maxNum, fl);
463            reply.writeNoException();
464            int N = list != null ? list.size() : -1;
465            reply.writeInt(N);
466            int i;
467            for (i=0; i<N; i++) {
468                ActivityManager.RunningServiceInfo info =
469                        (ActivityManager.RunningServiceInfo)list.get(i);
470                info.writeToParcel(reply, 0);
471            }
472            return true;
473        }
474
475        case GET_PROCESSES_IN_ERROR_STATE_TRANSACTION: {
476            data.enforceInterface(IActivityManager.descriptor);
477            List<ActivityManager.ProcessErrorStateInfo> list = getProcessesInErrorState();
478            reply.writeNoException();
479            reply.writeTypedList(list);
480            return true;
481        }
482
483        case GET_RUNNING_APP_PROCESSES_TRANSACTION: {
484            data.enforceInterface(IActivityManager.descriptor);
485            List<ActivityManager.RunningAppProcessInfo> list = getRunningAppProcesses();
486            reply.writeNoException();
487            reply.writeTypedList(list);
488            return true;
489        }
490
491        case GET_RUNNING_EXTERNAL_APPLICATIONS_TRANSACTION: {
492            data.enforceInterface(IActivityManager.descriptor);
493            List<ApplicationInfo> list = getRunningExternalApplications();
494            reply.writeNoException();
495            reply.writeTypedList(list);
496            return true;
497        }
498
499        case MOVE_TASK_TO_FRONT_TRANSACTION: {
500            data.enforceInterface(IActivityManager.descriptor);
501            int task = data.readInt();
502            int fl = data.readInt();
503            moveTaskToFront(task, fl);
504            reply.writeNoException();
505            return true;
506        }
507
508        case MOVE_TASK_TO_BACK_TRANSACTION: {
509            data.enforceInterface(IActivityManager.descriptor);
510            int task = data.readInt();
511            moveTaskToBack(task);
512            reply.writeNoException();
513            return true;
514        }
515
516        case MOVE_ACTIVITY_TASK_TO_BACK_TRANSACTION: {
517            data.enforceInterface(IActivityManager.descriptor);
518            IBinder token = data.readStrongBinder();
519            boolean nonRoot = data.readInt() != 0;
520            boolean res = moveActivityTaskToBack(token, nonRoot);
521            reply.writeNoException();
522            reply.writeInt(res ? 1 : 0);
523            return true;
524        }
525
526        case MOVE_TASK_BACKWARDS_TRANSACTION: {
527            data.enforceInterface(IActivityManager.descriptor);
528            int task = data.readInt();
529            moveTaskBackwards(task);
530            reply.writeNoException();
531            return true;
532        }
533
534        case GET_TASK_FOR_ACTIVITY_TRANSACTION: {
535            data.enforceInterface(IActivityManager.descriptor);
536            IBinder token = data.readStrongBinder();
537            boolean onlyRoot = data.readInt() != 0;
538            int res = token != null
539                ? getTaskForActivity(token, onlyRoot) : -1;
540                reply.writeNoException();
541            reply.writeInt(res);
542            return true;
543        }
544
545        case FINISH_OTHER_INSTANCES_TRANSACTION: {
546            data.enforceInterface(IActivityManager.descriptor);
547            IBinder token = data.readStrongBinder();
548            ComponentName className = ComponentName.readFromParcel(data);
549            finishOtherInstances(token, className);
550            reply.writeNoException();
551            return true;
552        }
553
554        case REPORT_THUMBNAIL_TRANSACTION: {
555            data.enforceInterface(IActivityManager.descriptor);
556            IBinder token = data.readStrongBinder();
557            Bitmap thumbnail = data.readInt() != 0
558                ? Bitmap.CREATOR.createFromParcel(data) : null;
559            CharSequence description = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(data);
560            reportThumbnail(token, thumbnail, description);
561            reply.writeNoException();
562            return true;
563        }
564
565        case GET_CONTENT_PROVIDER_TRANSACTION: {
566            data.enforceInterface(IActivityManager.descriptor);
567            IBinder b = data.readStrongBinder();
568            IApplicationThread app = ApplicationThreadNative.asInterface(b);
569            String name = data.readString();
570            ContentProviderHolder cph = getContentProvider(app, name);
571            reply.writeNoException();
572            if (cph != null) {
573                reply.writeInt(1);
574                cph.writeToParcel(reply, 0);
575            } else {
576                reply.writeInt(0);
577            }
578            return true;
579        }
580
581        case PUBLISH_CONTENT_PROVIDERS_TRANSACTION: {
582            data.enforceInterface(IActivityManager.descriptor);
583            IBinder b = data.readStrongBinder();
584            IApplicationThread app = ApplicationThreadNative.asInterface(b);
585            ArrayList<ContentProviderHolder> providers =
586                data.createTypedArrayList(ContentProviderHolder.CREATOR);
587            publishContentProviders(app, providers);
588            reply.writeNoException();
589            return true;
590        }
591
592        case REMOVE_CONTENT_PROVIDER_TRANSACTION: {
593            data.enforceInterface(IActivityManager.descriptor);
594            IBinder b = data.readStrongBinder();
595            IApplicationThread app = ApplicationThreadNative.asInterface(b);
596            String name = data.readString();
597            removeContentProvider(app, name);
598            reply.writeNoException();
599            return true;
600        }
601
602        case GET_RUNNING_SERVICE_CONTROL_PANEL_TRANSACTION: {
603            data.enforceInterface(IActivityManager.descriptor);
604            ComponentName comp = ComponentName.CREATOR.createFromParcel(data);
605            PendingIntent pi = getRunningServiceControlPanel(comp);
606            reply.writeNoException();
607            PendingIntent.writePendingIntentOrNullToParcel(pi, reply);
608            return true;
609        }
610
611        case START_SERVICE_TRANSACTION: {
612            data.enforceInterface(IActivityManager.descriptor);
613            IBinder b = data.readStrongBinder();
614            IApplicationThread app = ApplicationThreadNative.asInterface(b);
615            Intent service = Intent.CREATOR.createFromParcel(data);
616            String resolvedType = data.readString();
617            ComponentName cn = startService(app, service, resolvedType);
618            reply.writeNoException();
619            ComponentName.writeToParcel(cn, reply);
620            return true;
621        }
622
623        case STOP_SERVICE_TRANSACTION: {
624            data.enforceInterface(IActivityManager.descriptor);
625            IBinder b = data.readStrongBinder();
626            IApplicationThread app = ApplicationThreadNative.asInterface(b);
627            Intent service = Intent.CREATOR.createFromParcel(data);
628            String resolvedType = data.readString();
629            int res = stopService(app, service, resolvedType);
630            reply.writeNoException();
631            reply.writeInt(res);
632            return true;
633        }
634
635        case STOP_SERVICE_TOKEN_TRANSACTION: {
636            data.enforceInterface(IActivityManager.descriptor);
637            ComponentName className = ComponentName.readFromParcel(data);
638            IBinder token = data.readStrongBinder();
639            int startId = data.readInt();
640            boolean res = stopServiceToken(className, token, startId);
641            reply.writeNoException();
642            reply.writeInt(res ? 1 : 0);
643            return true;
644        }
645
646        case SET_SERVICE_FOREGROUND_TRANSACTION: {
647            data.enforceInterface(IActivityManager.descriptor);
648            ComponentName className = ComponentName.readFromParcel(data);
649            IBinder token = data.readStrongBinder();
650            int id = data.readInt();
651            Notification notification = null;
652            if (data.readInt() != 0) {
653                notification = Notification.CREATOR.createFromParcel(data);
654            }
655            boolean removeNotification = data.readInt() != 0;
656            setServiceForeground(className, token, id, notification, removeNotification);
657            reply.writeNoException();
658            return true;
659        }
660
661        case BIND_SERVICE_TRANSACTION: {
662            data.enforceInterface(IActivityManager.descriptor);
663            IBinder b = data.readStrongBinder();
664            IApplicationThread app = ApplicationThreadNative.asInterface(b);
665            IBinder token = data.readStrongBinder();
666            Intent service = Intent.CREATOR.createFromParcel(data);
667            String resolvedType = data.readString();
668            b = data.readStrongBinder();
669            int fl = data.readInt();
670            IServiceConnection conn = IServiceConnection.Stub.asInterface(b);
671            int res = bindService(app, token, service, resolvedType, conn, fl);
672            reply.writeNoException();
673            reply.writeInt(res);
674            return true;
675        }
676
677        case UNBIND_SERVICE_TRANSACTION: {
678            data.enforceInterface(IActivityManager.descriptor);
679            IBinder b = data.readStrongBinder();
680            IServiceConnection conn = IServiceConnection.Stub.asInterface(b);
681            boolean res = unbindService(conn);
682            reply.writeNoException();
683            reply.writeInt(res ? 1 : 0);
684            return true;
685        }
686
687        case PUBLISH_SERVICE_TRANSACTION: {
688            data.enforceInterface(IActivityManager.descriptor);
689            IBinder token = data.readStrongBinder();
690            Intent intent = Intent.CREATOR.createFromParcel(data);
691            IBinder service = data.readStrongBinder();
692            publishService(token, intent, service);
693            reply.writeNoException();
694            return true;
695        }
696
697        case UNBIND_FINISHED_TRANSACTION: {
698            data.enforceInterface(IActivityManager.descriptor);
699            IBinder token = data.readStrongBinder();
700            Intent intent = Intent.CREATOR.createFromParcel(data);
701            boolean doRebind = data.readInt() != 0;
702            unbindFinished(token, intent, doRebind);
703            reply.writeNoException();
704            return true;
705        }
706
707        case SERVICE_DONE_EXECUTING_TRANSACTION: {
708            data.enforceInterface(IActivityManager.descriptor);
709            IBinder token = data.readStrongBinder();
710            int type = data.readInt();
711            int startId = data.readInt();
712            int res = data.readInt();
713            serviceDoneExecuting(token, type, startId, res);
714            reply.writeNoException();
715            return true;
716        }
717
718        case START_INSTRUMENTATION_TRANSACTION: {
719            data.enforceInterface(IActivityManager.descriptor);
720            ComponentName className = ComponentName.readFromParcel(data);
721            String profileFile = data.readString();
722            int fl = data.readInt();
723            Bundle arguments = data.readBundle();
724            IBinder b = data.readStrongBinder();
725            IInstrumentationWatcher w = IInstrumentationWatcher.Stub.asInterface(b);
726            boolean res = startInstrumentation(className, profileFile, fl, arguments, w);
727            reply.writeNoException();
728            reply.writeInt(res ? 1 : 0);
729            return true;
730        }
731
732
733        case FINISH_INSTRUMENTATION_TRANSACTION: {
734            data.enforceInterface(IActivityManager.descriptor);
735            IBinder b = data.readStrongBinder();
736            IApplicationThread app = ApplicationThreadNative.asInterface(b);
737            int resultCode = data.readInt();
738            Bundle results = data.readBundle();
739            finishInstrumentation(app, resultCode, results);
740            reply.writeNoException();
741            return true;
742        }
743
744        case GET_CONFIGURATION_TRANSACTION: {
745            data.enforceInterface(IActivityManager.descriptor);
746            Configuration config = getConfiguration();
747            reply.writeNoException();
748            config.writeToParcel(reply, 0);
749            return true;
750        }
751
752        case UPDATE_CONFIGURATION_TRANSACTION: {
753            data.enforceInterface(IActivityManager.descriptor);
754            Configuration config = Configuration.CREATOR.createFromParcel(data);
755            updateConfiguration(config);
756            reply.writeNoException();
757            return true;
758        }
759
760        case SET_REQUESTED_ORIENTATION_TRANSACTION: {
761            data.enforceInterface(IActivityManager.descriptor);
762            IBinder token = data.readStrongBinder();
763            int requestedOrientation = data.readInt();
764            setRequestedOrientation(token, requestedOrientation);
765            reply.writeNoException();
766            return true;
767        }
768
769        case GET_REQUESTED_ORIENTATION_TRANSACTION: {
770            data.enforceInterface(IActivityManager.descriptor);
771            IBinder token = data.readStrongBinder();
772            int req = getRequestedOrientation(token);
773            reply.writeNoException();
774            reply.writeInt(req);
775            return true;
776        }
777
778        case GET_ACTIVITY_CLASS_FOR_TOKEN_TRANSACTION: {
779            data.enforceInterface(IActivityManager.descriptor);
780            IBinder token = data.readStrongBinder();
781            ComponentName cn = getActivityClassForToken(token);
782            reply.writeNoException();
783            ComponentName.writeToParcel(cn, reply);
784            return true;
785        }
786
787        case GET_PACKAGE_FOR_TOKEN_TRANSACTION: {
788            data.enforceInterface(IActivityManager.descriptor);
789            IBinder token = data.readStrongBinder();
790            reply.writeNoException();
791            reply.writeString(getPackageForToken(token));
792            return true;
793        }
794
795        case GET_INTENT_SENDER_TRANSACTION: {
796            data.enforceInterface(IActivityManager.descriptor);
797            int type = data.readInt();
798            String packageName = data.readString();
799            IBinder token = data.readStrongBinder();
800            String resultWho = data.readString();
801            int requestCode = data.readInt();
802            Intent[] requestIntents;
803            String[] requestResolvedTypes;
804            if (data.readInt() != 0) {
805                requestIntents = data.createTypedArray(Intent.CREATOR);
806                requestResolvedTypes = data.createStringArray();
807            } else {
808                requestIntents = null;
809                requestResolvedTypes = null;
810            }
811            int fl = data.readInt();
812            IIntentSender res = getIntentSender(type, packageName, token,
813                    resultWho, requestCode, requestIntents,
814                    requestResolvedTypes, fl);
815            reply.writeNoException();
816            reply.writeStrongBinder(res != null ? res.asBinder() : null);
817            return true;
818        }
819
820        case CANCEL_INTENT_SENDER_TRANSACTION: {
821            data.enforceInterface(IActivityManager.descriptor);
822            IIntentSender r = IIntentSender.Stub.asInterface(
823                data.readStrongBinder());
824            cancelIntentSender(r);
825            reply.writeNoException();
826            return true;
827        }
828
829        case GET_PACKAGE_FOR_INTENT_SENDER_TRANSACTION: {
830            data.enforceInterface(IActivityManager.descriptor);
831            IIntentSender r = IIntentSender.Stub.asInterface(
832                data.readStrongBinder());
833            String res = getPackageForIntentSender(r);
834            reply.writeNoException();
835            reply.writeString(res);
836            return true;
837        }
838
839        case SET_PROCESS_LIMIT_TRANSACTION: {
840            data.enforceInterface(IActivityManager.descriptor);
841            int max = data.readInt();
842            setProcessLimit(max);
843            reply.writeNoException();
844            return true;
845        }
846
847        case GET_PROCESS_LIMIT_TRANSACTION: {
848            data.enforceInterface(IActivityManager.descriptor);
849            int limit = getProcessLimit();
850            reply.writeNoException();
851            reply.writeInt(limit);
852            return true;
853        }
854
855        case SET_PROCESS_FOREGROUND_TRANSACTION: {
856            data.enforceInterface(IActivityManager.descriptor);
857            IBinder token = data.readStrongBinder();
858            int pid = data.readInt();
859            boolean isForeground = data.readInt() != 0;
860            setProcessForeground(token, pid, isForeground);
861            reply.writeNoException();
862            return true;
863        }
864
865        case CHECK_PERMISSION_TRANSACTION: {
866            data.enforceInterface(IActivityManager.descriptor);
867            String perm = data.readString();
868            int pid = data.readInt();
869            int uid = data.readInt();
870            int res = checkPermission(perm, pid, uid);
871            reply.writeNoException();
872            reply.writeInt(res);
873            return true;
874        }
875
876        case CHECK_URI_PERMISSION_TRANSACTION: {
877            data.enforceInterface(IActivityManager.descriptor);
878            Uri uri = Uri.CREATOR.createFromParcel(data);
879            int pid = data.readInt();
880            int uid = data.readInt();
881            int mode = data.readInt();
882            int res = checkUriPermission(uri, pid, uid, mode);
883            reply.writeNoException();
884            reply.writeInt(res);
885            return true;
886        }
887
888        case CLEAR_APP_DATA_TRANSACTION: {
889            data.enforceInterface(IActivityManager.descriptor);
890            String packageName = data.readString();
891            IPackageDataObserver observer = IPackageDataObserver.Stub.asInterface(
892                    data.readStrongBinder());
893            boolean res = clearApplicationUserData(packageName, observer);
894            reply.writeNoException();
895            reply.writeInt(res ? 1 : 0);
896            return true;
897        }
898
899        case GRANT_URI_PERMISSION_TRANSACTION: {
900            data.enforceInterface(IActivityManager.descriptor);
901            IBinder b = data.readStrongBinder();
902            IApplicationThread app = ApplicationThreadNative.asInterface(b);
903            String targetPkg = data.readString();
904            Uri uri = Uri.CREATOR.createFromParcel(data);
905            int mode = data.readInt();
906            grantUriPermission(app, targetPkg, uri, mode);
907            reply.writeNoException();
908            return true;
909        }
910
911        case REVOKE_URI_PERMISSION_TRANSACTION: {
912            data.enforceInterface(IActivityManager.descriptor);
913            IBinder b = data.readStrongBinder();
914            IApplicationThread app = ApplicationThreadNative.asInterface(b);
915            Uri uri = Uri.CREATOR.createFromParcel(data);
916            int mode = data.readInt();
917            revokeUriPermission(app, uri, mode);
918            reply.writeNoException();
919            return true;
920        }
921
922        case SHOW_WAITING_FOR_DEBUGGER_TRANSACTION: {
923            data.enforceInterface(IActivityManager.descriptor);
924            IBinder b = data.readStrongBinder();
925            IApplicationThread app = ApplicationThreadNative.asInterface(b);
926            boolean waiting = data.readInt() != 0;
927            showWaitingForDebugger(app, waiting);
928            reply.writeNoException();
929            return true;
930        }
931
932        case GET_MEMORY_INFO_TRANSACTION: {
933            data.enforceInterface(IActivityManager.descriptor);
934            ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();
935            getMemoryInfo(mi);
936            reply.writeNoException();
937            mi.writeToParcel(reply, 0);
938            return true;
939        }
940
941        case UNHANDLED_BACK_TRANSACTION: {
942            data.enforceInterface(IActivityManager.descriptor);
943            unhandledBack();
944            reply.writeNoException();
945            return true;
946        }
947
948        case OPEN_CONTENT_URI_TRANSACTION: {
949            data.enforceInterface(IActivityManager.descriptor);
950            Uri uri = Uri.parse(data.readString());
951            ParcelFileDescriptor pfd = openContentUri(uri);
952            reply.writeNoException();
953            if (pfd != null) {
954                reply.writeInt(1);
955                pfd.writeToParcel(reply, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
956            } else {
957                reply.writeInt(0);
958            }
959            return true;
960        }
961
962        case GOING_TO_SLEEP_TRANSACTION: {
963            data.enforceInterface(IActivityManager.descriptor);
964            goingToSleep();
965            reply.writeNoException();
966            return true;
967        }
968
969        case WAKING_UP_TRANSACTION: {
970            data.enforceInterface(IActivityManager.descriptor);
971            wakingUp();
972            reply.writeNoException();
973            return true;
974        }
975
976        case SET_DEBUG_APP_TRANSACTION: {
977            data.enforceInterface(IActivityManager.descriptor);
978            String pn = data.readString();
979            boolean wfd = data.readInt() != 0;
980            boolean per = data.readInt() != 0;
981            setDebugApp(pn, wfd, per);
982            reply.writeNoException();
983            return true;
984        }
985
986        case SET_ALWAYS_FINISH_TRANSACTION: {
987            data.enforceInterface(IActivityManager.descriptor);
988            boolean enabled = data.readInt() != 0;
989            setAlwaysFinish(enabled);
990            reply.writeNoException();
991            return true;
992        }
993
994        case SET_ACTIVITY_CONTROLLER_TRANSACTION: {
995            data.enforceInterface(IActivityManager.descriptor);
996            IActivityController watcher = IActivityController.Stub.asInterface(
997                    data.readStrongBinder());
998            setActivityController(watcher);
999            return true;
1000        }
1001
1002        case ENTER_SAFE_MODE_TRANSACTION: {
1003            data.enforceInterface(IActivityManager.descriptor);
1004            enterSafeMode();
1005            reply.writeNoException();
1006            return true;
1007        }
1008
1009        case NOTE_WAKEUP_ALARM_TRANSACTION: {
1010            data.enforceInterface(IActivityManager.descriptor);
1011            IIntentSender is = IIntentSender.Stub.asInterface(
1012                    data.readStrongBinder());
1013            noteWakeupAlarm(is);
1014            reply.writeNoException();
1015            return true;
1016        }
1017
1018        case KILL_PIDS_TRANSACTION: {
1019            data.enforceInterface(IActivityManager.descriptor);
1020            int[] pids = data.createIntArray();
1021            String reason = data.readString();
1022            boolean secure = data.readInt() != 0;
1023            boolean res = killPids(pids, reason, secure);
1024            reply.writeNoException();
1025            reply.writeInt(res ? 1 : 0);
1026            return true;
1027        }
1028
1029        case START_RUNNING_TRANSACTION: {
1030            data.enforceInterface(IActivityManager.descriptor);
1031            String pkg = data.readString();
1032            String cls = data.readString();
1033            String action = data.readString();
1034            String indata = data.readString();
1035            startRunning(pkg, cls, action, indata);
1036            reply.writeNoException();
1037            return true;
1038        }
1039
1040        case HANDLE_APPLICATION_CRASH_TRANSACTION: {
1041            data.enforceInterface(IActivityManager.descriptor);
1042            IBinder app = data.readStrongBinder();
1043            ApplicationErrorReport.CrashInfo ci = new ApplicationErrorReport.CrashInfo(data);
1044            handleApplicationCrash(app, ci);
1045            reply.writeNoException();
1046            return true;
1047        }
1048
1049        case HANDLE_APPLICATION_WTF_TRANSACTION: {
1050            data.enforceInterface(IActivityManager.descriptor);
1051            IBinder app = data.readStrongBinder();
1052            String tag = data.readString();
1053            ApplicationErrorReport.CrashInfo ci = new ApplicationErrorReport.CrashInfo(data);
1054            boolean res = handleApplicationWtf(app, tag, ci);
1055            reply.writeNoException();
1056            reply.writeInt(res ? 1 : 0);
1057            return true;
1058        }
1059
1060        case HANDLE_APPLICATION_STRICT_MODE_VIOLATION_TRANSACTION: {
1061            data.enforceInterface(IActivityManager.descriptor);
1062            IBinder app = data.readStrongBinder();
1063            int violationMask = data.readInt();
1064            StrictMode.ViolationInfo info = new StrictMode.ViolationInfo(data);
1065            handleApplicationStrictModeViolation(app, violationMask, info);
1066            reply.writeNoException();
1067            return true;
1068        }
1069
1070        case SIGNAL_PERSISTENT_PROCESSES_TRANSACTION: {
1071            data.enforceInterface(IActivityManager.descriptor);
1072            int sig = data.readInt();
1073            signalPersistentProcesses(sig);
1074            reply.writeNoException();
1075            return true;
1076        }
1077
1078        case KILL_BACKGROUND_PROCESSES_TRANSACTION: {
1079            data.enforceInterface(IActivityManager.descriptor);
1080            String packageName = data.readString();
1081            killBackgroundProcesses(packageName);
1082            reply.writeNoException();
1083            return true;
1084        }
1085
1086        case FORCE_STOP_PACKAGE_TRANSACTION: {
1087            data.enforceInterface(IActivityManager.descriptor);
1088            String packageName = data.readString();
1089            forceStopPackage(packageName);
1090            reply.writeNoException();
1091            return true;
1092        }
1093
1094        case GET_DEVICE_CONFIGURATION_TRANSACTION: {
1095            data.enforceInterface(IActivityManager.descriptor);
1096            ConfigurationInfo config = getDeviceConfigurationInfo();
1097            reply.writeNoException();
1098            config.writeToParcel(reply, 0);
1099            return true;
1100        }
1101
1102        case PROFILE_CONTROL_TRANSACTION: {
1103            data.enforceInterface(IActivityManager.descriptor);
1104            String process = data.readString();
1105            boolean start = data.readInt() != 0;
1106            String path = data.readString();
1107            ParcelFileDescriptor fd = data.readInt() != 0
1108                    ? data.readFileDescriptor() : null;
1109            boolean res = profileControl(process, start, path, fd);
1110            reply.writeNoException();
1111            reply.writeInt(res ? 1 : 0);
1112            return true;
1113        }
1114
1115        case SHUTDOWN_TRANSACTION: {
1116            data.enforceInterface(IActivityManager.descriptor);
1117            boolean res = shutdown(data.readInt());
1118            reply.writeNoException();
1119            reply.writeInt(res ? 1 : 0);
1120            return true;
1121        }
1122
1123        case STOP_APP_SWITCHES_TRANSACTION: {
1124            data.enforceInterface(IActivityManager.descriptor);
1125            stopAppSwitches();
1126            reply.writeNoException();
1127            return true;
1128        }
1129
1130        case RESUME_APP_SWITCHES_TRANSACTION: {
1131            data.enforceInterface(IActivityManager.descriptor);
1132            resumeAppSwitches();
1133            reply.writeNoException();
1134            return true;
1135        }
1136
1137        case PEEK_SERVICE_TRANSACTION: {
1138            data.enforceInterface(IActivityManager.descriptor);
1139            Intent service = Intent.CREATOR.createFromParcel(data);
1140            String resolvedType = data.readString();
1141            IBinder binder = peekService(service, resolvedType);
1142            reply.writeNoException();
1143            reply.writeStrongBinder(binder);
1144            return true;
1145        }
1146
1147        case START_BACKUP_AGENT_TRANSACTION: {
1148            data.enforceInterface(IActivityManager.descriptor);
1149            ApplicationInfo info = ApplicationInfo.CREATOR.createFromParcel(data);
1150            int backupRestoreMode = data.readInt();
1151            boolean success = bindBackupAgent(info, backupRestoreMode);
1152            reply.writeNoException();
1153            reply.writeInt(success ? 1 : 0);
1154            return true;
1155        }
1156
1157        case BACKUP_AGENT_CREATED_TRANSACTION: {
1158            data.enforceInterface(IActivityManager.descriptor);
1159            String packageName = data.readString();
1160            IBinder agent = data.readStrongBinder();
1161            backupAgentCreated(packageName, agent);
1162            reply.writeNoException();
1163            return true;
1164        }
1165
1166        case UNBIND_BACKUP_AGENT_TRANSACTION: {
1167            data.enforceInterface(IActivityManager.descriptor);
1168            ApplicationInfo info = ApplicationInfo.CREATOR.createFromParcel(data);
1169            unbindBackupAgent(info);
1170            reply.writeNoException();
1171            return true;
1172        }
1173
1174        case REGISTER_ACTIVITY_WATCHER_TRANSACTION: {
1175            data.enforceInterface(IActivityManager.descriptor);
1176            IActivityWatcher watcher = IActivityWatcher.Stub.asInterface(
1177                    data.readStrongBinder());
1178            registerActivityWatcher(watcher);
1179            return true;
1180        }
1181
1182        case UNREGISTER_ACTIVITY_WATCHER_TRANSACTION: {
1183            data.enforceInterface(IActivityManager.descriptor);
1184            IActivityWatcher watcher = IActivityWatcher.Stub.asInterface(
1185                    data.readStrongBinder());
1186            unregisterActivityWatcher(watcher);
1187            return true;
1188        }
1189
1190        case START_ACTIVITY_IN_PACKAGE_TRANSACTION:
1191        {
1192            data.enforceInterface(IActivityManager.descriptor);
1193            int uid = data.readInt();
1194            Intent intent = Intent.CREATOR.createFromParcel(data);
1195            String resolvedType = data.readString();
1196            IBinder resultTo = data.readStrongBinder();
1197            String resultWho = data.readString();
1198            int requestCode = data.readInt();
1199            boolean onlyIfNeeded = data.readInt() != 0;
1200            int result = startActivityInPackage(uid, intent, resolvedType,
1201                    resultTo, resultWho, requestCode, onlyIfNeeded);
1202            reply.writeNoException();
1203            reply.writeInt(result);
1204            return true;
1205        }
1206
1207        case KILL_APPLICATION_WITH_UID_TRANSACTION: {
1208            data.enforceInterface(IActivityManager.descriptor);
1209            String pkg = data.readString();
1210            int uid = data.readInt();
1211            killApplicationWithUid(pkg, uid);
1212            reply.writeNoException();
1213            return true;
1214        }
1215
1216        case CLOSE_SYSTEM_DIALOGS_TRANSACTION: {
1217            data.enforceInterface(IActivityManager.descriptor);
1218            String reason = data.readString();
1219            closeSystemDialogs(reason);
1220            reply.writeNoException();
1221            return true;
1222        }
1223
1224        case GET_PROCESS_MEMORY_INFO_TRANSACTION: {
1225            data.enforceInterface(IActivityManager.descriptor);
1226            int[] pids = data.createIntArray();
1227            Debug.MemoryInfo[] res =  getProcessMemoryInfo(pids);
1228            reply.writeNoException();
1229            reply.writeTypedArray(res, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
1230            return true;
1231        }
1232
1233        case KILL_APPLICATION_PROCESS_TRANSACTION: {
1234            data.enforceInterface(IActivityManager.descriptor);
1235            String processName = data.readString();
1236            int uid = data.readInt();
1237            killApplicationProcess(processName, uid);
1238            reply.writeNoException();
1239            return true;
1240        }
1241
1242        case OVERRIDE_PENDING_TRANSITION_TRANSACTION: {
1243            data.enforceInterface(IActivityManager.descriptor);
1244            IBinder token = data.readStrongBinder();
1245            String packageName = data.readString();
1246            int enterAnim = data.readInt();
1247            int exitAnim = data.readInt();
1248            overridePendingTransition(token, packageName, enterAnim, exitAnim);
1249            reply.writeNoException();
1250            return true;
1251        }
1252
1253        case IS_USER_A_MONKEY_TRANSACTION: {
1254            data.enforceInterface(IActivityManager.descriptor);
1255            boolean areThey = isUserAMonkey();
1256            reply.writeNoException();
1257            reply.writeInt(areThey ? 1 : 0);
1258            return true;
1259        }
1260
1261        case FINISH_HEAVY_WEIGHT_APP_TRANSACTION: {
1262            data.enforceInterface(IActivityManager.descriptor);
1263            finishHeavyWeightApp();
1264            reply.writeNoException();
1265            return true;
1266        }
1267
1268        case IS_IMMERSIVE_TRANSACTION: {
1269            data.enforceInterface(IActivityManager.descriptor);
1270            IBinder token = data.readStrongBinder();
1271            boolean isit = isImmersive(token);
1272            reply.writeNoException();
1273            reply.writeInt(isit ? 1 : 0);
1274            return true;
1275        }
1276
1277        case SET_IMMERSIVE_TRANSACTION: {
1278            data.enforceInterface(IActivityManager.descriptor);
1279            IBinder token = data.readStrongBinder();
1280            boolean imm = data.readInt() == 1;
1281            setImmersive(token, imm);
1282            reply.writeNoException();
1283            return true;
1284        }
1285
1286        case IS_TOP_ACTIVITY_IMMERSIVE_TRANSACTION: {
1287            data.enforceInterface(IActivityManager.descriptor);
1288            boolean isit = isTopActivityImmersive();
1289            reply.writeNoException();
1290            reply.writeInt(isit ? 1 : 0);
1291            return true;
1292        }
1293
1294        case CRASH_APPLICATION_TRANSACTION: {
1295            data.enforceInterface(IActivityManager.descriptor);
1296            int uid = data.readInt();
1297            int initialPid = data.readInt();
1298            String packageName = data.readString();
1299            String message = data.readString();
1300            crashApplication(uid, initialPid, packageName, message);
1301            reply.writeNoException();
1302            return true;
1303        }
1304
1305        case GET_PROVIDER_MIME_TYPE_TRANSACTION: {
1306            data.enforceInterface(IActivityManager.descriptor);
1307            Uri uri = Uri.CREATOR.createFromParcel(data);
1308            String type = getProviderMimeType(uri);
1309            reply.writeNoException();
1310            reply.writeString(type);
1311            return true;
1312        }
1313
1314        case NEW_URI_PERMISSION_OWNER_TRANSACTION: {
1315            data.enforceInterface(IActivityManager.descriptor);
1316            String name = data.readString();
1317            IBinder perm = newUriPermissionOwner(name);
1318            reply.writeNoException();
1319            reply.writeStrongBinder(perm);
1320            return true;
1321        }
1322
1323        case GRANT_URI_PERMISSION_FROM_OWNER_TRANSACTION: {
1324            data.enforceInterface(IActivityManager.descriptor);
1325            IBinder owner = data.readStrongBinder();
1326            int fromUid = data.readInt();
1327            String targetPkg = data.readString();
1328            Uri uri = Uri.CREATOR.createFromParcel(data);
1329            int mode = data.readInt();
1330            grantUriPermissionFromOwner(owner, fromUid, targetPkg, uri, mode);
1331            reply.writeNoException();
1332            return true;
1333        }
1334
1335        case REVOKE_URI_PERMISSION_FROM_OWNER_TRANSACTION: {
1336            data.enforceInterface(IActivityManager.descriptor);
1337            IBinder owner = data.readStrongBinder();
1338            Uri uri = null;
1339            if (data.readInt() != 0) {
1340                Uri.CREATOR.createFromParcel(data);
1341            }
1342            int mode = data.readInt();
1343            revokeUriPermissionFromOwner(owner, uri, mode);
1344            reply.writeNoException();
1345            return true;
1346        }
1347
1348        case CHECK_GRANT_URI_PERMISSION_TRANSACTION: {
1349            data.enforceInterface(IActivityManager.descriptor);
1350            int callingUid = data.readInt();
1351            String targetPkg = data.readString();
1352            Uri uri = Uri.CREATOR.createFromParcel(data);
1353            int modeFlags = data.readInt();
1354            int res = checkGrantUriPermission(callingUid, targetPkg, uri, modeFlags);
1355            reply.writeNoException();
1356            reply.writeInt(res);
1357            return true;
1358        }
1359
1360        case DUMP_HEAP_TRANSACTION: {
1361            data.enforceInterface(IActivityManager.descriptor);
1362            String process = data.readString();
1363            boolean managed = data.readInt() != 0;
1364            String path = data.readString();
1365            ParcelFileDescriptor fd = data.readInt() != 0
1366                    ? data.readFileDescriptor() : null;
1367            boolean res = dumpHeap(process, managed, path, fd);
1368            reply.writeNoException();
1369            reply.writeInt(res ? 1 : 0);
1370            return true;
1371        }
1372
1373        case START_ACTIVITIES_IN_PACKAGE_TRANSACTION:
1374        {
1375            data.enforceInterface(IActivityManager.descriptor);
1376            int uid = data.readInt();
1377            Intent[] intents = data.createTypedArray(Intent.CREATOR);
1378            String[] resolvedTypes = data.createStringArray();
1379            IBinder resultTo = data.readStrongBinder();
1380            int result = startActivitiesInPackage(uid, intents, resolvedTypes, resultTo);
1381            reply.writeNoException();
1382            reply.writeInt(result);
1383            return true;
1384        }
1385
1386        case START_ACTIVITIES_TRANSACTION:
1387        {
1388            data.enforceInterface(IActivityManager.descriptor);
1389            IBinder b = data.readStrongBinder();
1390            IApplicationThread app = ApplicationThreadNative.asInterface(b);
1391            Intent[] intents = data.createTypedArray(Intent.CREATOR);
1392            String[] resolvedTypes = data.createStringArray();
1393            IBinder resultTo = data.readStrongBinder();
1394            int result = startActivities(app, intents, resolvedTypes, resultTo);
1395            reply.writeNoException();
1396            reply.writeInt(result);
1397            return true;
1398        }
1399
1400        case SWITCH_USER_TRANSACTION: {
1401            data.enforceInterface(IActivityManager.descriptor);
1402            int userid = data.readInt();
1403            boolean result = switchUser(userid);
1404            reply.writeNoException();
1405            reply.writeInt(result ? 1 : 0);
1406            return true;
1407        }
1408
1409        case REMOVE_SUB_TASK_TRANSACTION:
1410        {
1411            data.enforceInterface(IActivityManager.descriptor);
1412            int taskId = data.readInt();
1413            int subTaskIndex = data.readInt();
1414            boolean result = removeSubTask(taskId, subTaskIndex);
1415            reply.writeNoException();
1416            reply.writeInt(result ? 1 : 0);
1417            return true;
1418        }
1419
1420        case REMOVE_TASK_TRANSACTION:
1421        {
1422            data.enforceInterface(IActivityManager.descriptor);
1423            int taskId = data.readInt();
1424            int fl = data.readInt();
1425            boolean result = removeTask(taskId, fl);
1426            reply.writeNoException();
1427            reply.writeInt(result ? 1 : 0);
1428            return true;
1429        }
1430
1431        }
1432
1433        return super.onTransact(code, data, reply, flags);
1434    }
1435
1436    public IBinder asBinder() {
1437        return this;
1438    }
1439
1440    private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {
1441        protected IActivityManager create() {
1442            IBinder b = ServiceManager.getService("activity");
1443            if (false) {
1444                Log.v("ActivityManager", "default service binder = " + b);
1445            }
1446            IActivityManager am = asInterface(b);
1447            if (false) {
1448                Log.v("ActivityManager", "default service = " + am);
1449            }
1450            return am;
1451        }
1452    };
1453}
1454
1455class ActivityManagerProxy implements IActivityManager
1456{
1457    public ActivityManagerProxy(IBinder remote)
1458    {
1459        mRemote = remote;
1460    }
1461
1462    public IBinder asBinder()
1463    {
1464        return mRemote;
1465    }
1466
1467    public int startActivity(IApplicationThread caller, Intent intent,
1468            String resolvedType, Uri[] grantedUriPermissions, int grantedMode,
1469            IBinder resultTo, String resultWho,
1470            int requestCode, boolean onlyIfNeeded,
1471            boolean debug) throws RemoteException {
1472        Parcel data = Parcel.obtain();
1473        Parcel reply = Parcel.obtain();
1474        data.writeInterfaceToken(IActivityManager.descriptor);
1475        data.writeStrongBinder(caller != null ? caller.asBinder() : null);
1476        intent.writeToParcel(data, 0);
1477        data.writeString(resolvedType);
1478        data.writeTypedArray(grantedUriPermissions, 0);
1479        data.writeInt(grantedMode);
1480        data.writeStrongBinder(resultTo);
1481        data.writeString(resultWho);
1482        data.writeInt(requestCode);
1483        data.writeInt(onlyIfNeeded ? 1 : 0);
1484        data.writeInt(debug ? 1 : 0);
1485        mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0);
1486        reply.readException();
1487        int result = reply.readInt();
1488        reply.recycle();
1489        data.recycle();
1490        return result;
1491    }
1492    public WaitResult startActivityAndWait(IApplicationThread caller, Intent intent,
1493            String resolvedType, Uri[] grantedUriPermissions, int grantedMode,
1494            IBinder resultTo, String resultWho,
1495            int requestCode, boolean onlyIfNeeded,
1496            boolean debug) throws RemoteException {
1497        Parcel data = Parcel.obtain();
1498        Parcel reply = Parcel.obtain();
1499        data.writeInterfaceToken(IActivityManager.descriptor);
1500        data.writeStrongBinder(caller != null ? caller.asBinder() : null);
1501        intent.writeToParcel(data, 0);
1502        data.writeString(resolvedType);
1503        data.writeTypedArray(grantedUriPermissions, 0);
1504        data.writeInt(grantedMode);
1505        data.writeStrongBinder(resultTo);
1506        data.writeString(resultWho);
1507        data.writeInt(requestCode);
1508        data.writeInt(onlyIfNeeded ? 1 : 0);
1509        data.writeInt(debug ? 1 : 0);
1510        mRemote.transact(START_ACTIVITY_AND_WAIT_TRANSACTION, data, reply, 0);
1511        reply.readException();
1512        WaitResult result = WaitResult.CREATOR.createFromParcel(reply);
1513        reply.recycle();
1514        data.recycle();
1515        return result;
1516    }
1517    public int startActivityWithConfig(IApplicationThread caller, Intent intent,
1518            String resolvedType, Uri[] grantedUriPermissions, int grantedMode,
1519            IBinder resultTo, String resultWho,
1520            int requestCode, boolean onlyIfNeeded,
1521            boolean debug, Configuration config) throws RemoteException {
1522        Parcel data = Parcel.obtain();
1523        Parcel reply = Parcel.obtain();
1524        data.writeInterfaceToken(IActivityManager.descriptor);
1525        data.writeStrongBinder(caller != null ? caller.asBinder() : null);
1526        intent.writeToParcel(data, 0);
1527        data.writeString(resolvedType);
1528        data.writeTypedArray(grantedUriPermissions, 0);
1529        data.writeInt(grantedMode);
1530        data.writeStrongBinder(resultTo);
1531        data.writeString(resultWho);
1532        data.writeInt(requestCode);
1533        data.writeInt(onlyIfNeeded ? 1 : 0);
1534        data.writeInt(debug ? 1 : 0);
1535        config.writeToParcel(data, 0);
1536        mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0);
1537        reply.readException();
1538        int result = reply.readInt();
1539        reply.recycle();
1540        data.recycle();
1541        return result;
1542    }
1543    public int startActivityIntentSender(IApplicationThread caller,
1544            IntentSender intent, Intent fillInIntent, String resolvedType,
1545            IBinder resultTo, String resultWho, int requestCode,
1546            int flagsMask, int flagsValues) throws RemoteException {
1547        Parcel data = Parcel.obtain();
1548        Parcel reply = Parcel.obtain();
1549        data.writeInterfaceToken(IActivityManager.descriptor);
1550        data.writeStrongBinder(caller != null ? caller.asBinder() : null);
1551        intent.writeToParcel(data, 0);
1552        if (fillInIntent != null) {
1553            data.writeInt(1);
1554            fillInIntent.writeToParcel(data, 0);
1555        } else {
1556            data.writeInt(0);
1557        }
1558        data.writeString(resolvedType);
1559        data.writeStrongBinder(resultTo);
1560        data.writeString(resultWho);
1561        data.writeInt(requestCode);
1562        data.writeInt(flagsMask);
1563        data.writeInt(flagsValues);
1564        mRemote.transact(START_ACTIVITY_INTENT_SENDER_TRANSACTION, data, reply, 0);
1565        reply.readException();
1566        int result = reply.readInt();
1567        reply.recycle();
1568        data.recycle();
1569        return result;
1570    }
1571    public boolean startNextMatchingActivity(IBinder callingActivity,
1572            Intent intent) throws RemoteException {
1573        Parcel data = Parcel.obtain();
1574        Parcel reply = Parcel.obtain();
1575        data.writeInterfaceToken(IActivityManager.descriptor);
1576        data.writeStrongBinder(callingActivity);
1577        intent.writeToParcel(data, 0);
1578        mRemote.transact(START_NEXT_MATCHING_ACTIVITY_TRANSACTION, data, reply, 0);
1579        reply.readException();
1580        int result = reply.readInt();
1581        reply.recycle();
1582        data.recycle();
1583        return result != 0;
1584    }
1585    public boolean finishActivity(IBinder token, int resultCode, Intent resultData)
1586            throws RemoteException {
1587        Parcel data = Parcel.obtain();
1588        Parcel reply = Parcel.obtain();
1589        data.writeInterfaceToken(IActivityManager.descriptor);
1590        data.writeStrongBinder(token);
1591        data.writeInt(resultCode);
1592        if (resultData != null) {
1593            data.writeInt(1);
1594            resultData.writeToParcel(data, 0);
1595        } else {
1596            data.writeInt(0);
1597        }
1598        mRemote.transact(FINISH_ACTIVITY_TRANSACTION, data, reply, 0);
1599        reply.readException();
1600        boolean res = reply.readInt() != 0;
1601        data.recycle();
1602        reply.recycle();
1603        return res;
1604    }
1605    public void finishSubActivity(IBinder token, String resultWho, int requestCode) throws RemoteException
1606    {
1607        Parcel data = Parcel.obtain();
1608        Parcel reply = Parcel.obtain();
1609        data.writeInterfaceToken(IActivityManager.descriptor);
1610        data.writeStrongBinder(token);
1611        data.writeString(resultWho);
1612        data.writeInt(requestCode);
1613        mRemote.transact(FINISH_SUB_ACTIVITY_TRANSACTION, data, reply, 0);
1614        reply.readException();
1615        data.recycle();
1616        reply.recycle();
1617    }
1618    public boolean willActivityBeVisible(IBinder token) throws RemoteException {
1619        Parcel data = Parcel.obtain();
1620        Parcel reply = Parcel.obtain();
1621        data.writeInterfaceToken(IActivityManager.descriptor);
1622        data.writeStrongBinder(token);
1623        mRemote.transact(WILL_ACTIVITY_BE_VISIBLE_TRANSACTION, data, reply, 0);
1624        reply.readException();
1625        boolean res = reply.readInt() != 0;
1626        data.recycle();
1627        reply.recycle();
1628        return res;
1629    }
1630    public Intent registerReceiver(IApplicationThread caller,
1631            IIntentReceiver receiver,
1632            IntentFilter filter, String perm) throws RemoteException
1633    {
1634        Parcel data = Parcel.obtain();
1635        Parcel reply = Parcel.obtain();
1636        data.writeInterfaceToken(IActivityManager.descriptor);
1637        data.writeStrongBinder(caller != null ? caller.asBinder() : null);
1638        data.writeStrongBinder(receiver != null ? receiver.asBinder() : null);
1639        filter.writeToParcel(data, 0);
1640        data.writeString(perm);
1641        mRemote.transact(REGISTER_RECEIVER_TRANSACTION, data, reply, 0);
1642        reply.readException();
1643        Intent intent = null;
1644        int haveIntent = reply.readInt();
1645        if (haveIntent != 0) {
1646            intent = Intent.CREATOR.createFromParcel(reply);
1647        }
1648        reply.recycle();
1649        data.recycle();
1650        return intent;
1651    }
1652    public void unregisterReceiver(IIntentReceiver receiver) throws RemoteException
1653    {
1654        Parcel data = Parcel.obtain();
1655        Parcel reply = Parcel.obtain();
1656        data.writeInterfaceToken(IActivityManager.descriptor);
1657        data.writeStrongBinder(receiver.asBinder());
1658        mRemote.transact(UNREGISTER_RECEIVER_TRANSACTION, data, reply, 0);
1659        reply.readException();
1660        data.recycle();
1661        reply.recycle();
1662    }
1663    public int broadcastIntent(IApplicationThread caller,
1664            Intent intent, String resolvedType,  IIntentReceiver resultTo,
1665            int resultCode, String resultData, Bundle map,
1666            String requiredPermission, boolean serialized,
1667            boolean sticky) throws RemoteException
1668    {
1669        Parcel data = Parcel.obtain();
1670        Parcel reply = Parcel.obtain();
1671        data.writeInterfaceToken(IActivityManager.descriptor);
1672        data.writeStrongBinder(caller != null ? caller.asBinder() : null);
1673        intent.writeToParcel(data, 0);
1674        data.writeString(resolvedType);
1675        data.writeStrongBinder(resultTo != null ? resultTo.asBinder() : null);
1676        data.writeInt(resultCode);
1677        data.writeString(resultData);
1678        data.writeBundle(map);
1679        data.writeString(requiredPermission);
1680        data.writeInt(serialized ? 1 : 0);
1681        data.writeInt(sticky ? 1 : 0);
1682        mRemote.transact(BROADCAST_INTENT_TRANSACTION, data, reply, 0);
1683        reply.readException();
1684        int res = reply.readInt();
1685        reply.recycle();
1686        data.recycle();
1687        return res;
1688    }
1689    public void unbroadcastIntent(IApplicationThread caller, Intent intent) throws RemoteException
1690    {
1691        Parcel data = Parcel.obtain();
1692        Parcel reply = Parcel.obtain();
1693        data.writeInterfaceToken(IActivityManager.descriptor);
1694        data.writeStrongBinder(caller != null ? caller.asBinder() : null);
1695        intent.writeToParcel(data, 0);
1696        mRemote.transact(UNBROADCAST_INTENT_TRANSACTION, data, reply, 0);
1697        reply.readException();
1698        data.recycle();
1699        reply.recycle();
1700    }
1701    public void finishReceiver(IBinder who, int resultCode, String resultData, Bundle map, boolean abortBroadcast) throws RemoteException
1702    {
1703        Parcel data = Parcel.obtain();
1704        Parcel reply = Parcel.obtain();
1705        data.writeInterfaceToken(IActivityManager.descriptor);
1706        data.writeStrongBinder(who);
1707        data.writeInt(resultCode);
1708        data.writeString(resultData);
1709        data.writeBundle(map);
1710        data.writeInt(abortBroadcast ? 1 : 0);
1711        mRemote.transact(FINISH_RECEIVER_TRANSACTION, data, reply, IBinder.FLAG_ONEWAY);
1712        reply.readException();
1713        data.recycle();
1714        reply.recycle();
1715    }
1716    public void attachApplication(IApplicationThread app) throws RemoteException
1717    {
1718        Parcel data = Parcel.obtain();
1719        Parcel reply = Parcel.obtain();
1720        data.writeInterfaceToken(IActivityManager.descriptor);
1721        data.writeStrongBinder(app.asBinder());
1722        mRemote.transact(ATTACH_APPLICATION_TRANSACTION, data, reply, 0);
1723        reply.readException();
1724        data.recycle();
1725        reply.recycle();
1726    }
1727    public void activityIdle(IBinder token, Configuration config) throws RemoteException
1728    {
1729        Parcel data = Parcel.obtain();
1730        Parcel reply = Parcel.obtain();
1731        data.writeInterfaceToken(IActivityManager.descriptor);
1732        data.writeStrongBinder(token);
1733        if (config != null) {
1734            data.writeInt(1);
1735            config.writeToParcel(data, 0);
1736        } else {
1737            data.writeInt(0);
1738        }
1739        mRemote.transact(ACTIVITY_IDLE_TRANSACTION, data, reply, IBinder.FLAG_ONEWAY);
1740        reply.readException();
1741        data.recycle();
1742        reply.recycle();
1743    }
1744    public void activityPaused(IBinder token) throws RemoteException
1745    {
1746        Parcel data = Parcel.obtain();
1747        Parcel reply = Parcel.obtain();
1748        data.writeInterfaceToken(IActivityManager.descriptor);
1749        data.writeStrongBinder(token);
1750        mRemote.transact(ACTIVITY_PAUSED_TRANSACTION, data, reply, 0);
1751        reply.readException();
1752        data.recycle();
1753        reply.recycle();
1754    }
1755    public void activityStopped(IBinder token, Bundle state,
1756            Bitmap thumbnail, CharSequence description) throws RemoteException
1757    {
1758        Parcel data = Parcel.obtain();
1759        Parcel reply = Parcel.obtain();
1760        data.writeInterfaceToken(IActivityManager.descriptor);
1761        data.writeStrongBinder(token);
1762        data.writeBundle(state);
1763        if (thumbnail != null) {
1764            data.writeInt(1);
1765            thumbnail.writeToParcel(data, 0);
1766        } else {
1767            data.writeInt(0);
1768        }
1769        TextUtils.writeToParcel(description, data, 0);
1770        mRemote.transact(ACTIVITY_STOPPED_TRANSACTION, data, reply, IBinder.FLAG_ONEWAY);
1771        reply.readException();
1772        data.recycle();
1773        reply.recycle();
1774    }
1775    public void activitySlept(IBinder token) throws RemoteException
1776    {
1777        Parcel data = Parcel.obtain();
1778        Parcel reply = Parcel.obtain();
1779        data.writeInterfaceToken(IActivityManager.descriptor);
1780        data.writeStrongBinder(token);
1781        mRemote.transact(ACTIVITY_SLEPT_TRANSACTION, data, reply, IBinder.FLAG_ONEWAY);
1782        reply.readException();
1783        data.recycle();
1784        reply.recycle();
1785    }
1786    public void activityDestroyed(IBinder token) throws RemoteException
1787    {
1788        Parcel data = Parcel.obtain();
1789        Parcel reply = Parcel.obtain();
1790        data.writeInterfaceToken(IActivityManager.descriptor);
1791        data.writeStrongBinder(token);
1792        mRemote.transact(ACTIVITY_DESTROYED_TRANSACTION, data, reply, IBinder.FLAG_ONEWAY);
1793        reply.readException();
1794        data.recycle();
1795        reply.recycle();
1796    }
1797    public String getCallingPackage(IBinder token) throws RemoteException
1798    {
1799        Parcel data = Parcel.obtain();
1800        Parcel reply = Parcel.obtain();
1801        data.writeInterfaceToken(IActivityManager.descriptor);
1802        data.writeStrongBinder(token);
1803        mRemote.transact(GET_CALLING_PACKAGE_TRANSACTION, data, reply, 0);
1804        reply.readException();
1805        String res = reply.readString();
1806        data.recycle();
1807        reply.recycle();
1808        return res;
1809    }
1810    public ComponentName getCallingActivity(IBinder token)
1811            throws RemoteException {
1812        Parcel data = Parcel.obtain();
1813        Parcel reply = Parcel.obtain();
1814        data.writeInterfaceToken(IActivityManager.descriptor);
1815        data.writeStrongBinder(token);
1816        mRemote.transact(GET_CALLING_ACTIVITY_TRANSACTION, data, reply, 0);
1817        reply.readException();
1818        ComponentName res = ComponentName.readFromParcel(reply);
1819        data.recycle();
1820        reply.recycle();
1821        return res;
1822    }
1823    public List getTasks(int maxNum, int flags,
1824            IThumbnailReceiver receiver) throws RemoteException {
1825        Parcel data = Parcel.obtain();
1826        Parcel reply = Parcel.obtain();
1827        data.writeInterfaceToken(IActivityManager.descriptor);
1828        data.writeInt(maxNum);
1829        data.writeInt(flags);
1830        data.writeStrongBinder(receiver != null ? receiver.asBinder() : null);
1831        mRemote.transact(GET_TASKS_TRANSACTION, data, reply, 0);
1832        reply.readException();
1833        ArrayList list = null;
1834        int N = reply.readInt();
1835        if (N >= 0) {
1836            list = new ArrayList();
1837            while (N > 0) {
1838                ActivityManager.RunningTaskInfo info =
1839                        ActivityManager.RunningTaskInfo.CREATOR
1840                        .createFromParcel(reply);
1841                list.add(info);
1842                N--;
1843            }
1844        }
1845        data.recycle();
1846        reply.recycle();
1847        return list;
1848    }
1849    public List<ActivityManager.RecentTaskInfo> getRecentTasks(int maxNum,
1850            int flags) throws RemoteException {
1851        Parcel data = Parcel.obtain();
1852        Parcel reply = Parcel.obtain();
1853        data.writeInterfaceToken(IActivityManager.descriptor);
1854        data.writeInt(maxNum);
1855        data.writeInt(flags);
1856        mRemote.transact(GET_RECENT_TASKS_TRANSACTION, data, reply, 0);
1857        reply.readException();
1858        ArrayList<ActivityManager.RecentTaskInfo> list
1859            = reply.createTypedArrayList(ActivityManager.RecentTaskInfo.CREATOR);
1860        data.recycle();
1861        reply.recycle();
1862        return list;
1863    }
1864    public ActivityManager.TaskThumbnails getTaskThumbnails(int id) throws RemoteException {
1865        Parcel data = Parcel.obtain();
1866        Parcel reply = Parcel.obtain();
1867        data.writeInterfaceToken(IActivityManager.descriptor);
1868        data.writeInt(id);
1869        mRemote.transact(GET_TASK_THUMBNAILS_TRANSACTION, data, reply, 0);
1870        reply.readException();
1871        ActivityManager.TaskThumbnails bm = null;
1872        if (reply.readInt() != 0) {
1873            bm = ActivityManager.TaskThumbnails.CREATOR.createFromParcel(reply);
1874        }
1875        data.recycle();
1876        reply.recycle();
1877        return bm;
1878    }
1879    public List getServices(int maxNum, int flags) throws RemoteException {
1880        Parcel data = Parcel.obtain();
1881        Parcel reply = Parcel.obtain();
1882        data.writeInterfaceToken(IActivityManager.descriptor);
1883        data.writeInt(maxNum);
1884        data.writeInt(flags);
1885        mRemote.transact(GET_SERVICES_TRANSACTION, data, reply, 0);
1886        reply.readException();
1887        ArrayList list = null;
1888        int N = reply.readInt();
1889        if (N >= 0) {
1890            list = new ArrayList();
1891            while (N > 0) {
1892                ActivityManager.RunningServiceInfo info =
1893                        ActivityManager.RunningServiceInfo.CREATOR
1894                        .createFromParcel(reply);
1895                list.add(info);
1896                N--;
1897            }
1898        }
1899        data.recycle();
1900        reply.recycle();
1901        return list;
1902    }
1903    public List<ActivityManager.ProcessErrorStateInfo> getProcessesInErrorState()
1904            throws RemoteException {
1905        Parcel data = Parcel.obtain();
1906        Parcel reply = Parcel.obtain();
1907        data.writeInterfaceToken(IActivityManager.descriptor);
1908        mRemote.transact(GET_PROCESSES_IN_ERROR_STATE_TRANSACTION, data, reply, 0);
1909        reply.readException();
1910        ArrayList<ActivityManager.ProcessErrorStateInfo> list
1911            = reply.createTypedArrayList(ActivityManager.ProcessErrorStateInfo.CREATOR);
1912        data.recycle();
1913        reply.recycle();
1914        return list;
1915    }
1916    public List<ActivityManager.RunningAppProcessInfo> getRunningAppProcesses()
1917            throws RemoteException {
1918        Parcel data = Parcel.obtain();
1919        Parcel reply = Parcel.obtain();
1920        data.writeInterfaceToken(IActivityManager.descriptor);
1921        mRemote.transact(GET_RUNNING_APP_PROCESSES_TRANSACTION, data, reply, 0);
1922        reply.readException();
1923        ArrayList<ActivityManager.RunningAppProcessInfo> list
1924        = reply.createTypedArrayList(ActivityManager.RunningAppProcessInfo.CREATOR);
1925        data.recycle();
1926        reply.recycle();
1927        return list;
1928    }
1929    public List<ApplicationInfo> getRunningExternalApplications()
1930            throws RemoteException {
1931        Parcel data = Parcel.obtain();
1932        Parcel reply = Parcel.obtain();
1933        data.writeInterfaceToken(IActivityManager.descriptor);
1934        mRemote.transact(GET_RUNNING_EXTERNAL_APPLICATIONS_TRANSACTION, data, reply, 0);
1935        reply.readException();
1936        ArrayList<ApplicationInfo> list
1937        = reply.createTypedArrayList(ApplicationInfo.CREATOR);
1938        data.recycle();
1939        reply.recycle();
1940        return list;
1941    }
1942    public void moveTaskToFront(int task, int flags) throws RemoteException
1943    {
1944        Parcel data = Parcel.obtain();
1945        Parcel reply = Parcel.obtain();
1946        data.writeInterfaceToken(IActivityManager.descriptor);
1947        data.writeInt(task);
1948        data.writeInt(flags);
1949        mRemote.transact(MOVE_TASK_TO_FRONT_TRANSACTION, data, reply, 0);
1950        reply.readException();
1951        data.recycle();
1952        reply.recycle();
1953    }
1954    public void moveTaskToBack(int task) throws RemoteException
1955    {
1956        Parcel data = Parcel.obtain();
1957        Parcel reply = Parcel.obtain();
1958        data.writeInterfaceToken(IActivityManager.descriptor);
1959        data.writeInt(task);
1960        mRemote.transact(MOVE_TASK_TO_BACK_TRANSACTION, data, reply, 0);
1961        reply.readException();
1962        data.recycle();
1963        reply.recycle();
1964    }
1965    public boolean moveActivityTaskToBack(IBinder token, boolean nonRoot)
1966            throws RemoteException {
1967        Parcel data = Parcel.obtain();
1968        Parcel reply = Parcel.obtain();
1969        data.writeInterfaceToken(IActivityManager.descriptor);
1970        data.writeStrongBinder(token);
1971        data.writeInt(nonRoot ? 1 : 0);
1972        mRemote.transact(MOVE_ACTIVITY_TASK_TO_BACK_TRANSACTION, data, reply, 0);
1973        reply.readException();
1974        boolean res = reply.readInt() != 0;
1975        data.recycle();
1976        reply.recycle();
1977        return res;
1978    }
1979    public void moveTaskBackwards(int task) throws RemoteException
1980    {
1981        Parcel data = Parcel.obtain();
1982        Parcel reply = Parcel.obtain();
1983        data.writeInterfaceToken(IActivityManager.descriptor);
1984        data.writeInt(task);
1985        mRemote.transact(MOVE_TASK_BACKWARDS_TRANSACTION, data, reply, 0);
1986        reply.readException();
1987        data.recycle();
1988        reply.recycle();
1989    }
1990    public int getTaskForActivity(IBinder token, boolean onlyRoot) throws RemoteException
1991    {
1992        Parcel data = Parcel.obtain();
1993        Parcel reply = Parcel.obtain();
1994        data.writeInterfaceToken(IActivityManager.descriptor);
1995        data.writeStrongBinder(token);
1996        data.writeInt(onlyRoot ? 1 : 0);
1997        mRemote.transact(GET_TASK_FOR_ACTIVITY_TRANSACTION, data, reply, 0);
1998        reply.readException();
1999        int res = reply.readInt();
2000        data.recycle();
2001        reply.recycle();
2002        return res;
2003    }
2004    public void finishOtherInstances(IBinder token, ComponentName className) throws RemoteException
2005    {
2006        Parcel data = Parcel.obtain();
2007        Parcel reply = Parcel.obtain();
2008        data.writeInterfaceToken(IActivityManager.descriptor);
2009        data.writeStrongBinder(token);
2010        ComponentName.writeToParcel(className, data);
2011        mRemote.transact(FINISH_OTHER_INSTANCES_TRANSACTION, data, reply, 0);
2012        reply.readException();
2013        data.recycle();
2014        reply.recycle();
2015    }
2016    public void reportThumbnail(IBinder token,
2017                                Bitmap thumbnail, CharSequence description) throws RemoteException
2018    {
2019        Parcel data = Parcel.obtain();
2020        Parcel reply = Parcel.obtain();
2021        data.writeInterfaceToken(IActivityManager.descriptor);
2022        data.writeStrongBinder(token);
2023        if (thumbnail != null) {
2024            data.writeInt(1);
2025            thumbnail.writeToParcel(data, 0);
2026        } else {
2027            data.writeInt(0);
2028        }
2029        TextUtils.writeToParcel(description, data, 0);
2030        mRemote.transact(REPORT_THUMBNAIL_TRANSACTION, data, reply, IBinder.FLAG_ONEWAY);
2031        reply.readException();
2032        data.recycle();
2033        reply.recycle();
2034    }
2035    public ContentProviderHolder getContentProvider(IApplicationThread caller,
2036                                                    String name) throws RemoteException
2037    {
2038        Parcel data = Parcel.obtain();
2039        Parcel reply = Parcel.obtain();
2040        data.writeInterfaceToken(IActivityManager.descriptor);
2041        data.writeStrongBinder(caller != null ? caller.asBinder() : null);
2042        data.writeString(name);
2043        mRemote.transact(GET_CONTENT_PROVIDER_TRANSACTION, data, reply, 0);
2044        reply.readException();
2045        int res = reply.readInt();
2046        ContentProviderHolder cph = null;
2047        if (res != 0) {
2048            cph = ContentProviderHolder.CREATOR.createFromParcel(reply);
2049        }
2050        data.recycle();
2051        reply.recycle();
2052        return cph;
2053    }
2054    public void publishContentProviders(IApplicationThread caller,
2055                                        List<ContentProviderHolder> providers) throws RemoteException
2056    {
2057        Parcel data = Parcel.obtain();
2058        Parcel reply = Parcel.obtain();
2059        data.writeInterfaceToken(IActivityManager.descriptor);
2060        data.writeStrongBinder(caller != null ? caller.asBinder() : null);
2061        data.writeTypedList(providers);
2062        mRemote.transact(PUBLISH_CONTENT_PROVIDERS_TRANSACTION, data, reply, 0);
2063        reply.readException();
2064        data.recycle();
2065        reply.recycle();
2066    }
2067
2068    public void removeContentProvider(IApplicationThread caller,
2069            String name) throws RemoteException {
2070        Parcel data = Parcel.obtain();
2071        Parcel reply = Parcel.obtain();
2072        data.writeInterfaceToken(IActivityManager.descriptor);
2073        data.writeStrongBinder(caller != null ? caller.asBinder() : null);
2074        data.writeString(name);
2075        mRemote.transact(REMOVE_CONTENT_PROVIDER_TRANSACTION, data, reply, 0);
2076        reply.readException();
2077        data.recycle();
2078        reply.recycle();
2079    }
2080
2081    public PendingIntent getRunningServiceControlPanel(ComponentName service)
2082            throws RemoteException
2083    {
2084        Parcel data = Parcel.obtain();
2085        Parcel reply = Parcel.obtain();
2086        data.writeInterfaceToken(IActivityManager.descriptor);
2087        service.writeToParcel(data, 0);
2088        mRemote.transact(GET_RUNNING_SERVICE_CONTROL_PANEL_TRANSACTION, data, reply, 0);
2089        reply.readException();
2090        PendingIntent res = PendingIntent.readPendingIntentOrNullFromParcel(reply);
2091        data.recycle();
2092        reply.recycle();
2093        return res;
2094    }
2095
2096    public ComponentName startService(IApplicationThread caller, Intent service,
2097            String resolvedType) throws RemoteException
2098    {
2099        Parcel data = Parcel.obtain();
2100        Parcel reply = Parcel.obtain();
2101        data.writeInterfaceToken(IActivityManager.descriptor);
2102        data.writeStrongBinder(caller != null ? caller.asBinder() : null);
2103        service.writeToParcel(data, 0);
2104        data.writeString(resolvedType);
2105        mRemote.transact(START_SERVICE_TRANSACTION, data, reply, 0);
2106        reply.readException();
2107        ComponentName res = ComponentName.readFromParcel(reply);
2108        data.recycle();
2109        reply.recycle();
2110        return res;
2111    }
2112    public int stopService(IApplicationThread caller, Intent service,
2113            String resolvedType) throws RemoteException
2114    {
2115        Parcel data = Parcel.obtain();
2116        Parcel reply = Parcel.obtain();
2117        data.writeInterfaceToken(IActivityManager.descriptor);
2118        data.writeStrongBinder(caller != null ? caller.asBinder() : null);
2119        service.writeToParcel(data, 0);
2120        data.writeString(resolvedType);
2121        mRemote.transact(STOP_SERVICE_TRANSACTION, data, reply, 0);
2122        reply.readException();
2123        int res = reply.readInt();
2124        reply.recycle();
2125        data.recycle();
2126        return res;
2127    }
2128    public boolean stopServiceToken(ComponentName className, IBinder token,
2129            int startId) throws RemoteException {
2130        Parcel data = Parcel.obtain();
2131        Parcel reply = Parcel.obtain();
2132        data.writeInterfaceToken(IActivityManager.descriptor);
2133        ComponentName.writeToParcel(className, data);
2134        data.writeStrongBinder(token);
2135        data.writeInt(startId);
2136        mRemote.transact(STOP_SERVICE_TOKEN_TRANSACTION, data, reply, 0);
2137        reply.readException();
2138        boolean res = reply.readInt() != 0;
2139        data.recycle();
2140        reply.recycle();
2141        return res;
2142    }
2143    public void setServiceForeground(ComponentName className, IBinder token,
2144            int id, Notification notification, boolean removeNotification) throws RemoteException {
2145        Parcel data = Parcel.obtain();
2146        Parcel reply = Parcel.obtain();
2147        data.writeInterfaceToken(IActivityManager.descriptor);
2148        ComponentName.writeToParcel(className, data);
2149        data.writeStrongBinder(token);
2150        data.writeInt(id);
2151        if (notification != null) {
2152            data.writeInt(1);
2153            notification.writeToParcel(data, 0);
2154        } else {
2155            data.writeInt(0);
2156        }
2157        data.writeInt(removeNotification ? 1 : 0);
2158        mRemote.transact(SET_SERVICE_FOREGROUND_TRANSACTION, data, reply, 0);
2159        reply.readException();
2160        data.recycle();
2161        reply.recycle();
2162    }
2163    public int bindService(IApplicationThread caller, IBinder token,
2164            Intent service, String resolvedType, IServiceConnection connection,
2165            int flags) throws RemoteException {
2166        Parcel data = Parcel.obtain();
2167        Parcel reply = Parcel.obtain();
2168        data.writeInterfaceToken(IActivityManager.descriptor);
2169        data.writeStrongBinder(caller != null ? caller.asBinder() : null);
2170        data.writeStrongBinder(token);
2171        service.writeToParcel(data, 0);
2172        data.writeString(resolvedType);
2173        data.writeStrongBinder(connection.asBinder());
2174        data.writeInt(flags);
2175        mRemote.transact(BIND_SERVICE_TRANSACTION, data, reply, 0);
2176        reply.readException();
2177        int res = reply.readInt();
2178        data.recycle();
2179        reply.recycle();
2180        return res;
2181    }
2182    public boolean unbindService(IServiceConnection connection) throws RemoteException
2183    {
2184        Parcel data = Parcel.obtain();
2185        Parcel reply = Parcel.obtain();
2186        data.writeInterfaceToken(IActivityManager.descriptor);
2187        data.writeStrongBinder(connection.asBinder());
2188        mRemote.transact(UNBIND_SERVICE_TRANSACTION, data, reply, 0);
2189        reply.readException();
2190        boolean res = reply.readInt() != 0;
2191        data.recycle();
2192        reply.recycle();
2193        return res;
2194    }
2195
2196    public void publishService(IBinder token,
2197            Intent intent, IBinder service) throws RemoteException {
2198        Parcel data = Parcel.obtain();
2199        Parcel reply = Parcel.obtain();
2200        data.writeInterfaceToken(IActivityManager.descriptor);
2201        data.writeStrongBinder(token);
2202        intent.writeToParcel(data, 0);
2203        data.writeStrongBinder(service);
2204        mRemote.transact(PUBLISH_SERVICE_TRANSACTION, data, reply, 0);
2205        reply.readException();
2206        data.recycle();
2207        reply.recycle();
2208    }
2209
2210    public void unbindFinished(IBinder token, Intent intent, boolean doRebind)
2211            throws RemoteException {
2212        Parcel data = Parcel.obtain();
2213        Parcel reply = Parcel.obtain();
2214        data.writeInterfaceToken(IActivityManager.descriptor);
2215        data.writeStrongBinder(token);
2216        intent.writeToParcel(data, 0);
2217        data.writeInt(doRebind ? 1 : 0);
2218        mRemote.transact(UNBIND_FINISHED_TRANSACTION, data, reply, 0);
2219        reply.readException();
2220        data.recycle();
2221        reply.recycle();
2222    }
2223
2224    public void serviceDoneExecuting(IBinder token, int type, int startId,
2225            int res) throws RemoteException {
2226        Parcel data = Parcel.obtain();
2227        Parcel reply = Parcel.obtain();
2228        data.writeInterfaceToken(IActivityManager.descriptor);
2229        data.writeStrongBinder(token);
2230        data.writeInt(type);
2231        data.writeInt(startId);
2232        data.writeInt(res);
2233        mRemote.transact(SERVICE_DONE_EXECUTING_TRANSACTION, data, reply, IBinder.FLAG_ONEWAY);
2234        reply.readException();
2235        data.recycle();
2236        reply.recycle();
2237    }
2238
2239    public IBinder peekService(Intent service, String resolvedType) throws RemoteException {
2240        Parcel data = Parcel.obtain();
2241        Parcel reply = Parcel.obtain();
2242        data.writeInterfaceToken(IActivityManager.descriptor);
2243        service.writeToParcel(data, 0);
2244        data.writeString(resolvedType);
2245        mRemote.transact(PEEK_SERVICE_TRANSACTION, data, reply, 0);
2246        reply.readException();
2247        IBinder binder = reply.readStrongBinder();
2248        reply.recycle();
2249        data.recycle();
2250        return binder;
2251    }
2252
2253    public boolean bindBackupAgent(ApplicationInfo app, int backupRestoreMode)
2254            throws RemoteException {
2255        Parcel data = Parcel.obtain();
2256        Parcel reply = Parcel.obtain();
2257        data.writeInterfaceToken(IActivityManager.descriptor);
2258        app.writeToParcel(data, 0);
2259        data.writeInt(backupRestoreMode);
2260        mRemote.transact(START_BACKUP_AGENT_TRANSACTION, data, reply, 0);
2261        reply.readException();
2262        boolean success = reply.readInt() != 0;
2263        reply.recycle();
2264        data.recycle();
2265        return success;
2266    }
2267
2268    public void backupAgentCreated(String packageName, IBinder agent) throws RemoteException {
2269        Parcel data = Parcel.obtain();
2270        Parcel reply = Parcel.obtain();
2271        data.writeInterfaceToken(IActivityManager.descriptor);
2272        data.writeString(packageName);
2273        data.writeStrongBinder(agent);
2274        mRemote.transact(BACKUP_AGENT_CREATED_TRANSACTION, data, reply, 0);
2275        reply.recycle();
2276        data.recycle();
2277    }
2278
2279    public void unbindBackupAgent(ApplicationInfo app) throws RemoteException {
2280        Parcel data = Parcel.obtain();
2281        Parcel reply = Parcel.obtain();
2282        data.writeInterfaceToken(IActivityManager.descriptor);
2283        app.writeToParcel(data, 0);
2284        mRemote.transact(UNBIND_BACKUP_AGENT_TRANSACTION, data, reply, 0);
2285        reply.readException();
2286        reply.recycle();
2287        data.recycle();
2288    }
2289
2290    public boolean startInstrumentation(ComponentName className, String profileFile,
2291            int flags, Bundle arguments, IInstrumentationWatcher watcher)
2292            throws RemoteException {
2293        Parcel data = Parcel.obtain();
2294        Parcel reply = Parcel.obtain();
2295        data.writeInterfaceToken(IActivityManager.descriptor);
2296        ComponentName.writeToParcel(className, data);
2297        data.writeString(profileFile);
2298        data.writeInt(flags);
2299        data.writeBundle(arguments);
2300        data.writeStrongBinder(watcher != null ? watcher.asBinder() : null);
2301        mRemote.transact(START_INSTRUMENTATION_TRANSACTION, data, reply, 0);
2302        reply.readException();
2303        boolean res = reply.readInt() != 0;
2304        reply.recycle();
2305        data.recycle();
2306        return res;
2307    }
2308
2309    public void finishInstrumentation(IApplicationThread target,
2310            int resultCode, Bundle results) throws RemoteException {
2311        Parcel data = Parcel.obtain();
2312        Parcel reply = Parcel.obtain();
2313        data.writeInterfaceToken(IActivityManager.descriptor);
2314        data.writeStrongBinder(target != null ? target.asBinder() : null);
2315        data.writeInt(resultCode);
2316        data.writeBundle(results);
2317        mRemote.transact(FINISH_INSTRUMENTATION_TRANSACTION, data, reply, 0);
2318        reply.readException();
2319        data.recycle();
2320        reply.recycle();
2321    }
2322    public Configuration getConfiguration() throws RemoteException
2323    {
2324        Parcel data = Parcel.obtain();
2325        Parcel reply = Parcel.obtain();
2326        data.writeInterfaceToken(IActivityManager.descriptor);
2327        mRemote.transact(GET_CONFIGURATION_TRANSACTION, data, reply, 0);
2328        reply.readException();
2329        Configuration res = Configuration.CREATOR.createFromParcel(reply);
2330        reply.recycle();
2331        data.recycle();
2332        return res;
2333    }
2334    public void updateConfiguration(Configuration values) throws RemoteException
2335    {
2336        Parcel data = Parcel.obtain();
2337        Parcel reply = Parcel.obtain();
2338        data.writeInterfaceToken(IActivityManager.descriptor);
2339        values.writeToParcel(data, 0);
2340        mRemote.transact(UPDATE_CONFIGURATION_TRANSACTION, data, reply, 0);
2341        reply.readException();
2342        data.recycle();
2343        reply.recycle();
2344    }
2345    public void setRequestedOrientation(IBinder token, int requestedOrientation)
2346            throws RemoteException {
2347        Parcel data = Parcel.obtain();
2348        Parcel reply = Parcel.obtain();
2349        data.writeInterfaceToken(IActivityManager.descriptor);
2350        data.writeStrongBinder(token);
2351        data.writeInt(requestedOrientation);
2352        mRemote.transact(SET_REQUESTED_ORIENTATION_TRANSACTION, data, reply, 0);
2353        reply.readException();
2354        data.recycle();
2355        reply.recycle();
2356    }
2357    public int getRequestedOrientation(IBinder token) throws RemoteException {
2358        Parcel data = Parcel.obtain();
2359        Parcel reply = Parcel.obtain();
2360        data.writeInterfaceToken(IActivityManager.descriptor);
2361        data.writeStrongBinder(token);
2362        mRemote.transact(GET_REQUESTED_ORIENTATION_TRANSACTION, data, reply, 0);
2363        reply.readException();
2364        int res = reply.readInt();
2365        data.recycle();
2366        reply.recycle();
2367        return res;
2368    }
2369    public ComponentName getActivityClassForToken(IBinder token)
2370            throws RemoteException {
2371        Parcel data = Parcel.obtain();
2372        Parcel reply = Parcel.obtain();
2373        data.writeInterfaceToken(IActivityManager.descriptor);
2374        data.writeStrongBinder(token);
2375        mRemote.transact(GET_ACTIVITY_CLASS_FOR_TOKEN_TRANSACTION, data, reply, 0);
2376        reply.readException();
2377        ComponentName res = ComponentName.readFromParcel(reply);
2378        data.recycle();
2379        reply.recycle();
2380        return res;
2381    }
2382    public String getPackageForToken(IBinder token) throws RemoteException
2383    {
2384        Parcel data = Parcel.obtain();
2385        Parcel reply = Parcel.obtain();
2386        data.writeInterfaceToken(IActivityManager.descriptor);
2387        data.writeStrongBinder(token);
2388        mRemote.transact(GET_PACKAGE_FOR_TOKEN_TRANSACTION, data, reply, 0);
2389        reply.readException();
2390        String res = reply.readString();
2391        data.recycle();
2392        reply.recycle();
2393        return res;
2394    }
2395    public IIntentSender getIntentSender(int type,
2396            String packageName, IBinder token, String resultWho,
2397            int requestCode, Intent[] intents, String[] resolvedTypes, int flags)
2398            throws RemoteException {
2399        Parcel data = Parcel.obtain();
2400        Parcel reply = Parcel.obtain();
2401        data.writeInterfaceToken(IActivityManager.descriptor);
2402        data.writeInt(type);
2403        data.writeString(packageName);
2404        data.writeStrongBinder(token);
2405        data.writeString(resultWho);
2406        data.writeInt(requestCode);
2407        if (intents != null) {
2408            data.writeInt(1);
2409            data.writeTypedArray(intents, 0);
2410            data.writeStringArray(resolvedTypes);
2411        } else {
2412            data.writeInt(0);
2413        }
2414        data.writeInt(flags);
2415        mRemote.transact(GET_INTENT_SENDER_TRANSACTION, data, reply, 0);
2416        reply.readException();
2417        IIntentSender res = IIntentSender.Stub.asInterface(
2418            reply.readStrongBinder());
2419        data.recycle();
2420        reply.recycle();
2421        return res;
2422    }
2423    public void cancelIntentSender(IIntentSender sender) throws RemoteException {
2424        Parcel data = Parcel.obtain();
2425        Parcel reply = Parcel.obtain();
2426        data.writeInterfaceToken(IActivityManager.descriptor);
2427        data.writeStrongBinder(sender.asBinder());
2428        mRemote.transact(CANCEL_INTENT_SENDER_TRANSACTION, data, reply, 0);
2429        reply.readException();
2430        data.recycle();
2431        reply.recycle();
2432    }
2433    public String getPackageForIntentSender(IIntentSender sender) throws RemoteException {
2434        Parcel data = Parcel.obtain();
2435        Parcel reply = Parcel.obtain();
2436        data.writeInterfaceToken(IActivityManager.descriptor);
2437        data.writeStrongBinder(sender.asBinder());
2438        mRemote.transact(GET_PACKAGE_FOR_INTENT_SENDER_TRANSACTION, data, reply, 0);
2439        reply.readException();
2440        String res = reply.readString();
2441        data.recycle();
2442        reply.recycle();
2443        return res;
2444    }
2445    public void setProcessLimit(int max) throws RemoteException
2446    {
2447        Parcel data = Parcel.obtain();
2448        Parcel reply = Parcel.obtain();
2449        data.writeInterfaceToken(IActivityManager.descriptor);
2450        data.writeInt(max);
2451        mRemote.transact(SET_PROCESS_LIMIT_TRANSACTION, data, reply, 0);
2452        reply.readException();
2453        data.recycle();
2454        reply.recycle();
2455    }
2456    public int getProcessLimit() throws RemoteException
2457    {
2458        Parcel data = Parcel.obtain();
2459        Parcel reply = Parcel.obtain();
2460        data.writeInterfaceToken(IActivityManager.descriptor);
2461        mRemote.transact(GET_PROCESS_LIMIT_TRANSACTION, data, reply, 0);
2462        reply.readException();
2463        int res = reply.readInt();
2464        data.recycle();
2465        reply.recycle();
2466        return res;
2467    }
2468    public void setProcessForeground(IBinder token, int pid,
2469            boolean isForeground) throws RemoteException {
2470        Parcel data = Parcel.obtain();
2471        Parcel reply = Parcel.obtain();
2472        data.writeInterfaceToken(IActivityManager.descriptor);
2473        data.writeStrongBinder(token);
2474        data.writeInt(pid);
2475        data.writeInt(isForeground ? 1 : 0);
2476        mRemote.transact(SET_PROCESS_FOREGROUND_TRANSACTION, data, reply, 0);
2477        reply.readException();
2478        data.recycle();
2479        reply.recycle();
2480    }
2481    public int checkPermission(String permission, int pid, int uid)
2482            throws RemoteException {
2483        Parcel data = Parcel.obtain();
2484        Parcel reply = Parcel.obtain();
2485        data.writeInterfaceToken(IActivityManager.descriptor);
2486        data.writeString(permission);
2487        data.writeInt(pid);
2488        data.writeInt(uid);
2489        mRemote.transact(CHECK_PERMISSION_TRANSACTION, data, reply, 0);
2490        reply.readException();
2491        int res = reply.readInt();
2492        data.recycle();
2493        reply.recycle();
2494        return res;
2495    }
2496    public boolean clearApplicationUserData(final String packageName,
2497            final IPackageDataObserver observer) throws RemoteException {
2498        Parcel data = Parcel.obtain();
2499        Parcel reply = Parcel.obtain();
2500        data.writeInterfaceToken(IActivityManager.descriptor);
2501        data.writeString(packageName);
2502        data.writeStrongBinder(observer.asBinder());
2503        mRemote.transact(CLEAR_APP_DATA_TRANSACTION, data, reply, 0);
2504        reply.readException();
2505        boolean res = reply.readInt() != 0;
2506        data.recycle();
2507        reply.recycle();
2508        return res;
2509    }
2510    public int checkUriPermission(Uri uri, int pid, int uid, int mode)
2511            throws RemoteException {
2512        Parcel data = Parcel.obtain();
2513        Parcel reply = Parcel.obtain();
2514        data.writeInterfaceToken(IActivityManager.descriptor);
2515        uri.writeToParcel(data, 0);
2516        data.writeInt(pid);
2517        data.writeInt(uid);
2518        data.writeInt(mode);
2519        mRemote.transact(CHECK_URI_PERMISSION_TRANSACTION, data, reply, 0);
2520        reply.readException();
2521        int res = reply.readInt();
2522        data.recycle();
2523        reply.recycle();
2524        return res;
2525    }
2526    public void grantUriPermission(IApplicationThread caller, String targetPkg,
2527            Uri uri, int mode) throws RemoteException {
2528        Parcel data = Parcel.obtain();
2529        Parcel reply = Parcel.obtain();
2530        data.writeInterfaceToken(IActivityManager.descriptor);
2531        data.writeStrongBinder(caller.asBinder());
2532        data.writeString(targetPkg);
2533        uri.writeToParcel(data, 0);
2534        data.writeInt(mode);
2535        mRemote.transact(GRANT_URI_PERMISSION_TRANSACTION, data, reply, 0);
2536        reply.readException();
2537        data.recycle();
2538        reply.recycle();
2539    }
2540    public void revokeUriPermission(IApplicationThread caller, Uri uri,
2541            int mode) throws RemoteException {
2542        Parcel data = Parcel.obtain();
2543        Parcel reply = Parcel.obtain();
2544        data.writeInterfaceToken(IActivityManager.descriptor);
2545        data.writeStrongBinder(caller.asBinder());
2546        uri.writeToParcel(data, 0);
2547        data.writeInt(mode);
2548        mRemote.transact(REVOKE_URI_PERMISSION_TRANSACTION, data, reply, 0);
2549        reply.readException();
2550        data.recycle();
2551        reply.recycle();
2552    }
2553    public void showWaitingForDebugger(IApplicationThread who, boolean waiting)
2554            throws RemoteException {
2555        Parcel data = Parcel.obtain();
2556        Parcel reply = Parcel.obtain();
2557        data.writeInterfaceToken(IActivityManager.descriptor);
2558        data.writeStrongBinder(who.asBinder());
2559        data.writeInt(waiting ? 1 : 0);
2560        mRemote.transact(SHOW_WAITING_FOR_DEBUGGER_TRANSACTION, data, reply, 0);
2561        reply.readException();
2562        data.recycle();
2563        reply.recycle();
2564    }
2565    public void getMemoryInfo(ActivityManager.MemoryInfo outInfo) throws RemoteException {
2566        Parcel data = Parcel.obtain();
2567        Parcel reply = Parcel.obtain();
2568        data.writeInterfaceToken(IActivityManager.descriptor);
2569        mRemote.transact(GET_MEMORY_INFO_TRANSACTION, data, reply, 0);
2570        reply.readException();
2571        outInfo.readFromParcel(reply);
2572        data.recycle();
2573        reply.recycle();
2574    }
2575    public void unhandledBack() throws RemoteException
2576    {
2577        Parcel data = Parcel.obtain();
2578        Parcel reply = Parcel.obtain();
2579        data.writeInterfaceToken(IActivityManager.descriptor);
2580        mRemote.transact(UNHANDLED_BACK_TRANSACTION, data, reply, 0);
2581        reply.readException();
2582        data.recycle();
2583        reply.recycle();
2584    }
2585    public ParcelFileDescriptor openContentUri(Uri uri) throws RemoteException
2586    {
2587        Parcel data = Parcel.obtain();
2588        Parcel reply = Parcel.obtain();
2589        data.writeInterfaceToken(IActivityManager.descriptor);
2590        mRemote.transact(OPEN_CONTENT_URI_TRANSACTION, data, reply, 0);
2591        reply.readException();
2592        ParcelFileDescriptor pfd = null;
2593        if (reply.readInt() != 0) {
2594            pfd = ParcelFileDescriptor.CREATOR.createFromParcel(reply);
2595        }
2596        data.recycle();
2597        reply.recycle();
2598        return pfd;
2599    }
2600    public void goingToSleep() throws RemoteException
2601    {
2602        Parcel data = Parcel.obtain();
2603        Parcel reply = Parcel.obtain();
2604        data.writeInterfaceToken(IActivityManager.descriptor);
2605        mRemote.transact(GOING_TO_SLEEP_TRANSACTION, data, reply, 0);
2606        reply.readException();
2607        data.recycle();
2608        reply.recycle();
2609    }
2610    public void wakingUp() throws RemoteException
2611    {
2612        Parcel data = Parcel.obtain();
2613        Parcel reply = Parcel.obtain();
2614        data.writeInterfaceToken(IActivityManager.descriptor);
2615        mRemote.transact(WAKING_UP_TRANSACTION, data, reply, 0);
2616        reply.readException();
2617        data.recycle();
2618        reply.recycle();
2619    }
2620    public void setDebugApp(
2621        String packageName, boolean waitForDebugger, boolean persistent)
2622        throws RemoteException
2623    {
2624        Parcel data = Parcel.obtain();
2625        Parcel reply = Parcel.obtain();
2626        data.writeInterfaceToken(IActivityManager.descriptor);
2627        data.writeString(packageName);
2628        data.writeInt(waitForDebugger ? 1 : 0);
2629        data.writeInt(persistent ? 1 : 0);
2630        mRemote.transact(SET_DEBUG_APP_TRANSACTION, data, reply, 0);
2631        reply.readException();
2632        data.recycle();
2633        reply.recycle();
2634    }
2635    public void setAlwaysFinish(boolean enabled) throws RemoteException
2636    {
2637        Parcel data = Parcel.obtain();
2638        Parcel reply = Parcel.obtain();
2639        data.writeInterfaceToken(IActivityManager.descriptor);
2640        data.writeInt(enabled ? 1 : 0);
2641        mRemote.transact(SET_ALWAYS_FINISH_TRANSACTION, data, reply, 0);
2642        reply.readException();
2643        data.recycle();
2644        reply.recycle();
2645    }
2646    public void setActivityController(IActivityController watcher) throws RemoteException
2647    {
2648        Parcel data = Parcel.obtain();
2649        Parcel reply = Parcel.obtain();
2650        data.writeInterfaceToken(IActivityManager.descriptor);
2651        data.writeStrongBinder(watcher != null ? watcher.asBinder() : null);
2652        mRemote.transact(SET_ACTIVITY_CONTROLLER_TRANSACTION, data, reply, 0);
2653        reply.readException();
2654        data.recycle();
2655        reply.recycle();
2656    }
2657    public void enterSafeMode() throws RemoteException {
2658        Parcel data = Parcel.obtain();
2659        data.writeInterfaceToken(IActivityManager.descriptor);
2660        mRemote.transact(ENTER_SAFE_MODE_TRANSACTION, data, null, 0);
2661        data.recycle();
2662    }
2663    public void noteWakeupAlarm(IIntentSender sender) throws RemoteException {
2664        Parcel data = Parcel.obtain();
2665        data.writeStrongBinder(sender.asBinder());
2666        data.writeInterfaceToken(IActivityManager.descriptor);
2667        mRemote.transact(NOTE_WAKEUP_ALARM_TRANSACTION, data, null, 0);
2668        data.recycle();
2669    }
2670    public boolean killPids(int[] pids, String reason, boolean secure) throws RemoteException {
2671        Parcel data = Parcel.obtain();
2672        Parcel reply = Parcel.obtain();
2673        data.writeInterfaceToken(IActivityManager.descriptor);
2674        data.writeIntArray(pids);
2675        data.writeString(reason);
2676        data.writeInt(secure ? 1 : 0);
2677        mRemote.transact(KILL_PIDS_TRANSACTION, data, reply, 0);
2678        boolean res = reply.readInt() != 0;
2679        data.recycle();
2680        reply.recycle();
2681        return res;
2682    }
2683    public void startRunning(String pkg, String cls, String action,
2684            String indata) throws RemoteException {
2685        Parcel data = Parcel.obtain();
2686        Parcel reply = Parcel.obtain();
2687        data.writeInterfaceToken(IActivityManager.descriptor);
2688        data.writeString(pkg);
2689        data.writeString(cls);
2690        data.writeString(action);
2691        data.writeString(indata);
2692        mRemote.transact(START_RUNNING_TRANSACTION, data, reply, 0);
2693        reply.readException();
2694        data.recycle();
2695        reply.recycle();
2696    }
2697    public boolean testIsSystemReady()
2698    {
2699        /* this base class version is never called */
2700        return true;
2701    }
2702    public void handleApplicationCrash(IBinder app,
2703            ApplicationErrorReport.CrashInfo crashInfo) throws RemoteException
2704    {
2705        Parcel data = Parcel.obtain();
2706        Parcel reply = Parcel.obtain();
2707        data.writeInterfaceToken(IActivityManager.descriptor);
2708        data.writeStrongBinder(app);
2709        crashInfo.writeToParcel(data, 0);
2710        mRemote.transact(HANDLE_APPLICATION_CRASH_TRANSACTION, data, reply, 0);
2711        reply.readException();
2712        reply.recycle();
2713        data.recycle();
2714    }
2715
2716    public boolean handleApplicationWtf(IBinder app, String tag,
2717            ApplicationErrorReport.CrashInfo crashInfo) throws RemoteException
2718    {
2719        Parcel data = Parcel.obtain();
2720        Parcel reply = Parcel.obtain();
2721        data.writeInterfaceToken(IActivityManager.descriptor);
2722        data.writeStrongBinder(app);
2723        data.writeString(tag);
2724        crashInfo.writeToParcel(data, 0);
2725        mRemote.transact(HANDLE_APPLICATION_WTF_TRANSACTION, data, reply, 0);
2726        reply.readException();
2727        boolean res = reply.readInt() != 0;
2728        reply.recycle();
2729        data.recycle();
2730        return res;
2731    }
2732
2733    public void handleApplicationStrictModeViolation(IBinder app,
2734            int violationMask,
2735            StrictMode.ViolationInfo info) throws RemoteException
2736    {
2737        Parcel data = Parcel.obtain();
2738        Parcel reply = Parcel.obtain();
2739        data.writeInterfaceToken(IActivityManager.descriptor);
2740        data.writeStrongBinder(app);
2741        data.writeInt(violationMask);
2742        info.writeToParcel(data, 0);
2743        mRemote.transact(HANDLE_APPLICATION_STRICT_MODE_VIOLATION_TRANSACTION, data, reply, 0);
2744        reply.readException();
2745        reply.recycle();
2746        data.recycle();
2747    }
2748
2749    public void signalPersistentProcesses(int sig) throws RemoteException {
2750        Parcel data = Parcel.obtain();
2751        Parcel reply = Parcel.obtain();
2752        data.writeInterfaceToken(IActivityManager.descriptor);
2753        data.writeInt(sig);
2754        mRemote.transact(SIGNAL_PERSISTENT_PROCESSES_TRANSACTION, data, reply, 0);
2755        reply.readException();
2756        data.recycle();
2757        reply.recycle();
2758    }
2759
2760    public void killBackgroundProcesses(String packageName) throws RemoteException {
2761        Parcel data = Parcel.obtain();
2762        Parcel reply = Parcel.obtain();
2763        data.writeInterfaceToken(IActivityManager.descriptor);
2764        data.writeString(packageName);
2765        mRemote.transact(KILL_BACKGROUND_PROCESSES_TRANSACTION, data, reply, 0);
2766        reply.readException();
2767        data.recycle();
2768        reply.recycle();
2769    }
2770
2771    public void forceStopPackage(String packageName) throws RemoteException {
2772        Parcel data = Parcel.obtain();
2773        Parcel reply = Parcel.obtain();
2774        data.writeInterfaceToken(IActivityManager.descriptor);
2775        data.writeString(packageName);
2776        mRemote.transact(FORCE_STOP_PACKAGE_TRANSACTION, data, reply, 0);
2777        reply.readException();
2778        data.recycle();
2779        reply.recycle();
2780    }
2781
2782    public ConfigurationInfo getDeviceConfigurationInfo() throws RemoteException
2783    {
2784        Parcel data = Parcel.obtain();
2785        Parcel reply = Parcel.obtain();
2786        data.writeInterfaceToken(IActivityManager.descriptor);
2787        mRemote.transact(GET_DEVICE_CONFIGURATION_TRANSACTION, data, reply, 0);
2788        reply.readException();
2789        ConfigurationInfo res = ConfigurationInfo.CREATOR.createFromParcel(reply);
2790        reply.recycle();
2791        data.recycle();
2792        return res;
2793    }
2794
2795    public boolean profileControl(String process, boolean start,
2796            String path, ParcelFileDescriptor fd) throws RemoteException
2797    {
2798        Parcel data = Parcel.obtain();
2799        Parcel reply = Parcel.obtain();
2800        data.writeInterfaceToken(IActivityManager.descriptor);
2801        data.writeString(process);
2802        data.writeInt(start ? 1 : 0);
2803        data.writeString(path);
2804        if (fd != null) {
2805            data.writeInt(1);
2806            fd.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
2807        } else {
2808            data.writeInt(0);
2809        }
2810        mRemote.transact(PROFILE_CONTROL_TRANSACTION, data, reply, 0);
2811        reply.readException();
2812        boolean res = reply.readInt() != 0;
2813        reply.recycle();
2814        data.recycle();
2815        return res;
2816    }
2817
2818    public boolean shutdown(int timeout) throws RemoteException
2819    {
2820        Parcel data = Parcel.obtain();
2821        Parcel reply = Parcel.obtain();
2822        data.writeInterfaceToken(IActivityManager.descriptor);
2823        data.writeInt(timeout);
2824        mRemote.transact(SHUTDOWN_TRANSACTION, data, reply, 0);
2825        reply.readException();
2826        boolean res = reply.readInt() != 0;
2827        reply.recycle();
2828        data.recycle();
2829        return res;
2830    }
2831
2832    public void stopAppSwitches() throws RemoteException {
2833        Parcel data = Parcel.obtain();
2834        Parcel reply = Parcel.obtain();
2835        data.writeInterfaceToken(IActivityManager.descriptor);
2836        mRemote.transact(STOP_APP_SWITCHES_TRANSACTION, data, reply, 0);
2837        reply.readException();
2838        reply.recycle();
2839        data.recycle();
2840    }
2841
2842    public void resumeAppSwitches() throws RemoteException {
2843        Parcel data = Parcel.obtain();
2844        Parcel reply = Parcel.obtain();
2845        data.writeInterfaceToken(IActivityManager.descriptor);
2846        mRemote.transact(RESUME_APP_SWITCHES_TRANSACTION, data, reply, 0);
2847        reply.readException();
2848        reply.recycle();
2849        data.recycle();
2850    }
2851
2852    public void registerActivityWatcher(IActivityWatcher watcher)
2853            throws RemoteException {
2854        Parcel data = Parcel.obtain();
2855        Parcel reply = Parcel.obtain();
2856        data.writeInterfaceToken(IActivityManager.descriptor);
2857        data.writeStrongBinder(watcher != null ? watcher.asBinder() : null);
2858        mRemote.transact(REGISTER_ACTIVITY_WATCHER_TRANSACTION, data, reply, 0);
2859        reply.readException();
2860        data.recycle();
2861        reply.recycle();
2862    }
2863
2864    public void unregisterActivityWatcher(IActivityWatcher watcher)
2865            throws RemoteException {
2866        Parcel data = Parcel.obtain();
2867        Parcel reply = Parcel.obtain();
2868        data.writeInterfaceToken(IActivityManager.descriptor);
2869        data.writeStrongBinder(watcher != null ? watcher.asBinder() : null);
2870        mRemote.transact(UNREGISTER_ACTIVITY_WATCHER_TRANSACTION, data, reply, 0);
2871        reply.readException();
2872        data.recycle();
2873        reply.recycle();
2874    }
2875
2876    public int startActivityInPackage(int uid,
2877            Intent intent, String resolvedType, IBinder resultTo,
2878            String resultWho, int requestCode, boolean onlyIfNeeded)
2879            throws RemoteException {
2880        Parcel data = Parcel.obtain();
2881        Parcel reply = Parcel.obtain();
2882        data.writeInterfaceToken(IActivityManager.descriptor);
2883        data.writeInt(uid);
2884        intent.writeToParcel(data, 0);
2885        data.writeString(resolvedType);
2886        data.writeStrongBinder(resultTo);
2887        data.writeString(resultWho);
2888        data.writeInt(requestCode);
2889        data.writeInt(onlyIfNeeded ? 1 : 0);
2890        mRemote.transact(START_ACTIVITY_IN_PACKAGE_TRANSACTION, data, reply, 0);
2891        reply.readException();
2892        int result = reply.readInt();
2893        reply.recycle();
2894        data.recycle();
2895        return result;
2896    }
2897
2898    public void killApplicationWithUid(String pkg, int uid) throws RemoteException {
2899        Parcel data = Parcel.obtain();
2900        Parcel reply = Parcel.obtain();
2901        data.writeInterfaceToken(IActivityManager.descriptor);
2902        data.writeString(pkg);
2903        data.writeInt(uid);
2904        mRemote.transact(KILL_APPLICATION_WITH_UID_TRANSACTION, data, reply, 0);
2905        reply.readException();
2906        data.recycle();
2907        reply.recycle();
2908    }
2909
2910    public void closeSystemDialogs(String reason) throws RemoteException {
2911        Parcel data = Parcel.obtain();
2912        Parcel reply = Parcel.obtain();
2913        data.writeInterfaceToken(IActivityManager.descriptor);
2914        data.writeString(reason);
2915        mRemote.transact(CLOSE_SYSTEM_DIALOGS_TRANSACTION, data, reply, 0);
2916        reply.readException();
2917        data.recycle();
2918        reply.recycle();
2919    }
2920
2921    public Debug.MemoryInfo[] getProcessMemoryInfo(int[] pids)
2922            throws RemoteException {
2923        Parcel data = Parcel.obtain();
2924        Parcel reply = Parcel.obtain();
2925        data.writeInterfaceToken(IActivityManager.descriptor);
2926        data.writeIntArray(pids);
2927        mRemote.transact(GET_PROCESS_MEMORY_INFO_TRANSACTION, data, reply, 0);
2928        reply.readException();
2929        Debug.MemoryInfo[] res = reply.createTypedArray(Debug.MemoryInfo.CREATOR);
2930        data.recycle();
2931        reply.recycle();
2932        return res;
2933    }
2934
2935    public void killApplicationProcess(String processName, int uid) throws RemoteException {
2936        Parcel data = Parcel.obtain();
2937        Parcel reply = Parcel.obtain();
2938        data.writeInterfaceToken(IActivityManager.descriptor);
2939        data.writeString(processName);
2940        data.writeInt(uid);
2941        mRemote.transact(KILL_APPLICATION_PROCESS_TRANSACTION, data, reply, 0);
2942        reply.readException();
2943        data.recycle();
2944        reply.recycle();
2945    }
2946
2947    public void overridePendingTransition(IBinder token, String packageName,
2948            int enterAnim, int exitAnim) throws RemoteException {
2949        Parcel data = Parcel.obtain();
2950        Parcel reply = Parcel.obtain();
2951        data.writeInterfaceToken(IActivityManager.descriptor);
2952        data.writeStrongBinder(token);
2953        data.writeString(packageName);
2954        data.writeInt(enterAnim);
2955        data.writeInt(exitAnim);
2956        mRemote.transact(OVERRIDE_PENDING_TRANSITION_TRANSACTION, data, reply, 0);
2957        reply.readException();
2958        data.recycle();
2959        reply.recycle();
2960    }
2961
2962    public boolean isUserAMonkey() throws RemoteException {
2963        Parcel data = Parcel.obtain();
2964        Parcel reply = Parcel.obtain();
2965        data.writeInterfaceToken(IActivityManager.descriptor);
2966        mRemote.transact(IS_USER_A_MONKEY_TRANSACTION, data, reply, 0);
2967        reply.readException();
2968        boolean res = reply.readInt() != 0;
2969        data.recycle();
2970        reply.recycle();
2971        return res;
2972    }
2973
2974    public void finishHeavyWeightApp() throws RemoteException {
2975        Parcel data = Parcel.obtain();
2976        Parcel reply = Parcel.obtain();
2977        data.writeInterfaceToken(IActivityManager.descriptor);
2978        mRemote.transact(FINISH_HEAVY_WEIGHT_APP_TRANSACTION, data, reply, 0);
2979        reply.readException();
2980        data.recycle();
2981        reply.recycle();
2982    }
2983
2984    public void setImmersive(IBinder token, boolean immersive)
2985            throws RemoteException {
2986        Parcel data = Parcel.obtain();
2987        Parcel reply = Parcel.obtain();
2988        data.writeInterfaceToken(IActivityManager.descriptor);
2989        data.writeStrongBinder(token);
2990        data.writeInt(immersive ? 1 : 0);
2991        mRemote.transact(SET_IMMERSIVE_TRANSACTION, data, reply, 0);
2992        reply.readException();
2993        data.recycle();
2994        reply.recycle();
2995    }
2996
2997    public boolean isImmersive(IBinder token)
2998            throws RemoteException {
2999        Parcel data = Parcel.obtain();
3000        Parcel reply = Parcel.obtain();
3001        data.writeInterfaceToken(IActivityManager.descriptor);
3002        data.writeStrongBinder(token);
3003        mRemote.transact(IS_IMMERSIVE_TRANSACTION, data, reply, 0);
3004        reply.readException();
3005        boolean res = reply.readInt() == 1;
3006        data.recycle();
3007        reply.recycle();
3008        return res;
3009    }
3010
3011    public boolean isTopActivityImmersive()
3012            throws RemoteException {
3013        Parcel data = Parcel.obtain();
3014        Parcel reply = Parcel.obtain();
3015        data.writeInterfaceToken(IActivityManager.descriptor);
3016        mRemote.transact(IS_TOP_ACTIVITY_IMMERSIVE_TRANSACTION, data, reply, 0);
3017        reply.readException();
3018        boolean res = reply.readInt() == 1;
3019        data.recycle();
3020        reply.recycle();
3021        return res;
3022    }
3023
3024    public void crashApplication(int uid, int initialPid, String packageName,
3025            String message) throws RemoteException {
3026        Parcel data = Parcel.obtain();
3027        Parcel reply = Parcel.obtain();
3028        data.writeInterfaceToken(IActivityManager.descriptor);
3029        data.writeInt(uid);
3030        data.writeInt(initialPid);
3031        data.writeString(packageName);
3032        data.writeString(message);
3033        mRemote.transact(CRASH_APPLICATION_TRANSACTION, data, reply, 0);
3034        reply.readException();
3035        data.recycle();
3036        reply.recycle();
3037    }
3038
3039    public String getProviderMimeType(Uri uri)
3040            throws RemoteException {
3041        Parcel data = Parcel.obtain();
3042        Parcel reply = Parcel.obtain();
3043        data.writeInterfaceToken(IActivityManager.descriptor);
3044        uri.writeToParcel(data, 0);
3045        mRemote.transact(GET_PROVIDER_MIME_TYPE_TRANSACTION, data, reply, 0);
3046        reply.readException();
3047        String res = reply.readString();
3048        data.recycle();
3049        reply.recycle();
3050        return res;
3051    }
3052
3053    public IBinder newUriPermissionOwner(String name)
3054            throws RemoteException {
3055        Parcel data = Parcel.obtain();
3056        Parcel reply = Parcel.obtain();
3057        data.writeInterfaceToken(IActivityManager.descriptor);
3058        data.writeString(name);
3059        mRemote.transact(NEW_URI_PERMISSION_OWNER_TRANSACTION, data, reply, 0);
3060        reply.readException();
3061        IBinder res = reply.readStrongBinder();
3062        data.recycle();
3063        reply.recycle();
3064        return res;
3065    }
3066
3067    public void grantUriPermissionFromOwner(IBinder owner, int fromUid, String targetPkg,
3068            Uri uri, int mode) throws RemoteException {
3069        Parcel data = Parcel.obtain();
3070        Parcel reply = Parcel.obtain();
3071        data.writeInterfaceToken(IActivityManager.descriptor);
3072        data.writeStrongBinder(owner);
3073        data.writeInt(fromUid);
3074        data.writeString(targetPkg);
3075        uri.writeToParcel(data, 0);
3076        data.writeInt(mode);
3077        mRemote.transact(GRANT_URI_PERMISSION_TRANSACTION, data, reply, 0);
3078        reply.readException();
3079        data.recycle();
3080        reply.recycle();
3081    }
3082
3083    public void revokeUriPermissionFromOwner(IBinder owner, Uri uri,
3084            int mode) throws RemoteException {
3085        Parcel data = Parcel.obtain();
3086        Parcel reply = Parcel.obtain();
3087        data.writeInterfaceToken(IActivityManager.descriptor);
3088        data.writeStrongBinder(owner);
3089        if (uri != null) {
3090            data.writeInt(1);
3091            uri.writeToParcel(data, 0);
3092        } else {
3093            data.writeInt(0);
3094        }
3095        data.writeInt(mode);
3096        mRemote.transact(REVOKE_URI_PERMISSION_TRANSACTION, data, reply, 0);
3097        reply.readException();
3098        data.recycle();
3099        reply.recycle();
3100    }
3101
3102    public int checkGrantUriPermission(int callingUid, String targetPkg,
3103            Uri uri, int modeFlags) throws RemoteException {
3104        Parcel data = Parcel.obtain();
3105        Parcel reply = Parcel.obtain();
3106        data.writeInterfaceToken(IActivityManager.descriptor);
3107        data.writeInt(callingUid);
3108        data.writeString(targetPkg);
3109        uri.writeToParcel(data, 0);
3110        data.writeInt(modeFlags);
3111        mRemote.transact(CHECK_GRANT_URI_PERMISSION_TRANSACTION, data, reply, 0);
3112        reply.readException();
3113        int res = reply.readInt();
3114        data.recycle();
3115        reply.recycle();
3116        return res;
3117    }
3118
3119    public boolean dumpHeap(String process, boolean managed,
3120            String path, ParcelFileDescriptor fd) throws RemoteException {
3121        Parcel data = Parcel.obtain();
3122        Parcel reply = Parcel.obtain();
3123        data.writeInterfaceToken(IActivityManager.descriptor);
3124        data.writeString(process);
3125        data.writeInt(managed ? 1 : 0);
3126        data.writeString(path);
3127        if (fd != null) {
3128            data.writeInt(1);
3129            fd.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
3130        } else {
3131            data.writeInt(0);
3132        }
3133        mRemote.transact(DUMP_HEAP_TRANSACTION, data, reply, 0);
3134        reply.readException();
3135        boolean res = reply.readInt() != 0;
3136        reply.recycle();
3137        data.recycle();
3138        return res;
3139    }
3140
3141    public int startActivities(IApplicationThread caller,
3142            Intent[] intents, String[] resolvedTypes, IBinder resultTo) throws RemoteException {
3143        Parcel data = Parcel.obtain();
3144        Parcel reply = Parcel.obtain();
3145        data.writeInterfaceToken(IActivityManager.descriptor);
3146        data.writeStrongBinder(caller != null ? caller.asBinder() : null);
3147        data.writeTypedArray(intents, 0);
3148        data.writeStringArray(resolvedTypes);
3149        data.writeStrongBinder(resultTo);
3150        mRemote.transact(START_ACTIVITIES_TRANSACTION, data, reply, 0);
3151        reply.readException();
3152        int result = reply.readInt();
3153        reply.recycle();
3154        data.recycle();
3155        return result;
3156    }
3157
3158    public int startActivitiesInPackage(int uid,
3159            Intent[] intents, String[] resolvedTypes, IBinder resultTo) throws RemoteException {
3160        Parcel data = Parcel.obtain();
3161        Parcel reply = Parcel.obtain();
3162        data.writeInterfaceToken(IActivityManager.descriptor);
3163        data.writeInt(uid);
3164        data.writeTypedArray(intents, 0);
3165        data.writeStringArray(resolvedTypes);
3166        data.writeStrongBinder(resultTo);
3167        mRemote.transact(START_ACTIVITIES_IN_PACKAGE_TRANSACTION, data, reply, 0);
3168        reply.readException();
3169        int result = reply.readInt();
3170        reply.recycle();
3171        data.recycle();
3172        return result;
3173    }
3174
3175    public boolean switchUser(int userid) throws RemoteException {
3176        Parcel data = Parcel.obtain();
3177        Parcel reply = Parcel.obtain();
3178        data.writeInterfaceToken(IActivityManager.descriptor);
3179        data.writeInt(userid);
3180        mRemote.transact(SWITCH_USER_TRANSACTION, data, reply, 0);
3181        reply.readException();
3182        boolean result = reply.readInt() != 0;
3183        reply.recycle();
3184        data.recycle();
3185        return result;
3186    }
3187
3188    public boolean removeSubTask(int taskId, int subTaskIndex) throws RemoteException {
3189        Parcel data = Parcel.obtain();
3190        Parcel reply = Parcel.obtain();
3191        data.writeInterfaceToken(IActivityManager.descriptor);
3192        data.writeInt(taskId);
3193        data.writeInt(subTaskIndex);
3194        mRemote.transact(REMOVE_SUB_TASK_TRANSACTION, data, reply, 0);
3195        reply.readException();
3196        boolean result = reply.readInt() != 0;
3197        reply.recycle();
3198        data.recycle();
3199        return result;
3200    }
3201
3202    public boolean removeTask(int taskId, int flags) throws RemoteException {
3203        Parcel data = Parcel.obtain();
3204        Parcel reply = Parcel.obtain();
3205        data.writeInterfaceToken(IActivityManager.descriptor);
3206        data.writeInt(taskId);
3207        data.writeInt(flags);
3208        mRemote.transact(REMOVE_TASK_TRANSACTION, data, reply, 0);
3209        reply.readException();
3210        boolean result = reply.readInt() != 0;
3211        reply.recycle();
3212        data.recycle();
3213        return result;
3214    }
3215
3216    private IBinder mRemote;
3217}
3218