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