/* * Copyright (c) 2017-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ package codetoanalyze.java.checkers; import android.app.Activity; import android.content.Context; import android.content.res.AssetManager; import android.content.res.Configuration; import android.content.res.Resources; import android.os.IBinder; import android.os.IInterface; import android.util.DisplayMetrics; import android.view.View; import javax.annotation.concurrent.ThreadSafe; // aidl generated classes implementing this interface are automatically threadsafe interface AidlInterface extends IInterface {} class MyActivity extends Activity {} class MyResources extends Resources { public MyResources(AssetManager assets, DisplayMetrics metrics, Configuration config) { super(assets, metrics, config); } } class MyView extends View { boolean mField; public MyView(Context c) { super(c); } } @ThreadSafe public class AndroidModels { Resources mResources; MyResources mMyResources; Object mField; // assume that some Resources methods are annotated with @Functional public void resourceMethodFunctionalOk() { mField = mResources.getString(0); } // and subclasses of Resources too public void customResourceMethodFunctionalOk() { mField = mResources.getString(0); } // but not all of them public void someResourceMethodsNotFunctionalBad() { // configuration can change whenever the device rotates mField = mResources.getConfiguration(); } public void findViewByIdOk1(MyView view) { MyView subview = (MyView) view.findViewById(-1); subview.mField = true; // ok; } public void findViewByIdOk2(MyActivity activity) { MyView view = (MyView) activity.findViewById(-1); view.mField = true; // ok; } public IBinder safeByDefaultInterfaceCallOk(AidlInterface i) { return i.asBinder(); } }