/* * Copyright (c) 2012-2016 Arne Schwabe * Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt */ package de.blinkt.openvpn.core; import android.annotation.TargetApi; import android.app.Application; import android.app.NotificationChannel; import android.app.NotificationManager; import android.content.Context; import android.content.res.Configuration; import android.graphics.Color; import android.os.Build; import android.os.StrictMode; import android.os.strictmode.Violation; import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; import java.util.concurrent.Executors; import de.blinkt.openvpn.BuildConfig; import de.blinkt.openvpn.R; import de.blinkt.openvpn.api.AppRestrictions; public class ICSOpenVPNApplication extends Application { private StatusListener mStatus; @Override public void onCreate() { if (BuildConfig.BUILD_TYPE.equals("debug")) enableStrictModes(); if("robolectric".equals(Build.FINGERPRINT)) return; LocaleHelper.setDesiredLocale(this); super.onCreate(); PRNGFixes.apply(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) createNotificationChannels(); mStatus = new StatusListener(); mStatus.init(getApplicationContext()); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { AppRestrictions.getInstance(this).checkRestrictions(this); } } @Override protected void attachBaseContext(Context base) { super.attachBaseContext(LocaleHelper.updateResources(base)); } private void enableStrictModes() { StrictMode.ThreadPolicy.Builder tpbuilder = new StrictMode.ThreadPolicy.Builder() .detectAll() .penaltyLog(); StrictMode.VmPolicy.Builder vpbuilder = new StrictMode.VmPolicy.Builder() .detectAll() .penaltyLog(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { tpbuilder.penaltyListener(Executors.newSingleThreadExecutor(), this::logViolation); vpbuilder.penaltyListener(Executors.newSingleThreadExecutor(), this::logViolation); } //tpbuilder.penaltyDeath(); //vpbuilder.penaltyDeath(); StrictMode.VmPolicy policy = vpbuilder.build(); StrictMode.setVmPolicy(policy); } @Override public void onConfigurationChanged(@NonNull Configuration newConfig) { super.onConfigurationChanged(newConfig); LocaleHelper.onConfigurationChange(this); } @RequiresApi(api = Build.VERSION_CODES.P) public void logViolation(Violation v) { String name = Application.getProcessName(); System.err.println("------------------------- Violation detected in " + name + " ------" + v.getCause() + "---------------------------"); VpnStatus.logException(VpnStatus.LogLevel.DEBUG, null, v); } @TargetApi(Build.VERSION_CODES.O) private void createNotificationChannels() { NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); // Background message CharSequence name = getString(R.string.channel_name_background); NotificationChannel mChannel = new NotificationChannel(OpenVPNService.NOTIFICATION_CHANNEL_BG_ID, name, NotificationManager.IMPORTANCE_MIN); mChannel.setDescription(getString(R.string.channel_description_background)); mChannel.enableLights(false); mChannel.setLightColor(Color.DKGRAY); mNotificationManager.createNotificationChannel(mChannel); // Connection status change messages name = getString(R.string.channel_name_status); mChannel = new NotificationChannel(OpenVPNService.NOTIFICATION_CHANNEL_NEWSTATUS_ID, name, NotificationManager.IMPORTANCE_LOW); mChannel.setDescription(getString(R.string.channel_description_status)); mChannel.enableLights(true); mChannel.setLightColor(Color.BLUE); mNotificationManager.createNotificationChannel(mChannel); // Urgent requests, e.g. two factor auth name = getString(R.string.channel_name_userreq); mChannel = new NotificationChannel(OpenVPNService.NOTIFICATION_CHANNEL_USERREQ_ID, name, NotificationManager.IMPORTANCE_HIGH); mChannel.setDescription(getString(R.string.channel_description_userreq)); mChannel.enableVibration(true); mChannel.setLightColor(Color.CYAN); mNotificationManager.createNotificationChannel(mChannel); } }