Android: startActivityForResult deprecated

С очередным обновлением Android Studio опять прилетели новые deprecated. На этот раз для startActivityForResult. У меня сия конструкция используется для обработки выбора файла в компоненте WebView. Соответственно изменим:

ActivityResultLauncher<Intent> someActivityResultLauncher = registerForActivityResult(
                    new ActivityResultContracts.StartActivityForResult(),
                    new ActivityResultCallback<ActivityResult>() {
                        @Override
                        public void onActivityResult(ActivityResult result) {

                            Intent data = result.getData();
                            Uri uri = data.getData();

                            if (result.getResultCode() == REQUEST_SELECT_FILE) {
                                if (uploadMessage == null) return;
                                uploadMessage.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(result.getResultCode(), data));
                                uploadMessage = null;
                            };
                            if (result.getResultCode() == FILECHOOSER_RESULTCODE) {
                                if (null == mUploadMessage) return;
                                Uri result2 = data == null || result.getResultCode() != MainActivity.RESULT_OK ? null : data.getData();
                                mUploadMessage.onReceiveValue(result2);
                                mUploadMessage = null;
                            }
                        }
                    });

            // For Lollipop 5.0+ Devices
            public boolean onShowFileChooser(WebView mWebView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
                if (uploadMessage != null) {
                    uploadMessage.onReceiveValue(null);
                    uploadMessage = null;
                }
                uploadMessage = filePathCallback;
                Intent intent = null;
                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
                    intent = fileChooserParams.createIntent();
                }
                try {
                    someActivityResultLauncher.launch(intent);
                   // startActivityForResult(intent, REQUEST_SELECT_FILE);
                } catch (ActivityNotFoundException e) {
                    uploadMessage = null;
                    return false;
                }
                return true;
            }



            protected void openFileChooser(ValueCallback<Uri> uploadMsg) {
                mUploadMessage = uploadMsg;
                Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                i.addCategory(Intent.CATEGORY_OPENABLE);
                i.setType("image/*");

              //  startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);


                someActivityResultLauncher.launch(Intent.createChooser(i, "File Chooser"));

            }

        });

PostgreeSQL: INSERT or UPDATE в запросе

В Postgree очень удобно реализовывать механизм защиты от избыточной вставки одинаковых значений.

  1. Назначаем на колонки таблицы контроль уникальности
 CONSTRAINT control_un_key UNIQUE (dtfrom_utc)
        INCLUDE(tar_id,user_group),

2. Далее при вставке достаточно указать что то в духе:

INSERT INTO tars_list
                ( dtfrom_utc, tar_id, user_group)
         VALUES (:dtfrom_utc,:tar_id,:user_group) ON CONFLICT  DO NOTHING

Одно плохое НО. Проверка уникальности не будет работать, если в полях есть null

Перебор комбинаций 0 и 1 в битах

Задача: вычислить все возможные комбинации 0 и 1 в битовом числе.

Решение: применим комбинаторику. Реализовано аж в двух языках 😉

Pyhon:

n=int(input("n="))
res=[]
for i in range(2**n):
    s=""
    for j in range(n):
        s=str(i%2)+s
        i=i//2
    res.append(s)
print(res)

PHP:

$n=5;
$res=[];
for ($i = 1; $i <= 2**$n; $i++) {
    $s="";    
    $z=$i;
    for ($j = 1; $j <= $n; $j++) {
      $s=(string)($z%2).$s;      
      $z=intdiv($z,2);      
    };  
    $res[]=$s;
}
var_dump($res);

JQGrid Free: вставка html в ячейку

Свободная редакция слегка отличается от не свободной. А потому вставка кода HTML в ячейку осуществляется несколько по иному:

                    {name:'deleted',       index:'deleted',fixed:true,width:15,search: false,editable:false,
                        formatter: function(cellvalue, options, rowobject){
                            if (cellvalue==true){
                                return '<i class="fas fa-times"></i>'; 
                            } else {
                                return "";
                            };
                            
                      }},  

Получается что то вроде:

SQL: выборка последних значений по дате из БД

Задача: в таблице хранятся тарифы «сплошным навалом», необходимо вытащить последние значения всех тарифов.

Решение:

select 
reg_tarifs.date as dttime,
reg_tarifs.tarif as tarif,
reg_tarifs.zone as zone_num,
enum_zones.name as tarzone
from reg_tarifs
inner join enum_zones on enum_zones.id=reg_tarifs.zone
inner join 
(select 
  max(date) as maxdt,zone 
from reg_tarifs
where ezs=5
group by  zone 
) as max
on max.maxdt=reg_tarifs.date and max.zone=reg_tarifs.zone
1 80 81 82 83 84 300