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; 214b0e604090993e88c8206637e5fe26c7b618bfc6Diego Perezimport com.android.tools.layoutlib.java.System_Delegate; 22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 2361ccc9198ab09363edbf500d7669dbcfafc5fa28Deepanshu Guptaimport java.lang.reflect.Field; 247c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Guptaimport java.util.concurrent.atomic.AtomicReference; 257c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta 26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/** 27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Delegate used to provide new implementation of a select few methods of {@link Choreographer} 28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Through the layoutlib_create tool, the original methods of Choreographer have been 30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * replaced by calls to methods of the same name in this delegate class. 31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipublic class Choreographer_Delegate { 347c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta static final AtomicReference<Choreographer> mInstance = new AtomicReference<Choreographer>(); 357c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta 367c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta @LayoutlibDelegate 377c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta public static Choreographer getInstance() { 387c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta if (mInstance.get() == null) { 397c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta mInstance.compareAndSet(null, Choreographer.getInstance_Original()); 407c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta } 417c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta 427c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta return mInstance.get(); 437c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta } 44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @LayoutlibDelegate 46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public static float getRefreshRate() { 47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return 60.f; 48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 497c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta 507c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta @LayoutlibDelegate 517c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta static void scheduleVsyncLocked(Choreographer thisChoreographer) { 527c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta // do nothing 537c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta } 547c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta 557c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta public static void doFrame(long frameTimeNanos) { 567c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta Choreographer thisChoreographer = Choreographer.getInstance(); 577c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta 584b0e604090993e88c8206637e5fe26c7b618bfc6Diego Perez thisChoreographer.mLastFrameTimeNanos = frameTimeNanos - thisChoreographer 594b0e604090993e88c8206637e5fe26c7b618bfc6Diego Perez .getFrameIntervalNanos(); 607c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta thisChoreographer.mFrameInfo.markInputHandlingStart(); 617c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta thisChoreographer.doCallbacks(Choreographer.CALLBACK_INPUT, frameTimeNanos); 627c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta 637c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta thisChoreographer.mFrameInfo.markAnimationsStart(); 647c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta thisChoreographer.doCallbacks(Choreographer.CALLBACK_ANIMATION, frameTimeNanos); 657c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta 667c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta thisChoreographer.mFrameInfo.markPerformTraversalsStart(); 677c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta thisChoreographer.doCallbacks(Choreographer.CALLBACK_TRAVERSAL, frameTimeNanos); 687c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta 697c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta thisChoreographer.doCallbacks(Choreographer.CALLBACK_COMMIT, frameTimeNanos); 707c4420bd04f8f56f6044f88e34616d8c5d96c7e9Deepanshu Gupta } 7161ccc9198ab09363edbf500d7669dbcfafc5fa28Deepanshu Gupta 7261ccc9198ab09363edbf500d7669dbcfafc5fa28Deepanshu Gupta public static void dispose() { 7361ccc9198ab09363edbf500d7669dbcfafc5fa28Deepanshu Gupta try { 7461ccc9198ab09363edbf500d7669dbcfafc5fa28Deepanshu Gupta Field threadInstanceField = Choreographer.class.getDeclaredField("sThreadInstance"); 7542c8bd1b4aba37bd302eb96f55c536d9e51762edDeepanshu Gupta threadInstanceField.setAccessible(true); 7661ccc9198ab09363edbf500d7669dbcfafc5fa28Deepanshu Gupta @SuppressWarnings("unchecked") ThreadLocal<Choreographer> threadInstance = 7761ccc9198ab09363edbf500d7669dbcfafc5fa28Deepanshu Gupta (ThreadLocal<Choreographer>) threadInstanceField.get(null); 7861ccc9198ab09363edbf500d7669dbcfafc5fa28Deepanshu Gupta threadInstance.remove(); 7961ccc9198ab09363edbf500d7669dbcfafc5fa28Deepanshu Gupta } catch (ReflectiveOperationException e) { 8061ccc9198ab09363edbf500d7669dbcfafc5fa28Deepanshu Gupta assert false; 8161ccc9198ab09363edbf500d7669dbcfafc5fa28Deepanshu Gupta Bridge.getLog().error(LayoutLog.TAG_BROKEN, 8261ccc9198ab09363edbf500d7669dbcfafc5fa28Deepanshu Gupta "Unable to clear Choreographer memory.", e, null); 8361ccc9198ab09363edbf500d7669dbcfafc5fa28Deepanshu Gupta } 8461ccc9198ab09363edbf500d7669dbcfafc5fa28Deepanshu Gupta } 85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} 86