profile
viewpoint
Chris Banes chrisbanes @google working on @android Sydney, Australia https://chris.banes.me

chrisbanes/PhotoView 16581

Implementation of ImageView for Android that supports zooming, by various touch gestures.

chrisbanes/cheesesquare 7780

Demos the new Android Design library.

android/android-ktx 7558

A set of Kotlin extensions for Android app development.

chrisbanes/tivi 2703

Tivi is a work-in-progress TV show tracking Android app, which connects to Trakt.tv. It is still in its early stages of development and currently only contains two pieces of UI. It is under heavy development.

chrisbanes/philm 2127

Movie collection and information app for Android.

chrisbanes/gradle-mvn-push 964

Helper to upload Gradle Android Artifacts to Maven repositories

chrisbanes/photup 943

photup

chrisbanes/Android-BitmapCache 836

Android-BitmapCache is a specialised cache, for use with Android Bitmap objects.

PR opened android/user-interface-samples

Reviewers
Use DayNight theme to support dark theme

Change-Id: I1aed86e4f22ffa23d8695c8490cc767e1865a6a4

+1 -1

0 comment

1 changed file

pr created time in 9 hours

create barnchandroid/user-interface-samples

branch : cb/darktheme

created branch time in 9 hours

fork chrisbanes/user-interface-samples

Multiple samples showing the best practices in the user interface on Android.

fork in 10 hours

push eventandroid/user-interface-samples

Kenneth Ford

commit sha 0950c7e54641fd6ca61e56c135fc0d64bdb5e696

Initial Commit for new Window Manager Sample

view details

Kenneth Ford

commit sha 9f5a51b36c515979b3ee31a50b3f93592a845792

Updated gradle plugin version to 3.6.1 and kotlin version 1.3.61

view details

Kenneth Ford

commit sha ce8e9c852e8ac780ddbbe631dc502fc19a4c3887

Moving SplitLayout custom view logic into the activity to remove the need for the custom view

view details

Kenneth Ford

commit sha 733716a99f1ad6f95aa99a0104a5968a49840d32

Moved code to handle splitting content/controls across the hinge from custom SplitLayout view to the activity

view details

Kenneth Ford

commit sha 1cb1749c7b6d2431c0d2a1eb97f531925351b568

Bug fixes around the test backend

view details

Kenneth Ford

commit sha 6da338b0f4b1a9527cdc4c08830447d48ad21c50

Removed the custom Split Layout view and moved display feature logic to the activity

view details

Kenneth Ford

commit sha fa37d8e626260225d73d7ada56dedb5661e4ac52

formatter changes

view details

Kenneth Ford

commit sha 920104a7e54993b46855715e8ddff8a26d011765

Adds README

view details

Kenneth Ford

commit sha cd0454d656104d774784638426de24b592cf507c

Removed presentation usage for now

view details

Kenneth Ford

commit sha 90bacc70a1e2d162ae4e069df47fa5f9d5e98475

Fixes bugs in the DisplayFeatures activity

view details

Kenneth Ford

commit sha 670135c2fdebb80e867323c5de792a66c0e06622

Refactored Display Feature Activity layout

view details

Kenneth Ford

commit sha 1a84e9d383a511044d7c70cea49803bb632f7b39

Removed presentation strings

view details

Kenneth Ford

commit sha 886426e24bcdc85e649b3f68dac894fb0660f729

Small layout refactors

view details

Kenneth Ford

commit sha 6856e31adfafcd69f5358446290d8cc2ec38a9b0

Wired display feature toggle up

view details

Kenneth Ford

commit sha ac2104497ab316b98daeec9642ee8bc9e068dd68

Min target to 23 to remove lint warnings

view details

Kenneth Ford

commit sha 85d9aa796dc09bcee2d933b44ff6477fbbf95675

Fixed lint errors

view details

Kenneth Ford

commit sha 531059fc86c1aeaa48105847da9c338d256c23ab

removed test directories

view details

Kenneth Ford

commit sha de1986efe86b2dabc1274fb80f4415f6977c0025

Adds missing copyrights

view details

Kenneth Ford

commit sha a38ae6b82efa92db15d24ae2b7303a7bc0623dab

Removed unused attrs file

view details

Kenneth Ford

commit sha a3ef403675ef55cc4d130f64e0bfab242eae3b25

Add java tag for better syntax highlighting

view details

push time in 18 hours

issue commentchrisbanes/insetter

Duplicate class dev.chrisbanes.insetter.DataBinderMapperImpl

JCenter is the same 🤔 https://bintray.com/search?query=dev.chrisbanes.insetter

bogdanzurac

comment created time in 4 days

issue commentchrisbanes/insetter

Duplicate class dev.chrisbanes.insetter.DataBinderMapperImpl

I don't really understand where the dev.chrisbanes.insetter:insetter* artifacts are coming from. They're not on Maven Central, and not built by the library: https://search.maven.org/search?q=g:dev.chrisbanes

bogdanzurac

comment created time in 4 days

push eventchrisbanes/tivi

Chris Banes

commit sha afbb22d779924dcd28581141cc39e358ee2bd3e2

Tidy up Show details UiEffects

view details

push time in 4 days

push eventchrisbanes/tivi

Chris Banes

commit sha 9d32b77e14d1fd4316d194c172f7db6c6415906d

Update to Compose snapshot #6356900

view details

Chris Banes

commit sha b3dcca63511ec53be40d132f2d1c2a0aa7a43fa1

Add scrolling to season back in

view details

push time in 4 days

issue closedandroid/user-interface-samples

Dark Theme: Elevation Making No Difference in View Appearance

While trying out the Dark Theme sample I tried to manipulate a CardView's perceived elevation by changing the elevation value in xml. The official Material.io guide on Dark Theme indicates that a white tint overlay is supposed to be faded in at various opacity as the elevation increases, giving views in Dark Theme a brightening or "closer to the surface" effect.

I added a card layout to the MainActivity of the DarkThemeApplication and there's no visual difference between 18dp of elevation and 1dp. What am I doing wrong? Am I supposed to implement this elevation effect with a white overlay manually?

1dp Card Elevation 18dp Card Elevation

closed time in 4 days

CodyEddings

issue commentandroid/user-interface-samples

Dark Theme: Elevation Making No Difference in View Appearance

Only MaterialCardView has a special elevation attribute (CardView does too), which allows it support elevation pre-Lollipop. It seems that only the compat attribute is hooked up to the overlay logic.

/cc @ricknout

CodyEddings

comment created time in 4 days

issue commentandroid/user-interface-samples

Dark Theme: Elevation Making No Difference in View Appearance

This is what you need for MaterialCardView

<com.google.android.material.card.MaterialCardView
    app:cardElevation="18dp" />
CodyEddings

comment created time in 4 days

issue commentandroid/user-interface-samples

Dark Theme: Elevation Making No Difference in View Appearance

For CardView, you should be using MaterialCardView, since that is where the overlay logic lives.

CodyEddings

comment created time in 4 days

push eventchrisbanes/tivi

Chris Banes

commit sha e6f72448e57bc01be8a431f8ae5514ea1981cb78

Show season progress in progress bar

view details

push time in 4 days

push eventchrisbanes/tivi

Chris Banes

commit sha 91223e88e21ebd21ad5b8fbfeb39cbd34ab29fbe

Show status icons on episodes

view details

push time in 5 days

push eventchrisbanes/tivi

Chris Banes

commit sha 549ecaa9ccdaea1ed2b2b39433ce2123fbf29f0b

Start of showing seasons and episodes

view details

push time in 5 days

push eventchrisbanes/tivi

Chris Banes

commit sha 4cfbc5c5de3c9d118d061f4c32957dd0305ed0bd

Display view stats

view details

push time in 5 days

push eventchrisbanes/tivi

Chris Banes

commit sha e094de62d7ce4c339f4b8f8b35febaa6ab03f88f

Show next episode to watch

view details

push time in 5 days

issue commentandroid/user-interface-samples

Dark Theme: Elevation Making No Difference in View Appearance

Can you post the code you are using to increase the elevation?

CodyEddings

comment created time in 5 days

push eventchrisbanes/tivi

Chris Banes

commit sha 81af0f65348ca259d58dcc22b632c4d76261839c

Add related shows horizontal list

view details

push time in 5 days

push eventchrisbanes/tivi

Chris Banes

commit sha 3e8fdb85170a1adf963c456e77509a19ab132c63

Add summary to show details

view details

Chris Banes

commit sha 5a86f2152b0f1c4f792662df5bd37ae18ba37726

Add genres to show details

view details

push time in 5 days

PR opened chrisbanes/tivi

Update show details to Compose
+633 -2221

0 comment

46 changed files

pr created time in 6 days

push eventchrisbanes/tivi

Chris Banes

commit sha 4b4f802ca47163864e621cb2886f184f77a368b8

Use WithConstraint for image loading sizing

view details

push time in 6 days

push eventchrisbanes/tivi

Chris Banes

commit sha d370484fbdd3dc471da9188fde548800111b47a7

More tweaks for show details

view details

push time in 6 days

Pull request review commentandroid/user-interface-samples

Initial creation of new Jetpack Window Manager Sample

+/*+ * Copyright 2020 The Android Open Source Project+ *+ * Licensed under the Apache License, Version 2.0 (the "License");+ * you may not use this file except in compliance with the License.+ * You may obtain a copy of the License at+ *+ *      http://www.apache.org/licenses/LICENSE-2.0+ *+ * Unless required by applicable law or agreed to in writing, software+ * distributed under the License is distributed on an "AS IS" BASIS,+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+ * See the License for the specific language governing permissions and+ * limitations under the License.+ */++package com.example.windowmanagersample++import android.annotation.SuppressLint+import android.os.Handler+import android.os.Looper+import androidx.appcompat.app.AppCompatActivity+import com.example.windowmanagersample.backend.MidScreenFoldBackend+import java.util.concurrent.Executor++/**+ * Base class for Activities in the samples that allows specifying the [WindowBackend]+ * that should be used by the sample activities in this package. This allows switching between the+ * default backend provided on the device and a test backend (e.g. if the device doesn't provide+ * any).+ */+@SuppressLint("Registered")+open class BaseSampleActivity : AppCompatActivity() {+    companion object {+        const val BACKEND_TYPE_EXTRA = "backend_type"++        const val BACKEND_TYPE_DEVICE_DEFAULT = 0+        const val BACKEND_TYPE_MID_SCREEN_FOLD = 1+    }++    private val handler = Handler(Looper.getMainLooper())+    val mainThreadExecutor = Executor { r: Runnable -> handler.post(r) }

Feel free to ignore/follow up. This was just a general comment on something I noticed.

kford55

comment created time in 6 days

Pull request review commentandroid/user-interface-samples

Initial creation of new Jetpack Window Manager Sample

+/*+ * Copyright 2020 The Android Open Source Project+ *+ * Licensed under the Apache License, Version 2.0 (the "License");+ * you may not use this file except in compliance with the License.+ * You may obtain a copy of the License at+ *+ *      http://www.apache.org/licenses/LICENSE-2.0+ *+ * Unless required by applicable law or agreed to in writing, software+ * distributed under the License is distributed on an "AS IS" BASIS,+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+ * See the License for the specific language governing permissions and+ * limitations under the License.+ */++package com.example.windowmanagersample++import android.graphics.Rect+import android.view.View+import android.widget.FrameLayout+import androidx.window.DisplayFeature++/**+ * Get the bounds of the display feature translated to the View's coordinate space and current+ * position in the window. This will also include view padding in the calculations.+ */+fun getFeaturePositionInViewRect(+    displayFeature: DisplayFeature,+    view: View,+    includePadding: Boolean = true+): Rect? {

I'd return a boolean based on success: getFeatureBoundsInWindow(..., result: Rect): Boolean and return false if there's no intersection. This might be overkill for a sample.

kford55

comment created time in 6 days

Pull request review commentandroid/user-interface-samples

Initial creation of new Jetpack Window Manager Sample

+/*+ * Copyright 2020 The Android Open Source Project+ *+ * Licensed under the Apache License, Version 2.0 (the "License");+ * you may not use this file except in compliance with the License.+ * You may obtain a copy of the License at+ *+ *      http://www.apache.org/licenses/LICENSE-2.0+ *+ * Unless required by applicable law or agreed to in writing, software+ * distributed under the License is distributed on an "AS IS" BASIS,+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+ * See the License for the specific language governing permissions and+ * limitations under the License.+ */++package com.example.windowmanagersample++import android.content.res.Configuration+import android.graphics.drawable.ColorDrawable+import android.os.Bundle+import android.util.Log+import android.view.View+import androidx.core.util.Consumer+import androidx.core.view.doOnLayout+import androidx.window.DeviceState+import androidx.window.DisplayFeature+import androidx.window.WindowLayoutInfo+import androidx.window.WindowManager+import com.example.windowmanagersample.backend.MidScreenFoldBackend+import com.example.windowmanagersample.databinding.ActivityDisplayFeaturesBinding+import java.text.SimpleDateFormat+import java.util.*+import kotlin.collections.ArrayList++/** Demo activity that shows all display features and current device state on the screen. */+class DisplayFeaturesActivity : BaseSampleActivity() {++    private lateinit var windowManager: WindowManager+    private val stateLog: StringBuilder = StringBuilder()++    private val displayFeatureViews = ArrayList<View>()+    private val deviceStateChangeCallback = DeviceStateChangeCallback()+    private val layoutStateChangeCallback = LayoutStateChangeCallback()++    private lateinit var binding: ActivityDisplayFeaturesBinding++    private var windowBackend: MidScreenFoldBackend? = null++    override fun onCreate(savedInstanceState: Bundle?) {+        super.onCreate(savedInstanceState)+        binding = ActivityDisplayFeaturesBinding.inflate(layoutInflater)+        val view = binding.root+        setContentView(view)++        windowBackend = getTestBackend()+        windowManager = WindowManager(this, windowBackend)++        if (windowBackend != null) {+            binding.deviceStateToggleButton.visibility = View.VISIBLE+            binding.deviceStateToggleButton.setOnClickListener {+                windowBackend?.toggleDeviceHalfOpenedState()+            }+        }++        stateLog.clear()+        stateLog.append(getString(R.string.stateUpdateLog)).append("\n")++        windowManager.registerDeviceStateChangeCallback(+            mainThreadExecutor,+            deviceStateChangeCallback+        )++        window.decorView.doOnLayout {+            updateStateAndFeatureViews()+        }+    }++    override fun onAttachedToWindow() {+        super.onAttachedToWindow()+        windowManager.registerLayoutChangeCallback(mainThreadExecutor, layoutStateChangeCallback)+    }++    override fun onDetachedFromWindow() {+        super.onDetachedFromWindow()+        windowManager.unregisterLayoutChangeCallback(layoutStateChangeCallback)+    }++    /**+     * Update the device state and display feature positions. Needs to be called after window+     * layout, so that view position in the window could be evaluated correctly.+     */+    internal fun updateStateAndFeatureViews() {+        // Cleanup previously added feature views+        for (featureView in displayFeatureViews) {+            binding.featureContainerLayout.removeView(featureView)+        }+        displayFeatureViews.clear()++        // Update the UI with the current state+        val stateStringBuilder = StringBuilder()+        // Update the current state string+        stateStringBuilder.append(getString(R.string.deviceState))+            .append(": ")+            .append(windowManager.deviceState)+            .append("\n")++        stateStringBuilder.append(getString(R.string.windowLayout))+            .append(": ")+            .append(windowManager.windowLayoutInfo)++        // Add views that represent display features+        for (displayFeature in windowManager.windowLayoutInfo.displayFeatures) {+            val lp = getLayoutParamsForFeatureInFrameLayout(+                displayFeature,+                binding.featureContainerLayout+            ) ?: continue++            // Make sure that zero-wide and zero-high features are still shown+            if (lp.width == 0) {

LPs should only be read and intepreted by the parent, since they can mean different things to different ViewGroups. For instance: a value of 0 width in ConstraintLayout means 'match_constraint', not 0px. The final laid out width is the only source of truth for any consumers.

Use doOnLayout()?

kford55

comment created time in 6 days

push eventchrisbanes/tivi

Chris Banes

commit sha 612aa57e41c7e723bcf7a19ca3d59726e257ebea

Start of migrating show details to Compose

view details

Chris Banes

commit sha f1725c7e3664193578b2a561c6d2ab13a93c0875

Add rating info pane

view details

push time in 6 days

push eventchrisbanes/tivi

Chris Banes

commit sha 1d345d8fdccfe21f216d281df27581b812ac9fb3

Remove remaining files

view details

push time in 6 days

push eventchrisbanes/tivi

Chris Banes

commit sha 71918dd7bb2d1c08b42f02ffbbaa46faed1a8f28

Split out ui-showdetails into 3 modules Removed nearly all of the view implementation

view details

push time in 7 days

create barnchchrisbanes/tivi

branch : cb/show-details-compose

created branch time in 7 days

push eventchrisbanes/tivi

Chris Banes

commit sha 5c10c47e1d932166cf44d1fcca84d84832d6d613

Update to Compose 0.1.0-dev07

view details

Chris Banes

commit sha a8226f074ffc49f97f82c63aad91f1f4f22d8753

Fix expanding summary being always clickable It shouldn't be clickable if the text hasn't overflowed.

view details

Chris Banes

commit sha 4184a6f57d83d827344dac859c4a89e925d399b5

Use a normal button instead of a FAB for 'add watch'

view details

Chris Banes

commit sha 2a1be2ec7af3be9ee5c6a6b37a38006af1290326

Update to Compose snapshot #6342451

view details

Chris Banes

commit sha e44c7886c5c7bff4e9d9c23d2bab6c3db9906d8d

Workaround Button floating to top left

view details

Chris Banes

commit sha daeae5a7a0dc219ee9de16e84aecdbe78d29363d

Emit same disposable for image loading animation Thanks @andkulikov for the tip

view details

Chris Banes

commit sha 525f96705026f31e252632dcbeafd837cde127e4

Fix import ordering

view details

Chris Banes

commit sha d43502e74950b923e193d01abbccfa925a404006

Update elevation workaround to only targer SDK 28

view details

Chris Banes

commit sha 4d94eb7382e6801a0d22dd22e306ff1a16bc3eaf

Fix swipe dismiss not working Also managed to get rid of my dodgy onPositioned {} logic with `Modifier.matchParent()`

view details

Chris Banes

commit sha 2149936efa8ff65a7ef7492918ac189feb824308

Use background instead of gradient for scrim

view details

Chris Banes

commit sha 590455635df50806bf03d1cafd95482f846d58d6

Fix button color

view details

Chris Banes

commit sha 1a8e5cc46fc173c7521cbe8c0ff4258a1dcb6309

Merge pull request #582 from chrisbanes/cb/compose-snapshot-6342451 Update to Compose snapshot #6342451

view details

push time in 7 days

delete branch chrisbanes/tivi

delete branch : cb/compose-snapshot-6342451

delete time in 7 days

PR merged chrisbanes/tivi

Update to Compose snapshot #6342451 automerge cla: yes
+273 -399

0 comment

10 changed files

chrisbanes

pr closed time in 7 days

push eventchrisbanes/tivi

Chris Banes

commit sha 590455635df50806bf03d1cafd95482f846d58d6

Fix button color

view details

push time in 7 days

push eventchrisbanes/tivi

Chris Banes

commit sha 2149936efa8ff65a7ef7492918ac189feb824308

Use background instead of gradient for scrim

view details

push time in 7 days

push eventchrisbanes/tivi

Chris Banes

commit sha 4d94eb7382e6801a0d22dd22e306ff1a16bc3eaf

Fix swipe dismiss not working Also managed to get rid of my dodgy onPositioned {} logic with `Modifier.matchParent()`

view details

push time in 7 days

delete branch chrisbanes/tivi

delete branch : cb/compose-dev07

delete time in 8 days

pull request commentchrisbanes/tivi

Update to Compose 0.1.0-dev07

Abandoned. Going straight to dev08 in #582

chrisbanes

comment created time in 8 days

PR closed chrisbanes/tivi

Update to Compose 0.1.0-dev07 cla: yes
+66 -212

0 comment

7 changed files

chrisbanes

pr closed time in 8 days

push eventchrisbanes/tivi

Chris Banes

commit sha d43502e74950b923e193d01abbccfa925a404006

Update elevation workaround to only targer SDK 28

view details

push time in 8 days

push eventchrisbanes/tivi

Chris Banes

commit sha 525f96705026f31e252632dcbeafd837cde127e4

Fix import ordering

view details

push time in 8 days

Pull request review commentchrisbanes/tivi

Update to Compose snapshot #6342451

 fun LoadNetworkImageWithCrossfade(                 // Unfortunately ColorMatrixColorFilter is not mutable so we have to create a new                 // one every time                 val cf = ColorMatrixColorFilter(matrix)-                Box(modifier = modifier + AndroidColorMatrixImagePainter(image, cf).toModifier())+                Box(+                    modifier = modifier.onPositioned { childSize = it.size }+                        .paint(AndroidColorMatrixImagePainter(image, cf))+                )             } else {-                Box(modifier = modifier)+                Box(modifier = modifier.onPositioned { childSize = it.size })

Thanks, done!

chrisbanes

comment created time in 8 days

push eventchrisbanes/tivi

Chris Banes

commit sha daeae5a7a0dc219ee9de16e84aecdbe78d29363d

Emit same disposable for image loading animation Thanks @andkulikov for the tip

view details

push time in 8 days

push eventchrisbanes/tivi

Chris Banes

commit sha e44c7886c5c7bff4e9d9c23d2bab6c3db9906d8d

Workaround Button floating to top left

view details

push time in 8 days

create barnchchrisbanes/tivi

branch : cb/compose-snapshot-6342451

created branch time in 9 days

PR opened chrisbanes/tivi

Update to Compose snapshot #6342451
+187 -315

0 comment

10 changed files

pr created time in 9 days

PR opened chrisbanes/tivi

Update to Compose 0.1.0-dev07
+66 -212

0 comment

7 changed files

pr created time in 9 days

create barnchchrisbanes/tivi

branch : cb/compose-dev07

created branch time in 9 days

push eventchrisbanes/tivi

Chris Banes

commit sha 761f03daf77f79d5b4a4d9a8abee9f7f5fc42a22

Disable Crashlytics

view details

Chris Banes

commit sha ea8a22a977ff45986ca7a6ac3d7772ad2327e7bc

Merge pull request #579 from chrisbanes/cb/disable-crashlytics Disable Crashlytics

view details

push time in 9 days

PR merged chrisbanes/tivi

Disable Crashlytics automerge cla: yes
+6 -14

0 comment

5 changed files

chrisbanes

pr closed time in 9 days

delete branch chrisbanes/tivi

delete branch : cb/disable-crashlytics

delete time in 9 days

push eventchrisbanes/tivi

Chris Banes

commit sha 761f03daf77f79d5b4a4d9a8abee9f7f5fc42a22

Disable Crashlytics

view details

push time in 9 days

push eventchrisbanes/tivi

Chris Banes

commit sha ba388752692f3749ec913648747227e5d4a82635

Disable Crashlytics

view details

push time in 9 days

issue openedchrisbanes/tivi

Re-enable Crashlytics

It's currently incompatible with AGP 4.1.0-alpha04. Disabled in #579

created time in 10 days

create barnchchrisbanes/tivi

branch : cb/disable-crashlytics

created branch time in 10 days

PR opened chrisbanes/tivi

Disable Crashlytics
+6 -14

0 comment

5 changed files

pr created time in 10 days

push eventchrisbanes/tivi

Chris Banes

commit sha 3639bc2f23ef0834a59f671b267c06382f7734dc

Try building with JDK 11

view details

Chris Banes

commit sha 5a5d60da1fd1c85839f0c61a57b4992d739cef38

Merge pull request #577 from chrisbanes/cb/jdk-11 Try building with JDK 11

view details

push time in 10 days

delete branch chrisbanes/tivi

delete branch : cb/jdk-11

delete time in 10 days

PR merged chrisbanes/tivi

Try building with JDK 11 cla: yes
+2 -2

0 comment

1 changed file

chrisbanes

pr closed time in 10 days

push eventchrisbanes/tivi

Chris Banes

commit sha da872081454e2b3490a72b9d8609c3f25c4080b9

Add automerge action

view details

push time in 10 days

PR opened chrisbanes/tivi

Fix Room warnings
+21 -0

0 comment

6 changed files

pr created time in 10 days

create barnchchrisbanes/tivi

branch : cb/fix-room-warnings

created branch time in 10 days

push eventchrisbanes/tivi

Chris Banes

commit sha 497056da05656998bd2611e91219fdd9b91cc718

Workaround issue in InvalidPeriodicWorkRequestIntervalDetector

view details

push time in 10 days

PR opened chrisbanes/tivi

Try building with JDK 11
+2 -2

0 comment

1 changed file

pr created time in 10 days

create barnchchrisbanes/tivi

branch : cb/jdk-11

created branch time in 10 days

push eventchrisbanes/tivi

Chris Banes

commit sha e64103a0a48d7ede092af0677a15833324ac5b7d

Rename delgates.kt to delegates.kt Closes #549

view details

push time in 10 days

push eventchrisbanes/tivi

Chris Banes

commit sha 698bc8acd80f192f9c22916d5dd7dd63e8e0a86e

Rename delgates.kt to delegates.kt Closes #549

view details

push time in 10 days

issue closedchrisbanes/tivi

Typo in file name "delgates.kt" instead of "delegates.kt"

https://github.com/chrisbanes/tivi/blob/master/base/src/main/java/app/tivi/extensions/delgates.kt

This file should be renamed to "delegates.kt" or "Delegates.kt"

closed time in 10 days

itsandreramon

PR opened chrisbanes/tivi

Dependency updates
+21 -27

0 comment

3 changed files

pr created time in 10 days

create barnchchrisbanes/tivi

branch : cb/dependency-updates

created branch time in 10 days

delete branch chrisbanes/tivi

delete branch : cb/agp-4.1-alpha03

delete time in 10 days

push eventchrisbanes/tivi

Chris Banes

commit sha 3a387ee55f2fdf127ba68fad5542c9ed43ed5496

Update to AGP 4.1.0-alpha03

view details

Chris Banes

commit sha a94400a93cb0dce751f99c8348a93a3ecd89b0ec

Merge pull request #574 from chrisbanes/cb/agp-4.1-alpha03 Update to AGP 4.1.0-alpha03 and Gradle 6.3

view details

push time in 10 days

PR merged chrisbanes/tivi

Update to AGP 4.1.0-alpha03 and Gradle 6.3 cla: yes
+12 -12

0 comment

5 changed files

chrisbanes

pr closed time in 10 days

push eventchrisbanes/tivi

Chris Banes

commit sha 2a2748c1bf1bc6d81b83f7a9bd5e1b193b523b90

Use the wildcard v1.x cache action

view details

push time in 10 days

push eventchrisbanes/tivi

Chris Banes

commit sha d966ed855a5ef913f422579baa7cfdec745c1f7e

Fix imports

view details

Chris Banes

commit sha 65c76f32c76a1e2492ed31414cc15fa8c53ecce3

Merge pull request #575 from chrisbanes/cb/fix-build Fix build

view details

Chris Banes

commit sha 3a387ee55f2fdf127ba68fad5542c9ed43ed5496

Update to AGP 4.1.0-alpha03

view details

push time in 10 days

delete branch chrisbanes/tivi

delete branch : cb/fix-build

delete time in 10 days

push eventchrisbanes/tivi

Chris Banes

commit sha d966ed855a5ef913f422579baa7cfdec745c1f7e

Fix imports

view details

Chris Banes

commit sha 65c76f32c76a1e2492ed31414cc15fa8c53ecce3

Merge pull request #575 from chrisbanes/cb/fix-build Fix build

view details

push time in 10 days

PR merged chrisbanes/tivi

Fix build cla: yes

Due to incorrect import placement

+1 -1

0 comment

1 changed file

chrisbanes

pr closed time in 10 days

PR opened chrisbanes/tivi

Fix imports

Due to incorrect import placement

+1 -1

0 comment

1 changed file

pr created time in 10 days

create barnchchrisbanes/tivi

branch : cb/fix-build

created branch time in 10 days

delete branch chrisbanes/tivi

delete branch : cb/episode-compose-6178998

delete time in 10 days

delete branch chrisbanes/tivi

delete branch : cb/agp-4.0.0-alpha08

delete time in 10 days

PR closed chrisbanes/tivi

Update to AGP, Gradle and Kotlin cla: yes

AGP 3.6.0-alpha08 Gradle 6.1.0 Kotlin 1.3.61

+52 -24

0 comment

6 changed files

chrisbanes

pr closed time in 10 days

create barnchchrisbanes/tivi

branch : cb/agp-4.1-alpha03

created branch time in 10 days

PR opened chrisbanes/tivi

Update to AGP 4.1.0-alpha03 and Gradle 6.3
+12 -12

0 comment

5 changed files

pr created time in 10 days

push eventchrisbanes/tivi

sathawale

commit sha 319383e92020807c7a6abe5b76cc5e7b69141639

No need of workaround for ConstraintLayout as issue has been fixed already. Also, using the latest version of constraintLayout 2.0.0-beta4 Reference revision: Update to AGP 3.6.0-alpha12 Required a workaround for ConstraintLayout Revision - f57a8e10332dccc0c5f9bc3f325244dbe367c883

view details

sathawale

commit sha 8facf6c2d3831928f6114aa0b3253366707f6ce6

Merge branch 'master' of https://github.com/chrisbanes/tivi

view details

Chris Banes

commit sha e92be4855aafaba18404492718cf06c4d5be264b

Merge pull request #573 from Sathawale27/master No need of workaround for ConstraintLayout as issue has been fixed already

view details

push time in 11 days

PR merged chrisbanes/tivi

No need of workaround for ConstraintLayout as issue has been fixed already cla: yes

No need of workaround for ConstraintLayout as issue has been fixed already. Also, using the latest version of constraintLayout 2.0.0-beta4.

Reference revision: Update to AGP 3.6.0-alpha12 Required a workaround for ConstraintLayout Revision - f57a8e10332dccc0c5f9bc3f325244dbe367c883

+0 -9

0 comment

1 changed file

Sathawale27

pr closed time in 11 days

Pull request review commentandroid/user-interface-samples

Initial creation of new Jetpack Window Manager Sample

+/*+ * Copyright 2020 The Android Open Source Project+ *+ * Licensed under the Apache License, Version 2.0 (the "License");+ * you may not use this file except in compliance with the License.+ * You may obtain a copy of the License at+ *+ *      http://www.apache.org/licenses/LICENSE-2.0+ *+ * Unless required by applicable law or agreed to in writing, software+ * distributed under the License is distributed on an "AS IS" BASIS,+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+ * See the License for the specific language governing permissions and+ * limitations under the License.+ */++package com.example.windowmanagersample++import android.graphics.Rect+import android.os.Bundle+import android.view.View+import android.widget.FrameLayout+import androidx.core.util.Consumer+import androidx.core.view.doOnLayout+import androidx.window.DisplayFeature+import androidx.window.WindowLayoutInfo+import androidx.window.WindowManager+import com.example.windowmanagersample.databinding.ActivitySplitLayoutBinding++/** Demo of an Activity splitting views across a [DeviceFeature]. */+class SplitLayoutActivity : BaseSampleActivity() {++    private lateinit var windowManager: WindowManager+    private val layoutStateChangeCallback = LayoutStateChangeCallback()++    private lateinit var binding: ActivitySplitLayoutBinding++    override fun onCreate(savedInstanceState: Bundle?) {+        super.onCreate(savedInstanceState)+        binding = ActivitySplitLayoutBinding.inflate(layoutInflater)+        val view = binding.root+        setContentView(view)+        windowManager = WindowManager(this, getTestBackend())+        binding.root.doOnLayout {+            updateWindowLayout(windowManager.windowLayoutInfo)+        }+    }++    private fun updateWindowLayout(windowLayoutInfo: WindowLayoutInfo) {+        val splitPositions = splitViewPositions(+            binding.contentLayout.root,+            binding.controlLayout.root,+            windowLayoutInfo+        )++        if (splitPositions != null) {+            val startPosition = splitPositions[0]+            val startWidthSpec = View.MeasureSpec.makeMeasureSpec(+                startPosition.width(),+                View.MeasureSpec.EXACTLY+            )+            val startHeightSpec = View.MeasureSpec.makeMeasureSpec(+                startPosition.height(),+                View.MeasureSpec.EXACTLY+            )+            binding.contentLayout.root.measure(startWidthSpec, startHeightSpec)+            binding.contentLayout.root.layout(+                startPosition.left, startPosition.top, startPosition.right,+                startPosition.bottom+            )++            val endPosition = splitPositions[1]+            val endWidthSpec = View.MeasureSpec.makeMeasureSpec(+                endPosition.width(),+                View.MeasureSpec.EXACTLY+            )+            val endHeightSpec = View.MeasureSpec.makeMeasureSpec(+                endPosition.height(),+                View.MeasureSpec.EXACTLY+            )+            binding.controlLayout.root.measure(endWidthSpec, endHeightSpec)

Ditto, don't measure and a layout a view which you don't own.

kford55

comment created time in 11 days

Pull request review commentandroid/user-interface-samples

Initial creation of new Jetpack Window Manager Sample

+<resources>

xml decl and copyright

kford55

comment created time in 11 days

Pull request review commentandroid/user-interface-samples

Initial creation of new Jetpack Window Manager Sample

+/*+ * Copyright 2020 The Android Open Source Project+ *+ * Licensed under the Apache License, Version 2.0 (the "License");+ * you may not use this file except in compliance with the License.+ * You may obtain a copy of the License at+ *+ *      http://www.apache.org/licenses/LICENSE-2.0+ *+ * Unless required by applicable law or agreed to in writing, software+ * distributed under the License is distributed on an "AS IS" BASIS,+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+ * See the License for the specific language governing permissions and+ * limitations under the License.+ */++package com.example.windowmanagersample++import android.graphics.Rect+import android.os.Bundle+import android.view.View+import android.widget.FrameLayout+import androidx.core.util.Consumer+import androidx.core.view.doOnLayout+import androidx.window.DisplayFeature+import androidx.window.WindowLayoutInfo+import androidx.window.WindowManager+import com.example.windowmanagersample.databinding.ActivitySplitLayoutBinding++/** Demo of an Activity splitting views across a [DeviceFeature]. */+class SplitLayoutActivity : BaseSampleActivity() {++    private lateinit var windowManager: WindowManager+    private val layoutStateChangeCallback = LayoutStateChangeCallback()++    private lateinit var binding: ActivitySplitLayoutBinding++    override fun onCreate(savedInstanceState: Bundle?) {+        super.onCreate(savedInstanceState)+        binding = ActivitySplitLayoutBinding.inflate(layoutInflater)+        val view = binding.root+        setContentView(view)+        windowManager = WindowManager(this, getTestBackend())+        binding.root.doOnLayout {+            updateWindowLayout(windowManager.windowLayoutInfo)+        }+    }++    private fun updateWindowLayout(windowLayoutInfo: WindowLayoutInfo) {+        val splitPositions = splitViewPositions(+            binding.contentLayout.root,+            binding.controlLayout.root,+            windowLayoutInfo+        )++        if (splitPositions != null) {+            val startPosition = splitPositions[0]+            val startWidthSpec = View.MeasureSpec.makeMeasureSpec(+                startPosition.width(),+                View.MeasureSpec.EXACTLY+            )+            val startHeightSpec = View.MeasureSpec.makeMeasureSpec(+                startPosition.height(),+                View.MeasureSpec.EXACTLY+            )+            binding.contentLayout.root.measure(startWidthSpec, startHeightSpec)+            binding.contentLayout.root.layout(+                startPosition.left, startPosition.top, startPosition.right,+                startPosition.bottom+            )++            val endPosition = splitPositions[1]+            val endWidthSpec = View.MeasureSpec.makeMeasureSpec(+                endPosition.width(),+                View.MeasureSpec.EXACTLY+            )+            val endHeightSpec = View.MeasureSpec.makeMeasureSpec(+                endPosition.height(),+                View.MeasureSpec.EXACTLY+            )+            binding.controlLayout.root.measure(endWidthSpec, endHeightSpec)+            binding.controlLayout.root.layout(+                endPosition.left, endPosition.top, endPosition.right,+                endPosition.bottom+            )+        }+    }++    /**+     * Get the position of the split for this view.+     * @return A rect that defines of split, or {@code null} if there is no split.+     */+    private fun splitViewPositions(+        startView: View?,+        endView: View?,+        windowLayoutInfo: WindowLayoutInfo+    ): Array<Rect>? {+        if (startView == null || endView == null) {

Nit: make the params non-null and make the caller do the null check

kford55

comment created time in 11 days

Pull request review commentandroid/user-interface-samples

Initial creation of new Jetpack Window Manager Sample

+<vector xmlns:android="http://schemas.android.com/apk/res/android"

copyright and xml decl

kford55

comment created time in 11 days

Pull request review commentandroid/user-interface-samples

Initial creation of new Jetpack Window Manager Sample

+<?xml version="1.0" encoding="utf-8"?>+<!--+  Copyright 2020 The Android Open Source Project++  Licensed under the Apache License, Version 2.0 (the "License");+  you may not use this file except in compliance with the License.+  You may obtain a copy of the License at++       http://www.apache.org/licenses/LICENSE-2.0++  Unless required by applicable law or agreed to in writing, software+  distributed under the License is distributed on an "AS IS" BASIS,+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+  See the License for the specific language governing permissions and+  limitations under the License.+  -->++<ScrollView+    xmlns:android="http://schemas.android.com/apk/res/android"+    xmlns:app="http://schemas.android.com/apk/res-auto"+    android:layout_width="match_parent"+    android:layout_height="match_parent">++    <androidx.constraintlayout.widget.ConstraintLayout+        android:layout_width="match_parent"+        android:layout_height="wrap_content"+        android:layout_marginEnd="8dp"+        android:layout_marginStart="8dp" >++        <TextView+            android:id="@+id/hardware_select_text_view"+            android:layout_width="match_parent"+            android:layout_height="40dp"+            android:layout_marginTop="8dp"+            android:gravity="center_vertical"+            android:text="@string/hardware_config_select"+            android:textSize="20sp"+            android:textStyle="bold"+            app:layout_constraintEnd_toEndOf="parent"+            app:layout_constraintStart_toStartOf="parent"+            app:layout_constraintTop_toTopOf="parent" />++        <RadioGroup+            android:id="@+id/backend_radio_group"+            android:layout_width="0dp"+            android:layout_height="wrap_content"+            android:layout_marginTop="8dp"+            app:layout_constraintEnd_toEndOf="parent"+            app:layout_constraintStart_toStartOf="parent"+            app:layout_constraintTop_toBottomOf="@+id/hardware_select_text_view">++            <RadioButton+                android:id="@+id/deviceDefaultRadioButton"

IDs (and resources) should use underscore casing, not camel case. Ditto across all layouts.

kford55

comment created time in 11 days

Pull request review commentandroid/user-interface-samples

Initial creation of new Jetpack Window Manager Sample

+<?xml version="1.0" encoding="utf-8"?>+<!--+  Copyright 2020 The Android Open Source Project++  Licensed under the Apache License, Version 2.0 (the "License");+  you may not use this file except in compliance with the License.+  You may obtain a copy of the License at++       http://www.apache.org/licenses/LICENSE-2.0++  Unless required by applicable law or agreed to in writing, software+  distributed under the License is distributed on an "AS IS" BASIS,+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+  See the License for the specific language governing permissions and+  limitations under the License.+  -->++<ScrollView+    xmlns:android="http://schemas.android.com/apk/res/android"+    xmlns:app="http://schemas.android.com/apk/res-auto"+    android:layout_width="match_parent"+    android:layout_height="match_parent">++    <androidx.constraintlayout.widget.ConstraintLayout+        android:layout_width="match_parent"+        android:layout_height="wrap_content"+        android:layout_marginEnd="8dp"

nit: use layout_horizontal

kford55

comment created time in 11 days

Pull request review commentandroid/user-interface-samples

Initial creation of new Jetpack Window Manager Sample

+<?xml version="1.0" encoding="utf-8"?>+<!--+  Copyright 2020 The Android Open Source Project++  Licensed under the Apache License, Version 2.0 (the "License");+  you may not use this file except in compliance with the License.+  You may obtain a copy of the License at++       http://www.apache.org/licenses/LICENSE-2.0++  Unless required by applicable law or agreed to in writing, software+  distributed under the License is distributed on an "AS IS" BASIS,+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+  See the License for the specific language governing permissions and+  limitations under the License.+  -->++<androidx.constraintlayout.widget.ConstraintLayout+    xmlns:android="http://schemas.android.com/apk/res/android"+    xmlns:app="http://schemas.android.com/apk/res-auto"+    xmlns:tools="http://schemas.android.com/tools"+    android:id="@+id/rootLayout"+    android:layout_width="match_parent"+    android:layout_height="match_parent"+    tools:context="com.example.windowmanagersample.DisplayFeaturesActivity">++    <FrameLayout+        android:id="@+id/feature_container_layout"+        android:layout_width="match_parent"+        android:layout_height="match_parent"+        tools:layout_editor_absoluteX="0dp"+        tools:layout_editor_absoluteY="0dp" />++    <TextView+        android:id="@+id/state_update_log"+        android:layout_width="match_parent"+        android:layout_height="wrap_content"+        android:text="@string/stateUpdateLog"+        app:layout_constraintEnd_toEndOf="parent"+        app:layout_constraintHorizontal_bias="0.0"+        app:layout_constraintStart_toStartOf="@id/fold_legend_color"+        app:layout_constraintTop_toBottomOf="@id/current_state" />++    <TextView+        android:id="@+id/current_state"+        android:layout_width="match_parent"+        android:layout_height="wrap_content"+        android:layout_weight="1"+        android:text="@string/current_state"+        android:textAppearance="@style/TextAppearance.AppCompat.Large"+        app:layout_constraintEnd_toEndOf="parent"+        app:layout_constraintHorizontal_bias="1.0"+        app:layout_constraintStart_toStartOf="parent"+        app:layout_constraintTop_toTopOf="parent" />++    <Button+        android:id="@+id/device_state_toggle_button"+        android:layout_width="wrap_content"+        android:layout_height="wrap_content"+        android:layout_marginStart="5dp"+        android:layout_marginBottom="5dp"

Ditto, grid

kford55

comment created time in 11 days

Pull request review commentandroid/user-interface-samples

Initial creation of new Jetpack Window Manager Sample

+/*+ * Copyright 2020 The Android Open Source Project+ *+ * Licensed under the Apache License, Version 2.0 (the "License");+ * you may not use this file except in compliance with the License.+ * You may obtain a copy of the License at+ *+ *      http://www.apache.org/licenses/LICENSE-2.0+ *+ * Unless required by applicable law or agreed to in writing, software+ * distributed under the License is distributed on an "AS IS" BASIS,+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+ * See the License for the specific language governing permissions and+ * limitations under the License.+ */++package com.example.windowmanagersample++import android.graphics.Rect+import android.os.Bundle+import android.view.View+import android.widget.FrameLayout+import androidx.core.util.Consumer+import androidx.core.view.doOnLayout+import androidx.window.DisplayFeature+import androidx.window.WindowLayoutInfo+import androidx.window.WindowManager+import com.example.windowmanagersample.databinding.ActivitySplitLayoutBinding++/** Demo of an Activity splitting views across a [DeviceFeature]. */+class SplitLayoutActivity : BaseSampleActivity() {++    private lateinit var windowManager: WindowManager+    private val layoutStateChangeCallback = LayoutStateChangeCallback()++    private lateinit var binding: ActivitySplitLayoutBinding++    override fun onCreate(savedInstanceState: Bundle?) {+        super.onCreate(savedInstanceState)+        binding = ActivitySplitLayoutBinding.inflate(layoutInflater)+        val view = binding.root+        setContentView(view)+        windowManager = WindowManager(this, getTestBackend())+        binding.root.doOnLayout {+            updateWindowLayout(windowManager.windowLayoutInfo)+        }+    }++    private fun updateWindowLayout(windowLayoutInfo: WindowLayoutInfo) {+        val splitPositions = splitViewPositions(+            binding.contentLayout.root,+            binding.controlLayout.root,+            windowLayoutInfo+        )++        if (splitPositions != null) {+            val startPosition = splitPositions[0]+            val startWidthSpec = View.MeasureSpec.makeMeasureSpec(+                startPosition.width(),+                View.MeasureSpec.EXACTLY+            )+            val startHeightSpec = View.MeasureSpec.makeMeasureSpec(+                startPosition.height(),+                View.MeasureSpec.EXACTLY+            )+            binding.contentLayout.root.measure(startWidthSpec, startHeightSpec)+            binding.contentLayout.root.layout(+                startPosition.left, startPosition.top, startPosition.right,+                startPosition.bottom+            )++            val endPosition = splitPositions[1]+            val endWidthSpec = View.MeasureSpec.makeMeasureSpec(+                endPosition.width(),+                View.MeasureSpec.EXACTLY+            )+            val endHeightSpec = View.MeasureSpec.makeMeasureSpec(+                endPosition.height(),+                View.MeasureSpec.EXACTLY+            )+            binding.controlLayout.root.measure(endWidthSpec, endHeightSpec)+            binding.controlLayout.root.layout(+                endPosition.left, endPosition.top, endPosition.right,+                endPosition.bottom+            )+        }+    }++    /**+     * Get the position of the split for this view.+     * @return A rect that defines of split, or {@code null} if there is no split.+     */+    private fun splitViewPositions(+        startView: View?,+        endView: View?,+        windowLayoutInfo: WindowLayoutInfo+    ): Array<Rect>? {+        if (startView == null || endView == null) {+            return null+        }++        // Calculate the area for view's content with padding+        val paddedWidth = binding.root.width - binding.root.paddingLeft - binding.root.paddingRight+        val paddedHeight =+            binding.root.height - binding.root.paddingTop - binding.root.paddingBottom++        for (feature in windowLayoutInfo.displayFeatures) {+            // Only a hinge or a fold can split the area in two+            if (feature.type != DisplayFeature.TYPE_FOLD && feature.type != DisplayFeature.TYPE_HINGE) {+                continue+            }++            val splitRect = getFeaturePositionInViewRect(feature, binding.root) ?: continue++            if (feature.bounds.left == 0) { // Horizontal layout+                val topRect = Rect(+                    startView.paddingLeft,+                    startView.paddingTop,+                    startView.paddingLeft + paddedWidth,+                    splitRect.top+                )+                val bottomRect = Rect(+                    endView.paddingLeft, splitRect.bottom,+                    endView.paddingLeft + paddedWidth,+                    endView.paddingTop + paddedHeight+                )++                if (measureAndCheckMinSize(topRect, startView) &&+                    measureAndCheckMinSize(bottomRect, endView)+                ) {+                    return arrayOf(topRect, bottomRect)+                }+            } else if (feature.bounds.top == 0) { // Vertical layout+                val leftRect = Rect(+                    startView.paddingLeft,+                    startView.paddingTop,+                    splitRect.left,+                    startView.paddingTop + paddedHeight+                )+                val rightRect = Rect(+                    splitRect.right,+                    endView.paddingTop,+                    endView.paddingLeft + paddedWidth,+                    endView.paddingTop + paddedHeight+                )++                if (measureAndCheckMinSize(leftRect, startView) &&+                    measureAndCheckMinSize(rightRect, endView)+                ) {+                    return arrayOf(leftRect, rightRect)+                }+            }+        }++        return null+    }++    /**+     * Measure a child view and see it if will fit in the provided rect.+     * <p>Note: This method calls [View.measure] on the child view, which updates+     * its stored values for measured with and height. If the view will end up with different+     * values, it should be measured again.+     */+    private fun measureAndCheckMinSize(rect: Rect, childView: View): Boolean {+        val widthSpec = View.MeasureSpec.makeMeasureSpec(rect.width(), View.MeasureSpec.AT_MOST)+        val heightSpec = View.MeasureSpec.makeMeasureSpec(rect.height(), View.MeasureSpec.AT_MOST)+        childView.measure(widthSpec, heightSpec)

Ditto about about measuring/layout child.

kford55

comment created time in 11 days

Pull request review commentandroid/user-interface-samples

Initial creation of new Jetpack Window Manager Sample

+<?xml version="1.0" encoding="utf-8"?>

copyright and xml decl

kford55

comment created time in 11 days

Pull request review commentandroid/user-interface-samples

Initial creation of new Jetpack Window Manager Sample

+<?xml version="1.0" encoding="utf-8"?>+<!--+  Copyright 2020 The Android Open Source Project++  Licensed under the Apache License, Version 2.0 (the "License");+  you may not use this file except in compliance with the License.+  You may obtain a copy of the License at++       http://www.apache.org/licenses/LICENSE-2.0++  Unless required by applicable law or agreed to in writing, software+  distributed under the License is distributed on an "AS IS" BASIS,+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+  See the License for the specific language governing permissions and+  limitations under the License.+  -->++<androidx.constraintlayout.widget.ConstraintLayout+    xmlns:android="http://schemas.android.com/apk/res/android"+    xmlns:tools="http://schemas.android.com/tools"+    android:layout_width="match_parent"+    android:layout_height="match_parent"+    android:padding="5dp"

grid

kford55

comment created time in 11 days

Pull request review commentandroid/user-interface-samples

Initial creation of new Jetpack Window Manager Sample

+<!--+  Copyright 2020 The Android Open Source Project++  Licensed under the Apache License, Version 2.0 (the "License");+  you may not use this file except in compliance with the License.+  You may obtain a copy of the License at++       http://www.apache.org/licenses/LICENSE-2.0++  Unless required by applicable law or agreed to in writing, software+  distributed under the License is distributed on an "AS IS" BASIS,+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.+  See the License for the specific language governing permissions and+  limitations under the License.+  -->++<vector android:height="320dp" android:tint="#3DDC84"

reformat this file

kford55

comment created time in 11 days

more