Skip to content

Releases: SalehGNUTUX/GT-SPEEDOMETER

v0.9.6-beta

v0.9.6-beta Pre-release
Pre-release

Choose a tag to compare

@SalehGNUTUX SalehGNUTUX released this 18 Aug 11:30

إصدارُ التصوير: التسجيل عرضًا، والطبقة المحروقة تتبع التصميم المختار أخيرًا.

أُضيف

  • اتّجاه الشاشة خيارًا (تلقائيّ · طوليّ · عرضيّ) في «تصميم العدّاد». والتلقائيّ
    يطلب SENSOR لا UNSPECIFIED: الثاني يردّ الأمر إلى قفل الدوران في النظام، فمن
    أقفل دورانَ جهازه لا يستفيد من «تلقائيّ» شيئًا. ولا يُفرض اتّجاهٌ على النافذة
    المصغَّرة: نظامُها يتولّى وضعها، وفرضُ اتّجاهٍ عليها مقاتلةٌ على نافذةٍ ليست لنا.

  • حجم رقم السرعة بخمس درجات (‎60‎ · ‎80‎ · ‎100‎ · ‎130‎ · ‎160‎ ٪). نسبةٌ لا حجمٌ
    مطلق: القرص يتمدّد مع الشاشة، فرقمٌ ثابتٌ يصير ضخمًا في لوحٍ وضئيلًا في هاتفٍ صغير.
    والافتراضيّ ‎100‎ فمن لم يغيّر شيئًا لا يتبدّل عليه شيء. والخيارات معروضةٌ لا شريطَ
    انزلاق — الانزلاق لا يُضبط بقفّاز.

  • مشاركة التطبيق من «عن التطبيق»: الرابط نصًّا، أو ملفّ التثبيت لمن لا إنترنت
    عنده. والنصّ يحمل تعريفًا ورقم الإصدار ورابط الموقع ووسومًا. والحزمة تُقرأ من
    sourceDir — أي النسخة العاملة بعينها بلا تنزيل — وتُنسخ إلى المخبأ باسمٍ مفهوم،
    إذ base.apk اسمٌ يُربك من يستقبله. والنسخ في كلّ مرّة لا مرّةً واحدة: تحديثُ
    التطبيق يُبقي الاسم نفسه، فملفٌّ مخبَّأٌ من إصدارٍ سابق كان يُرسل قديمًا باسمٍ يقول
    إنّه الجديد.

أُصلح

  • الطبقة المحروقة صارت تتبع التصميم المختار. كان في الملفّ قوسٌ كلاسيكيٌّ مكتوبٌ
    بيده مهما اختار المستعمل، فمن يختار «مؤشّرًا» أو «شراتٍ» يجد في فيديوه ما لا يشبه
    شاشته. وهذا الدَّين الأوّل في خارطة الطريق، وكان مجدولًا لـ‎0.11.0‎.

    ولم تُنسخ التصاميم الستّة إلى android.graphics.Canvas كما كان متوقّعًا: النسخ يعني
    هندستين تتباعدان عند أوّل تعديل. بل جُسر بـCanvasDrawScope فصارت دالّة
    drawGaugeFace نفسها التي ترسم الشاشة هي التي ترسم الفيديو
    — اشتقاقٌ واحدٌ لا
    اثنان. والتدريج الرقميّ وحده مستثنًى: قياسُ نصٍّ لكلّ شرطةٍ في كلّ إطار عملٌ لا
    يحتمله خيط الرسم، والملفّ يُشاهَد ولا يُقرأ منه رقمُ تدريج.

  • الملفّ المسجَّل بعد إدارة الجهاز كان يخرج بميل تسعين درجة. targetRotation في
    CameraX يُقرأ مرّةً عند بناء حالة الاستعمال، والنشاط يعلن configChanges
    للاتّجاه فيعالجه بنفسه بلا إعادة إنشاءٍ ولا إعادة ربط. فالصورة على الشاشة سليمة
    والملفّ مقلوب — ولم يظهر العطب قبل هذا الإصدار لأنّ أحدًا لم يكن يصوّر عرضًا. صار
    الاتّجاه يُبلَّغ عند كلّ تهيئة، ولا يُبلَّغ أثناء تسجيلٍ جارٍ: تبديله في منتصف
    مقطعٍ يُخرج ملفًّا نصفُه بميلٍ ونصفُه بآخر.

  • زرّا حوار الخروج صارا مملوءَين بدل نصّين ملوّنين. التلوين وحده يترك الزرّين شكلًا
    واحدًا فيُقرآن قبل أن يُميَّزا، والخطأ هنا يُنهي تسجيلًا جاريًا. والمساحة الممتلئة
    تُلمح قبل أن تُقرأ، وهو المطلوب على مقود دراجة.


v0.9.5-beta

v0.9.5-beta Pre-release
Pre-release

Choose a tag to compare

@SalehGNUTUX SalehGNUTUX released this 17 Aug 17:52

إصدارُ نظافةٍ يسبق المحرّك المتجهيّ: شبكةُ أمانٍ قبل أخطر تغييرٍ في المشروع، ومعها
ثلاثةُ طلباتٍ من الاستعمال.

أُضيف

  • جلب خريطةٍ من تخزين الجهاز — كان الجلب مقصورًا على رابطٍ من الإنترنت، ومن نزّل
    أرشيفَه بالحاسوب أو بمتصفّحه لا سبيل له إلى إدخاله. فصار بجانب حقل الرابط زرُّ «من
    التخزين» يفتح منتقي المستندات.

    والمُنتقى يمرّ من الحرّاس نفسها لا من نسخةٍ عنها: فكُّ ‎.gz‎، وفحصُ الرأس، ورفضُ
    البلاطات المتجهيّة، ورفضُ بيانات OSM الخام، ثمّ النقل وإعادة المسح — كلُّها في
    MapDownloader.finish التي كانت تخدم التنزيل، والجلب المحلّيّ يستبدل مصدر
    البايتات وحده
    . ولو نُسخ الحكم لصار في التطبيق حكمان على أرشيفٍ واحد، ولاختلفا عند
    أوّل تعديل: فيُقبل من التخزين ما يُرفض من الشبكة.

    وتفصيلان: الاسم يُؤخذ من مزوّد المستندات لا من مسار الـUri (مزوّدات SAF تعطي
    content://…/document/1234 لا اسم فيه)، وحين يسكت المزوّد عن الاسم يُردّ الملفّ بدل
    أن يُخترع له امتداد — فالامتداد هو ما تُقاس عليه الفحوص كلُّها. والمنتقي يعرض كلّ
    الأنواع: أرشيفات البلاطات لا نوع MIME مسجَّلًا لها، وتصفيةٌ بالنوع كانت تُخفي عن
    المستعمل الملفَّ الذي جاء يختاره.

  • أوّل اختبارات وحدةٍ في المستودع — ‎11‎ اختبارًا لـSpeedAlert وSpeedScale في
    app/src/test/. وبُدئ بهما لأنّهما أكثر ما انكسر (ثلاثة أعطالٍ في ‎0.9.4‎ وحده)
    ولأنّهما منطقٌ نقيٌّ يُختبر على آلة جافا بلا جهازٍ ولا محاكٍ. وكلّ حالةٍ مشدودةٌ إلى
    عقدٍ مكتوبٍ أو إلى عطبٍ وقع فعلًا — ومنها اختبارُ العطب الثالث: الحكم على الرقم
    المعروض لا على الكسر تحته.

    اعتماديّةٌ جديدة: junit:junit:4.13.2 في نطاق testImplementation وحده، فلا
    تدخل الحزمة المنشورة.

  • بناءٌ وفحصٌ على GitHub.github/workflows/build.yml: CLEANUP.sh ← اختبارات
    الوحدة ← assembleDebug عند كلّ دفعةٍ وطلب دمج. وترتيبُه مقصود: أرخص الفحوص أوّلًا،
    ونصٌّ مستعمَلٌ بلا مقابل أكثرُ ما كسر البناء في هذا المشروع.

    وهذا الملفّ كانت خارطة الطريق تُدرجه في «أدوات التحقّق في المستودع» وتبني عليه متانةَ
    ‎0.12.0‎، وهو لم يكن موجودًا أصلًا. فمن يقرأ التوثيق يطمئنّ إلى شبكة أمانٍ لا وجود
    لها، وذلك أسوأ من غيابها معلنًا.

أُصلح

  • لونا زرَّي حوار الخروج. كانا بلونٍ واحد فيُقرآن قبل أن يُميَّزا، والخطأ فيهما
    يُنهي تسجيلًا جاريًا. صار «خروج» أحمرَ و«إلغاء» أخضرَ — وهو عقد الألوان نفسه في بقيّة
    التطبيق (الأحمر لما يُتلف والأخضر للفعل الآمن)، فلا يتعلّم المستعمل اصطلاحًا خاصًّا
    بهذه المحاورة وحدها.

نُظّف

  • حُذفت من الجذر بقايا إصدارين: 0.4.0.patch و0.5.0.patch (‎790‎ ك.ب) و
    BUILD-0.4.0.md وBUILD-0.5.0.md وText File.txt. وتاريخها باقٍ في git.
  • .kotlin/ (يولّده مصرّف كوتلن ‎2.x‎) صار متجاهَلًا ومعروفًا للفاحص، بعد أن كان
    يُنذَر عنه في كلّ تشغيل. وإنذارٌ يتكرّر دائمًا يُدرَّب عليه النظر فيُهمَل، فيضيع
    معه الإنذار الحقيقيّ يوم يأتي.
  • صُحّحت خارطة الطريق: الدَّين العاشر (GitHub Pages) مسدَّدٌ فعلًا — الموقع يُخدَم منذ
    تفعيلها — والدَّين الثامن صار جزئيًّا.

v0.9.4-beta

v0.9.4-beta Pre-release
Pre-release

Choose a tag to compare

@SalehGNUTUX SalehGNUTUX released this 17 Aug 11:02

أُصلح: التنبيه الصوتيّ الذي «أحيانًا يعمل وأحيانًا لا»

عطلان مستقلّان اجتمعا، وكلاهما يُنتج الشكوى نفسها:

  • نغمةٌ ميّتة تُترك ميّتة. ToneGenerator كان يُنشأ مرّةً ويُخزَّن بعمر
    العمليّة، وstartTone تُعيد Boolean كنّا نُهمله. فحين يموت مسارُ الصوت — عند
    وصل سمّاعة بلوتوث أو فصلها، أو حين يخطف تطبيقٌ آخر المسار، أو حين يستردّ النظام
    المسارات — تصير كلّ صفيرةٍ بعدها لا شيء إلى الأبد، بلا خطأٍ ولا أثر. وهذا
    بعينه «عمل مرّةً ثمّ لم يعد». صار المشغّل يقرأ نتيجة التشغيل، ويُعيد بناء نفسه
    ويحاول مرّةً واحدة عند الفشل.

  • بوّابة الدقّة كانت تُعمي التنبيه. كانت العيّنة تُرفض كلّها حين تسوء دقّة
    التموضع، فيقع أمران معًا تحت الأشجار وبين الأبراج: العدّاد يتجمّد على آخر رقمٍ
    مقبول فيرى السائق «‎62‎» ثابتةً فوق حدّ ‎60‎، والتنبيه يُحرَم العيّنات فلا يصفّر —
    الشاشة تشهد بالتجاوز والصوت صامت. بل إنّ جهازًا لا يبلّغ دقّةً أصلًا كان يُرفض
    على الدوام، فلا تنبيه فيه البتّة.

    والفصل الآن صريح: دقّة التموضع تحمي المسار لا السرعة. السرعة تأتي من إزاحة
    دوبلر في الإشارة لا من فرق موضعين، فدقّتها مستقلّة. العيّنة المرفوضة لا تُكتب في
    ملفّ المسار بحال — فمسافة الرحلة وأقصى سرعتها كما كانتا — لكنّها إن جاءت سرعتها
    من الشريحة حُسبت في العدّاد وفي الطبقة المحروقة وفي التنبيه.

  • ومزلقٌ ثالث في حارس التذبذب. العودة تحت الحدّ لم تكن تُعتدّ إلّا بنزول
    كيلومترين تحته بالكسور، فسائقٌ هبط إلى ‎48.7‎ — وعدّاده يقول ‎48‎، أي «عدتُ»
    بعينه — ثمّ عاد فوق ‎50‎ لم يسمع صفيرة عبورٍ ثانية. صار الحكم كلّه على الرقم
    الذي يراه السائق
    لا على الكسر العائم تحته، عبورًا وعودةً معًا.

أُضيف

  • خمس نغمات للتنبيه (صفيرة · نبضتان · جرس · رنّة رقميّة · نبضة خفيفة)
    وشدّةٌ تُضبط من ‎20‎ إلى ‎100‎، مع زرّ «استمع» يشغّل النغمة من مسار التنبيه
    الحقيقيّ
    لا من مسارٍ ثانٍ — فمعاينةٌ تعمل بينما التنبيه معطّل أسوأ من لا شيء.
    والملفّات الخمسة مجتمعةً دون ‎25‎ كيلوبايت. والشدّة نسبةٌ من مجرى «المنبّه» في
    النظام لا مستوًى مطلقًا؛ ولذلك يظهر تحذيرٌ صريح حين يكون مجرى المنبّه صفرًا، إذ
    لا يُسمع شيءٌ عندئذٍ مهما ضُبط هنا.

  • ستّة تصاميم للعدّاد — كلاسيكيّ · مؤشّر تناظريّ · مقتضب · شرات مضيئة · حلقتان
    · شريط — تُختار من الإعدادات بمنتقٍ يُري التصميم لا اسمه، وتسري على شاشة
    العدّاد وطبقة الكاميرا والنافذة المصغّرة. و«كلاسيكيّ» هو الافتراضيّ وهو تصميم ما
    قبل هذا الإصدار بحذافيره: من لم يختر شيئًا لا يتبدّل عليه شيء.

    والقاعدة التي تحكم الستّة: المعنى واحدٌ والشكل مختلف. المدى والعتبة والحدّ
    وألوان المناطق تخرج كلّها من SpeedScale نفسه، فلا يقول تصميمٌ «تجاوزتَ»
    ويسكت آخر في المشهد نفسه.

  • النافذة المصغّرة: أربعة أشكال (رقم · حلقة · مؤشّر · شريط)، وثلاثة أحجام
    للرقم، وخلفيّةٌ شفّافة تُفعَّل وتُضبط كثافتها من ‎10‎٪ إلى ‎100‎٪.

  • قائمةٌ بما في مجلّد الخرائط داخل الإعدادات: كلّ ملفٍّ باسمه وحجمه وتصنيفه —
    أرشيفٌ يُرسم، أم ‎.obf‎ متجهيّة، أم بياناتٌ خام — مع مشاركته أو حذفه. والحذف
    بتأكيد، ومقصورٌ على مجلّدنا: المسح يقرأ مجلّدات OsmAnd وLocus وosmdroid، وحذفُ
    ملفٍّ من هناك يمحو خريطةً نزّلها صاحبها في تطبيقٍ آخر ودفع فيها من حزمته. القراءة
    ضيافةٌ والحذف اعتداء.

  • مصدر الخريطة صار قائمةً منسدلة بأربعة أسماء صريحة: تلقائيّ · إنترنت ·
    OsmAnd · محلّيّة. وكان زرًّا يدور بين الخيارات، وكان «إنترنت» و«محلّيّة» قيمةً
    واحدة تختار بينها التغطية — فلم يكن للمستعمل سبيلٌ يقول به «ارسم من ملفّي أنا».
    وما لا يعمل الآن يُعرض معطَّلًا ومعه سببه («لا اتّصال»، «لا أرشيف يغطّي هذا
    المسار») لا يُخفى: إخفاؤه هو ما جعل صاحب المشروع يظنّ الخيار غير موجود.

أُصلح أيضًا

  • «وُجدت خريطة محلّيّة» كانت تُقال عن ملفٍّ لا يُرسم. ملفّ
    morocco-latest-free_shp.zip من Geofabrik أرشيفُ أشكال ESRI لا بلاطات،
    فكان يُقبل لأنّ امتداده ‎.zip‎ ثمّ لا يظهر منه شيء. صار الأرشيف المضغوط
    يُفتح فهرسُه ويُبحث فيه عن بلاطةٍ حقيقيّة بهيئة ‎z/x/y.png‎، فإن لم تُوجد
    صُنّف «بياناتٍ خامّة» وقيل ذلك صراحةً بدل ادّعاء خريطة. ومثله ‎.osm.pbf‎
    و‎.gpkg‎ و‎.shp‎. والبحث محدودٌ بأوّل ‎2000‎ مُدخَل كي لا يُعطّل فهرسُ أرشيفٍ
    بحجم ‎468‎ ميغابايت المسحَ كلَّه.
  • زرّا التأكيد كانا متطابقين في المظهر. «أنهِ» و«تراجَع» نصّان باهتان
    متشابهان، والقرار بينهما يقع بإبهامٍ واحد وسيّارةٌ سائرة. صارا زرًّا مملوءًا
    بعرض المربّع وبأيقونة، لونه لون معناه، وارتفاعه ‎56‎ نقطة. ومع مربّع الإنهاء سطرٌ
    يقول «ما صُوّر حتّى الآن محفوظٌ ولن يضيع»، وهو ما يحتاجه المتردّد فعلًا.

Geofabrik: ما وجدتُه، ولماذا لم يُعتمد مصدرًا يُرسم منه

طلب صاحب المشروع اعتماد download.geofabrik.de مصدرًا. فحصتُ ما يقدّمه لكلّ بلد:

الصيغة ما هي أتُرسم عندنا؟
‎.osm.pbf‎ بيانات OSM خام لا
‎.shp.zip‎ أشكال ESRI لا
‎.gpkg.zip‎ GeoPackage لا
‎*-shortbread-*.mbtiles‎ MBTiles متجهيّة (MVT) لا

محرّكنا osmdroid نقطيٌّ لا غير: يرسم صورًا مرصوفة، ولا يفهم بياناتٍ متجهيّة
بحال. وأرشيفاتٌ نقطيّة مجّانيّة لكلّ بلد لا وجود لها عمليًّا، لأنّ توليدها وحفظها
مكلفان. فالرابط مضافٌ إلى «من أين أجلب أرشيفًا؟» موصوفًا بصدق: هذه الملفّات لا
تُرسم اليوم، وتحويل ‎.osm.pbf‎ إلى ‎.obf‎ ببرنامج OsmAndMapCreator يجعلها تُقرأ
عبر OsmAnd.

والحلّ الحقيقيّ مقصدُ الإصدار 0.10.0: محرّك رسمٍ متجهيّ (MapLibre Native)
يرسم ملفّات Geofabrik الـshortbread داخل التطبيق. وهو الطريق الوحيد إلى خرائط
بلدٍ كاملة دون اتّصال.

يُعرف عنه

  • الطبقة المحروقة في الفيديو تبقى على التصميم الكلاسيكيّ أيًّا كان التصميم
    المختار. من يختار «مؤشّر» يراه على الشاشة ويجد القوس الكلاسيكيّ في الملفّ.
    والاختلاف في الشكل وحده: المدى والعتبة والحدّ وحكم اللون واحدةٌ في الاثنين، فلا
    يقول أحدهما «تجاوزتَ» ويسكت الآخر. وتوحيدُهما يقتضي نقل التصاميم الستّة إلى
    راسم الفيديو، وهو تغييرٌ في مسارٍ مُختبَرٍ يُخرج ملفّات المستعملين — أُجّل عمدًا.
  • شفافيّة النافذة المصغّرة غير مضمونة على كلّ جهاز. نافذة «صورة في صورة»
    يركّبها النظام لا التطبيق، وبعض المصنّعين يرسم تحتها خلفيّةً صمّاء مهما فعلنا.
    فُعّل لها كلُّ ما تسمح به المنصّة (setTranslucent من أندرويد ‎11‎، وصيغةُ سطحٍ
    شفّافة، وخلفيّةُ نافذةٍ خالية)، ومع ذلك يبقى الأمر بيد الجهاز — ولذلك المفتاح
    مطفأٌ افتراضًا ونصُّه يقول ذلك صراحةً. وحين تتعذّر الشفافيّة يكون الأثر صندوقًا
    أغمق لا صندوقًا مكسورًا، والرقم فوقه بظلٍّ يبقيه مقروءًا.

v0.9.3-beta

v0.9.3-beta Pre-release
Pre-release

Choose a tag to compare

@SalehGNUTUX SalehGNUTUX released this 16 Aug 12:25

أُضيف

  • تأكيدٌ قبل بدء التصوير وقبل إنهائه، مفعَّلٌ افتراضًا ويُطفأ من الإعدادات.
    زرّ التسجيل كبيرٌ في وسط الشاشة والهاتف على المقود، فلمسةٌ عارضة تبدأ تصويرًا لا
    يريده صاحبه أو — وهو الأسوأ — تُنهي تسجيلَ حادثةٍ وهو يحتاجه. والتأكيد للبدء
    والإنهاء وحدهما: الإيقاف المؤقّت والاستئناف واللقطة تمضي بلمسة.
  • تحديثٌ من داخل التطبيق: فحصٌ لصفحة إصدارات المستودع، وإشعارٌ حين يصدر أحدث،
    وتنزيلٌ وتثبيتٌ بلمستين. مع مفتاحَي «تنبيهني بالتحديثات» و«أشعِرني بالنسخ
    التجريبيّة». والمقارنة بأعداد الإصدار جزءًا جزءًا لا بنصّ الوسم — ‎0.10.0‎
    أحدث من ‎0.9.9‎، والمقارنة النصّيّة تعكسها.
  • دعم ‎.gz‎ في مُنزِّل الخرائط: يُقبل ‎<الصيغة>.gz‎ فيُنزَّل ويُفكّ ضغطه تدفّقًا
    من ملفٍّ إلى ملفّ، ثمّ يُفحص الناتج لا المضغوط.

حارسٌ يستحقّ الشرح: رفضُ البلاطات المتجهيّة

صفحة osm-qa-tiles التي أشار إليها المستخدم ليست خرائط دولٍ جاهزة. نصُّها
الحرفيّ: «بيانات OpenStreetMap بصيغة Mapbox Vector Tiles داخل ملفّ MBTiles
للتحليل… وهذه الخدمة متوقّفة… تقريبٌ واحد (‎12‎)». أي بياناتٌ خامّة
بصيغة protobuf لا صورًا مرسومة — وتنزيلُها كان سيُخرج خريطةً فارغة بلا أن
يقول أحدٌ لماذا: قارئنا يُخرج البايتات على أنّها صورة فيفشل فكّ ترميزها بصمت.

فصار المُنزِّل يقرأ metadata.format من الأرشيف: png/jpg/webp تُقبل،
وpbf/mvt تُرفض بنصٍّ يشرح السبب ويُحذف الملفّ. وإن غاب جدول metadata
(أرشيفات OsmAnd و Locus لا تكتبه) استُخرجت بلاطةٌ واحدة وقُرئ توقيعها. وفشلُ
الفحص نفسِه لا يمنع الاعتماد: منعُ أرشيفٍ سليم أسوأ من قبول واحدٍ مشكوك.

أُصلح

  • أيقونة الموقع كانت تُنعش الصفحة ولا تصعد إلى أعلاها. السبب أنّ المتصفّح
    يحفظ موضع التمرير ويعيده بعد الإنعاش (history.scrollRestoration = 'auto'
    فتُطفأ الاستعادة الآن عند التحميل — ومن أنعش بمفتاح F5 يبدأ من الأعلى كذلك.

v0.9.2-beta

v0.9.2-beta Pre-release
Pre-release

Choose a tag to compare

@SalehGNUTUX SalehGNUTUX released this 16 Aug 11:20

أُضيف

  • تنزيل أرشيف خرائط من داخل التطبيق. تُلصق وصلةٌ مباشرة لأرشيف بلاطات
    (‎.mbtiles‎ · ‎.sqlite‎ · ‎.sqlitedb‎ · ‎.gemf‎ · ‎.zip‎) فيُنزَّل إلى مجلّد الخرائط
    ويُمسح فيظهر فورًا بلا إعادة فتح الشاشة. مقصورٌ على الواي‑فاي افتراضيًّا،
    ويُستأنف بعد الانقطاع من حيث وقف.

    ولا زرَّ «نزّل خريطة دولة»، وهذا قرارٌ لا نقص. سياسة بلاطات OpenStreetMap
    تمنع الجلب بالجملة صراحةً: «الاستعمال دون اتّصال غير مسموح على
    tile.openstreetmap.org… وستُحجب بلا إشعار». وجالبٌ كهذا كان يعرّض التطبيق
    كلَّه للحجب لا هذه الميزة وحدها. فالوصلةُ بيد صاحبها، ومعها سطرٌ يشرح الصيغ
    وأدوات توليد الأرشيف من بيانات OSM الحرّة.

حُرّاسٌ في المُنزِّل

  • صحّة المحتوى قبل الاعتماد: يُفحص رأس الملفّ (SQLite format 3\0 أو PK)
    ويُحذف ما لم يجتزه. أرشيفٌ تالف في مجلّد الخرائط أسوأ من لا شيء — يُفتح ويفشل
    في كلّ إقلاع.
  • الاستئناف الصحيح: التنزيل إلى .part ثمّ نقلٌ عند النجاح وحده. وإن ردّ
    الخادم ‎200‎ على طلب Range فهو لا يدعم الاستئناف: يُحذف الجزء ويُبدأ من
    الصفر، ولا تُلحق البايتات فيخرج ملفٌّ رأسُه سليم وجوفه خليط.
  • بصمة الوصلة في اسم .part: map.mbtiles اسمٌ يشيع عند مرايا شتّى، ولولا
    البصمة لأُلحق نصفُ أرشيفٍ بنصف آخر.
  • اسم الملفّ يُطهَّر فيستحيل الخروج من مجلّد الخرائط بمسارٍ ملتوٍ.
  • المساحة تُفحص بعد الترويسات وقبل كتابة بايتٍ واحد، والرمز غير ‎200/206‎
    يُبلَّغ برقمه، وAccept-Encoding: identity كي لا يخالف الطولُ المعلَن ما كُتب
    فعلًا فيُفسد استئناف المرّة التالية.

تغييرات أخرى

  • اقرأني أُعيد رأسه: الأيقونة الرسميّة وشاراتُ الإصدار والرخصة والمنصّة،
    وجدولُ «ما الذي يميّزه»، وقسمُ تنزيلٍ فيه تحذير اختلاف التوقيع.
  • الموقع: الأيقونة في أعلى اليسار، ونقرُها يقفز إلى أعلى الصفحة ثمّ يُنعشها.
  • release.sh: حارسان جديدان يرفضان العمل على رأسٍ منفصل أو فوق عمليّة
    دمجٍ لم تنتهِ
    — وهما ما أوقعا الشجرة في عقدةٍ عند إصدار ‎0.9.1‎.

v0.9.1-beta

v0.9.1-beta Pre-release
Pre-release

Choose a tag to compare

@SalehGNUTUX SalehGNUTUX released this 16 Aug 07:59

أُضيف

  • أقسام الإعدادات مطويّات. كلّها مطويّةٌ عند أوّل فتح، وفتحُ قسمٍ يطوي ما قبله،
    والمفتوح يُحفظ فيعود كما تركتَه. شاشةٌ فيها اثنا عشر قسمًا لا تُقرأ ممدودةً على
    الطريق. والمعرّفات نصّيّة لا فهارس، فإدراج قسمٍ جديدٍ لاحقًا لا يفتح غيره.
  • قسم «تطبيقات الخرائط»: يكتشف ما على جهازك من تطبيقات خرائط ويقول لكلٍّ منها
    ما يقدر عليه — يرسم خريطة رحلاتنا داخل التطبيق (وهو OsmAnd وحده، عبر واجهته
    الخارجيّة) أو يفتح المسار عنده أو يفتح المواضع لا المسارات. ومنه تختار
    الافتراضيّ لفتح رحلاتك، أو تدع «اسألني في كلّ مرّة» فيظهر منتقي النظام.
    والتطبيق الذي لا يفتح مسارًا يُعرض ولا يُختار: العرضُ بلا وعدٍ خيرٌ من إخفاءٍ
    يمنعك أن تعرف ما عندك، ومن اختيارٍ يَعِد بما لا يكون.
  • ‎40 كم/س‎ بين خيارات حدّ السرعة، وحقلُ إدخالٍ يدويّ يقبل ‎1..300‎.
    ويقبل الأرقام العربيّة والهنديّة معًا (‎٤٠‎ و‎۴۰‎ و‎40‎ سواء)، وإن وافقت قيمتُك
    أحدَ الخيارات أُبرز ذلك الخيار — حالةٌ واحدة لقيمةٍ واحدة لا حالتان.

تغييرات داخليّة

  • core/map/MapApps.kt: الجسّ بعنوانٍ من مزوّد ملفّاتنا نفسه بمسار tracks/probe.gpx
    لا بالنوع وحده — مرشِّح النيّات يرفض نيّةً بلا مخطّطٍ إن أعلن scheme، وأكثر
    مرشِّحات GPX تعلن content/file. ويُفصل مديرُ الملفّات عن تطبيق الخرائط بأنّ
    IntentFilter يخزّن النوع الشامل بلا مائلة، فوجودها دليل إعلانٍ محدَّد.
    وMATCH_DEFAULT_ONLY لأنّ ما لا يعلن CATEGORY_DEFAULT لا يُطلق بنيّةٍ ضمنيّة،
    فعرضه وعدٌ كاذب.

v0.9.0-beta

v0.9.0-beta Pre-release
Pre-release

Choose a tag to compare

@SalehGNUTUX SalehGNUTUX released this 15 Aug 17:20

أُضيف

  • كشّاف الهاتف من شاشة الكاميرا، يبقى مضاءً أثناء التسجيل. يظهر زرُّه على
    العدسة التي تملك مصباحًا وحدها (hasFlashUnit)، وإلّا قيل ذلك صراحةً بدل زرٍّ
    لا يفعل شيئًا. وللكاميرا الأماميّة — ولا مصباح لها في أغلب الهواتف — وميض
    شاشة
    اختياريّ مطفأٌ افتراضًا: إطارٌ أبيض حول المعاينة مع رفع سطوع النافذة إلى
    أقصاه. وتحذيرُه مكتوبٌ في الإعدادات: الكاميرا الأماميّة في مسجّل طريقٍ موجَّهةٌ
    إلى وجه السائق، وشاشةٌ بيضاء في وجهه ليلًا خطرٌ لا ميزة.
  • تبديل العدسة والتسجيل جارٍ. لا تُوقَف الرحلة ولا يُقطع مسار GPX: يُغلَق
    المقطع الجاري سليمًا ثمّ يبدأ التالي بالعدسة الأخرى فورًا، بآليّة تقسيم المقاطع
    نفسها. وإن فشل شيءٌ في الطريق عادت العدسة السابقة ولم تُترك الجلسة بلا ربط.
  • التصوير بالكاميرتين معًا في ملفٍّ واحد. تُركَّب الصورتان في تيّارٍ واحد قبل
    الترميز، فيخرج ملفٌّ واحد لا ملفّان. بتخطيطين: مصغَّرة داخل الكبيرة (أعلى
    اليسار — أسفلُ اليمين للوحة الإحصاءات وأسفلُ اليسار للقرص) أو مناصفةً فوق
    وتحت
    ، ومبادلةٌ بلمسةٍ بين أيّهما الكبيرة.
    والميزة مرهونة بالجهاز (FEATURE_CAMERA_CONCURRENT، أندرويد ‎11‎ فما فوق)،
    فيقول قسم الإعدادات صراحةً أيدعمها جهازك أم لا، ولا يُعرض المفتاح إن كان لا
    يدعمها. وعند فشل الربط المزدوج يُرتدّ إلى عدسةٍ واحدة بهدوء لا إلى شاشةٍ سوداء.

تغييرات داخليّة

  • BindPlan يجمع (الحرق · العدسة · المزدوج · التخطيط · الكبيرة) في قيمةٍ واحدة
    تُقارَن بالمساواة، فسؤال «أما زال المربوط هو المطلوب؟» له جوابٌ واحد لا خمسة.
    ومعه سلسلةُ ارتدادٍ مرتَّبة تُثبّت ما نجحت عليه، فجهازٌ رفض شيئًا مرّةً لا
    يُسأل عنه في كلّ إقلاع.
  • Message.Notice صنفٌ جديد للرسائل التي ليست مصيرَ ملفّ: «تعذّر تبديل الكاميرا»
    كان يخرج ملفوفًا في «تعذّر حفظ التسجيل: …» وهو خبرٌ كاذب.
  • تبديلُ التخطيط أو الكبيرة يستلزم unbindAll — أثبته فكّ شفرة CameraX
    (LayoutSettings حقلٌ نهائيّ في CameraUseCaseAdapter بلا ضابط) — فمرّ على
    مسار لفّ المقطع نفسه. ولذلك تُقفَل صفوف هذا القسم في الإعدادات أثناء التسجيل.

v0.8.0-beta

v0.8.0-beta Pre-release
Pre-release

Choose a tag to compare

@SalehGNUTUX SalehGNUTUX released this 15 Aug 14:06

أُصلح

  • خريطة OsmAnd لم تكن تأتي إلّا وهو مفتوح. السبب وُجد في مصدر OsmAnd نفسه:
    OsmandAidlServiceV2.getApi يردّ null لكلّ تطبيقٍ لم يأذن له المستعمل، وأوّل
    اتّصالٍ بنا يسجّلنا معطَّلين ويحفظ ذلك. فصارت للجسر حالةٌ رابعة صريحة «لم يأذن
    OsmAnd بعد» تقول للسائق خطوته: افتح OsmAnd ← الإعدادات ← التطبيقات المتّصلة ←
    فعّل GT-SPEEDOMETER. تُمنح مرّةً واحدة، ثمّ تعمل الخريطة وهو مغلق.
    وأُضيف انتظارُ تهيئةٍ صريح (registerForOsmandInitListener) قبل طلب الصورة، فلا
    تُطلب من محرّكٍ لم يُقلع بعد — وهو ما كان يُفشل الإقلاع البارد.

أُضيف

  • تقريبٌ وتنقّلٌ في خريطة OsmAnd. واجهته تعطي صورةً ساكنة لا خريطةً تفاعليّة،
    فصرنا نطلبها بثلاثة أضعاف مقاس الإطار (مع سقفٍ يُنزل العامل على جهازٍ محدود
    الذاكرة) ونتيح التقريب بالإصبعين وبثلاثة أزرار، والإزاحة محصورةٌ داخل الصورة.
  • خطٌّ أزرق وعلامتا بداية ونهاية وأسهم اتّجاه على مسار OsmAnd، مرسومةً بإسقاطٍ
    مكرَّرٍ عن TrackBitmapDrawer — فالرسّام لا يرسم شيئًا من ذلك بنفسه.
  • مبدّل مصدر الخريطة: تلقائيّ · OsmAnd · بلاطات. الصورة أدقّ خريطةً والبلاطات
    أغنى تفاعلًا، وأيّهما أفضل سؤالٌ لا جواب واحد له.
  • إيقافٌ مؤقّت لتسجيل الكاميرا: الفيديو وحده يقف والرحلة تمضي، فلا تُفسد وقفةٌ
    عند إشارةِ مرورٍ إحصاءاتِ الرحلة ولا يتقطّع ملفّ المسار. ولفُّ المقاطع لا يمضي
    والتصوير موقوف.
  • وضع تصويرٍ ليليّ/نهاريّ: تلقائيّ (يتبع ساعتَي المظهر) أو نهار أو ليل، يُختار
    من شاشة الكاميرا ومن الإعدادات. يُضبط بتعويض الإضاءة على CameraControl فلا
    يقطع تسجيلًا جاريًا، ويُعلن صراحةً على الأجهزة التي لا تدعمه.
  • تحديدٌ متعدّد في الوسائط: لمسةٌ مطوّلة تدخل الوضع، ثمّ حذفٌ أو مشاركة لعدّة
    ملفّاتٍ دفعةً واحدة، وزرّ الرجوع يخرج منه.
  • دعم الأجهزة المحدودة (Android Go): وضعٌ مخفَّف يُكتشف من
    ActivityManager.isLowRamDevice ويقبل التجاوز اليدويّ — دقّة ‎720p‎ بدل ‎1080p‎،
    ومسارٌ مبسَّط عند الرسم (الملفّ والإحصاءات تبقى كاملة)، وسطرٌ في الإعدادات يقول
    ما خُفّف ولماذا فلا يبدو التطبيق متصرّفًا من تلقاء نفسه.
  • تثبيت موقعٍ سريع: يُعرض موضعٌ تقريبيّ من آخر موقعٍ معروف ومن مزوّد الشبكة
    ريثما تُثبَّت الأقمار، موسومًا «تقريبيّ» لا «GPS». ولا يدخل هذا الموضع القياسَ
    ولا المسافة ولا المسار بحال — دقّته مئات الأمتار — وإنّما يقطع صمت الشاشة الذي
    كان يبلغ دقيقةً على جهازٍ ضعيف فيُقرأ عطبًا.

v0.7.0-beta

v0.7.0-beta Pre-release
Pre-release

Choose a tag to compare

@SalehGNUTUX SalehGNUTUX released this 14 Aug 17:57

أُضيف

  • خريطة الرحلة من خرائط OsmAnd المحلّيّة، دون اتّصال. إن كان OsmAnd مثبَّتًا
    وفيه خريطة منطقتك، سألناه أن يرسم مسار الرحلة على خرائطه وسلّمنا الصورة. وهذا
    هو الطريق الوحيد إلى صيغة ‎.obf‎: هي متجهيّة لا يرسمها osmdroid، ومجلّد OsmAnd
    لا يُقرأ على أندرويد ‎11‎ فما فوق. وقسمٌ جديد في الإعدادات يقول أيّ نسخةٍ وُجدت
    وهل تستجيب واجهتها، ويفرّق بين «غير مثبَّت» و«مثبَّت ولا يردّ» — فعلاج كلٍّ منهما
    غير علاج الآخر. أُضيفت لذلك وحدة :osmand-api (إسنادها في NOTICE-OsmAnd-API.md).
  • مسارٌ بلا خريطة أساس حين لا بلاطات محلّيّة ولا OsmAnd ولا اتّصال: المسار
    بعلامتَي بدايته ونهايته وشبكةٍ خفيفة ومقياس رسم. يعمل دائمًا وبلا أيّ ملفّ، ويحلّ
    محلّ صندوقٍ فارغ لا يقول شيئًا.
  • سرعةٌ قصوى يحدّدها السائق. يُضبط عليها مدى القرص (الحدّ زائدَ ‎%20‎ مقرَّبًا)
    وتُرسم عندها علامةٌ حمراء عريضة على القوس، ويصير ما بعدها بلون الخطر. تسري على
    شاشة العدّاد والرقميّة والنافذة المصغّرة وطبقة الكاميرا على الشاشة وفي المحروق
    معًا
    . وصفرٌ يعني «بلا حدّ»، وهو الافتراض فلا يتبدّل سلوك من لم يضبط شيئًا.
  • تنبيهٌ صوتيّ متدرّج عند التجاوز: صفيرةٌ لحظة تخطّي الحدّ، فإن دام التجاوز فوق
    عشر ثوانٍ صار الصفير متكرّرًا حتّى العودة. يعمل من المحرّك لا من الشاشة، فيستمرّ
    والتطبيق في الخلفيّة أو في النافذة المصغّرة أو والشاشة مطفأة. وفيه حارس تذبذبٍ
    (‎2 كم/س‎ تحت الحدّ) وإلّا صفّرت المركبةُ الملازِمةُ للحدّ عشرات المرّات في الدقيقة.

تغييرات داخليّة

  • core/alert/SpeedAlert.kt: اشتقاق مدى القرص وعتباته في موضعٍ واحد تستهلكه
    الشاشات الأربع والراسم المحروق. تكراره في كلٍّ منها كان باب اختلافها.
  • الحساب بأعدادٍ صحيحة لا بـFloat: ‎50×1.2f = 60.000002‎ كان يقفز بالمدى إلى ‎70‎.
  • RouteMap صار طبقة ترتيبٍ فوق مسار الأرشيف القائم (أرشيف ← OsmAnd ← إنترنت ←
    مخطَّط) بلا إعادة كتابته، ويحرّر المزوّد الذي لم يستلمه MapView.
  • CLEANUP.sh: فحصٌ ثامن يمسك الواجهات التجريبيّة بلا @OptIn — وهي التي أسقطت
    بناء 0.6.0 عند المستخدم لأنّ فحص الأنواع لا يراها.

v0.6.0-beta

v0.6.0-beta Pre-release
Pre-release

Choose a tag to compare

@SalehGNUTUX SalehGNUTUX released this 14 Aug 12:17

أُضيف

  • متوسّط السرعة في طبقة الكاميرا — على الشاشة وفي الفيديو المحروق معًا،
    محسوبًا بالطريقة نفسها التي تعرضها بقيّة الشاشات فلا يخرج الملفّ برقمٍ يخالفها.
  • الوسائط قسمان: الصور في تبويب والفيديوهات في تبويب، ولكلٍّ حالة فراغٍ تخصّه.
    ويبقى في التبويبين ما كان: الفتح بلمسة، والحذف بلمسةٍ مطوّلة، والمشاركة.
  • علامتان متمايزتان على مسار الرحلة: حلقةٌ فيروزيّة للبداية ومعيّنٌ أحمر
    للنهاية. كانت العلامتان متطابقتين فلا يُعرف من أين بدأ المسار.
  • تنبيهٌ حين لا خريطة محلّيّة، يقول ما الذي يُنزَّل وأين يوضع. وإن كانت على
    الجهاز خرائط OsmAnd بصيغة ‎.obf‎ قيل ذلك صراحةً: هي صيغةٌ متجهيّة لا يرسمها هذا
    التطبيق، و«لا خريطة محلّيّة» وحدها كانت تُوهم من نزّلها أنّ الفحص أخفق.
  • قسم «عن التطبيق» يذكر المطوّر ويفتح رابط المستودع.
  • نقطةٌ حمراء على تبويب الكاميرا ما دام التسجيل جاريًا، فيُعرف أنّه مستمرٌّ
    بعد الانتقال إلى تبويبٍ آخر.

أُصلح

  • الطبقة المحروقة كانت تُقتطع حافّتاها عند العرض. الملفّ يُسجَّل ‎16:9‎ وشاشة
    الهاتف ‎20:9‎، ومشغّلات الفيديو تملأ الشاشة افتراضًا فتقتطع نحو ‎%10‎ من كلّ
    جانب — فظهرت «المسافة» ‏«سافة» وابتُلع يسارُ القرص، والملفّ سليمٌ في ذاته. صارت
    الطبقة تُرسم داخل منطقةٍ آمنة موسَّطة تنجو من هذا الاقتطاع.
  • منتقيا ساعة النهار والليل كانا يُعرضان من ‎00:00‎ مهما كانت القيمة المحفوظة؛
    صارا يبدآن عند الساعة المختارة، وهي مميَّزةٌ بحلقةٍ لا باللون وحده.
  • الخريطة كانت تتأخّر في الظهور بعد انتهاء الرحلة: ثلاث مرّاتٍ متتابعة على
    القرص تُعيد فتح الأرشيفات، وتحويلان بطول المسار على الخيط الرئيس. وصارت تُظهر
    حالة تحميلٍ صريحة بدل صندوقٍ فارغ.
  • خرائط OsmAnd المنزَّلة كأرشيف بلاطات لم تكن تُقرأ: osmdroid يسجّل
    zip|sqlite|mbtiles|gemf وحدها، وقارئه يتوقّع جدولًا بأعمدة
    (key, provider, tile) بينما تكتب OsmAnd و Locus ‏(x, y, z, s, image).
    أُضيف قارئٌ يفهم الصيغتين ويكتشف ترقيم البلاطات (BigPlanet والمقلوب) بنفسه.