Office Hours Transcript: 2021-07-13

Kai_H joined

Hello

hello, Kai!

I noticed Kotlin has a lot of functionality like "list.last" and "val thirdChar = string[4]", compared to Java. Does something in Kotlin make it easier to implement those or did the authors of the language and stdtlib just take the timer?

"just take the timer"?

tldr: Kotlin has a lot of small convenience that Java lacks. How come?

Take the time, make the effort.

ah, OK

in the case of string[4], the answer is that Kotlin has first-class support for defining implementations of operators, and [] and []= are considered operators

[] maps to get() and []= maps to put()

I have not paid much attention to newer versions of Java (e.g., java 15) to see if they have added anything similar

They have added a lot and made it more similar to Kotlin in a lot of regards, but I think a lot is still missing. And I wondered how come that Kotlin has so much "convenience" and how much effort that was.

As I mostly program Java but learned Kotlin on the side I find msyself thinking quite often "this would be easier in Kotlin, I would just do <…> and use <…>".

I cannot really answer to the motivations of either the Java or the Kotlin teams

(BTW, hello Tad – I will be with you shortly!)

ok!

I know that the Kotlin team made a concerted effort to implement as much of Kotlin in Kotlin as possible

so, a lot of the relatively obscure stuff in Kotlin syntax (e.g., tailrec) are there more for the developers of Kotlin than they are ordinary developers like us

and, Kotlin has the benefits of an additional 20 years of advancement in software development to lean on

And less cruft to work around, less old decisitions.

yeah, stuff like that

anyway, let me take a question from Tad, and I can come back to you in a bit

Hi Mark - I’ve got a question related to some Espresso tests, is that something you can help with?

Well, ok - but the problem is that the launch activity is never called in the latter case with scenarioRule.

So - advance it to what?

in the above link, see the block of code, specifically the first "After:" section

you get your scenario from your rule by getScenario(), rather than needing a manual launch() call

but I think you still need to wrap your checks in onActivity()

I actually had originally written this with .launch(), and it failed in the same way

But I’ll review and try

right, with ActivityScenarioRule I do not think you need that, but you still need onActivity()

think of the activity launch as being lazy and asynchronous

you can’t run the tests until the activity is ready to be tested

Sorry - I mean I originally wasn’t using a rule, I was getting the scenario in @Before and doing the launch

oh, OK

Thanks for the link though. I have another question when it’s my turn again

ok

Kai: back to you! do you have another question?

gotta remember the @ here… @Kai: back to you! do you have another question?

I have nothing like Crashlytics or Firebas in my app, only the normal reporting that comes with the Play Console. I wondering if I should have something like that. What do you think?

personally, I would use something beyond the Play Store, but that’s an opinion

(which is what I’m asking for :) )

The Play Store usually offers very little information about crashes and such, so I wondered and wanted your opinion.

@Kai - fwiw I’m using Crashlytics/Firebase, and it does give some more details.

with a lot of API questions, I can fall back on concrete rationale; with app distribution concerns like "what should I use for crash logging?", my reaction is far more of ¯\_(ツ)_/¯, because my background there is very atypical

But I can also tell you that I know some folks at Twitter, and at least as of a year or so ago they were not using it - they were using home-grown stuff (larger, highly technical and advanced dev team though).

Well, we have a dev team of 1, so… ;-)

But thanks for the opinions

@Kai: let me take another question from Tad, and I will be back with you in a bit

Sure - this is a pretty strange one I think. Also related to Espresso stuff.

They recently updated a number of their libraries, also JUnit dependencies.

So I updated my gradle dependency as normal

All of a sudden, my .aab file gained weight - ~7MB.

I did some painful (one at a time, backing up to the prior version) of all the new dependency versions.

Turns out from that exercise it was espresso-contrib

My question: although my sleuthing did in fact point directly to this as a problem, I find it hard to believe.

Is there anything I could be doing that would introduce a dependency to include the jdk11 source?

nothing that I can think of

your test, though, seems to be based on your regular app – have you tried creating a scrap project and seeing if you reproduce your espresso-contrib findings there?

Have not.

I’m sure they will ask for it though - I filed an issue with the androidx.test team

right, that’s kinda where I was heading

But I have to have it in the regular app because I’m using idlingResource

certainly, but unless your regular app is open source, that doesn’t help the androidx.test team

So a test won’t start until my splash activity launches the "main" activity and it makes it through the onResume() stuff.

yes understood

and if the problem is tied to some combination of effects – the espresso-contrib plus something else in your regular app’s setup – they may have difficulty reproducing the problem

ok I have one more when it’s back to me

@Kai: over to you! do you have another question?

Yes, another great and easy one: What’s advice that you would give someone that wants to be an Android freelander? :D

do you mean "freelancer"?

Yes

(Item 1: Learn to type…) ;-)

how are you defining "freelancer"? do you mean somebody who is working contracts in general? or do you mean somebody who only does short-term projects?

More the first.

Even though it would probably mean the second one too.

make sure you have clear "proof of ability" (e.g., portfolio of open source work that you’re happy with), and make sure that you have access to all necessary stuff that you ordinarily get from employers (e.g., in the US, health insurance)

@Kai, @Tad: free-for-all time! if you have any questions, just fire 'em off and I’ll field them as best I can!

OK here is one

So in my pre-launch report for my app on Open Beta I see 20 warnings being reported having to do with a "StrictMode policy violation", example:

StrictMode policy violation: android.os.strictmode.NonSdkApiUsedViolation: Landroid/graphics/FontFamily;->abortCreation()V
at android.os.StrictMode.lambda $static$1(StrictMode.java:428)
at android.os.-Lambda $StrictMode$lu9ekkHJ2HMz0jd3F8K8MnhenxQ.accept(Unknown Source:2)
at java.lang.Class.getDeclaredMethodInternal(Native Method)
at java.lang.Class.getPublicMethodRecursive(Class.java:2075)
at java.lang.Class.getMethod(Class.java:2063)
at java.lang.Class.getMethod(Class.java:1690)
at androidx.core.graphics.TypefaceCompatApi26Impl.obtainAbortCreationMethod(TypefaceCompatApi26Impl.java:343)
at androidx.core.graphics.TypefaceCompatApi26Impl.<init>(TypefaceCompatApi26Impl.java:88)
at androidx.core.graphics.TypefaceCompatApi28Impl.<init>(TypefaceCompatApi28Impl.java:36)
at androidx.core.graphics.TypefaceCompat.<clinit>(TypefaceCompat.java:53)
at androidx.core.graphics.TypefaceCompat.create(Unknown Source:0)
at androidx.appcompat.widget.AppCompatTextView.setTypeface(AppCompatTextView.java:718)
at android.widget.TextView.resolveStyleAndSetTypeface(TextView.java:2037)
at android.widget.TextView.setTypefaceFromAttrs(TextView.java:2008)
at android.widget.TextView.applyTextAppearance(TextView.java:3640)
at android.widget.TextView.<init>(TextView.java:1498)
at android.widget.TextView.<init>(TextView.java:869)
at androidx.appcompat.widget.AppCompatTextView.<init>(AppCompatTextView.java:102)
at androidx.appcompat.widget.AppCompatTextView.<init>(AppCompatTextView.java:97)
at java.lang.reflect.Constructor.newInstance0(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
at android.view.LayoutInflater.createView(LayoutInflater.java:647)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:790)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:699)
at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:195)
at com.reddragon.intouch.ui.SplashActivity.onCreate(SplashActivity.java:96)

And the layout it is complaining about

<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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.SplashActivity">

<androidx.constraintlayout.widget.Guideline
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/horizontalGuideline"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.5" />

<androidx.appcompat.widget.AppCompatTextView
android:layout_width="match_parent"
android:layout_height="0dp"
android:text="@string/app_initializing"
android:textStyle="italic"
android:textColor="@color/white"
android:gravity="center_horizontal|bottom"
app:autoSizeMaxTextSize="48sp"
app:autoSizeMinTextSize="16sp"
app:autoSizeStepGranularity="1sp"
app:autoSizeTextType="uniform"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toTopOf="@+id/horizontalGuideline"
app:layout_constraintEnd_toEndOf="parent"/>

<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/stageTextView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:textStyle="italic"
android:textColor="@color/colorAccent"
android:gravity="center_horizontal"
app:autoSizeMaxTextSize="24sp"
app:autoSizeMinTextSize="12sp"
app:autoSizeStepGranularity="1sp"
app:autoSizeTextType="uniform"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/horizontalGuideline"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>


</androidx.constraintlayout.widget.ConstraintLayout>

Is this anything I need to worry about? How do I "fix" it?

in this case:

• one Google team is using an undocumented API
• another Google team declared that API off-limits
• yet another Google team isn’t filtering this sort of problem out of their reports

OK - so as I suspected, it’s out of my control, it’s only a warning, so don’t lose any sleep over it, right?

Is this anything I need to worry about?

In terms of this specific one, no. A Google library is having problems with a Google-developed framework. There isn’t much you can do, other than to keep up with updates to AppCompat and related libraries.

a NonSdkApiUsedViolation coming from a third-party library is the responsibility of the developers of that library, not you

so, other than perhaps filing an issue if there isn’t one out there already, there is not much for you to do

Which team should get this issue? Or do I just file a general bug?

(i.e. using the frown face in the IDE)

this one probably goes to https://issuetracker.google.com, against either AndroidX Core (if that exists as a category) or AndroidX AppCompat

ok

that’s a wrap for today’s chat

Thanks Mark!

the next one is Thursday in the 7:30pm US Eastern time slot

have a pleasant day!

Thanks for your time. Have a good time and stay healthy.