• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2012 Google Inc.
3  * Licensed to The Android Open Source Project.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 package com.android.mail.ui;
19 
20 import android.app.Activity;
21 import android.app.FragmentTransaction;
22 import android.os.Handler;
23 
24 import com.android.mail.utils.LogTag;
25 import com.android.mail.utils.LogUtils;
26 
27 import java.util.concurrent.atomic.AtomicInteger;
28 
29 /**
30  * A thin wrapper of {@link Handler} to run a callback in UI thread. Any callback posted to this
31  * handler is guarantee to run inside {@link Activity} life cycle. However, it can be dropped if the
32  * {@link Activity} has been stopped. This handler is safe to use with {@link FragmentTransaction}.
33  *
34  * @author phamm
35  */
36 public class UiHandler {
37     private final Handler mHandler = new Handler();
38     private boolean mEnabled = true;
39     private final static String LOG_TAG = LogTag.getLogTag();
40 
41     /** Number of {@link Runnable} in the queue. */
42     private AtomicInteger mCount = new AtomicInteger(0);
43 
post(final Runnable r)44     public void post(final Runnable r) {
45         if (mEnabled) {
46             mCount.incrementAndGet();
47             mHandler.post(new Runnable() {
48                 @Override
49                 public void run() {
50                     mCount.decrementAndGet();
51                     r.run();
52                 }
53             });
54         } else {
55             LogUtils.d(LOG_TAG, "UiHandler is disabled in post(). Dropping Runnable.");
56         }
57     }
58 
postDelayed(final Runnable r, long delayMillis)59     public void postDelayed(final Runnable r, long delayMillis) {
60         if (mEnabled) {
61             mCount.incrementAndGet();
62             mHandler.postDelayed(new Runnable() {
63                 @Override
64                 public void run() {
65                     mCount.decrementAndGet();
66                     r.run();
67                 }
68             }, delayMillis);
69         } else {
70             LogUtils.d(LOG_TAG, "UiHandler is disabled in postDelayed(). Dropping Runnable.");
71         }
72     }
73 
removeCallbacks(Runnable r)74     public void removeCallbacks(Runnable r) {
75         mHandler.removeCallbacks(r);
76     }
77 
setEnabled(boolean enabled)78     public void setEnabled(boolean enabled) {
79         mEnabled = enabled;
80         if (!mEnabled) {
81             int count = mCount.getAndSet(0);
82             if (count > 0) {
83                 LogUtils.e(LOG_TAG, "Disable UiHandler. Dropping %d Runnables.", count);
84             }
85             mHandler.removeCallbacksAndMessages(null);
86         }
87     }
88 
89     /**
90      * @return whether the {@link UiHandler} is enabled. It's safe to edit UI if the
91      *         {@link UiHandler} is enabled.
92      */
isEnabled()93     public boolean isEnabled() {
94         return mEnabled;
95     }
96 }