• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
17 package android.app;
18 
19 import android.content.ComponentName;
20 import android.content.Intent;
21 import android.content.IIntentReceiver;
22 import android.content.pm.ActivityInfo;
23 import android.content.pm.ApplicationInfo;
24 import android.content.pm.ProviderInfo;
25 import android.content.pm.ServiceInfo;
26 import android.content.res.CompatibilityInfo;
27 import android.content.res.Configuration;
28 import android.net.Uri;
29 import android.os.Binder;
30 import android.os.Bundle;
31 import android.os.Debug;
32 import android.os.Parcelable;
33 import android.os.PersistableBundle;
34 import android.os.RemoteException;
35 import android.os.IBinder;
36 import android.os.Parcel;
37 import android.os.ParcelFileDescriptor;
38 import com.android.internal.app.IVoiceInteractor;
39 
40 import java.io.FileDescriptor;
41 import java.io.IOException;
42 import java.util.HashMap;
43 import java.util.List;
44 import java.util.Map;
45 
46 /** {@hide} */
47 public abstract class ApplicationThreadNative extends Binder
48         implements IApplicationThread {
49     /**
50      * Cast a Binder object into an application thread interface, generating
51      * a proxy if needed.
52      */
asInterface(IBinder obj)53     static public IApplicationThread asInterface(IBinder obj) {
54         if (obj == null) {
55             return null;
56         }
57         IApplicationThread in =
58             (IApplicationThread)obj.queryLocalInterface(descriptor);
59         if (in != null) {
60             return in;
61         }
62 
63         return new ApplicationThreadProxy(obj);
64     }
65 
ApplicationThreadNative()66     public ApplicationThreadNative() {
67         attachInterface(this, descriptor);
68     }
69 
70     @Override
onTransact(int code, Parcel data, Parcel reply, int flags)71     public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
72             throws RemoteException {
73         switch (code) {
74         case SCHEDULE_PAUSE_ACTIVITY_TRANSACTION:
75         {
76             data.enforceInterface(IApplicationThread.descriptor);
77             IBinder b = data.readStrongBinder();
78             boolean finished = data.readInt() != 0;
79             boolean userLeaving = data.readInt() != 0;
80             int configChanges = data.readInt();
81             boolean dontReport = data.readInt() != 0;
82             schedulePauseActivity(b, finished, userLeaving, configChanges, dontReport);
83             return true;
84         }
85 
86         case SCHEDULE_STOP_ACTIVITY_TRANSACTION:
87         {
88             data.enforceInterface(IApplicationThread.descriptor);
89             IBinder b = data.readStrongBinder();
90             boolean show = data.readInt() != 0;
91             int configChanges = data.readInt();
92             scheduleStopActivity(b, show, configChanges);
93             return true;
94         }
95 
96         case SCHEDULE_WINDOW_VISIBILITY_TRANSACTION:
97         {
98             data.enforceInterface(IApplicationThread.descriptor);
99             IBinder b = data.readStrongBinder();
100             boolean show = data.readInt() != 0;
101             scheduleWindowVisibility(b, show);
102             return true;
103         }
104 
105         case SCHEDULE_SLEEPING_TRANSACTION:
106         {
107             data.enforceInterface(IApplicationThread.descriptor);
108             IBinder b = data.readStrongBinder();
109             boolean sleeping = data.readInt() != 0;
110             scheduleSleeping(b, sleeping);
111             return true;
112         }
113 
114         case SCHEDULE_RESUME_ACTIVITY_TRANSACTION:
115         {
116             data.enforceInterface(IApplicationThread.descriptor);
117             IBinder b = data.readStrongBinder();
118             int procState = data.readInt();
119             boolean isForward = data.readInt() != 0;
120             Bundle resumeArgs = data.readBundle();
121             scheduleResumeActivity(b, procState, isForward, resumeArgs);
122             return true;
123         }
124 
125         case SCHEDULE_SEND_RESULT_TRANSACTION:
126         {
127             data.enforceInterface(IApplicationThread.descriptor);
128             IBinder b = data.readStrongBinder();
129             List<ResultInfo> ri = data.createTypedArrayList(ResultInfo.CREATOR);
130             scheduleSendResult(b, ri);
131             return true;
132         }
133 
134         case SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION:
135         {
136             data.enforceInterface(IApplicationThread.descriptor);
137             Intent intent = Intent.CREATOR.createFromParcel(data);
138             IBinder b = data.readStrongBinder();
139             int ident = data.readInt();
140             ActivityInfo info = ActivityInfo.CREATOR.createFromParcel(data);
141             Configuration curConfig = Configuration.CREATOR.createFromParcel(data);
142             CompatibilityInfo compatInfo = CompatibilityInfo.CREATOR.createFromParcel(data);
143             IVoiceInteractor voiceInteractor = IVoiceInteractor.Stub.asInterface(
144                     data.readStrongBinder());
145             int procState = data.readInt();
146             Bundle state = data.readBundle();
147             PersistableBundle persistentState = data.readPersistableBundle();
148             List<ResultInfo> ri = data.createTypedArrayList(ResultInfo.CREATOR);
149             List<Intent> pi = data.createTypedArrayList(Intent.CREATOR);
150             boolean notResumed = data.readInt() != 0;
151             boolean isForward = data.readInt() != 0;
152             ProfilerInfo profilerInfo = data.readInt() != 0
153                     ? ProfilerInfo.CREATOR.createFromParcel(data) : null;
154             scheduleLaunchActivity(intent, b, ident, info, curConfig, compatInfo, voiceInteractor,
155                     procState, state, persistentState, ri, pi, notResumed, isForward, profilerInfo);
156             return true;
157         }
158 
159         case SCHEDULE_RELAUNCH_ACTIVITY_TRANSACTION:
160         {
161             data.enforceInterface(IApplicationThread.descriptor);
162             IBinder b = data.readStrongBinder();
163             List<ResultInfo> ri = data.createTypedArrayList(ResultInfo.CREATOR);
164             List<Intent> pi = data.createTypedArrayList(Intent.CREATOR);
165             int configChanges = data.readInt();
166             boolean notResumed = data.readInt() != 0;
167             Configuration config = null;
168             if (data.readInt() != 0) {
169                 config = Configuration.CREATOR.createFromParcel(data);
170             }
171             scheduleRelaunchActivity(b, ri, pi, configChanges, notResumed, config);
172             return true;
173         }
174 
175         case SCHEDULE_NEW_INTENT_TRANSACTION:
176         {
177             data.enforceInterface(IApplicationThread.descriptor);
178             List<Intent> pi = data.createTypedArrayList(Intent.CREATOR);
179             IBinder b = data.readStrongBinder();
180             scheduleNewIntent(pi, b);
181             return true;
182         }
183 
184         case SCHEDULE_FINISH_ACTIVITY_TRANSACTION:
185         {
186             data.enforceInterface(IApplicationThread.descriptor);
187             IBinder b = data.readStrongBinder();
188             boolean finishing = data.readInt() != 0;
189             int configChanges = data.readInt();
190             scheduleDestroyActivity(b, finishing, configChanges);
191             return true;
192         }
193 
194         case SCHEDULE_RECEIVER_TRANSACTION:
195         {
196             data.enforceInterface(IApplicationThread.descriptor);
197             Intent intent = Intent.CREATOR.createFromParcel(data);
198             ActivityInfo info = ActivityInfo.CREATOR.createFromParcel(data);
199             CompatibilityInfo compatInfo = CompatibilityInfo.CREATOR.createFromParcel(data);
200             int resultCode = data.readInt();
201             String resultData = data.readString();
202             Bundle resultExtras = data.readBundle();
203             boolean sync = data.readInt() != 0;
204             int sendingUser = data.readInt();
205             int processState = data.readInt();
206             scheduleReceiver(intent, info, compatInfo, resultCode, resultData,
207                     resultExtras, sync, sendingUser, processState);
208             return true;
209         }
210 
211         case SCHEDULE_CREATE_SERVICE_TRANSACTION: {
212             data.enforceInterface(IApplicationThread.descriptor);
213             IBinder token = data.readStrongBinder();
214             ServiceInfo info = ServiceInfo.CREATOR.createFromParcel(data);
215             CompatibilityInfo compatInfo = CompatibilityInfo.CREATOR.createFromParcel(data);
216             int processState = data.readInt();
217             scheduleCreateService(token, info, compatInfo, processState);
218             return true;
219         }
220 
221         case SCHEDULE_BIND_SERVICE_TRANSACTION: {
222             data.enforceInterface(IApplicationThread.descriptor);
223             IBinder token = data.readStrongBinder();
224             Intent intent = Intent.CREATOR.createFromParcel(data);
225             boolean rebind = data.readInt() != 0;
226             int processState = data.readInt();
227             scheduleBindService(token, intent, rebind, processState);
228             return true;
229         }
230 
231         case SCHEDULE_UNBIND_SERVICE_TRANSACTION: {
232             data.enforceInterface(IApplicationThread.descriptor);
233             IBinder token = data.readStrongBinder();
234             Intent intent = Intent.CREATOR.createFromParcel(data);
235             scheduleUnbindService(token, intent);
236             return true;
237         }
238 
239         case SCHEDULE_SERVICE_ARGS_TRANSACTION:
240         {
241             data.enforceInterface(IApplicationThread.descriptor);
242             IBinder token = data.readStrongBinder();
243             boolean taskRemoved = data.readInt() != 0;
244             int startId = data.readInt();
245             int fl = data.readInt();
246             Intent args;
247             if (data.readInt() != 0) {
248                 args = Intent.CREATOR.createFromParcel(data);
249             } else {
250                 args = null;
251             }
252             scheduleServiceArgs(token, taskRemoved, startId, fl, args);
253             return true;
254         }
255 
256         case SCHEDULE_STOP_SERVICE_TRANSACTION:
257         {
258             data.enforceInterface(IApplicationThread.descriptor);
259             IBinder token = data.readStrongBinder();
260             scheduleStopService(token);
261             return true;
262         }
263 
264         case BIND_APPLICATION_TRANSACTION:
265         {
266             data.enforceInterface(IApplicationThread.descriptor);
267             String packageName = data.readString();
268             ApplicationInfo info =
269                 ApplicationInfo.CREATOR.createFromParcel(data);
270             List<ProviderInfo> providers =
271                 data.createTypedArrayList(ProviderInfo.CREATOR);
272             ComponentName testName = (data.readInt() != 0)
273                 ? new ComponentName(data) : null;
274             ProfilerInfo profilerInfo = data.readInt() != 0
275                     ? ProfilerInfo.CREATOR.createFromParcel(data) : null;
276             Bundle testArgs = data.readBundle();
277             IBinder binder = data.readStrongBinder();
278             IInstrumentationWatcher testWatcher = IInstrumentationWatcher.Stub.asInterface(binder);
279             binder = data.readStrongBinder();
280             IUiAutomationConnection uiAutomationConnection =
281                     IUiAutomationConnection.Stub.asInterface(binder);
282             int testMode = data.readInt();
283             boolean openGlTrace = data.readInt() != 0;
284             boolean restrictedBackupMode = (data.readInt() != 0);
285             boolean persistent = (data.readInt() != 0);
286             Configuration config = Configuration.CREATOR.createFromParcel(data);
287             CompatibilityInfo compatInfo = CompatibilityInfo.CREATOR.createFromParcel(data);
288             HashMap<String, IBinder> services = data.readHashMap(null);
289             Bundle coreSettings = data.readBundle();
290             bindApplication(packageName, info, providers, testName, profilerInfo, testArgs,
291                     testWatcher, uiAutomationConnection, testMode, openGlTrace,
292                     restrictedBackupMode, persistent, config, compatInfo, services, coreSettings);
293             return true;
294         }
295 
296         case SCHEDULE_EXIT_TRANSACTION:
297         {
298             data.enforceInterface(IApplicationThread.descriptor);
299             scheduleExit();
300             return true;
301         }
302 
303         case SCHEDULE_SUICIDE_TRANSACTION:
304         {
305             data.enforceInterface(IApplicationThread.descriptor);
306             scheduleSuicide();
307             return true;
308         }
309 
310         case SCHEDULE_CONFIGURATION_CHANGED_TRANSACTION:
311         {
312             data.enforceInterface(IApplicationThread.descriptor);
313             Configuration config = Configuration.CREATOR.createFromParcel(data);
314             scheduleConfigurationChanged(config);
315             return true;
316         }
317 
318         case UPDATE_TIME_ZONE_TRANSACTION: {
319             data.enforceInterface(IApplicationThread.descriptor);
320             updateTimeZone();
321             return true;
322         }
323 
324         case CLEAR_DNS_CACHE_TRANSACTION: {
325             data.enforceInterface(IApplicationThread.descriptor);
326             clearDnsCache();
327             return true;
328         }
329 
330         case SET_HTTP_PROXY_TRANSACTION: {
331             data.enforceInterface(IApplicationThread.descriptor);
332             final String proxy = data.readString();
333             final String port = data.readString();
334             final String exclList = data.readString();
335             final Uri pacFileUrl = Uri.CREATOR.createFromParcel(data);
336             setHttpProxy(proxy, port, exclList, pacFileUrl);
337             return true;
338         }
339 
340         case PROCESS_IN_BACKGROUND_TRANSACTION: {
341             data.enforceInterface(IApplicationThread.descriptor);
342             processInBackground();
343             return true;
344         }
345 
346         case DUMP_SERVICE_TRANSACTION: {
347             data.enforceInterface(IApplicationThread.descriptor);
348             ParcelFileDescriptor fd = data.readFileDescriptor();
349             final IBinder service = data.readStrongBinder();
350             final String[] args = data.readStringArray();
351             if (fd != null) {
352                 dumpService(fd.getFileDescriptor(), service, args);
353                 try {
354                     fd.close();
355                 } catch (IOException e) {
356                 }
357             }
358             return true;
359         }
360 
361         case DUMP_PROVIDER_TRANSACTION: {
362             data.enforceInterface(IApplicationThread.descriptor);
363             ParcelFileDescriptor fd = data.readFileDescriptor();
364             final IBinder service = data.readStrongBinder();
365             final String[] args = data.readStringArray();
366             if (fd != null) {
367                 dumpProvider(fd.getFileDescriptor(), service, args);
368                 try {
369                     fd.close();
370                 } catch (IOException e) {
371                 }
372             }
373             return true;
374         }
375 
376         case SCHEDULE_REGISTERED_RECEIVER_TRANSACTION: {
377             data.enforceInterface(IApplicationThread.descriptor);
378             IIntentReceiver receiver = IIntentReceiver.Stub.asInterface(
379                     data.readStrongBinder());
380             Intent intent = Intent.CREATOR.createFromParcel(data);
381             int resultCode = data.readInt();
382             String dataStr = data.readString();
383             Bundle extras = data.readBundle();
384             boolean ordered = data.readInt() != 0;
385             boolean sticky = data.readInt() != 0;
386             int sendingUser = data.readInt();
387             int processState = data.readInt();
388             scheduleRegisteredReceiver(receiver, intent,
389                     resultCode, dataStr, extras, ordered, sticky, sendingUser, processState);
390             return true;
391         }
392 
393         case SCHEDULE_LOW_MEMORY_TRANSACTION:
394         {
395             data.enforceInterface(IApplicationThread.descriptor);
396             scheduleLowMemory();
397             return true;
398         }
399 
400         case SCHEDULE_ACTIVITY_CONFIGURATION_CHANGED_TRANSACTION:
401         {
402             data.enforceInterface(IApplicationThread.descriptor);
403             IBinder b = data.readStrongBinder();
404             scheduleActivityConfigurationChanged(b);
405             return true;
406         }
407 
408         case PROFILER_CONTROL_TRANSACTION:
409         {
410             data.enforceInterface(IApplicationThread.descriptor);
411             boolean start = data.readInt() != 0;
412             int profileType = data.readInt();
413             ProfilerInfo profilerInfo = data.readInt() != 0
414                     ? ProfilerInfo.CREATOR.createFromParcel(data) : null;
415             profilerControl(start, profilerInfo, profileType);
416             return true;
417         }
418 
419         case SET_SCHEDULING_GROUP_TRANSACTION:
420         {
421             data.enforceInterface(IApplicationThread.descriptor);
422             int group = data.readInt();
423             setSchedulingGroup(group);
424             return true;
425         }
426 
427         case SCHEDULE_CREATE_BACKUP_AGENT_TRANSACTION:
428         {
429             data.enforceInterface(IApplicationThread.descriptor);
430             ApplicationInfo appInfo = ApplicationInfo.CREATOR.createFromParcel(data);
431             CompatibilityInfo compatInfo = CompatibilityInfo.CREATOR.createFromParcel(data);
432             int backupMode = data.readInt();
433             scheduleCreateBackupAgent(appInfo, compatInfo, backupMode);
434             return true;
435         }
436 
437         case SCHEDULE_DESTROY_BACKUP_AGENT_TRANSACTION:
438         {
439             data.enforceInterface(IApplicationThread.descriptor);
440             ApplicationInfo appInfo = ApplicationInfo.CREATOR.createFromParcel(data);
441             CompatibilityInfo compatInfo = CompatibilityInfo.CREATOR.createFromParcel(data);
442             scheduleDestroyBackupAgent(appInfo, compatInfo);
443             return true;
444         }
445 
446         case DISPATCH_PACKAGE_BROADCAST_TRANSACTION:
447         {
448             data.enforceInterface(IApplicationThread.descriptor);
449             int cmd = data.readInt();
450             String[] packages = data.readStringArray();
451             dispatchPackageBroadcast(cmd, packages);
452             return true;
453         }
454 
455         case SCHEDULE_CRASH_TRANSACTION:
456         {
457             data.enforceInterface(IApplicationThread.descriptor);
458             String msg = data.readString();
459             scheduleCrash(msg);
460             return true;
461         }
462 
463         case DUMP_HEAP_TRANSACTION:
464         {
465             data.enforceInterface(IApplicationThread.descriptor);
466             boolean managed = data.readInt() != 0;
467             String path = data.readString();
468             ParcelFileDescriptor fd = data.readInt() != 0
469                     ? ParcelFileDescriptor.CREATOR.createFromParcel(data) : null;
470             dumpHeap(managed, path, fd);
471             return true;
472         }
473 
474         case DUMP_ACTIVITY_TRANSACTION: {
475             data.enforceInterface(IApplicationThread.descriptor);
476             ParcelFileDescriptor fd = data.readFileDescriptor();
477             final IBinder activity = data.readStrongBinder();
478             final String prefix = data.readString();
479             final String[] args = data.readStringArray();
480             if (fd != null) {
481                 dumpActivity(fd.getFileDescriptor(), activity, prefix, args);
482                 try {
483                     fd.close();
484                 } catch (IOException e) {
485                 }
486             }
487             return true;
488         }
489 
490         case SET_CORE_SETTINGS_TRANSACTION: {
491             data.enforceInterface(IApplicationThread.descriptor);
492             Bundle settings = data.readBundle();
493             setCoreSettings(settings);
494             return true;
495         }
496 
497         case UPDATE_PACKAGE_COMPATIBILITY_INFO_TRANSACTION: {
498             data.enforceInterface(IApplicationThread.descriptor);
499             String pkg = data.readString();
500             CompatibilityInfo compat = CompatibilityInfo.CREATOR.createFromParcel(data);
501             updatePackageCompatibilityInfo(pkg, compat);
502             return true;
503         }
504 
505         case SCHEDULE_TRIM_MEMORY_TRANSACTION: {
506             data.enforceInterface(IApplicationThread.descriptor);
507             int level = data.readInt();
508             scheduleTrimMemory(level);
509             return true;
510         }
511 
512         case DUMP_MEM_INFO_TRANSACTION:
513         {
514             data.enforceInterface(IApplicationThread.descriptor);
515             ParcelFileDescriptor fd = data.readFileDescriptor();
516             Debug.MemoryInfo mi = Debug.MemoryInfo.CREATOR.createFromParcel(data);
517             boolean checkin = data.readInt() != 0;
518             boolean dumpInfo = data.readInt() != 0;
519             boolean dumpDalvik = data.readInt() != 0;
520             String[] args = data.readStringArray();
521             if (fd != null) {
522                 try {
523                     dumpMemInfo(fd.getFileDescriptor(), mi, checkin, dumpInfo, dumpDalvik, args);
524                 } finally {
525                     try {
526                         fd.close();
527                     } catch (IOException e) {
528                         // swallowed, not propagated back to the caller
529                     }
530                 }
531             }
532             reply.writeNoException();
533             return true;
534         }
535 
536         case DUMP_GFX_INFO_TRANSACTION:
537         {
538             data.enforceInterface(IApplicationThread.descriptor);
539             ParcelFileDescriptor fd = data.readFileDescriptor();
540             String[] args = data.readStringArray();
541             if (fd != null) {
542                 try {
543                     dumpGfxInfo(fd.getFileDescriptor(), args);
544                 } finally {
545                     try {
546                         fd.close();
547                     } catch (IOException e) {
548                         // swallowed, not propagated back to the caller
549                     }
550                 }
551             }
552             reply.writeNoException();
553             return true;
554         }
555 
556         case DUMP_DB_INFO_TRANSACTION:
557         {
558             data.enforceInterface(IApplicationThread.descriptor);
559             ParcelFileDescriptor fd = data.readFileDescriptor();
560             String[] args = data.readStringArray();
561             if (fd != null) {
562                 try {
563                     dumpDbInfo(fd.getFileDescriptor(), args);
564                 } finally {
565                     try {
566                         fd.close();
567                     } catch (IOException e) {
568                         // swallowed, not propagated back to the caller
569                     }
570                 }
571             }
572             reply.writeNoException();
573             return true;
574         }
575 
576         case UNSTABLE_PROVIDER_DIED_TRANSACTION:
577         {
578             data.enforceInterface(IApplicationThread.descriptor);
579             IBinder provider = data.readStrongBinder();
580             unstableProviderDied(provider);
581             reply.writeNoException();
582             return true;
583         }
584 
585         case REQUEST_ASSIST_CONTEXT_EXTRAS_TRANSACTION:
586         {
587             data.enforceInterface(IApplicationThread.descriptor);
588             IBinder activityToken = data.readStrongBinder();
589             IBinder requestToken = data.readStrongBinder();
590             int requestType = data.readInt();
591             requestAssistContextExtras(activityToken, requestToken, requestType);
592             reply.writeNoException();
593             return true;
594         }
595 
596         case SCHEDULE_TRANSLUCENT_CONVERSION_COMPLETE_TRANSACTION:
597         {
598             data.enforceInterface(IApplicationThread.descriptor);
599             IBinder token = data.readStrongBinder();
600             boolean timeout = data.readInt() == 1;
601             scheduleTranslucentConversionComplete(token, timeout);
602             reply.writeNoException();
603             return true;
604         }
605 
606         case SCHEDULE_ON_NEW_ACTIVITY_OPTIONS_TRANSACTION:
607         {
608             data.enforceInterface(IApplicationThread.descriptor);
609             IBinder token = data.readStrongBinder();
610             ActivityOptions options = new ActivityOptions(data.readBundle());
611             scheduleOnNewActivityOptions(token, options);
612             reply.writeNoException();
613             return true;
614         }
615 
616         case SET_PROCESS_STATE_TRANSACTION:
617         {
618             data.enforceInterface(IApplicationThread.descriptor);
619             int state = data.readInt();
620             setProcessState(state);
621             reply.writeNoException();
622             return true;
623         }
624 
625         case SCHEDULE_INSTALL_PROVIDER_TRANSACTION:
626         {
627             data.enforceInterface(IApplicationThread.descriptor);
628             ProviderInfo provider = ProviderInfo.CREATOR.createFromParcel(data);
629             scheduleInstallProvider(provider);
630             reply.writeNoException();
631             return true;
632         }
633 
634         case UPDATE_TIME_PREFS_TRANSACTION:
635         {
636             data.enforceInterface(IApplicationThread.descriptor);
637             byte is24Hour = data.readByte();
638             updateTimePrefs(is24Hour == (byte) 1);
639             reply.writeNoException();
640             return true;
641         }
642 
643         case CANCEL_VISIBLE_BEHIND_TRANSACTION:
644         {
645             data.enforceInterface(IApplicationThread.descriptor);
646             IBinder token = data.readStrongBinder();
647             scheduleCancelVisibleBehind(token);
648             reply.writeNoException();
649             return true;
650         }
651 
652         case BACKGROUND_VISIBLE_BEHIND_CHANGED_TRANSACTION:
653         {
654             data.enforceInterface(IApplicationThread.descriptor);
655             IBinder token = data.readStrongBinder();
656             boolean enabled = data.readInt() > 0;
657             scheduleBackgroundVisibleBehindChanged(token, enabled);
658             reply.writeNoException();
659             return true;
660         }
661 
662         case ENTER_ANIMATION_COMPLETE_TRANSACTION:
663         {
664             data.enforceInterface(IApplicationThread.descriptor);
665             IBinder token = data.readStrongBinder();
666             scheduleEnterAnimationComplete(token);
667             reply.writeNoException();
668             return true;
669         }
670         }
671 
672         return super.onTransact(code, data, reply, flags);
673     }
674 
asBinder()675     public IBinder asBinder()
676     {
677         return this;
678     }
679 }
680 
681 class ApplicationThreadProxy implements IApplicationThread {
682     private final IBinder mRemote;
683 
ApplicationThreadProxy(IBinder remote)684     public ApplicationThreadProxy(IBinder remote) {
685         mRemote = remote;
686     }
687 
asBinder()688     public final IBinder asBinder() {
689         return mRemote;
690     }
691 
schedulePauseActivity(IBinder token, boolean finished, boolean userLeaving, int configChanges, boolean dontReport)692     public final void schedulePauseActivity(IBinder token, boolean finished,
693             boolean userLeaving, int configChanges, boolean dontReport) throws RemoteException {
694         Parcel data = Parcel.obtain();
695         data.writeInterfaceToken(IApplicationThread.descriptor);
696         data.writeStrongBinder(token);
697         data.writeInt(finished ? 1 : 0);
698         data.writeInt(userLeaving ? 1 :0);
699         data.writeInt(configChanges);
700         data.writeInt(dontReport ? 1 : 0);
701         mRemote.transact(SCHEDULE_PAUSE_ACTIVITY_TRANSACTION, data, null,
702                 IBinder.FLAG_ONEWAY);
703         data.recycle();
704     }
705 
scheduleStopActivity(IBinder token, boolean showWindow, int configChanges)706     public final void scheduleStopActivity(IBinder token, boolean showWindow,
707             int configChanges) throws RemoteException {
708         Parcel data = Parcel.obtain();
709         data.writeInterfaceToken(IApplicationThread.descriptor);
710         data.writeStrongBinder(token);
711         data.writeInt(showWindow ? 1 : 0);
712         data.writeInt(configChanges);
713         mRemote.transact(SCHEDULE_STOP_ACTIVITY_TRANSACTION, data, null,
714                 IBinder.FLAG_ONEWAY);
715         data.recycle();
716     }
717 
scheduleWindowVisibility(IBinder token, boolean showWindow)718     public final void scheduleWindowVisibility(IBinder token,
719             boolean showWindow) throws RemoteException {
720         Parcel data = Parcel.obtain();
721         data.writeInterfaceToken(IApplicationThread.descriptor);
722         data.writeStrongBinder(token);
723         data.writeInt(showWindow ? 1 : 0);
724         mRemote.transact(SCHEDULE_WINDOW_VISIBILITY_TRANSACTION, data, null,
725                 IBinder.FLAG_ONEWAY);
726         data.recycle();
727     }
728 
scheduleSleeping(IBinder token, boolean sleeping)729     public final void scheduleSleeping(IBinder token,
730             boolean sleeping) throws RemoteException {
731         Parcel data = Parcel.obtain();
732         data.writeInterfaceToken(IApplicationThread.descriptor);
733         data.writeStrongBinder(token);
734         data.writeInt(sleeping ? 1 : 0);
735         mRemote.transact(SCHEDULE_SLEEPING_TRANSACTION, data, null,
736                 IBinder.FLAG_ONEWAY);
737         data.recycle();
738     }
739 
scheduleResumeActivity(IBinder token, int procState, boolean isForward, Bundle resumeArgs)740     public final void scheduleResumeActivity(IBinder token, int procState, boolean isForward,
741             Bundle resumeArgs)
742             throws RemoteException {
743         Parcel data = Parcel.obtain();
744         data.writeInterfaceToken(IApplicationThread.descriptor);
745         data.writeStrongBinder(token);
746         data.writeInt(procState);
747         data.writeInt(isForward ? 1 : 0);
748         data.writeBundle(resumeArgs);
749         mRemote.transact(SCHEDULE_RESUME_ACTIVITY_TRANSACTION, data, null,
750                 IBinder.FLAG_ONEWAY);
751         data.recycle();
752     }
753 
scheduleSendResult(IBinder token, List<ResultInfo> results)754     public final void scheduleSendResult(IBinder token, List<ResultInfo> results)
755             throws RemoteException {
756         Parcel data = Parcel.obtain();
757         data.writeInterfaceToken(IApplicationThread.descriptor);
758         data.writeStrongBinder(token);
759         data.writeTypedList(results);
760         mRemote.transact(SCHEDULE_SEND_RESULT_TRANSACTION, data, null,
761                 IBinder.FLAG_ONEWAY);
762         data.recycle();
763     }
764 
scheduleLaunchActivity(Intent intent, IBinder token, int ident, ActivityInfo info, Configuration curConfig, CompatibilityInfo compatInfo, IVoiceInteractor voiceInteractor, int procState, Bundle state, PersistableBundle persistentState, List<ResultInfo> pendingResults, List<Intent> pendingNewIntents, boolean notResumed, boolean isForward, ProfilerInfo profilerInfo)765     public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
766             ActivityInfo info, Configuration curConfig, CompatibilityInfo compatInfo,
767             IVoiceInteractor voiceInteractor, int procState, Bundle state,
768             PersistableBundle persistentState, List<ResultInfo> pendingResults,
769             List<Intent> pendingNewIntents, boolean notResumed, boolean isForward,
770             ProfilerInfo profilerInfo) throws RemoteException {
771         Parcel data = Parcel.obtain();
772         data.writeInterfaceToken(IApplicationThread.descriptor);
773         intent.writeToParcel(data, 0);
774         data.writeStrongBinder(token);
775         data.writeInt(ident);
776         info.writeToParcel(data, 0);
777         curConfig.writeToParcel(data, 0);
778         compatInfo.writeToParcel(data, 0);
779         data.writeStrongBinder(voiceInteractor != null ? voiceInteractor.asBinder() : null);
780         data.writeInt(procState);
781         data.writeBundle(state);
782         data.writePersistableBundle(persistentState);
783         data.writeTypedList(pendingResults);
784         data.writeTypedList(pendingNewIntents);
785         data.writeInt(notResumed ? 1 : 0);
786         data.writeInt(isForward ? 1 : 0);
787         if (profilerInfo != null) {
788             data.writeInt(1);
789             profilerInfo.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
790         } else {
791             data.writeInt(0);
792         }
793         mRemote.transact(SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION, data, null,
794                 IBinder.FLAG_ONEWAY);
795         data.recycle();
796     }
797 
scheduleRelaunchActivity(IBinder token, List<ResultInfo> pendingResults, List<Intent> pendingNewIntents, int configChanges, boolean notResumed, Configuration config)798     public final void scheduleRelaunchActivity(IBinder token,
799             List<ResultInfo> pendingResults, List<Intent> pendingNewIntents,
800             int configChanges, boolean notResumed, Configuration config)
801             throws RemoteException {
802         Parcel data = Parcel.obtain();
803         data.writeInterfaceToken(IApplicationThread.descriptor);
804         data.writeStrongBinder(token);
805         data.writeTypedList(pendingResults);
806         data.writeTypedList(pendingNewIntents);
807         data.writeInt(configChanges);
808         data.writeInt(notResumed ? 1 : 0);
809         if (config != null) {
810             data.writeInt(1);
811             config.writeToParcel(data, 0);
812         } else {
813             data.writeInt(0);
814         }
815         mRemote.transact(SCHEDULE_RELAUNCH_ACTIVITY_TRANSACTION, data, null,
816                 IBinder.FLAG_ONEWAY);
817         data.recycle();
818     }
819 
scheduleNewIntent(List<Intent> intents, IBinder token)820     public void scheduleNewIntent(List<Intent> intents, IBinder token)
821             throws RemoteException {
822         Parcel data = Parcel.obtain();
823         data.writeInterfaceToken(IApplicationThread.descriptor);
824         data.writeTypedList(intents);
825         data.writeStrongBinder(token);
826         mRemote.transact(SCHEDULE_NEW_INTENT_TRANSACTION, data, null,
827                 IBinder.FLAG_ONEWAY);
828         data.recycle();
829     }
830 
scheduleDestroyActivity(IBinder token, boolean finishing, int configChanges)831     public final void scheduleDestroyActivity(IBinder token, boolean finishing,
832             int configChanges) throws RemoteException {
833         Parcel data = Parcel.obtain();
834         data.writeInterfaceToken(IApplicationThread.descriptor);
835         data.writeStrongBinder(token);
836         data.writeInt(finishing ? 1 : 0);
837         data.writeInt(configChanges);
838         mRemote.transact(SCHEDULE_FINISH_ACTIVITY_TRANSACTION, data, null,
839                 IBinder.FLAG_ONEWAY);
840         data.recycle();
841     }
842 
scheduleReceiver(Intent intent, ActivityInfo info, CompatibilityInfo compatInfo, int resultCode, String resultData, Bundle map, boolean sync, int sendingUser, int processState)843     public final void scheduleReceiver(Intent intent, ActivityInfo info,
844             CompatibilityInfo compatInfo, int resultCode, String resultData,
845             Bundle map, boolean sync, int sendingUser, int processState) throws RemoteException {
846         Parcel data = Parcel.obtain();
847         data.writeInterfaceToken(IApplicationThread.descriptor);
848         intent.writeToParcel(data, 0);
849         info.writeToParcel(data, 0);
850         compatInfo.writeToParcel(data, 0);
851         data.writeInt(resultCode);
852         data.writeString(resultData);
853         data.writeBundle(map);
854         data.writeInt(sync ? 1 : 0);
855         data.writeInt(sendingUser);
856         data.writeInt(processState);
857         mRemote.transact(SCHEDULE_RECEIVER_TRANSACTION, data, null,
858                 IBinder.FLAG_ONEWAY);
859         data.recycle();
860     }
861 
scheduleCreateBackupAgent(ApplicationInfo app, CompatibilityInfo compatInfo, int backupMode)862     public final void scheduleCreateBackupAgent(ApplicationInfo app,
863             CompatibilityInfo compatInfo, int backupMode) throws RemoteException {
864         Parcel data = Parcel.obtain();
865         data.writeInterfaceToken(IApplicationThread.descriptor);
866         app.writeToParcel(data, 0);
867         compatInfo.writeToParcel(data, 0);
868         data.writeInt(backupMode);
869         mRemote.transact(SCHEDULE_CREATE_BACKUP_AGENT_TRANSACTION, data, null,
870                 IBinder.FLAG_ONEWAY);
871         data.recycle();
872     }
873 
scheduleDestroyBackupAgent(ApplicationInfo app, CompatibilityInfo compatInfo)874     public final void scheduleDestroyBackupAgent(ApplicationInfo app,
875             CompatibilityInfo compatInfo) throws RemoteException {
876         Parcel data = Parcel.obtain();
877         data.writeInterfaceToken(IApplicationThread.descriptor);
878         app.writeToParcel(data, 0);
879         compatInfo.writeToParcel(data, 0);
880         mRemote.transact(SCHEDULE_DESTROY_BACKUP_AGENT_TRANSACTION, data, null,
881                 IBinder.FLAG_ONEWAY);
882         data.recycle();
883     }
884 
scheduleCreateService(IBinder token, ServiceInfo info, CompatibilityInfo compatInfo, int processState)885     public final void scheduleCreateService(IBinder token, ServiceInfo info,
886             CompatibilityInfo compatInfo, int processState) throws RemoteException {
887         Parcel data = Parcel.obtain();
888         data.writeInterfaceToken(IApplicationThread.descriptor);
889         data.writeStrongBinder(token);
890         info.writeToParcel(data, 0);
891         compatInfo.writeToParcel(data, 0);
892         data.writeInt(processState);
893         mRemote.transact(SCHEDULE_CREATE_SERVICE_TRANSACTION, data, null,
894                 IBinder.FLAG_ONEWAY);
895         data.recycle();
896     }
897 
scheduleBindService(IBinder token, Intent intent, boolean rebind, int processState)898     public final void scheduleBindService(IBinder token, Intent intent, boolean rebind,
899             int processState) throws RemoteException {
900         Parcel data = Parcel.obtain();
901         data.writeInterfaceToken(IApplicationThread.descriptor);
902         data.writeStrongBinder(token);
903         intent.writeToParcel(data, 0);
904         data.writeInt(rebind ? 1 : 0);
905         data.writeInt(processState);
906         mRemote.transact(SCHEDULE_BIND_SERVICE_TRANSACTION, data, null,
907                 IBinder.FLAG_ONEWAY);
908         data.recycle();
909     }
910 
scheduleUnbindService(IBinder token, Intent intent)911     public final void scheduleUnbindService(IBinder token, Intent intent)
912             throws RemoteException {
913         Parcel data = Parcel.obtain();
914         data.writeInterfaceToken(IApplicationThread.descriptor);
915         data.writeStrongBinder(token);
916         intent.writeToParcel(data, 0);
917         mRemote.transact(SCHEDULE_UNBIND_SERVICE_TRANSACTION, data, null,
918                 IBinder.FLAG_ONEWAY);
919         data.recycle();
920     }
921 
scheduleServiceArgs(IBinder token, boolean taskRemoved, int startId, int flags, Intent args)922     public final void scheduleServiceArgs(IBinder token, boolean taskRemoved, int startId,
923             int flags, Intent args) throws RemoteException {
924         Parcel data = Parcel.obtain();
925         data.writeInterfaceToken(IApplicationThread.descriptor);
926         data.writeStrongBinder(token);
927         data.writeInt(taskRemoved ? 1 : 0);
928         data.writeInt(startId);
929         data.writeInt(flags);
930         if (args != null) {
931             data.writeInt(1);
932             args.writeToParcel(data, 0);
933         } else {
934             data.writeInt(0);
935         }
936         mRemote.transact(SCHEDULE_SERVICE_ARGS_TRANSACTION, data, null,
937                 IBinder.FLAG_ONEWAY);
938         data.recycle();
939     }
940 
scheduleStopService(IBinder token)941     public final void scheduleStopService(IBinder token)
942             throws RemoteException {
943         Parcel data = Parcel.obtain();
944         data.writeInterfaceToken(IApplicationThread.descriptor);
945         data.writeStrongBinder(token);
946         mRemote.transact(SCHEDULE_STOP_SERVICE_TRANSACTION, data, null,
947                 IBinder.FLAG_ONEWAY);
948         data.recycle();
949     }
950 
bindApplication(String packageName, ApplicationInfo info, List<ProviderInfo> providers, ComponentName testName, ProfilerInfo profilerInfo, Bundle testArgs, IInstrumentationWatcher testWatcher, IUiAutomationConnection uiAutomationConnection, int debugMode, boolean openGlTrace, boolean restrictedBackupMode, boolean persistent, Configuration config, CompatibilityInfo compatInfo, Map<String, IBinder> services, Bundle coreSettings)951     public final void bindApplication(String packageName, ApplicationInfo info,
952             List<ProviderInfo> providers, ComponentName testName, ProfilerInfo profilerInfo,
953             Bundle testArgs, IInstrumentationWatcher testWatcher,
954             IUiAutomationConnection uiAutomationConnection, int debugMode,
955             boolean openGlTrace, boolean restrictedBackupMode, boolean persistent,
956             Configuration config, CompatibilityInfo compatInfo, Map<String, IBinder> services,
957             Bundle coreSettings) throws RemoteException {
958         Parcel data = Parcel.obtain();
959         data.writeInterfaceToken(IApplicationThread.descriptor);
960         data.writeString(packageName);
961         info.writeToParcel(data, 0);
962         data.writeTypedList(providers);
963         if (testName == null) {
964             data.writeInt(0);
965         } else {
966             data.writeInt(1);
967             testName.writeToParcel(data, 0);
968         }
969         if (profilerInfo != null) {
970             data.writeInt(1);
971             profilerInfo.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
972         } else {
973             data.writeInt(0);
974         }
975         data.writeBundle(testArgs);
976         data.writeStrongInterface(testWatcher);
977         data.writeStrongInterface(uiAutomationConnection);
978         data.writeInt(debugMode);
979         data.writeInt(openGlTrace ? 1 : 0);
980         data.writeInt(restrictedBackupMode ? 1 : 0);
981         data.writeInt(persistent ? 1 : 0);
982         config.writeToParcel(data, 0);
983         compatInfo.writeToParcel(data, 0);
984         data.writeMap(services);
985         data.writeBundle(coreSettings);
986         mRemote.transact(BIND_APPLICATION_TRANSACTION, data, null,
987                 IBinder.FLAG_ONEWAY);
988         data.recycle();
989     }
990 
scheduleExit()991     public final void scheduleExit() throws RemoteException {
992         Parcel data = Parcel.obtain();
993         data.writeInterfaceToken(IApplicationThread.descriptor);
994         mRemote.transact(SCHEDULE_EXIT_TRANSACTION, data, null,
995                 IBinder.FLAG_ONEWAY);
996         data.recycle();
997     }
998 
scheduleSuicide()999     public final void scheduleSuicide() throws RemoteException {
1000         Parcel data = Parcel.obtain();
1001         data.writeInterfaceToken(IApplicationThread.descriptor);
1002         mRemote.transact(SCHEDULE_SUICIDE_TRANSACTION, data, null,
1003                 IBinder.FLAG_ONEWAY);
1004         data.recycle();
1005     }
1006 
scheduleConfigurationChanged(Configuration config)1007     public final void scheduleConfigurationChanged(Configuration config)
1008             throws RemoteException {
1009         Parcel data = Parcel.obtain();
1010         data.writeInterfaceToken(IApplicationThread.descriptor);
1011         config.writeToParcel(data, 0);
1012         mRemote.transact(SCHEDULE_CONFIGURATION_CHANGED_TRANSACTION, data, null,
1013                 IBinder.FLAG_ONEWAY);
1014         data.recycle();
1015     }
1016 
updateTimeZone()1017     public void updateTimeZone() throws RemoteException {
1018         Parcel data = Parcel.obtain();
1019         data.writeInterfaceToken(IApplicationThread.descriptor);
1020         mRemote.transact(UPDATE_TIME_ZONE_TRANSACTION, data, null,
1021                 IBinder.FLAG_ONEWAY);
1022         data.recycle();
1023     }
1024 
clearDnsCache()1025     public void clearDnsCache() throws RemoteException {
1026         Parcel data = Parcel.obtain();
1027         data.writeInterfaceToken(IApplicationThread.descriptor);
1028         mRemote.transact(CLEAR_DNS_CACHE_TRANSACTION, data, null,
1029                 IBinder.FLAG_ONEWAY);
1030         data.recycle();
1031     }
1032 
setHttpProxy(String proxy, String port, String exclList, Uri pacFileUrl)1033     public void setHttpProxy(String proxy, String port, String exclList,
1034             Uri pacFileUrl) throws RemoteException {
1035         Parcel data = Parcel.obtain();
1036         data.writeInterfaceToken(IApplicationThread.descriptor);
1037         data.writeString(proxy);
1038         data.writeString(port);
1039         data.writeString(exclList);
1040         pacFileUrl.writeToParcel(data, 0);
1041         mRemote.transact(SET_HTTP_PROXY_TRANSACTION, data, null, IBinder.FLAG_ONEWAY);
1042         data.recycle();
1043     }
1044 
processInBackground()1045     public void processInBackground() throws RemoteException {
1046         Parcel data = Parcel.obtain();
1047         data.writeInterfaceToken(IApplicationThread.descriptor);
1048         mRemote.transact(PROCESS_IN_BACKGROUND_TRANSACTION, data, null,
1049                 IBinder.FLAG_ONEWAY);
1050         data.recycle();
1051     }
1052 
dumpService(FileDescriptor fd, IBinder token, String[] args)1053     public void dumpService(FileDescriptor fd, IBinder token, String[] args)
1054             throws RemoteException {
1055         Parcel data = Parcel.obtain();
1056         data.writeInterfaceToken(IApplicationThread.descriptor);
1057         data.writeFileDescriptor(fd);
1058         data.writeStrongBinder(token);
1059         data.writeStringArray(args);
1060         mRemote.transact(DUMP_SERVICE_TRANSACTION, data, null, IBinder.FLAG_ONEWAY);
1061         data.recycle();
1062     }
1063 
dumpProvider(FileDescriptor fd, IBinder token, String[] args)1064     public void dumpProvider(FileDescriptor fd, IBinder token, String[] args)
1065             throws RemoteException {
1066         Parcel data = Parcel.obtain();
1067         data.writeInterfaceToken(IApplicationThread.descriptor);
1068         data.writeFileDescriptor(fd);
1069         data.writeStrongBinder(token);
1070         data.writeStringArray(args);
1071         mRemote.transact(DUMP_PROVIDER_TRANSACTION, data, null, IBinder.FLAG_ONEWAY);
1072         data.recycle();
1073     }
1074 
scheduleRegisteredReceiver(IIntentReceiver receiver, Intent intent, int resultCode, String dataStr, Bundle extras, boolean ordered, boolean sticky, int sendingUser, int processState)1075     public void scheduleRegisteredReceiver(IIntentReceiver receiver, Intent intent,
1076             int resultCode, String dataStr, Bundle extras, boolean ordered,
1077             boolean sticky, int sendingUser, int processState) throws RemoteException {
1078         Parcel data = Parcel.obtain();
1079         data.writeInterfaceToken(IApplicationThread.descriptor);
1080         data.writeStrongBinder(receiver.asBinder());
1081         intent.writeToParcel(data, 0);
1082         data.writeInt(resultCode);
1083         data.writeString(dataStr);
1084         data.writeBundle(extras);
1085         data.writeInt(ordered ? 1 : 0);
1086         data.writeInt(sticky ? 1 : 0);
1087         data.writeInt(sendingUser);
1088         data.writeInt(processState);
1089         mRemote.transact(SCHEDULE_REGISTERED_RECEIVER_TRANSACTION, data, null,
1090                 IBinder.FLAG_ONEWAY);
1091         data.recycle();
1092     }
1093 
scheduleLowMemory()1094     public final void scheduleLowMemory() throws RemoteException {
1095         Parcel data = Parcel.obtain();
1096         data.writeInterfaceToken(IApplicationThread.descriptor);
1097         mRemote.transact(SCHEDULE_LOW_MEMORY_TRANSACTION, data, null,
1098                 IBinder.FLAG_ONEWAY);
1099         data.recycle();
1100     }
1101 
scheduleActivityConfigurationChanged( IBinder token)1102     public final void scheduleActivityConfigurationChanged(
1103             IBinder token) throws RemoteException {
1104         Parcel data = Parcel.obtain();
1105         data.writeInterfaceToken(IApplicationThread.descriptor);
1106         data.writeStrongBinder(token);
1107         mRemote.transact(SCHEDULE_ACTIVITY_CONFIGURATION_CHANGED_TRANSACTION, data, null,
1108                 IBinder.FLAG_ONEWAY);
1109         data.recycle();
1110     }
1111 
profilerControl(boolean start, ProfilerInfo profilerInfo, int profileType)1112     public void profilerControl(boolean start, ProfilerInfo profilerInfo, int profileType)
1113             throws RemoteException {
1114         Parcel data = Parcel.obtain();
1115         data.writeInterfaceToken(IApplicationThread.descriptor);
1116         data.writeInt(start ? 1 : 0);
1117         data.writeInt(profileType);
1118         if (profilerInfo != null) {
1119             data.writeInt(1);
1120             profilerInfo.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
1121         } else {
1122             data.writeInt(0);
1123         }
1124         mRemote.transact(PROFILER_CONTROL_TRANSACTION, data, null,
1125                 IBinder.FLAG_ONEWAY);
1126         data.recycle();
1127     }
1128 
setSchedulingGroup(int group)1129     public void setSchedulingGroup(int group) throws RemoteException {
1130         Parcel data = Parcel.obtain();
1131         data.writeInterfaceToken(IApplicationThread.descriptor);
1132         data.writeInt(group);
1133         mRemote.transact(SET_SCHEDULING_GROUP_TRANSACTION, data, null,
1134                 IBinder.FLAG_ONEWAY);
1135         data.recycle();
1136     }
1137 
dispatchPackageBroadcast(int cmd, String[] packages)1138     public void dispatchPackageBroadcast(int cmd, String[] packages) throws RemoteException {
1139         Parcel data = Parcel.obtain();
1140         data.writeInterfaceToken(IApplicationThread.descriptor);
1141         data.writeInt(cmd);
1142         data.writeStringArray(packages);
1143         mRemote.transact(DISPATCH_PACKAGE_BROADCAST_TRANSACTION, data, null,
1144                 IBinder.FLAG_ONEWAY);
1145         data.recycle();
1146     }
1147 
scheduleCrash(String msg)1148     public void scheduleCrash(String msg) throws RemoteException {
1149         Parcel data = Parcel.obtain();
1150         data.writeInterfaceToken(IApplicationThread.descriptor);
1151         data.writeString(msg);
1152         mRemote.transact(SCHEDULE_CRASH_TRANSACTION, data, null,
1153                 IBinder.FLAG_ONEWAY);
1154         data.recycle();
1155     }
1156 
dumpHeap(boolean managed, String path, ParcelFileDescriptor fd)1157     public void dumpHeap(boolean managed, String path,
1158             ParcelFileDescriptor fd) throws RemoteException {
1159         Parcel data = Parcel.obtain();
1160         data.writeInterfaceToken(IApplicationThread.descriptor);
1161         data.writeInt(managed ? 1 : 0);
1162         data.writeString(path);
1163         if (fd != null) {
1164             data.writeInt(1);
1165             fd.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
1166         } else {
1167             data.writeInt(0);
1168         }
1169         mRemote.transact(DUMP_HEAP_TRANSACTION, data, null,
1170                 IBinder.FLAG_ONEWAY);
1171         data.recycle();
1172     }
1173 
dumpActivity(FileDescriptor fd, IBinder token, String prefix, String[] args)1174     public void dumpActivity(FileDescriptor fd, IBinder token, String prefix, String[] args)
1175             throws RemoteException {
1176         Parcel data = Parcel.obtain();
1177         data.writeInterfaceToken(IApplicationThread.descriptor);
1178         data.writeFileDescriptor(fd);
1179         data.writeStrongBinder(token);
1180         data.writeString(prefix);
1181         data.writeStringArray(args);
1182         mRemote.transact(DUMP_ACTIVITY_TRANSACTION, data, null, IBinder.FLAG_ONEWAY);
1183         data.recycle();
1184     }
1185 
setCoreSettings(Bundle coreSettings)1186     public void setCoreSettings(Bundle coreSettings) throws RemoteException {
1187         Parcel data = Parcel.obtain();
1188         data.writeInterfaceToken(IApplicationThread.descriptor);
1189         data.writeBundle(coreSettings);
1190         mRemote.transact(SET_CORE_SETTINGS_TRANSACTION, data, null, IBinder.FLAG_ONEWAY);
1191     }
1192 
updatePackageCompatibilityInfo(String pkg, CompatibilityInfo info)1193     public void updatePackageCompatibilityInfo(String pkg, CompatibilityInfo info)
1194             throws RemoteException {
1195         Parcel data = Parcel.obtain();
1196         data.writeInterfaceToken(IApplicationThread.descriptor);
1197         data.writeString(pkg);
1198         info.writeToParcel(data, 0);
1199         mRemote.transact(UPDATE_PACKAGE_COMPATIBILITY_INFO_TRANSACTION, data, null,
1200                 IBinder.FLAG_ONEWAY);
1201     }
1202 
scheduleTrimMemory(int level)1203     public void scheduleTrimMemory(int level) throws RemoteException {
1204         Parcel data = Parcel.obtain();
1205         data.writeInterfaceToken(IApplicationThread.descriptor);
1206         data.writeInt(level);
1207         mRemote.transact(SCHEDULE_TRIM_MEMORY_TRANSACTION, data, null,
1208                 IBinder.FLAG_ONEWAY);
1209         data.recycle();
1210     }
1211 
dumpMemInfo(FileDescriptor fd, Debug.MemoryInfo mem, boolean checkin, boolean dumpInfo, boolean dumpDalvik, String[] args)1212     public void dumpMemInfo(FileDescriptor fd, Debug.MemoryInfo mem, boolean checkin,
1213             boolean dumpInfo, boolean dumpDalvik, String[] args) throws RemoteException {
1214         Parcel data = Parcel.obtain();
1215         Parcel reply = Parcel.obtain();
1216         data.writeInterfaceToken(IApplicationThread.descriptor);
1217         data.writeFileDescriptor(fd);
1218         mem.writeToParcel(data, 0);
1219         data.writeInt(checkin ? 1 : 0);
1220         data.writeInt(dumpInfo ? 1 : 0);
1221         data.writeInt(dumpDalvik ? 1 : 0);
1222         data.writeStringArray(args);
1223         mRemote.transact(DUMP_MEM_INFO_TRANSACTION, data, reply, 0);
1224         reply.readException();
1225         data.recycle();
1226         reply.recycle();
1227     }
1228 
dumpGfxInfo(FileDescriptor fd, String[] args)1229     public void dumpGfxInfo(FileDescriptor fd, String[] args) throws RemoteException {
1230         Parcel data = Parcel.obtain();
1231         data.writeInterfaceToken(IApplicationThread.descriptor);
1232         data.writeFileDescriptor(fd);
1233         data.writeStringArray(args);
1234         mRemote.transact(DUMP_GFX_INFO_TRANSACTION, data, null, IBinder.FLAG_ONEWAY);
1235         data.recycle();
1236     }
1237 
dumpDbInfo(FileDescriptor fd, String[] args)1238     public void dumpDbInfo(FileDescriptor fd, String[] args) throws RemoteException {
1239         Parcel data = Parcel.obtain();
1240         data.writeInterfaceToken(IApplicationThread.descriptor);
1241         data.writeFileDescriptor(fd);
1242         data.writeStringArray(args);
1243         mRemote.transact(DUMP_DB_INFO_TRANSACTION, data, null, IBinder.FLAG_ONEWAY);
1244         data.recycle();
1245     }
1246 
1247     @Override
unstableProviderDied(IBinder provider)1248     public void unstableProviderDied(IBinder provider) throws RemoteException {
1249         Parcel data = Parcel.obtain();
1250         data.writeInterfaceToken(IApplicationThread.descriptor);
1251         data.writeStrongBinder(provider);
1252         mRemote.transact(UNSTABLE_PROVIDER_DIED_TRANSACTION, data, null, IBinder.FLAG_ONEWAY);
1253         data.recycle();
1254     }
1255 
1256     @Override
requestAssistContextExtras(IBinder activityToken, IBinder requestToken, int requestType)1257     public void requestAssistContextExtras(IBinder activityToken, IBinder requestToken,
1258             int requestType) throws RemoteException {
1259         Parcel data = Parcel.obtain();
1260         data.writeInterfaceToken(IApplicationThread.descriptor);
1261         data.writeStrongBinder(activityToken);
1262         data.writeStrongBinder(requestToken);
1263         data.writeInt(requestType);
1264         mRemote.transact(REQUEST_ASSIST_CONTEXT_EXTRAS_TRANSACTION, data, null,
1265                 IBinder.FLAG_ONEWAY);
1266         data.recycle();
1267     }
1268 
1269     @Override
scheduleTranslucentConversionComplete(IBinder token, boolean timeout)1270     public void scheduleTranslucentConversionComplete(IBinder token, boolean timeout)
1271             throws RemoteException {
1272         Parcel data = Parcel.obtain();
1273         data.writeInterfaceToken(IApplicationThread.descriptor);
1274         data.writeStrongBinder(token);
1275         data.writeInt(timeout ? 1 : 0);
1276         mRemote.transact(SCHEDULE_TRANSLUCENT_CONVERSION_COMPLETE_TRANSACTION, data, null,
1277                 IBinder.FLAG_ONEWAY);
1278         data.recycle();
1279     }
1280 
1281     @Override
scheduleOnNewActivityOptions(IBinder token, ActivityOptions options)1282     public void scheduleOnNewActivityOptions(IBinder token, ActivityOptions options)
1283             throws RemoteException {
1284         Parcel data = Parcel.obtain();
1285         data.writeInterfaceToken(IApplicationThread.descriptor);
1286         data.writeStrongBinder(token);
1287         data.writeBundle(options == null ? null : options.toBundle());
1288         mRemote.transact(SCHEDULE_ON_NEW_ACTIVITY_OPTIONS_TRANSACTION, data, null,
1289                 IBinder.FLAG_ONEWAY);
1290         data.recycle();
1291     }
1292 
1293     @Override
setProcessState(int state)1294     public void setProcessState(int state) throws RemoteException {
1295         Parcel data = Parcel.obtain();
1296         data.writeInterfaceToken(IApplicationThread.descriptor);
1297         data.writeInt(state);
1298         mRemote.transact(SET_PROCESS_STATE_TRANSACTION, data, null, IBinder.FLAG_ONEWAY);
1299         data.recycle();
1300     }
1301 
1302     @Override
scheduleInstallProvider(ProviderInfo provider)1303     public void scheduleInstallProvider(ProviderInfo provider) throws RemoteException {
1304         Parcel data = Parcel.obtain();
1305         data.writeInterfaceToken(IApplicationThread.descriptor);
1306         provider.writeToParcel(data, 0);
1307         mRemote.transact(SCHEDULE_INSTALL_PROVIDER_TRANSACTION, data, null, IBinder.FLAG_ONEWAY);
1308         data.recycle();
1309     }
1310 
1311     @Override
updateTimePrefs(boolean is24Hour)1312     public void updateTimePrefs(boolean is24Hour) throws RemoteException {
1313         Parcel data = Parcel.obtain();
1314         data.writeInterfaceToken(IApplicationThread.descriptor);
1315         data.writeByte(is24Hour ? (byte) 1 : (byte) 0);
1316         mRemote.transact(UPDATE_TIME_PREFS_TRANSACTION, data, null, IBinder.FLAG_ONEWAY);
1317         data.recycle();
1318     }
1319 
1320     @Override
scheduleCancelVisibleBehind(IBinder token)1321     public void scheduleCancelVisibleBehind(IBinder token) throws RemoteException {
1322         Parcel data = Parcel.obtain();
1323         data.writeInterfaceToken(IApplicationThread.descriptor);
1324         data.writeStrongBinder(token);
1325         mRemote.transact(CANCEL_VISIBLE_BEHIND_TRANSACTION, data, null, IBinder.FLAG_ONEWAY);
1326         data.recycle();
1327     }
1328 
1329     @Override
scheduleBackgroundVisibleBehindChanged(IBinder token, boolean enabled)1330     public void scheduleBackgroundVisibleBehindChanged(IBinder token, boolean enabled)
1331             throws RemoteException {
1332         Parcel data = Parcel.obtain();
1333         data.writeInterfaceToken(IApplicationThread.descriptor);
1334         data.writeStrongBinder(token);
1335         data.writeInt(enabled ? 1 : 0);
1336         mRemote.transact(BACKGROUND_VISIBLE_BEHIND_CHANGED_TRANSACTION, data, null,
1337                 IBinder.FLAG_ONEWAY);
1338         data.recycle();
1339     }
1340 
1341     @Override
scheduleEnterAnimationComplete(IBinder token)1342     public void scheduleEnterAnimationComplete(IBinder token) throws RemoteException {
1343         Parcel data = Parcel.obtain();
1344         data.writeInterfaceToken(IApplicationThread.descriptor);
1345         data.writeStrongBinder(token);
1346         mRemote.transact(ENTER_ANIMATION_COMPLETE_TRANSACTION, data, null, IBinder.FLAG_ONEWAY);
1347         data.recycle();
1348     }
1349 }
1350