== How to fix it in Android

=== Code examples

include::../../common/fix/code-rationale.adoc[]

==== Noncompliant code example

[source,java,diff-id=1,diff-type=noncompliant]
----
public class Noncompliant extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Intent intent = getIntent();
        Intent forward = (Intent) intent.getParcelableExtra("anotherintent");
        startActivity(forward); // Noncompliant
    }
}
----

==== Compliant solution

[source,java,diff-id=1,diff-type=compliant]
----
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent intent = getIntent();
        Intent forward = (Intent) intent.getParcelableExtra("anotherintent");

        ComponentName name = forward.resolveActivity(getPackageManager());
        if (name.getPackageName().equals("safePackage") &&
                name.getClassName().equals("safeClass")) {
            startActivity(forward);
        }
    }
}
----

=== How does this work?

include::../../common/fix/introduction.adoc[]

include::../../common/fix/destination.adoc[]

The example compliant code uses the `resolveActivity` method of the inner intent
to determine its target component. It then uses the `getPackageName` and
`getClassName` methods to validate this destination is not sensitive.

include::../../common/fix/origin.adoc[]

include::../../common/fix/permissions.adoc[]
