# Don't rename anything, it makes stack traces unintelligible. We only allow the
# obfuscation pass to run so that we can discard attributes like local variable
# tables. However, we don't want to lose out on optimizations, so although they
# can occasionally make the stack trace a bit stranger with inlining, it won't
# make a big difference for the users seeing the stacktraces. We can always use
# build/android/stacktrace/java_deobfuscate.py to fix the stacktrace up for us.
-keepnames,allowoptimization class *** { *; }

-keepclassmembers class org.chromium.android_webview.AwPdfExporter {
    android.view.ViewGroup mContainerView;
}

# Keep the factory and its public members; it's the main entry point used by the
# framework.
-keep class com.android.webview.chromium.WebViewChromiumFactoryProvider {
    public *;
}

-keep class com.android.webview.chromium.ContentSettingsAdapter {
    public *;
}

-keep class com.android.webview.chromium.WebViewChromiumFactoryProviderFor* {
    public *;
}

-keep class com.android.webview.chromium.WebViewDatabaseAdapter {
  public *;
}

# This is the main entry point for APIs. It is kept to make developing with
# unreleased Android easier.
-keep class com.android.webview.chromium.WebViewChromium {
  public *;
}

# Linker dynamically casts to $TestRunner when running tests. We don't run these
# tests in WebView.
-dontnote org.chromium.base.library_loader.Linker$TestRunner

# Don't note about the API 21 compatibility code which references various
# hidden APIs via reflection.
-dontnote com.android.webview.chromium.WebViewDelegateFactory$Api21CompatibilityDelegate

# DefaultAndroidKeyStore uses reflection to access internal OpenSSL state.
-dontnote org.chromium.net.DefaultAndroidKeyStore

# MediaPlayerBridge uses reflection to access internal metadata.
-dontnote org.chromium.media.MediaPlayerBridge

# ProxyChangeListener$ProxyReceiver uses reflection to access internal
# android.net.ProxyProperties.
-dontnote org.chromium.net.ProxyChangeListener$ProxyReceiver

# Silence warnings about reflection used to check for onShow/HideCustomView.
# This class is not really kept since it's in a library jar.
-keep class android.webkit.WebChromeClient {
  void onShowCustomView(...);
  void onHideCustomView();
}

-keep class org.chromium.android_webview.AwBrowserProcess {
    java.nio.channels.FileLock sExclusiveFileLock;
}

# Accessed via reflection but not present in all builds
-keep class com.android.webview.chromium.PlatformServiceBridgeGoogle {
  void setMetricsSettingListener(...);
  PlatformServiceBridgeGoogle(...);
}
-dontnote com.android.webview.chromium.PlatformServiceBridgeGoogle
-keep class com.android.webview.chromium.AwSafeBrowsingApiHandler {
  AwSafeBrowsingApiHandler(...);
}
-dontnote com.android.webview.chromium.AwSafeBrowsingApiHandler

#TODO(hush): remove after N release. crbug.com/546762
-keep class com.android.webview.chromium.ContentSettingsAdapter {
  public void setDisabledActionModeMenuItems(int);
  public int getDisabledActionModeMenuItems();
}

# We strip some unused resources when preprocessing the GMS client libs.
-dontwarn com.google.android.gms.R**
