/*
|
* Copyright (c) 2010-2019 Belledonne Communications SARL.
|
*
|
* This file is part of linphone-android
|
* (see https://www.linphone.org).
|
*
|
* This program is free software: you can redistribute it and/or modify
|
* it under the terms of the GNU General Public License as published by
|
* the Free Software Foundation, either version 3 of the License, or
|
* (at your option) any later version.
|
*
|
* This program is distributed in the hope that it will be useful,
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* GNU General Public License for more details.
|
*
|
* You should have received a copy of the GNU General Public License
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
*/
|
package org.linphone.utils;
|
|
import android.app.Dialog;
|
import android.content.ComponentName;
|
import android.content.Context;
|
import android.content.Intent;
|
import android.content.pm.PackageManager;
|
import android.content.pm.ResolveInfo;
|
import android.graphics.drawable.ColorDrawable;
|
import android.graphics.drawable.Drawable;
|
import android.net.Uri;
|
import android.view.View;
|
import android.view.Window;
|
import android.view.WindowManager;
|
import android.widget.Button;
|
import android.widget.CheckBox;
|
import android.widget.TextView;
|
import androidx.core.content.ContextCompat;
|
import java.util.List;
|
import org.linphone.R;
|
import org.linphone.compatibility.Compatibility;
|
import org.linphone.core.tools.Log;
|
import org.linphone.settings.LinphonePreferences;
|
|
public class DeviceUtils {
|
private static final Intent[] POWERMANAGER_INTENTS = {
|
new Intent()
|
.setComponent(
|
new ComponentName(
|
"com.miui.securitycenter",
|
"com.miui.permcenter.autostart.AutoStartManagementActivity")),
|
new Intent()
|
.setComponent(
|
new ComponentName(
|
"com.letv.android.letvsafe",
|
"com.letv.android.letvsafe.AutobootManageActivity")),
|
new Intent()
|
.setComponent(
|
new ComponentName(
|
"com.huawei.systemmanager",
|
"com.huawei.systemmanager.appcontrol.activity.StartupAppControlActivity")),
|
new Intent()
|
.setComponent(
|
new ComponentName(
|
"com.huawei.systemmanager",
|
"com.huawei.systemmanager.optimize.process.ProtectActivity")),
|
new Intent()
|
.setComponent(
|
new ComponentName(
|
"com.coloros.safecenter",
|
"com.coloros.safecenter.permission.startup.StartupAppListActivity")),
|
new Intent()
|
.setComponent(
|
new ComponentName(
|
"com.coloros.safecenter",
|
"com.coloros.safecenter.startupapp.StartupAppListActivity")),
|
new Intent()
|
.setComponent(
|
new ComponentName(
|
"com.oppo.safe",
|
"com.oppo.safe.permission.startup.StartupAppListActivity")),
|
new Intent()
|
.setComponent(
|
new ComponentName(
|
"com.iqoo.secure",
|
"com.iqoo.secure.ui.phoneoptimize.AddWhiteListActivity")),
|
new Intent()
|
.setComponent(
|
new ComponentName(
|
"com.iqoo.secure",
|
"com.iqoo.secure.ui.phoneoptimize.BgStartUpManager")),
|
new Intent()
|
.setComponent(
|
new ComponentName(
|
"com.vivo.permissionmanager",
|
"com.vivo.permissionmanager.activity.BgStartUpManagerActivity")),
|
new Intent()
|
.setComponent(
|
new ComponentName(
|
"com.samsung.android.lool",
|
"com.samsung.android.sm.ui.battery.BatteryActivity")),
|
new Intent()
|
.setComponent(
|
new ComponentName(
|
"com.htc.pitroad",
|
"com.htc.pitroad.landingpage.activity.LandingPageActivity")),
|
new Intent()
|
.setComponent(
|
new ComponentName(
|
"com.asus.mobilemanager", "com.asus.mobilemanager.MainActivity")),
|
new Intent()
|
.setComponent(
|
new ComponentName(
|
"com.asus.mobilemanager",
|
"com.asus.mobilemanager.autostart.AutoStartActivity")),
|
new Intent()
|
.setComponent(
|
new ComponentName(
|
"com.asus.mobilemanager",
|
"com.asus.mobilemanager.entry.FunctionActivity"))
|
.setData(Uri.parse("mobilemanager://function/entry/AutoStart")),
|
new Intent()
|
.setComponent(
|
new ComponentName(
|
"com.dewav.dwappmanager",
|
"com.dewav.dwappmanager.memory.SmartClearupWhiteList"))
|
};
|
|
public static Intent getDevicePowerManagerIntent(Context context) {
|
for (Intent intent : POWERMANAGER_INTENTS) {
|
if (DeviceUtils.isIntentCallable(context, intent)) {
|
return intent;
|
}
|
}
|
return null;
|
}
|
|
public static boolean hasDevicePowerManager(Context context) {
|
return getDevicePowerManagerIntent(context) != null;
|
}
|
|
public static boolean isAppUserRestricted(Context context) {
|
return Compatibility.isAppUserRestricted(context);
|
}
|
|
public static int getAppStandbyBucket(Context context) {
|
return Compatibility.getAppStandbyBucket(context);
|
}
|
|
public static void displayDialogIfDeviceHasPowerManagerThatCouldPreventPushNotifications(
|
final Context context) {
|
for (final Intent intent : POWERMANAGER_INTENTS) {
|
if (DeviceUtils.isIntentCallable(context, intent)) {
|
Log.w(
|
"[Hacks] ",
|
android.os.Build.MANUFACTURER,
|
" device with power saver detected: ",
|
intent.getComponent().getClassName());
|
if (!LinphonePreferences.instance().hasPowerSaverDialogBeenPrompted()) {
|
Log.w("[Hacks] Asking power saver for whitelist !");
|
|
final Dialog dialog = new Dialog(context);
|
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
|
Drawable d =
|
new ColorDrawable(
|
ContextCompat.getColor(context, R.color.dark_grey_color));
|
d.setAlpha(200);
|
dialog.setContentView(R.layout.dialog);
|
dialog.getWindow()
|
.setLayout(
|
WindowManager.LayoutParams.MATCH_PARENT,
|
WindowManager.LayoutParams.MATCH_PARENT);
|
dialog.getWindow().setBackgroundDrawable(d);
|
|
TextView customText = dialog.findViewById(R.id.dialog_message);
|
customText.setText(R.string.device_power_saver_dialog_message);
|
|
TextView customTitle = dialog.findViewById(R.id.dialog_title);
|
customTitle.setText(R.string.device_power_saver_dialog_title);
|
|
dialog.findViewById(R.id.dialog_do_not_ask_again_layout)
|
.setVisibility(View.VISIBLE);
|
final CheckBox doNotAskAgain = dialog.findViewById(R.id.doNotAskAgain);
|
dialog.findViewById(R.id.doNotAskAgainLabel)
|
.setOnClickListener(
|
new View.OnClickListener() {
|
@Override
|
public void onClick(View v) {
|
doNotAskAgain.setChecked(!doNotAskAgain.isChecked());
|
}
|
});
|
|
Button accept = dialog.findViewById(R.id.dialog_ok_button);
|
accept.setVisibility(View.VISIBLE);
|
accept.setText(R.string.device_power_saver_dialog_button_go_to_settings);
|
accept.setOnClickListener(
|
new View.OnClickListener() {
|
@Override
|
public void onClick(View v) {
|
Log.w(
|
"[Hacks] Power saver detected, user is going to settings :)");
|
// If user is going into the settings,
|
// assume it will make the change so don't prompt again
|
LinphonePreferences.instance().powerSaverDialogPrompted(true);
|
|
try {
|
context.startActivity(intent);
|
} catch (SecurityException se) {
|
Log.e(
|
"[Hacks] Couldn't start intent [",
|
intent.getComponent().getClassName(),
|
"], security exception was thrown: ",
|
se);
|
}
|
dialog.dismiss();
|
}
|
});
|
|
Button cancel = dialog.findViewById(R.id.dialog_cancel_button);
|
cancel.setText(R.string.device_power_saver_dialog_button_later);
|
cancel.setOnClickListener(
|
new View.OnClickListener() {
|
@Override
|
public void onClick(View v) {
|
Log.w(
|
"[Hacks] Power saver detected, user didn't go to settings :(");
|
if (doNotAskAgain.isChecked()) {
|
LinphonePreferences.instance()
|
.powerSaverDialogPrompted(true);
|
}
|
dialog.dismiss();
|
}
|
});
|
|
Button delete = dialog.findViewById(R.id.dialog_delete_button);
|
delete.setVisibility(View.GONE);
|
|
dialog.show();
|
}
|
}
|
}
|
}
|
|
private static boolean isIntentCallable(Context context, Intent intent) {
|
List<ResolveInfo> list =
|
context.getPackageManager()
|
.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
|
return list.size() > 0;
|
}
|
}
|