/*
- * Copyright © 2016-2017 Soren Stoutner <soren@stoutner.com>.
+ * Copyright © 2016-2018 Soren Stoutner <soren@stoutner.com>.
*
* This file is part of Privacy Browser <https://www.stoutner.com/privacy-browser>.
*
package com.stoutner.privacybrowser.helpers;
+import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
// Use reflection to apply the new proxy values.
try {
Class applicationClass = Class.forName("android.app.Application");
- Field mLoadedApkField = applicationClass.getDeclaredField("mLoadedApk");
- // `setAccessible(true)` allows us to change the value of `mLoadedApkField`.
+
+ // Suppress the lint warning that `mLoadedApk` cannot be resolved.
+ @SuppressWarnings("JavaReflectionMemberAccess") Field mLoadedApkField = applicationClass.getDeclaredField("mLoadedApk");
+
+ // `setAccessible(true)` allows the value of `mLoadedApkField` to be changed..
mLoadedApkField.setAccessible(true);
Object mLoadedApkObject = mLoadedApkField.get(privacyBrowserContext);
- Class loadedApkClass = Class.forName("android.app.LoadedApk");
+ // Suppress the lint warning that reflection may not alwasy work in the future and on all devices.
+ @SuppressLint("PrivateApi") Class loadedApkClass = Class.forName("android.app.LoadedApk");
Field mReceiversField = loadedApkClass.getDeclaredField("mReceivers");
- // `setAccessible(true)` allows us to change the value of `mReceiversField`.
+
+ // `setAccessible(true)` allows the value of `mReceiversField` to be changed.
mReceiversField.setAccessible(true);
ArrayMap receivers = (ArrayMap) mReceiversField.get(mLoadedApkObject);
for (Object receiverMap : receivers.values()) {
for (Object receiver : ((ArrayMap) receiverMap).keySet()) {
- // We have to use `Class<?>`, which is an `unbounded wildcard parameterized type`, instead of `Class`, which is a `raw type`, or `receiveClass.getDeclaredMethod` below will produce an error.
+ // `Class<?>`, which is an `unbounded wildcard parameterized type`, must be used instead of `Class`, which is a `raw type`.
+ // Otherwise, `receiveClass.getDeclaredMethod` below will produce an error.
Class<?> receiverClass = receiver.getClass();
if (receiverClass.getName().contains("ProxyChangeListener")) {
Method onReceiveMethod = receiverClass.getDeclaredMethod("onReceive", Context.class, Intent.class);
dialogBuilder.setMessage(R.string.orbot_proxy_not_installed);
// Set the positive button.
- dialogBuilder.setPositiveButton(R.string.close, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- // Do nothing. The `AlertDialog` will close automatically.
- }
+ dialogBuilder.setPositiveButton(R.string.close, (DialogInterface dialog, int which) -> {
+ // Do nothing. The `AlertDialog` will close automatically.
});
// Convert `dialogBuilder` to `alertDialog`.