ইনপুট পদ্ধতি সম্পাদক সমর্থন

এই ডিসপ্লে-নির্দিষ্ট ক্ষেত্রগুলিতে করা আপডেটগুলি নীচে সরবরাহ করা হয়েছে:

Android 10 একটি নন-ডিফল্ট ডিসপ্লেতে চলমান অ্যাপগুলির জন্য সফ্টওয়্যার কীবোর্ড সমর্থন করে।

একটি নন-ডিফল্ট ডিসপ্লেতে চলমান অ্যাপ

ডিসপ্লে ইনপুট মেথড এডিটর (IME) এর সফ্টওয়্যার কীবোর্ড দেখায়, বিভিন্ন মোড রয়েছে। সফ্টওয়্যার কীবোর্ডে দেখানো হয়েছে:

  • একই ডিসপ্লে যাতে ফোকাস করা অ্যাপটি দেখা যায়।
  • ডিফল্ট ডিসপ্লে যখন ফোকাস করা অ্যাপটি একটি নন-ডিফল্ট ডিসপ্লেতে চলছে।
  • কোনো ডিসপ্লে নেই।

যে ডিসপ্লেতে ফোকাস করা অ্যাপটি প্রদর্শিত হবে তার সেটিংসের উপর ভিত্তি করে সিস্টেমটি কোন মোডটি ব্যবহার করবে তা নির্ধারণ করে। আরো বিস্তারিত জানার জন্য, দেখুন:

  • WindowManager#setDisplayImePolicy()
  • WindowManager#getDisplayImePolicy()

চিত্র 1. IME সফ্টওয়্যার কীবোর্ড লক্ষ্য অ্যাপ সহ সেকেন্ডারি ডিসপ্লেতে প্রদর্শিত হয়

সিস্টেমটি একটি একক আইএমই ব্যবহার করে, তবে ব্যবহারকারীর ফোকাস অনুসরণ করতে প্রদর্শনের মধ্যে স্থানান্তর করতে পারে। অ্যান্ড্রয়েড 10 স্বয়ংক্রিয়ভাবে আশা করে যে সমস্ত প্রথম এবং তৃতীয়-পক্ষের আইএমই লেআউটটি সংশোধন করবে এবং তৈরি করা হলে নতুন ডিসপ্লের আকার অনুযায়ী আকার পরিবর্তন করবে।

যদি ডিসপ্লে A-তে একটি সক্রিয় সংযোগ থাকে এবং একটি ইনপুট ফিল্ড ডিসপ্লে B-তে ইনপুট ফোকাসের অনুরোধ করে, তাহলে নিম্নলিখিত প্রবাহটি ঘটে:

  1. ডিসপ্লে বি-তে ইনপুট ক্ষেত্র থেকে একটি নতুন ইনপুট সংযোগ আসে।
  2. সংযোগ অনুমোদন করা উচিত কিনা InputMethodManagerService চেক করে।
  3. IME এর জন্য একটি প্রদর্শন নির্বাচন করা হয়েছে৷ যদি প্রদর্শন B IME দেখানো সমর্থন করে এবং এটি দেখানোর অনুমতি দেওয়া হয়, তাহলে B ব্যবহার করা হয়। অন্যথায়, প্রাথমিক ডিভাইস প্রদর্শন নির্বাচন করা হয়.
  4. যদি নির্বাচিত ডিসপ্লে ডিসপ্লে A থেকে না হয়, তাহলে সংযোগটি পুনঃস্থাপিত হয়। InputMethodService ধ্বংস করা হয় এবং তারপর আবার তৈরি করা হয়।

নিরাপত্তা সীমাবদ্ধতা

সিস্টেমটি ভার্চুয়াল ডিসপ্লেতে আইএমই দেখাবে না যা সিস্টেমের মালিকানাধীন নয়। এটি একটি নিরাপত্তা উদ্বেগের কারণে যে একটি দূষিত অ্যাপ সক্ষম সিস্টেম সজ্জা সমর্থন সহ একটি ভার্চুয়াল ডিসপ্লে তৈরি করতে পারে এবং পৃষ্ঠ থেকে ব্যবহারকারী-সংবেদনশীল তথ্য পড়তে পারে, যেমন টাইপিং ভবিষ্যদ্বাণী এবং কাস্টম ব্যাকগ্রাউন্ড।

বাস্তবায়ন

অ্যান্ড্রয়েড 9 (এবং নীচের) এ, আইএমই শুধুমাত্র ডিফল্ট স্ক্রিনে উপলব্ধ ছিল, যেমন অন-স্ক্রিন ইনপুট পদ্ধতিতে বর্ণনা করা হয়েছে। অ্যান্ড্রয়েড 10 (এবং উচ্চতর), একজন ব্যবহারকারী ফোকাস স্যুইচ করে বিভিন্ন ডিসপ্লেতে বিভিন্ন ইনপুট পাঠ্য ক্ষেত্রের মধ্যে স্যুইচ করতে পারেন এবং IME উইন্ডোটি সেকেন্ডারি ডিসপ্লেতে চলে যায়।

WindowManager এ ইমপ্লিমেন্টেশন ইনপুট মেথড উইন্ডো (IME উইন্ডো যেখানে নরম কীবোর্ড টানা হয়) এবং ইনপুট মেথড টার্গেট (যে উইন্ডোতে IME ইনপুট যায়) IME স্টেট পরিচালনা করার জন্য ট্র্যাক করে।

InputMethodManagerService (IMMS) এর জন্য, অন্য কোন বিল্ট-ইন মেকানিজম InputMethodService (IMS) এ প্রদর্শন পরিবর্তন প্রচার করতে পারে না এবং অন্য ডিসপ্লেতে ফোকাস সরানোর সময় রানটাইমে কীবোর্ড লেআউটটি পুনরায় কনফিগার করতে পারে।

ডিসপ্লেগুলির মধ্যে IME উইন্ডো স্যুইচ অর্জন করতে, Android 10 নিম্নলিখিতগুলি প্রয়োগ করে:

  • IME এবং ইনপুট টার্গেট উইন্ডো এখন DisplayContent#mInputMethodWindow এবং DisplayContent#mInputMethodTarget এ প্রতি ডিসপ্লেতে ট্র্যাক করা হয়, যাতে WindowManager (WM) প্রতিটি ডিসপ্লে থেকে স্বাধীনভাবে IME ফোকাস অবস্থা পরিচালনা করতে পারে।
  • IMMS এর দিকে, যখন ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus মাধ্যমে বাহ্যিক ডিসপ্লে থেকে একটি অ্যাপ ক্লায়েন্টের ফোকাস অনুরোধ গৃহীত হয়, এটি প্রথমে পরিষেবাটি আনবাইন্ড করে এবং তারপরে নতুন ইনপুট মেথড পরিষেবার সাথে নতুন ইনপুট মেথড আনবাইন্ড করে। onServiceConnected() এ বাহ্যিক প্রদর্শনের জন্য উইন্ডো টোকেন।
  • IMS এর দিকে, IMS#attachToken প্রাপ্তির পরে, নিম্নলিখিত প্রবাহটি ঘটে:
    • ContextImpl#updateDisplay InputMethodService#attachToken() -এ পরিষেবার প্রসঙ্গের প্রদর্শন আপডেট করতে বলা হয়। এটি কীবোর্ডের বিন্যাস সংশোধন করতে এবং বর্তমান প্রসঙ্গ পরীক্ষা করে লক্ষ্য প্রদর্শনের সাথে মানিয়ে নিতে ViewGroup#addView() কল করে।
    • DisplayContent#setInputMethodWindowLocked() কল করার পরে, ইমপ্লিমেন্টেশন রিসোর্স ওভাররাইড করতে এবং মেট্রিক্স প্রদর্শন করতে WindowProcessController ব্যবহার করে IME প্রক্রিয়াতে প্রসেস-লেভেল ডিসপ্লে কনফিগারেশন পরিবর্তন পাঠায়।
    • InputMethodService ক্লায়েন্ট onConfigurationChanged() এবং ViewGroup#addView() কলের পরে ইনপুট ভিউ পুনরায় চালু করার জন্য সঠিক ডিসপ্লে মেট্রিক্স সহ সঠিক কনফিগারেশন পায়।