На связи снова Алексей который спешит уже с техническими подробностями проекта) В этой части узнаем как работают триггеры в приложении и поговорим о проблемах Google Play! Данная часть будет больше предыдущей так что берите напиток по погоде и погружайтесь в статью!

Под капотом

Как я писал раньше - в ранних версиях был один основной триггер - ярлык обманка. В чем же его суть? Пользователь сам задает иконку и название ярлыка под которое он маскируется, а в последних версиях открывает приложение с заданным именем пакета! Ниже на скриншотах вы можете посмотреть как делается ярлык вайбера.

Скриншоты
Главный экран
Выбор иконки
Какой пакет выбирать
Готовый ярлык

Все значения сохраняются в преференсы, лично я для быстрого доступа использую TinyDB, а для выбора файлов в приложении FilePicker. После добавления ярлыка с помощью вот такого кода:

Код
  public void addcustomshrt(View view){
        String iconpath = tinydb.getString("icon");
        String nameoftag = tinydb.getString("label");
        File check = new File(iconpath);
        if (check.exists() && !check.isDirectory()){

            Bitmap bitmap = BitmapFactory.decodeFile(iconpath);
            if (ShortcutManagerCompat.isRequestPinShortcutSupported(ShortcutSettings.this))
            {
                ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(ShortcutSettings.this, "#1")
                        .setIntent(new Intent(getApplicationContext(), ShortcutLaunch.class).setAction(Intent.ACTION_MAIN))
                        .setShortLabel(nameoftag)
                        .setIcon(IconCompat.createWithBitmap(bitmap))
                        .build();
                ShortcutManagerCompat.requestPinShortcut(ShortcutSettings.this, shortcutInfo, null);
            }
            tinydb.putBoolean("short",true);
        }else{
            new AndExAlertDialog.Builder(this)
                    .setTitle(getResources().getString(R.string.error))
                    .setMessage(getResources().getString(R.string.short1))
                    .setPositiveBtnText("Ok")
                    .setCancelableOnTouchOutside(false)
                    .OnPositiveClicked(new AndExAlertDialogListener() {
                        @Override
                        public void OnClick(String input) {
                            final String rootPath = Environment.getExternalStorageDirectory().getAbsolutePath();
                            showListItemDialog("Select png, jpg, ico file", rootPath, FILE_ONLY_DIRECT_CHOICE_IMMEDIATE, PICK_DIALOG);
                        }
                    })
                    .build();

        }}
Объяснение

В этой строке мы говорим что наш ярлык открывает нужную активити которая и запускает наш заранее введенный пакет приложения:

.setIntent(new Intent(getApplicationContext(), ShortcutLaunch.class).setAction(Intent.ACTION_MAIN))
public void openapp(){
        tinydb = new TinyDB(this);
        if( tinydb.getString("apppkg").length()>3){
            Intent launchIntent = getPackageManager().getLaunchIntentForPackage(tinydb.getString("apppkg"));
            if (launchIntent != null){
                startActivity( launchIntent );
            }
        }

        finish();

    }

После чего с помощью метода finish(); приложение остаётся незаметным глазу ведь сразу закрывается, а поверх открывается выбранное

Как запускаются действия?

Тут была мини война с гуглом и miui. Если с первой можно было справиться с помощью сервиса в фоне, то миюай просто рубит автозапуск. Пришлось просто просить пользователя что бы он вручную включил эту злополучную галочку..

Есть основной сервис который запускается с помощью триггера, триггер передает какой именно сценарий применить через extra. После чего проверяется список действий и соответственно запускаются

Код запуска
Intent intent = new Intent(this, StartActions.class);
        intent.putExtra("from","shortcut");
        startService(intent);
Код обработки
if (from.equals("shortcut")){ List<String> actions = tinydb.getListString("shortactions");
            for (int i =0;i<actions.size();i++){
                if (actions.get(i).equals("Delete Apps")){try {deleteapps(clean,root,list); }catch (IOException e){e.printStackTrace();}}
                if (actions.get(i).equals("Delete files")){startdelete(list2);}
                if (actions.get(i).equals("Crypt folders")){try{ startcrypter();} catch (Exception e){e.printStackTrace();}}
                if (actions.get(i).equals("Send Sms")){sendsms(list4,msg);}
                if (actions.get(i).equals("Power off")){Intent i2 = new Intent("android.intent.action.ACTION_REQUEST_SHUTDOWN");
                    i2.putExtra("android.intent.extra.KEY_CONFIRM", true);
                    i2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    getApplicationContext().startActivity(i2);}
            }
        }

И так примерно для каждого триггера, так как пользователь отключает уведомление от приложения (ну мы просим :) ), удаление происходит в фоне и незаметно

Что там с маркетами?

Google Play - отдельная история. Мне удалось загрузить только самую первую публичную версию приложения, а после добавления триггера на смс гугл плей пошел в отказ. Более 10 обращений на одобрение деклараций(Обработчик по умолчанию, автоматизация устройств и т.д.) и 2-3 обращение в службу поддержки по разрешениям - результата 0, видите ли не основная функция - значит не надо. Доступ к камере, местоположению в фоне, полный доступ к памяти - одобрено. Но вот смс не в какую (Кстати у кого был опыт, может я что то не так делаю? Или есть те кто готов помочь с этим, отпишите в комментариях. Я допускаю что что-то делаю неправильно хотя что именно никто сказать не может...)

F-Droid - честно для меня (более менее уверенного пользователя линукс) стал ужасом в плане публикации приложения.. просил даже нескольких знакомых, не вышло.. так что публикация тут пока тоже отложена

Про остальные менее известные я даже не пытался, почти все свободное время уходит на разработку, а ещё нужно за что-то кушать и учёба и повышение навыков - не последнее дело

На этом пока статья подошла к концу, в следующих статьях будет бороться с прошивками, искать баги в системе защиты андроид и ещё немного интересного!

Все ваши идеи я тоже читаю и записываю, но увы я могу уделять приложению пока что нет так много времени как хотелось бы!..

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Стоит ли запускать донаты?
59.02%Да, некоторые люди поддержат36
40.98%Нет, это не актуально25
Проголосовал 61 пользователь. Воздержались 17 пользователей.