seedhartha / QuestPlayer

Android port of Quest Soft Player
http://qsp.su/
26 stars 5 forks source link

Улучшения questplayer #12

Closed AlexandrKozlovskiy closed 4 years ago

AlexandrKozlovskiy commented 4 years ago

В этом pull requestе я предлагаю некоторые улучшения в quest player. 1. Улучшина доступность questplayer для незрячих,благодаря добавлению на кнопки атрибута contentDescription,который не виден визуально,но озвучивается скринридерами,такими как talkback. Я не понял,для чего нужна кнопка с id title_button_3,т.е что нужно вводить при её нажатии,поэтому я очень надеюсь,что Вы её подпишете сами,как это сделал я для других кнопок,или используя атрибут text (разницы нет).

  1. Теперь программа будет видеть игру,даже если в архиве с игрой есть вложенная папка.
  2. Исправлен баг,из-за которого невозможно было пройти игру "последняя дорога",т.к при нажатии на ссылки появлялся 0.
  3. Теперь на кнопки нельзя будет нажать,если их нажатие не к чему бы не приводило.
  4. Исправлен баг,который,к примеру,был в игре"7.40",когда программа предлагала скачать уже загруженную игру,если в папке с игрой был больше чем один файл.
AlexandrKozlovskiy commented 4 years ago

К сожалению,почему-то не на всех ссылках в игре последняя дорога вызывается метод shouldOverrideUrlLoading,даже если использовать новую версию этого метода (к примеру на ссылке с текстом погасшими мониторами),поэтому полностью пройти этот квест,к сожалению,всё ещё нельзя,хотя теперь,после моего исправления,ссылки,где вызывается этот метод,отрабатывают нормально,хотя раньше вместо них был 0. По моим наблюдениям,метод вызывается,если у проблемных ссылок поменять текст,к примеру вместо погасшими мониторами использовать просто мониторами,но какую-то закономерность я отследить не смог.

seedhartha commented 4 years ago

Частично смержил как 8a43c3d0d1f2f85fe2735952aff217be7af85f9f и 791f9531ab4529e77b1d4732dda7f00fc8179b1d, спасибо.

title_button_3 позволяет работать с пользовательским вводом (см. переменные $usercom и $user_text в справке языка QSP).

seedhartha commented 4 years ago

По поводу пункта 5: в такой реализации все .qsp и .gam файлы, кроме последнего, будут проигнорированы плеером. Есть идея, как это сделать лучше: в gamesMap хранить ссылку на папку с игрой (аля GameFolder в LocalGameRepository), но это потребует более серьёзного рефакторинга.

AlexandrKozlovskiy commented 4 years ago

@seedhartha Нет,при загрузке игры 7.40 в моей реализации видны все .qsp файлы.

seedhartha commented 4 years ago

Точно - не заметил, что кроме расширения сверяется ещё и имя файла. Тогда есть момент, что этот фикс применим только для тех игр, у которых имя файла совпадает с названием игры. Кажется, что более гибко будет считать оба файла (7.40.qsp и 7.40.1.qsp) частью одной игры на полке и при выборе игры из списка давать пользователю возможность выбора, какой файл использовать.

AlexandrKozlovskiy commented 4 years ago

@seedhartha Ну,наверное,получается так. Тогда нужно будет вносить изменения в интерфейс плеера. Кстати Вы пробовали проходить игру "последняя дорога" с моей модификацией. Отрабатывается ли клик на все ссылки,или метод,как я заметил,вызывается не везде. Не по теме моего pullrequest: Мне показалось,или реально сейчас я могу сохранять игру в любое место,а вот загрузить последнее сохранение я не могу,к примеру,из внутренней памяти смарта,если я выбираю пункт загрузить из файла.

AlexandrKozlovskiy commented 4 years ago

Я заметил,что в моём pull request,который Вы частично смержили,и ветку которого я удалил,Вы убрали моё изменение,касающееся игры "последняя дорога". У Вас сейчас в файле htmlUtil.java public static String preprocessQspHtml(String html) { if (html == null || html.isEmpty()) { return ""; }

    String result = encodeExec(html);
    result = htmlizeLineBreaks(result);

    Document document = Jsoup.parse(result);
    Element body = document.body();
    body.select("img").attr("style", "max-width: 100%;");

    // video setting
    body.select("video").attr("style", "max-width: 100%;");
    body.select("video").attr("muted", "true");

    return document.toString();
}

А надо: public static String preprocessQspHtml(String html) { if (html == null || html.isEmpty()) { return ""; } String result = htmlizeLineBreaks(html); Document document = Jsoup.parse(encodeExec(result)); Element body = document.body(); body.select("img").attr("style", "max-width: 100%;");

    // video setting
    body.select("video").attr("style", "max-width: 100%;");
    body.select("video").attr("muted", "true");

    return document.toString();
}

Также Вы проигнорировали изменение,где я в методе htmlizeLineBreaks менял \" на '. Просто без этих изменений квест "последняя дорога" вообще нельзя будет пройти. private static String htmlizeLineBreaks(String s) { return s.replace("\n", "
") .replace("\r", "").replace("\\"","'"); } Также я бы подредактировал contentDescription для кнопок с основным и дополнительным описанием,поскольку,на мой взгляд,это не совсем правильно отражает суть кнопок,т.к вкладки в android,как и в windows,это отдельный компонент. Также у нас всё же не только описание чего-либо,но и также возможности взаимодействовать с объектами (в некоторых играх это можно сделать и с дополнительным описанием),поэтому вместо названий вкладка с основным/дополнительным описанием,я бы назвал кнопки просто основное/дополнительное описание соответственно,или перейти к основному/дополнительному описанию или перейти к основным/дополнительным возможностям игры. Также я не понял,какую именно переменную (usercom или user_text) мы меняем. Поэтому Я бы вместо названия кнопки Поле для ввода пользовательского текста назвал бы её как-то типа изменить переменную такую-то. Просто название поле для ввода пользовательского текста,на мой взгляд,не несёт смысловой нагрузки,т.к я не знаю,зачем и что туда вводить. А вот когда у кнопки будет название,к примеру,изменить переменную такую-то,то я,или другой пользователь,будет знать,что он меняет,и при необходимости найдёт информацию об этой переменной. Как Вы,очень надеюсь,поняли,под названием кнопки я подразумеваю её contentDescription.

seedhartha commented 4 years ago

Мне показалось,или реально сейчас я могу сохранять игру в любое место,а вот загрузить последнее сохранение я не могу,к примеру,из внутренней памяти смарта,если я выбираю пункт загрузить из файла.

В коде место сохранения и загрузки искусственно не ограничено. Возможно это зависит от настроек телефона - у меня загрузка со внутренней памяти работает.

Также я бы подредактировал contentDescription для кнопок с основным и дополнительным описанием,поскольку,на мой взгляд,это не совсем правильно отражает суть кнопок,т.к вкладки в android,как и в windows,это отдельный компонент. Также у нас всё же не только описание чего-либо,но и также возможности взаимодействовать с объектами (в некоторых играх это можно сделать и с дополнительным описанием),поэтому вместо названий вкладка с основным/дополнительным описанием,я бы назвал кнопки просто основное/дополнительное описание соответственно,или перейти к основному/дополнительному описанию или перейти к основным/дополнительным возможностям игры.

Поправил описание вкладок. Насчёт описания пользовательского ввода, не совсем согласен. Всё таки изменение переменной это детали языка QSP, игроку об этом знать не обязательно.

Также Вы проигнорировали изменение,где я в методе htmlizeLineBreaks менял " на '. Просто без этих изменений квест "последняя дорога" вообще нельзя будет пройти.

Это изменение я хотел дополнительно протестировать. Меня смутило, во-первых, что htmlizeLineBreaks был перемещён перед encodeExec: сейчас HTML в диалоговых окнах не поддерживается, и если по нажатию на ссылку будет вызвано диалоговое окно с текстом, содержащим переносы строк, то пользователь будет видеть теги \<br>. Есть как минимум одна игра, где такое происходило раньше.

Во-вторых, кажется, что замену \" на ' лучше вынести в отдельный метод, так как судя по названию, htmlizeLineBreaks должен работать только с переносами строк.

AlexandrKozlovskiy commented 4 years ago

@seedhartha

В коде место сохранения и загрузки искусственно не ограничено. Возможно это зависит от настроек телефона - у меня загрузка со внутренней памяти работает.

Очень странно,но при загрузке у меня не видна внутренняя память. А код я посмотрю.

Насчёт описания пользовательского ввода, не совсем согласен. Всё таки изменение переменной это детали языка QSP, игроку об этом знать не обязательно.

Хорошо. Представим ситуацию. Вы скачали приложение,где есть кнопка с пользовательским вводом. При её нажатии открывается диалог,где предлагается что-то ввести. Как Вы поймёте,что нужно вводить,и в каком случае,ведь,к примеру,в нашей ситуации это будет работать только когда какая-то игра начата. Я понимаю,если,к примеру,это был бы калькулятор. Тогда понятно,что в это поле нужно скорее всего вводить арифметическое выражение. А так пользователю не будет понятно,что вводить,поэтому имхо всё же надо дать пользователю понять,что он вводит.

Меня смутило, во-первых, что htmlizeLineBreaks был перемещён перед encodeExec:

Но без этого нельзя будет пройти игру "последняя дорога",поскольку если отлаживать текст,то тогда получится что-то типа = ",или что-то в этом роде. Если не менять \\\" на ',то ссылки обрежутся до ближайшей кавычки. Просто,когда я столкнулся с этой проблемой в своём форке,я читал текст,который выводился,без html,и также выводил и читал ссылки,которые генерируются в этом тексте. В результате я понял,что в данной игре из-за особенностей оформления ссылок,есть такие проблемы. По поводу отдельного метода,возможно,Вы правы.

AlexandrKozlovskiy commented 4 years ago

Предлагаю перенести наше обсуждение в #14.