Установка composer2 в Ubuntu 20.4
wget https://getcomposer.org/installer --no-check-certificate -O "composer-setup.php"
php composer-setup.php
chmod -c 777 *
sudo mv composer.phar /usr/bin/composer
Жизнь замечательных грибов
wget https://getcomposer.org/installer --no-check-certificate -O "composer-setup.php"
php composer-setup.php
chmod -c 777 *
sudo mv composer.phar /usr/bin/composer
Хорошим тоном считается при запуске приложения если нужны какие-то разрешения, предварительно рассказывать, зачем они собственно приложению нужны. Реализовать это можно например вот так:
if (ContextCompat.checkSelfPermission(mycontext, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("Местоположение");
builder.setMessage("Для того чтобы приложение правильно рассчитывало расстояние до ЭЗС вам нужно предоставить доступ к геолокации. Разрешить доступ?").setCancelable(true).setPositiveButton("Да, разрешить",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
checkPermission(Manifest.permission.ACCESS_FINE_LOCATION, 100);
checkPermission(Manifest.permission.ACCESS_COARSE_LOCATION, 101);
checkPermission(Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, 102);
StartInterface();
}
})
.setNegativeButton("Нет,запретить",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
StartInterface();
}
});
AlertDialog alert = builder.create();
alert.show();
} else {
StartInterface();
};
Проблема: при холодном старте приложения, возникает «белый экран». Не очень красиво выглядит. Чаще всего это возникает когда в стартующеё активити, в onCreate очень много всего положено. И не всегда можно от туда это всё вынять.
Решение: в основной стиль приложения добавим строчку, которая фоном установит картинку вместо «белого экрана»:
<item name="android:windowBackground">@drawable/welcome_android</item>
<item name="android:windowFullscreen">true</item>
Проблема обнаруживается в webview приложений на android. А именно, если где-то в коде есть radiobutton обёрнутый чем угодно, то при клике по нему, кратковременно (на долю секунды) выделяется вся строчка целиком.

Решение: достаточно добавить в стилевое оформление этого элемента cursor:default
Update: достаточно применить к body -webkit-tap-highlight-color: rgba(255, 255, 255, 0);
Задача: нарисовать нечто подобное

Решение:
var days_week = [
'Жуть',
'Понедельник',
'Вторник',
'Среда',
'Четверг',
'Пятница',
'Суббота',
'Воскресенье',
];
var month_names=[
"",
"Январь",
"Февраль",
"Март",
"Апрель",
"Май",
"Июнь",
"Июль",
"Август",
"Сентябрь",
"Октябрь",
"Ноябрь",
"Декабрь"
];
function GetDayWork(year,month,day){
dayw=new Date(year, month-1, day).getDay();
if (dayw==0) return 7;
return dayw;
};
function ReturnToBookingPanel(){
$(".DateTimePickerForBooking").hide();
$(".booking-now").show();
};
function GetLastNextCal(month,year,next){
month=month+next;
if (month==0){month=12;year--;}
if (month==13){month=1;year++;}
PaintBookingMonth(month,year);
};
function PaintBookingMonth(month,year){
cal_html='';
cal_html=cal_html+'<div class="calendar_row calendar_row-head">';
cal_html=cal_html+' <div class="calendar_head-date">'+month_names[month]+' <span>'+year+'</span></div>';
cal_html=cal_html+' <div class="calendar_row-head-arrows">';
cal_html=cal_html+' <div class="arrow arrow-prev" onclick="GetLastNextCal('+month+','+year+',-1)">';
cal_html=cal_html+' <img src="/img/arr_cal_l.svg">';
cal_html=cal_html+' </div>';
cal_html=cal_html+' <div class="arrow arrow-next" onclick="GetLastNextCal('+month+','+year+',1)">';
cal_html=cal_html+' <img src="/img/arr_cal_r.svg">';
cal_html=cal_html+' </div>';
cal_html=cal_html+' </div>';
cal_html=cal_html+'</div>';
cal_html=cal_html+'<div class="calendar_row calendar_row-weekdays">';
cal_html=cal_html+' <div class="item">Пн</div>';
cal_html=cal_html+' <div class="item">Вт</div>';
cal_html=cal_html+' <div class="item">Ср</div>';
cal_html=cal_html+' <div class="item">Чт</div>';
cal_html=cal_html+' <div class="item">Пт</div>';
cal_html=cal_html+' <div class="item">Сб</div>';
cal_html=cal_html+' <div class="item">Вс</div>';
cal_html=cal_html+'</div>';
days = new Date(year, month, 0).getDate()
console.log("Дней в месяце:",days);
// рисуем, пока не кончатся дни
day=1;
while (day<=days) {
cal_html=cal_html+'<div class="calendar_row">';
for(let dayw = 1; dayw <= 7; dayw++) {
if (GetDayWork(year, month, day)==dayw){
if (day>days){
console.log("- пропуск");
cal_html=cal_html+'<div class="item"></div>';
} else {
console.log(day);
available="available";
selected="";
if (month<(new Date().getMonth()+1)) available=""; //если месяц меньше чем текущий
if (month==(new Date().getMonth()+1)){
if (day<new Date().getDate()) available="";
if (day==new Date().getDate()) selected="selected today";
};
cal_html=cal_html+'<div id="day_'+year+'_'+month+'_'+day+'" onclick="ChangeDataForBooking('+year+','+month+','+day+')" class="item '+available+' '+selected+'" data-date="'+year+'-'+month+'-'+day+'">'+day+'</div>';
};
day++;
} else {
console.log("- пропуск");
cal_html=cal_html+'<div class="item"></div>';
};
};
cal_html=cal_html+'</div>';
};
cal_html=cal_html+'<div class="booking_date-current_date">';
cal_html=cal_html+' Пятница <span>21.01.2022 январь</span>';
cal_html=cal_html+'</div>';
$(".booking_date-wrapper").html(cal_html);
};
function ChangeDataForBooking(year,month,day){
console.log("!ChangeDataForBooking",year,month,day);
if ($('#day_'+year+'_'+month+'_'+day).hasClass("available")){
$(".item").removeClass("selected");
$('#day_'+year+'_'+month+'_'+day).addClass("selected");
};
};