1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.camera.async;
18 
19 import static com.google.common.base.Preconditions.checkState;
20 
21 import android.os.Handler;
22 import android.os.Looper;
23 
24 import com.google.common.annotations.VisibleForTesting;
25 
26 import javax.annotation.Nonnull;
27 
28 public class MainThread extends HandlerExecutor {
MainThread(Handler handler)29     private MainThread(Handler handler) {
30         super(handler);
31     }
32 
create()33     public static MainThread create() {
34         return new MainThread(new Handler(Looper.getMainLooper()));
35     }
36 
37     /**
38      * Caches whether or not the current thread is the main thread.
39      */
40     private static final ThreadLocal<Boolean> sIsMainThread = new ThreadLocal<Boolean>() {
41         @Override
42         protected Boolean initialValue() {
43             return Looper.getMainLooper().getThread() == Thread.currentThread();
44         }
45     };
46 
47     /**
48      * Asserts that the current thread is the main thread.
49      */
checkMainThread()50     public static void checkMainThread() {
51         checkState(sIsMainThread.get(), "Not main thread.");
52     }
53 
54     /**
55      * Returns true if the method is run on the main android thread.
56      */
isMainThread()57     public static boolean isMainThread() {
58         return sIsMainThread.get();
59     }
60 
61     /**
62      * Returns a fake MainThreadExecutor which executes immediately.
63      */
64     @VisibleForTesting
createFakeForTesting()65     public static MainThread createFakeForTesting() {
66         return new MainThread(null) {
67             @Override
68             public void execute(@Nonnull Runnable runnable) {
69                 //
70                 sIsMainThread.set(true);
71                 try {
72                     runnable.run();
73                 } finally {
74                     sIsMainThread.set(false);
75                 }
76             }
77         };
78     }
79 }
80