Added in [API level 29](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels) Summary: [Nested Classes](https://developer.android.com/reference/android/view/SurfaceControl#nestedclasses) \| [Constants](https://developer.android.com/reference/android/view/SurfaceControl#constants) \| [Inherited Constants](https://developer.android.com/reference/android/view/SurfaceControl#inhconstants) \| [Fields](https://developer.android.com/reference/android/view/SurfaceControl#lfields) \| [Methods](https://developer.android.com/reference/android/view/SurfaceControl#pubmethods) \| [Protected Methods](https://developer.android.com/reference/android/view/SurfaceControl#promethods) \| [Inherited Methods](https://developer.android.com/reference/android/view/SurfaceControl#inhmethods)

# SurfaceControl

*** ** * ** ***


`
public

final

class
SurfaceControl
`


`

extends https://developer.android.com/reference/java/lang/Object


`

`


implements

https://developer.android.com/reference/android/os/Parcelable


`

|---|---|
| [java.lang.Object](https://developer.android.com/reference/java/lang/Object) ||
| ↳ | android.view.SurfaceControl |

<br />

*** ** * ** ***

Handle to an on-screen Surface managed by the system compositor. The SurfaceControl is
a combination of a buffer source, and metadata about how to display the buffers.
By constructing a `https://developer.android.com/reference/android/view/Surface` from this SurfaceControl you can submit buffers to be
composited. Using `https://developer.android.com/reference/android/view/SurfaceControl.Transaction` you can manipulate various
properties of how the buffer will be displayed on-screen. SurfaceControl's are
arranged into a scene-graph like hierarchy, and as such any SurfaceControl may have
a parent. Geometric properties like transform, crop, and Z-ordering will be inherited
from the parent, as if the child were content in the parents buffer stream.

## Summary

| ### Nested classes ||
|---|---|
| ` class` | `https://developer.android.com/reference/android/view/SurfaceControl.Builder` Builder class for `https://developer.android.com/reference/android/view/SurfaceControl` objects. |
| ` class` | `https://developer.android.com/reference/android/view/SurfaceControl.JankData` Jank information to be fed back via `https://developer.android.com/reference/android/view/SurfaceControl.OnJankDataListener`. |
| ` interface` | `https://developer.android.com/reference/android/view/SurfaceControl.OnJankDataListener` Listener interface to be informed about SurfaceFlinger's jank classification for a specific surface. |
| ` class` | `https://developer.android.com/reference/android/view/SurfaceControl.OnJankDataListenerRegistration` Handle to a registered `https://developer.android.com/`. |
| ` class` | `https://developer.android.com/reference/android/view/SurfaceControl.Transaction` An atomic set of changes to a set of SurfaceControl. |
| ` interface` | `https://developer.android.com/reference/android/view/SurfaceControl.TransactionCommittedListener` Interface to handle request to `https://developer.android.com/reference/android/view/SurfaceControl.Transaction#addTransactionCommittedListener(java.util.concurrent.Executor,%20android.view.SurfaceControl.TransactionCommittedListener)` |
| ` class` | `https://developer.android.com/reference/android/view/SurfaceControl.TransactionStats` Transaction stats given to the listener registered in `https://developer.android.com/reference/android/view/SurfaceControl.Transaction#addTransactionCompletedListener(java.util.concurrent.Executor,%20java.util.function.Consumer<android.view.SurfaceControl.TransactionStats>)` |
| ` class` | `https://developer.android.com/reference/android/view/SurfaceControl.TrustedPresentationThresholds` *This class was deprecated in API level 35. Use `https://developer.android.com/reference/android/window/TrustedPresentationThresholds` instead.* |

| ### Constants ||
|---|---|
| `int` | `https://developer.android.com/reference/android/view/SurfaceControl#BUFFER_TRANSFORM_IDENTITY` Identity transform. |
| `int` | `https://developer.android.com/reference/android/view/SurfaceControl#BUFFER_TRANSFORM_MIRROR_HORIZONTAL` Mirror horizontally. |
| `int` | `https://developer.android.com/reference/android/view/SurfaceControl#BUFFER_TRANSFORM_MIRROR_HORIZONTAL_ROTATE_90` Mirror horizontally and rotate 90 degrees clock-wise. |
| `int` | `https://developer.android.com/reference/android/view/SurfaceControl#BUFFER_TRANSFORM_MIRROR_VERTICAL` Mirror vertically. |
| `int` | `https://developer.android.com/reference/android/view/SurfaceControl#BUFFER_TRANSFORM_MIRROR_VERTICAL_ROTATE_90` Mirror vertically and rotate 90 degrees clock-wise. |
| `int` | `https://developer.android.com/reference/android/view/SurfaceControl#BUFFER_TRANSFORM_ROTATE_180` Rotate 180 degrees clock-wise. |
| `int` | `https://developer.android.com/reference/android/view/SurfaceControl#BUFFER_TRANSFORM_ROTATE_270` Rotate 270 degrees clock-wise. |
| `int` | `https://developer.android.com/reference/android/view/SurfaceControl#BUFFER_TRANSFORM_ROTATE_90` Rotate 90 degrees clock-wise. |

### Inherited constants

From interface `https://developer.android.com/reference/android/os/Parcelable` `int` `https://developer.android.com/reference/android/os/Parcelable#CONTENTS_FILE_DESCRIPTOR`

Descriptor bit used with `https://developer.android.com/reference/android/os/Parcelable#describeContents()`: indicates that
the Parcelable object's flattened representation includes a file descriptor.


`int` `https://developer.android.com/reference/android/os/Parcelable#PARCELABLE_WRITE_RETURN_VALUE`

Flag for use with `https://developer.android.com/reference/android/os/Parcelable#writeToParcel(android.os.Parcel,%20int)`: the object being written
is a return value, that is the result of a function such as
"`Parcelable someFunction()`",
"`void someFunction(out Parcelable)`", or
"`void someFunction(inout Parcelable)`".


| ### Fields ||
|---|---|
| ` public static final https://developer.android.com/reference/android/os/Parcelable.Creator<https://developer.android.com/reference/android/view/SurfaceControl>` | `https://developer.android.com/reference/android/view/SurfaceControl#CREATOR` |

| ### Public methods ||
|---|---|
| ` int` | ` https://developer.android.com/reference/android/view/SurfaceControl#describeContents()() ` Describe the kinds of special objects contained in this Parcelable instance's marshaled representation. |
| ` boolean` | ` https://developer.android.com/reference/android/view/SurfaceControl#isValid()() ` Check whether this instance points to a valid layer with the system-compositor. |
| ` void` | ` https://developer.android.com/reference/android/view/SurfaceControl#readFromParcel(android.os.Parcel)(https://developer.android.com/reference/android/os/Parcel in) ` |
| ` https://developer.android.com/reference/android/view/SurfaceControl.OnJankDataListenerRegistration` | ` https://developer.android.com/reference/android/view/SurfaceControl#registerOnJankDataListener(java.util.concurrent.Executor,%20android.view.SurfaceControl.OnJankDataListener)(https://developer.android.com/reference/java/util/concurrent/Executor executor, https://developer.android.com/reference/android/view/SurfaceControl.OnJankDataListener listener) ` Registers a `https://developer.android.com/reference/android/view/SurfaceControl.OnJankDataListener` to receive jank classification data about rendered frames. |
| ` void` | ` https://developer.android.com/reference/android/view/SurfaceControl#release()() ` Release the local reference to the server-side surface. |
| ` https://developer.android.com/reference/java/lang/String` | ` https://developer.android.com/reference/android/view/SurfaceControl#toString()() ` Returns a string representation of the object. |
| ` void` | ` https://developer.android.com/reference/android/view/SurfaceControl#writeToParcel(android.os.Parcel,%20int)(https://developer.android.com/reference/android/os/Parcel dest, int flags) ` Flatten this object in to a Parcel. |

| ### Protected methods ||
|---|---|
| ` void` | ` https://developer.android.com/reference/android/view/SurfaceControl#finalize()() ` Called by the garbage collector on an object when garbage collection determines that there are no more references to the object. |

### Inherited methods

From class `

https://developer.android.com/reference/java/lang/Object

` `


https://developer.android.com/reference/java/lang/Object` `
https://developer.android.com/reference/java/lang/Object#clone()()
`

Creates and returns a copy of this object.


`


boolean` `
https://developer.android.com/reference/java/lang/Object#equals(java.lang.Object)(https://developer.android.com/reference/java/lang/Object obj)
`

Indicates whether some other object is "equal to" this one.


`


void` `
https://developer.android.com/reference/java/lang/Object#finalize()()
`

Called by the garbage collector on an object when garbage collection
determines that there are no more references to the object.


`


final

https://developer.android.com/reference/java/lang/Class<?>` `
https://developer.android.com/reference/java/lang/Object#getClass()()
`

Returns the runtime class of this `Object`.


`


int` `
https://developer.android.com/reference/java/lang/Object#hashCode()()
`

Returns a hash code value for the object.


`


final

void` `
https://developer.android.com/reference/java/lang/Object#notify()()
`

Wakes up a single thread that is waiting on this object's
monitor.


`


final

void` `
https://developer.android.com/reference/java/lang/Object#notifyAll()()
`

Wakes up all threads that are waiting on this object's monitor.


`


https://developer.android.com/reference/java/lang/String` `
https://developer.android.com/reference/java/lang/Object#toString()()
`

Returns a string representation of the object.


`


final

void` `
https://developer.android.com/reference/java/lang/Object#wait(long,%20int)(long timeoutMillis, int nanos)
`

Causes the current thread to wait until it is awakened, typically
by being *notified* or *interrupted*, or until a
certain amount of real time has elapsed.


`


final

void` `
https://developer.android.com/reference/java/lang/Object#wait(long)(long timeoutMillis)
`

Causes the current thread to wait until it is awakened, typically
by being *notified* or *interrupted*, or until a
certain amount of real time has elapsed.


`


final

void` `
https://developer.android.com/reference/java/lang/Object#wait()()
`

Causes the current thread to wait until it is awakened, typically
by being *notified* or *interrupted*.


From interface `

https://developer.android.com/reference/android/os/Parcelable

` `
abstract


int` `
https://developer.android.com/reference/android/os/Parcelable#describeContents()()
`

Describe the kinds of special objects contained in this Parcelable
instance's marshaled representation.


`
abstract


void` `
https://developer.android.com/reference/android/os/Parcelable#writeToParcel(android.os.Parcel,%20int)(https://developer.android.com/reference/android/os/Parcel dest, int flags)
`

Flatten this object in to a Parcel.


## Constants

### BUFFER_TRANSFORM_IDENTITY

Added in [API level 32](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int BUFFER_TRANSFORM_IDENTITY
```

Identity transform.

These transforms that can be applied to buffers as they are displayed to a window.

<br />

**See also:**

- `https://developer.android.com/reference/android/hardware/HardwareBuffer`

Constant Value:

0
(0x00000000)


### BUFFER_TRANSFORM_MIRROR_HORIZONTAL

Added in [API level 32](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int BUFFER_TRANSFORM_MIRROR_HORIZONTAL
```

Mirror horizontally. Can be combined with `https://developer.android.com/reference/android/view/SurfaceControl#BUFFER_TRANSFORM_MIRROR_VERTICAL`
and `https://developer.android.com/reference/android/view/SurfaceControl#BUFFER_TRANSFORM_ROTATE_90`.

<br />

Constant Value:

1
(0x00000001)


### BUFFER_TRANSFORM_MIRROR_HORIZONTAL_ROTATE_90

Added in [API level 37](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int BUFFER_TRANSFORM_MIRROR_HORIZONTAL_ROTATE_90
```

Mirror horizontally and rotate 90 degrees clock-wise.
Equivalent to (`https://developer.android.com/reference/android/view/SurfaceControl#BUFFER_TRANSFORM_MIRROR_HORIZONTAL` \|
`https://developer.android.com/reference/android/view/SurfaceControl#BUFFER_TRANSFORM_ROTATE_90`).

<br />

Constant Value:

5
(0x00000005)


### BUFFER_TRANSFORM_MIRROR_VERTICAL

Added in [API level 32](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int BUFFER_TRANSFORM_MIRROR_VERTICAL
```

Mirror vertically. Can be combined with `https://developer.android.com/reference/android/view/SurfaceControl#BUFFER_TRANSFORM_MIRROR_HORIZONTAL`
and `https://developer.android.com/reference/android/view/SurfaceControl#BUFFER_TRANSFORM_ROTATE_90`.

<br />

Constant Value:

2
(0x00000002)


### BUFFER_TRANSFORM_MIRROR_VERTICAL_ROTATE_90

Added in [API level 37](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int BUFFER_TRANSFORM_MIRROR_VERTICAL_ROTATE_90
```

Mirror vertically and rotate 90 degrees clock-wise.
Equivalent to (`https://developer.android.com/reference/android/view/SurfaceControl#BUFFER_TRANSFORM_MIRROR_VERTICAL` \|
`https://developer.android.com/reference/android/view/SurfaceControl#BUFFER_TRANSFORM_ROTATE_90`).

<br />

Constant Value:

6
(0x00000006)


### BUFFER_TRANSFORM_ROTATE_180

Added in [API level 32](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int BUFFER_TRANSFORM_ROTATE_180
```

Rotate 180 degrees clock-wise. Cannot be combined with other transforms.
Equivalent to (`https://developer.android.com/reference/android/view/SurfaceControl#BUFFER_TRANSFORM_MIRROR_HORIZONTAL` \|
`https://developer.android.com/reference/android/view/SurfaceControl#BUFFER_TRANSFORM_MIRROR_VERTICAL`).

<br />

Constant Value:

3
(0x00000003)


### BUFFER_TRANSFORM_ROTATE_270

Added in [API level 32](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int BUFFER_TRANSFORM_ROTATE_270
```

Rotate 270 degrees clock-wise. Cannot be combined with other transforms.
Equivalent to (`https://developer.android.com/reference/android/view/SurfaceControl#BUFFER_TRANSFORM_ROTATE_180` \| `https://developer.android.com/reference/android/view/SurfaceControl#BUFFER_TRANSFORM_ROTATE_90`).

<br />

Constant Value:

7
(0x00000007)


### BUFFER_TRANSFORM_ROTATE_90

Added in [API level 32](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int BUFFER_TRANSFORM_ROTATE_90
```

Rotate 90 degrees clock-wise. Can be combined with `https://developer.android.com/reference/android/view/SurfaceControl#BUFFER_TRANSFORM_MIRROR_HORIZONTAL` and `https://developer.android.com/reference/android/view/SurfaceControl#BUFFER_TRANSFORM_MIRROR_VERTICAL`.

<br />

Constant Value:

4
(0x00000004)


## Fields

### CREATOR

Added in [API level 29](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final Creator<SurfaceControl> CREATOR
```

<br />

<br />

## Public methods

### describeContents

Added in [API level 29](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int describeContents ()
```

Describe the kinds of special objects contained in this Parcelable
instance's marshaled representation. For example, if the object will
include a file descriptor in the output of `https://developer.android.com/reference/android/os/Parcelable#writeToParcel(android.os.Parcel,%20int)`,
the return value of this method must include the
`https://developer.android.com/reference/android/os/Parcelable#CONTENTS_FILE_DESCRIPTOR` bit.

<br />

| Returns ||
|---|---|
| `int` | a bitmask indicating the set of special object types marshaled by this Parcelable object instance. Value is either `0` or - `https://developer.android.com/reference/android/os/Parcelable#CONTENTS_FILE_DESCRIPTOR` |

### isValid

Added in [API level 29](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public boolean isValid ()
```

Check whether this instance points to a valid layer with the system-compositor. For
example this may be false if construction failed, or the layer was released
(`https://developer.android.com/reference/android/view/SurfaceControl#release()`).

<br />

| Returns ||
|---|---|
| `boolean` | Whether this SurfaceControl is valid. <br /> |

### readFromParcel

Added in [API level 29](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void readFromParcel (Parcel in)
```

<br />

<br />

| Parameters ||
|---|---|
| `in` | `Parcel` <br /> |

### registerOnJankDataListener

Added in [version 37.2](https://developer.android.com/topic/libraries/support-library/revisions)

```
public SurfaceControl.OnJankDataListenerRegistration registerOnJankDataListener (Executor executor, 
                SurfaceControl.OnJankDataListener listener)
```

Registers a `https://developer.android.com/reference/android/view/SurfaceControl.OnJankDataListener` to receive jank classification data
about rendered frames.


Use `https://developer.android.com/reference/android/view/SurfaceControl.OnJankDataListenerRegistration#removeAfter(long)` to unregister the
listener.

<br />

| Parameters ||
|---|---|
| `executor` | `Executor`: The executor on which the listener will be invoked. This value cannot be `null`. Callback and listener events are dispatched through this `https://developer.android.com/reference/java/util/concurrent/Executor`, providing an easy way to control which thread is used. To dispatch events through the main thread of your application, you can use `https://developer.android.com/reference/android/content/Context#getMainExecutor()`. Otherwise, provide an `https://developer.android.com/reference/java/util/concurrent/Executor` that dispatches to an appropriate thread. <br /> |
| `listener` | `SurfaceControl.OnJankDataListener`: The listener to add. This value cannot be `null`. <br /> |

| Returns ||
|---|---|
| `https://developer.android.com/reference/android/view/SurfaceControl.OnJankDataListenerRegistration` | The `https://developer.android.com/reference/android/view/SurfaceControl.OnJankDataListenerRegistration` for the listener. This value cannot be `null`. <br /> |

### release

Added in [API level 29](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void release ()
```

Release the local reference to the server-side surface. The surface
may continue to exist on-screen as long as its parent continues
to exist. To explicitly remove a surface from the screen use
`https://developer.android.com/reference/android/view/SurfaceControl.Transaction#reparent(android.view.SurfaceControl,%20android.view.SurfaceControl)` with a null-parent. After release,
`https://developer.android.com/reference/android/view/SurfaceControl#isValid()` will return false and other methods will throw
an exception.

Always call release() when you're done with a SurfaceControl.

<br />

### toString

Added in [API level 29](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public String toString ()
```

Returns a string representation of the object.

<br />

| Returns ||
|---|---|
| `https://developer.android.com/reference/java/lang/String` | a string representation of the object. <br /> |

### writeToParcel

Added in [API level 29](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void writeToParcel (Parcel dest, 
                int flags)
```

Flatten this object in to a Parcel.

<br />

| Parameters ||
|---|---|
| `dest` | `Parcel`: The Parcel in which the object should be written. This value cannot be `null`. <br /> |
| `flags` | `int`: Additional flags about how the object should be written. May be 0 or `https://developer.android.com/reference/android/os/Parcelable#PARCELABLE_WRITE_RETURN_VALUE`. Value is either `0` or a combination of the following: - `https://developer.android.com/reference/android/os/Parcelable#PARCELABLE_WRITE_RETURN_VALUE` |

## Protected methods

### finalize

Added in [API level 29](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
protected void finalize ()
```

Called by the garbage collector on an object when garbage collection
determines that there are no more references to the object.
A subclass overrides the `finalize` method to dispose of
system resources or to perform other cleanup.


The general contract of `finalize` is that it is invoked
if and when the Java virtual
machine has determined that there is no longer any
means by which this object can be accessed by any thread that has
not yet died, except as a result of an action taken by the
finalization of some other object or class which is ready to be
finalized. The `finalize` method may take any action, including
making this object available again to other threads; the usual purpose
of `finalize`, however, is to perform cleanup actions before
the object is irrevocably discarded. For example, the finalize method
for an object that represents an input/output connection might perform
explicit I/O transactions to break the connection before the object is
permanently discarded.


The `finalize` method of class `Object` performs no
special action; it simply returns normally. Subclasses of
`Object` may override this definition.


The Java programming language does not guarantee which thread will
invoke the `finalize` method for any given object. It is
guaranteed, however, that the thread that invokes finalize will not
be holding any user-visible synchronization locks when finalize is
invoked. If an uncaught exception is thrown by the finalize method,
the exception is ignored and finalization of that object terminates.


After the `finalize` method has been invoked for an object, no
further action is taken until the Java virtual machine has again
determined that there is no longer any means by which this object can
be accessed by any thread that has not yet died, including possible
actions by other objects or classes which are ready to be finalized,
at which point the object may be discarded.


The `finalize` method is never invoked more than once by a Java
virtual machine for any given object.


Any exception thrown by the `finalize` method causes
the finalization of this object to be halted, but is otherwise
ignored.

<br />

| Throws ||
|---|---|
| `https://developer.android.com/reference/java/lang/Throwable` |   |