1 /*
2  * Copyright (C) 2012 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.contacts.util;
18 
19 import android.view.View;
20 import android.view.ViewTreeObserver.OnGlobalLayoutListener;
21 import android.view.ViewTreeObserver.OnPreDrawListener;
22 
23 /** Static methods that are useful for scheduling actions to occur at a later time. */
24 public class SchedulingUtils {
25 
26 
27     /** Runs a piece of code after the next layout run */
doAfterLayout(final View view, final Runnable runnable)28     public static void doAfterLayout(final View view, final Runnable runnable) {
29         final OnGlobalLayoutListener listener = new OnGlobalLayoutListener() {
30             @Override
31             public void onGlobalLayout() {
32                 // Layout pass done, unregister for further events
33                 view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
34                 runnable.run();
35             }
36         };
37         view.getViewTreeObserver().addOnGlobalLayoutListener(listener);
38     }
39 
40     /** Runs a piece of code just before the next draw, after layout and measurement */
doOnPreDraw(final View view, final boolean drawNextFrame, final Runnable runnable)41     public static void doOnPreDraw(final View view, final boolean drawNextFrame,
42             final Runnable runnable) {
43         final OnPreDrawListener listener = new OnPreDrawListener() {
44             @Override
45             public boolean onPreDraw() {
46                 view.getViewTreeObserver().removeOnPreDrawListener(this);
47                 runnable.run();
48                 return drawNextFrame;
49             }
50         };
51         view.getViewTreeObserver().addOnPreDrawListener(listener);
52     }
53 }
54