1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/* 2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Copyright (C) 2012 The Android Open Source Project 3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * you may not use this file except in compliance with the License. 6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * You may obtain a copy of the License at 7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Unless required by applicable law or agreed to in writing, software 11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * See the License for the specific language governing permissions and 14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * limitations under the License. 15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipackage android.view; 17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 1861ccc9198ab09363edbf500d7669dbcfafc5fa28Deepanshu Guptaimport com.android.ide.common.rendering.api.LayoutLog; 1961ccc9198ab09363edbf500d7669dbcfafc5fa28Deepanshu Guptaimport com.android.layoutlib.bridge.Bridge; 20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.tools.layoutlib.annotations.LayoutlibDelegate; 21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 2261ccc9198ab09363edbf500d7669dbcfafc5fa28Deepanshu Guptaimport java.lang.reflect.Field; 237c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Guptaimport java.util.concurrent.atomic.AtomicReference; 247c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta 25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/** 26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Delegate used to provide new implementation of a select few methods of {@link Choreographer} 27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Through the layoutlib_create tool, the original methods of Choreographer have been 29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * replaced by calls to methods of the same name in this delegate class. 30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipublic class Choreographer_Delegate { 337c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta static final AtomicReference<Choreographer> mInstance = new AtomicReference<Choreographer>(); 347c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta 357c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta @LayoutlibDelegate 367c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta public static Choreographer getInstance() { 377c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta if (mInstance.get() == null) { 387c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta mInstance.compareAndSet(null, Choreographer.getInstance_Original()); 397c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta } 407c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta 417c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta return mInstance.get(); 427c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta } 43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @LayoutlibDelegate 45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public static float getRefreshRate() { 46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return 60.f; 47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 487c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta 497c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta @LayoutlibDelegate 507c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta static void scheduleVsyncLocked(Choreographer thisChoreographer) { 517c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta // do nothing 527c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta } 537c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta 547c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta public static void doFrame(long frameTimeNanos) { 557c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta Choreographer thisChoreographer = Choreographer.getInstance(); 567c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta 577c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta thisChoreographer.mLastFrameTimeNanos = frameTimeNanos; 587c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta 597c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta thisChoreographer.mFrameInfo.markInputHandlingStart(); 607c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta thisChoreographer.doCallbacks(Choreographer.CALLBACK_INPUT, frameTimeNanos); 617c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta 627c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta thisChoreographer.mFrameInfo.markAnimationsStart(); 637c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta thisChoreographer.doCallbacks(Choreographer.CALLBACK_ANIMATION, frameTimeNanos); 647c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta 657c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta thisChoreographer.mFrameInfo.markPerformTraversalsStart(); 667c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta thisChoreographer.doCallbacks(Choreographer.CALLBACK_TRAVERSAL, frameTimeNanos); 677c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta 687c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta thisChoreographer.doCallbacks(Choreographer.CALLBACK_COMMIT, frameTimeNanos); 697c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta } 7061ccc9198ab09363edbf500d7669dbcfafc5fa28Deepanshu Gupta 7161ccc9198ab09363edbf500d7669dbcfafc5fa28Deepanshu Gupta public static void dispose() { 7261ccc9198ab09363edbf500d7669dbcfafc5fa28Deepanshu Gupta try { 7361ccc9198ab09363edbf500d7669dbcfafc5fa28Deepanshu Gupta Field threadInstanceField = Choreographer.class.getDeclaredField("sThreadInstance"); 7442c8bd1b4aba37bd302eb96f55c536d9e51762edDeepanshu Gupta threadInstanceField.setAccessible(true); 7561ccc9198ab09363edbf500d7669dbcfafc5fa28Deepanshu Gupta @SuppressWarnings("unchecked") ThreadLocal<Choreographer> threadInstance = 7661ccc9198ab09363edbf500d7669dbcfafc5fa28Deepanshu Gupta (ThreadLocal<Choreographer>) threadInstanceField.get(null); 7761ccc9198ab09363edbf500d7669dbcfafc5fa28Deepanshu Gupta threadInstance.remove(); 7861ccc9198ab09363edbf500d7669dbcfafc5fa28Deepanshu Gupta } catch (ReflectiveOperationException e) { 7961ccc9198ab09363edbf500d7669dbcfafc5fa28Deepanshu Gupta assert false; 8061ccc9198ab09363edbf500d7669dbcfafc5fa28Deepanshu Gupta Bridge.getLog().error(LayoutLog.TAG_BROKEN, 8161ccc9198ab09363edbf500d7669dbcfafc5fa28Deepanshu Gupta "Unable to clear Choreographer memory.", e, null); 8261ccc9198ab09363edbf500d7669dbcfafc5fa28Deepanshu Gupta } 8361ccc9198ab09363edbf500d7669dbcfafc5fa28Deepanshu Gupta } 84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} 85